REQ-3581: 下载合同

This commit is contained in:
yanglin 2025-02-21 13:46:59 +08:00
parent f6a1937025
commit d9f155b9fe
6 changed files with 67 additions and 3 deletions

View File

@ -16,6 +16,7 @@ import cn.axzo.nanopart.ess.api.request.GetSignUrlRequest;
import cn.axzo.nanopart.ess.api.request.RemoveSealAuthorizationRequest; import cn.axzo.nanopart.ess.api.request.RemoveSealAuthorizationRequest;
import cn.axzo.nanopart.ess.api.request.RemoveSealPersonRequest; import cn.axzo.nanopart.ess.api.request.RemoveSealPersonRequest;
import cn.axzo.nanopart.ess.api.request.RevokeContractRequest; import cn.axzo.nanopart.ess.api.request.RevokeContractRequest;
import cn.axzo.nanopart.ess.api.request.SaveContractSnapshotRequest;
import cn.axzo.nanopart.ess.api.response.CreateConsoleLoginUrlResponse; import cn.axzo.nanopart.ess.api.response.CreateConsoleLoginUrlResponse;
import cn.axzo.nanopart.ess.api.response.CreateContractByFileResponse; import cn.axzo.nanopart.ess.api.response.CreateContractByFileResponse;
import cn.axzo.nanopart.ess.api.response.DownloadSingedContractPdfResponse; import cn.axzo.nanopart.ess.api.response.DownloadSingedContractPdfResponse;
@ -115,12 +116,19 @@ public interface EssApi {
@RequestBody @Valid GetSignUrlRequest request); @RequestBody @Valid GetSignUrlRequest request);
/** /**
* 下载合同PDF. 下载链接有效期为5分钟 * 获取合同PDF文件地址. 下载链接有效期为5分钟
*/ */
@PostMapping("api/ess/getContractPDFUrl") @PostMapping("api/ess/getContractPDFUrl")
ApiResult<DownloadSingedContractPdfResponse> getContractPDFUrl( ApiResult<DownloadSingedContractPdfResponse> getContractPDFUrl(
@RequestBody @Valid DownloadSingedContractPdfRequest request); @RequestBody @Valid DownloadSingedContractPdfRequest request);
/**
* 从腾讯电子签下载合同PDF文件
*/
@PostMapping("api/ess/saveContractSnapshot")
ApiResult<Void> saveContractSnapshot(
@RequestBody @Valid SaveContractSnapshotRequest request);
/** /**
* 撤销合同 * 撤销合同
*/ */

View File

@ -0,0 +1,20 @@
package cn.axzo.nanopart.ess.api.request;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author yanglin
*/
@Setter @Getter
public class SaveContractSnapshotRequest {
/**
* 合同id
*/
@NotBlank(message = "essContractId不能为空")
private String essContractId;
}

View File

@ -75,4 +75,12 @@ public class EssContractDao extends ServiceImpl<EssContractMapper, EssContract>
.update(); .update();
} }
public void updateExt(EssContract contract) {
if (contract.getRecordExt() == null)
return;
lambdaUpdate()
.eq(EssContract::getId, contract.getId())
.set(EssContract::getRecordExt, JSON.toJSONString(contract.getRecordExt()))
.update();
}
} }

View File

