REQ-3201: 备份

This commit is contained in:
yanglin 2025-02-12 16:53:16 +08:00
parent cedc99bdbc
commit 648964897e
13 changed files with 91 additions and 73 deletions

View File

@ -152,4 +152,24 @@ public class CallbackRequest {
private Integer OccurTime;
}
@Setter @Getter
public static class SuperAdminChanged {
// 第三方应用的应用编号
private String ApplicationId;
// 第三方平台子客企业的唯一标识
private String ProxyOrganizationOpenId;
// 新的超管的企业的第三方平台子客企业员工的唯一标识
private String ChangeToUserOpenId;
// 新的超管的名字
private String ChangeToUserName;
// 新的超管的手机号
private String ChangeToUserMobile;
// 老的超管的企业的第三方平台子客企业员工的唯一标识
private String OldAdminOpenId;
// 老的超管的名字
private String OldAdminName;
// 老的超管的手机号
private String OldAdminMobile;
}
}

View File

@ -39,4 +39,11 @@ public class EssOrgDao extends ServiceImpl<EssOrgMapper, EssOrg> {
.update();
}
public void changeSuperAdmin(Long ouId, Long personId) {
lambdaUpdate()
.eq(EssOrg::getOuId, ouId)
.set(EssOrg::getSuperAdminPersonId, personId)
.update();
}
}

View File

