diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index 02538bf..3a157d9 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -103,7 +103,8 @@ TEMPLATE_FILE_NULL(2500, "模板文件不能为空"), FOREIGN_KEY_FIELD_NULL(2501, "模块外键字段为空"), FOREIGN_KEY_VALUE_NULL(2502, "模块外键值为空"), - BIND_KEY_LIST_NULL(2503, "绑定管理的列表为空"); + BIND_KEY_LIST_NULL(2503, "绑定管理的列表为空"), + APPROVAL_FIELD_ERROR(2504, "工作流字段设置错位"); private Integer code; private String message; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index 02538bf..3a157d9 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -103,7 +103,8 @@ TEMPLATE_FILE_NULL(2500, "模板文件不能为空"), FOREIGN_KEY_FIELD_NULL(2501, "模块外键字段为空"), FOREIGN_KEY_VALUE_NULL(2502, "模块外键值为空"), - BIND_KEY_LIST_NULL(2503, "绑定管理的列表为空"); + BIND_KEY_LIST_NULL(2503, "绑定管理的列表为空"), + APPROVAL_FIELD_ERROR(2504, "工作流字段设置错位"); private Integer code; private String message; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java index 440e126..510bad1 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java @@ -115,6 +115,7 @@ filePrintRegister.setParams(metaDataMap); Map tableNameIdMap = new HashMap<>(); tableNameIdMap.put(moduleFieldConfig.getTableName(), metaDataMap); + //时间格式的转换,统一处理 convertMapDate(metaDataMap); return tableNameIdMap; } @@ -123,51 +124,61 @@ /** * 相当于消费存在一定的顺序 * + * @param tableNameMap 前置执行表结果的缓存 * @param filePrintRegister 打印注册信息 + * @param moduleFieldConfig 模块配置信息 * @return 返回类型的数据 */ protected void relateModuleField(FilePrintRegister filePrintRegister, Map tableNameMap, ModuleFieldConfig moduleFieldConfig) { + //健壮性校验,没有关联关系,直接退出 if (StringUtils.isEmpty(moduleFieldConfig.getRelationJson())) { return; } //构建查询参数 List fieldTableDTOList = buildFieldTableDTOList(moduleFieldConfig.getRelationJson(), tableNameMap); - //可能有的就是没有查询出数据 + //健壮性校验 if (CollectionUtils.isNotEmpty(fieldTableDTOList)) { List> relateBizMapList = null; + //当前集合的长度为1,且设置的in查询为true,可以执行外键 if (fieldTableDTOList.size() == 1 && fieldTableDTOList.get(0).getSqlIn()) { List relateIdList = new ArrayList<>(); String[] typeStr = fieldTableDTOList.get(0).getForeignKeyValue().split(","); for (int i = 0; i < typeStr.length; i++) { relateIdList.add(Long.valueOf(typeStr[i])); } + //执行关联表“in”查询 relateBizMapList = moduleFieldMapper.inRelateBizList(moduleFieldConfig.getTableName(), fieldTableDTOList.get(0).getForeignKeyField(), relateIdList); } else { + //执行关联表“=”号查询 relateBizMapList = moduleFieldMapper.equalRelateBizList(moduleFieldConfig.getTableName(), fieldTableDTOList); } - if (1 == moduleFieldConfig.getDocUse()) { + //健壮性校验 + if (CollectionUtils.isEmpty(relateBizMapList)) { + return; + } + //判断是否是用于doc填充 + if (ObjectUtils.isNotEmpty(moduleFieldConfig.getDocUse()) && 1 == moduleFieldConfig.getDocUse()) { int count = 1; for (Map relateBizMap : relateBizMapList) { convertMapDate(relateBizMap); relateBizMap.put("seq", count++); } + //执行当前集合的其他元素查询,例如图片,工作流等字段图片 + for (Map metaDataMap : relateBizMapList) { + buildModuleElement(metaDataMap, moduleFieldConfig, filePrintRegister); + } String shortName = getShortName(moduleFieldConfig.getTableName(), filePrintRegister.getParams()); + //判断当前模块信息在单元格中的执行情况 if (StringUtils.isEmpty(moduleFieldConfig.getObjectString())) { + //不作为当前一个单元格执行 filePrintRegister.getParams().put(shortName, relateBizMapList); } else { filePrintRegister.getParams().put(shortName, objectListToString(relateBizMapList, moduleFieldConfig.getObjectString())); } } - if (CollectionUtils.isEmpty(relateBizMapList)) { - return; - } - //构建当前元素 - for (Map metaDataMap : relateBizMapList) { - buildModuleElement(metaDataMap, moduleFieldConfig, filePrintRegister); - } - //存在对应多个一对一的情况,保存到内存 + //无论是否用于doc文档,都需要将当前元素集合保存到临时缓存 tableNameMap.put(moduleFieldConfig.getTableName(), relateBizMapList); } } @@ -183,24 +194,28 @@ List fieldTableDTOList = new ArrayList<>(); List relationMapList = JSON.parseArray(relationJson, Map.class); for (Map relationMap : relationMapList) { - //判断是否设备字段 + //判断是否设备字段,健壮性校验 Assert.isFalse(!relationMap.containsKey(RELATE_ID_FIELD) || ObjectUtils.isEmpty(relationMap.get(RELATE_ID_FIELD)), () -> { throw new BusinessException(BusinessExceptionEnum.FOREIGN_KEY_FIELD_NULL); }); - //判断是否有值 + //判断是否有值,健壮性校验 Assert.isFalse(!relationMap.containsKey(RELATE_TABLE_NAME) || ObjectUtils.isEmpty(tableNameMap.get(relationMap.get(RELATE_TABLE_NAME))), () -> { throw new BusinessException(BusinessExceptionEnum.FOREIGN_KEY_VALUE_NULL); }); + //构建外键信息 String relationIds = buildForeignKeyValue(tableNameMap.get(relationMap.get(RELATE_TABLE_NAME)), relationMapList.size(), (String) relationMap.get(RELATE_ID_FIELD)); + //健壮性校验 if (StringUtils.isNotEmpty(relationIds)) { + // 默认为单个关联外键 fieldTableDTOList.add(FieldTableDTO.builder() .foreignKeyField((String) relationMap.get(CURRENT_ID_FIELD)) //可能存在多个情况,需要进行单表的查询 .foreignKeyValue(relationIds) .sqlIn(false) .build()); + //如果ids存在,默认为多个关联外键 if (relationIds.contains(",")) { fieldTableDTOList.get(fieldTableDTOList.size() - 1).setSqlIn(true); } @@ -210,6 +225,9 @@ } /** + * 获取表的简称,自动生成驼峰简称 + * 1、规则是biz_user_info,根据表的情况,由于info没有实际信息意义,排除info情况,取user + * 2、如果当前集合已经含有user,则向前读取为bizUser * 获取表定义的简称 * * @param tableName @@ -231,6 +249,7 @@ } + //当前表的字段作为单元格中string内容,执行一下操作 private String objectListToString(List> relateBizMapList, String objectString) { String[] objectFieldStr = objectString.split(","); String relateBizStr = ""; @@ -255,9 +274,11 @@ * @return */ private String buildForeignKeyValue(Object relationObject, Integer relateListSize, String relateIdField) { + //健壮性的校验 if (StringUtils.isEmpty(relateIdField)) { return null; } + //如果是list集合,进行list ids的组装 if (relationObject instanceof List) { String relationIds = ""; if (relateListSize == 1) { @@ -274,6 +295,7 @@ return relationIds; } } + //如果是map集合,说明是单个集合,只有一个外键 if (relationObject instanceof Map) { Map relationMap = (Map) relationObject; if (relationMap.containsKey(relateIdField)) { @@ -285,7 +307,7 @@ } /** - * 模块内容元素构建 + * 模块内容元素构建1、字典信息 2、关键字图片信息 */ protected void buildModuleElement(Map metaDataMap, ModuleFieldConfig moduleFieldConfig, FilePrintRegister filePrintRegister) { //字典信息 @@ -300,20 +322,29 @@ //图片信息-审批图片信息,其他字段配置信息 String imageJson = moduleFieldConfig.getImageJson(); if (StringUtils.isNotEmpty(imageJson)) { + //获取审批流程的bean ApprovalOperateService approvalOperateService = SpringContextUtil.getBean(ApprovalOperateService.class); JSONObject imageMap = JSON.parseObject(imageJson); Map> approvalLogMap = null; + //判断是否有工作流字段(approvalField 字段存放是poccessId),工作流map取出 if (StringUtils.isEmpty(imageMap.get(APPROVAL_FIELD).toString()) && ObjectUtils.isNotEmpty(metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString()))) { + //健壮性校验,没有绑定的list结合去掉 + Assert.isFalse(metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString()), + () -> { + throw new BusinessException(BusinessExceptionEnum.APPROVAL_FIELD_ERROR); + }); List> approvalLogList = approvalOperateService.approvalLog((String) metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString())); approvalLogMap = approvalLogList.stream() .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); } + //健壮性校验,没有绑定的list结合去掉 Assert.isFalse(ObjectUtils.isEmpty(imageMap.get(BIND_KEY_LIST)), () -> { throw new BusinessException(BusinessExceptionEnum.BIND_KEY_LIST_NULL); }); //处理图片信息 List imageMapList = JSON.parseArray((String) imageMap.get(BIND_KEY_LIST), Map.class); + //执行构建关键字图片集合 ElectronicSignSeal.bindPictureKey(filePrintRegister, imageMapList, metaDataMap, approvalLogMap); } } @@ -346,6 +377,8 @@ } /** + * 遍历当前map,进行时间格式的转换 + * * @param map */ protected void convertMapDate(Map map) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java index 02538bf..3a157d9 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/BusinessExceptionEnum.java @@ -103,7 +103,8 @@ TEMPLATE_FILE_NULL(2500, "模板文件不能为空"), FOREIGN_KEY_FIELD_NULL(2501, "模块外键字段为空"), FOREIGN_KEY_VALUE_NULL(2502, "模块外键值为空"), - BIND_KEY_LIST_NULL(2503, "绑定管理的列表为空"); + BIND_KEY_LIST_NULL(2503, "绑定管理的列表为空"), + APPROVAL_FIELD_ERROR(2504, "工作流字段设置错位"); private Integer code; private String message; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java index 440e126..510bad1 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FilePrintSupport.java @@ -115,6 +115,7 @@ filePrintRegister.setParams(metaDataMap); Map tableNameIdMap = new HashMap<>(); tableNameIdMap.put(moduleFieldConfig.getTableName(), metaDataMap); + //时间格式的转换,统一处理 convertMapDate(metaDataMap); return tableNameIdMap; } @@ -123,51 +124,61 @@ /** * 相当于消费存在一定的顺序 * + * @param tableNameMap 前置执行表结果的缓存 * @param filePrintRegister 打印注册信息 + * @param moduleFieldConfig 模块配置信息 * @return 返回类型的数据 */ protected void relateModuleField(FilePrintRegister filePrintRegister, Map tableNameMap, ModuleFieldConfig moduleFieldConfig) { + //健壮性校验,没有关联关系,直接退出 if (StringUtils.isEmpty(moduleFieldConfig.getRelationJson())) { return; } //构建查询参数 List fieldTableDTOList = buildFieldTableDTOList(moduleFieldConfig.getRelationJson(), tableNameMap); - //可能有的就是没有查询出数据 + //健壮性校验 if (CollectionUtils.isNotEmpty(fieldTableDTOList)) { List> relateBizMapList = null; + //当前集合的长度为1,且设置的in查询为true,可以执行外键 if (fieldTableDTOList.size() == 1 && fieldTableDTOList.get(0).getSqlIn()) { List relateIdList = new ArrayList<>(); String[] typeStr = fieldTableDTOList.get(0).getForeignKeyValue().split(","); for (int i = 0; i < typeStr.length; i++) { relateIdList.add(Long.valueOf(typeStr[i])); } + //执行关联表“in”查询 relateBizMapList = moduleFieldMapper.inRelateBizList(moduleFieldConfig.getTableName(), fieldTableDTOList.get(0).getForeignKeyField(), relateIdList); } else { + //执行关联表“=”号查询 relateBizMapList = moduleFieldMapper.equalRelateBizList(moduleFieldConfig.getTableName(), fieldTableDTOList); } - if (1 == moduleFieldConfig.getDocUse()) { + //健壮性校验 + if (CollectionUtils.isEmpty(relateBizMapList)) { + return; + } + //判断是否是用于doc填充 + if (ObjectUtils.isNotEmpty(moduleFieldConfig.getDocUse()) && 1 == moduleFieldConfig.getDocUse()) { int count = 1; for (Map relateBizMap : relateBizMapList) { convertMapDate(relateBizMap); relateBizMap.put("seq", count++); } + //执行当前集合的其他元素查询,例如图片,工作流等字段图片 + for (Map metaDataMap : relateBizMapList) { + buildModuleElement(metaDataMap, moduleFieldConfig, filePrintRegister); + } String shortName = getShortName(moduleFieldConfig.getTableName(), filePrintRegister.getParams()); + //判断当前模块信息在单元格中的执行情况 if (StringUtils.isEmpty(moduleFieldConfig.getObjectString())) { + //不作为当前一个单元格执行 filePrintRegister.getParams().put(shortName, relateBizMapList); } else { filePrintRegister.getParams().put(shortName, objectListToString(relateBizMapList, moduleFieldConfig.getObjectString())); } } - if (CollectionUtils.isEmpty(relateBizMapList)) { - return; - } - //构建当前元素 - for (Map metaDataMap : relateBizMapList) { - buildModuleElement(metaDataMap, moduleFieldConfig, filePrintRegister); - } - //存在对应多个一对一的情况,保存到内存 + //无论是否用于doc文档,都需要将当前元素集合保存到临时缓存 tableNameMap.put(moduleFieldConfig.getTableName(), relateBizMapList); } } @@ -183,24 +194,28 @@ List fieldTableDTOList = new ArrayList<>(); List relationMapList = JSON.parseArray(relationJson, Map.class); for (Map relationMap : relationMapList) { - //判断是否设备字段 + //判断是否设备字段,健壮性校验 Assert.isFalse(!relationMap.containsKey(RELATE_ID_FIELD) || ObjectUtils.isEmpty(relationMap.get(RELATE_ID_FIELD)), () -> { throw new BusinessException(BusinessExceptionEnum.FOREIGN_KEY_FIELD_NULL); }); - //判断是否有值 + //判断是否有值,健壮性校验 Assert.isFalse(!relationMap.containsKey(RELATE_TABLE_NAME) || ObjectUtils.isEmpty(tableNameMap.get(relationMap.get(RELATE_TABLE_NAME))), () -> { throw new BusinessException(BusinessExceptionEnum.FOREIGN_KEY_VALUE_NULL); }); + //构建外键信息 String relationIds = buildForeignKeyValue(tableNameMap.get(relationMap.get(RELATE_TABLE_NAME)), relationMapList.size(), (String) relationMap.get(RELATE_ID_FIELD)); + //健壮性校验 if (StringUtils.isNotEmpty(relationIds)) { + // 默认为单个关联外键 fieldTableDTOList.add(FieldTableDTO.builder() .foreignKeyField((String) relationMap.get(CURRENT_ID_FIELD)) //可能存在多个情况,需要进行单表的查询 .foreignKeyValue(relationIds) .sqlIn(false) .build()); + //如果ids存在,默认为多个关联外键 if (relationIds.contains(",")) { fieldTableDTOList.get(fieldTableDTOList.size() - 1).setSqlIn(true); } @@ -210,6 +225,9 @@ } /** + * 获取表的简称,自动生成驼峰简称 + * 1、规则是biz_user_info,根据表的情况,由于info没有实际信息意义,排除info情况,取user + * 2、如果当前集合已经含有user,则向前读取为bizUser * 获取表定义的简称 * * @param tableName @@ -231,6 +249,7 @@ } + //当前表的字段作为单元格中string内容,执行一下操作 private String objectListToString(List> relateBizMapList, String objectString) { String[] objectFieldStr = objectString.split(","); String relateBizStr = ""; @@ -255,9 +274,11 @@ * @return */ private String buildForeignKeyValue(Object relationObject, Integer relateListSize, String relateIdField) { + //健壮性的校验 if (StringUtils.isEmpty(relateIdField)) { return null; } + //如果是list集合,进行list ids的组装 if (relationObject instanceof List) { String relationIds = ""; if (relateListSize == 1) { @@ -274,6 +295,7 @@ return relationIds; } } + //如果是map集合,说明是单个集合,只有一个外键 if (relationObject instanceof Map) { Map relationMap = (Map) relationObject; if (relationMap.containsKey(relateIdField)) { @@ -285,7 +307,7 @@ } /** - * 模块内容元素构建 + * 模块内容元素构建1、字典信息 2、关键字图片信息 */ protected void buildModuleElement(Map metaDataMap, ModuleFieldConfig moduleFieldConfig, FilePrintRegister filePrintRegister) { //字典信息 @@ -300,20 +322,29 @@ //图片信息-审批图片信息,其他字段配置信息 String imageJson = moduleFieldConfig.getImageJson(); if (StringUtils.isNotEmpty(imageJson)) { + //获取审批流程的bean ApprovalOperateService approvalOperateService = SpringContextUtil.getBean(ApprovalOperateService.class); JSONObject imageMap = JSON.parseObject(imageJson); Map> approvalLogMap = null; + //判断是否有工作流字段(approvalField 字段存放是poccessId),工作流map取出 if (StringUtils.isEmpty(imageMap.get(APPROVAL_FIELD).toString()) && ObjectUtils.isNotEmpty(metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString()))) { + //健壮性校验,没有绑定的list结合去掉 + Assert.isFalse(metaDataMap.containsKey(imageMap.get(APPROVAL_FIELD).toString()), + () -> { + throw new BusinessException(BusinessExceptionEnum.APPROVAL_FIELD_ERROR); + }); List> approvalLogList = approvalOperateService.approvalLog((String) metaDataMap.get(imageMap.get(APPROVAL_FIELD).toString())); approvalLogMap = approvalLogList.stream() .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); } + //健壮性校验,没有绑定的list结合去掉 Assert.isFalse(ObjectUtils.isEmpty(imageMap.get(BIND_KEY_LIST)), () -> { throw new BusinessException(BusinessExceptionEnum.BIND_KEY_LIST_NULL); }); //处理图片信息 List imageMapList = JSON.parseArray((String) imageMap.get(BIND_KEY_LIST), Map.class); + //执行构建关键字图片集合 ElectronicSignSeal.bindPictureKey(filePrintRegister, imageMapList, metaDataMap, approvalLogMap); } } @@ -346,6 +377,8 @@ } /** + * 遍历当前map,进行时间格式的转换 + * * @param map */ protected void convertMapDate(Map map) { diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/GenericFilePrintProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/GenericFilePrintProcessor.java index 674ae1f..fe44c2c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/GenericFilePrintProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/GenericFilePrintProcessor.java @@ -25,27 +25,31 @@ /** * @param moduleName 模块名称 * @param moduleType 模块类型 - * @param moduleIdValue 当前模块的id值 + * @param moduleIdValue 当前模块信息的id值 * @return */ public FilePrintRegister printFileRegister(String moduleName, String moduleType, Long moduleIdValue, String templateFileDir) { + //获取当前模板配置信息 ModuleTemplatePrintConfig moduleTemplatePrintConfig = getModuleTemplatePrintConfig(moduleName, moduleType); - //判断是否有模板,没有直接 + //判断是否有模板,没有直接抛出异常,健壮性校验 Assert.isFalse(StringUtils.isEmpty(moduleTemplatePrintConfig.getTemplateFile()), () -> { throw new BusinessException(BusinessExceptionEnum.TEMPLATE_FILE_NULL); }); - //根据模板配置,初始化文件打印系信息 + //根据打印模板配置,初始化文件打印注册信息 FilePrintRegister filePrintRegister = initialization(templateFileDir, moduleIdValue, moduleTemplatePrintConfig); //以下分别执行当前表及关联表的参数信息(字典内容),图片信息,审批信息(图片) Long moduleFieldId = moduleTemplatePrintConfig.getModuleFieldId(); + //查询当前模块主表的信息 Map tableNameIdMap = moduleField(filePrintRegister, moduleFieldId, moduleIdValue); - - //模块ids + //通过模块ids集合,进行关联模块参数的获取 String relateModuleIds = moduleTemplatePrintConfig.getRelateModuleFieldIds(); + //判空健壮性校验 if (StringUtils.isNotEmpty(relateModuleIds)) { + //获取关联模块的配置 List moduleFieldConfigs = getRelateModuleFieldConfig(relateModuleIds); + //进行关联性模块的排序,主要根据是否前置条件满足进行排序 List sortFieldConfigList = tryRelateModuleFieldConfigs(moduleFieldConfigs, tableNameIdMap); - //对责任链执行排序或者进行挂起继续运行递归操作 + //1、健壮性校验 2 对责任链执行链式操作 if (CollectionUtils.isNotEmpty(sortFieldConfigList)) { for (ModuleFieldConfig moduleFieldConfig : sortFieldConfigList) { relateModuleField(filePrintRegister, tableNameIdMap, moduleFieldConfig); @@ -57,13 +61,13 @@ return filePrintRegister; } + //空的,留作扩展使用 private void moduleCustomizedProcessing(FilePrintRegister filePrintRegister) { - } /** - * 预消费阶段 + * 预消费阶段,在当前顺序遍历中,查询条件充足的靠前,需要前置条件的表格挂起靠后执行 * * @param moduleFieldConfigs */ @@ -96,7 +100,7 @@ } /** - * 匹配阶段 + * 预匹配阶段,在当前顺序位置中,前置表集合是否已经存在,不存在返回false * * @param relationJson * @param tableNameMap