1、修改bug

This commit is contained in:
潘荣晟
2025-10-27 18:01:38 +08:00
parent c51117ef02
commit 5859062014
14 changed files with 218 additions and 64 deletions

View File

@@ -10,7 +10,7 @@ public interface ErrorCodeConstants {
ErrorCode TMPL_FLD_NOT_EXISTS = new ErrorCode(1_027_000_501, "模板字段不存在"); ErrorCode TMPL_FLD_NOT_EXISTS = new ErrorCode(1_027_000_501, "模板字段不存在");
ErrorCode TMPL_FLD_CODE_EXISTS = new ErrorCode(1_027_000_502, "字段编码已存在"); 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_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 TEMPLATE_INSTANCE_NOT_EXISTS = new ErrorCode(1_027_000_504, "模板实例不存在");
ErrorCode TMPL_TP_SATUS_ERROR = new ErrorCode(1_027_000_506, "状态变更失败"); ErrorCode TMPL_TP_SATUS_ERROR = new ErrorCode(1_027_000_506, "状态变更失败");
ErrorCode TMPL_TP_DEl_ERROR = new ErrorCode(1_027_000_507, "模版分类删除失败"); ErrorCode TMPL_TP_DEl_ERROR = new ErrorCode(1_027_000_507, "模版分类删除失败");

View File

@@ -124,8 +124,8 @@ public class TmplTpController extends AbstractFileUploadController implements Bu
//获取分类树 //获取分类树
@GetMapping("/tree") @GetMapping("/tree")
@Operation(summary = "获得分类树--上级") @Operation(summary = "获得分类树--上级")
public CommonResult<List<TmplTpTreeVO>> getTree() { public CommonResult<List<TmplTpTreeVO>> getTree(@RequestParam(value = "num",required = false) String num,@RequestParam(value = "name",required = false) String name) {
List<TmplTpTreeVO> tree = tmplTpService.buildTree(); List<TmplTpTreeVO> tree = tmplTpService.buildTree(num,name);
return success(tree); return success(tree);
} }

View File

@@ -42,5 +42,10 @@ public class TmplFldRespVO {
@Schema(description = "字段状态", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "字段状态", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("字段状态") @ExcelProperty("字段状态")
private String sts; private Integer sts;
@Schema(description = "创建人名", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建人名")
private String creatorName;
} }

View File

@@ -47,6 +47,11 @@ public class TmplItmRespVO {
@Schema(description = "字段状态", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "字段状态", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("字段状态") @ExcelProperty("字段状态")
private String sts; private Integer sts;
@Schema(description = "创建人名", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建人名")
private String creatorName;
} }

View File

@@ -25,5 +25,5 @@ public class TmplItmSaveReqVO {
private String itmVal; private String itmVal;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "启用 or 禁用") @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "启用 or 禁用")
private String sts; private Integer sts;
} }

View File

@@ -22,7 +22,7 @@ public class TmplTpFldSaveReqVO {
@Schema(description = "是否必填", requiredMode = Schema.RequiredMode.REQUIRED, example = "Y or N") @Schema(description = "是否必填", requiredMode = Schema.RequiredMode.REQUIRED, example = "Y or N")
private String isMust; private String isMust;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "启用 or 禁用") @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "启用 or 禁用(0或1)")
private String sts; private Integer sts;
} }

View File

@@ -30,6 +30,6 @@ public class TmplItmDO extends BusinessBaseDO {
private String itmVal; private String itmVal;
@TableField("STS") @TableField("STS")
private String sts; private Integer sts;
} }

View File

@@ -75,5 +75,5 @@ public class TmplTpFldDO extends BusinessBaseDO { // 继承业务基类,自动
private String orgnTp; private String orgnTp;
@TableField("STS") @TableField("STS")
private String sts; private Integer sts;
} }

View File

