diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/tmpltp/enums/ErrorCodeConstants.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/tmpltp/enums/ErrorCodeConstants.java index c2d0a63..63e1908 100644 --- a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/tmpltp/enums/ErrorCodeConstants.java +++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/tmpltp/enums/ErrorCodeConstants.java @@ -10,7 +10,7 @@ public interface ErrorCodeConstants { ErrorCode TMPL_FLD_NOT_EXISTS = new ErrorCode(1_027_000_501, "模板字段不存在"); ErrorCode TMPL_FLD_CODE_EXISTS = new ErrorCode(1_027_000_502, "字段编码已存在"); ErrorCode TMPL_ITM_NOT_EXISTS = new ErrorCode(1_027_000_503, "模板条款不存在"); - ErrorCode TMPL_ITM_NAME_EXISTS = new ErrorCode(1_027_000_503, "模板条款名字已存在"); + ErrorCode TMPL_ITM_NAME_CODE_EXISTS = new ErrorCode(1_027_000_503, "模板条款名称或编码已存在"); ErrorCode TEMPLATE_INSTANCE_NOT_EXISTS = new ErrorCode(1_027_000_504, "模板实例不存在"); ErrorCode TMPL_TP_SATUS_ERROR = new ErrorCode(1_027_000_506, "状态变更失败"); ErrorCode TMPL_TP_DEl_ERROR = new ErrorCode(1_027_000_507, "模版分类删除失败"); diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/TmplTpController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/TmplTpController.java index 5a3987b..a09c441 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/TmplTpController.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/TmplTpController.java @@ -124,8 +124,8 @@ public class TmplTpController extends AbstractFileUploadController implements Bu //获取分类树 @GetMapping("/tree") @Operation(summary = "获得分类树--上级") - public CommonResult> getTree() { - List tree = tmplTpService.buildTree(); + public CommonResult> getTree(@RequestParam(value = "num",required = false) String num,@RequestParam(value = "name",required = false) String name) { + List tree = tmplTpService.buildTree(num,name); return success(tree); } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplFldRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplFldRespVO.java index eaed5e5..2aa232a 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplFldRespVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplFldRespVO.java @@ -42,5 +42,10 @@ public class TmplFldRespVO { @Schema(description = "字段状态", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("字段状态") - private String sts; + private Integer sts; + + @Schema(description = "创建人名", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建人名") + private String creatorName; + } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplItmRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplItmRespVO.java index e0f8fec..ba2d3de 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplItmRespVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplItmRespVO.java @@ -47,6 +47,11 @@ public class TmplItmRespVO { @Schema(description = "字段状态", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("字段状态") - private String sts; + private Integer sts; + + + @Schema(description = "创建人名", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建人名") + private String creatorName; } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplItmSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplItmSaveReqVO.java index f7f3a64..f9279d1 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplItmSaveReqVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplItmSaveReqVO.java @@ -25,5 +25,5 @@ public class TmplItmSaveReqVO { private String itmVal; @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "启用 or 禁用") - private String sts; + private Integer sts; } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplTpFldSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplTpFldSaveReqVO.java index 43ee90a..5f9339b 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplTpFldSaveReqVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TmplTpFldSaveReqVO.java @@ -22,7 +22,7 @@ public class TmplTpFldSaveReqVO { @Schema(description = "是否必填", requiredMode = Schema.RequiredMode.REQUIRED, example = "Y or N") private String isMust; - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "启用 or 禁用") - private String sts; + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "启用 or 禁用(0或1)") + private Integer sts; } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TmplItmDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TmplItmDO.java index 84e7657..a677756 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TmplItmDO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TmplItmDO.java @@ -30,6 +30,6 @@ public class TmplItmDO extends BusinessBaseDO { private String itmVal; @TableField("STS") - private String sts; + private Integer sts; } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TmplTpFldDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TmplTpFldDO.java index 95a74f7..d207138 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TmplTpFldDO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TmplTpFldDO.java @@ -75,5 +75,5 @@ public class TmplTpFldDO extends BusinessBaseDO { // 继承业务基类,自动 private String orgnTp; @TableField("STS") - private String sts; + private Integer sts; } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/mysql/tmpltp/TmplTpFldMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/mysql/tmpltp/TmplTpFldMapper.java index 3c84e72..920f465 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/mysql/tmpltp/TmplTpFldMapper.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/mysql/tmpltp/TmplTpFldMapper.java @@ -13,7 +13,7 @@ public interface TmplTpFldMapper extends BaseMapperX { default PageResult selectPage(TmplFldPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(TmplTpFldDO::getFldName, reqVO.getFldName()) - .eqIfPresent(TmplTpFldDO::getFldKy, reqVO.getFldKy()) + .likeIfPresent(TmplTpFldDO::getFldKy, reqVO.getFldKy()) .eqIfPresent(TmplTpFldDO::getFldDoc, reqVO.getFldDoc()) .eqIfPresent(TmplTpFldDO::getIsMust, reqVO.getIsMust()) .eqIfPresent(TmplTpFldDO::getDatTp, reqVO.getDatTp()) diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceServiceImpl.java index 822dfb2..06a929c 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceServiceImpl.java @@ -212,13 +212,17 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { } @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void publishTemplateInstance(List publishReqVOS) { // 校验当前状态是否能够进行发布 publishReqVOS.forEach(reqVO -> { + TemplateInstanceDO templateInstanceDO = templateInstanceMapper.selectById(reqVO.getId()); + if (templateInstanceDO.getCntt()==null||templateInstanceDO.getCntt().isEmpty()){ + throw exception(TEMPLATE_INSTANCE_FILE_NOT_EXISTS); + } String currentStatus = reqVO.getCurrentStatus(); if (currentStatus.isEmpty()) { - currentStatus = templateInstanceMapper.selectById(reqVO.getId()).getSts(); + currentStatus =templateInstanceDO.getSts(); } PublishStatusEnum status = PublishStatusEnum.fromCode(currentStatus); boolean transitionAllowed = false; @@ -237,7 +241,7 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { .in(TemplateInstanceDO::getId, publishReqVOS.stream() .map(PublishTemplateInstanceReqVO::getId) .collect(Collectors.toSet())) - .set(TemplateInstanceDO::getSts, TmplStsEnum.PUBLISHED.getCode())); + .set(TemplateInstanceDO::getSts, TmplStsEnum.PUBLISHED.getCode()).set(TemplateInstanceDO::getPublishTime, LocalDateTime.now())); log.info("更新模版实例状态成功【{}】", publishReqVOS.stream().map(PublishTemplateInstanceReqVO::getId)); } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplItmServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplItmServiceImpl.java index 43478a7..b00a9fa 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplItmServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplItmServiceImpl.java @@ -22,7 +22,7 @@ import org.springframework.validation.annotation.Validated; import java.util.List; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zt.plat.module.tmpltp.enums.ErrorCodeConstants.TMPL_ITM_NAME_EXISTS; +import static com.zt.plat.module.tmpltp.enums.ErrorCodeConstants.TMPL_ITM_NAME_CODE_EXISTS; import static com.zt.plat.module.tmpltp.enums.ErrorCodeConstants.TMPL_ITM_NOT_EXISTS; @Service @@ -32,9 +32,10 @@ public class TmplItmServiceImpl extends ServiceImpl im @Override public TmplItmRespVO createTmplItm(TmplItmSaveReqVO tmplItmSaveReqVO) { //验证条款名是否存在 - validateTmplLtmNameExists(tmplItmSaveReqVO.getItmName()); + validateTmplLtmNameAndCodeExists(tmplItmSaveReqVO.getItmName(), tmplItmSaveReqVO.getItmNum()); tmplItmSaveReqVO.setId(null); TmplItmDO bean = BeanUtils.toBean(tmplItmSaveReqVO, TmplItmDO.class); + bean.setSts(1); baseMapper.insert(bean); return BeanUtils.toBean(bean, TmplItmRespVO.class); } @@ -59,9 +60,13 @@ public class TmplItmServiceImpl extends ServiceImpl im throw exception(TMPL_ITM_NOT_EXISTS); } } - private void validateTmplLtmNameExists(String name){ - if (baseMapper.selectCount(new LambdaQueryWrapper().eq(TmplItmDO::getItmName,name).eq(TmplItmDO::getDeleted,0).eq(TmplItmDO::getCompanyId, CompanyContextHolder.getCompanyId()))>0) { - throw exception(TMPL_ITM_NAME_EXISTS); + private void validateTmplLtmNameAndCodeExists(String name, String code){ + if (baseMapper.selectCount(new LambdaQueryWrapper() + .eq(TmplItmDO::getDeleted, 0) + .eq(TmplItmDO::getCompanyId, CompanyContextHolder.getCompanyId()) + .and(wrapper -> wrapper.eq(TmplItmDO::getItmName, name).or().eq(TmplItmDO::getItmNum, code)) + ) > 0) { + throw exception(TMPL_ITM_NAME_CODE_EXISTS); } } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpFldServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpFldServiceImpl.java index 925e383..e50c1aa 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpFldServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpFldServiceImpl.java @@ -39,7 +39,7 @@ public class TmplTpFldServiceImpl extends ServiceImpl { * * @return 模板分类 */ - List buildTree(); + List buildTree(String num, String name); /** * 更新模板分类状态 diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpServiceImpl.java index 3fd4451..48191c2 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TmplTpServiceImpl.java @@ -2,6 +2,7 @@ package com.zt.plat.module.base.service.tmpltp; import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zt.plat.module.base.controller.admin.templtp.vo.*; import com.zt.plat.module.base.dal.dataobject.tmpltp.TmplFldRelDO; @@ -154,49 +155,6 @@ public class TmplTpServiceImpl extends ServiceImpl imple return baseMapper.getClause(id); } - @Override - public List buildTree() { - // 1. 查询所有数据 - List allNodes = baseMapper.selectList(new QueryWrapper<>()); - - // 2. 转换为树节点VO - List treeNodes = allNodes.stream() - .map(this::convertToTreeVO) - .collect(Collectors.toList()); - - // 3. 构建树形结构 - return buildTreeStructure(treeNodes); - } - - /** - * 转换实体类到树节点VO - */ - private TmplTpTreeVO convertToTreeVO(TmplTpDO entity) { - return BeanUtils.toBean(entity, TmplTpTreeVO.class); - } - - /** - * 构建树形结构 - */ - private List buildTreeStructure(List treeNodes) { - Map> groupByPrnId = treeNodes.stream() - .collect(Collectors.groupingBy(node -> - node.getPrnId() != null ? node.getPrnId().toString() : "null")); - - // 2. 设置子节点并排序 - treeNodes.forEach(node -> { - List children = groupByPrnId.get(node.getId().toString()); - if (children != null && !children.isEmpty()) { - // 按排序序号升序排列 - children.sort(Comparator.comparing(TmplTpTreeVO::getSrt)); - node.setChildren(children); - } - }); - - // 3. 返回根节点(父ID为NULL的节点) - return groupByPrnId.getOrDefault("0", new ArrayList<>()); - } - @Override public void updateStatus(Long id, String status) { @@ -285,4 +243,181 @@ public class TmplTpServiceImpl extends ServiceImpl imple } } + @Override + public List buildTree(String num, String name) { + // 如果没有查询条件,返回完整树结构 + if ((num == null || num.isEmpty()) && (name == null || name.isEmpty())) { + return buildFullTree(); + } + + // 1. 根据条件查询匹配的节点 + List matchedNodes = baseMapper.selectList(new LambdaQueryWrapper() + .eq(name != null && !name.isEmpty(), TmplTpDO::getName, name) + .eq(num != null && !num.isEmpty(), TmplTpDO::getNum, num)); + + if (matchedNodes.isEmpty()) { + return new ArrayList<>(); + } + + // 2. 获取匹配节点的ID集合 + Set rootIds = matchedNodes.stream() + .map(node -> node.getId().toString()) + .collect(Collectors.toSet()); + + // 3. 一次性查询所有数据(用于后续过滤) + List allNodes = baseMapper.selectList(null); + + // 4. 转换为VO + List allTreeNodes = allNodes.stream() + .map(this::convertToTreeVO) + .collect(Collectors.toList()); + + // 5. 过滤出匹配节点及其所有子孙节点 + Set validNodeIds = new HashSet<>(rootIds); + findAllDescendantIds(allTreeNodes, rootIds, validNodeIds); + + // 6. 只保留有效节点 + List filteredNodes = allTreeNodes.stream() + .filter(node -> validNodeIds.contains(node.getId().toString())) + .collect(Collectors.toList()); + + // 7. 构建树形结构 + return buildTreeStructure(filteredNodes, rootIds); + } + + /** + * 构建完整树结构(从真正的根节点开始) + */ + private List buildFullTree() { + // 1. 查询所有数据 + List allNodes = baseMapper.selectList(null); + + if (allNodes.isEmpty()) { + return new ArrayList<>(); + } + + // 2. 转换为树节点VO + List treeNodes = allNodes.stream() + .map(this::convertToTreeVO) + .collect(Collectors.toList()); + + // 3. 创建ID到节点的映射 + Map nodeMap = treeNodes.stream() + .collect(Collectors.toMap( + node -> node.getId().toString(), + node -> node + )); + + // 4. 收集所有节点ID,用于判断哪些是根节点 + Set allNodeIds = nodeMap.keySet(); + List roots = new ArrayList<>(); + + // 5. 构建父子关系,并识别根节点 + for (TmplTpTreeVO node : treeNodes) { + String parentId = node.getPrnId() != null ? node.getPrnId().toString() : null; + + if (parentId != null && nodeMap.containsKey(parentId)) { + // 有父节点,建立父子关系 + TmplTpTreeVO parent = nodeMap.get(parentId); + if (parent.getChildren() == null) { + parent.setChildren(new ArrayList<>()); + } + parent.getChildren().add(node); + } else { + // 没有父节点或父节点不存在,视为根节点 + roots.add(node); + } + } + + // 6. 对所有节点的子节点进行排序 + nodeMap.values().forEach(node -> { + if (node.getChildren() != null && !node.getChildren().isEmpty()) { + node.getChildren().sort(Comparator.comparing(TmplTpTreeVO::getSrt)); + } + }); + + // 7. 对根节点排序 + if (!roots.isEmpty()) { + roots.sort(Comparator.comparing(TmplTpTreeVO::getSrt)); + } + + return roots; + } + + /** + * 从内存中查找所有子孙节点ID + */ + private void findAllDescendantIds(List allNodes, + Set parentIds, + Set resultIds) { + // 查找直接子节点 + Set childIds = allNodes.stream() + .filter(node -> node.getPrnId() != null + && parentIds.contains(node.getPrnId().toString())) + .map(node -> node.getId().toString()) + .collect(Collectors.toSet()); + + if (childIds.isEmpty()) { + return; + } + + // 添加到结果集 + resultIds.addAll(childIds); + + // 递归查找子节点的子节点 + findAllDescendantIds(allNodes, childIds, resultIds); + } + + /** + * 转换实体类到树节点VO + */ + private TmplTpTreeVO convertToTreeVO(TmplTpDO entity) { + return BeanUtils.toBean(entity, TmplTpTreeVO.class); + } + + /** + * 构建树形结构(指定根节点ID集合) + */ + private List buildTreeStructure(List treeNodes, Set rootIds) { + // 1. 创建ID到节点的映射 + Map nodeMap = treeNodes.stream() + .collect(Collectors.toMap( + node -> node.getId().toString(), + node -> node + )); + + // 2. 构建父子关系 + List roots = new ArrayList<>(); + + for (TmplTpTreeVO node : treeNodes) { + String nodeId = node.getId().toString(); + String parentId = node.getPrnId() != null ? node.getPrnId().toString() : null; + + // 如果是查询条件匹配的根节点 + if (rootIds.contains(nodeId)) { + roots.add(node); + } + + // 如果有父节点且父节点在当前节点集合中,建立父子关系 + if (parentId != null && nodeMap.containsKey(parentId)) { + TmplTpTreeVO parent = nodeMap.get(parentId); + if (parent.getChildren() == null) { + parent.setChildren(new ArrayList<>()); + } + parent.getChildren().add(node); + } + } + + // 3. 对所有节点的子节点进行排序 + nodeMap.values().forEach(node -> { + if (node.getChildren() != null && !node.getChildren().isEmpty()) { + node.getChildren().sort(Comparator.comparing(TmplTpTreeVO::getSrt)); + } + }); + + // 4. 对根节点排序 + roots.sort(Comparator.comparing(TmplTpTreeVO::getSrt)); + + return roots; + } }