From 7e7dbfbacab369b8fd35d5686e73a974fe1abb01 Mon Sep 17 00:00:00 2001 From: anhc <3442943606@qq.com> Date: Thu, 7 Jul 2022 00:22:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=B5=81=E7=A8=8B=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E6=8E=A5=E5=8F=A3=E5=8A=A0=E5=85=A5=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....actionsoft.apps.coe.pal.datamigration.jar | Bin 195234 -> 200788 bytes .../pal/datamigration/util/WordLogUtil.java | 211 ++++++++++++++++++ .../datamigration/web/DataMigrationWeb.java | 130 +++++++++-- 3 files changed, 328 insertions(+), 13 deletions(-) create mode 100644 com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/util/WordLogUtil.java 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 6a33f977077ace4d94ea3c39c5ba5c7d955afbcb..2db9a5315e4bb7981bb3ffe58bad53ad48251bce 100644 GIT binary patch delta 28009 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 delta 22370 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 F{{c3TymkNp diff --git a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/util/WordLogUtil.java b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/util/WordLogUtil.java new file mode 100644 index 00000000..5311e8bd --- /dev/null +++ b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/util/WordLogUtil.java @@ -0,0 +1,211 @@ +package com.actionsoft.apps.coe.pal.datamigration.util; + +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.log.cache.LogRealTimeCountCache; +import com.actionsoft.apps.coe.pal.datamigration.log.model.LogModel; +import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile; +import com.actionsoft.bpms.server.UserContext; +import com.actionsoft.bpms.server.fs.DCContext; +import com.actionsoft.bpms.server.fs.dc.DCProfileManager; +import com.actionsoft.bpms.util.UUIDGener; + +import java.io.File; +import java.io.IOException; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class WordLogUtil { + + private UserContext uc; + private String logId; + private String logPath; + private File infoLogFile; + private File warnLogFile; + private File errorLogFile; + private File fullLogFile; + private String filePath; + private String fileName; + + public WordLogUtil(UserContext _uc){ + this.uc = _uc; + logId = UUIDGener.getUUID();// 记录缓存 + String fileValue = "AttrtibuteImported-" + new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date()) + "=" + _uc.getUID(); + // 创建dc目录 + DCPluginProfile dcProfile = DCProfileManager.getDCProfile(Constant.APP_ID, Constant.UPFILE); + DCContext dc = new DCContext(_uc, dcProfile, Constant.APP_ID, "log", fileValue); + + String dirPath = dc.getPath(); + File file = new File(dirPath); + if (!file.exists()){ + file.mkdirs(); + } + + try { + infoLogFile = new File(dirPath,"simpleImport.log"); + if (!infoLogFile.exists()){ + infoLogFile.createNewFile(); + } + + fullLogFile = new File(dirPath,"fullImport.log"); + if (!fullLogFile.exists()){ + fullLogFile.createNewFile(); + } + + warnLogFile = new File(dirPath,"warningImport.log" ); + if (!warnLogFile.exists()){ + warnLogFile.createNewFile(); + } + errorLogFile = new File(dirPath,"errorImport.log"); + if (!errorLogFile.exists()){ + errorLogFile.createNewFile(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + logPath = fullLogFile.getPath();// 前端实时展示的日志 + } + + + public void appendInfoLog(String content) { + LogUtil.appendLog(content,infoLogFile); + } + + public void appendFullLog(String content) { + LogUtil.appendLog(content,fullLogFile); + } + + public void appendErrorLog(String content) { + LogUtil.appendLog(content,errorLogFile); + } + public void appendWarnLog(String content) { + LogUtil.appendLog(content,warnLogFile); + } + + public void appendAllAndInfoLog(String content) { + LogUtil.appendLog(content,fullLogFile,infoLogFile); + } + public void appendAllAndWarnLog(String content) { + LogUtil.appendLog(content,fullLogFile,warnLogFile); + } + + public void appendAllAndErrorLog(String content) { + LogUtil.appendLog(content,fullLogFile,errorLogFile); + } + + public void appendAllLog(String content) { + LogUtil.appendLog(content,infoLogFile,fullLogFile,warnLogFile,errorLogFile); + } + + /** + * 记录一次批量上传行为 + * @param id + * @param wsId 资产库id + * @param fileName 批量记录名称 + * @param filePath 批量上传的dc地址 + * @param createDate 创建时间 + */ + public void createLogModel(String id, String wsId, String fileName, String filePath, Timestamp createDate) { + LogModel model = new LogModel(); + model.setId(id); + model.setWsId(wsId); + model.setFileName(fileName); + model.setFilePath(filePath); + model.setLogPath(logPath); + model.setCreateUser(uc.getUID()); + model.setCreateUserName(uc.getUserName()); + model.setCreateDate(createDate); + model.setStartDate(createDate); + model.setResultStatus(Constant.LOG_RESULT_StATUS_RUN); + model.setMainInfo("导入进行中"); + // 存储日志db + LogUtil.createLog(model); + } + + /** + * 获取此次批量结果状态值 + * @return + */ + public int getLogResultStatus(){ + return LogUtil.queryLog(logId).getResultStatus(); + } + + public void updateErrLog(String logFileMsg, String logDbMsg) { + // 记录日志 + this.appendAllAndErrorLog(logFileMsg); + // 日志表记录导入结果 + LogUtil.updateLog(logId, new Timestamp(System.currentTimeMillis()), Constant.LOG_RESULT_StATUS_ERROR, logDbMsg); + // 清空缓存 +// LogRealTimeCountCache.getCache().remove(logId); + } + + + + + + public String getLogId() { + return logId; + } + + public void setLogId(String logId) { + this.logId = logId; + } + + public String getLogPath() { + return logPath; + } + + public void setLogPath(String logPath) { + this.logPath = logPath; + } + + public File getInfoLogFile() { + return infoLogFile; + } + + public void setInfoLogFile(File infoLogFile) { + this.infoLogFile = infoLogFile; + } + + public File getWarnLogFile() { + return warnLogFile; + } + + public void setWarnLogFile(File warnLogFile) { + this.warnLogFile = warnLogFile; + } + + public File getErrorLogFile() { + return errorLogFile; + } + + public void setErrorLogFile(File errorLogFile) { + this.errorLogFile = errorLogFile; + } + + public File getFullLogFile() { + return fullLogFile; + } + + public void setFullLogFile(File fullLogFile) { + this.fullLogFile = fullLogFile; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } +} diff --git a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/web/DataMigrationWeb.java b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/web/DataMigrationWeb.java index 1c0c7357..f62de77b 100644 --- a/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/web/DataMigrationWeb.java +++ b/com.actionsoft.apps.coe.pal.datamigration/src/com/actionsoft/apps/coe/pal/datamigration/web/DataMigrationWeb.java @@ -9,9 +9,7 @@ import com.actionsoft.apps.coe.pal.datamigration.aris.web.ArisXmlImportWeb; import com.actionsoft.apps.coe.pal.datamigration.constant.Constant; import com.actionsoft.apps.coe.pal.datamigration.model.po.AwsOrgInfo; import com.actionsoft.apps.coe.pal.datamigration.model.po.WordField; -import com.actionsoft.apps.coe.pal.datamigration.util.ExcelUtil; -import com.actionsoft.apps.coe.pal.datamigration.util.ShapeUtil; -import com.actionsoft.apps.coe.pal.datamigration.util.WordUtil; +import com.actionsoft.apps.coe.pal.datamigration.util.*; import com.actionsoft.apps.coe.pal.datamigration.util.readword.CreateMaps; import com.actionsoft.apps.coe.pal.log.CoEOpLogAPI; import com.actionsoft.apps.coe.pal.log.CoEOpLogConst; @@ -134,15 +132,57 @@ public class DataMigrationWeb extends ActionWeb { if (null == fileDcContext) { return ResponseObject.newErrResponse("文件参数异常").toString(); } - //批量解析文档 File dirFile = new File(fileDcContext.getPath()); File[] fileArr = dirFile.listFiles(); + + //日志记录名称搭建 + String fileName = ""; + for (int i = 0; i < fileArr.length; i++) { + File file = fileArr[i]; + fileName = StringUtils.isEmpty(fileName) ? fileName + file.getName() : ","+ fileName + file.getName(); + if (i>=3){ + fileName += "等"; + break; + } + } + + Timestamp startTime = new Timestamp(System.currentTimeMillis()); + WordLogUtil wordLogUtil = new WordLogUtil(_uc); + //新建数据库记录 + wordLogUtil.createLogModel(wordLogUtil.getLogId(),wsId,fileName,fileDcContext.getPath(),startTime); + + //初始化日志 + wordLogUtil.appendInfoLog("注:该日志文件存储简要日志信息"); + wordLogUtil.appendFullLog("注:该日志文件存储详细日志信息"); + wordLogUtil.appendErrorLog("注:该日志文件记录错误日志信息"); + wordLogUtil.appendWarnLog("注:该日志文件记录警告日志信息"); + + wordLogUtil.appendAllLog("\n[信息]操作人:" + _uc.getUserName() + "<" + _uc.getUID() + ">"); + wordLogUtil.appendAllLog("[信息]操作时间:" + UtilDate.datetimeFormat(startTime)); + + // 校验资产库是否存在可用 + boolean isActive = PALRepositoryQueryAPIManager.getInstance().isActiveWorkSpace(wsId); + if (!isActive) { + String msg = Constant.LOG_ERROR + "资产库不存在或已停用," + Constant.IMPORT_STOP_MSG; + wordLogUtil.updateErrLog(msg, msg); + return ResponseObject.newErrResponse("资产库不存在或已停用").toString(); + } + new Thread(new Runnable() { @Override public void run() { for (File file : fileArr) { - new DataMigrationWeb().analysisWord(wsId, file.getPath()); + wordLogUtil.appendAllLog("\n[信息]流程属性Word文件:" + file.getName()); + wordLogUtil.appendAllLog("[信息]流程属性Word文件路径:"+ file.getPath()); + wordLogUtil.appendAllLog("-----------流程属性Word文件 Begin " + UtilDate.datetimeFormat(startTime)); + ResponseObject res = new DataMigrationWeb().analysisWord(wsId, file.getPath(), wordLogUtil); + if (res.isErr()){ + wordLogUtil.appendAllAndErrorLog(Constant.LOG_ERROR + "word文件--"+file.getName()+" 解析异常:"+res.getMsg()+" 中断解析\n"); + } + if (res.isOk()){ + wordLogUtil.appendAllAndInfoLog(Constant.LOG_END+ "word文件--"+file.getName()+" :"+res.getMsg()+"\n"); + } } } }).start(); @@ -375,7 +415,7 @@ public class DataMigrationWeb extends ActionWeb { return index == null ? 0 : index; } - private ResponseObject analysisWord(String wsId,String filePath){ + private ResponseObject analysisWord(String wsId,String filePath,WordLogUtil logUtil){ //解析Word文档 WordUtil wordUtil = new WordUtil(); boolean analysisFlag = wordUtil.analysisWordTable(filePath); @@ -395,6 +435,9 @@ public class DataMigrationWeb extends ActionWeb { PALRepositoryPropertyDao propDao = new PALRepositoryPropertyDao(); DesignerShapeRelationDao relationDao = new DesignerShapeRelationDao(); List importPropertyList = propDao.getPropertysByPlid(importModel.getId(), ""); + if (importPropertyList.isEmpty()){ + return ResponseObject.newErrResponse("流程文件属性配置异常,没有获取到文件属性"); + } for (PALRepositoryPropertyModel importProperty : importPropertyList) { WordField wordField = fileFieldMap.get(importProperty.getPropertyName()); //旧版本的映射字段支持 @@ -410,12 +453,15 @@ public class DataMigrationWeb extends ActionWeb { if (null == wordField) { continue; } + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 获取Word解析数据成功:["+importProperty.getPropertyName()+"]"); //使用缓存获取具体建模属性 PALRepositoryAttributeModel repositoryAttrModel = PALRepositoryAttributeCache.getAttributeByMethodIdAndAttrId(wsId, importModel.getMethodId(), importProperty.getPropertyId()); if (null == repositoryAttrModel) { + logUtil.appendAllAndErrorLog(Constant.LOG_ERROR+" 获取建模属性失败:["+importProperty.getPropertyName()+"]"); continue; } if ("table".equals(repositoryAttrModel.getType())) { + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"]类型为:表格"); //将解析的列表数据转化为数据存储json JSONObject object = new JSONObject(); object.put("name", importProperty.getPropertyName()); @@ -431,6 +477,8 @@ public class DataMigrationWeb extends ActionWeb { array.add(obj); } } + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 获取["+importProperty.getPropertyName()+"] word 解析数据为 空"); } if (array.size() > 0) { //特殊处理表头 @@ -453,18 +501,31 @@ public class DataMigrationWeb extends ActionWeb { object.put("table", array); //更新数据库值 importProperty.setPropertyValue(object.toJSONString()); - propDao.update(importProperty); + int update = propDao.update(importProperty); + if (update>0){ + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值成功"); + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值失败"); + } + } else if ("awsorg".equals(repositoryAttrModel.getType())) { + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"]类型为:BPM组织架构"); //aws组织架构解析,多组结构解析 String orgName = (String) wordField.getData(); List awsOrgInfos = this.getOrgByName(orgName); if (!awsOrgInfos.isEmpty()) { //先更新property数据 [{"name":"部门3","id":"fdea04c8-502f-4367-82b7-a5ebe0ce5f67","type":"department"}] importProperty.setPropertyValue(JSON.toJSONString(awsOrgInfos)); - propDao.update(importProperty); + int update = propDao.update(importProperty); + if (update>0){ + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值成功"); + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值失败"); + } //先删除property关联关系,然后新增关系 relationDao.deleteByAttrId(importModel.getId(), "", importProperty.getPropertyId()); + int insert = 0; for (AwsOrgInfo awsOrgInfo : awsOrgInfos) { DesignerShapeRelationModel model = new DesignerShapeRelationModel(); model.setFileId(importModel.getId()); @@ -474,17 +535,31 @@ public class DataMigrationWeb extends ActionWeb { model.setRelationFileId("00000000-0000-0000-0000-000000000000"); model.setRelationShapeId("00000000-0000-0000-0000-000000000000"); model.setRelationShapeText(JSON.toJSONString(awsOrgInfo)); - relationDao.insert(model); + insert += relationDao.insert(model); } + if (insert == awsOrgInfos.size()){ + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"] 保存关联关系成功"); + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 文件属性["+importProperty.getPropertyName()+"] 保存关联关系失败"); + } + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 获取["+importProperty.getPropertyName()+"] BPM组织架构为 空"); } } else if ("relation".equals(repositoryAttrModel.getType())) { + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"]类型为:pal模型关联"); //关联文件 List fileList = new ArrayList<>(); List relations = (List) wordField.getData(); + if (relations.isEmpty()){ + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 获取["+importProperty.getPropertyName()+"] pal模型关联数据为 空"); + } for (String relation : relations) { PALRepositoryModel repository = this.getRepositoryByName(wsId, this.trimFileName(relation)); if (repository != null) { + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"] 获取关联pal模型<"+this.trimFileName(relation)+"> 成功"); fileList.add(repository); + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 文件属性["+importProperty.getPropertyName()+"] 获取关联pal模型<"+this.trimFileName(relation)+"> 失败"); } } @@ -499,10 +574,16 @@ public class DataMigrationWeb extends ActionWeb { JSONObject propertyJson = JSON.parseObject(importProperty.getPropertyValue()); propertyJson.put("relationFileId", relationFileIds); importProperty.setPropertyValue(propertyJson.toJSONString()); - propDao.update(importProperty); + int update = propDao.update(importProperty); + if (update>0){ + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值成功"); + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值失败"); + } //先删除property关联关系,然后新增关系 if (!fileList.isEmpty()) { + int insert = 0; relationDao.deleteByAttrId(importModel.getId(), "", importProperty.getPropertyId()); for (PALRepositoryModel repositoryModel : fileList) { DesignerShapeRelationModel relationModel = new DesignerShapeRelationModel(); @@ -513,7 +594,12 @@ public class DataMigrationWeb extends ActionWeb { relationModel.setRelationFileId(repositoryModel.getVersionId()); relationModel.setRelationShapeId(""); relationModel.setRelationShapeText(repositoryModel.getName()); - relationDao.insert(relationModel); + insert += relationDao.insert(relationModel); + } + if (insert == fileList.size()){ + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"] 保存关联关系成功"); + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 文件属性["+importProperty.getPropertyName()+"] 保存关联关系失败"); } } @@ -522,7 +608,11 @@ public class DataMigrationWeb extends ActionWeb { } else if ("boolean".equals(repositoryAttrModel.getType())) { } else if ("DateTimePicker".equals(repositoryAttrModel.getType())) { + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"]类型为:时间选择器"); String time = (String) wordField.getData(); + if (StringUtils.isEmpty(time)){ + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 获取["+importProperty.getPropertyName()+"] word 解析时间字符为 空"); + } try { Date formatTime = new SimpleDateFormat("yyyy年MM月dd日").parse(time); time = UtilDate.datetimeFormat(formatTime); @@ -531,14 +621,28 @@ public class DataMigrationWeb extends ActionWeb { } //更新数据库值 importProperty.setPropertyValue(time); - propDao.update(importProperty); + int update = propDao.update(importProperty); + if (update>0){ + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值成功"); + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值失败"); + } } else { if (wordField.getData() instanceof String) { + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"]类型为:字符"); //直接获取Word解析字符内容 String value = (String) wordField.getData(); + if (StringUtils.isEmpty(value)){ + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 获取["+importProperty.getPropertyName()+"] word 解析字符为 空"); + } //更新数据库值 importProperty.setPropertyValue(value); - propDao.update(importProperty); + int update = propDao.update(importProperty); + if (update>0){ + logUtil.appendAllAndInfoLog(Constant.LOG_DESC+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值成功"); + }else { + logUtil.appendAllAndWarnLog(Constant.LOG_WARNING+" 文件属性["+importProperty.getPropertyName()+"] 保存属性值失败"); + } } }