@@ -13,7 +13,7 @@ public interface TmplTpFldMapper extends BaseMapperX<TmplTpFldDO> {
default PageResult<TmplTpFldDO> selectPage(TmplFldPageReqVO reqVO) { default PageResult<TmplTpFldDO> selectPage(TmplFldPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<TmplTpFldDO>() return selectPage(reqVO, new LambdaQueryWrapperX<TmplTpFldDO>()
.likeIfPresent(TmplTpFldDO::getFldName, reqVO.getFldName()) .likeIfPresent(TmplTpFldDO::getFldName, reqVO.getFldName())
.eqIfPresent(TmplTpFldDO::getFldKy, reqVO.getFldKy()) .likeIfPresent(TmplTpFldDO::getFldKy, reqVO.getFldKy())
.eqIfPresent(TmplTpFldDO::getFldDoc, reqVO.getFldDoc()) .eqIfPresent(TmplTpFldDO::getFldDoc, reqVO.getFldDoc())
.eqIfPresent(TmplTpFldDO::getIsMust, reqVO.getIsMust()) .eqIfPresent(TmplTpFldDO::getIsMust, reqVO.getIsMust())
.eqIfPresent(TmplTpFldDO::getDatTp, reqVO.getDatTp()) .eqIfPresent(TmplTpFldDO::getDatTp, reqVO.getDatTp())

View File

@@ -212,13 +212,17 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService {
} }
@Override @Override
@Transactional @Transactional(rollbackFor = Exception.class)
public void publishTemplateInstance(List<PublishTemplateInstanceReqVO> publishReqVOS) { public void publishTemplateInstance(List<PublishTemplateInstanceReqVO> publishReqVOS) {
// 校验当前状态是否能够进行发布 // 校验当前状态是否能够进行发布
publishReqVOS.forEach(reqVO -> { 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(); String currentStatus = reqVO.getCurrentStatus();
if (currentStatus.isEmpty()) { if (currentStatus.isEmpty()) {
currentStatus = templateInstanceMapper.selectById(reqVO.getId()).getSts(); currentStatus =templateInstanceDO.getSts();
} }
PublishStatusEnum status = PublishStatusEnum.fromCode(currentStatus); PublishStatusEnum status = PublishStatusEnum.fromCode(currentStatus);
boolean transitionAllowed = false; boolean transitionAllowed = false;
@@ -237,7 +241,7 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService {
.in(TemplateInstanceDO::getId, publishReqVOS.stream() .in(TemplateInstanceDO::getId, publishReqVOS.stream()
.map(PublishTemplateInstanceReqVO::getId) .map(PublishTemplateInstanceReqVO::getId)
.collect(Collectors.toSet())) .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)); log.info("更新模版实例状态成功【{}】", publishReqVOS.stream().map(PublishTemplateInstanceReqVO::getId));
} }

View File

@@ -22,7 +22,7 @@ import org.springframework.validation.annotation.Validated;
import java.util.List; import java.util.List;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception; 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; import static com.zt.plat.module.tmpltp.enums.ErrorCodeConstants.TMPL_ITM_NOT_EXISTS;
@Service @Service
@@ -32,9 +32,10 @@ public class TmplItmServiceImpl extends ServiceImpl<TmplItmMapper, TmplItmDO> im
@Override @Override
public TmplItmRespVO createTmplItm(TmplItmSaveReqVO tmplItmSaveReqVO) { public TmplItmRespVO createTmplItm(TmplItmSaveReqVO tmplItmSaveReqVO) {
//验证条款名是否存在 //验证条款名是否存在
validateTmplLtmNameExists(tmplItmSaveReqVO.getItmName()); validateTmplLtmNameAndCodeExists(tmplItmSaveReqVO.getItmName(), tmplItmSaveReqVO.getItmNum());
tmplItmSaveReqVO.setId(null); tmplItmSaveReqVO.setId(null);
TmplItmDO bean = BeanUtils.toBean(tmplItmSaveReqVO, TmplItmDO.class); TmplItmDO bean = BeanUtils.toBean(tmplItmSaveReqVO, TmplItmDO.class);
bean.setSts(1);
baseMapper.insert(bean); baseMapper.insert(bean);
return BeanUtils.toBean(bean, TmplItmRespVO.class); return BeanUtils.toBean(bean, TmplItmRespVO.class);
} }
@@ -59,9 +60,13 @@ public class TmplItmServiceImpl extends ServiceImpl<TmplItmMapper, TmplItmDO> im
throw exception(TMPL_ITM_NOT_EXISTS); throw exception(TMPL_ITM_NOT_EXISTS);
} }
} }
private void validateTmplLtmNameExists(String name){ private void validateTmplLtmNameAndCodeExists(String name, String code){
if (baseMapper.selectCount(new LambdaQueryWrapper<TmplItmDO>().eq(TmplItmDO::getItmName,name).eq(TmplItmDO::getDeleted,0).eq(TmplItmDO::getCompanyId, CompanyContextHolder.getCompanyId()))>0) { if (baseMapper.selectCount(new LambdaQueryWrapper<TmplItmDO>()
throw exception(TMPL_ITM_NAME_EXISTS); .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);
} }
} }

View File

@@ -39,7 +39,7 @@ public class TmplTpFldServiceImpl extends ServiceImpl<TmplTpFldMapper, TmplTpFld
public TmplFldRespVO createTmplFld(TmplTpFldSaveReqVO tmplTpFldSaveReqVO) { public TmplFldRespVO createTmplFld(TmplTpFldSaveReqVO tmplTpFldSaveReqVO) {
TmplTpFldDO tmplTpFldDO = BeanUtils.toBean(tmplTpFldSaveReqVO, TmplTpFldDO.class); TmplTpFldDO tmplTpFldDO = BeanUtils.toBean(tmplTpFldSaveReqVO, TmplTpFldDO.class);
validateTmplFldCodeExists(tmplTpFldSaveReqVO.getFldKy()); validateTmplFldCodeExists(tmplTpFldSaveReqVO.getFldKy());
tmplTpFldDO.setSts("启用"); tmplTpFldDO.setSts(1);
baseMapper.insert(tmplTpFldDO); baseMapper.insert(tmplTpFldDO);
log.info("创建模板字段成功,模板字段信息:【{}】", tmplTpFldDO); log.info("创建模板字段成功,模板字段信息:【{}】", tmplTpFldDO);
return BeanUtils.toBean(tmplTpFldDO, TmplFldRespVO.class); return BeanUtils.toBean(tmplTpFldDO, TmplFldRespVO.class);

View File

@@ -83,7 +83,7 @@ public interface TmplTpService extends IService<TmplTpDO> {
* *
* @return 模板分类 * @return 模板分类
*/ */
List<TmplTpTreeVO> buildTree(); List<TmplTpTreeVO> buildTree(String num, String name);
/** /**
* 更新模板分类状态 * 更新模板分类状态

View File

@@ -2,6 +2,7 @@ package com.zt.plat.module.base.service.tmpltp;
import cn.hutool.core.collection.CollUtil; 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.controller.admin.templtp.vo.*;
import com.zt.plat.module.base.dal.dataobject.tmpltp.TmplFldRelDO; import com.zt.plat.module.base.dal.dataobject.tmpltp.TmplFldRelDO;
@@ -154,49 +155,6 @@ public class TmplTpServiceImpl extends ServiceImpl<TmplTpMapper, TmplTpDO> imple
return baseMapper.getClause(id); return baseMapper.getClause(id);
} }
@Override
public List<TmplTpTreeVO> buildTree() {
// 1. 查询所有数据
List<TmplTpDO> allNodes = baseMapper.selectList(new QueryWrapper<>());
// 2. 转换为树节点VO
List<TmplTpTreeVO> 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<TmplTpTreeVO> buildTreeStructure(List<TmplTpTreeVO> treeNodes) {
Map<String, List<TmplTpTreeVO>> groupByPrnId = treeNodes.stream()
.collect(Collectors.groupingBy(node ->
node.getPrnId() != null ? node.getPrnId().toString() : "null"));
// 2. 设置子节点并排序
treeNodes.forEach(node -> {
List<TmplTpTreeVO> 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 @Override
public void updateStatus(Long id, String status) { public void updateStatus(Long id, String status) {
@@ -285,4 +243,181 @@ public class TmplTpServiceImpl extends ServiceImpl<TmplTpMapper, TmplTpDO> imple
} }
} }
@Override
public List<TmplTpTreeVO> buildTree(String num, String name) {
// 如果没有查询条件,返回完整树结构
if ((num == null || num.isEmpty()) && (name == null || name.isEmpty())) {
return buildFullTree();
}
// 1. 根据条件查询匹配的节点
List<TmplTpDO> matchedNodes = baseMapper.selectList(new LambdaQueryWrapper<TmplTpDO>()
.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<String> rootIds = matchedNodes.stream()
.map(node -> node.getId().toString())
.collect(Collectors.toSet());
// 3. 一次性查询所有数据(用于后续过滤)
List<TmplTpDO> allNodes = baseMapper.selectList(null);
// 4. 转换为VO
List<TmplTpTreeVO> allTreeNodes = allNodes.stream()
.map(this::convertToTreeVO)
.collect(Collectors.toList());
// 5. 过滤出匹配节点及其所有子孙节点
Set<String> validNodeIds = new HashSet<>(rootIds);
findAllDescendantIds(allTreeNodes, rootIds, validNodeIds);
// 6. 只保留有效节点
List<TmplTpTreeVO> filteredNodes = allTreeNodes.stream()
.filter(node -> validNodeIds.contains(node.getId().toString()))
.collect(Collectors.toList());
// 7. 构建树形结构
return buildTreeStructure(filteredNodes, rootIds);
}
/**
* 构建完整树结构(从真正的根节点开始)
*/
private List<TmplTpTreeVO> buildFullTree() {
// 1. 查询所有数据
List<TmplTpDO> allNodes = baseMapper.selectList(null);
if (allNodes.isEmpty()) {
return new ArrayList<>();
}
// 2. 转换为树节点VO
List<TmplTpTreeVO> treeNodes = allNodes.stream()
.map(this::convertToTreeVO)
.collect(Collectors.toList());
// 3. 创建ID到节点的映射
Map<String, TmplTpTreeVO> nodeMap = treeNodes.stream()
.collect(Collectors.toMap(
node -> node.getId().toString(),
node -> node
));
// 4. 收集所有节点ID用于判断哪些是根节点
Set<String> allNodeIds = nodeMap.keySet();
List<TmplTpTreeVO> 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<TmplTpTreeVO> allNodes,
Set<String> parentIds,
Set<String> resultIds) {
// 查找直接子节点
Set<String> 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<TmplTpTreeVO> buildTreeStructure(List<TmplTpTreeVO> treeNodes, Set<String> rootIds) {
// 1. 创建ID到节点的映射
Map<String, TmplTpTreeVO> nodeMap = treeNodes.stream()
.collect(Collectors.toMap(
node -> node.getId().toString(),
node -> node
));
// 2. 构建父子关系
List<TmplTpTreeVO> 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;
}
} }