package com.platform.service.impl; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import net.sf.json.regexp.RegexpUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Service; import com.platform.dao.PreDataInfoDao; import com.platform.entities.DefaultDataDescription; import com.platform.entities.MyFilesEntity; import com.platform.entities.PreDataInfo; import com.platform.service.IScriptMakeService; import com.platform.utils.BeanCopy; import com.platform.utils.Compare4MyFilesEntity; import com.platform.utils.Configs; import com.platform.utils.Constant; import com.platform.utils.FileOperateHelper; import com.platform.utils.XmlOperationByDom4j; import dk.brics.automaton.RegExp; @Service(value = "scriptMakeService") public class ScriptMakeService implements IScriptMakeService { public static Logger log = Configs.DAILY_ROLLING_LOGGER.getLogger(PreDataInfoServiceImpl.class); @Resource(name = "preDataInfoDao") private PreDataInfoDao preDataInfoDao; @Override public int makeCfg() throws Exception { log.info("makeCfg"); List systemInfoList = preDataInfoDao.findAll(); String path = FileOperateHelper.addLastSeparator(Configs.SQL_SCRIPT_PATH_STANDARD); StringBuffer sb = new StringBuffer(); sb.append("市\t县(市、区)\t行政区划代码\r\n"); Map startData = new HashMap(); for (PreDataInfo preDataInfo : systemInfoList) { startData.put(preDataInfo.getAreaCode(), preDataInfo); } //以地区为准--一个地区一个xml for ( String key : startData.keySet()) { PreDataInfo preDataInfo = (PreDataInfo) startData.get(key); sb.append(preDataInfo.getCityName()); sb.append("\t"); sb.append(preDataInfo.getDistrictName()); sb.append("\t"); sb.append(preDataInfo.getAreaCode()); sb.append("\r\n"); } FileOperateHelper.fileWrite(path+Constant.cfgFileName, sb.toString()); log.info("makeCfg--end"); return 1; } @Override public int makeXml() throws Exception { log.info("makeXml"); List systemInfoList = preDataInfoDao.findAll(); String dirpath = FileOperateHelper.addLastSeparator(Configs.SQL_SCRIPT_PATH_STANDARD); Map> map = new HashMap>(); for (PreDataInfo preDataInfo : systemInfoList) { putSystemByAreaCode(map, preDataInfo.getAreaCode(), preDataInfo); } //一个地区一个xml for ( String key : map.keySet()) { String areaPath = dirpath + key; File f = new File(areaPath); f.mkdir(); List defList = new ArrayList(); List list = map.get(key); for (Object object : list) { DefaultDataDescription defaul = new DefaultDataDescription(); defaul.setvalue((PreDataInfo) object); defList.add(defaul); } XmlOperationByDom4j.createXml(FileOperateHelper.addLastSeparator(areaPath)+key+".xml", defList, "Data_info", "workRange"); } log.info("makeXml--end"); return 1; } @Override public int moveFiles(List files) throws Exception { return 0; } @Override public List FindAllFiles() throws Exception { List systemDataInfo = preDataInfoDao.findAll(); // 查找 Configs.SQL_SCRIPT_PATH_LAST 路径下的 所有的文件:路径 Map sqlFilePathsLast = new HashMap(); sqlFilePathsLast = getAllFile(sqlFilePathsLast, Configs.SQL_SCRIPT_PATH_LAST); //遍历 查找 Configs.SQL_SCRIPT_PATH_STANDARD 脚本文件 放入集合中 Map sqlFilePathsStandard = new HashMap(); sqlFilePathsStandard = getAllFile(sqlFilePathsStandard, Configs.SQL_SCRIPT_PATH_STANDARD); // 填充 脚本状态、位置的信息 List result = setScript(systemDataInfo, sqlFilePathsStandard, sqlFilePathsLast); return result; } /** * @param map * @param code * @param data * @return */ private Map> putSystemByAreaCode(Map> map,String code, PreDataInfo data) { List list = map.get(code); if (null == list) { list = new ArrayList(); } list.add(data); map.put(code, list); return map; } /** 遍历文件 * @param ps * @param path * @return */ private Map getAllFile(Map ps, String path){ File f = new File(path); String name = f.getName(); //如果是 sql文件 if(name.endsWith(".sql") || name.endsWith(".SQL")) ps.put(name.toLowerCase(),f.getAbsolutePath()); if (f.exists()) { String[] subpaths = f.list(); if (null != subpaths) { for (String tmppath : subpaths) { getAllFile(ps, f.getAbsolutePath()+"/"+tmppath); } } } return ps; } /** * @param systemDataInfo 系统信息 * @param sqlFilePathsStandard 标准的-归档的脚本 * @param sqlFilePathsLast 最新的脚本 * @return */ private List setScript(List systemDataInfo, Map sqlFilePathsStandard, Map sqlFilePathsLast){ List fileEntitys = new ArrayList(); for (PreDataInfo preDataInfo : systemDataInfo) { MyFilesEntity myfile = new MyFilesEntity(); //复制 BeanCopy.copyBean(preDataInfo, myfile); // 归档表空间脚本的位置- String TablePathStandard = getFilePath("UserTablespace_", sqlFilePathsStandard, myfile, ".sql"); myfile.setUserTableScriptPathStandard(TablePathStandard); // 归档预算 脚本的位置- String indicatePathStandard = getFilePath("Checkout_Indicate_", sqlFilePathsStandard, myfile, ".sql"); myfile.setCkIndicateScriptPathStandard(indicatePathStandard); // 归档表空间脚本的位置- String payPathStandard = getFilePath("Checkout_Pay_", sqlFilePathsStandard, myfile, ".sql"); myfile.setCkPayScriptPathStandard(payPathStandard); // 最新表空间脚本的位置- String TablePathLast = getFilePath("UserTablespace_", sqlFilePathsLast, myfile, ".sql"); myfile.setUserTableScriptPathLast(TablePathLast); // 最新预算 脚本的位置- String indicatePathLast = getFilePath("Checkout_Indicate_", sqlFilePathsLast, myfile, ".sql"); myfile.setCkIndicateScriptPathLast(indicatePathLast); // 最新表空间脚本的位置- String payPathLast = getFilePath("Checkout_Pay_", sqlFilePathsLast, myfile, ".sql"); myfile.setCkPayScriptPathLast(payPathLast); //设置 状态 myfile.setUserTableStatus(getStatus(myfile.getUserTableScriptPathStandard(), myfile.getUserTableScriptPathLast())); myfile.setCkIndicateStatus(getStatus(myfile.getCkIndicateScriptPathStandard(), myfile.getCkIndicateScriptPathLast())); myfile.setCkPayStatus(getStatus(myfile.getCkPayScriptPathStandard(), myfile.getCkPayScriptPathLast())); myfile.setSysStatus(getTotalStatus(myfile)); fileEntitys.add(myfile); } Compare4MyFilesEntity com = new Compare4MyFilesEntity(); Collections.sort(fileEntitys, com); return fileEntitys; } /** 查找文件 * @param prefix * @param map * @param myf * @param affix * @return */ private String getFilePath(String prefix, Map map, MyFilesEntity myf, String affix) { StringBuffer sb = new StringBuffer(); sb.append(prefix).append(myf.getAreaCode().toLowerCase()).append("_").append(myf.getSysCode()).append(affix.toLowerCase()); String fileName = sb.toString().toLowerCase(); if (!map.keySet().contains(fileName)) { return null; } // 地区字母 小写 -- 文件属性小写 String pathStandard = map.get(fileName); return pathStandard; } /** 返回状态--0: standard, last为空; 1:standard不空,last为空; 2:standard为空,last不空,3:standard不空,last不空 * 对应 含义,操作: 0:(有缺失,上传) ; 1: (正常 ,查看); 2:(待归档,归档) ; 3: (待审核,审核) * @param standard * @param last * @return */ private int getStatus(String standard, String last) { int status = 0; if (null != standard && !standard.isEmpty()) { status = status | 1; } if (null != last && !last.isEmpty()) { status = status | 2; } return status; } /** 返回状态 * 对应 含义,操作: 0:(有缺失,上传) ; 1: (正常 ,查看); 2:(待归档,归档) ; 3: (待审核,审核) * @param standard * @param last * @return */ private int getTotalStatus(MyFilesEntity myfile) { Integer[] numArr = new Integer[3]; Integer result = 1; numArr[0] = myfile.getUserTableStatus(); numArr[1] = myfile.getCkIndicateStatus(); numArr[2] = myfile.getCkPayStatus(); for (Integer integer : numArr) { if (integer != 1) { result = integer; } } if (result == 1) { return result; } for (Integer integer : numArr) { if (integer != 1) { result = result & integer; } } return result; } }