@ -16,7 +16,7 @@ import org.springframework.stereotype.Component;
*/
@Component
@RequiredArgsConstructor
class EssBroadcaster {
class Broadcaster {
private final EssContractDao essContractDao;
protected final EventProducer<?> eventProducer;

View File

@ -11,7 +11,7 @@ import cn.axzo.nanopart.ess.server.entity.EssContract;
import cn.axzo.nanopart.ess.server.entity.EssOrg;
import cn.axzo.nanopart.ess.server.entity.EssPerson;
import cn.axzo.nanopart.ess.server.entity.EssSealPerson;
import cn.axzo.nanopart.ess.server.ess.domain.EssSealPersons;
import cn.axzo.nanopart.ess.server.ess.domain.SealPersons;
import cn.axzo.nanopart.ess.server.utils.BizAssertions;
import com.alibaba.fastjson.JSON;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
@ -36,7 +36,7 @@ public class ContractManager {
private final EssClient essClient;
private final EssOrgDao essOrgDao;
private final EssContractDao essContractDao;
private final EssBroadcaster essBroadcaster;
private final Broadcaster broadcaster;
private final EssSealPersonDao essSealPersonDao;
public String createContract(CreateContractRequest request) {
@ -48,7 +48,7 @@ public class ContractManager {
String essContractId = essClient.createContract(superAdmin,
request.getContractName(), essFileId, getApproverAsSealPersons(request));
essContractDao.setEssContractCreated(contract.getId(), essFileId, essContractId);
essBroadcaster.fireContractStateChanged(contract.getEssContractId());
broadcaster.fireContractStateChanged(contract.getEssContractId());
return essContractId;
} catch (TencentCloudSDKException e) {
log.warn("创建合同失败", e);
@ -66,7 +66,7 @@ public class ContractManager {
.collect(toList());
BizAssertions.assertEmpty(notAuthorizedOrgs,
"创建合同失败. 以下单位还未认证: {}", JSON.toJSONString(notAuthorizedOrgs));
EssSealPersons sealPersons = EssSealPersons.wrap(getApproverAsSealPersons(request));
SealPersons sealPersons = SealPersons.wrap(getApproverAsSealPersons(request));
for (CreateContractRequest.ApproverInfo approver : request.getApprovers()) {
EssSealPerson sealPerson = sealPersons.find(
approver.getOuId(), approver.getPersonId()).orElse(null);
@ -104,6 +104,6 @@ public class ContractManager {
public void updateContractState(String essContractId, EssContractState state) {
essContractDao.updateState(essContractId, state);
essBroadcaster.fireContractStateChanged(essContractId);
broadcaster.fireContractStateChanged(essContractId);
}
}

View File

@ -11,8 +11,8 @@ import cn.axzo.nanopart.ess.server.entity.EssOrg;
import cn.axzo.nanopart.ess.server.entity.EssPerson;
import cn.axzo.nanopart.ess.server.entity.EssSeal;
import cn.axzo.nanopart.ess.server.entity.EssSealPerson;
import cn.axzo.nanopart.ess.server.ess.domain.EssOuOpenId;
import cn.axzo.nanopart.ess.server.ess.domain.EssPersonOpenId;
import cn.axzo.nanopart.ess.server.ess.domain.OuOpenId;
import cn.axzo.nanopart.ess.server.ess.domain.PersonOpenId;
import cn.axzo.nanopart.ess.server.ess.support.EssProps;
import cn.axzo.nanopart.ess.server.ess.support.EssSupport;
import cn.axzo.nanopart.ess.server.utils.BizAssertions;
@ -129,7 +129,7 @@ public class EssClient implements InitializingBean {
request.setAgent(agent(superAdmin));
request.setSealId(seal.getEssSealId());
request.setUserIds(new String[]{
EssPersonOpenId.create(sealPerson.getOuId(), sealPerson.getPersonId()).toOpenId()
PersonOpenId.create(sealPerson.getOuId(), sealPerson.getPersonId()).toOpenId()
});
exec(invocation()
.context("ChannelCreateSealPolicy")
@ -143,7 +143,7 @@ public class EssClient implements InitializingBean {
request.setAgent(agent(superAdmin));
request.setSealId(seal.getEssSealId());
request.setUserIds(new String[]{
EssPersonOpenId.create(sealPerson.getOuId(), sealPerson.getPersonId()).toOpenId()
PersonOpenId.create(sealPerson.getOuId(), sealPerson.getPersonId()).toOpenId()
});
exec(invocation()
.context("ChannelDeleteSealPolicies")
@ -194,9 +194,9 @@ public class EssClient implements InitializingBean {
approvers.add(approver);
approver.setName(personProfile.getRealName());
approver.setMobile(personProfile.getPhone());
approver.setOpenId(EssPersonOpenId.create(approvePerson.getOuId(), approvePerson.getPersonId()).toOpenId());
approver.setOpenId(PersonOpenId.create(approvePerson.getOuId(), approvePerson.getPersonId()).toOpenId());
approver.setOrganizationName(orgProfile.getName());
approver.setOrganizationOpenId(EssOuOpenId.create(approvePerson.getOuId()).toOpenId());
approver.setOrganizationOpenId(OuOpenId.create(approvePerson.getOuId()).toOpenId());
approver.setApproverType("ORGANIZATION");
approver.setNotifyType("NONE");
approver.setPreReadTime(10L);
@ -230,7 +230,7 @@ public class EssClient implements InitializingBean {
ChannelCreateOrganizationBatchSignUrlRequest request = new ChannelCreateOrganizationBatchSignUrlRequest();
request.setAgent(agent(superAdmin));
request.setFlowIds(new String[]{essContractId});
request.setOpenId(EssPersonOpenId.create(signPerson.getOuId(), signPerson.getPersonId()).toOpenId());
request.setOpenId(PersonOpenId.create(signPerson.getOuId(), signPerson.getPersonId()).toOpenId());
ChannelCreateOrganizationBatchSignUrlResponse response = exec(invocation()
.context("ChannelCreateOrganizationBatchSignUrl")
.subject(essContractId)
@ -243,7 +243,7 @@ public class EssClient implements InitializingBean {
CreateSignUrlsRequest request = new CreateSignUrlsRequest();
request.setAgent(agent(superAdmin));
request.setFlowIds(new String[]{essContractId});
request.setOpenId(EssPersonOpenId.create(signPerson.getOuId(), signPerson.getPersonId()).toOpenId());
request.setOpenId(PersonOpenId.create(signPerson.getOuId(), signPerson.getPersonId()).toOpenId());
CreateSignUrlsResponse response = exec(invocation()
.context("CreateSignUrls")
.subject(essContractId)
@ -269,8 +269,8 @@ public class EssClient implements InitializingBean {
UserInfo userInfo = new UserInfo();
agent.setAppId(props.getAppId());
agent.setProxyAppId("");
agent.setProxyOrganizationOpenId(EssOuOpenId.create(person.getOuId()).toOpenId());
userInfo.setOpenId(EssPersonOpenId.create(person.getOuId(), person.getPersonId()).toOpenId());
agent.setProxyOrganizationOpenId(OuOpenId.create(person.getOuId()).toOpenId());
userInfo.setOpenId(PersonOpenId.create(person.getOuId(), person.getPersonId()).toOpenId());
agent.setProxyOperator(userInfo);
return agent;
}

View File

@ -11,7 +11,7 @@ import cn.axzo.nanopart.ess.server.entity.EssOrg;
import cn.axzo.nanopart.ess.server.entity.EssPerson;
import cn.axzo.nanopart.ess.server.entity.EssSeal;
import cn.axzo.nanopart.ess.server.entity.EssSealPerson;
import cn.axzo.nanopart.ess.server.ess.domain.EssSealPersons;
import cn.axzo.nanopart.ess.server.ess.domain.SealPersons;
import cn.axzo.nanopart.ess.server.ess.domain.OrgAndPerson;
import cn.axzo.nanopart.ess.server.ess.support.EssSupport;
import cn.axzo.nanopart.ess.server.utils.BizAssertions;
@ -81,6 +81,10 @@ public class OrgManager {
essOrgDao.setOrgAuthorized(ouId, authorizePersonId);
}
public void changeSuperAdmin(Long ouId, Long personId) {
essOrgDao.changeSuperAdmin(ouId, personId);
}
public EssPerson getSuperAdminOrThrow(Long ouId) {
EssPerson superAdmin = findSuperAdmin(ouId).orElse(null);
BizAssertions.assertNotNull(superAdmin, "单位还未认证: {}", ouId);
@ -141,7 +145,7 @@ public class OrgManager {
public void maybeAddSealPersons(String essSealId, Set<Long> personIds) {
EssSeal seal = essSealDao.findByEssSealId(essSealId).orElse(null);
BizAssertions.assertNotNull(seal, "印章不存在: {}", essSealId);
EssSealPersons sealPersons = EssSealPersons.wrap(
SealPersons sealPersons = SealPersons.wrap(
essSealPersonDao.getBySealAndPersonIds(essSealId, personIds));
List<EssSealPerson> newPersons = personIds.stream()
.filter(personId -> !sealPersons.containsPerson(personId))

View File

@ -47,7 +47,7 @@ import static java.util.stream.Collectors.toSet;
*/
@Service
@RequiredArgsConstructor
public class EssQueryService {
public class QueryService {
private final EssOrgDao essOrgDao;
private final EssPersonDao essPersonDao;

View File

@ -34,7 +34,7 @@ import cn.axzo.nanopart.ess.server.entity.EssSeal;
import cn.axzo.nanopart.ess.server.entity.EssSealPerson;
import cn.axzo.nanopart.ess.server.ess.ContractManager;
import cn.axzo.nanopart.ess.server.ess.EssClient;
import cn.axzo.nanopart.ess.server.ess.EssQueryService;
import cn.axzo.nanopart.ess.server.ess.QueryService;
import cn.axzo.nanopart.ess.server.ess.OrgManager;
import cn.axzo.nanopart.ess.server.ess.domain.OrgAndPerson;
import cn.axzo.nanopart.ess.server.ess.domain.SealAndPerson;
@ -51,11 +51,11 @@ import java.util.List;
@Slf4j
@RestController
@RequiredArgsConstructor
class EssController implements EssApi {
class ApiController implements EssApi {
private final OrgManager orgManager;
private final ContractManager contractManager;
private final EssQueryService essQueryService;
private final QueryService queryService;
private final EssClient essClient;
private final EssSealDao essSealDao;
private final EssSealPersonDao essSealPersonDao;
@ -65,12 +65,12 @@ class EssController implements EssApi {
@Override
public ApiResult<List<GetUnitAuthStatesResponse>>
getUnitAuthStates(GetUnitAuthStatesRequest request) {
return ApiResult.ok(essQueryService.getEssUnitAuthStates(request));
return ApiResult.ok(queryService.getEssUnitAuthStates(request));
}
@Override public ApiResult<GetPersonAuthStateResponse>
getPersonAuthState(GetPersonAuthStateRequest request) {
return ApiResult.ok(essQueryService.getPersonAuthState(request));
return ApiResult.ok(queryService.getPersonAuthState(request));
}
@Override
@ -95,7 +95,7 @@ class EssController implements EssApi {
@Override
public ApiResult<List<EssOrgAndSealInfo>> getOrgEnabledSeals(GetSealsRequest request) {
return ApiResult.ok(essQueryService.getOrgEnabledSeals(request));
return ApiResult.ok(queryService.getOrgEnabledSeals(request));
}
@Override

View File

@ -7,12 +7,13 @@ import cn.axzo.nanopart.ess.api.enums.EssSealState;
import cn.axzo.nanopart.ess.api.enums.EssSealType;
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.EssLog;
import cn.axzo.nanopart.ess.server.ess.ContractManager;
import cn.axzo.nanopart.ess.server.ess.OrgManager;
import cn.axzo.nanopart.ess.server.ess.domain.EssOuOpenId;
import cn.axzo.nanopart.ess.server.ess.domain.EssPersonOpenId;
import cn.axzo.nanopart.ess.server.ess.domain.OuOpenId;
import cn.axzo.nanopart.ess.server.ess.domain.PersonOpenId;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -37,7 +38,7 @@ import static cn.axzo.nanopart.ess.api.request.CallbackRequest.SealOperate;
@Slf4j
@RestController
@RequiredArgsConstructor
class EssCallbackController implements EssCallbackApi, InitializingBean {
class CallbackController implements EssCallbackApi, InitializingBean {
private final OrgManager orgManager;
private final ContractManager contractManager;
@ -50,8 +51,8 @@ class EssCallbackController implements EssCallbackApi, InitializingBean {
// 企业开通电子签回调
registerHandler(CallbackType.ORG_AUTHORIZATION_FINISH, request -> {
OrgAuthorizationFinish result = request.readMsgData(OrgAuthorizationFinish.class);
EssOuOpenId ouOpenId = EssOuOpenId.parse(result.getProxyOrganizationOpenId());
EssPersonOpenId personOpenid = EssPersonOpenId.parse(result.getProxyOperatorOpenId());
OuOpenId ouOpenId = OuOpenId.parse(result.getProxyOrganizationOpenId());
PersonOpenId personOpenid = PersonOpenId.parse(result.getProxyOperatorOpenId());
if (result.isOpenSuccess()) {
orgManager.maybeCreateOrgPersonAndSetAuthorized(ouOpenId.getOuId(), personOpenid.getPersonId());
orgManager.setOrgAuthorized(ouOpenId.getOuId(), personOpenid.getPersonId());
@ -60,7 +61,7 @@ class EssCallbackController implements EssCallbackApi, InitializingBean {
});
// 员工加入子企业的时候发送此通知
registerHandler(CallbackType.ORG_PERSON_JOIN, request -> {
EssPersonOpenId openId = EssPersonOpenId.parse(request.readMsgData(OrgPersonJoin.class).getProxyOperatorOpenId());
PersonOpenId openId = PersonOpenId.parse(request.readMsgData(OrgPersonJoin.class).getProxyOperatorOpenId());
orgManager.maybeCreateOrgPersonAndSetAuthorized(openId.getOuId(), openId.getPersonId());
orgManager.setPersonSealAllAuthorized(openId.getOuId(), openId.getPersonId());
return openId.getPersonId();
@ -68,12 +69,12 @@ class EssCallbackController implements EssCallbackApi, InitializingBean {
// 印章回调
registerHandler(CallbackType.SEAL_OPERATE, request -> {
SealOperate operate = request.readMsgData(SealOperate.class);
EssOuOpenId ouOpenId = EssOuOpenId.parse(operate.getProxyOrganizationOpenId());
EssPersonOpenId operatorOpenId = EssPersonOpenId.parse(operate.getProxyOperatorOpenId());
EssPersonOpenId authorizedPersonOpenId =
OuOpenId ouOpenId = OuOpenId.parse(operate.getProxyOrganizationOpenId());
PersonOpenId operatorOpenId = PersonOpenId.parse(operate.getProxyOperatorOpenId());
PersonOpenId authorizedPersonOpenId =
StringUtils.isBlank(operate.getAuthorizedOperatorOpenId())
? EssPersonOpenId.none()
: EssPersonOpenId.parse(operate.getAuthorizedOperatorOpenId());
? PersonOpenId.none()
: PersonOpenId.parse(operate.getAuthorizedOperatorOpenId());
orgManager.maybeAddSeal(ouOpenId.getOuId(), operate.getSealId(),
EssSealType.fromEssCode(operate.getSealType()));
// 印章创建人会自动获得授权
@ -101,6 +102,12 @@ class EssCallbackController implements EssCallbackApi, InitializingBean {
log.warn("unknown contract state: {}", changes.getFlowStatus());
return changes.getFlowId();
});
registerHandler(CallbackType.SUPER_ADMIN_CHANGED, request -> {
SuperAdminChanged changes = request.readMsgData(SuperAdminChanged.class);
PersonOpenId admin = PersonOpenId.parse(changes.getChangeToUserOpenId());
orgManager.changeSuperAdmin(admin.getOuId(), admin.getPersonId());
return admin.getOuId();
});
}
@Override @Transactional
@ -145,7 +152,8 @@ class EssCallbackController implements EssCallbackApi, InitializingBean {
ORG_AUTHORIZATION_FINISH("OrgOpenTsignBiz"),
ORG_PERSON_JOIN("VerifyStaffInfo"),
SEAL_OPERATE("OperateSeal"),
CONTRACT_STATE_CHANGED("FlowStatusChange");
CONTRACT_STATE_CHANGED("FlowStatusChange"),
SUPER_ADMIN_CHANGED("SuperAdminChange");
final String msgType;

View File

@ -1,21 +0,0 @@
package cn.axzo.nanopart.ess.server.ess.domain;
import cn.axzo.nanopart.ess.server.entity.EssOrg;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import java.util.List;
/**
* @author yanglin
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class EssOrgs {
private final List<EssOrg> orgs;
public static EssOrgs wrap(List<EssOrg> orgs) {
return new EssOrgs(orgs);
}
}

View File

@ -9,16 +9,16 @@ import lombok.RequiredArgsConstructor;
*/
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class EssOuOpenId {
public class OuOpenId {
private final Long ouId;
public static EssOuOpenId create(Long ouId) {
return new EssOuOpenId(ouId);
public static OuOpenId create(Long ouId) {
return new OuOpenId(ouId);
}
public static EssOuOpenId parse(String openId) {
return new EssOuOpenId(Long.parseLong(openId));
public static OuOpenId parse(String openId) {
return new OuOpenId(Long.parseLong(openId));
}
public String toOpenId() {

View File

@ -9,24 +9,24 @@ import lombok.RequiredArgsConstructor;
*/
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class EssPersonOpenId {
public class PersonOpenId {
private static final EssPersonOpenId NONE = create(0L, 0L);
private static final PersonOpenId NONE = create(0L, 0L);
private final Long ouId;
private final Long personId;
public static EssPersonOpenId none() {
public static PersonOpenId none() {
return NONE;
}
public static EssPersonOpenId create(Long ouId, Long personId) {
return new EssPersonOpenId(ouId, personId);
public static PersonOpenId create(Long ouId, Long personId) {
return new PersonOpenId(ouId, personId);
}
public static EssPersonOpenId parse(String openId) {
public static PersonOpenId parse(String openId) {
String[] split = openId.split("_");
return new EssPersonOpenId(Long.parseLong(split[0]), Long.parseLong(split[1]));
return new PersonOpenId(Long.parseLong(split[0]), Long.parseLong(split[1]));
}
public String toOpenId() {

View File

@ -11,12 +11,12 @@ import java.util.Optional;
* @author yanglin
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class EssSealPersons {
public class SealPersons {
private final List<EssSealPerson> person;
public static EssSealPersons wrap(List<EssSealPerson> person) {
return new EssSealPersons(person);
public static SealPersons wrap(List<EssSealPerson> person) {
return new SealPersons(person);
}
public boolean containsPerson(Long personId) {