REQ-3581: 该签署位已签署, 无法再次签署

This commit is contained in:
yanglin 2025-02-26 17:39:36 +08:00
parent fc06c934e3
commit 5229a74397
49 changed files with 2179 additions and 2321 deletions

View File

@ -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();
}
}

View File

@ -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);
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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

View File

@ -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);
}
}

View File

@ -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);
}
}
}
}

View File

@ -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);
}
}

View File

@ -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 {
}
}
}

View File

@ -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 {
}
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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());
}
}
}

View File

@ -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;
}
}
}

View File

@ -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());
}
}
}

View File

@ -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);
}
}
}

View File

@ -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());
}
}
}

View File

@ -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);
}
}
}

View File

@ -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();
}
}
}
}
}

View File

@ -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());
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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;
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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;
}

View File

@ -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();
}
}
}

View File

@ -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);
}
}
}

View File

@ -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());
}
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}
}

View File

@ -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";
}

View File

@ -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));
}
}
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}
}

View File

@ -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);
}
}

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.ess.server.mapper;
import cn.axzo.nanopart.ess.server.entity.EssContract;

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.ess.server.mapper;
import cn.axzo.nanopart.ess.server.entity.EssLog;

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.ess.server.mapper;
import cn.axzo.nanopart.ess.server.entity.EssOrg;

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.ess.server.mapper;
import cn.axzo.nanopart.ess.server.entity.EssPerson;

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.ess.server.mapper;
import cn.axzo.nanopart.ess.server.entity.EssSeal;

View File

@ -1,3 +1,4 @@
package cn.axzo.nanopart.ess.server.mapper;
import cn.axzo.nanopart.ess.server.entity.EssSealPerson;

View File

@ -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);
}
}
}

View File

@ -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();
}
}
}

View File

@ -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 {
}
}

View File

@ -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(":"));
}
}
}

View File

@ -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;
}