From eab56680239fdd662bd7b401e0246c0f6e5aea01 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: Fri, 26 Sep 2025 14:59:38 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=A8=A1=E7=89=88=E7=BC=96=E5=88=B6?= =?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 --- .../module/tmpltp/enums/DeleteStatusEnum.java | 2 +- .../templtp/TemplateInstanceController.java | 10 +- .../OnlyOfficeCallbackServiceImpl.java | 22 ++- .../admin/templtp/vo/DisableEnableReqVO.java | 2 +- .../tmpltp/TemplateInstanceService.java | 4 +- .../tmpltp/TemplateInstanceServiceImpl.java | 128 ++++++++++-------- 6 files changed, 101 insertions(+), 67 deletions(-) diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/tmpltp/enums/DeleteStatusEnum.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/tmpltp/enums/DeleteStatusEnum.java index 9ad986ae..9616b918 100644 --- a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/tmpltp/enums/DeleteStatusEnum.java +++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/tmpltp/enums/DeleteStatusEnum.java @@ -7,7 +7,7 @@ public enum DeleteStatusEnum { STATUS_DRF(TmplStsEnum.DRAFT.getCode(), new HashSet<>() {{add(TmplStsEnum.DRAFT.getCode());}}), STATUS_PUB(TmplStsEnum.PUBLISHED.getCode(), new HashSet<>()), - STATUS_STOP(TmplStsEnum.STOPPED.getCode(), new HashSet<>()); + STATUS_STOP(TmplStsEnum.STOPPED.getCode(), new HashSet<>(){{add(TmplStsEnum.STOPPED.getCode());}}); private final String code; 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 b7bc88c9..f21f064b 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 @@ -59,11 +59,11 @@ public class TemplateInstanceController extends AbstractFileUploadController { private TemplateInstanceService templateInstanceService; //上传文件 - @PostMapping("/save-file") - @Operation(summary = "上传文件", description = "上传文件,传入文件对象和模版实例id") - public CommonResult> uploadFile(@NotEmpty(message = "文件不能为空") @RequestParam("file") MultipartFile file,@RequestParam("id") String id) { - return success(templateInstanceService.saveFile(file,id)); - } +// @PostMapping("/save-file") +// @Operation(summary = "上传文件", description = "上传文件,传入文件对象和模版实例id") +// public CommonResult> uploadFile(@NotEmpty(message = "文件不能为空") @RequestParam("file") MultipartFile file,@RequestParam("id") String id) { +// return success(templateInstanceService.saveFile(file,id)); +// } @PostMapping("/create") @Operation(summary = "创建模板实例") diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java index 1e9b04b3..108553e7 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java @@ -1,11 +1,14 @@ package com.zt.plat.module.base.controller.admin.templtp.onlyoffice.service; +import com.alibaba.fastjson2.JSONObject; import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.module.base.controller.admin.templtp.onlyoffice.pojo.Action; import com.zt.plat.module.base.controller.admin.templtp.onlyoffice.pojo.History; import com.zt.plat.module.base.controller.admin.templtp.onlyoffice.pojo.OnlyOfficeCallback; +import com.zt.plat.module.base.service.tmpltp.TemplateInstanceService; import com.zt.plat.module.infra.api.file.FileApi; import com.zt.plat.module.infra.api.file.dto.FileCreateReqDTO; +import com.zt.plat.module.infra.api.file.dto.FileRespDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -13,6 +16,8 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import static com.zt.plat.module.base.controller.admin.templtp.onlyoffice.util.UrlFileDownloader.downloadFileAsMultipart; @@ -23,6 +28,7 @@ import static com.zt.plat.module.base.controller.admin.templtp.onlyoffice.util.U public class OnlyOfficeCallbackServiceImpl implements OnlyOfficeCallbackService { private final FileApi fileApi; + private final TemplateInstanceService templateInstanceService; @Override public void processCallback(OnlyOfficeCallback callback,String id) { log.info("Received OnlyOffice callback for document: {}", callback.getKey()); @@ -151,7 +157,21 @@ public class OnlyOfficeCallbackServiceImpl implements OnlyOfficeCallbackService fileCreateReqDTO.setDirectory(directory); // 设置文件存储目录 // 7. 调用文件服务创建文件 - CommonResult result = fileApi.createFile(fileCreateReqDTO); + CommonResult result = fileApi.createFileWithReturn(fileCreateReqDTO); + if (result.isSuccess()) { + // 创建文件成功,处理结果 + log.info("文件创建成功,文件ID:{}", result.getData()); + // 创建文件成功,处理结果 + FileRespDTO fileRespDTO = result.getData(); + Map fileInfo = new HashMap<>(); + fileInfo.put("id", fileRespDTO.getId()); + fileInfo.put("name", fileRespDTO.getName()); + fileInfo.put("directory", fileRespDTO.getDirectory()); + templateInstanceService.updateTemplateInstanceFileUrlByInstanceId(id, JSONObject.toJSONString(fileInfo)); + } else { + // 创建文件失败,处理错误 + log.error("文件创建失败,错误信息:{}", result.getMsg()); + } log.info("文件创建结果:{}", result); } catch (IOException e) { throw new RuntimeException(e); diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/DisableEnableReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/DisableEnableReqVO.java index d8de1d57..270cf19f 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/DisableEnableReqVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/vo/DisableEnableReqVO.java @@ -9,7 +9,7 @@ import java.util.List; @Schema(description = "管理后台 - 实例启用与禁用 Request VO") @Data public class DisableEnableReqVO { - @Schema(description = "实例主键(id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @Schema(description = "实例主键(id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "['1','2']") @NotEmpty(message = "实例主键不能为空") private List ids; @Schema(description = "操作类型;操作类型type,type的值启用为enable,禁用为disable", requiredMode = Schema.RequiredMode.REQUIRED, example = "enable") 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 2cd658c5..505c287b 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 @@ -83,6 +83,8 @@ public interface TemplateInstanceService { Map getVersion(String id); List listByCdg(String cdg); +// +// Map saveFile(MultipartFile file, String id); - Map saveFile(MultipartFile file, String id); + boolean updateTemplateInstanceFileUrlByInstanceId(@Valid @NotEmpty(message = "模版实例id不能为空") String id, @Valid @NotEmpty(message = "文件参数不能为空") String params); } 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 8721c16b..307d600d 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 @@ -94,7 +94,7 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { // 更新 TemplateInstanceDO templateInstanceDO = templateInstanceMapper.selectById(updateReqVO.getId()); TemplateInstanceDO updateObj = BeanUtils.toBean(updateReqVO, TemplateInstanceDO.class); - // updateObj.setVer(incrementVersion(templateInstanceDO.getVer())); + // updateObj.setVer(incrementVersion(templateInstanceDO.getVer())); templateInstanceMapper.updateById(updateObj); } @@ -148,7 +148,7 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { } -// private String incrementVersion(String currentVersion) { + // private String incrementVersion(String currentVersion) { // // 处理空值或空字符串 // if (currentVersion == null || currentVersion.trim().isEmpty()) { // return "v1.0"; @@ -205,40 +205,40 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { // String newNumberPart = String.join(".", segments); // return prefix + newNumberPart + suffix; // } -private String incrementVersion(String currentVersion) { - // 处理空值或空字符串 - if (currentVersion == null || currentVersion.trim().isEmpty()) { - return "v1"; + private String incrementVersion(String currentVersion) { + // 处理空值或空字符串 + if (currentVersion == null || currentVersion.trim().isEmpty()) { + return "v1"; + } + + String version = currentVersion.trim(); + // 正则模式:前缀(可选) + 数字部分 + 后缀(可选) + // 数字部分匹配一个或多个数字 + Pattern VERSION_PATTERN = Pattern.compile("^([^0-9]*?)(\\d+)(.*)$"); + Matcher matcher = VERSION_PATTERN.matcher(version); + + if (!matcher.matches()) { + // 没有找到数字部分,返回默认版本 + return version + "1"; + } + + String prefix = matcher.group(1); // 前缀部分(如 "v", "version-" 等) + String numberPart = matcher.group(2); // 数字部分(如 "1", "123") + String suffix = matcher.group(3); // 后缀部分 + + try { + // 将数字部分解析为整数并加1 + int number = Integer.parseInt(numberPart); + number++; + + // 重新组合版本号 + return prefix + number + suffix; + } catch (NumberFormatException e) { + // 解析数字格式异常时的 fallback + return prefix + "1" + suffix; + } } - String version = currentVersion.trim(); - // 正则模式:前缀(可选) + 数字部分 + 后缀(可选) - // 数字部分匹配一个或多个数字 - Pattern VERSION_PATTERN = Pattern.compile("^([^0-9]*?)(\\d+)(.*)$"); - Matcher matcher = VERSION_PATTERN.matcher(version); - - if (!matcher.matches()) { - // 没有找到数字部分,返回默认版本 - return version + "1"; - } - - String prefix = matcher.group(1); // 前缀部分(如 "v", "version-" 等) - String numberPart = matcher.group(2); // 数字部分(如 "1", "123") - String suffix = matcher.group(3); // 后缀部分 - - try { - // 将数字部分解析为整数并加1 - int number = Integer.parseInt(numberPart); - number++; - - // 重新组合版本号 - return prefix + number + suffix; - } catch (NumberFormatException e) { - // 解析数字格式异常时的 fallback - return prefix + "1" + suffix; - } -} - @Override public List getDeptByInstanId(Long instanId) { @@ -270,7 +270,7 @@ private String incrementVersion(String currentVersion) { throw exception(STATUS_OPERATION_FAIL); } }); - + log.info("发布模版实例【{}】", publishReqVOS.stream().map(PublishTemplateInstanceReqVO::getId)); templateInstanceMapper.update(new LambdaUpdateWrapper() .in(TemplateInstanceDO::getId, publishReqVOS.stream() .map(PublishTemplateInstanceReqVO::getId) @@ -286,14 +286,18 @@ private String incrementVersion(String currentVersion) { @Override public void setDisableOrEnable(DisableEnableReqVO reqVO) { validateTemplateInstanceExists(reqVO.getIds().stream().map(Long::valueOf).toList()); - String code; + String code = ""; if (reqVO.getType().equals("disable")) { // 禁用 code = TmplStsEnum.STOPPED.getCode(); - } else { + } else if (reqVO.getType().equals("enable")) { // 启用 code = TmplStsEnum.PUBLISHED.getCode(); } + if (code.isEmpty()) { + throw exception(ILLEGAL_OPERATION_TYPE); + } + log.info("=============================当前操作记录为【{}】操作动作为:【{}】================================", reqVO.getIds(), reqVO.getType()); templateInstanceMapper.update(new LambdaUpdateWrapper() .set(TemplateInstanceDO::getSts, code) .in(TemplateInstanceDO::getId, reqVO.getIds())); @@ -312,15 +316,15 @@ private String incrementVersion(String currentVersion) { newTpInstanceDO.setUpdateTime(null); templateInstanceMapper.insert(newTpInstanceDO); templateInstanceMapper.update(new LambdaUpdateWrapper() - .set(TemplateInstanceDO::getSts,TmplStsEnum.STOPPED.getCode()) + .set(TemplateInstanceDO::getSts, TmplStsEnum.STOPPED.getCode()) .eq(TemplateInstanceDO::getId, id)); List templateInstanceDataDOS = new ArrayList<>(); - List templateInstanceItemDOS =new ArrayList<>(); + List templateInstanceItemDOS = new ArrayList<>(); List newDepartmentInstanceRelativityDOS = new ArrayList<>(); //设置部门 List departmentInstanceRelativityDOS = departmentInstanceRelativityMapper .selectList(new LambdaQueryWrapper() - .eq(DepartmentInstanceRelativityDO::getTemplateInstanceId, id)); + .eq(DepartmentInstanceRelativityDO::getTemplateInstanceId, id)); departmentInstanceRelativityDOS.forEach(departmentInstanceRelativityDO -> { DepartmentInstanceRelativityDO newDepartmentInstanceRelativityDO = new DepartmentInstanceRelativityDO(); newDepartmentInstanceRelativityDO.setTemplateInstanceId(String.valueOf(newTpInstanceDO.getId())); @@ -330,20 +334,20 @@ private String incrementVersion(String currentVersion) { //设置条款 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); + 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); + 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()); @@ -352,6 +356,7 @@ private String incrementVersion(String currentVersion) { departmentInstanceRelativityMapper.insertBatch(newDepartmentInstanceRelativityDOS); log.info("==================部门实例关系插入成功,共插入【{}】条记录==================", newDepartmentInstanceRelativityDOS.size()); TemplateInstanceRespVO templateInstanceRespVO = BeanUtils.toBean(newTpInstanceDO, TemplateInstanceRespVO.class); + log.info("==================模板实例插入成功=================="); getDetailedInfo(templateInstanceRespVO); return templateInstanceRespVO; } @@ -361,7 +366,7 @@ private String incrementVersion(String currentVersion) { validateTemplateInstanceExists(Long.valueOf(id)); String ver = templateInstanceMapper.selectById(id).getVer(); String newVer = incrementVersion(ver); - return Map.of("version",ver,"newVersion",newVer); + return Map.of("version", ver, "newVersion", newVer); } @Override @@ -378,11 +383,7 @@ private String incrementVersion(String currentVersion) { return templateInstanceRespVOS; } - @Override - public Map saveFile(MultipartFile file, String id) { - return Map.of(); - } @Override @@ -392,6 +393,13 @@ private String incrementVersion(String currentVersion) { templateInstanceRespVO.setTemplateInstanceDataRespVOS(setTemplateInstanceDataRespVOS(templateInstanceRespVO.getId())); // 实例字段 } + @Override + public boolean updateTemplateInstanceFileUrlByInstanceId(String id, String params) { + validateTemplateInstanceExists(Long.valueOf(id)); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(TemplateInstanceDO::getId, id).set(TemplateInstanceDO::getCntt, params); + return templateInstanceMapper.update(updateWrapper)>0; + } // 实例条款值 private List setInstanceItemRespVOS(Long id) { List templateInstanceItemDOS = templateInstanceItemMapper.selectList(new LambdaQueryWrapper() @@ -400,7 +408,7 @@ private String incrementVersion(String currentVersion) { List templateInstanceItemRespVOS = BeanUtils.toBean(templateInstanceItemDOS, TemplateInstanceItemRespVO.class); TmplItmMapper tmplItmMapper = SpringUtil.getBean(TmplItmMapper.class); List ids = templateInstanceItemRespVOS.stream().map(TemplateInstanceItemRespVO::getItmId).toList(); - if (ids.isEmpty()){ + if (ids.isEmpty()) { return templateInstanceItemRespVOS; } List tmplItmDOS = tmplItmMapper.selectByIds(ids); @@ -411,7 +419,7 @@ private String incrementVersion(String currentVersion) { } }); }); - return templateInstanceItemRespVOS ; + return templateInstanceItemRespVOS; } // 实例数据 @@ -428,6 +436,9 @@ private String incrementVersion(String currentVersion) { boolean transitionAllowed = false; if (deleteStatusEnum != null) { transitionAllowed = deleteStatusEnum.isTransitionAllowed(TmplStsEnum.DRAFT.getCode()); + if (!transitionAllowed) { + transitionAllowed = deleteStatusEnum.isTransitionAllowed(TmplStsEnum.STOPPED.getCode()); + } } if (!transitionAllowed) { throw exception(STATUS_OPERATION_FAIL); @@ -458,7 +469,8 @@ private String incrementVersion(String currentVersion) { throw exception(STATUS_OPERATION_FAIL); } } - private String getCdg(){ + + private String getCdg() { return "TP" + DateUtils.format(new Date(), "yyyyMMddHHmmssSSS") + RandomUtil.randomNumbers(4); } } From 7507a53c8a11dd97a273eefa8b5a9caadb044c9f 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: Fri, 26 Sep 2025 16:41:11 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=A8=A1=E7=89=88=E7=BC=96=E5=88=B6?= =?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 | 27 +++++-- .../OnlyOfficeCallbackServiceImpl.java | 79 ++++++++++--------- .../templtp/vo/TemplateInstanceRespVO.java | 12 ++- .../rpc/config/RpcConfiguration.java | 2 +- .../tmpltp/TemplateInstanceService.java | 4 +- .../tmpltp/TemplateInstanceServiceImpl.java | 22 ++++-- 6 files changed, 88 insertions(+), 58 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 f21f064b..304ba34a 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 @@ -55,6 +55,7 @@ public class TemplateInstanceController extends AbstractFileUploadController { setFileUploadInfo(annotation); } } + @Resource private TemplateInstanceService templateInstanceService; @@ -105,6 +106,9 @@ public class TemplateInstanceController extends AbstractFileUploadController { public CommonResult getTemplateInstance(@RequestParam("id") Long id) { TemplateInstanceDO templateInstance = templateInstanceService.getTemplateInstance(id); TemplateInstanceRespVO templateInstanceRespVO = BeanUtils.toBean(templateInstance, TemplateInstanceRespVO.class); + if (templateInstance == null) { + return success(templateInstanceRespVO); + } templateInstanceService.getDetailedInfo(templateInstanceRespVO); return success(templateInstanceRespVO); } @@ -116,7 +120,9 @@ public class TemplateInstanceController extends AbstractFileUploadController { PageResult pageResult = templateInstanceService.getTemplateInstancePage(pageReqVO); PageResult templateInstanceRespVOPageResult = BeanUtils.toBean(pageResult, TemplateInstanceRespVO.class); templateInstanceRespVOPageResult.getList().forEach(templateInstanceRespVO -> { - templateInstanceService.getDetailedInfo(templateInstanceRespVO); + if (templateInstanceRespVO != null) { + templateInstanceService.getDetailedInfo(templateInstanceRespVO); + } }); return success(templateInstanceRespVOPageResult); } @@ -150,23 +156,28 @@ public class TemplateInstanceController extends AbstractFileUploadController { public CommonResult> listExcludingDisabled(@Valid TemplateInstancePageReqVO pageReqVO) { PageResult templateInstanceRespVOPageResult = BeanUtils.toBean(templateInstanceService.listExcludingDisabled(pageReqVO), TemplateInstanceRespVO.class); templateInstanceRespVOPageResult.getList().forEach( - templateInstanceRespVO -> - templateInstanceService.getDetailedInfo(templateInstanceRespVO)); + templateInstanceRespVO -> { + if (templateInstanceRespVO != null) { + templateInstanceService.getDetailedInfo(templateInstanceRespVO); + } + } + ); return success(templateInstanceRespVOPageResult); } //停用和启用接口 @PostMapping("/disable-enable") - @Operation(summary = "实例停用和启用接口",description = "实例停用和启用接口") + @Operation(summary = "实例停用和启用接口", description = "实例停用和启用接口") @PreAuthorize("@ss.hasPermission('bse:template-instance:disable-enable')") public CommonResult setDisableOrEnable(@Valid @RequestBody DisableEnableReqVO reqVO) { templateInstanceService.setDisableOrEnable(reqVO); return success(true); } + //根据id获取实例版本号 @GetMapping("/get-version") @Operation(summary = "根据id获取实例版本号") - public CommonResult> getVersion(@Valid @NotEmpty(message = "模版实例id不能为空") @RequestParam("id") String id) { + public CommonResult> getVersion(@Valid @NotEmpty(message = "模版实例id不能为空") @RequestParam("id") String id) { return success(templateInstanceService.getVersion(id)); } @@ -175,13 +186,13 @@ public class TemplateInstanceController extends AbstractFileUploadController { @Operation(summary = "创建版本") @PreAuthorize("@ss.hasPermission('bse:template-instance:create-version')") public CommonResult createVersion(@Valid @NotEmpty(message = "模版实例id不能为空") String id) { - return success(templateInstanceService.createVersion(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) { + @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/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java index 108553e7..a774c757 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/service/OnlyOfficeCallbackServiceImpl.java @@ -9,6 +9,7 @@ import com.zt.plat.module.base.service.tmpltp.TemplateInstanceService; import com.zt.plat.module.infra.api.file.FileApi; import com.zt.plat.module.infra.api.file.dto.FileCreateReqDTO; import com.zt.plat.module.infra.api.file.dto.FileRespDTO; +import com.zt.plat.module.system.api.dept.DeptApi; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,56 +27,56 @@ import static com.zt.plat.module.base.controller.admin.templtp.onlyoffice.util.U @RequiredArgsConstructor @Slf4j public class OnlyOfficeCallbackServiceImpl implements OnlyOfficeCallbackService { - private final FileApi fileApi; private final TemplateInstanceService templateInstanceService; + @Override - public void processCallback(OnlyOfficeCallback callback,String id) { - log.info("Received OnlyOffice callback for document: {}", callback.getKey()); - log.info("Callback status: {}", callback.getStatus()); + public void processCallback(OnlyOfficeCallback callback, String id) { + log.info("收到OnlyOffice文档回调: {}", callback.getKey()); + log.info("回调状态: {}", callback.getStatus()); // 根据不同的状态处理回调 switch (callback.getStatus()) { case 1: - handleEditingStatus(callback,id); + handleEditingStatus(callback, id); break; case 2: - handleDocumentSaved(callback,id); + handleDocumentSaved(callback, id); break; case 3: - handleSaveError(callback,id); + handleSaveError(callback, id); break; case 4: - handleDocumentClosedWithoutChanges(callback,id); + handleDocumentClosedWithoutChanges(callback, id); break; case 6: - handleForcedSave(callback,id); + handleForcedSave(callback, id); break; case 7: - handleForcedSaveError(callback,id); + handleForcedSaveError(callback, id); break; default: - log.warn("Received unknown callback status: {}", callback.getStatus()); + log.warn("收到未知的回调状态: {}", callback.getStatus()); } } /** * 处理文档正在编辑的状态 */ - private void handleEditingStatus(OnlyOfficeCallback callback,String id) { - log.info("Document {} is being edited by users: {}", + private void handleEditingStatus(OnlyOfficeCallback callback, String id) { + log.info("文档 {} 正在被以下用户编辑: {}", callback.getKey(), callback.getUsers()); // 处理用户操作(连接或断开连接) if (callback.getActions() != null) { for (Action action : callback.getActions()) { String actionType = switch (action.getType()) { - case 0 -> "disconnected from"; - case 1 -> "connected to"; - case 2 -> "clicked force save in"; - default -> "performed unknown action in"; + case 0 -> "断开了与"; + case 1 -> "连接到"; + case 2 -> "在中点击了强制保存"; + default -> "在中执行了未知操作"; }; - log.info("User {} {}", action.getUserId(), actionType); + log.info("用户 {} {}", action.getUserId(), actionType); } } } @@ -83,59 +84,59 @@ public class OnlyOfficeCallbackServiceImpl implements OnlyOfficeCallbackService /** * 处理文档已保存的状态 */ - private void handleDocumentSaved(OnlyOfficeCallback callback,String id) { - log.info("Document {} is ready to be saved", callback.getKey()); - saveDocument(callback,id); + private void handleDocumentSaved(OnlyOfficeCallback callback, String id) { + log.info("文档 {} 已准备好保存", callback.getKey()); + saveDocument(callback, id); // 处理历史记录 - // handleHistoryChanges(callback,id); + // handleHistoryChanges(callback,id); } /** * 处理保存错误的状态 */ - private void handleSaveError(OnlyOfficeCallback callback,String id) { - log.error("Error saving document {}", callback.getKey()); + private void handleSaveError(OnlyOfficeCallback callback, String id) { + log.error("保存文档 {} 时出错", callback.getKey()); // 可以在这里添加错误处理逻辑,如发送通知等 } /** * 处理文档关闭且无更改的状态 */ - private void handleDocumentClosedWithoutChanges(OnlyOfficeCallback callback,String id) { - log.info("Document {} closed without changes", callback.getKey()); + private void handleDocumentClosedWithoutChanges(OnlyOfficeCallback callback, String id) { + log.info("文档 {} 已关闭,未做任何更改", callback.getKey()); // 可以在这里添加清理资源等逻辑 } /** * 处理强制保存的状态 */ - private void handleForcedSave(OnlyOfficeCallback callback,String id) { - log.info("Document {} forced save. Type: {}", + private void handleForcedSave(OnlyOfficeCallback callback, String id) { + log.info("文档 {} 执行强制保存。类型: {}", callback.getKey(), callback.getForceSaveType()); - saveDocument(callback,id); + saveDocument(callback, id); // 处理历史记录 - handleHistoryChanges(callback,id); + handleHistoryChanges(callback, id); // 如果是表单提交,处理表单数据 if (callback.getForceSaveType() == 3 && callback.getFormsDataUrl() != null) { - handleFormSubmission(callback,id); + handleFormSubmission(callback, id); } } /** * 处理强制保存错误的状态 */ - private void handleForcedSaveError(OnlyOfficeCallback callback,String id) { - log.error("Error during forced save of document {}", callback.getKey()); + private void handleForcedSaveError(OnlyOfficeCallback callback, String id) { + log.error("文档 {} 强制保存时出错", callback.getKey()); // 可以在这里添加错误处理逻辑 } /** * 保存文档到存储 */ - private void saveDocument(OnlyOfficeCallback callback,String id) { + private void saveDocument(OnlyOfficeCallback callback, String id) { if (callback.getUrl() == null) { log.error("文件路径为空"); return; @@ -182,17 +183,17 @@ public class OnlyOfficeCallbackServiceImpl implements OnlyOfficeCallbackService /** * 处理文档历史记录变更 */ - private void handleHistoryChanges(OnlyOfficeCallback callback,String id) { + private void handleHistoryChanges(OnlyOfficeCallback callback, String id) { History history = callback.getHistory(); if (history != null) { - log.info("Processing document history changes for {}", callback.getKey()); + log.info("正在处理文档 {} 的历史记录变更", callback.getKey()); // 这里可以实现处理历史记录的逻辑 // 例如:调用refreshHistory方法更新历史记录 } // 处理变更历史URL if (callback.getChangesUrl() != null) { - log.info("Changes URL for document {}: {}", callback.getKey(), callback.getChangesUrl()); + log.info("文档 {} 的变更历史URL: {}", callback.getKey(), callback.getChangesUrl()); // 这里可以实现保存变更历史的逻辑 // 例如:下载变更历史并使用setHistoryData方法存储 } @@ -201,8 +202,8 @@ public class OnlyOfficeCallbackServiceImpl implements OnlyOfficeCallbackService /** * 处理表单提交数据 */ - private void handleFormSubmission(OnlyOfficeCallback callback,String id) { - log.info("Processing form submission for document {}", callback.getKey()); + private void handleFormSubmission(OnlyOfficeCallback callback, String id) { + log.info("正在处理文档 {} 的表单提交", callback.getKey()); // 这里可以实现处理表单数据的逻辑 // 例如:从formsDataUrl下载并解析表单数据 } 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 9cc4a281..324aa389 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 @@ -1,5 +1,7 @@ package com.zt.plat.module.base.controller.admin.templtp.vo; +import com.zt.plat.module.system.api.dept.dto.DeptDetailRespDTO; +import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -59,12 +61,18 @@ public class TemplateInstanceRespVO { @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 = "") private List templateInstanceDataRespVOS; @Schema(description = "实例条款;这个是实例条款绑定的条款;", requiredMode = Schema.RequiredMode.REQUIRED, example = "") private List instanceItemRespVOS; + + @Schema(description = "使用部门编", requiredMode = Schema.RequiredMode.REQUIRED, example = "") + private List DeptRespVOS; + + @Schema(description = "模版分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试分类名称") + @ExcelProperty("模版分类名称") + private String tpName; + } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/framework/rpc/config/RpcConfiguration.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/framework/rpc/config/RpcConfiguration.java index 3e2e4540..df460869 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/framework/rpc/config/RpcConfiguration.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/framework/rpc/config/RpcConfiguration.java @@ -6,6 +6,6 @@ import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Configuration; @Configuration(value = "baseRpcConfiguration", proxyBeanMethods = false) -@EnableFeignClients(clients = {DeptApi.class, FileApi.class}) +@EnableFeignClients(clients = {DeptApi.class, FileApi.class,DeptApi.class}) public class RpcConfiguration { } 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 505c287b..10586bcd 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 @@ -7,9 +7,7 @@ import com.zt.plat.module.base.dal.dataobject.tmpltp.TemplateInstanceDO; import jakarta.validation.*; import com.zt.plat.framework.common.pojo.PageResult; -import com.zt.plat.framework.common.pojo.PageParam; import jakarta.validation.constraints.NotEmpty; -import org.springframework.web.multipart.MultipartFile; /** * 模板实例 Service 接口 @@ -86,5 +84,5 @@ public interface TemplateInstanceService { // // Map saveFile(MultipartFile file, String id); - boolean updateTemplateInstanceFileUrlByInstanceId(@Valid @NotEmpty(message = "模版实例id不能为空") String id, @Valid @NotEmpty(message = "文件参数不能为空") String params); + void updateTemplateInstanceFileUrlByInstanceId(@Valid @NotEmpty(message = "模版实例id不能为空") String id, @Valid @NotEmpty(message = "文件参数不能为空") String params); } 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 307d600d..9209ddc3 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 @@ -13,7 +13,8 @@ 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.*; -import com.zt.plat.module.infra.api.file.FileApi; +import com.zt.plat.module.system.api.dept.DeptApi; +import com.zt.plat.module.system.api.dept.dto.DeptRespDTO; import com.zt.plat.module.tmpltp.enums.DeleteStatusEnum; import com.zt.plat.module.tmpltp.enums.PublishStatusEnum; import com.zt.plat.module.tmpltp.enums.TmplStsEnum; @@ -23,7 +24,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import org.springframework.web.multipart.MultipartFile; import java.time.LocalDateTime; import java.util.*; @@ -45,7 +45,7 @@ import static com.zt.plat.module.tmpltp.enums.ErrorCodeConstants.*; @Validated public class TemplateInstanceServiceImpl implements TemplateInstanceService { @Resource - private FileApi fileApi; + private DeptApi deptApi; @Resource private TemplateInstanceMapper templateInstanceMapper; @Resource @@ -55,6 +55,9 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { @Resource private TemplateInstanceItemMapper templateInstanceItemMapper; + @Resource + private TmplTpService tmplTpService; + private static final Pattern VERSION_PATTERN = Pattern.compile("^(.*?)([0-9]+(?:\\.[0-9]+)*)(.*)$"); @Override @@ -312,6 +315,7 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { newTpInstanceDO.setId(null); newTpInstanceDO.setVer(incrementVersion(templateInstanceDO.getVer())); newTpInstanceDO.setPublishTime(LocalDateTime.now()); + newTpInstanceDO.setOrigCntt(templateInstanceDO.getCntt()); newTpInstanceDO.setCreateTime(null); newTpInstanceDO.setUpdateTime(null); templateInstanceMapper.insert(newTpInstanceDO); @@ -391,14 +395,22 @@ public class TemplateInstanceServiceImpl implements TemplateInstanceService { templateInstanceRespVO.setDeptIds(getDeptByInstanId(templateInstanceRespVO.getId())); // 部门 templateInstanceRespVO.setInstanceItemRespVOS(setInstanceItemRespVOS(templateInstanceRespVO.getId())); // 条款 templateInstanceRespVO.setTemplateInstanceDataRespVOS(setTemplateInstanceDataRespVOS(templateInstanceRespVO.getId())); // 实例字段 + if (!templateInstanceRespVO.getDeptIds().isEmpty()){ + templateInstanceRespVO.setDeptRespVOS(deptApi.getDeptList(templateInstanceRespVO.getDeptIds().stream().map(Long::valueOf).toList()).getData()); // 部门详情 + } + TmplTpDO tmplTp = tmplTpService.getTmplTp(templateInstanceRespVO.getTpId()); + if (tmplTp != null){ + templateInstanceRespVO.setTpName(!tmplTp.getName().isEmpty()?tmplTp.getName():"分类未命名"); + } + } @Override - public boolean updateTemplateInstanceFileUrlByInstanceId(String id, String params) { + public void updateTemplateInstanceFileUrlByInstanceId(String id, String params) { validateTemplateInstanceExists(Long.valueOf(id)); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(TemplateInstanceDO::getId, id).set(TemplateInstanceDO::getCntt, params); - return templateInstanceMapper.update(updateWrapper)>0; + templateInstanceMapper.update(updateWrapper); } // 实例条款值 private List setInstanceItemRespVOS(Long id) { From abf9607c43a441f696732511173ef973775a944a 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: Fri, 26 Sep 2025 16:43:34 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=A8=A1=E7=89=88=E7=BC=96=E5=88=B6?= =?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 --- .../admin/templtp/onlyoffice/util/UrlFileDownloader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/util/UrlFileDownloader.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/util/UrlFileDownloader.java index 50fba301..9339c09d 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/util/UrlFileDownloader.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/templtp/onlyoffice/util/UrlFileDownloader.java @@ -79,7 +79,7 @@ public class UrlFileDownloader { } /** - * 从URL和响应头中提取文件名 + * 从URL和响应头中提取文件名。 */ private static String getFileNameFromUrl(String fileUrl, URLConnection connection) { // 优先从响应头的Content-Disposition获取(如:attachment;filename="test.pdf")