diff --git a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/EssApi.java b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/EssApi.java index 9c6aff85..633568f3 100644 --- a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/EssApi.java +++ b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/EssApi.java @@ -1,11 +1,20 @@ package cn.axzo.nanopart.ess.api; +import java.util.List; + +import javax.validation.Valid; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.nanopart.ess.api.domain.EssOrgAndSealInfo; import cn.axzo.nanopart.ess.api.domain.EssSealPersonInfo; import cn.axzo.nanopart.ess.api.request.AddSealAuthorizationRequest; import cn.axzo.nanopart.ess.api.request.AddSealPersonRequest; +import cn.axzo.nanopart.ess.api.request.AssignSignUrlRequest; import cn.axzo.nanopart.ess.api.request.CreateConsoleLoginUrlRequest; import cn.axzo.nanopart.ess.api.request.CreateContractByFileRequest; import cn.axzo.nanopart.ess.api.request.DownloadSingedContractPdfRequest; @@ -15,11 +24,11 @@ import cn.axzo.nanopart.ess.api.request.GetOrgAuthStatesRequest; import cn.axzo.nanopart.ess.api.request.GetPersonAuthStateRequest; import cn.axzo.nanopart.ess.api.request.GetSealPersonRequest; import cn.axzo.nanopart.ess.api.request.GetSealsRequest; -import cn.axzo.nanopart.ess.api.request.GetSignUrlRequest; import cn.axzo.nanopart.ess.api.request.RemoveSealAuthorizationRequest; import cn.axzo.nanopart.ess.api.request.RemoveSealPersonRequest; import cn.axzo.nanopart.ess.api.request.RevokeContractRequest; import cn.axzo.nanopart.ess.api.request.SaveContractSnapshotRequest; +import cn.axzo.nanopart.ess.api.response.AssignSignUrlResponse; import cn.axzo.nanopart.ess.api.response.CreateConsoleLoginUrlResponse; import cn.axzo.nanopart.ess.api.response.CreateContractByFileResponse; import cn.axzo.nanopart.ess.api.response.DownloadSingedContractPdfResponse; @@ -27,13 +36,6 @@ import cn.axzo.nanopart.ess.api.response.GetContractDetailByContractIdResponse; import cn.axzo.nanopart.ess.api.response.GetEmbedWebUrlResponse; import cn.axzo.nanopart.ess.api.response.GetOrgAuthStatesResponse; import cn.axzo.nanopart.ess.api.response.GetPersonAuthStateResponse; -import cn.axzo.nanopart.ess.api.response.GetSignUrlResponse; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import javax.validation.Valid; -import java.util.List; /** * @author yanglin @@ -110,10 +112,10 @@ public interface EssApi { @RequestBody @Valid CreateContractByFileRequest request); /** - * 获取签署链接, 有效期为5分钟 + * 获取动态签署链接, 有效期为5分钟 */ - @PostMapping("api/ess/getContractSignUrl") - ApiResult getContractSignUrl(@RequestBody @Valid GetSignUrlRequest request); + @PostMapping("api/ess/assignSignUrl") + ApiResult assignSignUrl(@RequestBody @Valid AssignSignUrlRequest request); /** * 获取合同PDF文件地址. 下载链接有效期为5分钟 diff --git a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/domain/contract/OrgPersonInfo.java b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/domain/contract/OrgPersonInfo.java index ad3583b9..1d9c9274 100644 --- a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/domain/contract/OrgPersonInfo.java +++ b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/domain/contract/OrgPersonInfo.java @@ -16,6 +16,10 @@ import javax.validation.constraints.NotNull; @Getter public class OrgPersonInfo implements OrgPerson { + public static OrgPersonInfo create(OrgPerson person) { + return create(person.getOuId(), person.getPersonId()); + } + public static OrgPersonInfo create(Long ouId, Long personId) { OrgPersonInfo orgPersonInfo = new OrgPersonInfo(); orgPersonInfo.setOuId(ouId); diff --git a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/domain/contract/SignOption.java b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/domain/contract/SignOption.java index 085b66b1..6b99e9c0 100644 --- a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/domain/contract/SignOption.java +++ b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/domain/contract/SignOption.java @@ -21,6 +21,6 @@ public class SignOption { /** * 是否可以转发. false-可以转发 true-不可以转发 */ - private boolean noTransfer = true; + private boolean noTransfer = false; } diff --git a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/request/GetSignUrlRequest.java b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/request/AssignSignUrlRequest.java similarity index 76% rename from ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/request/GetSignUrlRequest.java rename to ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/request/AssignSignUrlRequest.java index 265d4cbb..b304fbab 100644 --- a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/request/GetSignUrlRequest.java +++ b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/request/AssignSignUrlRequest.java @@ -1,21 +1,22 @@ package cn.axzo.nanopart.ess.api.request; -import cn.axzo.nanopart.ess.api.domain.OrgPerson; -import cn.axzo.nanopart.ess.api.enums.SignUrlEndpoint; -import com.alibaba.fastjson.JSON; -import lombok.Getter; -import lombok.Setter; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import com.alibaba.fastjson.JSON; + +import cn.axzo.nanopart.ess.api.domain.OrgPerson; +import cn.axzo.nanopart.ess.api.enums.SignUrlEndpoint; +import lombok.Getter; +import lombok.Setter; + /** * @author yanglin */ @Setter @Getter -public class GetSignUrlRequest implements OrgPerson { +public class AssignSignUrlRequest implements OrgPerson { /** * 合同id @@ -43,11 +44,8 @@ public class GetSignUrlRequest implements OrgPerson { /** * 签署方编号, 可以使用该编号指定动态签署方的信息, 该编号在创建合同的时候会返回 - *

- * 如果在创建合同的时候存在任意没有指定具体签署人(Approver#signPersion)的情况下, 该字段必传 - *

- * 如果在创建合同的时候已经指定了所有的具体签署人(Approver#signPersion), 该字段可以不传 */ + @NotBlank(message = "recipientId不能为空") private String recipientId; @Override diff --git a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/response/GetSignUrlResponse.java b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/response/AssignSignUrlResponse.java similarity index 89% rename from ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/response/GetSignUrlResponse.java rename to ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/response/AssignSignUrlResponse.java index 117c888f..97038735 100644 --- a/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/response/GetSignUrlResponse.java +++ b/ess/ess-api/src/main/java/cn/axzo/nanopart/ess/api/response/AssignSignUrlResponse.java @@ -10,7 +10,7 @@ import lombok.Setter; */ @Setter @Getter -public class GetSignUrlResponse { +public class AssignSignUrlResponse { /** * 有效期为5分钟. diff --git a/ess/ess-server/pom.xml b/ess/ess-server/pom.xml index 1d93758c..deb31370 100644 --- a/ess/ess-server/pom.xml +++ b/ess/ess-server/pom.xml @@ -18,7 +18,7 @@ com.tencentcloudapi tencentcloud-sdk-java - 3.1.1209 + 3.1.1210 cn.axzo.framework diff --git a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/dao/EssContractDao.java b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/dao/EssContractDao.java index aaca309b..5ebe8a18 100644 --- a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/dao/EssContractDao.java +++ b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/dao/EssContractDao.java @@ -1,20 +1,22 @@ package cn.axzo.nanopart.ess.server.dao; +import java.util.List; +import java.util.Optional; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + import cn.axzo.nanopart.ess.api.domain.contract.Approver; import cn.axzo.nanopart.ess.api.domain.contract.EssApproveDetail; import cn.axzo.nanopart.ess.api.enums.EssContractState; import cn.axzo.nanopart.ess.server.entity.EssContract; import cn.axzo.nanopart.ess.server.mapper.EssContractMapper; import cn.axzo.nanopart.ess.server.utils.BizAssertions; -import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; /** * @author yanglin @@ -39,8 +41,10 @@ public class EssContractDao extends ServiceImpl return find(essContractId, false).orElse(null); } - public EssContract findForUpdateOrNull(String essContractId) { - return find(essContractId, true).orElse(null); + public EssContract getForUpdateOrThrow(String essContractId) { + EssContract contract = find(essContractId, true).orElse(null); + BizAssertions.assertNotNull(contract, "找不到合同信息, 合同id={}", essContractId); + return contract; } private Optional find(String essContractId, boolean forUpdate) { @@ -77,6 +81,15 @@ public class EssContractDao extends ServiceImpl .update(); } + public void updateAssigment(EssContract contract) { + if (contract.getAssignment() == null) + return; + lambdaUpdate() // + .eq(EssContract::getId, contract.getId()) // + .set(EssContract::getAssignment, JSON.toJSONString(contract.getAssignment())) // + .update(); + } + public void updateExt(EssContract contract) { if (contract.getRecordExt() == null) return; diff --git a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/Assignment.java b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/Assignment.java index 5bbe833f..6d37565b 100644 --- a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/Assignment.java +++ b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/Assignment.java @@ -14,4 +14,6 @@ public class Assignment { private Constraint constraint; -} + private SignPerOrgs signPerOrgs = new SignPerOrgs(); + +} \ No newline at end of file diff --git a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/SignPerOrg.java b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/SignPerOrg.java new file mode 100644 index 00000000..4546cfd3 --- /dev/null +++ b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/SignPerOrg.java @@ -0,0 +1,15 @@ +package cn.axzo.nanopart.ess.server.entity.domain; + +import cn.axzo.nanopart.ess.api.domain.OrgPerson; +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter @Getter +public class SignPerOrg implements OrgPerson { + private Long ouId; + private Long personId; + private String recipientId; +} \ No newline at end of file diff --git a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/SignPerOrgs.java b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/SignPerOrgs.java new file mode 100644 index 00000000..ce606111 --- /dev/null +++ b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/entity/domain/SignPerOrgs.java @@ -0,0 +1,39 @@ + +package cn.axzo.nanopart.ess.server.entity.domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import cn.axzo.nanopart.ess.api.domain.OrgPerson; +import lombok.Getter; +import lombok.Setter; + +/** + * @author yanglin + */ +@Setter +@Getter +public class SignPerOrgs { + + private List signPerOrg = new ArrayList<>(); + + public Optional find(Long ouId) { + return signPerOrg.stream() // + .filter(orgPersonInfo -> orgPersonInfo.getOuId().equals(ouId)) // + .findFirst(); + } + + public void remove(Long ouId) { + signPerOrg.removeIf(org -> org.getOuId().equals(ouId)); + } + + public void add(OrgPerson person, String recipientId) { + SignPerOrg orgPersonInfo = new SignPerOrg(); + orgPersonInfo.setOuId(person.getOuId()); + orgPersonInfo.setPersonId(person.getPersonId()); + orgPersonInfo.setRecipientId(recipientId); + signPerOrg.add(orgPersonInfo); + } + +} diff --git a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/ContractManager.java b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/ContractManager.java index a57c5964..7b3f65b3 100644 --- a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/ContractManager.java +++ b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/ContractManager.java @@ -87,7 +87,7 @@ public class ContractManager { public void revokeContract(RevokeContractRequest request) { essLogDao.logRequest("revokeContract", request.getEssContractId(), request); // lock when updating state - EssContract contract = essContractDao.findForUpdateOrNull(request.getEssContractId()); + EssContract contract = essContractDao.getForUpdateOrThrow(request.getEssContractId()); BizAssertions.assertFalse(contract.isFinalState(), "合同已是终态 {}, 无法撤销", contract.getState().description()); EssPerson superAdmin = getContractSuperAdmin(contract); essClient.revokeContract(superAdmin, contract.getEssContractId(), request.getReason()); @@ -97,8 +97,7 @@ public class ContractManager { @BizTransactional public void updateContractState(EssContract contract, EssContractState state, List approveDetails, String essMessage) { - EssContract reload = essContractDao.findForUpdateOrNull(contract.getEssContractId()); - BizAssertions.assertNotNull(reload, "合同不存在: {}", contract.getEssContractId()); + EssContract reload = essContractDao.getForUpdateOrThrow(contract.getEssContractId()); if (reload.isFinalState()) { log.warn("合同[{}]已是最终状态[{}], 无法更新状态至{}", reload.getEssContractId(), reload.getState(), state.description()); } diff --git a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/EssClient.java b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/EssClient.java index 57e5fe1e..062294d3 100644 --- a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/EssClient.java +++ b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/EssClient.java @@ -17,6 +17,7 @@ import java.util.regex.Pattern; import javax.annotation.Resource; +import com.tencentcloudapi.essbasic.v20210526.models.CreateSignUrlsResponse; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.InitializingBean; @@ -38,6 +39,7 @@ import com.tencentcloudapi.essbasic.v20210526.models.ApproverOption; import com.tencentcloudapi.essbasic.v20210526.models.ChannelCancelFlowRequest; import com.tencentcloudapi.essbasic.v20210526.models.ChannelCreateEmbedWebUrlRequest; import com.tencentcloudapi.essbasic.v20210526.models.ChannelCreateEmbedWebUrlResponse; +import com.tencentcloudapi.essbasic.v20210526.models.ChannelCreateFlowApproversRequest; import com.tencentcloudapi.essbasic.v20210526.models.ChannelCreateFlowByFilesRequest; import com.tencentcloudapi.essbasic.v20210526.models.ChannelCreateFlowByFilesResponse; import com.tencentcloudapi.essbasic.v20210526.models.ChannelCreateOrganizationBatchSignUrlRequest; @@ -49,11 +51,13 @@ import com.tencentcloudapi.essbasic.v20210526.models.ChannelDescribeEmployeesRes import com.tencentcloudapi.essbasic.v20210526.models.ComponentLimit; import com.tencentcloudapi.essbasic.v20210526.models.CreateConsoleLoginUrlRequest; import com.tencentcloudapi.essbasic.v20210526.models.CreateConsoleLoginUrlResponse; +import com.tencentcloudapi.essbasic.v20210526.models.CreateFlowForwardsRequest; import com.tencentcloudapi.essbasic.v20210526.models.CreateSignUrlsRequest; -import com.tencentcloudapi.essbasic.v20210526.models.CreateSignUrlsResponse; import com.tencentcloudapi.essbasic.v20210526.models.DescribeResourceUrlsByFlowsRequest; import com.tencentcloudapi.essbasic.v20210526.models.DescribeResourceUrlsByFlowsResponse; +import com.tencentcloudapi.essbasic.v20210526.models.FillApproverInfo; import com.tencentcloudapi.essbasic.v20210526.models.FlowApproverInfo; +import com.tencentcloudapi.essbasic.v20210526.models.FlowForwardInfo; import com.tencentcloudapi.essbasic.v20210526.models.ProxyOrganizationOperator; import com.tencentcloudapi.essbasic.v20210526.models.SyncProxyOrganizationOperatorsRequest; import com.tencentcloudapi.essbasic.v20210526.models.UploadFile; @@ -299,21 +303,43 @@ public class EssClient implements InitializingBean { return response.getFlowResourceUrlInfos()[0].getResourceUrlInfos()[0].getUrl(); } - public String getContractSignUrlPC(String essContractId, EssPerson signPerson) { + void createFlowApprovers(EssPerson superAdmin, String essContractId, String recipientId, EssPerson signPerson) { + FillApproverInfo approver = new FillApproverInfo(); + approver.setRecipientId(recipientId); + approver.setOpenId(PersonOpenId.create(signPerson).toOpenId()); + approver.setOrganizationOpenId(OrgOpenId.ofPerson(signPerson).toOpenId()); + ChannelCreateFlowApproversRequest request = new ChannelCreateFlowApproversRequest(); + request.setAgent(agent(superAdmin)); + request.setApprovers(new FillApproverInfo[] { approver }); + request.setFlowId(essContractId); + request.setFillApproverType(1L); + exec(func() // + .context("ChannelCreateFlowApprovers") // + .subject(idbuilder() // + .append(essContractId) // + .append(signPerson.getPersonId()) // + .build()) // + .request(request) // + .command(() -> manage.ChannelCreateFlowApprovers(request))); + } + + public String createPcSignUrl(EssPerson superAdmin, String essContractId, EssPerson signPerson) { ChannelCreateOrganizationBatchSignUrlRequest request = new ChannelCreateOrganizationBatchSignUrlRequest(); - request.setAgent(agent(signPerson)); + request.setAgent(agent(superAdmin)); request.setFlowIds(new String[] { essContractId }); request.setOpenId(PersonOpenId.create(signPerson).toOpenId()); ChannelCreateOrganizationBatchSignUrlResponse response = exec(func() // - .context("ChannelCreateOrganizationBatchSignUrl") // - .subject(essContractId) // + .context("ChannelCreateOrganizationBatchSignUrl").subject(idbuilder() // + .append(essContractId) // + .append(signPerson.getPersonId()) // + .build()) // .request(request) // .command(() -> manage.ChannelCreateOrganizationBatchSignUrl(request))); return response.getSignUrl(); } - public CreateSignUrlsResponse getWeixinAppSignUrl(String essContractId, EssPerson superAdmin, OrgPerson signPerson, - String recipientId) { + public String createSignUrls(EssPerson superAdmin, String essContractId, String recipientId, + OrgPerson signPerson) { CreateSignUrlsRequest request = new CreateSignUrlsRequest(); request.setAgent(agent(superAdmin)); request.setFlowIds(new String[] { essContractId }); @@ -323,7 +349,7 @@ public class EssClient implements InitializingBean { request.setRecipientIds(new String[] { recipientId }); request.setGenerateType("RECIPIENT"); } - return exec(func() // + CreateSignUrlsResponse response = exec(func() // .context("CreateSignUrls") // .subject(idbuilder() // .append(essContractId) // @@ -331,6 +357,25 @@ public class EssClient implements InitializingBean { .build()) // .request(request) // .command(() -> manage.CreateSignUrls(request))); + return response.getSignUrlInfos()[0].getSignUrl(); + } + + public void forward(EssPerson superAdmin, String essContractId, String recipientId, EssPerson signPerson) { + CreateFlowForwardsRequest request = new CreateFlowForwardsRequest(); + request.setAgent(agent(superAdmin)); + request.setTargetOpenId(PersonOpenId.create(signPerson).toOpenId()); + FlowForwardInfo forward = new FlowForwardInfo(); + forward.setFlowId(essContractId); + forward.setRecipientId(recipientId); + request.setFlowForwardInfos(new FlowForwardInfo[] { forward }); + exec(func() // + .context("CreateFlowForwards") // + .subject(idbuilder() // + .append(essContractId) // + .append(signPerson.getPersonId()) // + .build()) // + .request(request) // + .command(() -> manage.CreateFlowForwards(request))); } public void setEmployeeResigned(EssPerson superAdmin, EssPerson person) { diff --git a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/EssService.java b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/EssService.java index bf9c2c16..f9c5988a 100644 --- a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/EssService.java +++ b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/EssService.java @@ -3,25 +3,15 @@ package cn.axzo.nanopart.ess.server.ess; import static cn.axzo.nanopart.ess.server.utils.IdBuilder.idbuilder; -import java.util.function.Function; - -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import com.tencentcloudapi.essbasic.v20210526.models.CreateSignUrlsResponse; -import com.tencentcloudapi.essbasic.v20210526.models.SignUrlInfo; - -import cn.axzo.nanopart.ess.api.domain.OrgPerson; -import cn.axzo.nanopart.ess.api.domain.contract.Approver; -import cn.axzo.nanopart.ess.api.domain.contract.EssApproveDetail; import cn.axzo.nanopart.ess.api.enums.Constraint; -import cn.axzo.nanopart.ess.api.enums.EssContractApproveState; import cn.axzo.nanopart.ess.api.enums.EssEmbedType.EssSubject; import cn.axzo.nanopart.ess.api.enums.SignUrlEndpoint; import cn.axzo.nanopart.ess.api.request.AddSealAuthorizationRequest; +import cn.axzo.nanopart.ess.api.request.AssignSignUrlRequest; import cn.axzo.nanopart.ess.api.request.CreateConsoleLoginUrlRequest; import cn.axzo.nanopart.ess.api.request.GetEmbedWebUrlRequest; -import cn.axzo.nanopart.ess.api.request.GetSignUrlRequest; import cn.axzo.nanopart.ess.api.request.RemoveSealAuthorizationRequest; import cn.axzo.nanopart.ess.api.request.SaveContractSnapshotRequest; import cn.axzo.nanopart.ess.api.request.SealAndPersonRequest; @@ -132,38 +122,36 @@ public class EssService { return new SealAndPerson(seal, sealPerson); } - public String getContractSignUrl(GetSignUrlRequest request) { + @BizTransactional + public String assignSignUrl(AssignSignUrlRequest request) { String subject = idbuilder() // .append(request.getEssContractId()) // .append(request.getOuId()) // .append(request.getPersonId()) // .build(); - essLogDao.logRequest("getContractSignUrl", subject, request); + essLogDao.logRequest("assignSignUrl", subject, request); EssPerson signPerson = essPersonDao.findOrNull(request); BizAssertions.assertNotNull(signPerson, "当前签署人员未加入单位, 无法签署"); - EssContract contract = essContractDao.getOrThrow(request.getEssContractId()); + EssContract contract = essContractDao.getForUpdateOrThrow(request.getEssContractId()); BizAssertions.assertFalse(contract.isFinalState(), "合同已是最终状态 {}, 无法签署", contract.getState()); if (contract.getConstraint() == Constraint.ONE_PERSON_PER_ORG) BizAssertions.assertFalse(contract.isOrgSigned(request.getOuId()), "该单位已签署, 无法再次签署"); - Function signUrlFun = recipientId -> { - EssPerson superAdmin = contractManager.getContractSuperAdmin(contract); - CreateSignUrlsResponse essResponse = essClient.getWeixinAppSignUrl(request.getEssContractId(), superAdmin, - request, recipientId); - SignUrlInfo signUrlInfo = essResponse.getSignUrlInfos()[0]; - return request.getEndpoint() == SignUrlEndpoint.PC ? signUrlInfo.getSignQrcodeUrl() - : signUrlInfo.getSignUrl(); - }; - if (contract.isSignPersonsPreset()) - return signUrlFun.apply(null); - BizAssertions.assertFalse(StringUtils.isBlank(request.getRecipientId()), "存在动态签署人的情况下, recipientId不能为空"); - EssApproveDetail approveDetail = contract.getApproveDetailOrThrow(request.getRecipientId()); - BizAssertions.assertNotEquals(EssContractApproveState.ACCEPT, approveDetail.getState(), "该签署位已签署, 无法再次签署"); - Approver approver = contract.getApproverOrThrow(request.getRecipientId()); - if (approver.getSignPerson() != null) { - BizAssertions.assertTrue(OrgPerson.equals(approver.getSignPerson(), request), "签署人员不匹配"); - return signUrlFun.apply(null); - } - return signUrlFun.apply(request.getRecipientId()); + contract.getAssignment().getSignPerOrgs().find(request.getOuId()).ifPresent(org -> { + BizAssertions.assertEquals(org.getRecipientId(), request.getRecipientId(), "单位的签署编号不能变化"); + if (!org.getPersonId().equals(request.getPersonId())) { + EssPerson signSuperAdmin = orgManager.getSuperAdminOrThrow(signPerson.getOuId()); + essClient.forward(signSuperAdmin, contract.getEssContractId(), request.getRecipientId(), signPerson); + } + }); + contract.getAssignment().getSignPerOrgs().remove(request.getOuId()); + contract.getAssignment().getSignPerOrgs().add(signPerson, request.getRecipientId()); + essContractDao.updateAssigment(contract); + EssPerson superAdmin = contractManager.getContractSuperAdmin(contract); + if (request.getEndpoint() != SignUrlEndpoint.PC) + return essClient.createSignUrls(superAdmin, contract.getEssContractId(), request.getRecipientId(), + signPerson); + essClient.createFlowApprovers(superAdmin, contract.getEssContractId(), request.getRecipientId(), signPerson); + return essClient.createPcSignUrl(superAdmin, contract.getEssContractId(), signPerson); } public String getContractPDFUrl(String essContractId) { diff --git a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/controller/ApiController.java b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/controller/ApiController.java index d5ae3e44..e38b479d 100644 --- a/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/controller/ApiController.java +++ b/ess/ess-server/src/main/java/cn/axzo/nanopart/ess/server/ess/controller/ApiController.java @@ -22,7 +22,7 @@ import cn.axzo.nanopart.ess.api.request.GetOrgAuthStatesRequest; import cn.axzo.nanopart.ess.api.request.GetPersonAuthStateRequest; import cn.axzo.nanopart.ess.api.request.GetSealPersonRequest; import cn.axzo.nanopart.ess.api.request.GetSealsRequest; -import cn.axzo.nanopart.ess.api.request.GetSignUrlRequest; +import cn.axzo.nanopart.ess.api.request.AssignSignUrlRequest; import cn.axzo.nanopart.ess.api.request.RemoveSealAuthorizationRequest; import cn.axzo.nanopart.ess.api.request.RemoveSealPersonRequest; import cn.axzo.nanopart.ess.api.request.RevokeContractRequest; @@ -34,7 +34,7 @@ import cn.axzo.nanopart.ess.api.response.GetContractDetailByContractIdResponse; import cn.axzo.nanopart.ess.api.response.GetEmbedWebUrlResponse; import cn.axzo.nanopart.ess.api.response.GetOrgAuthStatesResponse; import cn.axzo.nanopart.ess.api.response.GetPersonAuthStateResponse; -import cn.axzo.nanopart.ess.api.response.GetSignUrlResponse; +import cn.axzo.nanopart.ess.api.response.AssignSignUrlResponse; import cn.axzo.nanopart.ess.server.dao.EssContractDao; import cn.axzo.nanopart.ess.server.entity.EssContract; import cn.axzo.nanopart.ess.server.ess.ContractManager; @@ -133,10 +133,10 @@ class ApiController implements EssApi { } @Override - public ApiResult getContractSignUrl(GetSignUrlRequest request) { - log.info("getContractSignUrl request={}", request); - GetSignUrlResponse response = new GetSignUrlResponse(); - response.setUrl(essService.getContractSignUrl(request)); + public ApiResult assignSignUrl(AssignSignUrlRequest request) { + log.info("assignSignUrl request={}", request); + AssignSignUrlResponse response = new AssignSignUrlResponse(); + response.setUrl(essService.assignSignUrl(request)); return ApiResult.ok(response); }