Merge remote-tracking branch 'ztcloud/test' into dev

This commit is contained in:
yangchaojin
2026-01-28 19:00:36 +08:00
43 changed files with 1524 additions and 89 deletions

View File

@@ -13,6 +13,10 @@ public interface ErrorCodeConstants {
// ========== 合同 补充编号 ==========
ErrorCode DEMO_CONTRACT_NOT_EXISTS = new ErrorCode(2_100_000_000, "合同不存在");
ErrorCode DEMO_CONTRACT_FILE_URL_NOT_EXISTS = new ErrorCode(2_100_000_001, "合同缺少文件地址,无法发起用印");
ErrorCode DEMO_CONTRACT_IWORK_CREATE_FAILED = new ErrorCode(2_100_000_002, "iWork 用印发起失败:{}");
ErrorCode DEMO_CONTRACT_IWORK_VOID_FAILED = new ErrorCode(2_100_000_003, "iWork 用印作废失败:{}");
// ========== 虚拟化表格 1_100_000_001 ==========
ErrorCode DEMO_VIRTUALIZED_TABLE_NOT_EXISTS = new ErrorCode(1_100_000_001, "虚拟化表格不存在");

View File

@@ -16,12 +16,13 @@ import com.zt.plat.module.bpm.api.task.BpmTaskApi;
import com.zt.plat.module.bpm.api.task.dto.BpmApprovalDetailReqDTO;
import com.zt.plat.module.infra.api.businessfile.BusinessFileApi;
import com.zt.plat.module.infra.api.file.FileApi;
import com.zt.plat.module.infra.api.file.dto.FileRespDTO;
import com.zt.plat.module.system.api.dept.DeptApi;
import com.zt.plat.module.template.controller.admin.contract.vo.DemoContractPageReqVO;
import com.zt.plat.module.template.controller.admin.contract.vo.DemoContractRespVO;
import com.zt.plat.module.template.controller.admin.contract.vo.DemoContractSaveReqVO;
import com.zt.plat.module.system.api.iwork.dto.IWorkOperationRespDTO;
import com.zt.plat.module.system.api.permission.PermissionApi;
import com.zt.plat.module.system.api.user.AdminUserApi;
import com.zt.plat.module.template.controller.admin.contract.vo.*;
import com.zt.plat.module.template.dal.dataobject.contract.DemoContractDO;
import com.zt.plat.module.template.service.contract.DemoContractIWorkService;
import com.zt.plat.module.template.service.contract.DemoContractService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -67,6 +68,14 @@ public class DemoContractController extends AbstractFileUploadController impleme
private BpmProcessInstanceApi bpmInsApi;
@Resource
private FileApi fileApi;
@Resource
private AdminUserApi adminUserApi;
@Resource
private PermissionApi permissionApi;
@Resource
private DemoContractIWorkService demoContractIWorkService;
@PostMapping("/create")
@Operation(summary = "创建合同")
@@ -75,6 +84,13 @@ public class DemoContractController extends AbstractFileUploadController impleme
return success(demoContractService.createDemoContract(createReqVO));
}
@PostMapping("/iwork/create")
@Operation(summary = "发起合同 iWork 用印")
@PreAuthorize("@ss.hasPermission('template:demo-contract:create')")
public CommonResult<IWorkOperationRespDTO> createIWorkWorkflow(@Valid @RequestBody DemoContractIWorkCreateReqVO reqVO) {
return success(demoContractIWorkService.createWorkflow(reqVO));
}
@PutMapping("/update")
@Operation(summary = "更新合同")
@PreAuthorize("@ss.hasPermission('template:demo-contract:update')")
@@ -92,6 +108,13 @@ public class DemoContractController extends AbstractFileUploadController impleme
return success(true);
}
@PostMapping("/iwork/void")
@Operation(summary = "作废合同 iWork 用印")
@PreAuthorize("@ss.hasPermission('template:demo-contract:update')")
public CommonResult<IWorkOperationRespDTO> voidIWorkWorkflow(@Valid @RequestBody DemoContractIWorkVoidReqVO reqVO) {
return success(demoContractIWorkService.voidWorkflow(reqVO));
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除合同")
@@ -104,7 +127,6 @@ public class DemoContractController extends AbstractFileUploadController impleme
@GetMapping("/get")
@Operation(summary = "获得合同")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('template:demo-contract:query')")
public CommonResult<DemoContractRespVO> getDemoContract(@RequestParam("id") Long id) {
DemoContractDO demoContract = demoContractService.getDemoContract(id);
return success(BeanUtils.toBean(demoContract, DemoContractRespVO.class));
@@ -112,7 +134,6 @@ public class DemoContractController extends AbstractFileUploadController impleme
@GetMapping("/page")
@Operation(summary = "获得合同分页")
@PreAuthorize("@ss.hasPermission('template:demo-contract:query')")
public CommonResult<PageResult<DemoContractRespVO>> getDemoContractPage(@Valid DemoContractPageReqVO pageReqVO) {
CommonResult<FileRespDTO> file = fileApi.getFile(1968928810422521857L);

View File

@@ -0,0 +1,59 @@
package com.zt.plat.module.template.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 发起合同 iWork 用印请求 VO
*/
@Data
public class DemoContractIWorkCreateReqVO {
@Schema(description = "合同 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10086")
@NotNull(message = "合同 ID 不能为空")
private Long contractId;
@Schema(description = "用印申请人iWork 人员 ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "用印申请人不能为空")
private String jbr;
@Schema(description = "用印部门 ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "用印部门不能为空")
private String yybm;
@Schema(description = "用印单位(分部 ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "用印单位不能为空")
private String fb;
@Schema(description = "申请时间,格式 yyyy-MM-dd", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "申请时间不能为空")
private String sqsj;
@Schema(description = "用印去向")
private String yyqx;
@Schema(description = "用印依据附件 URL")
private String yyfkUrl;
@Schema(description = "用印事由或内容摘要", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "用印事由不能为空")
private String yysy;
@Schema(description = "用印事项", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "用印事项不能为空")
private String yysx;
@Schema(description = "业务系统单据编号(用于派生流程标题)")
private String ywxtdjbh;
@Schema(description = "配置的 iWork 凭证 appId为空时使用默认凭证")
private String appId;
@Schema(description = "iWork 操作人用户编号")
private String operatorUserId;
@Schema(description = "是否强制刷新 token")
private Boolean forceRefreshToken;
}

View File

@@ -0,0 +1,36 @@
package com.zt.plat.module.template.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.Map;
/**
* 作废 / 干预 iWork 用印流程请求 VO
*/
@Data
public class DemoContractIWorkVoidReqVO {
@Schema(description = "流程请求编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "流程请求编号不能为空")
private String requestId;
@Schema(description = "作废原因")
private String reason;
@Schema(description = "额外参数")
private Map<String, Object> extraParams;
@Schema(description = "额外 Form 数据")
private Map<String, String> formExtras;
@Schema(description = "配置的 iWork 凭证 appId为空时使用默认凭证")
private String appId;
@Schema(description = "iWork 操作人用户编号")
private String operatorUserId;
@Schema(description = "是否强制刷新 token")
private Boolean forceRefreshToken;
}

View File

@@ -6,12 +6,17 @@ import com.zt.plat.module.infra.api.config.ConfigApi;
import com.zt.plat.module.infra.api.file.FileApi;
import com.zt.plat.module.infra.api.websocket.WebSocketSenderApi;
import com.zt.plat.module.system.api.dept.DeptApi;
import com.zt.plat.module.system.api.iwork.IWorkIntegrationApi;
import com.zt.plat.module.system.api.permission.PermissionApi;
import com.zt.plat.module.system.api.sequence.SequenceApi;
import com.zt.plat.module.system.api.sms.SmsSendApi;
import com.zt.plat.module.system.api.user.AdminUserApi;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
@Configuration(value = "templateRpcConfiguration", proxyBeanMethods = false)
@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, ConfigApi.class, DeptApi.class, SequenceApi.class, BpmTaskApi.class, BpmProcessInstanceApi.class, SmsSendApi.class})
@EnableFeignClients(clients = {AdminUserApi.class, FileApi.class, WebSocketSenderApi.class,
ConfigApi.class, DeptApi.class, SequenceApi.class, BpmTaskApi.class, BpmProcessInstanceApi.class,
SmsSendApi.class, PermissionApi.class, IWorkIntegrationApi.class})
public class RpcConfiguration {
}

View File

@@ -0,0 +1,21 @@
package com.zt.plat.module.template.service.contract;
import com.zt.plat.module.system.api.iwork.dto.IWorkOperationRespDTO;
import com.zt.plat.module.template.controller.admin.contract.vo.DemoContractIWorkCreateReqVO;
import com.zt.plat.module.template.controller.admin.contract.vo.DemoContractIWorkVoidReqVO;
/**
* 合同 iWork 集成 Service
*/
public interface DemoContractIWorkService {
/**
* 发起 iWork 用印流程
*/
IWorkOperationRespDTO createWorkflow(DemoContractIWorkCreateReqVO reqVO);
/**
* 作废 / 干预 iWork 用印流程
*/
IWorkOperationRespDTO voidWorkflow(DemoContractIWorkVoidReqVO reqVO);
}

View File

@@ -0,0 +1,91 @@
package com.zt.plat.module.template.service.contract;
import cn.hutool.core.util.StrUtil;
import com.zt.plat.framework.common.exception.util.ServiceExceptionUtil;
import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.module.system.api.iwork.IWorkIntegrationApi;
import com.zt.plat.module.system.api.iwork.dto.IWorkOperationRespDTO;
import com.zt.plat.module.system.api.iwork.dto.IWorkWorkflowCreateReqDTO;
import com.zt.plat.module.system.api.iwork.dto.IWorkWorkflowVoidReqDTO;
import com.zt.plat.module.template.controller.admin.contract.vo.DemoContractIWorkCreateReqVO;
import com.zt.plat.module.template.controller.admin.contract.vo.DemoContractIWorkVoidReqVO;
import com.zt.plat.module.template.dal.dataobject.contract.DemoContractDO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.module.template.enums.ErrorCodeConstants.*;
/**
* 合同 iWork 集成 Service 实现
*/
@Slf4j
@Service
@Validated
public class DemoContractIWorkServiceImpl implements DemoContractIWorkService {
private static final String BIZ_CALLBACK_KEY = "demo-contract-seal";
@Resource
private DemoContractService demoContractService;
@Resource
private IWorkIntegrationApi iWorkIntegrationApi;
@Override
public IWorkOperationRespDTO createWorkflow(DemoContractIWorkCreateReqVO reqVO) {
DemoContractDO contract = demoContractService.getDemoContract(reqVO.getContractId());
if (contract == null) {
throw exception(DEMO_CONTRACT_NOT_EXISTS);
}
if (StrUtil.isBlank(contract.getFileUrl())) {
throw exception(DEMO_CONTRACT_FILE_URL_NOT_EXISTS);
}
IWorkWorkflowCreateReqDTO reqDTO = BeanUtils.toBean(reqVO, IWorkWorkflowCreateReqDTO.class);
reqDTO.setXyywjUrl(contract.getFileUrl());
reqDTO.setBizCallbackKey(BIZ_CALLBACK_KEY);
if (StrUtil.isBlank(reqDTO.getYwxtdjbh())) {
reqDTO.setYwxtdjbh(contract.getCode());
}
CommonResult<IWorkOperationRespDTO> result = iWorkIntegrationApi.createWorkflow(reqDTO);
IWorkOperationRespDTO data = extractDataOrThrow(result, DEMO_CONTRACT_IWORK_CREATE_FAILED, "发起用印", reqVO.getContractId());
Long requestId = data.getPayload() != null && data.getPayload().getData() != null
? data.getPayload().getData().getRequestId() : null;
log.info("[bizKey={}] 发起 iWork 用印成功contractId={}, requestId={}, message={}",
BIZ_CALLBACK_KEY, reqVO.getContractId(), requestId, data.getMessage());
return data;
}
@Override
public IWorkOperationRespDTO voidWorkflow(DemoContractIWorkVoidReqVO reqVO) {
IWorkWorkflowVoidReqDTO reqDTO = BeanUtils.toBean(reqVO, IWorkWorkflowVoidReqDTO.class);
CommonResult<IWorkOperationRespDTO> result = iWorkIntegrationApi.voidWorkflow(reqDTO);
IWorkOperationRespDTO data = extractDataOrThrow(result, DEMO_CONTRACT_IWORK_VOID_FAILED, "作废用印", null);
Long requestId = data.getPayload() != null && data.getPayload().getData() != null
? data.getPayload().getData().getRequestId() : null;
log.info("[bizKey={}] 作废 iWork 用印成功requestId={}, message={}",
BIZ_CALLBACK_KEY, requestId != null ? requestId : reqVO.getRequestId(), data.getMessage());
return data;
}
private IWorkOperationRespDTO extractDataOrThrow(CommonResult<IWorkOperationRespDTO> result,
com.zt.plat.framework.common.exception.ErrorCode errorCode,
String action,
Long contractId) {
if (result == null) {
log.warn("[bizKey={}] {}失败contractId={},原因=响应为空", BIZ_CALLBACK_KEY, action, contractId);
throw ServiceExceptionUtil.exception(errorCode, "响应为空");
}
if (result.isError() || result.getData() == null) {
log.warn("[bizKey={}] {}失败contractId={}code={}msg={}",
BIZ_CALLBACK_KEY, action, contractId, result.getCode(), result.getMsg());
throw ServiceExceptionUtil.exception(errorCode, result.getMsg());
}
return result.getData();
}
}