REQ-3581: 该签署位已签署, 无法再次签署
This commit is contained in:
parent
fc06c934e3
commit
5229a74397
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.dao;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.contract.Approver;
|
||||
@ -21,73 +22,51 @@ import java.util.Optional;
|
||||
@Repository("essContractDao")
|
||||
public class EssContractDao extends ServiceImpl<EssContractMapper, EssContract> {
|
||||
|
||||
public Optional<EssContract> findByIdempotentCode(String appCode, String idempotentCode) {
|
||||
return lambdaQuery()
|
||||
.eq(EssContract::getAppCode, appCode)
|
||||
.eq(EssContract::getIdempotentCode, idempotentCode)
|
||||
.oneOpt();
|
||||
}
|
||||
public Optional<EssContract> findByIdempotentCode(String appCode, String idempotentCode) {
|
||||
return lambdaQuery().eq(EssContract::getAppCode, appCode).eq(EssContract::getIdempotentCode,
|
||||
idempotentCode).oneOpt();
|
||||
}
|
||||
|
||||
public EssContract getOrThrow(String essContractId) {
|
||||
EssContract contract = findOrNull(essContractId);
|
||||
BizAssertions.assertNotNull(contract, "找不到合同信息, essContractId={}", essContractId);
|
||||
return contract;
|
||||
}
|
||||
public EssContract getOrThrow(String essContractId) {
|
||||
EssContract contract = findOrNull(essContractId);
|
||||
BizAssertions.assertNotNull(contract, "找不到合同信息, essContractId={}", essContractId);
|
||||
return contract;
|
||||
}
|
||||
|
||||
public EssContract findOrNull(String essContractId) {
|
||||
return find(essContractId, false).orElse(null);
|
||||
}
|
||||
public EssContract findOrNull(String essContractId) {
|
||||
return find(essContractId, false).orElse(null);
|
||||
}
|
||||
|
||||
public EssContract findForUpdateOrNull(String essContractId) {
|
||||
return find(essContractId, true).orElse(null);
|
||||
}
|
||||
public EssContract findForUpdateOrNull(String essContractId) {
|
||||
return find(essContractId, true).orElse(null);
|
||||
}
|
||||
|
||||
private Optional<EssContract> find(String essContractId, boolean forUpdate) {
|
||||
return lambdaQuery()
|
||||
.eq(EssContract::getEssContractId, essContractId)
|
||||
.last(forUpdate, "FOR UPDATE")
|
||||
.oneOpt();
|
||||
}
|
||||
private Optional<EssContract> find(String essContractId, boolean forUpdate) {
|
||||
return lambdaQuery().eq(EssContract::getEssContractId, essContractId).last(forUpdate, "FOR UPDATE").oneOpt();
|
||||
}
|
||||
|
||||
public void setEssContractCreated(Long id,
|
||||
String flowId,
|
||||
List<String> essFileIds,
|
||||
List<Approver> approvers) {
|
||||
lambdaUpdate()
|
||||
.eq(EssContract::getId, id)
|
||||
.set(EssContract::getEssFieldIds, JSON.toJSONString(essFileIds))
|
||||
.set(EssContract::getEssContractId, flowId)
|
||||
.set(EssContract::getApprovers, JSON.toJSONString(approvers))
|
||||
.update();
|
||||
}
|
||||
public void setEssContractCreated(Long id, String flowId, List<String> essFileIds, List<Approver> approvers) {
|
||||
lambdaUpdate().eq(EssContract::getId, id).set(EssContract::getEssFieldIds, JSON.toJSONString(essFileIds)).set(
|
||||
EssContract::getEssContractId, flowId).set(EssContract::getApprovers,
|
||||
JSON.toJSONString(approvers)).update();
|
||||
}
|
||||
|
||||
public void updateState(EssContract contract,
|
||||
EssContractState state,
|
||||
List<EssApproveDetail> approveDetailsOrPreserve,
|
||||
String essMessage) {
|
||||
lambdaUpdate()
|
||||
.eq(EssContract::getId, contract.getId())
|
||||
.set(EssContract::getState, state)
|
||||
.set(StringUtils.isNotBlank(essMessage), EssContract::getEssMessage, essMessage)
|
||||
.set(CollectionUtils.isNotEmpty(approveDetailsOrPreserve),
|
||||
EssContract::getApproveDetails,
|
||||
approveDetailsOrPreserve == null ? "[]" : JSON.toJSONString(approveDetailsOrPreserve))
|
||||
.update();
|
||||
}
|
||||
public void updateState(EssContract contract, EssContractState state,
|
||||
List<EssApproveDetail> approveDetailsOrPreserve, String essMessage) {
|
||||
lambdaUpdate().eq(EssContract::getId, contract.getId()).set(EssContract::getState, state).set(
|
||||
StringUtils.isNotBlank(essMessage), EssContract::getEssMessage, essMessage).set(
|
||||
CollectionUtils.isNotEmpty(approveDetailsOrPreserve), EssContract::getApproveDetails,
|
||||
approveDetailsOrPreserve == null ? "[]" : JSON.toJSONString(approveDetailsOrPreserve)).update();
|
||||
}
|
||||
|
||||
public void setOssFileKey(EssContract contract, String fileKey) {
|
||||
lambdaUpdate()
|
||||
.eq(EssContract::getId, contract.getId())
|
||||
.set(EssContract::getOssFileKey, fileKey)
|
||||
.update();
|
||||
}
|
||||
public void setOssFileKey(EssContract contract, String fileKey) {
|
||||
lambdaUpdate().eq(EssContract::getId, contract.getId()).set(EssContract::getOssFileKey, fileKey).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();
|
||||
}
|
||||
}
|
||||
public void updateExt(EssContract contract) {
|
||||
if (contract.getRecordExt() == null)
|
||||
return;
|
||||
lambdaUpdate().eq(EssContract::getId, contract.getId()).set(EssContract::getRecordExt,
|
||||
JSON.toJSONString(contract.getRecordExt())).update();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.dao;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.utils.YesOrNo;
|
||||
@ -14,30 +15,30 @@ import org.springframework.stereotype.Repository;
|
||||
@Repository("essLogDao")
|
||||
public class EssLogDao extends ServiceImpl<EssLogMapper, EssLog> {
|
||||
|
||||
public void logRequest(String context, Object subject, Object request) {
|
||||
log(context, subject, "request", request);
|
||||
}
|
||||
public void logRequest(String context, Object subject, Object request) {
|
||||
log(context, subject, "request", request);
|
||||
}
|
||||
|
||||
public void log(String context, Object subject, Object... logContents) {
|
||||
log(null, context, subject, logContents);
|
||||
}
|
||||
public void log(String context, Object subject, Object... logContents) {
|
||||
log(null, context, subject, logContents);
|
||||
}
|
||||
|
||||
public void log(Exception exception, String context, Object subject, Object... logContents) {
|
||||
EssLog log = new EssLog();
|
||||
log.setContext(context);
|
||||
log.setSubject(String.valueOf(subject));
|
||||
if (exception != null) {
|
||||
log.setIsError(YesOrNo.YES);
|
||||
log.addLogContent("exception", Throwables.getStackTraceAsString(exception));
|
||||
}
|
||||
if (logContents != null && logContents.length > 0) {
|
||||
BizAssertions.assertTrue(logContents.length % 2 == 0, "logContents must be even");
|
||||
for (int i = 0; i < logContents.length; i += 2) {
|
||||
BizAssertions.assertTrue(logContents[i] instanceof String, "logContents key must be String");
|
||||
log.addLogContent((String) logContents[i], logContents[i + 1]);
|
||||
}
|
||||
}
|
||||
save(log);
|
||||
}
|
||||
public void log(Exception exception, String context, Object subject, Object... logContents) {
|
||||
EssLog log = new EssLog();
|
||||
log.setContext(context);
|
||||
log.setSubject(String.valueOf(subject));
|
||||
if (exception != null) {
|
||||
log.setIsError(YesOrNo.YES);
|
||||
log.addLogContent("exception", Throwables.getStackTraceAsString(exception));
|
||||
}
|
||||
if (logContents != null && logContents.length > 0) {
|
||||
BizAssertions.assertTrue(logContents.length % 2 == 0, "logContents must be even");
|
||||
for (int i = 0; i < logContents.length; i += 2) {
|
||||
BizAssertions.assertTrue(logContents[i] instanceof String, "logContents key must be String");
|
||||
log.addLogContent((String) logContents[i], logContents[i + 1]);
|
||||
}
|
||||
}
|
||||
save(log);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.dao;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.OrgPerson;
|
||||
@ -20,49 +21,38 @@ import java.util.Optional;
|
||||
@Repository("essOrgDao")
|
||||
public class EssOrgDao extends ServiceImpl<EssOrgMapper, EssOrg> {
|
||||
|
||||
public List<EssOrg> getByOuIds(Collection<Long> ouIds) {
|
||||
if (CollectionUtils.isEmpty(ouIds))
|
||||
return Collections.emptyList();
|
||||
return lambdaQuery().in(EssOrg::getOuId, ouIds).list();
|
||||
}
|
||||
public List<EssOrg> getByOuIds(Collection<Long> ouIds) {
|
||||
if (CollectionUtils.isEmpty(ouIds))
|
||||
return Collections.emptyList();
|
||||
return lambdaQuery().in(EssOrg::getOuId, ouIds).list();
|
||||
}
|
||||
|
||||
public EssOrg findOrNull(Long ouId) {
|
||||
return find(ouId, false).orElse(null);
|
||||
}
|
||||
public EssOrg findOrNull(Long ouId) {
|
||||
return find(ouId, false).orElse(null);
|
||||
}
|
||||
|
||||
public EssOrg findForUpdateOrNull(Long ouId) {
|
||||
return find(ouId, true).orElse(null);
|
||||
}
|
||||
public EssOrg findForUpdateOrNull(Long ouId) {
|
||||
return find(ouId, true).orElse(null);
|
||||
}
|
||||
|
||||
private Optional<EssOrg> find(Long ouId, boolean forUpdate) {
|
||||
return lambdaQuery()
|
||||
.eq(EssOrg::getOuId, ouId)
|
||||
.last(forUpdate, "FOR UPDATE")
|
||||
.oneOpt();
|
||||
}
|
||||
private Optional<EssOrg> find(Long ouId, boolean forUpdate) {
|
||||
return lambdaQuery().eq(EssOrg::getOuId, ouId).last(forUpdate, "FOR UPDATE").oneOpt();
|
||||
}
|
||||
|
||||
public void setOrgAuthorized(OrgPerson superAdmin) {
|
||||
lambdaUpdate()
|
||||
.eq(EssOrg::getOuId, superAdmin.getOuId())
|
||||
.set(EssOrg::getIsAuthorized, YesOrNo.YES)
|
||||
.set(EssOrg::getSuperAdminPersonId, superAdmin.getPersonId())
|
||||
.update();
|
||||
}
|
||||
public void setOrgAuthorized(OrgPerson superAdmin) {
|
||||
lambdaUpdate().eq(EssOrg::getOuId, superAdmin.getOuId()).set(EssOrg::getIsAuthorized, YesOrNo.YES).set(
|
||||
EssOrg::getSuperAdminPersonId, superAdmin.getPersonId()).update();
|
||||
}
|
||||
|
||||
public void changeSuperAdmin(Long ouId, Long personId) {
|
||||
lambdaUpdate()
|
||||
.eq(EssOrg::getOuId, ouId)
|
||||
.set(EssOrg::getSuperAdminPersonId, personId)
|
||||
.update();
|
||||
}
|
||||
public void changeSuperAdmin(Long ouId, Long personId) {
|
||||
lambdaUpdate().eq(EssOrg::getOuId, ouId).set(EssOrg::getSuperAdminPersonId, personId).update();
|
||||
}
|
||||
|
||||
public void updateExt(EssOrg org) {
|
||||
if (org.getRecordExt() == null)
|
||||
return;
|
||||
lambdaUpdate()
|
||||
.eq(EssOrg::getId, org.getId())
|
||||
.set(EssOrg::getRecordExt, JSON.toJSONString(org.getRecordExt()))
|
||||
.update();
|
||||
}
|
||||
public void updateExt(EssOrg org) {
|
||||
if (org.getRecordExt() == null)
|
||||
return;
|
||||
lambdaUpdate().eq(EssOrg::getId, org.getId()).set(EssOrg::getRecordExt,
|
||||
JSON.toJSONString(org.getRecordExt())).update();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.dao;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.OrgPerson;
|
||||
@ -19,40 +20,32 @@ import java.util.Optional;
|
||||
@Repository("essPersonDao")
|
||||
public class EssPersonDao extends ServiceImpl<EssPersonMapper, EssPerson> {
|
||||
|
||||
public EssPerson findOrNull(OrgPerson person) {
|
||||
return findOrNull(person.getOuId(), person.getPersonId());
|
||||
}
|
||||
public EssPerson findOrNull(OrgPerson person) {
|
||||
return findOrNull(person.getOuId(), person.getPersonId());
|
||||
}
|
||||
|
||||
public EssPerson findOrNull(Long ouId, Long personId) {
|
||||
return find(ouId, personId, false).orElse(null);
|
||||
}
|
||||
public EssPerson findOrNull(Long ouId, Long personId) {
|
||||
return find(ouId, personId, false).orElse(null);
|
||||
}
|
||||
|
||||
public Optional<EssPerson> find(OrgPerson person, boolean forUpdate) {
|
||||
return find(person.getOuId(), person.getPersonId(), forUpdate);
|
||||
}
|
||||
public Optional<EssPerson> find(OrgPerson person, boolean forUpdate) {
|
||||
return find(person.getOuId(), person.getPersonId(), forUpdate);
|
||||
}
|
||||
|
||||
private Optional<EssPerson> find(Long ouId, Long personId, boolean forUpdate) {
|
||||
return lambdaQuery()
|
||||
.eq(EssPerson::getOuId, ouId)
|
||||
.eq(EssPerson::getPersonId, personId)
|
||||
.last(forUpdate, "FOR UPDATE")
|
||||
.oneOpt();
|
||||
}
|
||||
private Optional<EssPerson> find(Long ouId, Long personId, boolean forUpdate) {
|
||||
return lambdaQuery().eq(EssPerson::getOuId, ouId).eq(EssPerson::getPersonId, personId).last(forUpdate,
|
||||
"FOR UPDATE").oneOpt();
|
||||
}
|
||||
|
||||
public void setOrgPersonState(EssPerson person, EssPersonState state) {
|
||||
lambdaUpdate()
|
||||
.eq(EssPerson::getOuId, person.getOuId())
|
||||
.eq(EssPerson::getId, person.getId())
|
||||
.set(EssPerson::getState, state)
|
||||
.update();
|
||||
}
|
||||
public void setOrgPersonState(EssPerson person, EssPersonState state) {
|
||||
lambdaUpdate().eq(EssPerson::getOuId, person.getOuId()).eq(EssPerson::getId, person.getId()).set(
|
||||
EssPerson::getState, state).update();
|
||||
}
|
||||
|
||||
public List<EssPerson> getByPersonIds(Collection<Long> personIds) {
|
||||
if (CollectionUtils.isEmpty(personIds))
|
||||
return Collections.emptyList();
|
||||
return lambdaQuery()
|
||||
.in(EssPerson::getPersonId, personIds)
|
||||
.list();
|
||||
}
|
||||
public List<EssPerson> getByPersonIds(Collection<Long> personIds) {
|
||||
if (CollectionUtils.isEmpty(personIds))
|
||||
return Collections.emptyList();
|
||||
return lambdaQuery().in(EssPerson::getPersonId, personIds).list();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.dao;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.enums.EssSealState;
|
||||
@ -14,17 +15,12 @@ import java.util.Optional;
|
||||
@Repository("essSealDao")
|
||||
public class EssSealDao extends ServiceImpl<EssSealMapper, EssSeal> {
|
||||
|
||||
public Optional<EssSeal> findByEssSealId(String essSealId) {
|
||||
return lambdaQuery()
|
||||
.eq(EssSeal::getEssSealId, essSealId)
|
||||
.oneOpt();
|
||||
}
|
||||
public Optional<EssSeal> findByEssSealId(String essSealId) {
|
||||
return lambdaQuery().eq(EssSeal::getEssSealId, essSealId).oneOpt();
|
||||
}
|
||||
|
||||
public void updateState(String essSealId, EssSealState state) {
|
||||
lambdaUpdate()
|
||||
.eq(EssSeal::getEssSealId, essSealId)
|
||||
.set(EssSeal::getState, state)
|
||||
.update();
|
||||
}
|
||||
public void updateState(String essSealId, EssSealState state) {
|
||||
lambdaUpdate().eq(EssSeal::getEssSealId, essSealId).set(EssSeal::getState, state).update();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.dao;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.utils.YesOrNo;
|
||||
@ -16,48 +17,33 @@ import java.util.Optional;
|
||||
@Repository("essSealPersonDao")
|
||||
public class EssSealPersonDao extends ServiceImpl<EssSealPersonMapper, EssSealPerson> {
|
||||
|
||||
public void setPersonAuthorized(String essSealId, Long personId, Long authorizedByPersonId) {
|
||||
lambdaUpdate()
|
||||
.eq(EssSealPerson::getEssSealId, essSealId)
|
||||
.eq(EssSealPerson::getPersonId, personId)
|
||||
.set(authorizedByPersonId != null && authorizedByPersonId > 0,
|
||||
EssSealPerson::getAuthorizedByPersonId, authorizedByPersonId)
|
||||
.set(EssSealPerson::getIsAuthorized, YesOrNo.YES)
|
||||
.set(EssSealPerson::getAuthorizeTime, new Date())
|
||||
.update();
|
||||
}
|
||||
public void setPersonAuthorized(String essSealId, Long personId, Long authorizedByPersonId) {
|
||||
lambdaUpdate().eq(EssSealPerson::getEssSealId, essSealId).eq(EssSealPerson::getPersonId, personId).set(
|
||||
authorizedByPersonId != null && authorizedByPersonId > 0, EssSealPerson::getAuthorizedByPersonId,
|
||||
authorizedByPersonId).set(EssSealPerson::getIsAuthorized, YesOrNo.YES).set(EssSealPerson::getAuthorizeTime,
|
||||
new Date()).update();
|
||||
}
|
||||
|
||||
public void removeSealAuthorization(String essSealId, Long personId) {
|
||||
lambdaUpdate()
|
||||
.eq(EssSealPerson::getEssSealId, essSealId)
|
||||
.eq(EssSealPerson::getPersonId, personId)
|
||||
.set(EssSealPerson::getIsAuthorized, YesOrNo.NO)
|
||||
.update();
|
||||
}
|
||||
public void removeSealAuthorization(String essSealId, Long personId) {
|
||||
lambdaUpdate().eq(EssSealPerson::getEssSealId, essSealId).eq(EssSealPerson::getPersonId, personId).set(
|
||||
EssSealPerson::getIsAuthorized, YesOrNo.NO).update();
|
||||
}
|
||||
|
||||
public Optional<EssSealPerson> find(String essSealId, Long personId) {
|
||||
return find(essSealId, personId, false);
|
||||
}
|
||||
public Optional<EssSealPerson> find(String essSealId, Long personId) {
|
||||
return find(essSealId, personId, false);
|
||||
}
|
||||
|
||||
public Optional<EssSealPerson> find(String essSealId, Long personId, boolean forUpdate) {
|
||||
return lambdaQuery()
|
||||
.eq(EssSealPerson::getEssSealId, essSealId)
|
||||
.eq(EssSealPerson::getPersonId, personId)
|
||||
.last(forUpdate, "FOR UPDATE")
|
||||
.oneOpt();
|
||||
}
|
||||
public Optional<EssSealPerson> find(String essSealId, Long personId, boolean forUpdate) {
|
||||
return lambdaQuery().eq(EssSealPerson::getEssSealId, essSealId).eq(EssSealPerson::getPersonId, personId).last(
|
||||
forUpdate, "FOR UPDATE").oneOpt();
|
||||
}
|
||||
|
||||
public List<EssSealPerson> getByPersonId(Long ouId, Long personId) {
|
||||
return lambdaQuery()
|
||||
.eq(EssSealPerson::getOuId, ouId)
|
||||
.eq(EssSealPerson::getPersonId, personId)
|
||||
.list();
|
||||
}
|
||||
public List<EssSealPerson> getByPersonId(Long ouId, Long personId) {
|
||||
return lambdaQuery().eq(EssSealPerson::getOuId, ouId).eq(EssSealPerson::getPersonId, personId).list();
|
||||
}
|
||||
|
||||
public List<EssSealPerson> get(String essSealId) {
|
||||
return lambdaQuery()
|
||||
.eq(EssSealPerson::getEssSealId, essSealId)
|
||||
.list();
|
||||
}
|
||||
public List<EssSealPerson> get(String essSealId) {
|
||||
return lambdaQuery().eq(EssSealPerson::getEssSealId, essSealId).list();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.entity;
|
||||
|
||||
import cn.axzo.foundation.dao.support.mysql.type.BaseListTypeHandler;
|
||||
@ -27,171 +28,167 @@ import java.util.List;
|
||||
@TableName(value = "ess_contract", autoResultMap = true)
|
||||
public class EssContract extends BaseEntity<EssContract> {
|
||||
|
||||
/**
|
||||
* 发起合同的应用或业务场景
|
||||
*/
|
||||
private String appCode;
|
||||
/**
|
||||
* 发起合同的应用或业务场景
|
||||
*/
|
||||
private String appCode;
|
||||
|
||||
/**
|
||||
* 业务编码
|
||||
*/
|
||||
private String bizCode;
|
||||
/**
|
||||
* 业务编码
|
||||
*/
|
||||
private String bizCode;
|
||||
|
||||
/**
|
||||
* 幂等编码
|
||||
*/
|
||||
private String idempotentCode;
|
||||
/**
|
||||
* 幂等编码
|
||||
*/
|
||||
private String idempotentCode;
|
||||
|
||||
/**
|
||||
* 合同发起方单位id
|
||||
*/
|
||||
private Long creatorOuId;
|
||||
/**
|
||||
* 合同发起方单位id
|
||||
*/
|
||||
private Long creatorOuId;
|
||||
|
||||
/**
|
||||
* 合同发起方人员id
|
||||
*/
|
||||
private Long creatorPersonId;
|
||||
/**
|
||||
* 合同发起方人员id
|
||||
*/
|
||||
private Long creatorPersonId;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 电子签那边的合同id
|
||||
*/
|
||||
private String essContractId;
|
||||
/**
|
||||
* 电子签那边的合同id
|
||||
*/
|
||||
private String essContractId;
|
||||
|
||||
/**
|
||||
* 腾讯电子签的资源id
|
||||
*/
|
||||
@TableField(typeHandler = StringListHandler.class)
|
||||
private List<String> essFieldIds;
|
||||
/**
|
||||
* 腾讯电子签的资源id
|
||||
*/
|
||||
@TableField(typeHandler = StringListHandler.class)
|
||||
private List<String> essFieldIds;
|
||||
|
||||
/**
|
||||
* 合同状态. INIT: 合同创建, PART: 合同签署中, ALL: 合同签署完成, REJECT: 合同拒签, CANCEL: 合同撤回, WILLEXPIRE: 合同即将过期, DEADLINE: 合同流签(合同过期), RELIEVED: 解除协议(已解除), INVALID: 合同已失效, EXCEPTION: 合同异常
|
||||
*/
|
||||
private EssContractState state;
|
||||
/**
|
||||
* 合同状态. INIT: 合同创建, PART: 合同签署中, ALL: 合同签署完成, REJECT: 合同拒签, CANCEL: 合同撤回, WILLEXPIRE: 合同即将过期, DEADLINE: 合同流签(合同过期), RELIEVED: 解除协议(已解除), INVALID: 合同已失效, EXCEPTION: 合同异常
|
||||
*/
|
||||
private EssContractState state;
|
||||
|
||||
/**
|
||||
* 合并签署方信息
|
||||
*/
|
||||
@TableField(typeHandler = ApproverListHandler.class)
|
||||
private List<Approver> approvers;
|
||||
/**
|
||||
* 合并签署方信息
|
||||
*/
|
||||
@TableField(typeHandler = ApproverListHandler.class)
|
||||
private List<Approver> approvers;
|
||||
|
||||
/**
|
||||
* 签署信息(扩展字段)
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private Assignment assignment;
|
||||
/**
|
||||
* 签署信息(扩展字段)
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private Assignment assignment;
|
||||
|
||||
/**
|
||||
* 签署方的签署情况
|
||||
*/
|
||||
@TableField(typeHandler = ApproveDetailListHandler.class)
|
||||
private List<EssApproveDetail> approveDetails;
|
||||
/**
|
||||
* 签署方的签署情况
|
||||
*/
|
||||
@TableField(typeHandler = ApproveDetailListHandler.class)
|
||||
private List<EssApproveDetail> approveDetails;
|
||||
|
||||
/**
|
||||
* 腾讯电子签那边的消息
|
||||
*/
|
||||
private String essMessage;
|
||||
/**
|
||||
* 腾讯电子签那边的消息
|
||||
*/
|
||||
private String essMessage;
|
||||
|
||||
/**
|
||||
* 合同oss信息
|
||||
*/
|
||||
private String ossFileKey;
|
||||
/**
|
||||
* 合同oss信息
|
||||
*/
|
||||
private String ossFileKey;
|
||||
|
||||
/**
|
||||
* 扩展字段
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private RecordExt recordExt;
|
||||
/**
|
||||
* 扩展字段
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private RecordExt recordExt;
|
||||
|
||||
public boolean isSavedOnOss() {
|
||||
return StringUtils.isNotBlank(ossFileKey);
|
||||
}
|
||||
public boolean isSavedOnOss() {
|
||||
return StringUtils.isNotBlank(ossFileKey);
|
||||
}
|
||||
|
||||
public RecordExt getOrCreateExt() {
|
||||
if (recordExt == null)
|
||||
recordExt = new RecordExt();
|
||||
return recordExt;
|
||||
}
|
||||
public RecordExt getOrCreateExt() {
|
||||
if (recordExt == null)
|
||||
recordExt = new RecordExt();
|
||||
return recordExt;
|
||||
}
|
||||
|
||||
public Assignment getOrCreateAssignment() {
|
||||
if (assignment == null)
|
||||
assignment = new Assignment();
|
||||
return assignment;
|
||||
}
|
||||
public Assignment getOrCreateAssignment() {
|
||||
if (assignment == null)
|
||||
assignment = new Assignment();
|
||||
return assignment;
|
||||
}
|
||||
|
||||
public boolean isOrgSigned(Long ouId) {
|
||||
if (approveDetails == null)
|
||||
return false;
|
||||
for (EssApproveDetail detail : approveDetails) {
|
||||
if (detail.getSignPerson() == null) continue;
|
||||
if (ouId.equals(detail.getSignPerson().getOuId())
|
||||
&& detail.getState() == EssContractApproveState.ACCEPT)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public boolean isOrgSigned(Long ouId) {
|
||||
if (approveDetails == null)
|
||||
return false;
|
||||
for (EssApproveDetail detail : approveDetails) {
|
||||
if (detail.getSignPerson() == null)
|
||||
continue;
|
||||
if (ouId.equals(detail.getSignPerson().getOuId()) && detail.getState() == EssContractApproveState.ACCEPT)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public int approverSize() {
|
||||
return approvers == null ? 0 : approvers.size();
|
||||
}
|
||||
public int approverSize() {
|
||||
return approvers == null ? 0 : approvers.size();
|
||||
}
|
||||
|
||||
public Approver getApprover(Integer idx) {
|
||||
BizAssertions.assertNotNull(approvers, "approver is null");
|
||||
return approvers == null ? null : approvers.get(idx);
|
||||
}
|
||||
public Approver getApprover(Integer idx) {
|
||||
BizAssertions.assertNotNull(approvers, "approver is null");
|
||||
return approvers == null ? null : approvers.get(idx);
|
||||
}
|
||||
|
||||
public Approver getApproverOrThrow(String recipientId) {
|
||||
Approver approver = approvers.stream()
|
||||
.filter(a -> a.getEssRecipientId().equals(recipientId))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
BizAssertions.assertNotNull(approver, "无效的签署编号: {}", recipientId);
|
||||
return approver;
|
||||
}
|
||||
public Approver getApproverOrThrow(String recipientId) {
|
||||
Approver approver = approvers.stream().filter(
|
||||
a -> a.getEssRecipientId().equals(recipientId)).findFirst().orElse(null);
|
||||
BizAssertions.assertNotNull(approver, "无效的签署编号: {}", recipientId);
|
||||
return approver;
|
||||
}
|
||||
|
||||
public EssApproveDetail getApproveDetailOrThrow(String recipientId) {
|
||||
EssApproveDetail detail = approveDetails.stream()
|
||||
.filter(d -> d.getRecipientId().equals(recipientId))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
BizAssertions.assertNotNull(detail, "无效的签署编号: {}", recipientId);
|
||||
return detail;
|
||||
}
|
||||
public EssApproveDetail getApproveDetailOrThrow(String recipientId) {
|
||||
EssApproveDetail detail = approveDetails.stream().filter(
|
||||
d -> d.getRecipientId().equals(recipientId)).findFirst().orElse(null);
|
||||
BizAssertions.assertNotNull(detail, "无效的签署编号: {}", recipientId);
|
||||
return detail;
|
||||
}
|
||||
|
||||
public boolean isSignPersonsPreset() {
|
||||
if (approvers == null)
|
||||
return false;
|
||||
return approvers.stream().allMatch(Approver::isSignPersonPreset);
|
||||
}
|
||||
public boolean isSignPersonsPreset() {
|
||||
if (approvers == null)
|
||||
return false;
|
||||
return approvers.stream().allMatch(Approver::isSignPersonPreset);
|
||||
}
|
||||
|
||||
public boolean shouldDownloadContract() {
|
||||
return isFinalState() || getOrCreateExt().isSaveContractSnapshotArbitrarily();
|
||||
}
|
||||
public boolean shouldDownloadContract() {
|
||||
return isFinalState() || getOrCreateExt().isSaveContractSnapshotArbitrarily();
|
||||
}
|
||||
|
||||
public boolean isFinalState() {
|
||||
return state.isFinalState();
|
||||
}
|
||||
public boolean isFinalState() {
|
||||
return state.isFinalState();
|
||||
}
|
||||
|
||||
public Constraint getConstraint() {
|
||||
return assignment == null ? null : assignment.getConstraint();
|
||||
}
|
||||
public Constraint getConstraint() {
|
||||
return assignment == null ? null : assignment.getConstraint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
public static class RecordExt {
|
||||
private boolean saveContractSnapshotArbitrarily;
|
||||
}
|
||||
@Setter
|
||||
@Getter
|
||||
public static class RecordExt {
|
||||
private boolean saveContractSnapshotArbitrarily;
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
// @formatter:off
|
||||
public static class StringListHandler
|
||||
extends BaseListTypeHandler<String> {}
|
||||
public static class ApproveDetailListHandler
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.entity;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.utils.YesOrNo;
|
||||
@ -18,40 +19,40 @@ import lombok.Setter;
|
||||
@TableName(value = "ess_log", autoResultMap = true)
|
||||
public class EssLog extends BaseEntity<EssLog> {
|
||||
|
||||
/**
|
||||
* 上下文
|
||||
*/
|
||||
private String context;
|
||||
/**
|
||||
* 上下文
|
||||
*/
|
||||
private String context;
|
||||
|
||||
/**
|
||||
* 主体
|
||||
*/
|
||||
private String subject;
|
||||
/**
|
||||
* 主体
|
||||
*/
|
||||
private String subject;
|
||||
|
||||
/**
|
||||
* 腾讯返回的请求id
|
||||
*/
|
||||
private String requestId;
|
||||
/**
|
||||
* 腾讯返回的请求id
|
||||
*/
|
||||
private String requestId;
|
||||
|
||||
/**
|
||||
* 是否异常
|
||||
*/
|
||||
private YesOrNo isError;
|
||||
/**
|
||||
* 是否异常
|
||||
*/
|
||||
private YesOrNo isError;
|
||||
|
||||
/**
|
||||
* 日志内容
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private JSONObject logContent;
|
||||
/**
|
||||
* 日志内容
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private JSONObject logContent;
|
||||
|
||||
public void addLogContent(String key, Object value) {
|
||||
if (logContent == null)
|
||||
logContent = new JSONObject();
|
||||
logContent.put(key, value);
|
||||
}
|
||||
public void addLogContent(String key, Object value) {
|
||||
if (logContent == null)
|
||||
logContent = new JSONObject();
|
||||
logContent.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.entity;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.utils.YesOrNo;
|
||||
@ -19,64 +20,65 @@ import java.util.Set;
|
||||
@TableName(value = "ess_org", autoResultMap = true)
|
||||
public class EssOrg extends BaseEntity<EssOrg> {
|
||||
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
private Long ouId;
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
private Long ouId;
|
||||
|
||||
/**
|
||||
* 单位名称
|
||||
*/
|
||||
private String ouName;
|
||||
/**
|
||||
* 单位名称
|
||||
*/
|
||||
private String ouName;
|
||||
|
||||
/**
|
||||
* 是否已经认证. YES: 已认证, NO: 未认证
|
||||
*/
|
||||
private YesOrNo isAuthorized;
|
||||
/**
|
||||
* 是否已经认证. YES: 已认证, NO: 未认证
|
||||
*/
|
||||
private YesOrNo isAuthorized;
|
||||
|
||||
/**
|
||||
* 超级管理员人员id
|
||||
*/
|
||||
private Long superAdminPersonId;
|
||||
/**
|
||||
* 超级管理员人员id
|
||||
*/
|
||||
private Long superAdminPersonId;
|
||||
|
||||
/**
|
||||
* 单位记录创建人id
|
||||
*/
|
||||
private Long createByPersonId;
|
||||
/**
|
||||
* 单位记录创建人id
|
||||
*/
|
||||
private Long createByPersonId;
|
||||
|
||||
/**
|
||||
* 扩展字段
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private RecordExt recordExt;
|
||||
/**
|
||||
* 扩展字段
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private RecordExt recordExt;
|
||||
|
||||
public boolean isSuperAdmin(Long personId) {
|
||||
return superAdminPersonId != null && superAdminPersonId.equals(personId);
|
||||
}
|
||||
public boolean isSuperAdmin(Long personId) {
|
||||
return superAdminPersonId != null && superAdminPersonId.equals(personId);
|
||||
}
|
||||
|
||||
public RecordExt getOrCreateExt() {
|
||||
if (recordExt == null)
|
||||
recordExt = new RecordExt();
|
||||
return recordExt;
|
||||
}
|
||||
public RecordExt getOrCreateExt() {
|
||||
if (recordExt == null)
|
||||
recordExt = new RecordExt();
|
||||
return recordExt;
|
||||
}
|
||||
|
||||
public boolean isAuthorized() {
|
||||
return isAuthorized.isYes();
|
||||
}
|
||||
public boolean isAuthorized() {
|
||||
return isAuthorized.isYes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
|
||||
@Setter @Getter
|
||||
public static class RecordExt {
|
||||
@Setter
|
||||
@Getter
|
||||
public static class RecordExt {
|
||||
|
||||
private Set<Long> historySuperAdmins;
|
||||
private Set<Long> historySuperAdmins;
|
||||
|
||||
public boolean isPotentialSuperAdmin(Long personId) {
|
||||
return historySuperAdmins != null && historySuperAdmins.contains(personId);
|
||||
}
|
||||
}
|
||||
public boolean isPotentialSuperAdmin(Long personId) {
|
||||
return historySuperAdmins != null && historySuperAdmins.contains(personId);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.entity;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.OrgPerson;
|
||||
@ -18,42 +19,43 @@ import lombok.Setter;
|
||||
@TableName(value = "ess_person", autoResultMap = true)
|
||||
public class EssPerson extends BaseEntity<EssPerson> implements OrgPerson {
|
||||
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
private Long ouId;
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
private Long ouId;
|
||||
|
||||
/**
|
||||
* 人员id
|
||||
*/
|
||||
private Long personId;
|
||||
/**
|
||||
* 人员id
|
||||
*/
|
||||
private Long personId;
|
||||
|
||||
/**
|
||||
* 人员名称
|
||||
*/
|
||||
private String personName;
|
||||
/**
|
||||
* 人员名称
|
||||
*/
|
||||
private String personName;
|
||||
|
||||
/**
|
||||
* 是否已经认证
|
||||
*/
|
||||
private EssPersonState state;
|
||||
/**
|
||||
* 是否已经认证
|
||||
*/
|
||||
private EssPersonState state;
|
||||
|
||||
/**
|
||||
* 扩展字段
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
public RecordExt recordExt;
|
||||
/**
|
||||
* 扩展字段
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
public RecordExt recordExt;
|
||||
|
||||
public boolean isAuthorized() {
|
||||
return state == EssPersonState.AUTHORIZED;
|
||||
}
|
||||
public boolean isAuthorized() {
|
||||
return state == EssPersonState.AUTHORIZED;
|
||||
}
|
||||
|
||||
@Setter @Getter
|
||||
public static class RecordExt {
|
||||
}
|
||||
@Setter
|
||||
@Getter
|
||||
public static class RecordExt {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.entity;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.enums.EssSealState;
|
||||
@ -18,36 +19,37 @@ import lombok.Setter;
|
||||
@TableName(value = "ess_seal", autoResultMap = true)
|
||||
public class EssSeal extends BaseEntity<EssSeal> {
|
||||
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
private Long ouId;
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
private Long ouId;
|
||||
|
||||
/**
|
||||
* 印章在腾讯的id
|
||||
*/
|
||||
private String essSealId;
|
||||
/**
|
||||
* 印章在腾讯的id
|
||||
*/
|
||||
private String essSealId;
|
||||
|
||||
/**
|
||||
* 印章状态. CREATE: 创建, DELETED: 删除, DISABLED: 停用, ENABLED: 启用
|
||||
*/
|
||||
private EssSealState state;
|
||||
/**
|
||||
* 印章状态. CREATE: 创建, DELETED: 删除, DISABLED: 停用, ENABLED: 启用
|
||||
*/
|
||||
private EssSealState state;
|
||||
|
||||
/**
|
||||
* 印章类型. OFFICIAL: 公章, CONTRACT: 合同专用章, FINANCE: 财务专用章, PERSONNEL: 人事专用章, INVOICE: 发票专用章, LEGAL_PERSON_SEAL: 法定代表人章, OTHER: 其它
|
||||
*/
|
||||
private EssSealType type;
|
||||
/**
|
||||
* 印章类型. OFFICIAL: 公章, CONTRACT: 合同专用章, FINANCE: 财务专用章, PERSONNEL: 人事专用章, INVOICE: 发票专用章, LEGAL_PERSON_SEAL: 法定代表人章, OTHER: 其它
|
||||
*/
|
||||
private EssSealType type;
|
||||
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private RecordExt recordExt;
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private RecordExt recordExt;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
|
||||
@Setter @Getter
|
||||
public static class RecordExt {
|
||||
@Setter
|
||||
@Getter
|
||||
public static class RecordExt {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.entity;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.OrgPerson;
|
||||
@ -20,54 +21,55 @@ import java.util.Date;
|
||||
@TableName(value = "ess_seal_person", autoResultMap = true)
|
||||
public class EssSealPerson extends BaseEntity<EssSealPerson> implements OrgPerson {
|
||||
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
private Long ouId;
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
private Long ouId;
|
||||
|
||||
/**
|
||||
* 印章id
|
||||
*/
|
||||
private String essSealId;
|
||||
/**
|
||||
* 印章id
|
||||
*/
|
||||
private String essSealId;
|
||||
|
||||
/**
|
||||
* 人员id
|
||||
*/
|
||||
private Long personId;
|
||||
/**
|
||||
* 人员id
|
||||
*/
|
||||
private Long personId;
|
||||
|
||||
/**
|
||||
* 是否授权. YES: 是, NO: 否
|
||||
*/
|
||||
private YesOrNo isAuthorized;
|
||||
/**
|
||||
* 是否授权. YES: 是, NO: 否
|
||||
*/
|
||||
private YesOrNo isAuthorized;
|
||||
|
||||
/**
|
||||
* 授权人员id
|
||||
*/
|
||||
private Long authorizedByPersonId;
|
||||
/**
|
||||
* 授权人员id
|
||||
*/
|
||||
private Long authorizedByPersonId;
|
||||
|
||||
/**
|
||||
* 授权时间
|
||||
*/
|
||||
private Date authorizeTime;
|
||||
/**
|
||||
* 授权时间
|
||||
*/
|
||||
private Date authorizeTime;
|
||||
|
||||
/**
|
||||
* 扩展字段
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private RecordExt recordExt;
|
||||
/**
|
||||
* 扩展字段
|
||||
*/
|
||||
@TableField(typeHandler = FastjsonTypeHandler.class)
|
||||
private RecordExt recordExt;
|
||||
|
||||
public boolean isAuthorized() {
|
||||
return isAuthorized.isYes();
|
||||
}
|
||||
public boolean isAuthorized() {
|
||||
return isAuthorized.isYes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return JSON.toJSONString(this);
|
||||
}
|
||||
|
||||
@Setter @Getter
|
||||
public static class RecordExt {
|
||||
@Setter
|
||||
@Getter
|
||||
public static class RecordExt {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.entity.domain;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.enums.Constraint;
|
||||
@ -11,6 +12,6 @@ import lombok.Setter;
|
||||
@Getter
|
||||
public class Assignment {
|
||||
|
||||
private Constraint constraint;
|
||||
private Constraint constraint;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.entity.domain;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
@ -13,26 +14,28 @@ import java.util.Objects;
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class OuAndPersonId {
|
||||
|
||||
private final Long ouId;
|
||||
private final Long personId;
|
||||
private final Long ouId;
|
||||
private final Long personId;
|
||||
|
||||
public static OuAndPersonId create(Long ouId, Long personId) {
|
||||
return new OuAndPersonId(ouId, personId);
|
||||
}
|
||||
public static OuAndPersonId create(Long ouId, Long personId) {
|
||||
return new OuAndPersonId(ouId, personId);
|
||||
}
|
||||
|
||||
public boolean is(Long ouId, Long personId) {
|
||||
return this.ouId.equals(ouId) && this.personId.equals(personId);
|
||||
}
|
||||
public boolean is(Long ouId, Long personId) {
|
||||
return this.ouId.equals(ouId) && this.personId.equals(personId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof OuAndPersonId)) return false;
|
||||
OuAndPersonId that = (OuAndPersonId) o;
|
||||
return Objects.equals(ouId, that.ouId) && Objects.equals(personId, that.personId);
|
||||
}
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (!(o instanceof OuAndPersonId))
|
||||
return false;
|
||||
OuAndPersonId that = (OuAndPersonId) o;
|
||||
return Objects.equals(ouId, that.ouId) && Objects.equals(personId, that.personId);
|
||||
}
|
||||
|
||||
@Override public int hashCode() {
|
||||
return Objects.hash(ouId, personId);
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(ouId, personId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess;
|
||||
|
||||
import cn.axzo.basics.common.exception.ServiceException;
|
||||
@ -37,85 +38,79 @@ import static java.util.stream.Collectors.toList;
|
||||
@RequiredArgsConstructor
|
||||
public class ContractManager {
|
||||
|
||||
public static final String CONTRACT_ID = "contractId";
|
||||
public static final String CONTRACT_ID = "contractId";
|
||||
|
||||
private final OrgManager orgManager;
|
||||
private final EssClient essClient;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssBroadcaster essBroadcaster;
|
||||
private final ContractSupport contractSupport;
|
||||
private final EssLogDao essLogDao;
|
||||
private final OrgManager orgManager;
|
||||
private final EssClient essClient;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssBroadcaster essBroadcaster;
|
||||
private final ContractSupport contractSupport;
|
||||
private final EssLogDao essLogDao;
|
||||
|
||||
@BizTransactional
|
||||
public CreateContractByFileResponse
|
||||
createContractByFile(CreateContractByFileRequest request) {
|
||||
contractSupport.validateCreateContract(request.getContract());
|
||||
essLogDao.logRequest("createContractByFile", request.getBizCode(), request);
|
||||
EssContract contract;
|
||||
try {
|
||||
contract = contractSupport.saveContractByFile(request);
|
||||
} catch (DuplicateKeyException e) {
|
||||
essLogDao.log("createContractByFile", request.getBizCode(),
|
||||
"message", "重复创建合同", "request", request);
|
||||
return contractSupport.createDuplicateContractByFileResponse(request);
|
||||
}
|
||||
try {
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(request.getCreator().getOuId());
|
||||
List<String> essFileIds = essClient.uploadDocument(superAdmin, request.getByFile().getBase64Files());
|
||||
ChannelCreateFlowByFilesResponse essResponse = essClient.createContractByFile(
|
||||
superAdmin, essFileIds, request.getByFile(),
|
||||
JsonObjectAsString.create().put(CONTRACT_ID, contract.getId()).toString());
|
||||
List<String> essRecipientIds = Arrays.stream(essResponse.getApprovers())
|
||||
.map(ApproverItem::getRecipientId)
|
||||
.collect(toList());
|
||||
for (int i = 0; i < contract.approverSize(); i++)
|
||||
contract.getApprover(i).setEssRecipientId(essRecipientIds.get(i));
|
||||
essContractDao.setEssContractCreated(
|
||||
contract.getId(), essResponse.getFlowId(),
|
||||
essFileIds, contract.getApprovers());
|
||||
essBroadcaster.fireContractStateChanged(contract);
|
||||
CreateContractByFileResponse response = new CreateContractByFileResponse();
|
||||
response.setEssContractId(essResponse.getFlowId());
|
||||
response.setEssRecipientIds(essRecipientIds);
|
||||
return response;
|
||||
} catch (TencentCloudSDKException | ServiceException e) {
|
||||
log.warn("创建合同失败", e);
|
||||
if (contract != null)
|
||||
essContractDao.removeById(contract.getId());
|
||||
throw fail("创建合同失败: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
@BizTransactional
|
||||
public CreateContractByFileResponse createContractByFile(CreateContractByFileRequest request) {
|
||||
contractSupport.validateCreateContract(request.getContract());
|
||||
essLogDao.logRequest("createContractByFile", request.getBizCode(), request);
|
||||
EssContract contract;
|
||||
try {
|
||||
contract = contractSupport.saveContractByFile(request);
|
||||
}
|
||||
catch (DuplicateKeyException e) {
|
||||
essLogDao.log("createContractByFile", request.getBizCode(), "message", "重复创建合同", "request", request);
|
||||
return contractSupport.createDuplicateContractByFileResponse(request);
|
||||
}
|
||||
try {
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(request.getCreator().getOuId());
|
||||
List<String> essFileIds = essClient.uploadDocument(superAdmin, request.getByFile().getBase64Files());
|
||||
ChannelCreateFlowByFilesResponse essResponse = essClient.createContractByFile(superAdmin, essFileIds,
|
||||
request.getByFile(), JsonObjectAsString.create().put(CONTRACT_ID, contract.getId()).toString());
|
||||
List<String> essRecipientIds = Arrays.stream(essResponse.getApprovers()).map(
|
||||
ApproverItem::getRecipientId).collect(toList());
|
||||
for (int i = 0; i < contract.approverSize(); i++)
|
||||
contract.getApprover(i).setEssRecipientId(essRecipientIds.get(i));
|
||||
essContractDao.setEssContractCreated(contract.getId(), essResponse.getFlowId(), essFileIds,
|
||||
contract.getApprovers());
|
||||
essBroadcaster.fireContractStateChanged(contract);
|
||||
CreateContractByFileResponse response = new CreateContractByFileResponse();
|
||||
response.setEssContractId(essResponse.getFlowId());
|
||||
response.setEssRecipientIds(essRecipientIds);
|
||||
return response;
|
||||
}
|
||||
catch (TencentCloudSDKException | ServiceException e) {
|
||||
log.warn("创建合同失败", e);
|
||||
if (contract != null)
|
||||
essContractDao.removeById(contract.getId());
|
||||
throw fail("创建合同失败: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void revokeContract(RevokeContractRequest request) {
|
||||
essLogDao.logRequest("revokeContract", request.getEssContractId(), request);
|
||||
// lock when updating state
|
||||
EssContract contract = essContractDao.findForUpdateOrNull(request.getEssContractId());
|
||||
BizAssertions.assertFalse(contract.isFinalState(),
|
||||
"合同已是终态 {}, 无法撤销", contract.getState().getDescription());
|
||||
EssPerson superAdmin = getContractSuperAdmin(contract);
|
||||
essClient.revokeContract(superAdmin, contract.getEssContractId(), request.getReason());
|
||||
updateContractState(contract, EssContractState.CANCEL, null, request.getReason());
|
||||
}
|
||||
@BizTransactional
|
||||
public void revokeContract(RevokeContractRequest request) {
|
||||
essLogDao.logRequest("revokeContract", request.getEssContractId(), request);
|
||||
// lock when updating state
|
||||
EssContract contract = essContractDao.findForUpdateOrNull(request.getEssContractId());
|
||||
BizAssertions.assertFalse(contract.isFinalState(), "合同已是终态 {}, 无法撤销", contract.getState().getDescription());
|
||||
EssPerson superAdmin = getContractSuperAdmin(contract);
|
||||
essClient.revokeContract(superAdmin, contract.getEssContractId(), request.getReason());
|
||||
updateContractState(contract, EssContractState.CANCEL, null, request.getReason());
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void updateContractState(EssContract contract,
|
||||
EssContractState state,
|
||||
List<EssApproveDetail> approveDetails,
|
||||
String essMessage) {
|
||||
EssContract reload = essContractDao.findForUpdateOrNull(contract.getEssContractId());
|
||||
BizAssertions.assertNotNull(reload, "合同不存在: {}", contract.getEssContractId());
|
||||
if (reload.isFinalState()) {
|
||||
log.warn("合同[{}]已是最终状态[{}], 无法更新状态至{}",
|
||||
reload.getEssContractId(), reload.getState(), state);
|
||||
} else {
|
||||
essContractDao.updateState(contract, state, approveDetails, essMessage);
|
||||
essBroadcaster.fireContractStateChanged(contract);
|
||||
}
|
||||
}
|
||||
@BizTransactional
|
||||
public void updateContractState(EssContract contract, EssContractState state, List<EssApproveDetail> approveDetails,
|
||||
String essMessage) {
|
||||
EssContract reload = essContractDao.findForUpdateOrNull(contract.getEssContractId());
|
||||
BizAssertions.assertNotNull(reload, "合同不存在: {}", contract.getEssContractId());
|
||||
if (reload.isFinalState()) {
|
||||
log.warn("合同[{}]已是最终状态[{}], 无法更新状态至{}", reload.getEssContractId(), reload.getState(), state);
|
||||
}
|
||||
else {
|
||||
essContractDao.updateState(contract, state, approveDetails, essMessage);
|
||||
essBroadcaster.fireContractStateChanged(contract);
|
||||
}
|
||||
}
|
||||
|
||||
public EssPerson getContractSuperAdmin(EssContract contract) {
|
||||
return orgManager.getSuperAdminOrThrow(contract.getCreatorOuId());
|
||||
}
|
||||
public EssPerson getContractSuperAdmin(EssContract contract) {
|
||||
return orgManager.getSuperAdminOrThrow(contract.getCreatorOuId());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess;
|
||||
|
||||
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
|
||||
@ -90,386 +91,339 @@ import static java.util.stream.Collectors.toList;
|
||||
@RequiredArgsConstructor
|
||||
public class EssClient implements InitializingBean {
|
||||
|
||||
private static final String NEW_TRANSACTION = "essLogTransactionTemplate";
|
||||
private static final Pattern ESS_ERROR_REQUEST_ID_PATTERN = Pattern.compile("RequestId:([a-f0-9\\-]+)");
|
||||
private static final String NEW_TRANSACTION = "essLogTransactionTemplate";
|
||||
private static final Pattern ESS_ERROR_REQUEST_ID_PATTERN = Pattern.compile("RequestId:([a-f0-9\\-]+)");
|
||||
|
||||
private final EssProps props;
|
||||
private final EssLogDao essLogDao;
|
||||
private final EssSupport essSupport;
|
||||
@Resource(name = NEW_TRANSACTION)
|
||||
private TransactionTemplate newTransaction;
|
||||
private EssbasicClient manage;
|
||||
private EssbasicClient file;
|
||||
private final EssProps props;
|
||||
private final EssLogDao essLogDao;
|
||||
private final EssSupport essSupport;
|
||||
@Resource(name = NEW_TRANSACTION)
|
||||
private TransactionTemplate newTransaction;
|
||||
private EssbasicClient manage;
|
||||
private EssbasicClient file;
|
||||
|
||||
public String createConsoleLoginUrl(EssOrg org, EssPerson person,
|
||||
EssConsoleUrlEndpoint endpoint,
|
||||
boolean essCheckLoginPerson) {
|
||||
PersonProfileDto personProfile = essSupport.getPersonProfileOrThrow(person);
|
||||
CreateConsoleLoginUrlRequest request = new CreateConsoleLoginUrlRequest();
|
||||
request.setEndpoint(endpoint.getCode());
|
||||
request.setEndpoint(request.getEndpoint());
|
||||
request.setAgent(agent(person));
|
||||
String orgName = org.getOuName() + (props.isTestEnv() ? "测试" : "");
|
||||
if (props.isTestEnv())
|
||||
orgName = orgName.replaceAll("中国", "zhongguo");
|
||||
request.setProxyOrganizationName(orgName);
|
||||
if (essCheckLoginPerson) {
|
||||
request.setProxyOperatorName(personProfile.getRealName());
|
||||
request.setProxyOperatorMobile(personProfile.getPhone());
|
||||
}
|
||||
CreateConsoleLoginUrlResponse response = exec(func()
|
||||
.context("CreateConsoleLoginUrl")
|
||||
.subject(idbuilder()
|
||||
.append(person.getOuId())
|
||||
.append(person.getPersonId())
|
||||
.build())
|
||||
.request(request)
|
||||
.command(() -> manage.CreateConsoleLoginUrl(request)));
|
||||
return response.getConsoleUrl();
|
||||
}
|
||||
public String createConsoleLoginUrl(EssOrg org, EssPerson person, EssConsoleUrlEndpoint endpoint,
|
||||
boolean essCheckLoginPerson) {
|
||||
PersonProfileDto personProfile = essSupport.getPersonProfileOrThrow(person);
|
||||
CreateConsoleLoginUrlRequest request = new CreateConsoleLoginUrlRequest();
|
||||
request.setEndpoint(endpoint.getCode());
|
||||
request.setEndpoint(request.getEndpoint());
|
||||
request.setAgent(agent(person));
|
||||
String orgName = org.getOuName() + (props.isTestEnv() ? "测试" : "");
|
||||
if (props.isTestEnv())
|
||||
orgName = orgName.replaceAll("中国", "zhongguo");
|
||||
request.setProxyOrganizationName(orgName);
|
||||
if (essCheckLoginPerson) {
|
||||
request.setProxyOperatorName(personProfile.getRealName());
|
||||
request.setProxyOperatorMobile(personProfile.getPhone());
|
||||
}
|
||||
CreateConsoleLoginUrlResponse response = exec(func().context("CreateConsoleLoginUrl").subject(
|
||||
idbuilder().append(person.getOuId()).append(person.getPersonId()).build()).request(request).command(
|
||||
() -> manage.CreateConsoleLoginUrl(request)));
|
||||
return response.getConsoleUrl();
|
||||
}
|
||||
|
||||
public String getEmbedWebUrl(EssPerson contextPerson, EssEmbedType embedType, String businessId) {
|
||||
if (embedType.isBusinessIdRequired())
|
||||
BizAssertions.assertNotBlank(businessId, "内嵌类型为{}时业务ID不能为空", embedType.name());
|
||||
ChannelCreateEmbedWebUrlRequest request = new ChannelCreateEmbedWebUrlRequest();
|
||||
request.setAgent(agent(contextPerson));
|
||||
request.setBusinessId(businessId);
|
||||
request.setEmbedType(embedType.getEssCode());
|
||||
request.setHiddenComponents(true);
|
||||
ChannelCreateEmbedWebUrlResponse response = exec(func()
|
||||
.context("ChannelCreateEmbedWebUrl")
|
||||
.subject(businessId == null ? embedType.name() : businessId)
|
||||
.request(request)
|
||||
.command(() -> manage.ChannelCreateEmbedWebUrl(request)));
|
||||
return response.getWebUrl();
|
||||
}
|
||||
public String getEmbedWebUrl(EssPerson contextPerson, EssEmbedType embedType, String businessId) {
|
||||
if (embedType.isBusinessIdRequired())
|
||||
BizAssertions.assertNotBlank(businessId, "内嵌类型为{}时业务ID不能为空", embedType.name());
|
||||
ChannelCreateEmbedWebUrlRequest request = new ChannelCreateEmbedWebUrlRequest();
|
||||
request.setAgent(agent(contextPerson));
|
||||
request.setBusinessId(businessId);
|
||||
request.setEmbedType(embedType.getEssCode());
|
||||
request.setHiddenComponents(true);
|
||||
ChannelCreateEmbedWebUrlResponse response = exec(func().context("ChannelCreateEmbedWebUrl").subject(
|
||||
businessId == null ? embedType.name() : businessId).request(request).command(
|
||||
() -> manage.ChannelCreateEmbedWebUrl(request)));
|
||||
return response.getWebUrl();
|
||||
}
|
||||
|
||||
public void addSealAuthorization(EssPerson superAdmin, EssSeal seal, EssSealPerson sealPerson) {
|
||||
ChannelCreateSealPolicyRequest request = new ChannelCreateSealPolicyRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setSealId(seal.getEssSealId());
|
||||
request.setUserIds(new String[]{PersonOpenId.create(sealPerson).toOpenId()});
|
||||
exec(func()
|
||||
.context("ChannelCreateSealPolicy")
|
||||
.subject(idbuilder()
|
||||
.append(seal.getEssSealId())
|
||||
.append(sealPerson.getPersonId())
|
||||
.build())
|
||||
.request(request)
|
||||
.command(() -> manage.ChannelCreateSealPolicy(request)));
|
||||
}
|
||||
public void addSealAuthorization(EssPerson superAdmin, EssSeal seal, EssSealPerson sealPerson) {
|
||||
ChannelCreateSealPolicyRequest request = new ChannelCreateSealPolicyRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setSealId(seal.getEssSealId());
|
||||
request.setUserIds(new String[] { PersonOpenId.create(sealPerson).toOpenId() });
|
||||
exec(func().context("ChannelCreateSealPolicy").subject(
|
||||
idbuilder().append(seal.getEssSealId()).append(sealPerson.getPersonId()).build()).request(request).command(
|
||||
() -> manage.ChannelCreateSealPolicy(request)));
|
||||
}
|
||||
|
||||
public void removeSealAuthorization(EssPerson superAdmin, EssSeal seal, EssSealPerson sealPerson) {
|
||||
ChannelDeleteSealPoliciesRequest request = new ChannelDeleteSealPoliciesRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setSealId(seal.getEssSealId());
|
||||
request.setUserIds(new String[]{PersonOpenId.create(sealPerson).toOpenId()});
|
||||
exec(func()
|
||||
.context("ChannelDeleteSealPolicies")
|
||||
.subject(idbuilder()
|
||||
.append(seal.getEssSealId())
|
||||
.append(sealPerson.getPersonId())
|
||||
.build())
|
||||
.request(request)
|
||||
.command(() -> manage.ChannelDeleteSealPolicies(request)));
|
||||
}
|
||||
public void removeSealAuthorization(EssPerson superAdmin, EssSeal seal, EssSealPerson sealPerson) {
|
||||
ChannelDeleteSealPoliciesRequest request = new ChannelDeleteSealPoliciesRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setSealId(seal.getEssSealId());
|
||||
request.setUserIds(new String[] { PersonOpenId.create(sealPerson).toOpenId() });
|
||||
exec(func().context("ChannelDeleteSealPolicies").subject(
|
||||
idbuilder().append(seal.getEssSealId()).append(sealPerson.getPersonId()).build()).request(request).command(
|
||||
() -> manage.ChannelDeleteSealPolicies(request)));
|
||||
}
|
||||
|
||||
List<String> uploadDocument(EssPerson superAdmin, List<String> base64Files) throws TencentCloudSDKException {
|
||||
return uploadFile(superAdmin, UploadFileBusinessType.DOCUMENT, base64Files);
|
||||
}
|
||||
List<String> uploadDocument(EssPerson superAdmin, List<String> base64Files) throws TencentCloudSDKException {
|
||||
return uploadFile(superAdmin, UploadFileBusinessType.DOCUMENT, base64Files);
|
||||
}
|
||||
|
||||
List<String> uploadTemplate(EssPerson superAdmin, List<String> base64Files) throws TencentCloudSDKException {
|
||||
return uploadFile(superAdmin, UploadFileBusinessType.TEMPLATE, base64Files);
|
||||
}
|
||||
List<String> uploadTemplate(EssPerson superAdmin, List<String> base64Files) throws TencentCloudSDKException {
|
||||
return uploadFile(superAdmin, UploadFileBusinessType.TEMPLATE, base64Files);
|
||||
}
|
||||
|
||||
private List<String> uploadFile(EssPerson superAdmin,
|
||||
UploadFileBusinessType businessType,
|
||||
List<String> base64Files) throws TencentCloudSDKException {
|
||||
BizAssertions.assertFalse(base64Files.isEmpty(), "文件不能为空");
|
||||
ArrayList<UploadFile> files = new ArrayList<>();
|
||||
for (String base64File : base64Files) {
|
||||
UploadFile file = new UploadFile();
|
||||
file.setFileBody(base64File);
|
||||
files.add(file);
|
||||
}
|
||||
UploadFilesRequest request = new UploadFilesRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setFileInfos(files.toArray(new UploadFile[0]));
|
||||
request.setBusinessType(businessType.name());
|
||||
UploadFilesResponse response = call(Func.<UploadFilesResponse>func()
|
||||
.context("UploadFiles")
|
||||
.subject("")
|
||||
.subject2(r -> r.getFileIds()[0])
|
||||
.request(request)
|
||||
.command(() -> file.UploadFiles(request)));
|
||||
return Arrays.asList(response.getFileIds());
|
||||
}
|
||||
private List<String> uploadFile(EssPerson superAdmin, UploadFileBusinessType businessType, List<String> base64Files)
|
||||
throws TencentCloudSDKException {
|
||||
BizAssertions.assertFalse(base64Files.isEmpty(), "文件不能为空");
|
||||
ArrayList<UploadFile> files = new ArrayList<>();
|
||||
for (String base64File : base64Files) {
|
||||
UploadFile file = new UploadFile();
|
||||
file.setFileBody(base64File);
|
||||
files.add(file);
|
||||
}
|
||||
UploadFilesRequest request = new UploadFilesRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setFileInfos(files.toArray(new UploadFile[0]));
|
||||
request.setBusinessType(businessType.name());
|
||||
UploadFilesResponse response = call(
|
||||
Func.<UploadFilesResponse> func().context("UploadFiles").subject("").subject2(
|
||||
r -> r.getFileIds()[0]).request(request).command(() -> file.UploadFiles(request)));
|
||||
return Arrays.asList(response.getFileIds());
|
||||
}
|
||||
|
||||
ChannelCreateFlowByFilesResponse
|
||||
createContractByFile(EssPerson superAdmin,
|
||||
List<String> contractFileIds,
|
||||
CreateContractInfo contract,
|
||||
String customerData) throws TencentCloudSDKException {
|
||||
OrgProfiles orgProfiles = OrgProfiles.wrap(essSupport
|
||||
.getOrgProfiles(contract.getApprovers().stream()
|
||||
.filter(Approver::isSignPersonPreset)
|
||||
.map(Approver::getOuId)
|
||||
.collect(toList())));
|
||||
PersonProfiles personProfiles = PersonProfiles.wrap(essSupport
|
||||
.getPersonProfiles(contract.getApprovers().stream()
|
||||
.filter(Approver::isSignPersonPreset)
|
||||
.map(Approver::getPersonId)
|
||||
.collect(toList())));
|
||||
ArrayList<FlowApproverInfo> approvers = new ArrayList<>();
|
||||
for (Approver approver : contract.getApprovers()) {
|
||||
FlowApproverInfo approverInfo = new FlowApproverInfo();
|
||||
approvers.add(approverInfo);
|
||||
ApproverOption approverOption = new ApproverOption();
|
||||
if (approver.getSignPerson() == null) {
|
||||
approverOption.setFillType(1L);
|
||||
} else {
|
||||
OrganizationalUnitVO orgProfile = orgProfiles.getOrThrow(approver.getOuId());
|
||||
PersonProfileDto personProfile = personProfiles.getOrThrow(approver.getPersonId());
|
||||
approverInfo.setName(personProfile.getRealName());
|
||||
approverInfo.setMobile(personProfile.getPhone());
|
||||
approverInfo.setOpenId(PersonOpenId.create(approver).toOpenId());
|
||||
approverInfo.setOrganizationName(orgProfile.getName());
|
||||
approverInfo.setOrganizationOpenId(OrgOpenId.ofPerson(approver).toOpenId());
|
||||
}
|
||||
if (approver.getSignOption() != null) {
|
||||
approverOption.setNoRefuse(approver.getSignOption().isNoRefuse());
|
||||
approverOption.setNoTransfer(approver.getSignOption().isNoTransfer());
|
||||
}
|
||||
approverInfo.setApproverOption(approverOption);
|
||||
approverInfo.setApproverType(approver.getApproverType().name());
|
||||
approverInfo.setNotifyType("NONE");
|
||||
approverInfo.setPreReadTime(approver.getPreReadTimeSeconds());
|
||||
if (CollectionUtils.isNotEmpty(approver.getSealTypes())) {
|
||||
ComponentLimit componentLimit = new ComponentLimit();
|
||||
componentLimit.setComponentType("SIGN_SEAL");
|
||||
componentLimit.setComponentValue(approver.getSealTypes()
|
||||
.stream().flatMap(type -> type.getEssCodes().stream())
|
||||
.distinct().toArray(String[]::new));
|
||||
approverInfo.setAddSignComponentsLimits(new ComponentLimit[]{componentLimit});
|
||||
}
|
||||
}
|
||||
ChannelCreateFlowByFilesRequest request = new ChannelCreateFlowByFilesRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setSignBeanTag(contract.getSignBeanTag());
|
||||
request.setFlowName(contract.getContractName());
|
||||
request.setFileIds(contractFileIds.toArray(new String[0]));
|
||||
request.setFlowApprovers(approvers.toArray(new FlowApproverInfo[0]));
|
||||
request.setUnordered(!contract.isSignOrdered());
|
||||
request.setCustomerData(customerData);
|
||||
if (contract.getDeadlineMs() != null)
|
||||
request.setDeadline(contract.getDeadlineMs() / 1000);
|
||||
return call(Func.<ChannelCreateFlowByFilesResponse>func()
|
||||
.context("ChannelCreateFlowByFiles")
|
||||
.subject(contract.getContractName())
|
||||
.subject2(ChannelCreateFlowByFilesResponse::getFlowId)
|
||||
.request(request)
|
||||
.command(() -> manage.ChannelCreateFlowByFiles(request)));
|
||||
}
|
||||
ChannelCreateFlowByFilesResponse createContractByFile(EssPerson superAdmin, List<String> contractFileIds,
|
||||
CreateContractInfo contract, String customerData) throws TencentCloudSDKException {
|
||||
OrgProfiles orgProfiles = OrgProfiles.wrap(essSupport.getOrgProfiles(
|
||||
contract.getApprovers().stream().filter(Approver::isSignPersonPreset).map(Approver::getOuId).collect(
|
||||
toList())));
|
||||
PersonProfiles personProfiles = PersonProfiles.wrap(essSupport.getPersonProfiles(
|
||||
contract.getApprovers().stream().filter(Approver::isSignPersonPreset).map(Approver::getPersonId).collect(
|
||||
toList())));
|
||||
ArrayList<FlowApproverInfo> approvers = new ArrayList<>();
|
||||
for (Approver approver : contract.getApprovers()) {
|
||||
FlowApproverInfo approverInfo = new FlowApproverInfo();
|
||||
approvers.add(approverInfo);
|
||||
ApproverOption approverOption = new ApproverOption();
|
||||
if (approver.getSignPerson() == null) {
|
||||
approverOption.setFillType(1L);
|
||||
}
|
||||
else {
|
||||
OrganizationalUnitVO orgProfile = orgProfiles.getOrThrow(approver.getOuId());
|
||||
PersonProfileDto personProfile = personProfiles.getOrThrow(approver.getPersonId());
|
||||
approverInfo.setName(personProfile.getRealName());
|
||||
approverInfo.setMobile(personProfile.getPhone());
|
||||
approverInfo.setOpenId(PersonOpenId.create(approver).toOpenId());
|
||||
approverInfo.setOrganizationName(orgProfile.getName());
|
||||
approverInfo.setOrganizationOpenId(OrgOpenId.ofPerson(approver).toOpenId());
|
||||
}
|
||||
if (approver.getSignOption() != null) {
|
||||
approverOption.setNoRefuse(approver.getSignOption().isNoRefuse());
|
||||
approverOption.setNoTransfer(approver.getSignOption().isNoTransfer());
|
||||
}
|
||||
approverInfo.setApproverOption(approverOption);
|
||||
approverInfo.setApproverType(approver.getApproverType().name());
|
||||
approverInfo.setNotifyType("NONE");
|
||||
approverInfo.setPreReadTime(approver.getPreReadTimeSeconds());
|
||||
if (CollectionUtils.isNotEmpty(approver.getSealTypes())) {
|
||||
ComponentLimit componentLimit = new ComponentLimit();
|
||||
componentLimit.setComponentType("SIGN_SEAL");
|
||||
componentLimit.setComponentValue(
|
||||
approver.getSealTypes().stream().flatMap(type -> type.getEssCodes().stream()).distinct().toArray(
|
||||
String[]::new));
|
||||
approverInfo.setAddSignComponentsLimits(new ComponentLimit[] { componentLimit });
|
||||
}
|
||||
}
|
||||
ChannelCreateFlowByFilesRequest request = new ChannelCreateFlowByFilesRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setSignBeanTag(contract.getSignBeanTag());
|
||||
request.setFlowName(contract.getContractName());
|
||||
request.setFileIds(contractFileIds.toArray(new String[0]));
|
||||
request.setFlowApprovers(approvers.toArray(new FlowApproverInfo[0]));
|
||||
request.setUnordered(!contract.isSignOrdered());
|
||||
request.setCustomerData(customerData);
|
||||
if (contract.getDeadlineMs() != null)
|
||||
request.setDeadline(contract.getDeadlineMs() / 1000);
|
||||
return call(Func.<ChannelCreateFlowByFilesResponse> func().context("ChannelCreateFlowByFiles").subject(
|
||||
contract.getContractName()).subject2(ChannelCreateFlowByFilesResponse::getFlowId).request(request).command(
|
||||
() -> manage.ChannelCreateFlowByFiles(request)));
|
||||
}
|
||||
|
||||
void revokeContract(EssPerson superAdmin, String essContractId, String reason) {
|
||||
ChannelCancelFlowRequest request = new ChannelCancelFlowRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setFlowId(essContractId);
|
||||
request.setCancelMessage(reason);
|
||||
exec(func()
|
||||
.context("ChannelCancelFlow")
|
||||
.subject(essContractId)
|
||||
.request(request)
|
||||
.command(() -> manage.ChannelCancelFlow(request)));
|
||||
}
|
||||
void revokeContract(EssPerson superAdmin, String essContractId, String reason) {
|
||||
ChannelCancelFlowRequest request = new ChannelCancelFlowRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setFlowId(essContractId);
|
||||
request.setCancelMessage(reason);
|
||||
exec(func().context("ChannelCancelFlow").subject(essContractId).request(request).command(
|
||||
() -> manage.ChannelCancelFlow(request)));
|
||||
}
|
||||
|
||||
public String getContractPDFUrl(EssPerson superAdmin, String essContractId) {
|
||||
DescribeResourceUrlsByFlowsRequest request = new DescribeResourceUrlsByFlowsRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setFlowIds(new String[]{essContractId});
|
||||
DescribeResourceUrlsByFlowsResponse response = exec(func()
|
||||
.context("DescribeResourceUrlsByFlows")
|
||||
.subject(essContractId)
|
||||
.request(request)
|
||||
.command(() -> manage.DescribeResourceUrlsByFlows(request)));
|
||||
return response.getFlowResourceUrlInfos()[0].getResourceUrlInfos()[0].getUrl();
|
||||
}
|
||||
public String getContractPDFUrl(EssPerson superAdmin, String essContractId) {
|
||||
DescribeResourceUrlsByFlowsRequest request = new DescribeResourceUrlsByFlowsRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setFlowIds(new String[] { essContractId });
|
||||
DescribeResourceUrlsByFlowsResponse response = exec(
|
||||
func().context("DescribeResourceUrlsByFlows").subject(essContractId).request(request).command(
|
||||
() -> manage.DescribeResourceUrlsByFlows(request)));
|
||||
return response.getFlowResourceUrlInfos()[0].getResourceUrlInfos()[0].getUrl();
|
||||
}
|
||||
|
||||
public String getContractSignUrlPC(String essContractId, EssPerson signPerson) {
|
||||
ChannelCreateOrganizationBatchSignUrlRequest request = new ChannelCreateOrganizationBatchSignUrlRequest();
|
||||
request.setAgent(agent(signPerson));
|
||||
request.setFlowIds(new String[]{essContractId});
|
||||
request.setOpenId(PersonOpenId.create(signPerson).toOpenId());
|
||||
ChannelCreateOrganizationBatchSignUrlResponse response = exec(func()
|
||||
.context("ChannelCreateOrganizationBatchSignUrl")
|
||||
.subject(essContractId)
|
||||
.request(request)
|
||||
.command(() -> manage.ChannelCreateOrganizationBatchSignUrl(request)));
|
||||
return response.getSignUrl();
|
||||
}
|
||||
public String getContractSignUrlPC(String essContractId, EssPerson signPerson) {
|
||||
ChannelCreateOrganizationBatchSignUrlRequest request = new ChannelCreateOrganizationBatchSignUrlRequest();
|
||||
request.setAgent(agent(signPerson));
|
||||
request.setFlowIds(new String[] { essContractId });
|
||||
request.setOpenId(PersonOpenId.create(signPerson).toOpenId());
|
||||
ChannelCreateOrganizationBatchSignUrlResponse response = exec(
|
||||
func().context("ChannelCreateOrganizationBatchSignUrl").subject(essContractId).request(request).command(
|
||||
() -> manage.ChannelCreateOrganizationBatchSignUrl(request)));
|
||||
return response.getSignUrl();
|
||||
}
|
||||
|
||||
public CreateSignUrlsResponse getWeixinAppSignUrl(
|
||||
String essContractId, EssPerson superAdmin,
|
||||
OrgPerson signPerson, String recipientId) {
|
||||
CreateSignUrlsRequest request = new CreateSignUrlsRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setFlowIds(new String[]{essContractId});
|
||||
request.setOpenId(PersonOpenId.create(signPerson).toOpenId());
|
||||
request.setOrganizationOpenId(OrgOpenId.ofPerson(signPerson).toOpenId());
|
||||
if (StringUtils.isNotBlank(recipientId)) {
|
||||
request.setRecipientIds(new String[]{recipientId});
|
||||
request.setGenerateType("RECIPIENT");
|
||||
}
|
||||
return exec(func()
|
||||
.context("CreateSignUrls")
|
||||
.subject(essContractId)
|
||||
.request(request)
|
||||
.command(() -> manage.CreateSignUrls(request)));
|
||||
}
|
||||
public CreateSignUrlsResponse getWeixinAppSignUrl(String essContractId, EssPerson superAdmin, OrgPerson signPerson,
|
||||
String recipientId) {
|
||||
CreateSignUrlsRequest request = new CreateSignUrlsRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setFlowIds(new String[] { essContractId });
|
||||
request.setOpenId(PersonOpenId.create(signPerson).toOpenId());
|
||||
request.setOrganizationOpenId(OrgOpenId.ofPerson(signPerson).toOpenId());
|
||||
if (StringUtils.isNotBlank(recipientId)) {
|
||||
request.setRecipientIds(new String[] { recipientId });
|
||||
request.setGenerateType("RECIPIENT");
|
||||
}
|
||||
return exec(func().context("CreateSignUrls").subject(essContractId).request(request).command(
|
||||
() -> manage.CreateSignUrls(request)));
|
||||
}
|
||||
|
||||
public void setEmployeeResigned(EssPerson superAdmin, List<EssPerson> employees) {
|
||||
ArrayList<ProxyOrganizationOperator> operators = new ArrayList<>();
|
||||
for (EssPerson employee : employees) {
|
||||
ProxyOrganizationOperator operator = new ProxyOrganizationOperator();
|
||||
operators.add(operator);
|
||||
operator.setId(PersonOpenId.create(employee).toOpenId());
|
||||
operator.setName(employee.getPersonName());
|
||||
}
|
||||
SyncProxyOrganizationOperatorsRequest request = new SyncProxyOrganizationOperatorsRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setOperatorType("RESIGN");
|
||||
request.setProxyOrganizationOperators(operators.toArray(new ProxyOrganizationOperator[0]));
|
||||
exec(func()
|
||||
.context("SyncProxyOrganizationOperators")
|
||||
.subject(employees.stream()
|
||||
.map(EssPerson::getPersonId)
|
||||
.map(String::valueOf)
|
||||
.reduce((a, b) -> a + "," + b)
|
||||
.orElse(""))
|
||||
.request(request)
|
||||
.command(() -> manage.SyncProxyOrganizationOperators(request)));
|
||||
}
|
||||
public void setEmployeeResigned(EssPerson superAdmin, List<EssPerson> employees) {
|
||||
ArrayList<ProxyOrganizationOperator> operators = new ArrayList<>();
|
||||
for (EssPerson employee : employees) {
|
||||
ProxyOrganizationOperator operator = new ProxyOrganizationOperator();
|
||||
operators.add(operator);
|
||||
operator.setId(PersonOpenId.create(employee).toOpenId());
|
||||
operator.setName(employee.getPersonName());
|
||||
}
|
||||
SyncProxyOrganizationOperatorsRequest request = new SyncProxyOrganizationOperatorsRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setOperatorType("RESIGN");
|
||||
request.setProxyOrganizationOperators(operators.toArray(new ProxyOrganizationOperator[0]));
|
||||
exec(func().context("SyncProxyOrganizationOperators").subject(
|
||||
employees.stream().map(EssPerson::getPersonId).map(String::valueOf).reduce((a, b) -> a + "," + b).orElse(
|
||||
"")).request(request).command(() -> manage.SyncProxyOrganizationOperators(request)));
|
||||
}
|
||||
|
||||
public ChannelDescribeEmployeesResponse getOrgPerson(EssPerson superAdmin, EssOrg org, Long offset) {
|
||||
ChannelDescribeEmployeesRequest request = new ChannelDescribeEmployeesRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setOffset(offset);
|
||||
request.setLimit(20L);
|
||||
return exec(func()
|
||||
.context("ChannelDescribeEmployees")
|
||||
.subject(org.getOuId() + "")
|
||||
.request(request)
|
||||
.command(() -> manage.ChannelDescribeEmployees(request)));
|
||||
}
|
||||
public ChannelDescribeEmployeesResponse getOrgPerson(EssPerson superAdmin, EssOrg org, Long offset) {
|
||||
ChannelDescribeEmployeesRequest request = new ChannelDescribeEmployeesRequest();
|
||||
request.setAgent(agent(superAdmin));
|
||||
request.setOffset(offset);
|
||||
request.setLimit(20L);
|
||||
return exec(func().context("ChannelDescribeEmployees").subject(org.getOuId() + "").request(request).command(
|
||||
() -> manage.ChannelDescribeEmployees(request)));
|
||||
}
|
||||
|
||||
private Agent agent(EssPerson person) {
|
||||
Agent agent = new Agent();
|
||||
UserInfo userInfo = new UserInfo();
|
||||
agent.setAppId(props.getAppId());
|
||||
agent.setProxyAppId("");
|
||||
agent.setProxyOrganizationOpenId(OrgOpenId.ofPerson(person).toOpenId());
|
||||
userInfo.setOpenId(PersonOpenId.create(person).toOpenId());
|
||||
agent.setProxyOperator(userInfo);
|
||||
return agent;
|
||||
}
|
||||
private Agent agent(EssPerson person) {
|
||||
Agent agent = new Agent();
|
||||
UserInfo userInfo = new UserInfo();
|
||||
agent.setAppId(props.getAppId());
|
||||
agent.setProxyAppId("");
|
||||
agent.setProxyOrganizationOpenId(OrgOpenId.ofPerson(person).toOpenId());
|
||||
userInfo.setOpenId(PersonOpenId.create(person).toOpenId());
|
||||
agent.setProxyOperator(userInfo);
|
||||
return agent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
manage = createEssbasicClient(props.getApiEndPoint());
|
||||
file = createEssbasicClient(props.getFileEndPoint());
|
||||
}
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
manage = createEssbasicClient(props.getApiEndPoint());
|
||||
file = createEssbasicClient(props.getFileEndPoint());
|
||||
}
|
||||
|
||||
private EssbasicClient createEssbasicClient(String apiEndPoint) {
|
||||
Credential cred = new Credential(props.getSecretId(), props.getSecretKey());
|
||||
HttpProfile httpProfile = new HttpProfile();
|
||||
httpProfile.setEndpoint(apiEndPoint);
|
||||
ClientProfile clientProfile = new ClientProfile();
|
||||
clientProfile.setHttpProfile(httpProfile);
|
||||
return new EssbasicClient(cred, "", clientProfile);
|
||||
}
|
||||
private EssbasicClient createEssbasicClient(String apiEndPoint) {
|
||||
Credential cred = new Credential(props.getSecretId(), props.getSecretKey());
|
||||
HttpProfile httpProfile = new HttpProfile();
|
||||
httpProfile.setEndpoint(apiEndPoint);
|
||||
ClientProfile clientProfile = new ClientProfile();
|
||||
clientProfile.setHttpProfile(httpProfile);
|
||||
return new EssbasicClient(cred, "", clientProfile);
|
||||
}
|
||||
|
||||
private <T> T exec(FuncBuilder<?> builder) {
|
||||
try {
|
||||
return call(builder);
|
||||
} catch (TencentCloudSDKException e) {
|
||||
throw fail(e, String.format("腾讯返回: %s", e.getMessage()));
|
||||
}
|
||||
}
|
||||
private <T> T exec(FuncBuilder<?> builder) {
|
||||
try {
|
||||
return call(builder);
|
||||
}
|
||||
catch (TencentCloudSDKException e) {
|
||||
throw fail(e, String.format("腾讯返回: %s", e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
private <T> T call(FuncBuilder<?> builder) throws TencentCloudSDKException {
|
||||
//noinspection unchecked
|
||||
Func<Object> func = (Func<Object>) builder.build();
|
||||
EssLog essLog = new EssLog();
|
||||
essLog.setCreateAt(new Date());
|
||||
essLog.setUpdateAt(new Date());
|
||||
essLog.setContext(String.format("ess:api:%s", func.context));
|
||||
essLog.addLogContent("essRequest", func.request);
|
||||
essLog.setSubject(func.subject == null ? "" : func.subject);
|
||||
private <T> T call(FuncBuilder<?> builder) throws TencentCloudSDKException {
|
||||
//noinspection unchecked
|
||||
Func<Object> func = (Func<Object>) builder.build();
|
||||
EssLog essLog = new EssLog();
|
||||
essLog.setCreateAt(new Date());
|
||||
essLog.setUpdateAt(new Date());
|
||||
essLog.setContext(String.format("ess:api:%s", func.context));
|
||||
essLog.addLogContent("essRequest", func.request);
|
||||
essLog.setSubject(func.subject == null ? "" : func.subject);
|
||||
|
||||
T response = null;
|
||||
TencentCloudSDKException exception = null;
|
||||
try {
|
||||
//noinspection unchecked
|
||||
response = (T) func.command.exec();
|
||||
essLog.addLogContent("essResponse", response);
|
||||
if (func.subject2 != null) {
|
||||
String newSubject = func.subject2.apply(response);
|
||||
if (newSubject != null) essLog.setSubject(newSubject);
|
||||
}
|
||||
if (response != null) {
|
||||
Method method = ReflectionUtils.findMethod(response.getClass(), "getRequestId");
|
||||
if (method != null) {
|
||||
method.setAccessible(true);
|
||||
String requestId = (String) ReflectionUtils.invokeMethod(method, response);
|
||||
essLog.setRequestId(requestId);
|
||||
}
|
||||
}
|
||||
} catch (TencentCloudSDKException e) {
|
||||
log.warn("腾讯云接口调用失败", e);
|
||||
exception = e;
|
||||
essLog.setIsError(YesOrNo.YES);
|
||||
String stackTraceAsString = Throwables.getStackTraceAsString(e);
|
||||
essLog.addLogContent("exception", stackTraceAsString);
|
||||
Matcher matcher = ESS_ERROR_REQUEST_ID_PATTERN.matcher(stackTraceAsString);
|
||||
if (matcher.find()) {
|
||||
String requestId = matcher.group(1);
|
||||
essLog.setRequestId(requestId);
|
||||
}
|
||||
} finally {
|
||||
newTransaction.executeWithoutResult(unused -> essLogDao.save(essLog));
|
||||
}
|
||||
if (exception != null)
|
||||
throw exception;
|
||||
return response;
|
||||
}
|
||||
T response = null;
|
||||
TencentCloudSDKException exception = null;
|
||||
try {
|
||||
//noinspection unchecked
|
||||
response = (T) func.command.exec();
|
||||
essLog.addLogContent("essResponse", response);
|
||||
if (func.subject2 != null) {
|
||||
String newSubject = func.subject2.apply(response);
|
||||
if (newSubject != null)
|
||||
essLog.setSubject(newSubject);
|
||||
}
|
||||
if (response != null) {
|
||||
Method method = ReflectionUtils.findMethod(response.getClass(), "getRequestId");
|
||||
if (method != null) {
|
||||
method.setAccessible(true);
|
||||
String requestId = (String) ReflectionUtils.invokeMethod(method, response);
|
||||
essLog.setRequestId(requestId);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (TencentCloudSDKException e) {
|
||||
log.warn("腾讯云接口调用失败", e);
|
||||
exception = e;
|
||||
essLog.setIsError(YesOrNo.YES);
|
||||
String stackTraceAsString = Throwables.getStackTraceAsString(e);
|
||||
essLog.addLogContent("exception", stackTraceAsString);
|
||||
Matcher matcher = ESS_ERROR_REQUEST_ID_PATTERN.matcher(stackTraceAsString);
|
||||
if (matcher.find()) {
|
||||
String requestId = matcher.group(1);
|
||||
essLog.setRequestId(requestId);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
newTransaction.executeWithoutResult(unused -> essLogDao.save(essLog));
|
||||
}
|
||||
if (exception != null)
|
||||
throw exception;
|
||||
return response;
|
||||
}
|
||||
|
||||
public enum UploadFileBusinessType {
|
||||
DOCUMENT, TEMPLATE
|
||||
}
|
||||
public enum UploadFileBusinessType {
|
||||
DOCUMENT, TEMPLATE
|
||||
}
|
||||
|
||||
@lombok.Builder
|
||||
public static class Func<T> {
|
||||
final String context;
|
||||
final String subject;
|
||||
final Function<T, String> subject2;
|
||||
final Object request;
|
||||
final TencentCloudFunc<T> command;
|
||||
@lombok.Builder
|
||||
public static class Func<T> {
|
||||
final String context;
|
||||
final String subject;
|
||||
final Function<T, String> subject2;
|
||||
final Object request;
|
||||
final TencentCloudFunc<T> command;
|
||||
|
||||
public static <T> FuncBuilder<T> func() {
|
||||
return Func.builder();
|
||||
}
|
||||
public static <T> FuncBuilder<T> func() {
|
||||
return Func.builder();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private interface TencentCloudFunc<T> {
|
||||
T exec() throws TencentCloudSDKException;
|
||||
}
|
||||
private interface TencentCloudFunc<T> {
|
||||
T exec() throws TencentCloudSDKException;
|
||||
}
|
||||
|
||||
@Bean(NEW_TRANSACTION)
|
||||
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
|
||||
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
|
||||
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
||||
return transactionTemplate;
|
||||
}
|
||||
@Bean(NEW_TRANSACTION)
|
||||
public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) {
|
||||
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
|
||||
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
||||
return transactionTemplate;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.OrgPerson;
|
||||
@ -48,191 +49,174 @@ import static cn.axzo.nanopart.ess.server.utils.IdBuilder.idbuilder;
|
||||
@RequiredArgsConstructor
|
||||
public class EssService {
|
||||
|
||||
private final OrgManager orgManager;
|
||||
private final ContractManager contractManager;
|
||||
private final EssClient essClient;
|
||||
private final EssSealDao essSealDao;
|
||||
private final EssSealPersonDao essSealPersonDao;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssPersonDao essPersonDao;
|
||||
private final OssService ossService;
|
||||
private final EssLogDao essLogDao;
|
||||
private final EssBroadcaster essBroadcaster;
|
||||
private final OrgManager orgManager;
|
||||
private final ContractManager contractManager;
|
||||
private final EssClient essClient;
|
||||
private final EssSealDao essSealDao;
|
||||
private final EssSealPersonDao essSealPersonDao;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssPersonDao essPersonDao;
|
||||
private final OssService ossService;
|
||||
private final EssLogDao essLogDao;
|
||||
private final EssBroadcaster essBroadcaster;
|
||||
|
||||
@BizTransactional
|
||||
public String createConsoleLoginUrl(CreateConsoleLoginUrlRequest request) {
|
||||
String subject = idbuilder()
|
||||
.append(request.getOuId())
|
||||
.append(request.getPersonId())
|
||||
.build();
|
||||
essLogDao.logRequest("createConsoleLoginUrl", subject, request);
|
||||
OrgAndPerson orgAndPerson = orgManager.createConsoleLoginUrl(request);
|
||||
return essClient.createConsoleLoginUrl(
|
||||
orgAndPerson.getOrg(), orgAndPerson.getPerson(),
|
||||
request.getEndpoint(), request.isEssCheckLoginPerson());
|
||||
}
|
||||
@BizTransactional
|
||||
public String createConsoleLoginUrl(CreateConsoleLoginUrlRequest request) {
|
||||
String subject = idbuilder().append(request.getOuId()).append(request.getPersonId()).build();
|
||||
essLogDao.logRequest("createConsoleLoginUrl", subject, request);
|
||||
OrgAndPerson orgAndPerson = orgManager.createConsoleLoginUrl(request);
|
||||
return essClient.createConsoleLoginUrl(orgAndPerson.getOrg(), orgAndPerson.getPerson(), request.getEndpoint(),
|
||||
request.isEssCheckLoginPerson());
|
||||
}
|
||||
|
||||
public String getEmbedWebUrl(GetEmbedWebUrlRequest request) {
|
||||
EssPerson contextPerson;
|
||||
if (request.getEmbedType().getEssContext() == EssContext.CONTRACT) {
|
||||
BizAssertions.assertNotBlank(request.getBusinessId(), "合同ID不能为空");
|
||||
EssContract contract = essContractDao.getOrThrow(request.getBusinessId());
|
||||
contextPerson = contractManager.getContractSuperAdmin(contract);
|
||||
} else if (request.getEmbedType().getEssContext() == EssContext.SEAL) {
|
||||
BizAssertions.assertNotBlank(request.getBusinessId(), "印章ID不能为空");
|
||||
contextPerson = orgManager.getSuperAdminOrThrow(request.getOuId());
|
||||
} else {
|
||||
contextPerson = orgManager.getSuperAdminOrThrow(request.getOuId());
|
||||
}
|
||||
return essClient.getEmbedWebUrl(
|
||||
contextPerson, request.getEmbedType(), request.getBusinessId());
|
||||
}
|
||||
public String getEmbedWebUrl(GetEmbedWebUrlRequest request) {
|
||||
EssPerson contextPerson;
|
||||
if (request.getEmbedType().getEssContext() == EssContext.CONTRACT) {
|
||||
BizAssertions.assertNotBlank(request.getBusinessId(), "合同ID不能为空");
|
||||
EssContract contract = essContractDao.getOrThrow(request.getBusinessId());
|
||||
contextPerson = contractManager.getContractSuperAdmin(contract);
|
||||
}
|
||||
else if (request.getEmbedType().getEssContext() == EssContext.SEAL) {
|
||||
BizAssertions.assertNotBlank(request.getBusinessId(), "印章ID不能为空");
|
||||
contextPerson = orgManager.getSuperAdminOrThrow(request.getOuId());
|
||||
}
|
||||
else {
|
||||
contextPerson = orgManager.getSuperAdminOrThrow(request.getOuId());
|
||||
}
|
||||
return essClient.getEmbedWebUrl(contextPerson, request.getEmbedType(), request.getBusinessId());
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void essAddSealAuthorization(AddSealAuthorizationRequest request) {
|
||||
String subject = idbuilder()
|
||||
.append(request.getEssSealId())
|
||||
.append(request.getPersonId())
|
||||
.build();
|
||||
essLogDao.logRequest("essAddSealAuthorization", subject, request);
|
||||
SealAndPerson sealAndPerson = getSealAndPersonOrThrow(request);
|
||||
EssSealPerson sealPerson = sealAndPerson.getSealPerson();
|
||||
if (sealPerson.isAuthorized())
|
||||
return;
|
||||
EssPerson essPerson = essPersonDao.findOrNull(sealPerson);
|
||||
BizAssertions.assertNotNull(essPerson, "人员不存在: {}", sealPerson.getPersonId());
|
||||
BizAssertions.assertTrue(essPerson.isAuthorized(), "人员未加入单位, 无法授权");
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(sealAndPerson.getSeal().getOuId());
|
||||
essClient.addSealAuthorization(superAdmin, sealAndPerson.getSeal(), sealPerson);
|
||||
orgManager.addSealAuthorization(request.getEssSealId(), request.getPersonId(), request.getOperatorPersonId());
|
||||
}
|
||||
@BizTransactional
|
||||
public void essAddSealAuthorization(AddSealAuthorizationRequest request) {
|
||||
String subject = idbuilder().append(request.getEssSealId()).append(request.getPersonId()).build();
|
||||
essLogDao.logRequest("essAddSealAuthorization", subject, request);
|
||||
SealAndPerson sealAndPerson = getSealAndPersonOrThrow(request);
|
||||
EssSealPerson sealPerson = sealAndPerson.getSealPerson();
|
||||
if (sealPerson.isAuthorized())
|
||||
return;
|
||||
EssPerson essPerson = essPersonDao.findOrNull(sealPerson);
|
||||
BizAssertions.assertNotNull(essPerson, "人员不存在: {}", sealPerson.getPersonId());
|
||||
BizAssertions.assertTrue(essPerson.isAuthorized(), "人员未加入单位, 无法授权");
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(sealAndPerson.getSeal().getOuId());
|
||||
essClient.addSealAuthorization(superAdmin, sealAndPerson.getSeal(), sealPerson);
|
||||
orgManager.addSealAuthorization(request.getEssSealId(), request.getPersonId(), request.getOperatorPersonId());
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void essRemoveSealAuthorization(RemoveSealAuthorizationRequest request) {
|
||||
String subject = idbuilder()
|
||||
.append(request.getEssSealId())
|
||||
.append(request.getPersonId())
|
||||
.build();
|
||||
essLogDao.logRequest("essRemoveSealAuthorization", subject, request);
|
||||
SealAndPerson sealAndPerson = getSealAndPersonOrThrow(request);
|
||||
if (!sealAndPerson.getSealPerson().isAuthorized())
|
||||
return;
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(sealAndPerson.getSeal().getOuId());
|
||||
BizAssertions.assertFalse(superAdmin.getPersonId().equals(request.getPersonId()), "不能取消超级管理员的印章授权");
|
||||
essClient.removeSealAuthorization(superAdmin, sealAndPerson.getSeal(), sealAndPerson.getSealPerson());
|
||||
orgManager.removeSealAuthorization(request.getEssSealId(), request.getPersonId());
|
||||
}
|
||||
@BizTransactional
|
||||
public void essRemoveSealAuthorization(RemoveSealAuthorizationRequest request) {
|
||||
String subject = idbuilder().append(request.getEssSealId()).append(request.getPersonId()).build();
|
||||
essLogDao.logRequest("essRemoveSealAuthorization", subject, request);
|
||||
SealAndPerson sealAndPerson = getSealAndPersonOrThrow(request);
|
||||
if (!sealAndPerson.getSealPerson().isAuthorized())
|
||||
return;
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(sealAndPerson.getSeal().getOuId());
|
||||
BizAssertions.assertFalse(superAdmin.getPersonId().equals(request.getPersonId()), "不能取消超级管理员的印章授权");
|
||||
essClient.removeSealAuthorization(superAdmin, sealAndPerson.getSeal(), sealAndPerson.getSealPerson());
|
||||
orgManager.removeSealAuthorization(request.getEssSealId(), request.getPersonId());
|
||||
}
|
||||
|
||||
private SealAndPerson getSealAndPersonOrThrow(SealAndPersonRequest request) {
|
||||
EssSeal seal = essSealDao.findByEssSealId(request.getEssSealId()).orElse(null);
|
||||
BizAssertions.assertNotNull(seal, "印章不存在: {}", request.getEssSealId());
|
||||
EssSealPerson sealPerson = essSealPersonDao
|
||||
.find(request.getEssSealId(), request.getPersonId())
|
||||
.orElse(null);
|
||||
BizAssertions.assertNotNull(sealPerson, "印章人员不存在: {}", request.getEssSealId(), request.getPersonId());
|
||||
return new SealAndPerson(seal, sealPerson);
|
||||
}
|
||||
private SealAndPerson getSealAndPersonOrThrow(SealAndPersonRequest request) {
|
||||
EssSeal seal = essSealDao.findByEssSealId(request.getEssSealId()).orElse(null);
|
||||
BizAssertions.assertNotNull(seal, "印章不存在: {}", request.getEssSealId());
|
||||
EssSealPerson sealPerson = essSealPersonDao.find(request.getEssSealId(), request.getPersonId()).orElse(null);
|
||||
BizAssertions.assertNotNull(sealPerson, "印章人员不存在: {}", request.getEssSealId(), request.getPersonId());
|
||||
return new SealAndPerson(seal, sealPerson);
|
||||
}
|
||||
|
||||
public String getContractSignUrl(GetSignUrlRequest request) {
|
||||
String subject = idbuilder()
|
||||
.append(request.getEssContractId())
|
||||
.append(request.getOuId())
|
||||
.append(request.getPersonId())
|
||||
.build();
|
||||
essLogDao.logRequest("getContractSignUrl", subject, request);
|
||||
EssPerson signPerson = essPersonDao.findOrNull(request);
|
||||
BizAssertions.assertNotNull(signPerson, "当前签署人员未加入单位, 无法签署");
|
||||
EssContract contract = essContractDao.getOrThrow(request.getEssContractId());
|
||||
BizAssertions.assertFalse(contract.isFinalState(),
|
||||
"合同已是最终状态 {}, 无法签署", contract.getState());
|
||||
if (contract.getConstraint() == Constraint.ONE_PERSON_PER_ORG)
|
||||
BizAssertions.assertFalse(contract.isOrgSigned(request.getOuId()), "该单位已签署, 无法再次签署");
|
||||
Function<String, String> 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());
|
||||
}
|
||||
public String getContractSignUrl(GetSignUrlRequest request) {
|
||||
String subject = idbuilder().append(request.getEssContractId()).append(request.getOuId()).append(
|
||||
request.getPersonId()).build();
|
||||
essLogDao.logRequest("getContractSignUrl", subject, request);
|
||||
EssPerson signPerson = essPersonDao.findOrNull(request);
|
||||
BizAssertions.assertNotNull(signPerson, "当前签署人员未加入单位, 无法签署");
|
||||
EssContract contract = essContractDao.getOrThrow(request.getEssContractId());
|
||||
BizAssertions.assertFalse(contract.isFinalState(), "合同已是最终状态 {}, 无法签署", contract.getState());
|
||||
if (contract.getConstraint() == Constraint.ONE_PERSON_PER_ORG)
|
||||
BizAssertions.assertFalse(contract.isOrgSigned(request.getOuId()), "该单位已签署, 无法再次签署");
|
||||
Function<String, String> 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());
|
||||
}
|
||||
|
||||
public String getContractPDFUrl(String essContractId) {
|
||||
EssContract contract = essContractDao.getOrThrow(essContractId);
|
||||
if (contract.isSavedOnOss())
|
||||
return ossService.getOssUrl(contract.getOssFileKey());
|
||||
// 尝试做补偿
|
||||
if (shouldDownloadContractPDF(contract) && !contract.isSavedOnOss()) {
|
||||
maybeScheduleDownloadContractPDF(contract, false);
|
||||
log.info("补偿下载合同PDF, essContractId={}", essContractId);
|
||||
}
|
||||
return getContractPDFUrlFromEss(contract);
|
||||
}
|
||||
public String getContractPDFUrl(String essContractId) {
|
||||
EssContract contract = essContractDao.getOrThrow(essContractId);
|
||||
if (contract.isSavedOnOss())
|
||||
return ossService.getOssUrl(contract.getOssFileKey());
|
||||
// 尝试做补偿
|
||||
if (shouldDownloadContractPDF(contract) && !contract.isSavedOnOss()) {
|
||||
maybeScheduleDownloadContractPDF(contract, false);
|
||||
log.info("补偿下载合同PDF, essContractId={}", essContractId);
|
||||
}
|
||||
return getContractPDFUrlFromEss(contract);
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void saveContractSnapshot(SaveContractSnapshotRequest request) {
|
||||
essLogDao.logRequest("saveContractSnapshot", request.getEssContractId(), request);
|
||||
EssContract contract = essContractDao.getOrThrow(request.getEssContractId());
|
||||
contract.getOrCreateExt().setSaveContractSnapshotArbitrarily(true);
|
||||
essContractDao.updateExt(contract);
|
||||
maybeScheduleDownloadContractPDF(contract, request.isRetryDownload());
|
||||
}
|
||||
@BizTransactional
|
||||
public void saveContractSnapshot(SaveContractSnapshotRequest request) {
|
||||
essLogDao.logRequest("saveContractSnapshot", request.getEssContractId(), request);
|
||||
EssContract contract = essContractDao.getOrThrow(request.getEssContractId());
|
||||
contract.getOrCreateExt().setSaveContractSnapshotArbitrarily(true);
|
||||
essContractDao.updateExt(contract);
|
||||
maybeScheduleDownloadContractPDF(contract, request.isRetryDownload());
|
||||
}
|
||||
|
||||
public void maybeScheduleDownloadContractPDF(EssContract contract, boolean retryDownload) {
|
||||
EssContract reload = essContractDao.findOrNull(contract.getEssContractId());
|
||||
if (shouldDownloadContractPDF(reload))
|
||||
essBroadcaster.fireDownloadContractPDF(contract, retryDownload);
|
||||
}
|
||||
public void maybeScheduleDownloadContractPDF(EssContract contract, boolean retryDownload) {
|
||||
EssContract reload = essContractDao.findOrNull(contract.getEssContractId());
|
||||
if (shouldDownloadContractPDF(reload))
|
||||
essBroadcaster.fireDownloadContractPDF(contract, retryDownload);
|
||||
}
|
||||
|
||||
private boolean shouldDownloadContractPDF(EssContract contract) {
|
||||
return contract != null && contract.shouldDownloadContract();
|
||||
}
|
||||
private boolean shouldDownloadContractPDF(EssContract contract) {
|
||||
return contract != null && contract.shouldDownloadContract();
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void downloadContractPDF(EssContract contract, boolean retryDownload) {
|
||||
if (contract.isSavedOnOss() && !retryDownload) {
|
||||
log.info("合同已下载PDF, contract={}", contract);
|
||||
return;
|
||||
}
|
||||
if (!shouldDownloadContractPDF(contract)) {
|
||||
log.info("合同不需要下载PDF, contract={}", contract);
|
||||
return;
|
||||
}
|
||||
if (contract.isFinalState() && contract.isSavedOnOss()) {
|
||||
log.info("合同已是终态且已下载PDF, contract={}", contract);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
String pdfUrl = getContractPDFUrlFromEss(contract);
|
||||
String fileName = String.format("%s.pdf", contract.getContractName());
|
||||
String fileKey = ossService.uploadToOss(pdfUrl, fileName);
|
||||
essContractDao.setOssFileKey(contract, fileKey);
|
||||
essLogDao.log("uploadContractToOss", contract.getEssContractId(),
|
||||
"ossFileKey", fileKey, "retryDownload", retryDownload);
|
||||
log.info("上传合同到OSS成功, essContractId={}", contract.getEssContractId());
|
||||
} catch (Exception e) {
|
||||
log.warn("上传合同到OSS失败", e);
|
||||
essLogDao.log(e, "uploadContractToOss", contract.getEssContractId(),
|
||||
"retryDownload", retryDownload);
|
||||
}
|
||||
}
|
||||
@BizTransactional
|
||||
public void downloadContractPDF(EssContract contract, boolean retryDownload) {
|
||||
if (contract.isSavedOnOss() && !retryDownload) {
|
||||
log.info("合同已下载PDF, contract={}", contract);
|
||||
return;
|
||||
}
|
||||
if (!shouldDownloadContractPDF(contract)) {
|
||||
log.info("合同不需要下载PDF, contract={}", contract);
|
||||
return;
|
||||
}
|
||||
if (contract.isFinalState() && contract.isSavedOnOss()) {
|
||||
log.info("合同已是终态且已下载PDF, contract={}", contract);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
String pdfUrl = getContractPDFUrlFromEss(contract);
|
||||
String fileName = String.format("%s.pdf", contract.getContractName());
|
||||
String fileKey = ossService.uploadToOss(pdfUrl, fileName);
|
||||
essContractDao.setOssFileKey(contract, fileKey);
|
||||
essLogDao.log("uploadContractToOss", contract.getEssContractId(), "ossFileKey", fileKey, "retryDownload",
|
||||
retryDownload);
|
||||
log.info("上传合同到OSS成功, essContractId={}", contract.getEssContractId());
|
||||
}
|
||||
catch (Exception e) {
|
||||
log.warn("上传合同到OSS失败", e);
|
||||
essLogDao.log(e, "uploadContractToOss", contract.getEssContractId(), "retryDownload", retryDownload);
|
||||
}
|
||||
}
|
||||
|
||||
private String getContractPDFUrlFromEss(EssContract contract) {
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(contract.getCreatorOuId());
|
||||
return essClient.getContractPDFUrl(superAdmin, contract.getEssContractId());
|
||||
}
|
||||
private String getContractPDFUrlFromEss(EssContract contract) {
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(contract.getCreatorOuId());
|
||||
return essClient.getContractPDFUrl(superAdmin, contract.getEssContractId());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.OrgPerson;
|
||||
@ -37,161 +38,152 @@ import static cn.axzo.nanopart.ess.server.utils.IdBuilder.idbuilder;
|
||||
@RequiredArgsConstructor
|
||||
public class OrgManager {
|
||||
|
||||
private final EssSupport essSupport;
|
||||
private final EssOrgDao essOrgDao;
|
||||
private final EssPersonDao essPersonDao;
|
||||
private final EssSealDao essSealDao;
|
||||
private final EssSealPersonDao essSealPersonDao;
|
||||
private final EssLogDao essLogDao;
|
||||
private final EssSupport essSupport;
|
||||
private final EssOrgDao essOrgDao;
|
||||
private final EssPersonDao essPersonDao;
|
||||
private final EssSealDao essSealDao;
|
||||
private final EssSealPersonDao essSealPersonDao;
|
||||
private final EssLogDao essLogDao;
|
||||
|
||||
// !! login
|
||||
// !! login
|
||||
|
||||
@BizTransactional
|
||||
public OrgAndPerson createConsoleLoginUrl(CreateConsoleLoginUrlRequest request) {
|
||||
EssOrg org = essOrgDao.findForUpdateOrNull(request.getOuId());
|
||||
if (org == null) {
|
||||
org = essSupport.createOrg(request);
|
||||
essOrgDao.save(org);
|
||||
}
|
||||
EssPerson person = getOrCreateOrgPerson(request);
|
||||
return new OrgAndPerson(org, person);
|
||||
}
|
||||
@BizTransactional
|
||||
public OrgAndPerson createConsoleLoginUrl(CreateConsoleLoginUrlRequest request) {
|
||||
EssOrg org = essOrgDao.findForUpdateOrNull(request.getOuId());
|
||||
if (org == null) {
|
||||
org = essSupport.createOrg(request);
|
||||
essOrgDao.save(org);
|
||||
}
|
||||
EssPerson person = getOrCreateOrgPerson(request);
|
||||
return new OrgAndPerson(org, person);
|
||||
}
|
||||
|
||||
// !! org and person
|
||||
// !! org and person
|
||||
|
||||
@BizTransactional
|
||||
public void addAuthorizedOrgPerson(OrgPerson orgPerson) {
|
||||
EssPerson person = getOrCreateOrgPerson(orgPerson);
|
||||
essPersonDao.setOrgPersonState(person, EssPersonState.AUTHORIZED);
|
||||
log.info("add authorized person: {}", person);
|
||||
}
|
||||
@BizTransactional
|
||||
public void addAuthorizedOrgPerson(OrgPerson orgPerson) {
|
||||
EssPerson person = getOrCreateOrgPerson(orgPerson);
|
||||
essPersonDao.setOrgPersonState(person, EssPersonState.AUTHORIZED);
|
||||
log.info("add authorized person: {}", person);
|
||||
}
|
||||
|
||||
private EssPerson getOrCreateOrgPerson(OrgPerson orgPerson) {
|
||||
EssPerson essPerson = essPersonDao.find(orgPerson, true).orElse(null);
|
||||
if (essPerson == null) {
|
||||
essPerson = essSupport.createPerson(orgPerson);
|
||||
essPersonDao.save(essPerson);
|
||||
essPerson = essPersonDao.find(orgPerson, true)
|
||||
.orElseThrow(InternalError::new);
|
||||
}
|
||||
return essPerson;
|
||||
}
|
||||
private EssPerson getOrCreateOrgPerson(OrgPerson orgPerson) {
|
||||
EssPerson essPerson = essPersonDao.find(orgPerson, true).orElse(null);
|
||||
if (essPerson == null) {
|
||||
essPerson = essSupport.createPerson(orgPerson);
|
||||
essPersonDao.save(essPerson);
|
||||
essPerson = essPersonDao.find(orgPerson, true).orElseThrow(InternalError::new);
|
||||
}
|
||||
return essPerson;
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void setOrgAuthorized(OrgPerson superAdmin) {
|
||||
essOrgDao.setOrgAuthorized(superAdmin);
|
||||
essLogDao.log("setOrgAuthorized", superAdmin.getOuId(), "superAdmin", superAdmin);
|
||||
log.info("set org authorized, superAdmin={}", superAdmin);
|
||||
}
|
||||
@BizTransactional
|
||||
public void setOrgAuthorized(OrgPerson superAdmin) {
|
||||
essOrgDao.setOrgAuthorized(superAdmin);
|
||||
essLogDao.log("setOrgAuthorized", superAdmin.getOuId(), "superAdmin", superAdmin);
|
||||
log.info("set org authorized, superAdmin={}", superAdmin);
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void changeSuperAdmin(Long ouId, Long superAdmin) {
|
||||
essOrgDao.changeSuperAdmin(ouId, superAdmin);
|
||||
log.info("change super admin: ouId={}, superAdmin={}", ouId, superAdmin);
|
||||
}
|
||||
@BizTransactional
|
||||
public void changeSuperAdmin(Long ouId, Long superAdmin) {
|
||||
essOrgDao.changeSuperAdmin(ouId, superAdmin);
|
||||
log.info("change super admin: ouId={}, superAdmin={}", ouId, superAdmin);
|
||||
}
|
||||
|
||||
public EssPerson getSuperAdminOrThrow(Long ouId) {
|
||||
EssPerson superAdmin = findSuperAdmin(ouId).orElse(null);
|
||||
BizAssertions.assertNotNull(superAdmin, "单位还未认证");
|
||||
return superAdmin;
|
||||
}
|
||||
public EssPerson getSuperAdminOrThrow(Long ouId) {
|
||||
EssPerson superAdmin = findSuperAdmin(ouId).orElse(null);
|
||||
BizAssertions.assertNotNull(superAdmin, "单位还未认证");
|
||||
return superAdmin;
|
||||
}
|
||||
|
||||
Optional<EssPerson> findSuperAdmin(Long ouId) {
|
||||
EssOrg org = essOrgDao.findOrNull(ouId);
|
||||
BizAssertions.assertNotNull(org, "单位不存在");
|
||||
if (org.getSuperAdminPersonId() <= 0L)
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(essPersonDao.findOrNull(ouId, org.getSuperAdminPersonId()));
|
||||
}
|
||||
Optional<EssPerson> findSuperAdmin(Long ouId) {
|
||||
EssOrg org = essOrgDao.findOrNull(ouId);
|
||||
BizAssertions.assertNotNull(org, "单位不存在");
|
||||
if (org.getSuperAdminPersonId() <= 0L)
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(essPersonDao.findOrNull(ouId, org.getSuperAdminPersonId()));
|
||||
}
|
||||
|
||||
// !! seal
|
||||
// !! seal
|
||||
|
||||
@BizTransactional
|
||||
public boolean maybeAddSeal(Long ouId, String essSealId, EssSealType type) {
|
||||
EssSeal seal = essSealDao.findByEssSealId(essSealId).orElse(null);
|
||||
if (seal != null)
|
||||
return false;
|
||||
seal = new EssSeal();
|
||||
seal.setOuId(ouId);
|
||||
seal.setEssSealId(essSealId);
|
||||
seal.setState(EssSealState.CREATE);
|
||||
seal.setType(type);
|
||||
try {
|
||||
essSealDao.save(seal);
|
||||
log.info("add seal: {}", seal);
|
||||
return true;
|
||||
} catch (DuplicateKeyException ignored) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@BizTransactional
|
||||
public boolean maybeAddSeal(Long ouId, String essSealId, EssSealType type) {
|
||||
EssSeal seal = essSealDao.findByEssSealId(essSealId).orElse(null);
|
||||
if (seal != null)
|
||||
return false;
|
||||
seal = new EssSeal();
|
||||
seal.setOuId(ouId);
|
||||
seal.setEssSealId(essSealId);
|
||||
seal.setState(EssSealState.CREATE);
|
||||
seal.setType(type);
|
||||
try {
|
||||
essSealDao.save(seal);
|
||||
log.info("add seal: {}", seal);
|
||||
return true;
|
||||
}
|
||||
catch (DuplicateKeyException ignored) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void updateSealState(String essSealId, EssSealState state) {
|
||||
essSealDao.updateState(essSealId, state);
|
||||
log.info("update seal state: {}, {}", essSealId, state);
|
||||
}
|
||||
public void updateSealState(String essSealId, EssSealState state) {
|
||||
essSealDao.updateState(essSealId, state);
|
||||
log.info("update seal state: {}, {}", essSealId, state);
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void addSealAuthorization(String essSealId, Long personId, Long authorizedByPersonId) {
|
||||
maybeAddSealPerson(essSealId, personId);
|
||||
essSealPersonDao.setPersonAuthorized(essSealId, personId, authorizedByPersonId);
|
||||
String subject = idbuilder()
|
||||
.append(essSealId)
|
||||
.append(personId)
|
||||
.build();
|
||||
essLogDao.log("addSealAuthorization", subject, "personId", personId, "authorizedBy", authorizedByPersonId);
|
||||
log.info("add seal authorization: essSealId={}, personId={}, authorizedByPersonId={}",
|
||||
essSealId, personId, authorizedByPersonId);
|
||||
}
|
||||
@BizTransactional
|
||||
public void addSealAuthorization(String essSealId, Long personId, Long authorizedByPersonId) {
|
||||
maybeAddSealPerson(essSealId, personId);
|
||||
essSealPersonDao.setPersonAuthorized(essSealId, personId, authorizedByPersonId);
|
||||
String subject = idbuilder().append(essSealId).append(personId).build();
|
||||
essLogDao.log("addSealAuthorization", subject, "personId", personId, "authorizedBy", authorizedByPersonId);
|
||||
log.info("add seal authorization: essSealId={}, personId={}, authorizedByPersonId={}", essSealId, personId,
|
||||
authorizedByPersonId);
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void removeSealAuthorization(String essSealId, Long personId) {
|
||||
maybeAddSealPerson(essSealId, personId);
|
||||
essSealPersonDao.removeSealAuthorization(essSealId, personId);
|
||||
String subject = idbuilder()
|
||||
.append(essSealId)
|
||||
.append(personId)
|
||||
.build();
|
||||
essLogDao.log("removeSealAuthorization", subject, "personId", personId);
|
||||
log.info("add seal authorization: essSealId={}, personId={}", essSealId, personId);
|
||||
}
|
||||
@BizTransactional
|
||||
public void removeSealAuthorization(String essSealId, Long personId) {
|
||||
maybeAddSealPerson(essSealId, personId);
|
||||
essSealPersonDao.removeSealAuthorization(essSealId, personId);
|
||||
String subject = idbuilder().append(essSealId).append(personId).build();
|
||||
essLogDao.log("removeSealAuthorization", subject, "personId", personId);
|
||||
log.info("add seal authorization: essSealId={}, personId={}", essSealId, personId);
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void maybeAddSealPerson(String essSealId, Long personId) {
|
||||
EssSeal seal = essSealDao.findByEssSealId(essSealId).orElse(null);
|
||||
BizAssertions.assertNotNull(seal, "印章不存在: {}", essSealId);
|
||||
EssSealPerson savedSealPerson = essSealPersonDao.find(essSealId, personId, true)
|
||||
.orElse(null);
|
||||
if (savedSealPerson != null)
|
||||
return;
|
||||
EssSealPerson sealPerson = new EssSealPerson();
|
||||
//noinspection DataFlowIssue
|
||||
sealPerson.setOuId(seal.getOuId());
|
||||
sealPerson.setEssSealId(essSealId);
|
||||
sealPerson.setPersonId(personId);
|
||||
sealPerson.setIsAuthorized(YesOrNo.NO);
|
||||
essSealPersonDao.save(sealPerson);
|
||||
}
|
||||
@BizTransactional
|
||||
public void maybeAddSealPerson(String essSealId, Long personId) {
|
||||
EssSeal seal = essSealDao.findByEssSealId(essSealId).orElse(null);
|
||||
BizAssertions.assertNotNull(seal, "印章不存在: {}", essSealId);
|
||||
EssSealPerson savedSealPerson = essSealPersonDao.find(essSealId, personId, true).orElse(null);
|
||||
if (savedSealPerson != null)
|
||||
return;
|
||||
EssSealPerson sealPerson = new EssSealPerson();
|
||||
//noinspection DataFlowIssue
|
||||
sealPerson.setOuId(seal.getOuId());
|
||||
sealPerson.setEssSealId(essSealId);
|
||||
sealPerson.setPersonId(personId);
|
||||
sealPerson.setIsAuthorized(YesOrNo.NO);
|
||||
essSealPersonDao.save(sealPerson);
|
||||
}
|
||||
|
||||
@BizTransactional
|
||||
public void tryRemoveSealPerson(RemoveSealPersonRequest request) {
|
||||
EssSeal seal = essSealDao.findByEssSealId(request.getEssSealId()).orElse(null);
|
||||
BizAssertions.assertNotNull(seal, "印章不存在: {}", request.getEssSealId());
|
||||
//noinspection DataFlowIssue
|
||||
EssPerson superAdmin = getSuperAdminOrThrow(seal.getOuId());
|
||||
BizAssertions.assertFalse(superAdmin.getPersonId().equals(request.getPersonId()), "不能从印章列表删除超级管理员");
|
||||
EssSealPerson sealPerson = essSealPersonDao
|
||||
.find(seal.getEssSealId(), request.getPersonId(), true)
|
||||
.orElse(null);
|
||||
BizAssertions.assertNotNull(sealPerson, "印章人员不存在");
|
||||
//noinspection DataFlowIssue
|
||||
BizAssertions.assertTrue(!sealPerson.isAuthorized(), "请先取消授权再删除");
|
||||
essSealPersonDao.removeById(sealPerson.getId());
|
||||
log.info("remove seal person: {}", sealPerson);
|
||||
}
|
||||
@BizTransactional
|
||||
public void tryRemoveSealPerson(RemoveSealPersonRequest request) {
|
||||
EssSeal seal = essSealDao.findByEssSealId(request.getEssSealId()).orElse(null);
|
||||
BizAssertions.assertNotNull(seal, "印章不存在: {}", request.getEssSealId());
|
||||
//noinspection DataFlowIssue
|
||||
EssPerson superAdmin = getSuperAdminOrThrow(seal.getOuId());
|
||||
BizAssertions.assertFalse(superAdmin.getPersonId().equals(request.getPersonId()), "不能从印章列表删除超级管理员");
|
||||
EssSealPerson sealPerson = essSealPersonDao.find(seal.getEssSealId(), request.getPersonId(), true).orElse(null);
|
||||
BizAssertions.assertNotNull(sealPerson, "印章人员不存在");
|
||||
//noinspection DataFlowIssue
|
||||
BizAssertions.assertTrue(!sealPerson.isAuthorized(), "请先取消授权再删除");
|
||||
essSealPersonDao.removeById(sealPerson.getId());
|
||||
log.info("remove seal person: {}", sealPerson);
|
||||
}
|
||||
|
||||
public void setOrgPersonResign(EssPerson person) {
|
||||
essPersonDao.setOrgPersonState(person, EssPersonState.RESIGNED);
|
||||
log.info("set person resigned: {}", person);
|
||||
}
|
||||
public void setOrgPersonResign(EssPerson person) {
|
||||
essPersonDao.setOrgPersonState(person, EssPersonState.RESIGNED);
|
||||
log.info("set person resigned: {}", person);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess;
|
||||
|
||||
import cn.axzo.basics.common.BeanMapper;
|
||||
@ -51,136 +52,127 @@ import static java.util.stream.Collectors.toSet;
|
||||
@RequiredArgsConstructor
|
||||
public class QueryService {
|
||||
|
||||
private final EssOrgDao essOrgDao;
|
||||
private final EssPersonDao essPersonDao;
|
||||
private final EssSealDao essSealDao;
|
||||
private final EssSealPersonDao essSealPersonDao;
|
||||
private final EssSupport essSupport;
|
||||
private final EssOrgDao essOrgDao;
|
||||
private final EssPersonDao essPersonDao;
|
||||
private final EssSealDao essSealDao;
|
||||
private final EssSealPersonDao essSealPersonDao;
|
||||
private final EssSupport essSupport;
|
||||
|
||||
public List<GetOrgAuthStatesResponse> getOrgAuthStates(GetOrgAuthStatesRequest request) {
|
||||
List<EssOrg> orgs = essOrgDao.getByOuIds(request.getOuIds());
|
||||
ArrayList<GetOrgAuthStatesResponse> responses = new ArrayList<>();
|
||||
for (Long ouId : request.getOuIds()) {
|
||||
GetOrgAuthStatesResponse response = new GetOrgAuthStatesResponse();
|
||||
responses.add(response);
|
||||
response.setOuId(ouId);
|
||||
response.setAuthorized(orgs.stream()
|
||||
.filter(org -> org.getOuId().equals(ouId))
|
||||
.map(EssOrg::isAuthorized)
|
||||
.findFirst()
|
||||
.orElse(false));
|
||||
}
|
||||
return responses;
|
||||
}
|
||||
public List<GetOrgAuthStatesResponse> getOrgAuthStates(GetOrgAuthStatesRequest request) {
|
||||
List<EssOrg> orgs = essOrgDao.getByOuIds(request.getOuIds());
|
||||
ArrayList<GetOrgAuthStatesResponse> responses = new ArrayList<>();
|
||||
for (Long ouId : request.getOuIds()) {
|
||||
GetOrgAuthStatesResponse response = new GetOrgAuthStatesResponse();
|
||||
responses.add(response);
|
||||
response.setOuId(ouId);
|
||||
response.setAuthorized(
|
||||
orgs.stream().filter(org -> org.getOuId().equals(ouId)).map(EssOrg::isAuthorized).findFirst().orElse(
|
||||
false));
|
||||
}
|
||||
return responses;
|
||||
}
|
||||
|
||||
public GetPersonAuthStateResponse getPersonAuthState(GetPersonAuthStateRequest request) {
|
||||
EssPerson person = essPersonDao.findOrNull(request);
|
||||
GetPersonAuthStateResponse response = new GetPersonAuthStateResponse();
|
||||
response.setAuthorized(person != null && person.isAuthorized());
|
||||
return response;
|
||||
}
|
||||
public GetPersonAuthStateResponse getPersonAuthState(GetPersonAuthStateRequest request) {
|
||||
EssPerson person = essPersonDao.findOrNull(request);
|
||||
GetPersonAuthStateResponse response = new GetPersonAuthStateResponse();
|
||||
response.setAuthorized(person != null && person.isAuthorized());
|
||||
return response;
|
||||
}
|
||||
|
||||
public List<EssOrgAndSealInfo> getOrgEnabledSeals(GetSealsRequest request) {
|
||||
List<EssOrg> orgs = essOrgDao.lambdaQuery()
|
||||
.in(EssOrg::getOuId, request.getOuIds())
|
||||
.list();
|
||||
Map<Long, List<EssSeal>> ouId2Seals = essSealDao.lambdaQuery()
|
||||
.in(EssSeal::getOuId, request.getOuIds())
|
||||
.eq(EssSeal::getState, EssSealState.ENABLED)
|
||||
.list().stream()
|
||||
.collect(groupingBy(EssSeal::getOuId));
|
||||
Set<String> essSealIds = ouId2Seals.values().stream().flatMap(Collection::stream)
|
||||
.map(EssSeal::getEssSealId)
|
||||
.collect(toSet());
|
||||
Map<String, List<EssSealPerson>> essSealId2Persons = Collections.emptyMap();
|
||||
if (!essSealIds.isEmpty())
|
||||
essSealId2Persons = essSealPersonDao.lambdaQuery()
|
||||
.in(EssSealPerson::getEssSealId, essSealIds)
|
||||
.list().stream()
|
||||
.collect(groupingBy(EssSealPerson::getEssSealId));
|
||||
HashSet<Long> personIds = new HashSet<>();
|
||||
essSealId2Persons.values().stream().flatMap(Collection::stream).forEach(sealPerson -> {
|
||||
personIds.add(sealPerson.getPersonId());
|
||||
personIds.add(sealPerson.getAuthorizedByPersonId());
|
||||
});
|
||||
// ess person
|
||||
EssPersons essPersons = EssPersons.wrap(essPersonDao.getByPersonIds(personIds));
|
||||
// person profile
|
||||
PersonProfiles personProfiles = PersonProfiles.wrap(
|
||||
essSupport.getPersonProfiles(Lists.newArrayList(personIds)));
|
||||
ArrayList<EssOrgAndSealInfo> essOrgAndSeals = new ArrayList<>();
|
||||
for (EssOrg org : orgs) {
|
||||
EssOrgAndSealInfo orgAndSeal = new EssOrgAndSealInfo();
|
||||
essOrgAndSeals.add(orgAndSeal);
|
||||
orgAndSeal.setOrg(BeanMapper.copyBean(org, EssOrgInfo.class));
|
||||
orgAndSeal.getOrg().setOrgAuthorized(org.isAuthorized());
|
||||
List<EssSeal> seals = ouId2Seals.getOrDefault(org.getOuId(), Collections.emptyList());
|
||||
orgAndSeal.setSeals(BeanMapper.copyList(seals, EssSealInfo.class));
|
||||
for (EssSealInfo sealInfo : orgAndSeal.getSeals()) {
|
||||
List<EssSealPerson> persons = essSealId2Persons.getOrDefault(sealInfo.getEssSealId(), Collections.emptyList());
|
||||
for (EssSealPerson sealPerson : persons) {
|
||||
EssPerson essPerson = essPersons.getOrThrow(OuAndPersonId.create(
|
||||
sealPerson.getOuId(), sealPerson.getPersonId()));
|
||||
if (essPerson.getState() == EssPersonState.RESIGNED)
|
||||
continue;
|
||||
EssSealPersonInfo sealPersonInfo = BeanMapper.copyBean(sealPerson, EssSealPersonInfo.class);
|
||||
sealPersonInfo.setSuperAdmin(org.isSuperAdmin(sealPerson.getPersonId()));
|
||||
sealPersonInfo.setSealAuthorized(sealPerson.isAuthorized());
|
||||
sealPersonInfo.setPersonAuthorized(essPerson.isAuthorized());
|
||||
sealPersonInfo.setAuthorizeTimeMs(sealPerson.getAuthorizeTime() == null
|
||||
? null : sealPerson.getAuthorizeTime().getTime());
|
||||
populatePersons(sealPerson, sealPersonInfo, personProfiles);
|
||||
sealInfo.addSealPerson(sealPersonInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
return essOrgAndSeals;
|
||||
}
|
||||
public List<EssOrgAndSealInfo> getOrgEnabledSeals(GetSealsRequest request) {
|
||||
List<EssOrg> orgs = essOrgDao.lambdaQuery().in(EssOrg::getOuId, request.getOuIds()).list();
|
||||
Map<Long, List<EssSeal>> ouId2Seals = essSealDao.lambdaQuery().in(EssSeal::getOuId, request.getOuIds()).eq(
|
||||
EssSeal::getState, EssSealState.ENABLED).list().stream().collect(groupingBy(EssSeal::getOuId));
|
||||
Set<String> essSealIds = ouId2Seals.values().stream().flatMap(Collection::stream).map(
|
||||
EssSeal::getEssSealId).collect(toSet());
|
||||
Map<String, List<EssSealPerson>> essSealId2Persons = Collections.emptyMap();
|
||||
if (!essSealIds.isEmpty())
|
||||
essSealId2Persons = essSealPersonDao.lambdaQuery().in(EssSealPerson::getEssSealId,
|
||||
essSealIds).list().stream().collect(groupingBy(EssSealPerson::getEssSealId));
|
||||
HashSet<Long> personIds = new HashSet<>();
|
||||
essSealId2Persons.values().stream().flatMap(Collection::stream).forEach(sealPerson -> {
|
||||
personIds.add(sealPerson.getPersonId());
|
||||
personIds.add(sealPerson.getAuthorizedByPersonId());
|
||||
});
|
||||
// ess person
|
||||
EssPersons essPersons = EssPersons.wrap(essPersonDao.getByPersonIds(personIds));
|
||||
// person profile
|
||||
PersonProfiles personProfiles = PersonProfiles.wrap(
|
||||
essSupport.getPersonProfiles(Lists.newArrayList(personIds)));
|
||||
ArrayList<EssOrgAndSealInfo> essOrgAndSeals = new ArrayList<>();
|
||||
for (EssOrg org : orgs) {
|
||||
EssOrgAndSealInfo orgAndSeal = new EssOrgAndSealInfo();
|
||||
essOrgAndSeals.add(orgAndSeal);
|
||||
orgAndSeal.setOrg(BeanMapper.copyBean(org, EssOrgInfo.class));
|
||||
orgAndSeal.getOrg().setOrgAuthorized(org.isAuthorized());
|
||||
List<EssSeal> seals = ouId2Seals.getOrDefault(org.getOuId(), Collections.emptyList());
|
||||
orgAndSeal.setSeals(BeanMapper.copyList(seals, EssSealInfo.class));
|
||||
for (EssSealInfo sealInfo : orgAndSeal.getSeals()) {
|
||||
List<EssSealPerson> persons = essSealId2Persons.getOrDefault(sealInfo.getEssSealId(),
|
||||
Collections.emptyList());
|
||||
for (EssSealPerson sealPerson : persons) {
|
||||
EssPerson essPerson = essPersons.getOrThrow(
|
||||
OuAndPersonId.create(sealPerson.getOuId(), sealPerson.getPersonId()));
|
||||
if (essPerson.getState() == EssPersonState.RESIGNED)
|
||||
continue;
|
||||
EssSealPersonInfo sealPersonInfo = BeanMapper.copyBean(sealPerson, EssSealPersonInfo.class);
|
||||
sealPersonInfo.setSuperAdmin(org.isSuperAdmin(sealPerson.getPersonId()));
|
||||
sealPersonInfo.setSealAuthorized(sealPerson.isAuthorized());
|
||||
sealPersonInfo.setPersonAuthorized(essPerson.isAuthorized());
|
||||
sealPersonInfo.setAuthorizeTimeMs(
|
||||
sealPerson.getAuthorizeTime() == null ? null : sealPerson.getAuthorizeTime().getTime());
|
||||
populatePersons(sealPerson, sealPersonInfo, personProfiles);
|
||||
sealInfo.addSealPerson(sealPersonInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
return essOrgAndSeals;
|
||||
}
|
||||
|
||||
public List<EssSealPersonInfo> getSealPersons(GetSealPersonRequest request) {
|
||||
List<EssSealPerson> sealPersons = essSealPersonDao.get(request.getEssSealId());
|
||||
if (sealPersons.isEmpty())
|
||||
return Collections.emptyList();
|
||||
HashSet<Long> personIds = new HashSet<>();
|
||||
sealPersons.forEach(sealPerson -> {
|
||||
personIds.add(sealPerson.getPersonId());
|
||||
personIds.add(sealPerson.getAuthorizedByPersonId());
|
||||
});
|
||||
EssPersons essPersons = EssPersons.wrap(essPersonDao.getByPersonIds(personIds));
|
||||
PersonProfiles personProfiles = PersonProfiles.wrap(
|
||||
essSupport.getPersonProfiles(Lists.newArrayList(personIds)));
|
||||
EssOrg org = essOrgDao.findOrNull(sealPersons.get(0).getOuId());
|
||||
BizAssertions.assertNotNull(org, "org not found, ouId={}", sealPersons.get(0).getOuId());
|
||||
ArrayList<EssSealPersonInfo> sealPersonsInfo = new ArrayList<>();
|
||||
for (EssSealPerson sealPerson : sealPersons) {
|
||||
EssPerson essPerson = essPersons.getOrThrow(OuAndPersonId.create(
|
||||
sealPerson.getOuId(), sealPerson.getPersonId()));
|
||||
if (essPerson.getState() == EssPersonState.RESIGNED)
|
||||
continue;
|
||||
EssSealPersonInfo sealPersonInfo = BeanMapper.copyBean(sealPerson, EssSealPersonInfo.class);
|
||||
sealPersonInfo.setSuperAdmin(org.isSuperAdmin(sealPerson.getPersonId()));
|
||||
sealPersonInfo.setSealAuthorized(sealPerson.isAuthorized());
|
||||
sealPersonInfo.setPersonAuthorized(essPerson.isAuthorized());
|
||||
sealPersonInfo.setAuthorizeTimeMs(sealPerson.getAuthorizeTime() == null
|
||||
? null : sealPerson.getAuthorizeTime().getTime());
|
||||
populatePersons(sealPerson, sealPersonInfo, personProfiles);
|
||||
sealPersonsInfo.add(sealPersonInfo);
|
||||
}
|
||||
return sealPersonsInfo;
|
||||
}
|
||||
public List<EssSealPersonInfo> getSealPersons(GetSealPersonRequest request) {
|
||||
List<EssSealPerson> sealPersons = essSealPersonDao.get(request.getEssSealId());
|
||||
if (sealPersons.isEmpty())
|
||||
return Collections.emptyList();
|
||||
HashSet<Long> personIds = new HashSet<>();
|
||||
sealPersons.forEach(sealPerson -> {
|
||||
personIds.add(sealPerson.getPersonId());
|
||||
personIds.add(sealPerson.getAuthorizedByPersonId());
|
||||
});
|
||||
EssPersons essPersons = EssPersons.wrap(essPersonDao.getByPersonIds(personIds));
|
||||
PersonProfiles personProfiles = PersonProfiles.wrap(
|
||||
essSupport.getPersonProfiles(Lists.newArrayList(personIds)));
|
||||
EssOrg org = essOrgDao.findOrNull(sealPersons.get(0).getOuId());
|
||||
BizAssertions.assertNotNull(org, "org not found, ouId={}", sealPersons.get(0).getOuId());
|
||||
ArrayList<EssSealPersonInfo> sealPersonsInfo = new ArrayList<>();
|
||||
for (EssSealPerson sealPerson : sealPersons) {
|
||||
EssPerson essPerson = essPersons.getOrThrow(
|
||||
OuAndPersonId.create(sealPerson.getOuId(), sealPerson.getPersonId()));
|
||||
if (essPerson.getState() == EssPersonState.RESIGNED)
|
||||
continue;
|
||||
EssSealPersonInfo sealPersonInfo = BeanMapper.copyBean(sealPerson, EssSealPersonInfo.class);
|
||||
sealPersonInfo.setSuperAdmin(org.isSuperAdmin(sealPerson.getPersonId()));
|
||||
sealPersonInfo.setSealAuthorized(sealPerson.isAuthorized());
|
||||
sealPersonInfo.setPersonAuthorized(essPerson.isAuthorized());
|
||||
sealPersonInfo.setAuthorizeTimeMs(
|
||||
sealPerson.getAuthorizeTime() == null ? null : sealPerson.getAuthorizeTime().getTime());
|
||||
populatePersons(sealPerson, sealPersonInfo, personProfiles);
|
||||
sealPersonsInfo.add(sealPersonInfo);
|
||||
}
|
||||
return sealPersonsInfo;
|
||||
}
|
||||
|
||||
private void populatePersons(EssSealPerson sealPerson,
|
||||
EssSealPersonInfo sealPersonInfo,
|
||||
PersonProfiles personProfiles) {
|
||||
BiConsumer<Long, PersonProfileInfo> builder = (personId, profileInfo) -> {
|
||||
PersonProfileDto profile = personProfiles.findOrNull(personId);
|
||||
if (profile == null) return;
|
||||
profileInfo.setPersonId(personId);
|
||||
profileInfo.setPersonName(profile.getRealName());
|
||||
profileInfo.setAvatar(profile.getAvatarUrl());
|
||||
};
|
||||
builder.accept(sealPerson.getPersonId(), sealPersonInfo.getSealPerson());
|
||||
builder.accept(sealPerson.getAuthorizedByPersonId(), sealPersonInfo.getAuthorizedByPerson());
|
||||
}
|
||||
private void populatePersons(EssSealPerson sealPerson, EssSealPersonInfo sealPersonInfo,
|
||||
PersonProfiles personProfiles) {
|
||||
BiConsumer<Long, PersonProfileInfo> builder = (personId, profileInfo) -> {
|
||||
PersonProfileDto profile = personProfiles.findOrNull(personId);
|
||||
if (profile == null)
|
||||
return;
|
||||
profileInfo.setPersonId(personId);
|
||||
profileInfo.setPersonName(profile.getRealName());
|
||||
profileInfo.setAvatar(profile.getAvatarUrl());
|
||||
};
|
||||
builder.accept(sealPerson.getPersonId(), sealPersonInfo.getSealPerson());
|
||||
builder.accept(sealPerson.getAuthorizedByPersonId(), sealPersonInfo.getAuthorizedByPerson());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.controller;
|
||||
|
||||
import cn.axzo.basics.common.BeanMapper;
|
||||
@ -50,124 +51,124 @@ import java.util.List;
|
||||
@RequiredArgsConstructor
|
||||
class ApiController implements EssApi {
|
||||
|
||||
private final OrgManager orgManager;
|
||||
private final ContractManager contractManager;
|
||||
private final QueryService queryService;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssService essService;
|
||||
private final OrgManager orgManager;
|
||||
private final ContractManager contractManager;
|
||||
private final QueryService queryService;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssService essService;
|
||||
|
||||
@Override
|
||||
public ApiResult<List<GetOrgAuthStatesResponse>> getOrgAuthStates(GetOrgAuthStatesRequest request) {
|
||||
log.info("getOrgAuthStates request={}", request);
|
||||
return ApiResult.ok(queryService.getOrgAuthStates(request));
|
||||
}
|
||||
@Override
|
||||
public ApiResult<List<GetOrgAuthStatesResponse>> getOrgAuthStates(GetOrgAuthStatesRequest request) {
|
||||
log.info("getOrgAuthStates request={}", request);
|
||||
return ApiResult.ok(queryService.getOrgAuthStates(request));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<GetPersonAuthStateResponse> getPersonAuthState(GetPersonAuthStateRequest request) {
|
||||
log.info("getPersonAuthState request={}", request);
|
||||
return ApiResult.ok(queryService.getPersonAuthState(request));
|
||||
}
|
||||
@Override
|
||||
public ApiResult<GetPersonAuthStateResponse> getPersonAuthState(GetPersonAuthStateRequest request) {
|
||||
log.info("getPersonAuthState request={}", request);
|
||||
return ApiResult.ok(queryService.getPersonAuthState(request));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<CreateConsoleLoginUrlResponse> createConsoleLoginUrl(CreateConsoleLoginUrlRequest request) {
|
||||
log.info("createConsoleLoginUrl request={}", request);
|
||||
CreateConsoleLoginUrlResponse response = new CreateConsoleLoginUrlResponse();
|
||||
response.setConsoleLoginUrl(essService.createConsoleLoginUrl(request));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
@Override
|
||||
public ApiResult<CreateConsoleLoginUrlResponse> createConsoleLoginUrl(CreateConsoleLoginUrlRequest request) {
|
||||
log.info("createConsoleLoginUrl request={}", request);
|
||||
CreateConsoleLoginUrlResponse response = new CreateConsoleLoginUrlResponse();
|
||||
response.setConsoleLoginUrl(essService.createConsoleLoginUrl(request));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<GetEmbedWebUrlResponse> getEmbedWebUrl(GetEmbedWebUrlRequest request) {
|
||||
log.info("getEmbedWebUrl request={}", request);
|
||||
GetEmbedWebUrlResponse response = new GetEmbedWebUrlResponse();
|
||||
response.setEmbedWebUrl(essService.getEmbedWebUrl(request));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
@Override
|
||||
public ApiResult<GetEmbedWebUrlResponse> getEmbedWebUrl(GetEmbedWebUrlRequest request) {
|
||||
log.info("getEmbedWebUrl request={}", request);
|
||||
GetEmbedWebUrlResponse response = new GetEmbedWebUrlResponse();
|
||||
response.setEmbedWebUrl(essService.getEmbedWebUrl(request));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<List<EssOrgAndSealInfo>> getOrgEnabledSeals(GetSealsRequest request) {
|
||||
log.info("getOrgEnabledSeals request={}", request);
|
||||
return ApiResult.ok(queryService.getOrgEnabledSeals(request));
|
||||
}
|
||||
@Override
|
||||
public ApiResult<List<EssOrgAndSealInfo>> getOrgEnabledSeals(GetSealsRequest request) {
|
||||
log.info("getOrgEnabledSeals request={}", request);
|
||||
return ApiResult.ok(queryService.getOrgEnabledSeals(request));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<List<EssSealPersonInfo>> getSealPersons(GetSealPersonRequest request) {
|
||||
log.info("getSealPersons request={}", request);
|
||||
return ApiResult.ok(queryService.getSealPersons(request));
|
||||
}
|
||||
@Override
|
||||
public ApiResult<List<EssSealPersonInfo>> getSealPersons(GetSealPersonRequest request) {
|
||||
log.info("getSealPersons request={}", request);
|
||||
return ApiResult.ok(queryService.getSealPersons(request));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<Void> addSealPerson(AddSealPersonRequest request) {
|
||||
log.info("addSealPerson request={}", request);
|
||||
orgManager.maybeAddSealPerson(request.getEssSealId(), request.getPersonId());
|
||||
return ApiResult.ok();
|
||||
}
|
||||
@Override
|
||||
public ApiResult<Void> addSealPerson(AddSealPersonRequest request) {
|
||||
log.info("addSealPerson request={}", request);
|
||||
orgManager.maybeAddSealPerson(request.getEssSealId(), request.getPersonId());
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<Void> removeSealPerson(RemoveSealPersonRequest request) {
|
||||
log.info("removeSealPerson request={}", request);
|
||||
orgManager.tryRemoveSealPerson(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
@Override
|
||||
public ApiResult<Void> removeSealPerson(RemoveSealPersonRequest request) {
|
||||
log.info("removeSealPerson request={}", request);
|
||||
orgManager.tryRemoveSealPerson(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<Void> addSealAuthorization(AddSealAuthorizationRequest request) {
|
||||
log.info("addSealAuthorization request={}", request);
|
||||
essService.essAddSealAuthorization(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
@Override
|
||||
public ApiResult<Void> addSealAuthorization(AddSealAuthorizationRequest request) {
|
||||
log.info("addSealAuthorization request={}", request);
|
||||
essService.essAddSealAuthorization(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<Void> removeSealAuthorization(RemoveSealAuthorizationRequest request) {
|
||||
log.info("removeSealAuthorization request={}", request);
|
||||
essService.essRemoveSealAuthorization(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
@Override
|
||||
public ApiResult<Void> removeSealAuthorization(RemoveSealAuthorizationRequest request) {
|
||||
log.info("removeSealAuthorization request={}", request);
|
||||
essService.essRemoveSealAuthorization(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<CreateContractByFileResponse> createContractByFile(CreateContractByFileRequest request) {
|
||||
log.info("createContractByFile request={}", request);
|
||||
return ApiResult.ok(contractManager.createContractByFile(request));
|
||||
}
|
||||
@Override
|
||||
public ApiResult<CreateContractByFileResponse> createContractByFile(CreateContractByFileRequest request) {
|
||||
log.info("createContractByFile request={}", request);
|
||||
return ApiResult.ok(contractManager.createContractByFile(request));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<GetSignUrlResponse> getContractSignUrl(GetSignUrlRequest request) {
|
||||
log.info("getContractSignUrl request={}", request);
|
||||
GetSignUrlResponse response = new GetSignUrlResponse();
|
||||
response.setUrl(essService.getContractSignUrl(request));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
@Override
|
||||
public ApiResult<GetSignUrlResponse> getContractSignUrl(GetSignUrlRequest request) {
|
||||
log.info("getContractSignUrl request={}", request);
|
||||
GetSignUrlResponse response = new GetSignUrlResponse();
|
||||
response.setUrl(essService.getContractSignUrl(request));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<DownloadSingedContractPdfResponse> getContractPDFUrl(DownloadSingedContractPdfRequest request) {
|
||||
log.info("getContractPDFUrl request={}", request);
|
||||
DownloadSingedContractPdfResponse response = new DownloadSingedContractPdfResponse();
|
||||
response.setPdfUrl(essService.getContractPDFUrl(request.getEssContractId()));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
@Override
|
||||
public ApiResult<DownloadSingedContractPdfResponse> getContractPDFUrl(DownloadSingedContractPdfRequest request) {
|
||||
log.info("getContractPDFUrl request={}", request);
|
||||
DownloadSingedContractPdfResponse response = new DownloadSingedContractPdfResponse();
|
||||
response.setPdfUrl(essService.getContractPDFUrl(request.getEssContractId()));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<Void> saveContractSnapshot(SaveContractSnapshotRequest request) {
|
||||
log.info("saveContractSnapshot request={}", request);
|
||||
essService.saveContractSnapshot(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
@Override
|
||||
public ApiResult<Void> saveContractSnapshot(SaveContractSnapshotRequest request) {
|
||||
log.info("saveContractSnapshot request={}", request);
|
||||
essService.saveContractSnapshot(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<Void> revokeContract(RevokeContractRequest request) {
|
||||
log.info("revokeContract request={}", request);
|
||||
contractManager.revokeContract(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
@Override
|
||||
public ApiResult<Void> revokeContract(RevokeContractRequest request) {
|
||||
log.info("revokeContract request={}", request);
|
||||
contractManager.revokeContract(request);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<GetContractDetailByContractIdResponse>
|
||||
getContractByContractId(GetContractDetailByContractIdRequest request) {
|
||||
log.info("getContractByContractId request={}", request);
|
||||
EssContract contract = essContractDao.getOrThrow(request.getEssContractId());
|
||||
GetContractDetailByContractIdResponse response = new GetContractDetailByContractIdResponse();
|
||||
response.setContract(BeanMapper.copyBean(contract, EssContractInfo.class));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
@Override
|
||||
public ApiResult<GetContractDetailByContractIdResponse> getContractByContractId(
|
||||
GetContractDetailByContractIdRequest request) {
|
||||
log.info("getContractByContractId request={}", request);
|
||||
EssContract contract = essContractDao.getOrThrow(request.getEssContractId());
|
||||
GetContractDetailByContractIdResponse response = new GetContractDetailByContractIdResponse();
|
||||
response.setContract(BeanMapper.copyBean(contract, EssContractInfo.class));
|
||||
return ApiResult.ok(response);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.controller;
|
||||
|
||||
import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
@ -58,215 +59,205 @@ import static java.util.stream.Collectors.toList;
|
||||
@RequiredArgsConstructor
|
||||
class CallbackController implements EssCallbackApi, InitializingBean {
|
||||
|
||||
private final OrgManager orgManager;
|
||||
private final EssService essService;
|
||||
private final ContractManager contractManager;
|
||||
private final EssLogDao essLogDao;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssSealPersonDao essSealPersonDao;
|
||||
private final TransactionTemplate transactionTemplate;
|
||||
private final EssSupport essSupport;
|
||||
private final Map<CallbackType, CallbackHandler> handlers = new HashMap<>();
|
||||
private final OrgManager orgManager;
|
||||
private final EssService essService;
|
||||
private final ContractManager contractManager;
|
||||
private final EssLogDao essLogDao;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssSealPersonDao essSealPersonDao;
|
||||
private final TransactionTemplate transactionTemplate;
|
||||
private final EssSupport essSupport;
|
||||
private final Map<CallbackType, CallbackHandler> handlers = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
// 企业开通电子签回调
|
||||
registerHandler(CallbackType.ORG_AUTHORIZATION_FINISH, request -> {
|
||||
OrgAuthorizationFinish result = request.readMsgData(OrgAuthorizationFinish.class);
|
||||
PersonOpenId superAdmin = PersonOpenId.parse(result.getProxyOperatorOpenId());
|
||||
if (result.isOpenSuccess()) {
|
||||
orgManager.addAuthorizedOrgPerson(superAdmin);
|
||||
orgManager.setOrgAuthorized(superAdmin);
|
||||
}
|
||||
return idbuilder()
|
||||
.append(superAdmin.getOuId())
|
||||
.append(superAdmin.getPersonId())
|
||||
.build();
|
||||
});
|
||||
// 员工加入子企业的时候发送此通知
|
||||
registerHandler(CallbackType.ORG_PERSON_JOIN, request -> {
|
||||
PersonOpenId person = PersonOpenId.parse(request.readMsgData(OrgPersonJoin.class).getProxyOperatorOpenId());
|
||||
orgManager.addAuthorizedOrgPerson(person);
|
||||
// 一般情况下只会存在一条记录
|
||||
for (EssSealPerson sealPerson : essSealPersonDao.getByPersonId(person.getOuId(), person.getPersonId())) {
|
||||
AddSealAuthorizationRequest addSealAuthorizationRequest = new AddSealAuthorizationRequest();
|
||||
addSealAuthorizationRequest.setEssSealId(sealPerson.getEssSealId());
|
||||
addSealAuthorizationRequest.setPersonId(person.getPersonId());
|
||||
// 保留界面上的操作人
|
||||
addSealAuthorizationRequest.setOperatorPersonId(null);
|
||||
try {
|
||||
essService.essAddSealAuthorization(addSealAuthorizationRequest);
|
||||
} catch (Exception e) {
|
||||
String subject = idbuilder()
|
||||
.append(sealPerson.getEssSealId())
|
||||
.append(sealPerson.getPersonId())
|
||||
.build();
|
||||
essLogDao.log(e, "essAddSealAuthorization", subject);
|
||||
log.warn("add seal authorization failed", e);
|
||||
}
|
||||
}
|
||||
return idbuilder()
|
||||
.append(person.getOuId())
|
||||
.append(person.getPersonId())
|
||||
.build();
|
||||
});
|
||||
// 印章回调
|
||||
registerHandler(CallbackType.SEAL_OPERATE, request -> {
|
||||
SealOperate operate = request.readMsgData(SealOperate.class);
|
||||
OrgOpenId ou = OrgOpenId.parse(operate.getProxyOrganizationOpenId());
|
||||
PersonOpenId operator = PersonOpenId.parse(operate.getProxyOperatorOpenId());
|
||||
PersonOpenId authorized =
|
||||
StringUtils.isBlank(operate.getAuthorizedOperatorOpenId())
|
||||
? PersonOpenId.none()
|
||||
: PersonOpenId.parse(operate.getAuthorizedOperatorOpenId());
|
||||
boolean sealCreated = orgManager.maybeAddSeal(ou.getOuId(), operate.getSealId(),
|
||||
EssSealType.fromEssCode(operate.getSealType()));
|
||||
// 1. 印章创建人会自动获得授权; 2. 避免miss create事件
|
||||
if (sealCreated)
|
||||
orgManager.addSealAuthorization(operate.getSealId(), operator.getPersonId(), operator.getPersonId());
|
||||
if ("Delete".equals(operate.getOperate()))
|
||||
orgManager.updateSealState(operate.getSealId(), EssSealState.DELETED);
|
||||
if ("Disable".equals(operate.getOperate()))
|
||||
orgManager.updateSealState(operate.getSealId(), EssSealState.DISABLED);
|
||||
if ("Enable".equals(operate.getOperate()))
|
||||
orgManager.updateSealState(operate.getSealId(), EssSealState.ENABLED);
|
||||
if ("Valid".equals(operate.getOperate())) {
|
||||
EssSealPerson savedPerson = essSealPersonDao
|
||||
.find(operate.getSealId(), authorized.getPersonId())
|
||||
.orElse(null);
|
||||
// 可能从控制台直接授权
|
||||
boolean authorizedByPreset = savedPerson != null && savedPerson.getAuthorizedByPersonId() > 0;
|
||||
long authorizedByPersonId = authorizedByPreset ? 0L : operator.getPersonId();
|
||||
orgManager.addSealAuthorization(operate.getSealId(), authorized.getPersonId(), authorizedByPersonId);
|
||||
}
|
||||
if ("Invalid".equals(operate.getOperate()))
|
||||
orgManager.removeSealAuthorization(operate.getSealId(), authorized.getPersonId());
|
||||
return operate.getSealId();
|
||||
});
|
||||
// 合同回调
|
||||
registerHandler(CallbackType.CONTRACT_STATE_CHANGED, request -> {
|
||||
ContractStateChanged changes = request.readMsgData(ContractStateChanged.class);
|
||||
EssContractState state = EssContractState.fromEssCode(changes.getFlowStatus());
|
||||
if (state == null) {
|
||||
log.warn("unknown contract state: {}", changes.getFlowStatus());
|
||||
return changes.getFlowId();
|
||||
}
|
||||
List<Long> ouIds = changes.getFlowApproverInfo().stream()
|
||||
.map(CallbackRequest.FlowApproverDetail::getProxyOrganizationOpenId)
|
||||
.map(this::parseLong)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(toList());
|
||||
OrgProfiles orgProfiles = OrgProfiles.wrap(essSupport.getOrgProfiles(ouIds));
|
||||
List<EssApproveDetail> approveDetails = changes.getFlowApproverInfo().stream()
|
||||
.map(info -> {
|
||||
EssApproveDetail detail = new EssApproveDetail();
|
||||
if (StringUtils.isNotBlank(info.getProxyOperatorOpenId())) {
|
||||
PersonOpenId personOpenId = PersonOpenId.parse(info.getProxyOperatorOpenId());
|
||||
detail.setSignPerson(personOpenId.toOrgPersonInfo());
|
||||
}
|
||||
detail.setRecipientId(info.getRecipientId());
|
||||
detail.setState(EssContractApproveState.fromEssCode(info.getApproveStatus()));
|
||||
detail.setSignOrder(info.getSignOrder());
|
||||
detail.setApproveTimeMs(info.getApproveTime() * 1000);
|
||||
detail.setMessage(info.getApproveMessage());
|
||||
detail.setApproverDeadlineMs(info.getApproverDeadline() * 1000);
|
||||
detail.setPhoneNumber(info.getPhoneNumber());
|
||||
Long ouId = parseLong(info.getProxyOrganizationOpenId());
|
||||
OrganizationalUnitVO org = orgProfiles.find(ouId).orElse(null);
|
||||
if (org != null) {
|
||||
detail.setOuName(org.getName());
|
||||
detail.setOuId(org.getId());
|
||||
}
|
||||
return detail;
|
||||
})
|
||||
.collect(toList());
|
||||
EssContract contract = essContractDao.findOrNull(changes.getFlowId());
|
||||
if (contract == null && StringUtils.isNotBlank(changes.getCustomerData())) {
|
||||
JSONObject customData = JsonObjectAsString.parse(changes.getCustomerData()).asJsonObject();
|
||||
contract = essContractDao.getById(customData.getLong(ContractManager.CONTRACT_ID));
|
||||
}
|
||||
if (contract == null) {
|
||||
log.warn("contract not found: {}", changes.getFlowId());
|
||||
} else {
|
||||
contractManager.updateContractState(contract, state, approveDetails, changes.getFlowMessage());
|
||||
essService.maybeScheduleDownloadContractPDF(contract, false);
|
||||
}
|
||||
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
|
||||
public void afterPropertiesSet() {
|
||||
// 企业开通电子签回调
|
||||
registerHandler(CallbackType.ORG_AUTHORIZATION_FINISH, request -> {
|
||||
OrgAuthorizationFinish result = request.readMsgData(OrgAuthorizationFinish.class);
|
||||
PersonOpenId superAdmin = PersonOpenId.parse(result.getProxyOperatorOpenId());
|
||||
if (result.isOpenSuccess()) {
|
||||
orgManager.addAuthorizedOrgPerson(superAdmin);
|
||||
orgManager.setOrgAuthorized(superAdmin);
|
||||
}
|
||||
return idbuilder().append(superAdmin.getOuId()).append(superAdmin.getPersonId()).build();
|
||||
});
|
||||
// 员工加入子企业的时候发送此通知
|
||||
registerHandler(CallbackType.ORG_PERSON_JOIN, request -> {
|
||||
PersonOpenId person = PersonOpenId.parse(request.readMsgData(OrgPersonJoin.class).getProxyOperatorOpenId());
|
||||
orgManager.addAuthorizedOrgPerson(person);
|
||||
// 一般情况下只会存在一条记录
|
||||
for (EssSealPerson sealPerson : essSealPersonDao.getByPersonId(person.getOuId(), person.getPersonId())) {
|
||||
AddSealAuthorizationRequest addSealAuthorizationRequest = new AddSealAuthorizationRequest();
|
||||
addSealAuthorizationRequest.setEssSealId(sealPerson.getEssSealId());
|
||||
addSealAuthorizationRequest.setPersonId(person.getPersonId());
|
||||
// 保留界面上的操作人
|
||||
addSealAuthorizationRequest.setOperatorPersonId(null);
|
||||
try {
|
||||
essService.essAddSealAuthorization(addSealAuthorizationRequest);
|
||||
}
|
||||
catch (Exception e) {
|
||||
String subject = idbuilder().append(sealPerson.getEssSealId()).append(
|
||||
sealPerson.getPersonId()).build();
|
||||
essLogDao.log(e, "essAddSealAuthorization", subject);
|
||||
log.warn("add seal authorization failed", e);
|
||||
}
|
||||
}
|
||||
return idbuilder().append(person.getOuId()).append(person.getPersonId()).build();
|
||||
});
|
||||
// 印章回调
|
||||
registerHandler(CallbackType.SEAL_OPERATE, request -> {
|
||||
SealOperate operate = request.readMsgData(SealOperate.class);
|
||||
OrgOpenId ou = OrgOpenId.parse(operate.getProxyOrganizationOpenId());
|
||||
PersonOpenId operator = PersonOpenId.parse(operate.getProxyOperatorOpenId());
|
||||
PersonOpenId authorized = StringUtils.isBlank(operate.getAuthorizedOperatorOpenId()) ? PersonOpenId.none()
|
||||
: PersonOpenId.parse(operate.getAuthorizedOperatorOpenId());
|
||||
boolean sealCreated = orgManager.maybeAddSeal(ou.getOuId(), operate.getSealId(),
|
||||
EssSealType.fromEssCode(operate.getSealType()));
|
||||
// 1. 印章创建人会自动获得授权; 2. 避免miss create事件
|
||||
if (sealCreated)
|
||||
orgManager.addSealAuthorization(operate.getSealId(), operator.getPersonId(), operator.getPersonId());
|
||||
if ("Delete".equals(operate.getOperate()))
|
||||
orgManager.updateSealState(operate.getSealId(), EssSealState.DELETED);
|
||||
if ("Disable".equals(operate.getOperate()))
|
||||
orgManager.updateSealState(operate.getSealId(), EssSealState.DISABLED);
|
||||
if ("Enable".equals(operate.getOperate()))
|
||||
orgManager.updateSealState(operate.getSealId(), EssSealState.ENABLED);
|
||||
if ("Valid".equals(operate.getOperate())) {
|
||||
EssSealPerson savedPerson = essSealPersonDao.find(operate.getSealId(), authorized.getPersonId()).orElse(
|
||||
null);
|
||||
// 可能从控制台直接授权
|
||||
boolean authorizedByPreset = savedPerson != null && savedPerson.getAuthorizedByPersonId() > 0;
|
||||
long authorizedByPersonId = authorizedByPreset ? 0L : operator.getPersonId();
|
||||
orgManager.addSealAuthorization(operate.getSealId(), authorized.getPersonId(), authorizedByPersonId);
|
||||
}
|
||||
if ("Invalid".equals(operate.getOperate()))
|
||||
orgManager.removeSealAuthorization(operate.getSealId(), authorized.getPersonId());
|
||||
return operate.getSealId();
|
||||
});
|
||||
// 合同回调
|
||||
registerHandler(CallbackType.CONTRACT_STATE_CHANGED, request -> {
|
||||
ContractStateChanged changes = request.readMsgData(ContractStateChanged.class);
|
||||
EssContractState state = EssContractState.fromEssCode(changes.getFlowStatus());
|
||||
if (state == null) {
|
||||
log.warn("unknown contract state: {}", changes.getFlowStatus());
|
||||
return changes.getFlowId();
|
||||
}
|
||||
List<Long> ouIds = changes.getFlowApproverInfo().stream().map(
|
||||
CallbackRequest.FlowApproverDetail::getProxyOrganizationOpenId).map(this::parseLong).filter(
|
||||
Objects::nonNull).collect(toList());
|
||||
OrgProfiles orgProfiles = OrgProfiles.wrap(essSupport.getOrgProfiles(ouIds));
|
||||
List<EssApproveDetail> approveDetails = changes.getFlowApproverInfo().stream().map(info -> {
|
||||
EssApproveDetail detail = new EssApproveDetail();
|
||||
if (StringUtils.isNotBlank(info.getProxyOperatorOpenId())) {
|
||||
PersonOpenId personOpenId = PersonOpenId.parse(info.getProxyOperatorOpenId());
|
||||
detail.setSignPerson(personOpenId.toOrgPersonInfo());
|
||||
}
|
||||
detail.setRecipientId(info.getRecipientId());
|
||||
detail.setState(EssContractApproveState.fromEssCode(info.getApproveStatus()));
|
||||
detail.setSignOrder(info.getSignOrder());
|
||||
detail.setApproveTimeMs(info.getApproveTime() * 1000);
|
||||
detail.setMessage(info.getApproveMessage());
|
||||
detail.setApproverDeadlineMs(info.getApproverDeadline() * 1000);
|
||||
detail.setPhoneNumber(info.getPhoneNumber());
|
||||
Long ouId = parseLong(info.getProxyOrganizationOpenId());
|
||||
OrganizationalUnitVO org = orgProfiles.find(ouId).orElse(null);
|
||||
if (org != null) {
|
||||
detail.setOuName(org.getName());
|
||||
detail.setOuId(org.getId());
|
||||
}
|
||||
return detail;
|
||||
}).collect(toList());
|
||||
EssContract contract = essContractDao.findOrNull(changes.getFlowId());
|
||||
if (contract == null && StringUtils.isNotBlank(changes.getCustomerData())) {
|
||||
JSONObject customData = JsonObjectAsString.parse(changes.getCustomerData()).asJsonObject();
|
||||
contract = essContractDao.getById(customData.getLong(ContractManager.CONTRACT_ID));
|
||||
}
|
||||
if (contract == null) {
|
||||
log.warn("contract not found: {}", changes.getFlowId());
|
||||
}
|
||||
else {
|
||||
contractManager.updateContractState(contract, state, approveDetails, changes.getFlowMessage());
|
||||
essService.maybeScheduleDownloadContractPDF(contract, false);
|
||||
}
|
||||
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();
|
||||
});
|
||||
}
|
||||
|
||||
private Long parseLong(String value) {
|
||||
if (StringUtils.isBlank(value) || !NumberUtils.isDigits(value))
|
||||
return null;
|
||||
return Long.parseLong(value);
|
||||
}
|
||||
private Long parseLong(String value) {
|
||||
if (StringUtils.isBlank(value) || !NumberUtils.isDigits(value))
|
||||
return null;
|
||||
return Long.parseLong(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<Object> callback(CallbackRequest request) {
|
||||
log.info("ess callback: {}", request);
|
||||
Object subject = null;
|
||||
try {
|
||||
CallbackType callbackType = CallbackType.parse(request.getMsgType()).orElse(null);
|
||||
CallbackHandler handler = callbackType == null ? null : handlers.get(callbackType);
|
||||
if (handler != null) {
|
||||
subject = transactionTemplate.execute(unused -> {
|
||||
try {
|
||||
return handler.handle(request);
|
||||
} catch (Exception e) {
|
||||
log.warn("callback failed", e);
|
||||
// wrap exception to make it throw to yoke
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
log.info("ignore callback: {}", request);
|
||||
}
|
||||
return ApiResult.ok("success");
|
||||
} finally {
|
||||
saveRequest(request, subject);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public ApiResult<Object> callback(CallbackRequest request) {
|
||||
log.info("ess callback: {}", request);
|
||||
Object subject = null;
|
||||
try {
|
||||
CallbackType callbackType = CallbackType.parse(request.getMsgType()).orElse(null);
|
||||
CallbackHandler handler = callbackType == null ? null : handlers.get(callbackType);
|
||||
if (handler != null) {
|
||||
subject = transactionTemplate.execute(unused -> {
|
||||
try {
|
||||
return handler.handle(request);
|
||||
}
|
||||
catch (Exception e) {
|
||||
log.warn("callback failed", e);
|
||||
// wrap exception to make it throw to yoke
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
log.info("ignore callback: {}", request);
|
||||
}
|
||||
return ApiResult.ok("success");
|
||||
}
|
||||
finally {
|
||||
saveRequest(request, subject);
|
||||
}
|
||||
}
|
||||
|
||||
private void saveRequest(CallbackRequest request, Object subject) {
|
||||
EssLog essLog = new EssLog();
|
||||
CallbackType callbackType = CallbackType.parse(request.getMsgType()).orElse(null);
|
||||
String callbackTypeStr = callbackType == null ? "" : "[" + callbackType + "]";
|
||||
essLog.setContext(String.format("ess:callback:%s%s", request.getMsgType(), callbackTypeStr));
|
||||
essLog.setSubject("");
|
||||
if (subject != null)
|
||||
essLog.setSubject(String.valueOf(subject));
|
||||
essLog.addLogContent("request", request);
|
||||
essLogDao.save(essLog);
|
||||
}
|
||||
private void saveRequest(CallbackRequest request, Object subject) {
|
||||
EssLog essLog = new EssLog();
|
||||
CallbackType callbackType = CallbackType.parse(request.getMsgType()).orElse(null);
|
||||
String callbackTypeStr = callbackType == null ? "" : "[" + callbackType + "]";
|
||||
essLog.setContext(String.format("ess:callback:%s%s", request.getMsgType(), callbackTypeStr));
|
||||
essLog.setSubject("");
|
||||
if (subject != null)
|
||||
essLog.setSubject(String.valueOf(subject));
|
||||
essLog.addLogContent("request", request);
|
||||
essLogDao.save(essLog);
|
||||
}
|
||||
|
||||
private void registerHandler(CallbackType callbackType, CallbackHandler handler) {
|
||||
handlers.put(callbackType, handler);
|
||||
}
|
||||
private void registerHandler(CallbackType callbackType, CallbackHandler handler) {
|
||||
handlers.put(callbackType, handler);
|
||||
}
|
||||
|
||||
private interface CallbackHandler {
|
||||
Object handle(CallbackRequest request);
|
||||
}
|
||||
private interface CallbackHandler {
|
||||
Object handle(CallbackRequest request);
|
||||
}
|
||||
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
private enum CallbackType {
|
||||
ORG_AUTHORIZATION_FINISH("OrgOpenTsignBiz"),
|
||||
ORG_PERSON_JOIN("VerifyStaffInfo"),
|
||||
SEAL_OPERATE("OperateSeal"),
|
||||
CONTRACT_STATE_CHANGED("FlowStatusChange"),
|
||||
SUPER_ADMIN_CHANGED("SuperAdminChange");
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
private enum CallbackType {
|
||||
ORG_AUTHORIZATION_FINISH("OrgOpenTsignBiz"),
|
||||
ORG_PERSON_JOIN("VerifyStaffInfo"),
|
||||
SEAL_OPERATE("OperateSeal"),
|
||||
CONTRACT_STATE_CHANGED("FlowStatusChange"),
|
||||
SUPER_ADMIN_CHANGED("SuperAdminChange");
|
||||
|
||||
final String msgType;
|
||||
final String msgType;
|
||||
|
||||
static Optional<CallbackType> parse(String msgType) {
|
||||
return Arrays.stream(CallbackType.values()).filter(type -> type.msgType.equals(msgType)).findFirst();
|
||||
}
|
||||
static Optional<CallbackType> parse(String msgType) {
|
||||
return Arrays.stream(CallbackType.values()).filter(type -> type.msgType.equals(msgType)).findFirst();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.controller;
|
||||
|
||||
import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
@ -25,26 +26,26 @@ import java.util.HashMap;
|
||||
@RequiredArgsConstructor
|
||||
public class PrivateController {
|
||||
|
||||
private final OrgManager orgManager;
|
||||
private final EssClient essClient;
|
||||
private final EssOrgDao essOrgDao;
|
||||
private final OrgManager orgManager;
|
||||
private final EssClient essClient;
|
||||
private final EssOrgDao essOrgDao;
|
||||
|
||||
@PostMapping("/private/ess/getOrgPersons")
|
||||
public ApiResult<?> getOrgPersons(@RequestParam("ouId") Long ouId) {
|
||||
EssOrg org = essOrgDao.findOrNull(ouId);
|
||||
BizAssertions.assertNotNull(org, "电子签单位不存在");
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(ouId);
|
||||
HashMap<String, Staff> staffs = new HashMap<>();
|
||||
long offset = 0L;
|
||||
while (true) {
|
||||
ChannelDescribeEmployeesResponse response = essClient.getOrgPerson(superAdmin, org, offset);
|
||||
if (response.getEmployees() == null || response.getEmployees().length == 0)
|
||||
break;
|
||||
offset = response.getOffset() + 1;
|
||||
for (Staff staff : response.getEmployees())
|
||||
staffs.put(staff.getOpenId(), staff);
|
||||
}
|
||||
return ApiResult.ok(staffs.values());
|
||||
}
|
||||
@PostMapping("/private/ess/getOrgPersons")
|
||||
public ApiResult<?> getOrgPersons(@RequestParam("ouId") Long ouId) {
|
||||
EssOrg org = essOrgDao.findOrNull(ouId);
|
||||
BizAssertions.assertNotNull(org, "电子签单位不存在");
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(ouId);
|
||||
HashMap<String, Staff> staffs = new HashMap<>();
|
||||
long offset = 0L;
|
||||
while (true) {
|
||||
ChannelDescribeEmployeesResponse response = essClient.getOrgPerson(superAdmin, org, offset);
|
||||
if (response.getEmployees() == null || response.getEmployees().length == 0)
|
||||
break;
|
||||
offset = response.getOffset() + 1;
|
||||
for (Staff staff : response.getEmployees())
|
||||
staffs.put(staff.getOpenId(), staff);
|
||||
}
|
||||
return ApiResult.ok(staffs.values());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.domain;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssPerson;
|
||||
@ -15,35 +16,31 @@ import java.util.Optional;
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class EssPersons {
|
||||
|
||||
private final List<EssPerson> persons;
|
||||
private final List<EssPerson> persons;
|
||||
|
||||
public static EssPersons wrap(List<EssPerson> persons) {
|
||||
return new EssPersons(persons);
|
||||
}
|
||||
public static EssPersons wrap(List<EssPerson> persons) {
|
||||
return new EssPersons(persons);
|
||||
}
|
||||
|
||||
public EssPerson getOrThrow(Long personId) {
|
||||
EssPerson person = find(personId).orElse(null);
|
||||
BizAssertions.assertNotNull(person, "person not found, personId={}", personId);
|
||||
return person;
|
||||
}
|
||||
public EssPerson getOrThrow(Long personId) {
|
||||
EssPerson person = find(personId).orElse(null);
|
||||
BizAssertions.assertNotNull(person, "person not found, personId={}", personId);
|
||||
return person;
|
||||
}
|
||||
|
||||
public Optional<EssPerson> find(Long personId) {
|
||||
return persons.stream()
|
||||
.filter(p -> p.getId().equals(personId))
|
||||
.findFirst();
|
||||
}
|
||||
public Optional<EssPerson> find(Long personId) {
|
||||
return persons.stream().filter(p -> p.getId().equals(personId)).findFirst();
|
||||
}
|
||||
|
||||
public EssPerson getOrThrow(OuAndPersonId ouAndPersonId) {
|
||||
EssPerson person = find(ouAndPersonId).orElse(null);
|
||||
BizAssertions.assertNotNull(person, "person not found, ouId={}, personId={}",
|
||||
ouAndPersonId.getOuId(), ouAndPersonId.getPersonId());
|
||||
return person;
|
||||
}
|
||||
public EssPerson getOrThrow(OuAndPersonId ouAndPersonId) {
|
||||
EssPerson person = find(ouAndPersonId).orElse(null);
|
||||
BizAssertions.assertNotNull(person, "person not found, ouId={}, personId={}", ouAndPersonId.getOuId(),
|
||||
ouAndPersonId.getPersonId());
|
||||
return person;
|
||||
}
|
||||
|
||||
public Optional<EssPerson> find(OuAndPersonId ouAndPersonId) {
|
||||
return persons.stream()
|
||||
.filter(p -> ouAndPersonId.is(p.getOuId(), p.getPersonId()))
|
||||
.findFirst();
|
||||
}
|
||||
public Optional<EssPerson> find(OuAndPersonId ouAndPersonId) {
|
||||
return persons.stream().filter(p -> ouAndPersonId.is(p.getOuId(), p.getPersonId())).findFirst();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.domain;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
@ -10,28 +11,28 @@ import lombok.RequiredArgsConstructor;
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class JsonObjectAsString {
|
||||
|
||||
private final JSONObject obj;
|
||||
private final JSONObject obj;
|
||||
|
||||
public static JsonObjectAsString create() {
|
||||
return new JsonObjectAsString(new JSONObject());
|
||||
}
|
||||
public static JsonObjectAsString create() {
|
||||
return new JsonObjectAsString(new JSONObject());
|
||||
}
|
||||
|
||||
public static JsonObjectAsString parse(String jsonStr) {
|
||||
return new JsonObjectAsString(JSONObject.parseObject(jsonStr));
|
||||
}
|
||||
public static JsonObjectAsString parse(String jsonStr) {
|
||||
return new JsonObjectAsString(JSONObject.parseObject(jsonStr));
|
||||
}
|
||||
|
||||
public JSONObject asJsonObject() {
|
||||
return obj;
|
||||
}
|
||||
public JSONObject asJsonObject() {
|
||||
return obj;
|
||||
}
|
||||
|
||||
public JsonObjectAsString put(String key, Object value) {
|
||||
obj.put(key, value);
|
||||
return this;
|
||||
}
|
||||
public JsonObjectAsString put(String key, Object value) {
|
||||
obj.put(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return obj.toJSONString();
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return obj.toJSONString();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.domain;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssOrg;
|
||||
@ -11,6 +12,6 @@ import lombok.RequiredArgsConstructor;
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
public class OrgAndPerson {
|
||||
private final EssOrg org;
|
||||
private final EssPerson person;
|
||||
}
|
||||
private final EssOrg org;
|
||||
private final EssPerson person;
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.domain;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.OrgPerson;
|
||||
@ -12,27 +13,27 @@ import lombok.RequiredArgsConstructor;
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class OrgOpenId {
|
||||
|
||||
private final Long ouId;
|
||||
private final Long ouId;
|
||||
|
||||
public static OrgOpenId ofPerson(OrgPerson person) {
|
||||
return create(person.getOuId());
|
||||
}
|
||||
public static OrgOpenId ofPerson(OrgPerson person) {
|
||||
return create(person.getOuId());
|
||||
}
|
||||
|
||||
public static OrgOpenId create(Long ouId) {
|
||||
return new OrgOpenId(ouId);
|
||||
}
|
||||
public static OrgOpenId create(Long ouId) {
|
||||
return new OrgOpenId(ouId);
|
||||
}
|
||||
|
||||
public static OrgOpenId parse(String openId) {
|
||||
return new OrgOpenId(Long.parseLong(openId));
|
||||
}
|
||||
public static OrgOpenId parse(String openId) {
|
||||
return new OrgOpenId(Long.parseLong(openId));
|
||||
}
|
||||
|
||||
public String toOpenId() {
|
||||
return ouId + "";
|
||||
}
|
||||
public String toOpenId() {
|
||||
return ouId + "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return toOpenId();
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return toOpenId();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.domain;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.OrgPerson;
|
||||
@ -12,35 +13,35 @@ import lombok.RequiredArgsConstructor;
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class PersonOpenId implements OrgPerson {
|
||||
|
||||
private static final PersonOpenId NONE = create(0L, 0L);
|
||||
private static final PersonOpenId NONE = create(0L, 0L);
|
||||
|
||||
private final Long ouId;
|
||||
private final Long personId;
|
||||
private final Long ouId;
|
||||
private final Long personId;
|
||||
|
||||
public static PersonOpenId none() {
|
||||
return NONE;
|
||||
}
|
||||
public static PersonOpenId none() {
|
||||
return NONE;
|
||||
}
|
||||
|
||||
public static PersonOpenId create(OrgPerson person) {
|
||||
return create(person.getOuId(), person.getPersonId());
|
||||
}
|
||||
public static PersonOpenId create(OrgPerson person) {
|
||||
return create(person.getOuId(), person.getPersonId());
|
||||
}
|
||||
|
||||
public static PersonOpenId create(Long ouId, Long personId) {
|
||||
return new PersonOpenId(ouId, personId);
|
||||
}
|
||||
public static PersonOpenId create(Long ouId, Long personId) {
|
||||
return new PersonOpenId(ouId, personId);
|
||||
}
|
||||
|
||||
public static PersonOpenId parse(String openId) {
|
||||
String[] split = openId.split("_");
|
||||
return new PersonOpenId(Long.parseLong(split[0]), Long.parseLong(split[1]));
|
||||
}
|
||||
public static PersonOpenId parse(String openId) {
|
||||
String[] split = openId.split("_");
|
||||
return new PersonOpenId(Long.parseLong(split[0]), Long.parseLong(split[1]));
|
||||
}
|
||||
|
||||
public String toOpenId() {
|
||||
return ouId + "_" + personId;
|
||||
}
|
||||
public String toOpenId() {
|
||||
return ouId + "_" + personId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return toOpenId();
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return toOpenId();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.domain;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssSeal;
|
||||
@ -11,6 +12,6 @@ import lombok.RequiredArgsConstructor;
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
public class SealAndPerson {
|
||||
private final EssSeal seal;
|
||||
private final EssSealPerson sealPerson;
|
||||
private final EssSeal seal;
|
||||
private final EssSealPerson sealPerson;
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.domain;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssSealPerson;
|
||||
@ -13,20 +14,18 @@ import java.util.Optional;
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class SealPersons {
|
||||
|
||||
private final List<EssSealPerson> person;
|
||||
private final List<EssSealPerson> person;
|
||||
|
||||
public static SealPersons wrap(List<EssSealPerson> person) {
|
||||
return new SealPersons(person);
|
||||
}
|
||||
public static SealPersons wrap(List<EssSealPerson> person) {
|
||||
return new SealPersons(person);
|
||||
}
|
||||
|
||||
public boolean containsPerson(Long personId) {
|
||||
return person.stream().anyMatch(p -> p.getPersonId().equals(personId));
|
||||
}
|
||||
public boolean containsPerson(Long personId) {
|
||||
return person.stream().anyMatch(p -> p.getPersonId().equals(personId));
|
||||
}
|
||||
|
||||
public Optional<EssSealPerson> find(Long ouId, Long personId) {
|
||||
return person.stream()
|
||||
.filter(p -> p.getOuId().equals(ouId) && p.getPersonId().equals(personId))
|
||||
.findFirst();
|
||||
}
|
||||
public Optional<EssSealPerson> find(Long ouId, Long personId) {
|
||||
return person.stream().filter(p -> p.getOuId().equals(ouId) && p.getPersonId().equals(personId)).findFirst();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.mq;
|
||||
|
||||
import cn.axzo.framework.rocketmq.Event;
|
||||
@ -27,25 +28,25 @@ import java.util.Collections;
|
||||
@RequiredArgsConstructor
|
||||
public class DownloadContractHandler implements EventHandler, InitializingBean {
|
||||
|
||||
private final EventConsumer eventConsumer;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssService essService;
|
||||
private final EventConsumer eventConsumer;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssService essService;
|
||||
|
||||
@Override
|
||||
public void onEvent(Event event, EventConsumer.Context context) {
|
||||
EssContractDownloadPDFEvent message = event.normalizedData(EssContractDownloadPDFEvent.class);
|
||||
log.info("receive download contract pdf event: {}", JSON.toJSONString(message));
|
||||
EssContract contract = essContractDao.findOrNull(message.getContract().getEssContractId());
|
||||
if (contract == null)
|
||||
log.info("try download contract pdf but contract not found: {}", JSON.toJSONString(message));
|
||||
else
|
||||
essService.downloadContractPDF(contract, message.isRetryDownload());
|
||||
}
|
||||
@Override
|
||||
public void onEvent(Event event, EventConsumer.Context context) {
|
||||
EssContractDownloadPDFEvent message = event.normalizedData(EssContractDownloadPDFEvent.class);
|
||||
log.info("receive download contract pdf event: {}", JSON.toJSONString(message));
|
||||
EssContract contract = essContractDao.findOrNull(message.getContract().getEssContractId());
|
||||
if (contract == null)
|
||||
log.info("try download contract pdf but contract not found: {}", JSON.toJSONString(message));
|
||||
else
|
||||
essService.downloadContractPDF(contract, message.isRetryDownload());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
eventConsumer.registerHandlers(Collections.singletonList(
|
||||
MQEvent.ESS_CONTRACT_DOWNLOAD_PDF.getEventCode()), this);
|
||||
}
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
eventConsumer.registerHandlers(Collections.singletonList(MQEvent.ESS_CONTRACT_DOWNLOAD_PDF.getEventCode()),
|
||||
this);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.mq;
|
||||
|
||||
import cn.axzo.basics.common.BeanMapper;
|
||||
@ -19,35 +20,27 @@ import org.springframework.stereotype.Component;
|
||||
@RequiredArgsConstructor
|
||||
public class EssBroadcaster {
|
||||
|
||||
private final EssContractDao essContractDao;
|
||||
protected final EventProducer<?> eventProducer;
|
||||
private final EssContractDao essContractDao;
|
||||
protected final EventProducer<?> eventProducer;
|
||||
|
||||
public void fireContractStateChanged(EssContract contract) {
|
||||
EssContract reload = essContractDao.findOrNull(contract.getEssContractId());
|
||||
if (reload == null)
|
||||
return;
|
||||
EssContractStateChangeMessage message = new EssContractStateChangeMessage();
|
||||
message.setContract(BeanMapper.copyBean(reload, EssContractInfo.class));
|
||||
eventProducer.send(Event.builder()
|
||||
.eventCode(MQEvent.ESS_CONTRACT_STATE_CHANGE.getEventCode())
|
||||
.shardingKey(contract.getEssContractId())
|
||||
.targetId(contract.getEssContractId())
|
||||
.targetType("ess-contract")
|
||||
.data(message)
|
||||
.build());
|
||||
}
|
||||
public void fireContractStateChanged(EssContract contract) {
|
||||
EssContract reload = essContractDao.findOrNull(contract.getEssContractId());
|
||||
if (reload == null)
|
||||
return;
|
||||
EssContractStateChangeMessage message = new EssContractStateChangeMessage();
|
||||
message.setContract(BeanMapper.copyBean(reload, EssContractInfo.class));
|
||||
eventProducer.send(Event.builder().eventCode(MQEvent.ESS_CONTRACT_STATE_CHANGE.getEventCode()).shardingKey(
|
||||
contract.getEssContractId()).targetId(contract.getEssContractId()).targetType("ess-contract").data(
|
||||
message).build());
|
||||
}
|
||||
|
||||
public void fireDownloadContractPDF(EssContract contract, boolean retryDownload) {
|
||||
EssContractDownloadPDFEvent message = new EssContractDownloadPDFEvent();
|
||||
message.setContract(BeanMapper.copyBean(contract, EssContractInfo.class));
|
||||
message.setRetryDownload(retryDownload);
|
||||
eventProducer.send(Event.builder()
|
||||
.eventCode(MQEvent.ESS_CONTRACT_DOWNLOAD_PDF.getEventCode())
|
||||
.shardingKey(contract.getEssContractId())
|
||||
.targetId(contract.getEssContractId())
|
||||
.targetType("ess-contract")
|
||||
.data(message)
|
||||
.build());
|
||||
}
|
||||
public void fireDownloadContractPDF(EssContract contract, boolean retryDownload) {
|
||||
EssContractDownloadPDFEvent message = new EssContractDownloadPDFEvent();
|
||||
message.setContract(BeanMapper.copyBean(contract, EssContractInfo.class));
|
||||
message.setRetryDownload(retryDownload);
|
||||
eventProducer.send(Event.builder().eventCode(MQEvent.ESS_CONTRACT_DOWNLOAD_PDF.getEventCode()).shardingKey(
|
||||
contract.getEssContractId()).targetId(contract.getEssContractId()).targetType("ess-contract").data(
|
||||
message).build());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.mq;
|
||||
|
||||
import cn.axzo.framework.rocketmq.Event;
|
||||
@ -26,56 +27,56 @@ import java.util.Collections;
|
||||
@RequiredArgsConstructor
|
||||
public class PersonResignHandler implements EventHandler, InitializingBean {
|
||||
|
||||
private final EventConsumer eventConsumer;
|
||||
private final EssClient essClient;
|
||||
private final OrgManager orgManager;
|
||||
private final EssOrgDao essOrgDao;
|
||||
private final EssPersonDao essPersonDao;
|
||||
private final EventConsumer eventConsumer;
|
||||
private final EssClient essClient;
|
||||
private final OrgManager orgManager;
|
||||
private final EssOrgDao essOrgDao;
|
||||
private final EssPersonDao essPersonDao;
|
||||
|
||||
@Override
|
||||
public void onEvent(Event event, EventConsumer.Context context) {
|
||||
OrgUserStatusChangedEvent message = event.normalizedData(OrgUserStatusChangedEvent.class);
|
||||
log.info("receive node user event: {}", JSON.toJSONString(message));
|
||||
if (message.getStatusCode() == 6)
|
||||
trySetPersonResigned(message);
|
||||
else
|
||||
log.info("ignore node user event: {}", JSON.toJSONString(message));
|
||||
}
|
||||
@Override
|
||||
public void onEvent(Event event, EventConsumer.Context context) {
|
||||
OrgUserStatusChangedEvent message = event.normalizedData(OrgUserStatusChangedEvent.class);
|
||||
log.info("receive node user event: {}", JSON.toJSONString(message));
|
||||
if (message.getStatusCode() == 6)
|
||||
trySetPersonResigned(message);
|
||||
else
|
||||
log.info("ignore node user event: {}", JSON.toJSONString(message));
|
||||
}
|
||||
|
||||
private void trySetPersonResigned(OrgUserStatusChangedEvent event) {
|
||||
EssOrg org = essOrgDao.findOrNull(event.getOuId());
|
||||
if (org == null) {
|
||||
log.info("未找到单位: {}", JSON.toJSONString(event));
|
||||
return;
|
||||
}
|
||||
if (!org.isAuthorized()) {
|
||||
log.info("ignore unauthorized org: {}", JSON.toJSONString(org));
|
||||
return;
|
||||
}
|
||||
EssPerson person = essPersonDao.findOrNull(event.getOuId(), event.getPersonId());
|
||||
if (person == null) {
|
||||
log.info("ignore person resigned: {}, personNotFound", JSON.toJSONString(event));
|
||||
return;
|
||||
}
|
||||
if (!person.isAuthorized()) {
|
||||
log.info("ignore unauthorized person resigned: {}", JSON.toJSONString(person));
|
||||
return;
|
||||
}
|
||||
boolean isSuperAdmin = org.isSuperAdmin(event.getPersonId());
|
||||
log.info("set person resigned: {}, isSuperAdmin: {}", JSON.toJSONString(person), isSuperAdmin);
|
||||
if (isSuperAdmin) {
|
||||
log.info("ignore super admin resigned: {}", JSON.toJSONString(person));
|
||||
return;
|
||||
}
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(event.getOuId());
|
||||
essClient.setEmployeeResigned(superAdmin, Collections.singletonList(person));
|
||||
orgManager.setOrgPersonResign(person);
|
||||
log.info("set person resigned: {}", JSON.toJSONString(person));
|
||||
}
|
||||
private void trySetPersonResigned(OrgUserStatusChangedEvent event) {
|
||||
EssOrg org = essOrgDao.findOrNull(event.getOuId());
|
||||
if (org == null) {
|
||||
log.info("未找到单位: {}", JSON.toJSONString(event));
|
||||
return;
|
||||
}
|
||||
if (!org.isAuthorized()) {
|
||||
log.info("ignore unauthorized org: {}", JSON.toJSONString(org));
|
||||
return;
|
||||
}
|
||||
EssPerson person = essPersonDao.findOrNull(event.getOuId(), event.getPersonId());
|
||||
if (person == null) {
|
||||
log.info("ignore person resigned: {}, personNotFound", JSON.toJSONString(event));
|
||||
return;
|
||||
}
|
||||
if (!person.isAuthorized()) {
|
||||
log.info("ignore unauthorized person resigned: {}", JSON.toJSONString(person));
|
||||
return;
|
||||
}
|
||||
boolean isSuperAdmin = org.isSuperAdmin(event.getPersonId());
|
||||
log.info("set person resigned: {}, isSuperAdmin: {}", JSON.toJSONString(person), isSuperAdmin);
|
||||
if (isSuperAdmin) {
|
||||
log.info("ignore super admin resigned: {}", JSON.toJSONString(person));
|
||||
return;
|
||||
}
|
||||
EssPerson superAdmin = orgManager.getSuperAdminOrThrow(event.getOuId());
|
||||
essClient.setEmployeeResigned(superAdmin, Collections.singletonList(person));
|
||||
orgManager.setOrgPersonResign(person);
|
||||
log.info("set person resigned: {}", JSON.toJSONString(person));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
eventConsumer.registerHandlers(Collections.singletonList(
|
||||
Event.EventCode.from("org-user:org-user-movement")), this);
|
||||
}
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
eventConsumer.registerHandlers(Collections.singletonList(Event.EventCode.from("org-user:org-user-movement")),
|
||||
this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.support;
|
||||
|
||||
import cn.axzo.nanopart.ess.api.domain.CreateContractInfo;
|
||||
@ -30,70 +31,63 @@ import static java.util.stream.Collectors.toList;
|
||||
@RequiredArgsConstructor
|
||||
public class ContractSupport {
|
||||
|
||||
private final EssOrgDao essOrgDao;
|
||||
private final EssContractDao essContractDao;
|
||||
private final EssOrgDao essOrgDao;
|
||||
private final EssContractDao essContractDao;
|
||||
|
||||
public void validateCreateContract(CreateContractInfo contract) {
|
||||
checkCreateContractConstraint(contract);
|
||||
ensureOrgAuthorized(contract);
|
||||
}
|
||||
public void validateCreateContract(CreateContractInfo contract) {
|
||||
checkCreateContractConstraint(contract);
|
||||
ensureOrgAuthorized(contract);
|
||||
}
|
||||
|
||||
private void checkCreateContractConstraint(CreateContractInfo contract) {
|
||||
if (contract.getConstraint() == Constraint.ONE_PERSON_PER_ORG) {
|
||||
HashSet<Long> ouIds = new HashSet<>();
|
||||
for (Approver approver : contract.getApprovers()) {
|
||||
if (approver.getSignPerson() == null)
|
||||
continue;
|
||||
BizAssertions.assertFalse(ouIds.contains(approver.getOuId()),
|
||||
"同一单位不能有多个审批人, constraint={}", Constraint.ONE_PERSON_PER_ORG);
|
||||
ouIds.add(approver.getOuId());
|
||||
}
|
||||
}
|
||||
}
|
||||
private void checkCreateContractConstraint(CreateContractInfo contract) {
|
||||
if (contract.getConstraint() == Constraint.ONE_PERSON_PER_ORG) {
|
||||
HashSet<Long> ouIds = new HashSet<>();
|
||||
for (Approver approver : contract.getApprovers()) {
|
||||
if (approver.getSignPerson() == null)
|
||||
continue;
|
||||
BizAssertions.assertFalse(ouIds.contains(approver.getOuId()), "同一单位不能有多个审批人, constraint={}",
|
||||
Constraint.ONE_PERSON_PER_ORG);
|
||||
ouIds.add(approver.getOuId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ensureOrgAuthorized(CreateContractInfo contract) {
|
||||
BizAssertions.assertNotNull(contract, "合同信息不能为空");
|
||||
List<EssOrg> orgs = essOrgDao.getByOuIds(contract.getApproverOuIds());
|
||||
List<String> notAuthorizedOrgs = orgs.stream()
|
||||
.filter(org -> !org.isAuthorized())
|
||||
.map(EssOrg::getOuName)
|
||||
.collect(toList());
|
||||
BizAssertions.assertEmpty(notAuthorizedOrgs,
|
||||
"创建合同失败. 以下单位还未认证: {}", JSON.toJSONString(notAuthorizedOrgs));
|
||||
}
|
||||
private void ensureOrgAuthorized(CreateContractInfo contract) {
|
||||
BizAssertions.assertNotNull(contract, "合同信息不能为空");
|
||||
List<EssOrg> orgs = essOrgDao.getByOuIds(contract.getApproverOuIds());
|
||||
List<String> notAuthorizedOrgs = orgs.stream().filter(org -> !org.isAuthorized()).map(
|
||||
EssOrg::getOuName).collect(toList());
|
||||
BizAssertions.assertEmpty(notAuthorizedOrgs, "创建合同失败. 以下单位还未认证: {}", JSON.toJSONString(notAuthorizedOrgs));
|
||||
}
|
||||
|
||||
public EssContract saveContractByFile(CreateContractByFileRequest request) {
|
||||
EssContract contract = new EssContract();
|
||||
contract.setAppCode(request.getAppCode());
|
||||
contract.setBizCode(request.getBizCode());
|
||||
contract.setIdempotentCode(request.getIdempotentCode());
|
||||
contract.setCreatorOuId(request.getCreator().getOuId());
|
||||
contract.setCreatorPersonId(request.getCreator().getPersonId());
|
||||
contract.setContractName(request.getByFile().getContractName());
|
||||
contract.setEssContractId("");
|
||||
contract.setEssFieldIds(Collections.emptyList());
|
||||
contract.setState(EssContractState.INIT);
|
||||
contract.setApprovers(request.getByFile().getApprovers());
|
||||
contract.getOrCreateAssignment().setConstraint(
|
||||
request.getContract().getConstraint());
|
||||
contract.setApproveDetails(Collections.emptyList());
|
||||
contract.setRecordExt(new EssContract.RecordExt());
|
||||
essContractDao.save(contract);
|
||||
return contract;
|
||||
}
|
||||
public EssContract saveContractByFile(CreateContractByFileRequest request) {
|
||||
EssContract contract = new EssContract();
|
||||
contract.setAppCode(request.getAppCode());
|
||||
contract.setBizCode(request.getBizCode());
|
||||
contract.setIdempotentCode(request.getIdempotentCode());
|
||||
contract.setCreatorOuId(request.getCreator().getOuId());
|
||||
contract.setCreatorPersonId(request.getCreator().getPersonId());
|
||||
contract.setContractName(request.getByFile().getContractName());
|
||||
contract.setEssContractId("");
|
||||
contract.setEssFieldIds(Collections.emptyList());
|
||||
contract.setState(EssContractState.INIT);
|
||||
contract.setApprovers(request.getByFile().getApprovers());
|
||||
contract.getOrCreateAssignment().setConstraint(request.getContract().getConstraint());
|
||||
contract.setApproveDetails(Collections.emptyList());
|
||||
contract.setRecordExt(new EssContract.RecordExt());
|
||||
essContractDao.save(contract);
|
||||
return contract;
|
||||
}
|
||||
|
||||
public CreateContractByFileResponse
|
||||
createDuplicateContractByFileResponse(CreateContractByFileRequest request) {
|
||||
EssContract savedContract = essContractDao
|
||||
.findByIdempotentCode(request.getAppCode(), request.getIdempotentCode())
|
||||
.orElseThrow(InternalError::new);
|
||||
CreateContractByFileResponse response = new CreateContractByFileResponse();
|
||||
response.setEssContractId(savedContract.getEssContractId());
|
||||
response.setEssRecipientIds(savedContract.getApprovers().stream()
|
||||
.map(Approver::getEssRecipientId)
|
||||
.collect(toList()));
|
||||
response.setDuplicate(true);
|
||||
return response;
|
||||
}
|
||||
public CreateContractByFileResponse createDuplicateContractByFileResponse(CreateContractByFileRequest request) {
|
||||
EssContract savedContract = essContractDao.findByIdempotentCode(request.getAppCode(),
|
||||
request.getIdempotentCode()).orElseThrow(InternalError::new);
|
||||
CreateContractByFileResponse response = new CreateContractByFileResponse();
|
||||
response.setEssContractId(savedContract.getEssContractId());
|
||||
response.setEssRecipientIds(
|
||||
savedContract.getApprovers().stream().map(Approver::getEssRecipientId).collect(toList()));
|
||||
response.setDuplicate(true);
|
||||
return response;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.support;
|
||||
|
||||
import lombok.Getter;
|
||||
@ -16,20 +17,20 @@ import org.springframework.context.annotation.Configuration;
|
||||
@ConfigurationProperties(prefix = "ess")
|
||||
public class EssProps {
|
||||
|
||||
private String apiEndPoint;
|
||||
private String apiEndPoint;
|
||||
|
||||
private String fileEndPoint;
|
||||
private String fileEndPoint;
|
||||
|
||||
private String appId;
|
||||
private String appId;
|
||||
|
||||
private String secretId;
|
||||
private String secretId;
|
||||
|
||||
private String secretKey;
|
||||
private String secretKey;
|
||||
|
||||
private boolean testEnv;
|
||||
private boolean testEnv;
|
||||
|
||||
private String ossAppCode = "elec-signature-contract";
|
||||
private String ossAppCode = "elec-signature-contract";
|
||||
|
||||
private String ossBizScene = "elec-signature-contract";
|
||||
private String ossBizScene = "elec-signature-contract";
|
||||
|
||||
}
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.support;
|
||||
|
||||
import cn.axzo.basics.profiles.api.UserProfileServiceApi;
|
||||
@ -24,7 +25,6 @@ import java.util.Optional;
|
||||
|
||||
import static cn.axzo.nanopart.ess.server.utils.BizAssertions.assertResponse;
|
||||
|
||||
|
||||
/**
|
||||
* @author yanglin
|
||||
*/
|
||||
@ -32,65 +32,65 @@ import static cn.axzo.nanopart.ess.server.utils.BizAssertions.assertResponse;
|
||||
@RequiredArgsConstructor
|
||||
public class EssSupport {
|
||||
|
||||
private final OrganizationalUnitApi organizationalUnitApi;
|
||||
private final UserProfileServiceApi userProfileServiceApi;
|
||||
private final OrganizationalUnitApi organizationalUnitApi;
|
||||
private final UserProfileServiceApi userProfileServiceApi;
|
||||
|
||||
public EssOrg createOrg(CreateConsoleLoginUrlRequest request) {
|
||||
OrganizationalUnitVO unit = getOrgProfileOrThrow(request.getOuId());
|
||||
EssOrg org = new EssOrg();
|
||||
org.setOuId(request.getOuId());
|
||||
org.setOuName(unit.getName());
|
||||
org.setIsAuthorized(YesOrNo.NO);
|
||||
org.setCreateByPersonId(request.getPersonId());
|
||||
org.setCreateAt(new Date());
|
||||
org.setUpdateAt(new Date());
|
||||
return org;
|
||||
}
|
||||
public EssOrg createOrg(CreateConsoleLoginUrlRequest request) {
|
||||
OrganizationalUnitVO unit = getOrgProfileOrThrow(request.getOuId());
|
||||
EssOrg org = new EssOrg();
|
||||
org.setOuId(request.getOuId());
|
||||
org.setOuName(unit.getName());
|
||||
org.setIsAuthorized(YesOrNo.NO);
|
||||
org.setCreateByPersonId(request.getPersonId());
|
||||
org.setCreateAt(new Date());
|
||||
org.setUpdateAt(new Date());
|
||||
return org;
|
||||
}
|
||||
|
||||
public EssPerson createPerson(OrgPerson orgPerson) {
|
||||
PersonProfileDto personProfile = getPersonProfileOrThrow(orgPerson);
|
||||
EssPerson essPerson = new EssPerson();
|
||||
essPerson.setOuId(orgPerson.getOuId());
|
||||
essPerson.setPersonId(orgPerson.getPersonId());
|
||||
essPerson.setPersonName(personProfile.getRealName());
|
||||
essPerson.setState(EssPersonState.CREATED);
|
||||
essPerson.setCreateAt(new Date());
|
||||
essPerson.setUpdateAt(new Date());
|
||||
return essPerson;
|
||||
}
|
||||
public EssPerson createPerson(OrgPerson orgPerson) {
|
||||
PersonProfileDto personProfile = getPersonProfileOrThrow(orgPerson);
|
||||
EssPerson essPerson = new EssPerson();
|
||||
essPerson.setOuId(orgPerson.getOuId());
|
||||
essPerson.setPersonId(orgPerson.getPersonId());
|
||||
essPerson.setPersonName(personProfile.getRealName());
|
||||
essPerson.setState(EssPersonState.CREATED);
|
||||
essPerson.setCreateAt(new Date());
|
||||
essPerson.setUpdateAt(new Date());
|
||||
return essPerson;
|
||||
}
|
||||
|
||||
public OrganizationalUnitVO getOrgProfileOrThrow(Long ouId) {
|
||||
OrganizationalUnitVO unit = assertResponse(organizationalUnitApi.getById(ouId));
|
||||
BizAssertions.assertNotNull(unit, "单位不存在: {}", ouId);
|
||||
return unit;
|
||||
}
|
||||
public OrganizationalUnitVO getOrgProfileOrThrow(Long ouId) {
|
||||
OrganizationalUnitVO unit = assertResponse(organizationalUnitApi.getById(ouId));
|
||||
BizAssertions.assertNotNull(unit, "单位不存在: {}", ouId);
|
||||
return unit;
|
||||
}
|
||||
|
||||
public List<OrganizationalUnitVO> getOrgProfiles(List<Long> ouIds) {
|
||||
if (CollectionUtils.isEmpty(ouIds))
|
||||
return Collections.emptyList();
|
||||
OrganizationalUnitQuery request = new OrganizationalUnitQuery();
|
||||
request.setUnitIds(ouIds);
|
||||
request.setPageSize((long) ouIds.size());
|
||||
return assertResponse(organizationalUnitApi.list(request));
|
||||
}
|
||||
public List<OrganizationalUnitVO> getOrgProfiles(List<Long> ouIds) {
|
||||
if (CollectionUtils.isEmpty(ouIds))
|
||||
return Collections.emptyList();
|
||||
OrganizationalUnitQuery request = new OrganizationalUnitQuery();
|
||||
request.setUnitIds(ouIds);
|
||||
request.setPageSize((long) ouIds.size());
|
||||
return assertResponse(organizationalUnitApi.list(request));
|
||||
}
|
||||
|
||||
public PersonProfileDto getPersonProfileOrThrow(OrgPerson orgPerson) {
|
||||
PersonProfileDto person = findPersonProfile(orgPerson).orElse(null);
|
||||
BizAssertions.assertNotNull(person, "人员不存在: {}", orgPerson.getPersonId());
|
||||
return person;
|
||||
}
|
||||
public PersonProfileDto getPersonProfileOrThrow(OrgPerson orgPerson) {
|
||||
PersonProfileDto person = findPersonProfile(orgPerson).orElse(null);
|
||||
BizAssertions.assertNotNull(person, "人员不存在: {}", orgPerson.getPersonId());
|
||||
return person;
|
||||
}
|
||||
|
||||
public Optional<PersonProfileDto> findPersonProfile(OrgPerson orgPerson) {
|
||||
CommonResponse<PersonProfileDto> response = userProfileServiceApi.getPersonProfile(orgPerson.getPersonId());
|
||||
if (response.getCode() == 404)
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(assertResponse(response));
|
||||
}
|
||||
public Optional<PersonProfileDto> findPersonProfile(OrgPerson orgPerson) {
|
||||
CommonResponse<PersonProfileDto> response = userProfileServiceApi.getPersonProfile(orgPerson.getPersonId());
|
||||
if (response.getCode() == 404)
|
||||
return Optional.empty();
|
||||
return Optional.ofNullable(assertResponse(response));
|
||||
}
|
||||
|
||||
public List<PersonProfileDto> getPersonProfiles(List<Long> personIds) {
|
||||
if (CollectionUtils.isEmpty(personIds))
|
||||
return Collections.emptyList();
|
||||
return assertResponse(userProfileServiceApi.getPersonProfiles(personIds));
|
||||
}
|
||||
public List<PersonProfileDto> getPersonProfiles(List<Long> personIds) {
|
||||
if (CollectionUtils.isEmpty(personIds))
|
||||
return Collections.emptyList();
|
||||
return assertResponse(userProfileServiceApi.getPersonProfiles(personIds));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.support;
|
||||
|
||||
import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO;
|
||||
@ -14,24 +15,22 @@ import java.util.Optional;
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class OrgProfiles {
|
||||
|
||||
private final List<OrganizationalUnitVO> profiles;
|
||||
private final List<OrganizationalUnitVO> profiles;
|
||||
|
||||
public static OrgProfiles wrap(List<OrganizationalUnitVO> profiles) {
|
||||
return new OrgProfiles(profiles);
|
||||
}
|
||||
public static OrgProfiles wrap(List<OrganizationalUnitVO> profiles) {
|
||||
return new OrgProfiles(profiles);
|
||||
}
|
||||
|
||||
public OrganizationalUnitVO getOrThrow(Long ouId) {
|
||||
OrganizationalUnitVO org = find(ouId).orElse(null);
|
||||
BizAssertions.assertNotNull(org, "找不到单位信息, ouId={}", ouId);
|
||||
return org;
|
||||
}
|
||||
public OrganizationalUnitVO getOrThrow(Long ouId) {
|
||||
OrganizationalUnitVO org = find(ouId).orElse(null);
|
||||
BizAssertions.assertNotNull(org, "找不到单位信息, ouId={}", ouId);
|
||||
return org;
|
||||
}
|
||||
|
||||
public Optional<OrganizationalUnitVO> find(Long ouId) {
|
||||
if (ouId == null)
|
||||
return Optional.empty();
|
||||
return profiles.stream()
|
||||
.filter(p -> p.getId().equals(ouId))
|
||||
.findFirst();
|
||||
}
|
||||
public Optional<OrganizationalUnitVO> find(Long ouId) {
|
||||
if (ouId == null)
|
||||
return Optional.empty();
|
||||
return profiles.stream().filter(p -> p.getId().equals(ouId)).findFirst();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.support;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.utils.BizAssertions;
|
||||
@ -32,80 +33,79 @@ import static cn.axzo.nanopart.ess.server.utils.BizAssertions.fail;
|
||||
@RequiredArgsConstructor
|
||||
public class OssService {
|
||||
|
||||
private final ServerFileServiceApi serverFileServiceApi;
|
||||
private final EssProps essProps;
|
||||
private final ServerFileServiceApi serverFileServiceApi;
|
||||
private final EssProps essProps;
|
||||
|
||||
public String getOssUrl(String fileKey) {
|
||||
ApiSignUrlDownloadRequest request = new ApiSignUrlDownloadRequest();
|
||||
request.setAppCode(essProps.getOssAppCode());
|
||||
request.setBizScene(essProps.getOssBizScene());
|
||||
request.setFileKeys(Collections.singletonList(fileKey));
|
||||
List<ApiSignUrlDownloadResponse> responses = BizAssertions
|
||||
.assertResponse(serverFileServiceApi.signUrlFetchDownload(request));
|
||||
return CollectionUtils.isEmpty(responses) ? null : responses.get(0).getSignUrl();
|
||||
}
|
||||
public String getOssUrl(String fileKey) {
|
||||
ApiSignUrlDownloadRequest request = new ApiSignUrlDownloadRequest();
|
||||
request.setAppCode(essProps.getOssAppCode());
|
||||
request.setBizScene(essProps.getOssBizScene());
|
||||
request.setFileKeys(Collections.singletonList(fileKey));
|
||||
List<ApiSignUrlDownloadResponse> responses = BizAssertions.assertResponse(
|
||||
serverFileServiceApi.signUrlFetchDownload(request));
|
||||
return CollectionUtils.isEmpty(responses) ? null : responses.get(0).getSignUrl();
|
||||
}
|
||||
|
||||
private ApiSignUrlUploadResponse prepareOss(String fileName) {
|
||||
ApiSignUrlUploadRequest ossRequest = new ApiSignUrlUploadRequest();
|
||||
ossRequest.setAppCode(essProps.getOssAppCode());
|
||||
ossRequest.setBizScene(essProps.getOssBizScene());
|
||||
ossRequest.setFileName(fileName);
|
||||
return BizAssertions
|
||||
.assertResponse(serverFileServiceApi.signUrlFetchUpload(ossRequest));
|
||||
}
|
||||
private ApiSignUrlUploadResponse prepareOss(String fileName) {
|
||||
ApiSignUrlUploadRequest ossRequest = new ApiSignUrlUploadRequest();
|
||||
ossRequest.setAppCode(essProps.getOssAppCode());
|
||||
ossRequest.setBizScene(essProps.getOssBizScene());
|
||||
ossRequest.setFileName(fileName);
|
||||
return BizAssertions.assertResponse(serverFileServiceApi.signUrlFetchUpload(ossRequest));
|
||||
}
|
||||
|
||||
public String uploadToOss(String contentUrl, String fileName) {
|
||||
try {
|
||||
ApiSignUrlUploadResponse ossResponse = prepareOss(fileName);
|
||||
streamUpload(ossResponse, urlDownload(contentUrl), fileName);
|
||||
return ossResponse.getFileKey();
|
||||
} catch (Exception e) {
|
||||
log.warn("下载合同并上传到OSS失败", e);
|
||||
throw fail(e, "下载合同并上传到OSS失败");
|
||||
}
|
||||
}
|
||||
public String uploadToOss(String contentUrl, String fileName) {
|
||||
try {
|
||||
ApiSignUrlUploadResponse ossResponse = prepareOss(fileName);
|
||||
streamUpload(ossResponse, urlDownload(contentUrl), fileName);
|
||||
return ossResponse.getFileKey();
|
||||
}
|
||||
catch (Exception e) {
|
||||
log.warn("下载合同并上传到OSS失败", e);
|
||||
throw fail(e, "下载合同并上传到OSS失败");
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] urlDownload(String url) throws IOException {
|
||||
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
|
||||
con.setRequestMethod("GET");
|
||||
con.setConnectTimeout(10 * 1000);
|
||||
con.setReadTimeout(10 * 1000);
|
||||
InputStream inStream = con.getInputStream();
|
||||
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
|
||||
byte[] buffer = new byte[2048];
|
||||
int len;
|
||||
while ((len = inStream.read(buffer)) != -1)
|
||||
outStream.write(buffer, 0, len);
|
||||
inStream.close();
|
||||
return outStream.toByteArray();
|
||||
}
|
||||
private byte[] urlDownload(String url) throws IOException {
|
||||
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
|
||||
con.setRequestMethod("GET");
|
||||
con.setConnectTimeout(10 * 1000);
|
||||
con.setReadTimeout(10 * 1000);
|
||||
InputStream inStream = con.getInputStream();
|
||||
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
|
||||
byte[] buffer = new byte[2048];
|
||||
int len;
|
||||
while ((len = inStream.read(buffer)) != -1)
|
||||
outStream.write(buffer, 0, len);
|
||||
inStream.close();
|
||||
return outStream.toByteArray();
|
||||
}
|
||||
|
||||
private void streamUpload(ApiSignUrlUploadResponse ossResponse,
|
||||
byte[] content,
|
||||
String fileName) throws IOException {
|
||||
HttpURLConnection connection = (HttpURLConnection)
|
||||
new URL(ossResponse.getSignUrl()).openConnection();
|
||||
connection.setRequestMethod("PUT");
|
||||
connection.setDoOutput(true);
|
||||
connection.setRequestProperty("Content-Type", "application/octet-stream");
|
||||
connection.setRequestProperty("Host", ossResponse.getHost());
|
||||
connection.setRequestProperty("Content-Type", ossResponse.getContentType());
|
||||
connection.setRequestProperty("Content-Disposition", String.format(
|
||||
"attachment;filename=\"%s\"", URLEncoder.encode(fileName, "utf-8")));
|
||||
try {
|
||||
try (OutputStream os = connection.getOutputStream()) {
|
||||
ByteArrayInputStream is = new ByteArrayInputStream(content);
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = is.read(buffer)) != -1)
|
||||
os.write(buffer, 0, bytesRead);
|
||||
os.flush();
|
||||
}
|
||||
int responseCode = connection.getResponseCode();
|
||||
log.info("上传到OSS返回码: {}", responseCode);
|
||||
} finally {
|
||||
connection.disconnect();
|
||||
}
|
||||
}
|
||||
private void streamUpload(ApiSignUrlUploadResponse ossResponse, byte[] content, String fileName)
|
||||
throws IOException {
|
||||
HttpURLConnection connection = (HttpURLConnection) new URL(ossResponse.getSignUrl()).openConnection();
|
||||
connection.setRequestMethod("PUT");
|
||||
connection.setDoOutput(true);
|
||||
connection.setRequestProperty("Content-Type", "application/octet-stream");
|
||||
connection.setRequestProperty("Host", ossResponse.getHost());
|
||||
connection.setRequestProperty("Content-Type", ossResponse.getContentType());
|
||||
connection.setRequestProperty("Content-Disposition",
|
||||
String.format("attachment;filename=\"%s\"", URLEncoder.encode(fileName, "utf-8")));
|
||||
try {
|
||||
try (OutputStream os = connection.getOutputStream()) {
|
||||
ByteArrayInputStream is = new ByteArrayInputStream(content);
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = is.read(buffer)) != -1)
|
||||
os.write(buffer, 0, bytesRead);
|
||||
os.flush();
|
||||
}
|
||||
int responseCode = connection.getResponseCode();
|
||||
log.info("上传到OSS返回码: {}", responseCode);
|
||||
}
|
||||
finally {
|
||||
connection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.ess.support;
|
||||
|
||||
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
|
||||
@ -13,22 +14,19 @@ import java.util.List;
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class PersonProfiles {
|
||||
|
||||
private final List<PersonProfileDto> profiles;
|
||||
private final List<PersonProfileDto> profiles;
|
||||
|
||||
public static PersonProfiles wrap(List<PersonProfileDto> profiles) {
|
||||
return new PersonProfiles(profiles);
|
||||
}
|
||||
public static PersonProfiles wrap(List<PersonProfileDto> profiles) {
|
||||
return new PersonProfiles(profiles);
|
||||
}
|
||||
|
||||
public PersonProfileDto getOrThrow(Long personId) {
|
||||
PersonProfileDto person = findOrNull(personId);
|
||||
BizAssertions.assertNotNull(person, "找不到人员信息, personId={}", personId);
|
||||
return person;
|
||||
}
|
||||
public PersonProfileDto getOrThrow(Long personId) {
|
||||
PersonProfileDto person = findOrNull(personId);
|
||||
BizAssertions.assertNotNull(person, "找不到人员信息, personId={}", personId);
|
||||
return person;
|
||||
}
|
||||
|
||||
public PersonProfileDto findOrNull(Long personId) {
|
||||
return profiles.stream()
|
||||
.filter(p -> p.getId().equals(personId))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
}
|
||||
public PersonProfileDto findOrNull(Long personId) {
|
||||
return profiles.stream().filter(p -> p.getId().equals(personId)).findFirst().orElse(null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.mapper;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssContract;
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.mapper;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssLog;
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.mapper;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssOrg;
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.mapper;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssPerson;
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.mapper;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssSeal;
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.mapper;
|
||||
|
||||
import cn.axzo.nanopart.ess.server.entity.EssSealPerson;
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.mq;
|
||||
|
||||
import cn.axzo.framework.rocketmq.BaseListener;
|
||||
@ -17,21 +18,15 @@ import org.springframework.stereotype.Component;
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
@RocketMQMessageListener(
|
||||
maxReconsumeTimes = 3,
|
||||
consumeMode = ConsumeMode.ORDERLY,
|
||||
nameServer = "${rocketmq.name-server}",
|
||||
topic = "topic_organizational_${spring.profiles.active}",
|
||||
consumerGroup = "ess_person_resign_${spring.application.name}_${spring.profiles.active}"
|
||||
)
|
||||
@RocketMQMessageListener(maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", topic = "topic_organizational_${spring.profiles.active}", consumerGroup = "ess_person_resign_${spring.application.name}_${spring.profiles.active}")
|
||||
public class OrganizationalListener extends BaseListener implements RocketMQListener<MessageExt> {
|
||||
|
||||
private final EventConsumer eventConsumer;
|
||||
private final EventConsumer eventConsumer;
|
||||
|
||||
@Override
|
||||
public void onMessage(MessageExt message) {
|
||||
log.info("receive mq message: {}", JSON.toJSONString(message));
|
||||
super.onEvent(message, eventConsumer);
|
||||
}
|
||||
@Override
|
||||
public void onMessage(MessageExt message) {
|
||||
log.info("receive mq message: {}", JSON.toJSONString(message));
|
||||
super.onEvent(message, eventConsumer);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.utils;
|
||||
|
||||
import cn.axzo.basics.common.exception.ServiceException;
|
||||
@ -21,138 +22,138 @@ import java.util.Objects;
|
||||
@Slf4j
|
||||
public class BizAssertions {
|
||||
|
||||
public static ServiceException fail(String message, Object... args) {
|
||||
return new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
public static ServiceException fail(String message, Object... args) {
|
||||
return new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
|
||||
public static ServiceException fail(Exception e, String message, Object... args) {
|
||||
return new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage(), e);
|
||||
}
|
||||
public static ServiceException fail(Exception e, String message, Object... args) {
|
||||
return new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage(), e);
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言集合为空
|
||||
*/
|
||||
public static void assertEmpty(Collection<?> actual, String message, Object... args) {
|
||||
AssertUtil.isEmpty(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
/**
|
||||
* 断言集合为空
|
||||
*/
|
||||
public static void assertEmpty(Collection<?> actual, String message, Object... args) {
|
||||
AssertUtil.isEmpty(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言为NULL
|
||||
*/
|
||||
public static void assertNull(Object actual, String message, Object... args) {
|
||||
AssertUtil.isNull(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
/**
|
||||
* 断言为NULL
|
||||
*/
|
||||
public static void assertNull(Object actual, String message, Object... args) {
|
||||
AssertUtil.isNull(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言不为NULL
|
||||
*/
|
||||
public static void assertNotNull(Object actual, String message, Object... args) {
|
||||
AssertUtil.notNull(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
/**
|
||||
* 断言不为NULL
|
||||
*/
|
||||
public static void assertNotNull(Object actual, String message, Object... args) {
|
||||
AssertUtil.notNull(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言集合不为空
|
||||
*/
|
||||
public static void assertNotEmpty(Collection<?> actual, String message, Object... args) {
|
||||
AssertUtil.notEmpty(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
/**
|
||||
* 断言集合不为空
|
||||
*/
|
||||
public static void assertNotEmpty(Collection<?> actual, String message, Object... args) {
|
||||
AssertUtil.notEmpty(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言数组不为空
|
||||
*/
|
||||
public static <T> void assertNotEmpty(T[] actual, String message, Object... args) {
|
||||
AssertUtil.notEmpty(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
/**
|
||||
* 断言数组不为空
|
||||
*/
|
||||
public static <T> void assertNotEmpty(T[] actual, String message, Object... args) {
|
||||
AssertUtil.notEmpty(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言值为真
|
||||
*/
|
||||
public static void assertTrue(boolean actual, String message, Object... args) {
|
||||
AssertUtil.isTrue(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
/**
|
||||
* 断言值为真
|
||||
*/
|
||||
public static void assertTrue(boolean actual, String message, Object... args) {
|
||||
AssertUtil.isTrue(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言值不为真
|
||||
*/
|
||||
public static void assertFalse(boolean actual, String message, Object... args) {
|
||||
AssertUtil.isFalse(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
/**
|
||||
* 断言值不为真
|
||||
*/
|
||||
public static void assertFalse(boolean actual, String message, Object... args) {
|
||||
AssertUtil.isFalse(actual, MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言值2个值是否equals
|
||||
*/
|
||||
public static void assertEquals(Object expected, Object actual, String message, Object... args) {
|
||||
if (!Objects.equals(expected, actual)) {
|
||||
throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 断言值2个值是否equals
|
||||
*/
|
||||
public static void assertEquals(Object expected, Object actual, String message, Object... args) {
|
||||
if (!Objects.equals(expected, actual)) {
|
||||
throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 断言值2个值是否不equals
|
||||
*/
|
||||
public static void assertNotEquals(Object expected, Object actual, String message, Object... args) {
|
||||
if (Objects.equals(expected, actual)) {
|
||||
throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 断言值2个值是否不equals
|
||||
*/
|
||||
public static void assertNotEquals(Object expected, Object actual, String message, Object... args) {
|
||||
if (Objects.equals(expected, actual)) {
|
||||
throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static void assertNotBlank(String content, String message, Object... args) {
|
||||
if (StringUtils.isBlank(content)) {
|
||||
throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
}
|
||||
public static void assertNotBlank(String content, String message, Object... args) {
|
||||
if (StringUtils.isBlank(content)) {
|
||||
throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static void assertBlank(String content, String message, Object... args) {
|
||||
if (StringUtils.isNotBlank(content)) {
|
||||
throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
}
|
||||
public static void assertBlank(String content, String message, Object... args) {
|
||||
if (StringUtils.isNotBlank(content)) {
|
||||
throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private static String messageOrTemplateMessage(String message, String template, Object... args) {
|
||||
if (message != null) {
|
||||
return message;
|
||||
}
|
||||
return MessageFormatter.arrayFormat(template, args).getMessage();
|
||||
}
|
||||
private static String messageOrTemplateMessage(String message, String template, Object... args) {
|
||||
if (message != null) {
|
||||
return message;
|
||||
}
|
||||
return MessageFormatter.arrayFormat(template, args).getMessage();
|
||||
}
|
||||
|
||||
public static <T> T assertResponse(CommonResponse<T> response) {
|
||||
return assertResponse(response, "error resp={}", JSON.toJSONString(response));
|
||||
}
|
||||
public static <T> T assertResponse(CommonResponse<T> response) {
|
||||
return assertResponse(response, "error resp={}", JSON.toJSONString(response));
|
||||
}
|
||||
|
||||
public static <T> T assertResponse(CommonResponse<T> response, String message, Object... args) {
|
||||
if (response == null || response.getCode() != HttpStatus.HTTP_OK) {
|
||||
ServiceException e = new ServiceException(messageOrTemplateMessage(
|
||||
response == null ? null : response.getMsg(), message, args));
|
||||
log.warn("remote call response with error", e);
|
||||
throw e;
|
||||
}
|
||||
return response.getData();
|
||||
}
|
||||
public static <T> T assertResponse(CommonResponse<T> response, String message, Object... args) {
|
||||
if (response == null || response.getCode() != HttpStatus.HTTP_OK) {
|
||||
ServiceException e = new ServiceException(
|
||||
messageOrTemplateMessage(response == null ? null : response.getMsg(), message, args));
|
||||
log.warn("remote call response with error", e);
|
||||
throw e;
|
||||
}
|
||||
return response.getData();
|
||||
}
|
||||
|
||||
public static <T> T assertResponse(ApiResult<T> response) {
|
||||
return assertResponse(response, "error resp={}", JSON.toJSONString(response));
|
||||
}
|
||||
public static <T> T assertResponse(ApiResult<T> response) {
|
||||
return assertResponse(response, "error resp={}", JSON.toJSONString(response));
|
||||
}
|
||||
|
||||
public static <T> T assertResponse(ApiResult<T> response, String message, Object... args) {
|
||||
if (!response.isSuccess()) {
|
||||
ServiceException e = new ServiceException(messageOrTemplateMessage(response.getMsg(), message, args));
|
||||
log.warn("remote call response with error", e);
|
||||
throw e;
|
||||
}
|
||||
return response.getData();
|
||||
}
|
||||
public static <T> T assertResponse(ApiResult<T> response, String message, Object... args) {
|
||||
if (!response.isSuccess()) {
|
||||
ServiceException e = new ServiceException(messageOrTemplateMessage(response.getMsg(), message, args));
|
||||
log.warn("remote call response with error", e);
|
||||
throw e;
|
||||
}
|
||||
return response.getData();
|
||||
}
|
||||
|
||||
public static <T> List<T> assertResponse(ApiListResult<T> response) {
|
||||
return assertResponse(response, "error resp={}", JSON.toJSONString(response));
|
||||
}
|
||||
public static <T> List<T> assertResponse(ApiListResult<T> response) {
|
||||
return assertResponse(response, "error resp={}", JSON.toJSONString(response));
|
||||
}
|
||||
|
||||
public static <T> List<T> assertResponse(ApiListResult<T> response, String message, Object... args) {
|
||||
if (!response.isSuccess()) {
|
||||
ServiceException e = new ServiceException(messageOrTemplateMessage(response.getMsg(), message, args));
|
||||
log.warn("remote call response with error", e);
|
||||
throw e;
|
||||
}
|
||||
return response.getData();
|
||||
}
|
||||
public static <T> List<T> assertResponse(ApiListResult<T> response, String message, Object... args) {
|
||||
if (!response.isSuccess()) {
|
||||
ServiceException e = new ServiceException(messageOrTemplateMessage(response.getMsg(), message, args));
|
||||
log.warn("remote call response with error", e);
|
||||
throw e;
|
||||
}
|
||||
return response.getData();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.utils;
|
||||
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@ -13,7 +14,7 @@ import java.lang.annotation.Target;
|
||||
*/
|
||||
@Inherited
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||
@Target({ ElementType.TYPE, ElementType.METHOD })
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public @interface BizTransactional {
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.utils;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
@ -15,34 +16,34 @@ import static java.util.stream.Collectors.joining;
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class IdBuilder {
|
||||
|
||||
private final List<Object> buf = new ArrayList<>();
|
||||
private final boolean appendAbsentValue;
|
||||
private final List<Object> buf = new ArrayList<>();
|
||||
private final boolean appendAbsentValue;
|
||||
|
||||
public static IdBuilder idbuilder() {
|
||||
return new IdBuilder(false);
|
||||
}
|
||||
public static IdBuilder idbuilder() {
|
||||
return new IdBuilder(false);
|
||||
}
|
||||
|
||||
public static IdBuilder idbuilder(boolean appendAbsentValue) {
|
||||
return new IdBuilder(appendAbsentValue);
|
||||
}
|
||||
public static IdBuilder idbuilder(boolean appendAbsentValue) {
|
||||
return new IdBuilder(appendAbsentValue);
|
||||
}
|
||||
|
||||
public IdBuilder append(Object value) {
|
||||
if (isAbsentValue(value) && !appendAbsentValue)
|
||||
return this;
|
||||
buf.add(value);
|
||||
return this;
|
||||
}
|
||||
public IdBuilder append(Object value) {
|
||||
if (isAbsentValue(value) && !appendAbsentValue)
|
||||
return this;
|
||||
buf.add(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
private static boolean isAbsentValue(Object value) {
|
||||
if (value == null)
|
||||
return true;
|
||||
if (value instanceof String)
|
||||
return StringUtils.isBlank((String) value);
|
||||
return false;
|
||||
}
|
||||
private static boolean isAbsentValue(Object value) {
|
||||
if (value == null)
|
||||
return true;
|
||||
if (value instanceof String)
|
||||
return StringUtils.isBlank((String) value);
|
||||
return false;
|
||||
}
|
||||
|
||||
public String build() {
|
||||
return buf.stream().map(String::valueOf).collect(joining(":"));
|
||||
}
|
||||
public String build() {
|
||||
return buf.stream().map(String::valueOf).collect(joining(":"));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
|
||||
package cn.axzo.nanopart.ess.server.utils;
|
||||
|
||||
/**
|
||||
* @author yanglin
|
||||
*/
|
||||
public interface ThrowableSupplier<T> {
|
||||
T get() throws Exception;
|
||||
T get() throws Exception;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user