模版编制相关实现

This commit is contained in:
潘荣晟
2025-09-26 14:59:38 +08:00
parent b373f9c308
commit eab5668023
6 changed files with 101 additions and 67 deletions

View File

@@ -59,11 +59,11 @@ public class TemplateInstanceController extends AbstractFileUploadController {
private TemplateInstanceService templateInstanceService;
//上传文件
@PostMapping("/save-file")
@Operation(summary = "上传文件", description = "上传文件,传入文件对象和模版实例id")
public CommonResult<Map<String, Object>> 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<Map<String, Object>> uploadFile(@NotEmpty(message = "文件不能为空") @RequestParam("file") MultipartFile file,@RequestParam("id") String id) {
// return success(templateInstanceService.saveFile(file,id));
// }
@PostMapping("/create")
@Operation(summary = "创建模板实例")

View File

@@ -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<String> result = fileApi.createFile(fileCreateReqDTO);
CommonResult<FileRespDTO> result = fileApi.createFileWithReturn(fileCreateReqDTO);
if (result.isSuccess()) {
// 创建文件成功,处理结果
log.info("文件创建成功文件ID{}", result.getData());
// 创建文件成功,处理结果
FileRespDTO fileRespDTO = result.getData();
Map<String, Object> 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);

View File

@@ -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<String> ids;
@Schema(description = "操作类型;操作类型type,type的值启用为enable禁用为disable", requiredMode = Schema.RequiredMode.REQUIRED, example = "enable")

View File

@@ -83,6 +83,8 @@ public interface TemplateInstanceService {
Map<String, Object> getVersion(String id);
List<TemplateInstanceRespVO> listByCdg(String cdg);
//
// Map<String, Object> saveFile(MultipartFile file, String id);
Map<String, Object> saveFile(MultipartFile file, String id);
boolean updateTemplateInstanceFileUrlByInstanceId(@Valid @NotEmpty(message = "模版实例id不能为空") String id, @Valid @NotEmpty(message = "文件参数不能为空") String params);
}

View File

@@ -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<String> 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<TemplateInstanceDO>()
.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<TemplateInstanceDO>()
.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<TemplateInstanceDO>()
.set(TemplateInstanceDO::getSts,TmplStsEnum.STOPPED.getCode())
.set(TemplateInstanceDO::getSts, TmplStsEnum.STOPPED.getCode())
.eq(TemplateInstanceDO::getId, id));
List<TemplateInstanceDataDO> templateInstanceDataDOS = new ArrayList<>();
List<TemplateInstanceItemDO> templateInstanceItemDOS =new ArrayList<>();
List<TemplateInstanceItemDO> templateInstanceItemDOS = new ArrayList<>();
List<DepartmentInstanceRelativityDO> newDepartmentInstanceRelativityDOS = new ArrayList<>();
//设置部门
List<DepartmentInstanceRelativityDO> departmentInstanceRelativityDOS = departmentInstanceRelativityMapper
.selectList(new LambdaQueryWrapper<DepartmentInstanceRelativityDO>()
.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<TemplateInstanceItemDO>()
.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<TemplateInstanceDataDO>()
.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<String, Object> 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<TemplateInstanceDO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(TemplateInstanceDO::getId, id).set(TemplateInstanceDO::getCntt, params);
return templateInstanceMapper.update(updateWrapper)>0;
}
// 实例条款值
private List<TemplateInstanceItemRespVO> setInstanceItemRespVOS(Long id) {
List<TemplateInstanceItemDO> templateInstanceItemDOS = templateInstanceItemMapper.selectList(new LambdaQueryWrapper<TemplateInstanceItemDO>()
@@ -400,7 +408,7 @@ private String incrementVersion(String currentVersion) {
List<TemplateInstanceItemRespVO> templateInstanceItemRespVOS = BeanUtils.toBean(templateInstanceItemDOS, TemplateInstanceItemRespVO.class);
TmplItmMapper tmplItmMapper = SpringUtil.getBean(TmplItmMapper.class);
List<String> ids = templateInstanceItemRespVOS.stream().map(TemplateInstanceItemRespVO::getItmId).toList();
if (ids.isEmpty()){
if (ids.isEmpty()) {
return templateInstanceItemRespVOS;
}
List<TmplItmDO> 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);
}
}