From 451db1f909a3bc0715a22b0db1481e543482e495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BD=98=E8=8D=A3=E6=99=9F?= <9691125+pan-rongsheng@user.noreply.gitee.com> Date: Thu, 25 Sep 2025 15:00:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E7=89=88=E7=BC=96=E5=88=B6=E7=9A=84?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templtp/TemplateInstanceController.java | 9 +- .../vo/TemplateInstanceDataRespVO.java | 1 - .../vo/TemplateInstanceItemRespVO.java | 4 + .../templtp/vo/TemplateInstanceRespVO.java | 5 + .../dataobject/tmpltp/TemplateInstanceDO.java | 6 + .../tmpltp/TemplateInstanceService.java | 4 +- .../tmpltp/TemplateInstanceServiceImpl.java | 232 +++++++++++++----- 7 files changed, 197 insertions(+), 64 deletions(-) diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/TemplateInstanceController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/TemplateInstanceController.java index d01ffbb..ab0b1f5 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/TemplateInstanceController.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/TemplateInstanceController.java @@ -167,7 +167,14 @@ public class TemplateInstanceController extends AbstractFileUploadController { @PostMapping("/create-version") @Operation(summary = "创建版本") @PreAuthorize("@ss.hasPermission('bse:template-instance:create-version')") - public CommonResult createVersion(@Valid @NotEmpty(message = "模版实例") String id) { + public CommonResult createVersion(@Valid @NotEmpty(message = "模版实例id不能为空") String id) { return success(templateInstanceService.createVersion(id)); } + + //通过模版编码查看历史版本 + @GetMapping("/list-by-template-cdg") + @Operation(summary = "通过模版编码(cdg)查看历史版本",description = "通过模版编码查看历史版本,已按照发布时间和创建时间降序排序") + public CommonResult> listByTemplateCode(@RequestParam("cdg") @Valid @NotEmpty(message = "模版编号不能为空") String templateCode) { + return success(templateInstanceService.listByCdg(templateCode)); + } } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceDataRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceDataRespVO.java index 3e41942..a744a72 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceDataRespVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceDataRespVO.java @@ -31,5 +31,4 @@ public class TemplateInstanceDataRespVO { @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; - } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceItemRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceItemRespVO.java index 9fb3f71..430a579 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceItemRespVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceItemRespVO.java @@ -32,4 +32,8 @@ public class TemplateInstanceItemRespVO { @ExcelProperty("创建时间") private LocalDate createTime; + @Schema(description = "条款名", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("条款名") + private String itmName; + } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceRespVO.java index 96da62c..9cc4a28 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceRespVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/TemplateInstanceRespVO.java @@ -56,6 +56,11 @@ public class TemplateInstanceRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "发布时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("发布时间") + private LocalDateTime publishTime; + + @Schema(description = "使用部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "") private List deptIds; @Schema(description = "实例字段;这个是实例字段绑定的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "") diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TemplateInstanceDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TemplateInstanceDO.java index f38899d..3ea628d 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TemplateInstanceDO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/tmpltp/TemplateInstanceDO.java @@ -68,6 +68,12 @@ public class TemplateInstanceDO extends BusinessBaseDO { * 状态 */ private String sts; + + + /** + * 发布时间 + */ + private LocalDateTime publishTime; // /** // * 公司编号 // */ diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceService.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceService.java index d43028f..493ea66 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceService.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/tmpltp/TemplateInstanceService.java @@ -77,7 +77,9 @@ public interface TemplateInstanceService { void setDisableOrEnable(@Valid DisableEnableReqVO reqVO); - TemplateInstanceRespVO createVersion(@Valid @NotEmpty(message = "模版实例") String id); + TemplateInstanceRespVO createVersion(@Valid @NotEmpty(message = "模版实例id不能为空") String id); Map getVersion(String id); + + List listByCdg(String cdg); } 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 4d8d8b4..f29d476 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 @@ -1,6 +1,9 @@ package com.zt.plat.module.base.service.tmpltp; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.fastjson2.util.DateUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.zt.plat.framework.common.pojo.PageResult; @@ -10,15 +13,13 @@ import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; import com.zt.plat.framework.tenant.core.context.CompanyContextHolder; import com.zt.plat.module.base.controller.admin.templtp.vo.*; import com.zt.plat.module.base.dal.dataobject.tmpltp.*; -import com.zt.plat.module.base.dal.mysql.tmpltp.DepartmentInstanceRelativityMapper; -import com.zt.plat.module.base.dal.mysql.tmpltp.TemplateInstanceDataMapper; -import com.zt.plat.module.base.dal.mysql.tmpltp.TemplateInstanceItemMapper; -import com.zt.plat.module.base.dal.mysql.tmpltp.TemplateInstanceMapper; +import com.zt.plat.module.base.dal.mysql.tmpltp.*; import com.zt.plat.module.tmpltp.enums.DeleteStatusEnum; import com.zt.plat.module.tmpltp.enums.PublishStatusEnum; import com.zt.plat.module.tmpltp.enums.TmplStsEnum; import com.zt.plat.module.tmpltp.enums.UpdateStatusEnum; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -37,6 +38,7 @@ import static com.zt.plat.module.tmpltp.enums.ErrorCodeConstants.*; * * @author 后台管理 */ +@Slf4j @Service @Validated public class TemplateInstanceServiceImpl implements TemplateInstanceService { @@ -58,7 +60,7 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { // 插入 TemplateInstanceDO templateInstance = BeanUtils.toBean(createReqVO, TemplateInstanceDO.class); templateInstance.setVer("v1.0"); //设置初始版本为v1.0 - templateInstance.setCdg(UUID.randomUUID().toString());//设置模板编码 + templateInstance.setCdg(getCdg());//设置初始编码 templateInstance.setSts(TmplStsEnum.DRAFT.getCode());//设置初始状态为草稿 int insert = templateInstanceMapper.insert(templateInstance); if (insert <= 0) { @@ -75,7 +77,9 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { }); departmentInstanceRelativityMapper.insertBatch(departmentInstanceRelativityDOS); // 插入使用范围 - return BeanUtils.toBean(templateInstance, TemplateInstanceRespVO.class); + TemplateInstanceRespVO templateInstanceRespVO = BeanUtils.toBean(templateInstance, TemplateInstanceRespVO.class); + templateInstanceRespVO.setDeptIds(createReqVO.getDeptIds()); + return templateInstanceRespVO; } @Override @@ -141,63 +145,96 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { } - private String incrementVersion(String currentVersion) { - // 处理空值或空字符串 - if (currentVersion == null || currentVersion.trim().isEmpty()) { - return "v1.0"; - } +// private String incrementVersion(String currentVersion) { +// // 处理空值或空字符串 +// if (currentVersion == null || currentVersion.trim().isEmpty()) { +// return "v1.0"; +// } +// +// String version = currentVersion.trim(); +// Matcher matcher = VERSION_PATTERN.matcher(version); +// +// if (!matcher.matches()) { +// // 没有找到数字部分,返回默认版本 +// return version + "1.0"; +// } +// +// String prefix = matcher.group(1); // 前缀部分(如 "v", "version-" 等) +// String numberPart = matcher.group(2); // 数字部分(如 "1.2.3") +// String suffix = matcher.group(3); // 后缀部分 +// +// // 分割数字部分 +// String[] segments = numberPart.split("\\."); +// +// // 从最后一段开始处理进位 +// boolean carry = true; // 初始需要加1 +// +// for (int i = segments.length - 1; i >= 0 && carry; i--) { +// try { +// int currentNumber = Integer.parseInt(segments[i]); +// currentNumber++; // 加1 +// +// if (currentNumber >= 10) { +// // 需要进位 +// segments[i] = "0"; +// carry = true; // 继续向前进位 +// } else { +// // 不需要进位 +// segments[i] = String.valueOf(currentNumber); +// carry = false; // 停止进位 +// } +// } catch (NumberFormatException e) { +// // 理论上不会发生,因为正则已经保证了是数字 +// segments[i] = "1"; +// carry = false; +// } +// } +// +// // 如果最高位也需要进位,在前面添加一段 +// if (carry) { +// String[] newSegments = new String[segments.length + 1]; +// newSegments[0] = "1"; +// System.arraycopy(segments, 0, newSegments, 1, segments.length); +// segments = newSegments; +// } +// +// // 重新组合版本号 +// String newNumberPart = String.join(".", segments); +// return prefix + newNumberPart + suffix; +// } +private String incrementVersion(String currentVersion) { + // 处理空值或空字符串 + if (currentVersion == null || currentVersion.trim().isEmpty()) { + return "v1"; + } - String version = currentVersion.trim(); - Matcher matcher = VERSION_PATTERN.matcher(version); + String version = currentVersion.trim(); + // 正则模式:前缀(可选) + 数字部分 + 后缀(可选) + // 数字部分匹配一个或多个数字 + Pattern VERSION_PATTERN = Pattern.compile("^([^0-9]*?)(\\d+)(.*)$"); + Matcher matcher = VERSION_PATTERN.matcher(version); - if (!matcher.matches()) { - // 没有找到数字部分,返回默认版本 - return version + "1.0"; - } + if (!matcher.matches()) { + // 没有找到数字部分,返回默认版本 + return version + "1"; + } - String prefix = matcher.group(1); // 前缀部分(如 "v", "version-" 等) - String numberPart = matcher.group(2); // 数字部分(如 "1.2.3") - String suffix = matcher.group(3); // 后缀部分 + String prefix = matcher.group(1); // 前缀部分(如 "v", "version-" 等) + String numberPart = matcher.group(2); // 数字部分(如 "1", "123") + String suffix = matcher.group(3); // 后缀部分 - // 分割数字部分 - String[] segments = numberPart.split("\\."); - - // 从最后一段开始处理进位 - boolean carry = true; // 初始需要加1 - - for (int i = segments.length - 1; i >= 0 && carry; i--) { - try { - int currentNumber = Integer.parseInt(segments[i]); - currentNumber++; // 加1 - - if (currentNumber >= 10) { - // 需要进位 - segments[i] = "0"; - carry = true; // 继续向前进位 - } else { - // 不需要进位 - segments[i] = String.valueOf(currentNumber); - carry = false; // 停止进位 - } - } catch (NumberFormatException e) { - // 理论上不会发生,因为正则已经保证了是数字 - segments[i] = "1"; - carry = false; - } - } - - // 如果最高位也需要进位,在前面添加一段 - if (carry) { - String[] newSegments = new String[segments.length + 1]; - newSegments[0] = "1"; - System.arraycopy(segments, 0, newSegments, 1, segments.length); - segments = newSegments; - } + try { + // 将数字部分解析为整数并加1 + int number = Integer.parseInt(numberPart); + number++; // 重新组合版本号 - String newNumberPart = String.join(".", segments); - return prefix + newNumberPart + suffix; + return prefix + number + suffix; + } catch (NumberFormatException e) { + // 解析数字格式异常时的 fallback + return prefix + "1" + suffix; } +} @Override @@ -267,10 +304,52 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { TemplateInstanceDO newTpInstanceDO = BeanUtils.toBean(templateInstanceDO, TemplateInstanceDO.class); newTpInstanceDO.setId(null); newTpInstanceDO.setVer(incrementVersion(templateInstanceDO.getVer())); + newTpInstanceDO.setCreateTime(null); + newTpInstanceDO.setUpdateTime(null); + templateInstanceMapper.insert(newTpInstanceDO); templateInstanceMapper.update(new LambdaUpdateWrapper() .set(TemplateInstanceDO::getSts,TmplStsEnum.STOPPED.getCode()) .eq(TemplateInstanceDO::getId, id)); - return BeanUtils.toBean(newTpInstanceDO, TemplateInstanceRespVO.class); + List templateInstanceDataDOS = new ArrayList<>(); + List templateInstanceItemDOS =new ArrayList<>(); + List newDepartmentInstanceRelativityDOS = new ArrayList<>(); + //设置部门 + List departmentInstanceRelativityDOS = departmentInstanceRelativityMapper + .selectList(new LambdaQueryWrapper() + .eq(DepartmentInstanceRelativityDO::getTemplateInstanceId, id)); + departmentInstanceRelativityDOS.forEach(departmentInstanceRelativityDO -> { + DepartmentInstanceRelativityDO newDepartmentInstanceRelativityDO = new DepartmentInstanceRelativityDO(); + newDepartmentInstanceRelativityDO.setTemplateInstanceId(String.valueOf(newTpInstanceDO.getId())); + newDepartmentInstanceRelativityDO.setCompanyDepartmentId(departmentInstanceRelativityDO.getCompanyDepartmentId()); + newDepartmentInstanceRelativityDOS.add(newDepartmentInstanceRelativityDO); + }); + //设置条款 + templateInstanceItemMapper.selectList(new LambdaQueryWrapper() + .eq(TemplateInstanceItemDO::getInscId, id)).forEach(templateInstanceItemDO -> { + TemplateInstanceItemDO newTemplateInstanceItemDO = new TemplateInstanceItemDO(); + newTemplateInstanceItemDO.setInscId(String.valueOf(newTpInstanceDO.getId())); + newTemplateInstanceItemDO.setItmId(templateInstanceItemDO.getItmId()); + newTemplateInstanceItemDO.setVal(templateInstanceItemDO.getVal()); + templateInstanceItemDOS.add(newTemplateInstanceItemDO); + }); + //设置实例字段 + templateInstanceDataMapper.selectList(new LambdaQueryWrapper() + .eq(TemplateInstanceDataDO::getInscId, id)).forEach(templateInstanceDataDO -> { + TemplateInstanceDataDO newTemplateInstanceDataDO = new TemplateInstanceDataDO(); + newTemplateInstanceDataDO.setInscId(String.valueOf(newTpInstanceDO.getId())); + newTemplateInstanceDataDO.setFldKy(templateInstanceDataDO.getFldKy()); + newTemplateInstanceDataDO.setFldVal(templateInstanceDataDO.getFldVal()); + templateInstanceDataDOS.add(newTemplateInstanceDataDO); + }); + templateInstanceDataMapper.insertBatch(templateInstanceDataDOS); + log.info("==================实例字段插入成功,共插入【{}】条记录==================", templateInstanceDataDOS.size()); + templateInstanceItemMapper.insertBatch(templateInstanceItemDOS); + log.info("==================条款插入成功,共插入【{}】条记录==================", templateInstanceItemDOS.size()); + departmentInstanceRelativityMapper.insertBatch(newDepartmentInstanceRelativityDOS); + log.info("==================部门实例关系插入成功,共插入【{}】条记录==================", newDepartmentInstanceRelativityDOS.size()); + TemplateInstanceRespVO templateInstanceRespVO = BeanUtils.toBean(newTpInstanceDO, TemplateInstanceRespVO.class); + getDetailedInfo(templateInstanceRespVO); + return templateInstanceRespVO; } @Override @@ -279,12 +358,26 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { return Map.of("version", templateInstanceMapper.selectById(id).getVer()); } + @Override + public List listByCdg(String cdg) { + List templateInstanceDOS = templateInstanceMapper.selectList( + new LambdaQueryWrapper() + .eq(TemplateInstanceDO::getCdg, cdg) + .eq(TemplateInstanceDO::getCompanyId, CompanyContextHolder.getCompanyId()) + .orderByDesc(TemplateInstanceDO::getPublishTime) + .orderByDesc(TemplateInstanceDO::getCreateTime) + ); + List templateInstanceRespVOS = BeanUtils.toBean(templateInstanceDOS, TemplateInstanceRespVO.class); + templateInstanceRespVOS.forEach(this::getDetailedInfo); + return templateInstanceRespVOS; + } + @Override public void getDetailedInfo(TemplateInstanceRespVO templateInstanceRespVO) { - templateInstanceRespVO.setDeptIds(getDeptByInstanId(templateInstanceRespVO.getId())); - templateInstanceRespVO.setInstanceItemRespVOS(setInstanceItemRespVOS(templateInstanceRespVO.getId())); - templateInstanceRespVO.setTemplateInstanceDataRespVOS(setTemplateInstanceDataRespVOS(templateInstanceRespVO.getId())); + templateInstanceRespVO.setDeptIds(getDeptByInstanId(templateInstanceRespVO.getId())); // 部门 + templateInstanceRespVO.setInstanceItemRespVOS(setInstanceItemRespVOS(templateInstanceRespVO.getId())); // 条款 + templateInstanceRespVO.setTemplateInstanceDataRespVOS(setTemplateInstanceDataRespVOS(templateInstanceRespVO.getId())); // 实例字段 } // 实例条款值 @@ -292,7 +385,21 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { List templateInstanceItemDOS = templateInstanceItemMapper.selectList(new LambdaQueryWrapper() .eq(TemplateInstanceItemDO::getInscId, id) .eq(TemplateInstanceItemDO::getCompanyId, CompanyContextHolder.getCompanyId())); - return BeanUtils.toBean(templateInstanceItemDOS, TemplateInstanceItemRespVO.class); + List templateInstanceItemRespVOS = BeanUtils.toBean(templateInstanceItemDOS, TemplateInstanceItemRespVO.class); + TmplItmMapper tmplItmMapper = SpringUtil.getBean(TmplItmMapper.class); + List ids = templateInstanceItemRespVOS.stream().map(TemplateInstanceItemRespVO::getItmId).toList(); + if (ids.isEmpty()){ + return templateInstanceItemRespVOS; + } + List tmplItmDOS = tmplItmMapper.selectByIds(ids); + tmplItmDOS.forEach(tmplItmDO -> { + templateInstanceItemRespVOS.forEach(templateInstanceItemRespVO -> { + if (templateInstanceItemRespVO.getItmId().equals(tmplItmDO.getId())) { + templateInstanceItemRespVO.setItmName(tmplItmDO.getItmName()); + } + }); + }); + return templateInstanceItemRespVOS ; } // 实例数据 @@ -339,4 +446,7 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { throw exception(STATUS_OPERATION_FAIL); } } + private String getCdg(){ + return "TP" + DateUtils.format(new Date(), "yyyyMMddHHmmssSSS") + RandomUtil.randomNumbers(4); + } }