REQ-3581: 备份

This commit is contained in:
yanglin 2025-02-13 13:50:29 +08:00
parent 7aa7f01817
commit e1015bebc2
6 changed files with 119 additions and 11 deletions

View File

@ -0,0 +1,39 @@
package cn.axzo.nanopart.ess.api.enums;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* @author yanglin
*/
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public enum EssContractApproveState {
PENDING("待签署"),
ACCEPT("已签署"),
REJECT("拒绝"),
DEADLINE("过期没人处理"),
CANCEL("流程已撤回"),
STOP("流程已终止"),
WAITPICKUP("待领取"),
FILLPENDING("待填写"),
FILLACCEPT("填写完成"),
FORWARD("已转他人处理"),
RELIEVED("解除协议(已解除)"),
FILLREJECT("拒绝填写"),
EXCEPTION("异常")
;
private final String description;
public static EssContractApproveState fromEssCode(String code) {
for (EssContractApproveState value : values()) {
if (value.name().equalsIgnoreCase(code)) {
return value;
}
}
return null;
}
}

View File

@ -8,6 +8,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* @author yanglin
*/
@ -145,13 +147,43 @@ public class CallbackRequest {
// 合同(流程)关注方信息列表, 结构体定义可以查看开发者中的CcInfo
private JSONArray CcInfo;
// 合同(流程)签署人信息列表, 结构体的定义可以参考下面的FlowApproverDetail
private JSONArray FlowApproverInfo;
private List<FlowApproverDetail> FlowApproverInfo;
// 如果合同归属合同组, 此结构体为合同组的信息, 结构体的定义可以参考下面的FlowGroupMessageDetail
private JSONObject FlowGroupMessage;
// 此回调触发的时间,格式为Unix标准时间戳
private Integer OccurTime;
}
@Setter @Getter
public static class FlowApproverDetail {
// 如果第三方子企业员工签署, 此字段为第三方子企业员工的唯一标识
private String ProxyOperatorOpenId;
// 如果第三方子企业员工签署, 此字段为第三方子企业的名称
private String ProxyOrganizationName;
// 如果saas企业员工签署, 此字段为saas企业的名称
private String OrganizationName;
// 如果第三方子企业员工签署, 此字段为第三方子企业的唯一标识
private String ProxyOrganizationOpenId;
// 对应签署人的手机号
private String PhoneNumber;
// 如果合同是顺序签署, SignOrder对应签署人的签署顺序
private long SignOrder;
// 对应签署人的参与角色ID
private String RecipientId;
// 对应签署人的名字
private String ApproveName;
// 对应签署人的状态, 具体含义可以参考上述其他说明中的 签署人状态
private String ApproveStatus;
// 对应签署人状态的简单描述, : 已签署或者拒签的原因等
private String ApproveMessage;
// 对应签署人签署此合同的时间格式为Unix标准时间戳
private long ApproveTime;
// 对应签署人签署此合同的证书信息, 此功能为白名单功能, 使用前请联系对接的客户经理沟通
private String CaSign;
// 对应签署人的签署截止时间格式为Unix标准时间戳
private long ApproverDeadline;
}
@Setter @Getter
public static class SuperAdminChanged {
// 第三方应用的应用编号

View File

@ -2,6 +2,7 @@ package cn.axzo.nanopart.ess.server.dao;
import cn.axzo.nanopart.ess.api.enums.EssContractState;
import cn.axzo.nanopart.ess.server.entity.EssContract;
import cn.axzo.nanopart.ess.server.entity.EssContract.ApproverDetail;
import cn.axzo.nanopart.ess.server.mapper.EssContractMapper;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -30,10 +31,11 @@ public class EssContractDao extends ServiceImpl<EssContractMapper, EssContract>
.update();
}
public void updateState(String essContractId, EssContractState state) {
public void updateState(String essContractId, EssContractState state, List<ApproverDetail> details) {
lambdaUpdate()
.eq(EssContract::getEssContractId, essContractId)
.set(EssContract::getState, state)
.set(details != null, EssContract::getApproverDetails, details == null ? "[]" : JSON.toJSONString(details))
.update();
}

View File

@ -1,10 +1,10 @@
package cn.axzo.nanopart.ess.server.entity;
import cn.axzo.foundation.dao.support.mysql.type.BaseListTypeHandler;
import cn.axzo.nanopart.ess.api.enums.EssContractApproveState;
import cn.axzo.nanopart.ess.api.enums.EssContractState;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
@ -71,8 +71,8 @@ public class EssContract extends BaseEntity<EssContract> {
/**
* 状态描述
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject describeState;
@TableField(typeHandler = ApproverDetailListHandler.class)
private List<ApproverDetail> approverDetails;
/**
* 扩展字段
@ -89,8 +89,21 @@ public class EssContract extends BaseEntity<EssContract> {
public static class RecordExt {
}
@Setter @Getter
public static class ApproverDetail {
private Long ouId;
private Long personId;
private EssContractApproveState state;
private long signOrder;
private long approveTime;
private String message;
private long approverDeadline;
}
// @formatter:off
public static class StringListHandler
extends BaseListTypeHandler<String> {}
public static class ApproverDetailListHandler
extends BaseListTypeHandler<String> {}
// @formatter:on
}

View File

@ -11,6 +11,7 @@ import cn.axzo.nanopart.ess.server.dao.EssPersonDao;
import cn.axzo.nanopart.ess.server.dao.EssSealPersonDao;
import cn.axzo.nanopart.ess.server.dao.domain.OuAndPersonId;
import cn.axzo.nanopart.ess.server.entity.EssContract;
import cn.axzo.nanopart.ess.server.entity.EssContract.ApproverDetail;
import cn.axzo.nanopart.ess.server.entity.EssOrg;
import cn.axzo.nanopart.ess.server.entity.EssPerson;
import cn.axzo.nanopart.ess.server.entity.EssSealPerson;
@ -109,8 +110,10 @@ public class ContractManager {
}
}
public void updateContractState(String essContractId, EssContractState state) {
essContractDao.updateState(essContractId, state);
public void updateContractState(String essContractId,
EssContractState state,
List<ApproverDetail> details) {
essContractDao.updateState(essContractId, state, details);
broadcaster.fireContractStateChanged(essContractId);
}
@ -124,7 +127,7 @@ public class ContractManager {
.find(contract.getCreatorOuId(), contract.getCreatorPersonId(), false)
.orElse(null);
essClient.revokeContract(creator, contract.getEssContractId(), request.getReason());
essContractDao.updateState(request.getEssContractId(), EssContractState.CANCEL);
essContractDao.updateState(request.getEssContractId(), EssContractState.CANCEL, null);
}
}

View File

@ -2,6 +2,7 @@ package cn.axzo.nanopart.ess.server.ess.controller;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.nanopart.ess.api.EssCallbackApi;
import cn.axzo.nanopart.ess.api.enums.EssContractApproveState;
import cn.axzo.nanopart.ess.api.enums.EssContractState;
import cn.axzo.nanopart.ess.api.enums.EssSealState;
import cn.axzo.nanopart.ess.api.enums.EssSealType;
@ -9,6 +10,7 @@ import cn.axzo.nanopart.ess.api.request.CallbackRequest;
import cn.axzo.nanopart.ess.api.request.CallbackRequest.OrgAuthorizationFinish;
import cn.axzo.nanopart.ess.api.request.CallbackRequest.SuperAdminChanged;
import cn.axzo.nanopart.ess.server.dao.EssLogDao;
import cn.axzo.nanopart.ess.server.entity.EssContract.ApproverDetail;
import cn.axzo.nanopart.ess.server.entity.EssLog;
import cn.axzo.nanopart.ess.server.ess.ContractManager;
import cn.axzo.nanopart.ess.server.ess.OrgManager;
@ -25,12 +27,14 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import static cn.axzo.nanopart.ess.api.request.CallbackRequest.ContractStateChanged;
import static cn.axzo.nanopart.ess.api.request.CallbackRequest.OrgPersonJoin;
import static cn.axzo.nanopart.ess.api.request.CallbackRequest.SealOperate;
import static java.util.stream.Collectors.toList;
/**
* @author yanglin
@ -96,10 +100,25 @@ class CallbackController implements EssCallbackApi, InitializingBean {
registerHandler(CallbackType.CONTRACT_STATE_CHANGED, request -> {
ContractStateChanged changes = request.readMsgData(ContractStateChanged.class);
EssContractState state = EssContractState.fromEssCode(changes.getFlowStatus());
if (state != null)
contractManager.updateContractState(changes.getFlowId(), state);
else
if (state == null) {
log.warn("unknown contract state: {}", changes.getFlowStatus());
return changes.getFlowId();
}
List<ApproverDetail> details = changes.getFlowApproverInfo().stream()
.map(info -> {
PersonOpenId personOpenId = PersonOpenId.parse(info.getProxyOperatorOpenId());
ApproverDetail detail = new ApproverDetail();
detail.setOuId(personOpenId.getOuId());
detail.setPersonId(personOpenId.getPersonId());
detail.setState(EssContractApproveState.fromEssCode(info.getApproveStatus()));
detail.setSignOrder(info.getSignOrder());
detail.setApproveTime(info.getApproveTime() * 1000);
detail.setMessage(info.getApproveMessage());
detail.setApproverDeadline(info.getApproverDeadline() * 1000);
return detail;
})
.collect(toList());
contractManager.updateContractState(changes.getFlowId(), state, details);
return changes.getFlowId();
});
registerHandler(CallbackType.SUPER_ADMIN_CHANGED, request -> {