@ -103,6 +103,12 @@ public class EssContract extends BaseEntity<EssContract> {
@TableField(typeHandler = FastjsonTypeHandler.class) @TableField(typeHandler = FastjsonTypeHandler.class)
private RecordExt recordExt; private RecordExt recordExt;
public RecordExt getOrCreateExt() {
if (recordExt == null)
recordExt = new RecordExt();
return recordExt;
}
public Assignment getOrCreateAssignment() { public Assignment getOrCreateAssignment() {
if (assignment == null) if (assignment == null)
assignment = new Assignment(); assignment = new Assignment();
@ -142,6 +148,10 @@ public class EssContract extends BaseEntity<EssContract> {
return approvers.stream().allMatch(Approver::isSignPersonPresent); return approvers.stream().allMatch(Approver::isSignPersonPresent);
} }
public boolean downloadContract() {
return isFinalState() || getOrCreateExt().isDownloadContract();
}
public boolean isFinalState() { public boolean isFinalState() {
return state.isFinalState(); return state.isFinalState();
} }
@ -158,6 +168,7 @@ public class EssContract extends BaseEntity<EssContract> {
@Setter @Setter
@Getter @Getter
public static class RecordExt { public static class RecordExt {
private boolean downloadContract;
} }
// @formatter:off // @formatter:off

View File

@ -22,7 +22,6 @@ import cn.axzo.nanopart.ess.server.entity.EssSeal;
import cn.axzo.nanopart.ess.server.entity.EssSealPerson; import cn.axzo.nanopart.ess.server.entity.EssSealPerson;
import cn.axzo.nanopart.ess.server.ess.domain.OrgAndPerson; import cn.axzo.nanopart.ess.server.ess.domain.OrgAndPerson;
import cn.axzo.nanopart.ess.server.ess.domain.SealAndPerson; import cn.axzo.nanopart.ess.server.ess.domain.SealAndPerson;
import cn.axzo.nanopart.ess.server.ess.support.EssProps;
import cn.axzo.nanopart.ess.server.ess.support.EssSupport; import cn.axzo.nanopart.ess.server.ess.support.EssSupport;
import cn.axzo.nanopart.ess.server.ess.support.OssService; import cn.axzo.nanopart.ess.server.ess.support.OssService;
import cn.axzo.nanopart.ess.server.utils.BizAssertions; import cn.axzo.nanopart.ess.server.utils.BizAssertions;
@ -32,6 +31,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.function.Function; import java.util.function.Function;
@ -52,10 +52,10 @@ public class EssService {
private final EssSealPersonDao essSealPersonDao; private final EssSealPersonDao essSealPersonDao;
private final EssContractDao essContractDao; private final EssContractDao essContractDao;
private final EssPersonDao essPersonDao; private final EssPersonDao essPersonDao;
private final EssProps essProps;
private final OssService ossService; private final OssService ossService;
private final EssLogDao essLogDao; private final EssLogDao essLogDao;
private final EssSupport essSupport; private final EssSupport essSupport;
private final TransactionTemplate transactionTemplate;
public String createConsoleLoginUrl(CreateConsoleLoginUrlRequest request) { public String createConsoleLoginUrl(CreateConsoleLoginUrlRequest request) {
essLogDao.logRequest("createConsoleLoginUrl", request.getPersonId(), request); essLogDao.logRequest("createConsoleLoginUrl", request.getPersonId(), request);
@ -158,6 +158,16 @@ public class EssService {
return getContractPDFUrlFromEss(contract); return getContractPDFUrlFromEss(contract);
} }
public void saveContractSnapshot(String essContractId) {
EssContract c = transactionTemplate.execute(unused -> {
EssContract contract = essContractDao.getOrThrow(essContractId);
contract.getRecordExt().setDownloadContract(true);
essContractDao.updateExt(contract);
return contract;
});
maybeUploadContractToOss(c);
}
public String getContractPDFUrlFromEss(EssContract contract) { public String getContractPDFUrlFromEss(EssContract contract) {
EssPerson creator = orgManager.getSuperAdminOrThrow(contract.getCreatorOuId()); EssPerson creator = orgManager.getSuperAdminOrThrow(contract.getCreatorOuId());
return essClient.getContractPDFUrl(creator, contract.getEssContractId()); return essClient.getContractPDFUrl(creator, contract.getEssContractId());

View File

@ -19,6 +19,7 @@ import cn.axzo.nanopart.ess.api.request.GetSignUrlRequest;
import cn.axzo.nanopart.ess.api.request.RemoveSealAuthorizationRequest; import cn.axzo.nanopart.ess.api.request.RemoveSealAuthorizationRequest;
import cn.axzo.nanopart.ess.api.request.RemoveSealPersonRequest; import cn.axzo.nanopart.ess.api.request.RemoveSealPersonRequest;
import cn.axzo.nanopart.ess.api.request.RevokeContractRequest; import cn.axzo.nanopart.ess.api.request.RevokeContractRequest;
import cn.axzo.nanopart.ess.api.request.SaveContractSnapshotRequest;
import cn.axzo.nanopart.ess.api.response.CreateConsoleLoginUrlResponse; import cn.axzo.nanopart.ess.api.response.CreateConsoleLoginUrlResponse;
import cn.axzo.nanopart.ess.api.response.CreateContractByFileResponse; import cn.axzo.nanopart.ess.api.response.CreateContractByFileResponse;
import cn.axzo.nanopart.ess.api.response.DownloadSingedContractPdfResponse; import cn.axzo.nanopart.ess.api.response.DownloadSingedContractPdfResponse;
@ -125,6 +126,12 @@ class ApiController implements EssApi {
return ApiResult.ok(response); return ApiResult.ok(response);
} }
@Override
public ApiResult<Void> saveContractSnapshot(SaveContractSnapshotRequest request) {
essService.saveContractSnapshot(request.getEssContractId());
return ApiResult.ok();
}
@Override @Override
public ApiResult<Void> revokeContract(RevokeContractRequest request) { public ApiResult<Void> revokeContract(RevokeContractRequest request) {
contractManager.revokeContract(request); contractManager.revokeContract(request);