From 4a522847ed896e88372db4014a489251147e65ca Mon Sep 17 00:00:00 2001 From: "446052889@qq.com" <446052889@qq.com> Date: Wed, 17 Aug 2022 10:46:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=94=AF=E6=8C=81=E5=90=84=E7=A7=8D=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....actionsoft.apps.coe.pal.datamigration.jar | Bin 277912 -> 279907 bytes .../pal/datamigration/util/ProcessUtil.java | 54 +++++++++- .../versionNo/constant/VersionNoConstant.java | 5 +- .../versionNo/model/VersionNoExcelModel.java | 9 ++ .../web/VersionNoExcelImportRun.java | 94 ++++++++++-------- .../web/VersionNoExcelImportWeb.java | 87 +++++++++++++--- 6 files changed, 190 insertions(+), 59 deletions(-) diff --git a/com.actionsoft.apps.coe.pal.datamigration/lib/com.actionsoft.apps.coe.pal.datamigration.jar b/com.actionsoft.apps.coe.pal.datamigration/lib/com.actionsoft.apps.coe.pal.datamigration.jar index abe5741eedfb69c28c785f1abf8a9dc08d8f02ad..f6d222d2942776d3d3c9b778784e37f6f52c581d 100644 GIT binary patch delta 32894 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 delta 30836 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 diff --git a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/util/ProcessUtil.java b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/util/ProcessUtil.java index 43515198..4e594a5b 100644 --- a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/util/ProcessUtil.java +++ b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/util/ProcessUtil.java @@ -30,6 +30,59 @@ import java.util.stream.Collectors; public class ProcessUtil { + /** + * 获取根目录下文件分类 + * @param category + * @param reverse false:获取结果key:methodId,value:methodName true:获取结果key:methodName,value:methodId + * @return + */ + public static JSONObject getCategoryMethods(String category, boolean reverse) { + JSONObject result = new JSONObject(); + if ("process".equals(category)) { + result.put("default", "文件夹"); + } + List methodModels = PALMethodManager.getInstance().getPALMethodModelListByMethod(category); + List listApps = AppsAPIManager.getInstance().getInstalledApps(); + int size = listApps.size(); + Map map1 = new HashMap(); + for (int i = 0; i < size; i++) { + map1.put(listApps.get(i).getId(), listApps.get(i).getRuntimeState()); + } + for (int i = 0, methodSize = methodModels.size(); i < methodSize; i++) { + PALMethodModel palMethodModel = methodModels.get(i); + String appId = palMethodModel.getId(); + if (map1.containsKey("com.actionsoft.apps.coe.method." + appId)) { + String methodId1 = map1.get("com.actionsoft.apps.coe.method." + appId); + if (methodId1.equals(AppsConst.RUNTIME_STATE_STOPPED) || methodId1.equals(AppsConst.RUNTIME_STATE_FAILED) || methodId1.equals(AppsConst.RUNTIME_STATE_READY) || methodId1.equals(AppsConst.RUNTIME_STATE_STARTING) || methodId1.equals(AppsConst.RUNTIME_STATE_STOPPING) || methodId1.equals(AppsConst.RUNTIME_STATE_UNINSTALLED) || methodId1.equals(AppsConst.RUNTIME_STATE_UNINSTALLING) || methodId1.equals(AppsConst.RUNTIME_STATE_FAILED)) + continue; + } + // 若是制度类型,过滤掉制度图 + if ("control".equals(category) && "control.policy".equals(palMethodModel.getId())) { + continue; + } + result.put(palMethodModel.getId(), I18nRes.findValue(CoEConstant.APP_ID, palMethodModel.getId())); + } + if ("process".equals(category)) {// 伊利流程类型下增加表单图和制度图 + PALMethodModel palMethodModel = PALMethodManager.getInstance().getPALMethodModelById("control.policy"); + if (palMethodModel != null) { + result.put(palMethodModel.getId(), I18nRes.findValue(CoEConstant.APP_ID, palMethodModel.getId())); + } + palMethodModel = PALMethodManager.getInstance().getPALMethodModelById("data.form"); + if (palMethodModel != null) { + result.put(palMethodModel.getId(), I18nRes.findValue(CoEConstant.APP_ID, palMethodModel.getId())); + } + + } + if (reverse) {// key value反转 + JSONObject reverseResult = new JSONObject(); + for (String key : result.keySet()) { + reverseResult.put(result.getString(key), key); + } + return reverseResult; + } + return result; + } + /** * 获取流程下文件分类 * @return @@ -336,7 +389,6 @@ public class ProcessUtil { Iterator iterator = PALRepositoryCache.getByWsId(wsId); List list = new ArrayList<>(); - // 过滤epc while (iterator.hasNext()) { PALRepositoryModel model = iterator.next(); if (model.getMethodId().equals(methodId)) { diff --git a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/constant/VersionNoConstant.java b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/constant/VersionNoConstant.java index 76849741..c32ba5db 100644 --- a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/constant/VersionNoConstant.java +++ b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/constant/VersionNoConstant.java @@ -20,10 +20,11 @@ public class VersionNoConstant { // Excel标标题 public final static String TABLE_PROCESS_NAME = "流程名称"; + public final static String TABLE_PROCESS_TYPE = "类型"; public final static String TABLE_PROCESS_VERSION_NO = "版本号"; - public final static String [] EXCEL_TITLE_ROW_ARR = new String [] {TABLE_PROCESS_NAME, TABLE_PROCESS_VERSION_NO}; - public final static String EXCEL_TITLE_ROW = TABLE_PROCESS_NAME+ "、" +TABLE_PROCESS_VERSION_NO; + public final static String [] EXCEL_TITLE_ROW_ARR = new String [] {TABLE_PROCESS_TYPE, TABLE_PROCESS_NAME, TABLE_PROCESS_VERSION_NO}; + public final static String EXCEL_TITLE_ROW = TABLE_PROCESS_TYPE + "、" +TABLE_PROCESS_NAME+ "、" + TABLE_PROCESS_VERSION_NO; } diff --git a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/model/VersionNoExcelModel.java b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/model/VersionNoExcelModel.java index 16bdbaa8..471fc591 100644 --- a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/model/VersionNoExcelModel.java +++ b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/model/VersionNoExcelModel.java @@ -4,6 +4,7 @@ package com.actionsoft.apps.coe.pal.datamigration.versionNo.model; * Excel数据model */ public class VersionNoExcelModel { + private String processType;// 模型类型(支持流程、表单、制度等其他类型) private String processName;// 流程名称 private String processVersionNo;// 版本号 @@ -22,4 +23,12 @@ public class VersionNoExcelModel { public void setProcessVersionNo(String processVersionNo) { this.processVersionNo = processVersionNo; } + + public String getProcessType() { + return processType; + } + + public void setProcessType(String processType) { + this.processType = processType; + } } diff --git a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/web/VersionNoExcelImportRun.java b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/web/VersionNoExcelImportRun.java index 45128448..75da53dc 100644 --- a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/web/VersionNoExcelImportRun.java +++ b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/web/VersionNoExcelImportRun.java @@ -1,5 +1,6 @@ package com.actionsoft.apps.coe.pal.datamigration.versionNo.web; +import com.actionsoft.apps.coe.pal.constant.CoEConstant; import com.actionsoft.apps.coe.pal.datamigration.aris.constant.ArisConstant; import com.actionsoft.apps.coe.pal.datamigration.constant.Constant; import com.actionsoft.apps.coe.pal.datamigration.position.model.PalOrgPositionModel; @@ -9,7 +10,9 @@ import com.actionsoft.apps.coe.pal.datamigration.util.LogUtil; import com.actionsoft.apps.coe.pal.datamigration.util.StrUtil; import com.actionsoft.apps.coe.pal.datamigration.versionNo.constant.VersionNoConstant; import com.actionsoft.apps.coe.pal.datamigration.versionNo.model.VersionNoExcelModel; +import com.actionsoft.apps.coe.pal.pal.repository.PALRepositoryAPIManager; import com.actionsoft.apps.coe.pal.pal.repository.PALRepositoryQueryAPIManager; +import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryAttributeCache; import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache; import com.actionsoft.apps.coe.pal.pal.repository.dao.CoeProcessLevelDaoFacotory; import com.actionsoft.apps.coe.pal.pal.repository.dao.PALRepository; @@ -18,6 +21,7 @@ import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.cache.Design import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.dao.DesignerShapeRelationDao; import com.actionsoft.apps.coe.pal.pal.repository.designer.relation.model.DesignerShapeRelationModel; import com.actionsoft.apps.coe.pal.pal.repository.designer.util.CoeDesignerUtil; +import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryAttributeModel; import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel; import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryPropertyModel; import com.actionsoft.apps.coe.pal.pal.repository.model.impl.PALRepositoryModelImpl; @@ -29,6 +33,7 @@ import com.actionsoft.bpms.server.UserContext; import com.actionsoft.bpms.util.UUIDGener; import com.actionsoft.bpms.util.UtilDate; import com.actionsoft.bpms.util.UtilString; +import com.actionsoft.i18n.I18nRes; import com.alibaba.fastjson.JSONObject; import sun.tools.jconsole.inspector.Utils; @@ -83,9 +88,9 @@ public class VersionNoExcelImportRun { /** * 执行导入 * @param excelModelList - * @param arisNameMap + * @param palNameMap */ - public void execute(List excelModelList, Map arisNameMap) { + public void execute(List excelModelList, Map> palNameMap) { DesignerShapeRelationDao relationDao = new DesignerShapeRelationDao(); try { PALRepository repository = CoeProcessLevelDaoFacotory.createCoeProcessLevel(); @@ -101,6 +106,7 @@ public class VersionNoExcelImportRun { String processName = row.getProcessName();// Excel流程名称 String versionNo = row.getProcessVersionNo();// Excel流程版本 + String processType = row.getProcessType();// Excel模型类型 if (UtilString.isEmpty(processName)) { LogUtil.appendLog(Constant.LOG_WARNING + "Excel第[" + importingCount + "]行" + VersionNoConstant.TABLE_PROCESS_NAME + "内容为空,忽略导入", simpleLogFile, fullLogFile, warnLogFile); LogUtil.appendLog("[Excel数据为空]Excel第[" + importingCount + "]行" + VersionNoConstant.TABLE_PROCESS_NAME + "内容为空,忽略导入", matchErrImportFile); @@ -109,31 +115,35 @@ public class VersionNoExcelImportRun { LogUtil.appendLog(Constant.LOG_WARNING + "Excel第[" + importingCount + "]行" + VersionNoConstant.TABLE_PROCESS_VERSION_NO + "内容为空,忽略导入", simpleLogFile, fullLogFile, warnLogFile); LogUtil.appendLog("[Excel数据为空]Excel第[" + importingCount + "]行" + VersionNoConstant.TABLE_PROCESS_VERSION_NO + "内容为空,忽略导入", matchErrImportFile); } + if (UtilString.isEmpty(processType)) { + LogUtil.appendLog(Constant.LOG_WARNING + "Excel第[" + importingCount + "]行" + VersionNoConstant.TABLE_PROCESS_TYPE + "内容为空,忽略导入", simpleLogFile, fullLogFile, warnLogFile); + LogUtil.appendLog("[Excel数据为空]Excel第[" + importingCount + "]行" + VersionNoConstant.TABLE_PROCESS_TYPE + "内容为空,忽略导入", matchErrImportFile); + } LogUtil.appendLog("\n" + Constant.LOG_START + "************[执行阶段][流程匹配阶段]PAL过程链图与Excel中流程进行匹配************", simpleLogFile, fullLogFile); // 校验pal是否存在该流程 - if (!arisNameMap.containsKey(processName)) { + if (!palNameMap.get(processType).containsKey(processName)) { // Excel中的流程在PAL中不存在,当作警告处理,全部记录 - LogUtil.appendLog(Constant.LOG_WARNING + "Excel第["+ importingCount + "]行流程" + "[" + processName + "]未在PAL中找到,忽略导入", simpleLogFile, fullLogFile, warnLogFile); - LogUtil.appendLog("[流程未找到]Excel第[" + importingCount + "]行流程" + "[" + processName + "]未在PAL中找到,忽略导入", matchErrImportFile); + LogUtil.appendLog(Constant.LOG_WARNING + "Excel第["+ importingCount + "]行" + processType + "[" + processName + "]未在PAL中找到,忽略导入", simpleLogFile, fullLogFile, warnLogFile); + LogUtil.appendLog("["+ processType +"未找到]Excel第[" + importingCount + "]行" + processType + "[" + processName + "]未在PAL中找到,忽略导入", matchErrImportFile); LogRealTimeCountCache.getCache().get(logId).setArisBlankCount(LogRealTimeCountCache.getCache().get(logId).getArisBlankCount() + 1);// 借用ArisBlankCount continue; } - String palId = arisNameMap.get(processName);// pal流程id + String palId = palNameMap.get(processType).get(processName);// pal流程id PALRepositoryModel model = PALRepositoryCache.getCache().get(palId); - // 判断是否有多只流程 + // 判断是否有多只模型 List versionList = PALRepositoryCache.getByVersionId(model.getVersionId()); if (versionList.size() > 1) { - LogUtil.appendLog(Constant.LOG_WARNING + "Excel第["+ importingCount + "]行流程" + "[" + processName + "]存在多版本,忽略导入", simpleLogFile, fullLogFile, warnLogFile); - LogUtil.appendLog("[存在多版本]Excel第[" + importingCount + "]行流程" + "[" + processName + "]存在多版本,忽略导入", matchErrImportFile); + LogUtil.appendLog(Constant.LOG_WARNING + "Excel第["+ importingCount + "]行" + processType + "[" + processName + "]存在多版本,忽略导入", simpleLogFile, fullLogFile, warnLogFile); + LogUtil.appendLog("[存在多版本]Excel第[" + importingCount + "]行" + processType + "[" + processName + "]存在多版本,忽略导入", matchErrImportFile); LogRealTimeCountCache.getCache().get(logId).setArisBlankCount(LogRealTimeCountCache.getCache().get(logId).getArisBlankCount() + 1);// 借用ArisBlankCount continue; } // 判断单只流程版本号是否为1.0 double VerNo = model.getVersion(); if (!"V1.0".equals(VersionUtil.getVersionStrV(model.getVersion()))) { - LogUtil.appendLog(Constant.LOG_WARNING + "Excel第["+ importingCount + "]行流程" + "[" + processName + "]版本号不是[V1.0],忽略导入", simpleLogFile, fullLogFile, warnLogFile); - LogUtil.appendLog("[存在多版本]Excel第[" + importingCount + "]行流程" + "[" + processName + "]版本号不是[V1.0],忽略导入", matchErrImportFile); + LogUtil.appendLog(Constant.LOG_WARNING + "Excel第["+ importingCount + "]行" + processType + "[" + processName + "]版本号不是[V1.0],忽略导入", simpleLogFile, fullLogFile, warnLogFile); + LogUtil.appendLog("[存在多版本]Excel第[" + importingCount + "]行" + processType + "[" + processName + "]版本号不是[V1.0],忽略导入", matchErrImportFile); LogRealTimeCountCache.getCache().get(logId).setArisBlankCount(LogRealTimeCountCache.getCache().get(logId).getArisBlankCount() + 1);// 借用ArisBlankCount continue; } @@ -154,8 +164,8 @@ public class VersionNoExcelImportRun { verNo = Double.parseDouble(tmp); } catch (Exception e) { e.printStackTrace(); - LogUtil.appendLog(Constant.LOG_WARNING + "Excel第["+ importingCount + "]行流程" + "[" + processName + "]版本号不是[" + versionNo + "]转换数字类型失败,忽略导入", simpleLogFile, fullLogFile, warnLogFile); - LogUtil.appendLog("[存在多版本]Excel第[" + importingCount + "]行流程" + "[" + processName + "]版本号不是[" + versionNo + "]转换数字类型失败,忽略导入", matchErrImportFile); + LogUtil.appendLog(Constant.LOG_WARNING + "Excel第["+ importingCount + "]行" + processType + "[" + processName + "]版本号不是[" + versionNo + "]转换数字类型失败,忽略导入", simpleLogFile, fullLogFile, warnLogFile); + LogUtil.appendLog("[存在多版本]Excel第[" + importingCount + "]行" + processType + "[" + processName + "]版本号不是[" + versionNo + "]转换数字类型失败,忽略导入", matchErrImportFile); LogRealTimeCountCache.getCache().get(logId).setArisBlankCount(LogRealTimeCountCache.getCache().get(logId).getArisBlankCount() + 1);// 借用ArisBlankCount continue; } @@ -166,54 +176,58 @@ public class VersionNoExcelImportRun { // 修改编号 int result = repository.updateVerNo(model.getId(), verNo); if (result > 0) { - LogUtil.appendLog(Constant.LOG_SUCCESS + "Excel第[" + importingCount + "]行流程[" + processName + "]版本号更新为["+ verNoStr +"]", simpleLogFile, fullLogFile); + LogUtil.appendLog(Constant.LOG_SUCCESS + "Excel第[" + importingCount + "]行" + processType + "[" + processName + "]版本号更新为["+ verNoStr +"]", simpleLogFile, fullLogFile); } else { isSuccess = false; - LogUtil.appendLog(Constant.LOG_WARNING + "Excel第[" + importingCount + "]行流程[" + processName + "]版本号更新为["+ verNoStr +"],更新失败", simpleLogFile, fullLogFile, warnLogFile); + LogUtil.appendLog(Constant.LOG_WARNING + "Excel第[" + importingCount + "]行" + processType + "[" + processName + "]版本号更新为["+ verNoStr +"],更新失败", simpleLogFile, fullLogFile, warnLogFile); } - List propertyModelList = propertyDao.getPropertysByPlid(model.getId(), Constant.METHOD_VERSION); - if (propertyModelList == null || propertyModelList.size() == 0) { - PALRepositoryPropertyModel propertyModel = new PALRepositoryPropertyModel(); - propertyModel.setId(UUIDGener.getUUID()); - propertyModel.setPlId(model.getId()); - propertyModel.setPropertyId(Constant.METHOD_VERSION); - propertyModel.setPropertyName("版本"); - propertyModel.setPropertyValue(verNoStr); - propertyModel.setOrderIndex(0); - int n = propertyDao.insert(propertyModel); - if (n > 0) { - LogUtil.appendLog(Constant.LOG_SUCCESS + "Excel第[" + importingCount + "]行流程[" + processName + "]版本文件属性内容更新为["+ verNoStr +"]", simpleLogFile, fullLogFile); - } else { - isSuccess = false; - LogUtil.appendLog(Constant.LOG_WARNING + "Excel第[" + importingCount + "]行流程[" + processName + "]版本文件属性内容更新为["+ verNoStr +"],更新失败", simpleLogFile, fullLogFile, warnLogFile); - } - } else { - for (PALRepositoryPropertyModel propertyModel : propertyModelList) { + PALRepositoryAttributeModel attributeModel = PALRepositoryAttributeCache.getAttributeByMethodIdAndAttrId(model.getWsId(), model.getMethodId(), Constant.METHOD_VERSION); + if (attributeModel != null) { + List propertyModelList = propertyDao.getPropertysByPlid(model.getId(), Constant.METHOD_VERSION); + if (propertyModelList == null || propertyModelList.size() == 0) { + PALRepositoryPropertyModel propertyModel = new PALRepositoryPropertyModel(); + propertyModel.setId(UUIDGener.getUUID()); + propertyModel.setPlId(model.getId()); + propertyModel.setPropertyId(Constant.METHOD_VERSION); + propertyModel.setPropertyName("版本"); propertyModel.setPropertyValue(verNoStr); - int n = propertyDao.update(propertyModel); + propertyModel.setOrderIndex(0); + int n = propertyDao.insert(propertyModel); if (n > 0) { - LogUtil.appendLog(Constant.LOG_SUCCESS + "Excel第[" + importingCount + "]行流程[" + processName + "]版本文件属性内容更新为["+ verNoStr +"]", simpleLogFile, fullLogFile); + LogUtil.appendLog(Constant.LOG_SUCCESS + "Excel第[" + importingCount + "]行" + processType + "[" + processName + "]版本文件属性内容更新为["+ verNoStr +"]", simpleLogFile, fullLogFile); } else { isSuccess = false; - LogUtil.appendLog(Constant.LOG_WARNING + "Excel第[" + importingCount + "]行流程[" + processName + "]版本文件属性内容更新为["+ verNoStr +"],更新失败", simpleLogFile, fullLogFile, warnLogFile); + LogUtil.appendLog(Constant.LOG_WARNING + "Excel第[" + importingCount + "]行" + processType +"[" + processName + "]版本文件属性内容更新为["+ verNoStr +"],更新失败", simpleLogFile, fullLogFile, warnLogFile); + } + } else { + for (PALRepositoryPropertyModel propertyModel : propertyModelList) { + propertyModel.setPropertyValue(verNoStr); + int n = propertyDao.update(propertyModel); + if (n > 0) { + LogUtil.appendLog(Constant.LOG_SUCCESS + "Excel第[" + importingCount + "]行" + processType + "[" + processName + "]版本文件属性内容更新为["+ verNoStr +"]", simpleLogFile, fullLogFile); + } else { + isSuccess = false; + LogUtil.appendLog(Constant.LOG_WARNING + "Excel第[" + importingCount + "]行" + processType +"[" + processName + "]版本文件属性内容更新为["+ verNoStr +"],更新失败", simpleLogFile, fullLogFile, warnLogFile); + } } } + } else { + LogUtil.appendLog(Constant.LOG_SUCCESS + "Excel第[" + importingCount + "]行" + processType + "[" + processName + "]没有文件属性[版本],导入忽略", simpleLogFile, fullLogFile); } - if (isSuccess) { // 记录流程导入结束日志 LogRealTimeCountCache.getCache().get(logId).setSuccessCount(LogRealTimeCountCache.getCache().get(logId).getSuccessCount() + 1); - LogUtil.appendLog(Constant.LOG_END + "[更新]Excel第[" + importingCount + "]行流程[" + processName + "]版本号[" + verNoStr + "]", simpleLogFile, fullLogFile, successLogFile); + LogUtil.appendLog(Constant.LOG_END + "[更新]Excel第[" + importingCount + "]行" + processType + "[" + processName + "]版本号[" + verNoStr + "]", simpleLogFile, fullLogFile, successLogFile); } else { - LogUtil.appendLog(Constant.LOG_WARNING + "[更新]Excel第[" + importingCount + "]行流程[" + processName + "]版本号[" + verNoStr + "]失败", simpleLogFile, fullLogFile, warnLogFile); + LogUtil.appendLog(Constant.LOG_WARNING + "[更新]Excel第[" + importingCount + "]行" + processType +"[" + processName + "]版本号[" + verNoStr + "]失败", simpleLogFile, fullLogFile, warnLogFile); } } endTime = System.currentTimeMillis(); Timestamp endDate = new Timestamp(endTime); LogRealTimeCountModel model = LogRealTimeCountCache.getCache().get(logId); String takeTimeText = takeTime(endTime, startTime); - String resultMsg = "导入完成,总耗时" + takeTimeText + ",Excel流程总共[" + model.getTotalCount() + "],导入成功[" + model.getSuccessCount() + "]条,导入失败[" + (model.getTotalCount() - model.getSuccessCount()) + "]条"; + String resultMsg = "导入完成,总耗时" + takeTimeText + ",Excel模型总共[" + model.getTotalCount() + "],导入成功[" + model.getSuccessCount() + "]条,导入失败[" + (model.getTotalCount() - model.getSuccessCount()) + "]条"; LogUtil.updateLog(logId, endDate, Constant.LOG_RESULT_StATUS_SUCCESS, resultMsg); LogUtil.appendLog("\n" + Constant.LOG_END + resultMsg, simpleLogFile, fullLogFile, warnLogFile); LogUtil.appendLog("\n" + "版本号Excel导入 End " + UtilDate.datetimeFormat(endDate), simpleLogFile, fullLogFile, warnLogFile); diff --git a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/web/VersionNoExcelImportWeb.java b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/web/VersionNoExcelImportWeb.java index e0b2d4d6..30db4acf 100644 --- a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/web/VersionNoExcelImportWeb.java +++ b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/versionNo/web/VersionNoExcelImportWeb.java @@ -6,6 +6,8 @@ import com.actionsoft.apps.coe.pal.datamigration.log.model.LogModel; import com.actionsoft.apps.coe.pal.datamigration.util.*; import com.actionsoft.apps.coe.pal.datamigration.versionNo.constant.VersionNoConstant; import com.actionsoft.apps.coe.pal.datamigration.versionNo.model.VersionNoExcelModel; +import com.actionsoft.apps.coe.pal.pal.method.cache.PALMethodCache; +import com.actionsoft.apps.coe.pal.pal.method.extend.MethodAppManager; import com.actionsoft.apps.coe.pal.pal.method.model.PALMethodAttributeModel; import com.actionsoft.apps.coe.pal.pal.repository.PALRepositoryAPIManager; import com.actionsoft.apps.coe.pal.pal.repository.PALRepositoryQueryAPIManager; @@ -251,20 +253,68 @@ public class VersionNoExcelImportWeb extends ActionWeb { ro.err("上传文件工作表中内容不能为空"); return ro.toString(); } - // 校验aris流程名称是否重复 - Map palNameMap = ProcessUtil.getPalRepositoryNameMap(wsId, Constant.PROCESS_EPC);// 获取流程以及流程的aris名称 - ResponseObject checkRepeatPalNameRo = checkRepositoryNameRepeat(palNameMap); - if (!checkRepeatPalNameRo.isOk()) { - msg = Constant.LOG_ERROR + checkRepeatPalNameRo.getMsg() + "," + Constant.IMPORT_STOP_MSG; + + // 类型校验 + // 获取类型 + Map map = new HashMap<>(); + List categoryList = PALMethodCache.getPALMethodList(); + for (String category : categoryList) { + JSONObject methodObj = ProcessUtil.getCategoryMethods(category, true); + for (Map.Entry entry : methodObj.entrySet()) { + map.put(entry.getKey(), String.valueOf(entry.getValue())); + } + } + + List errList = new ArrayList<>(); + for (VersionNoExcelModel model : excelModelList) { + String processType = model.getProcessType(); + if (UtilString.isNotEmpty(processType)) { + if (!errList.contains(processType) && !map.containsKey(processType)) { + errList.add(processType); + } + } + } + List rightMetodName = new ArrayList<>(map.keySet()); + Collections.sort(rightMetodName); + if (errList.size() > 0) { + msg = "上传文件工作表中" + VersionNoConstant.TABLE_PROCESS_TYPE + "内容错误,请填写" + StringUtils.join(rightMetodName, "、") + ",当前存在的错误内容:" + StringUtils.join(errList, "、"); updateErrLog(msg, msg); - ro.err(checkRepeatPalNameRo.getMsg()); + ro.err(msg); return ro.toString(); } - // Aris流程名称与PALID反转 - Map arisNameMap2 = new HashMap<>(); - for (Map.Entry entry : palNameMap.entrySet()) { - arisNameMap2.put(entry.getValue(), entry.getKey()); + // 按照Excel中的所有分类校验对应分类下PAL的模型名称是否重复 + Map> palNameMap = new HashMap<>(); + Set methodSet = new HashSet<>(); + for (VersionNoExcelModel model : excelModelList) { + String processType = model.getProcessType(); + if (UtilString.isNotEmpty(processType)) { + if (map.containsKey(processType)) { + methodSet.add(map.get(processType)); + } + } + } + for (String methodId : methodSet) { + Map palNameMap2 = ProcessUtil.getPalRepositoryNameMap(wsId, methodId);// 获取模型以及模型的名称 + ResponseObject checkRepeatPalNameRo = checkRepositoryNameRepeat(palNameMap2, methodId); + if (!checkRepeatPalNameRo.isOk()) { + msg = Constant.LOG_ERROR + checkRepeatPalNameRo.getMsg() + "," + Constant.IMPORT_STOP_MSG; + updateErrLog(msg, msg); + ro.err(checkRepeatPalNameRo.getMsg()); + return ro.toString(); + } + palNameMap.put(methodId, palNameMap2); + } + + // PAL模型名称与PALID反转 + Map> palNameMap4 = new HashMap<>(); + for (Map.Entry> entry : palNameMap.entrySet()) { + Map tmpMap = entry.getValue(); + Map palNameMap3 = new HashMap<>(); + for (Map.Entry entry2 : tmpMap.entrySet()) { + palNameMap3.put(entry2.getValue(), entry2.getKey()); + } + palNameMap4.put(I18nRes.findValue(CoEConstant.APP_ID, entry.getKey()), palNameMap3); } int totalCount = excelModelList.size(); @@ -282,7 +332,7 @@ public class VersionNoExcelImportWeb extends ActionWeb { LogUtil.appendLog("\n" + Constant.LOG_START + "预计导入[" + fileName + "]" + I18nRes.findValue(CoEConstant.APP_ID, Constant.PROCESS_EPC + ",共[" + totalCount + "]条流程")); // 开始执行导入 - new Thread(()->{new VersionNoExcelImportRun(_uc, wsId, logId, logPath, simpleLogFile, fullLogFile, warnLogFile, this.filePath, this.fileName, startTime).execute(excelModelList, arisNameMap2);}) .start(); + new Thread(()->{new VersionNoExcelImportRun(_uc, wsId, logId, logPath, simpleLogFile, fullLogFile, warnLogFile, this.filePath, this.fileName, startTime).execute(excelModelList, palNameMap4);}) .start(); ro.put("totalCount", totalCount); ro.put("importingCount", LogRealTimeCountCache.getCache().get(logId).getImportingCount()); @@ -294,7 +344,7 @@ public class VersionNoExcelImportWeb extends ActionWeb { * @param palNameMap * @return */ - private ResponseObject checkRepositoryNameRepeat(Map palNameMap) { + private ResponseObject checkRepositoryNameRepeat(Map palNameMap, String methodId) { boolean isOk = true; Map> map = new HashMap<>(); for (Map.Entry entry : palNameMap.entrySet()) { @@ -305,6 +355,7 @@ public class VersionNoExcelImportWeb extends ActionWeb { } map.get(name).add(palId); } + String methodName = I18nRes.findValue(CoEConstant.APP_ID, methodId); for (Map.Entry> entry : map.entrySet()) { List idList = entry.getValue(); String name = entry.getKey(); @@ -315,11 +366,12 @@ public class VersionNoExcelImportWeb extends ActionWeb { PALRepositoryModel model = PALRepositoryCache.getCache().get(palId); nameList.add(model.getName()); } - LogUtil.appendLog(Constant.LOG_ERROR + "同一PAL流程名称[" + name + "]对应多个PAL流程", simpleLogFile, fullLogFile, simpleLogFile, fullLogFile); + + LogUtil.appendLog(Constant.LOG_ERROR + "同一PAL" + methodName + "名称[" + name + "]对应多个PAL"+ methodName +"", simpleLogFile, fullLogFile, simpleLogFile, fullLogFile); } } if (!isOk) { - return ResponseObject.newErrResponse("存在同一PAL流程名称对应多个PAL流程,详情见日志"); + return ResponseObject.newErrResponse("存在同一PAL" + methodName + "名称对应多个PAL流程,详情见日志"); } return ResponseObject.newOkResponse(); } @@ -334,11 +386,14 @@ public class VersionNoExcelImportWeb extends ActionWeb { for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) { Row row = sheet.getRow(i); VersionNoExcelModel rowModel = new VersionNoExcelModel(); + // 类型 + Cell cell0 = row.getCell(0); + rowModel.setProcessType(POIUtil.getCellValueByCell(cell0)); // 流程名称 - Cell cell1 = row.getCell(0); + Cell cell1 = row.getCell(1); rowModel.setProcessName(POIUtil.getCellValueByCell(cell1)); // 活动名称 - Cell cell2 = row.getCell(1); + Cell cell2 = row.getCell(2); rowModel.setProcessVersionNo(POIUtil.getCellValueByCell(cell2)); list.add(rowModel); }