Merge remote-tracking branch 'origin/feature/REQ-3581' into feature/REQ-3581

This commit is contained in:
yanglin 2025-02-21 18:39:16 +08:00
commit 71afe9366f
4 changed files with 100 additions and 1 deletions

View File

@ -45,6 +45,8 @@ public class VisaRequestStampReq {
@NotNull(message = "操作人 personId 不能为空")
private Long operatorPersonId;
@NotNull(message = "操作人 ouId 不能为空")
private Long operatorOuId;
@Data
@Builder
@NoArgsConstructor

View File

@ -125,6 +125,12 @@ public class ChangeRecord extends BaseEntity<ChangeRecord> {
@TableField(value = "stamp_status")
private VisaStampStatusEnum stampStatus;
/**
* 合同 ID
*/
@TableField(value = "contract_id")
private String contractId;
/**
* 最终审批ID
*/

View File

@ -0,0 +1,35 @@
package cn.axzo.nanopart.visa.server.rpc;
import cn.axzo.nanopart.ess.api.EssApi;
import cn.axzo.nanopart.ess.api.domain.EssOrgAndSealInfo;
import cn.axzo.nanopart.ess.api.request.CreateContractByFileRequest;
import cn.axzo.nanopart.ess.api.request.GetSealsRequest;
import cn.axzo.nanopart.ess.api.response.CreateContractByFileResponse;
import cn.axzo.pokonyan.util.RpcUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 腾讯电子签
*
* @author wangli
* @since 2025-02-21 10:03
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class EssGateway {
private final EssApi essApi;
public CreateContractByFileResponse createContract(CreateContractByFileRequest request) {
return RpcUtil.rpcApiResultProcessor(() -> essApi.createContractByFile(request), "创建电子签合同", request);
}
public List<EssOrgAndSealInfo> getOrgEnabledSeals(GetSealsRequest request) {
return RpcUtil.rpcApiResultProcessor(() -> essApi.getOrgEnabledSeals(request), "查询单位已启用的印章以及授权人员列表", request);
}
}

View File

@ -7,6 +7,10 @@ import cn.axzo.framework.domain.ServiceException;
import cn.axzo.im.center.api.vo.PersonAccountAttribute;
import cn.axzo.im.center.api.vo.req.SendChatMessageRequest;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.nanopart.ess.api.domain.CreateContractByFile;
import cn.axzo.nanopart.ess.api.domain.OperatorInfo;
import cn.axzo.nanopart.ess.api.domain.contract.Approver;
import cn.axzo.nanopart.ess.api.request.CreateContractByFileRequest;
import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum;
import cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum;
@ -25,6 +29,7 @@ import cn.axzo.nanopart.visa.server.domain.ChangeRecordRelation;
import cn.axzo.nanopart.visa.server.dto.VisaLogParam;
import cn.axzo.nanopart.visa.server.dto.VisaRelationDto;
import cn.axzo.nanopart.visa.server.mapper.ChangeRecordRelationDao;
import cn.axzo.nanopart.visa.server.rpc.EssGateway;
import cn.axzo.nanopart.visa.server.rpc.MsgCenterGateway;
import cn.axzo.nanopart.visa.server.rpc.VisaProfileGateway;
import cn.axzo.nanopart.visa.server.rpc.WorkflowGateway;
@ -48,7 +53,14 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -60,6 +72,7 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_OWNER_TIPS;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_PARTICIPATE_TIPS;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_PARTICIPATE_TIPS_OPERATED;
import static cn.axzo.nanopart.visa.api.constant.VisaConstant.MSG_CENTER_APP_CODE;
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PRINT_PDF_FILE;
import static cn.axzo.nanopart.visa.api.enums.VisaRelationFieldEnum.PROCESS_INSTANCE_OF_ESS;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
@ -77,6 +90,7 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
private final VisaProfileGateway visaProfileGateway;
private final MsgCenterGateway msgCenterGateway;
private final WorkflowGateway workflowGateway;
private final EssGateway essGateway;
private final ChangeRecordLogService changeRecordLogService;
/**
@ -205,7 +219,6 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
ChangeRecord record = changeRecordService.getById(req.getVisaId());
AssertUtil.notNull(record, "未找到变洽签记录");
AssertUtil.isTrue(Objects.equals(record.getImGroupId(), req.getImGroupId()), "IM 群信息不匹配");
AssertUtil.isTrue(Objects.equals(record.getStatus(), VisaStatusEnum.DECIDING), "单据未在决策中,已不支持该操作");
if (Boolean.TRUE.equals(req.getClearAll())) {
deleteByVisaId(req.getVisaId(), Lists.newArrayList(VisaRelationFieldEnum.IM_GROUP_PARTICIPATE));
@ -395,6 +408,7 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
ChangeRecord visa = changeRecordService.getById(req.getVisaId());
AssertUtil.notNull(visa, "变洽签单据不存在");
// 用印申请信息
List<ChangeRecordRelation> relations = req.getRequestStamps().stream().map(i -> {
ChangeRecordRelation stamp = new ChangeRecordRelation();
stamp.setVisaId(req.getVisaId());
@ -408,6 +422,7 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
return stamp;
}).collect(Collectors.toList());
// 打印生成的 PDF 文件信息
ChangeRecordRelation relation = new ChangeRecordRelation();
relation.setVisaId(req.getVisaId());
relation.setVarName(PRINT_PDF_FILE.name());
@ -418,6 +433,47 @@ public class ChangeRecordRelationServiceImpl extends ServiceImpl<ChangeRecordRel
relations.add(relation);
saveBatch(relations);
CreateContractByFileRequest createContractRequest = new CreateContractByFileRequest();
CreateContractByFile pdfFile = new CreateContractByFile();
pdfFile.setContractName(visa.getTopic());
try {
pdfFile.setBase64Files(Lists.newArrayList(downloadFileAndConvertToBase64(req.getPdfFile().getFileUrl())));
} catch (Exception e) {
throw new ServiceException("拉取表单 PDF 文件失败");
}
pdfFile.setApprovers(req.getRequestStamps().stream().map(i -> {
Approver approver = new Approver();
approver.setSealTypes(Lists.newArrayList(i.getSealType()));
return approver;
}).collect(Collectors.toList()));
createContractRequest.setByFile(pdfFile);
// TODO
createContractRequest.setAppCode(MSG_CENTER_APP_CODE);
createContractRequest.setBizCode("");
OperatorInfo creator = new OperatorInfo();
creator.setOuId(req.getOperatorOuId());
creator.setPersonId(req.getOperatorPersonId());
createContractRequest.setCreator(creator);
essGateway.createContract(createContractRequest);
}
public static String downloadFileAndConvertToBase64(String fileUrl) throws IOException {
URL url = new URL(fileUrl);
URLConnection connection = url.openConnection();
try (InputStream inputStream = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
byte[] fileBytes = bos.toByteArray();
return Base64.getEncoder().encodeToString(fileBytes);
}
}
private String createEssProcessInstance(VisaRequestStampReq.RequestStampModel model, ChangeRecord visa) {