Skip to content

Commit 37ad19d

Browse files
song-cc-rockfit2-zhao
authored andcommitted
feat: Approval push
1 parent c3cd253 commit 37ad19d

10 files changed

Lines changed: 78 additions & 18 deletions

File tree

backend/crm/src/main/java/cn/cordys/common/constants/FormKey.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,6 @@ public static FormKey ofKey(String key) {
9292
}
9393

9494
public boolean hasSnapshot() {
95-
return Strings.CI.equalsAny(this.key, CONTRACT.getKey(), INVOICE.getKey(), QUOTATION.getKey());
95+
return Strings.CI.equalsAny(this.key, CONTRACT.getKey(), INVOICE.getKey(), QUOTATION.getKey(), ORDER.getKey());
9696
}
9797
}

backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalFlowService.java

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,16 +1359,12 @@ public List<User> resolveApprovers(String userId, String orgId, ApproverTypeEnum
13591359

13601360
// 获取当前用户的组织用户信息
13611361
OrganizationUser currentUser = getOrganizationUser(userId, orgId);
1362-
if (currentUser == null) {
1363-
return List.of();
1364-
}
1365-
13661362
return switch (approverType) {
13671363
case MEMBER -> resolveMemberApprovers(orgId, approverList);
13681364
case ROLE -> resolveRoleApprovers(orgId, approverList);
13691365
case SUPERIOR -> resolveSuperiorApprovers(orgId, currentUser, approverList);
13701366
case MULTIPLE_SUPERIOR -> resolveMultipleSuperiorApprovers(orgId, currentUser, approverList);
1371-
case DEPT_HEAD -> resolveDeptHeadApprovers(orgId, currentUser.getDepartmentId(), approverList);
1367+
case DEPT_HEAD -> resolveDeptHeadApprovers(orgId, currentUser, approverList);
13721368
case MULTIPLE_DEPT_HEAD -> resolveMultipleDeptHeadApprovers(orgId, currentUser, approverList);
13731369
};
13741370
}
@@ -1410,6 +1406,9 @@ private List<User> resolveRoleApprovers(String orgId, List<String> roleIds) {
14101406
* 解析指定上级审批人
14111407
*/
14121408
private List<User> resolveSuperiorApprovers(String orgId, OrganizationUser currentUser, List<String> approverList) {
1409+
if (currentUser == null) {
1410+
return List.of();
1411+
}
14131412
// 值是单选
14141413
Integer approvalLevel = getValidLevel(approverList);
14151414

@@ -1439,6 +1438,9 @@ private List<User> resolveSuperiorApprovers(String orgId, OrganizationUser curre
14391438
* 解析多级上级审批人
14401439
*/
14411440
private List<User> resolveMultipleSuperiorApprovers(String orgId, OrganizationUser currentUser, List<String> approverList) {
1441+
if (currentUser == null) {
1442+
return List.of();
1443+
}
14421444
// 值是单选
14431445
Integer approvalLevel = getValidLevel(approverList);
14441446

@@ -1483,7 +1485,11 @@ private Integer getValidLevel(List<String> approverList) {
14831485
/**
14841486
* 解析部门负责人审批人
14851487
*/
1486-
private List<User> resolveDeptHeadApprovers(String orgId, String departmentId, List<String> approverList) {
1488+
private List<User> resolveDeptHeadApprovers(String orgId, OrganizationUser currentUser, List<String> approverList) {
1489+
if (currentUser == null) {
1490+
return List.of();
1491+
}
1492+
String departmentId = currentUser.getDepartmentId();
14871493
if (StringUtils.isBlank(departmentId)) {
14881494
return List.of();
14891495
}
@@ -1523,6 +1529,9 @@ private String getDeptCommander(String orgId, String departmentId) {
15231529
* 解析多级部门负责人审批人
15241530
*/
15251531
private List<User> resolveMultipleDeptHeadApprovers(String orgId, OrganizationUser currentUser, List<String> approverList) {
1532+
if (currentUser == null) {
1533+
return List.of();
1534+
}
15261535
String departmentId = currentUser.getDepartmentId();
15271536
if (StringUtils.isBlank(departmentId)) {
15281537
return List.of();
@@ -1586,6 +1595,18 @@ public List<User> getCurrentNodeApproverList(String currentNodeId, String userId
15861595
return resolveApprovers(userId, currentOrgId, ApproverTypeEnum.valueOf(nodeApprover.getApproverType()), JSON.parseArray(nodeApprover.getApproverList(), String.class));
15871596
}
15881597

1598+
/**
1599+
* 获取当前实例节点审批人
1600+
* @param approverType 审批类型
1601+
* @param approverList 审批人集合
1602+
* @param userId 用户ID
1603+
* @param currentOrgId 当前组织ID
1604+
* @return 审批人ID集合
1605+
*/
1606+
public List<User> getCurrentNodeApproverList(String approverType, List<String> approverList, String userId, String currentOrgId) {
1607+
return resolveApprovers(userId, currentOrgId, ApproverTypeEnum.valueOf(approverType), approverList);
1608+
}
1609+
15891610
/**
15901611
* 获取当前实例节点抄送人
15911612
* @param currentNodeId 当前节点ID
@@ -1598,6 +1619,18 @@ public List<User> getCurrentNodeCcList(String currentNodeId, String userId, Stri
15981619
return resolveApprovers(userId, currentOrgId, ApproverTypeEnum.valueOf(nodeApprover.getCcType()), JSON.parseArray(nodeApprover.getCcList(), String.class));
15991620
}
16001621

1622+
/**
1623+
* 获取当前实例节点抄送人
1624+
* @param ccType 抄送类型
1625+
* @param ccList 抄送人集合
1626+
* @param userId 用户ID
1627+
* @param currentOrgId 当前组织ID
1628+
* @return 抄送人ID集合
1629+
*/
1630+
public List<User> getCurrentNodeCcList(String ccType, List<String> ccList, String userId, String currentOrgId) {
1631+
return resolveApprovers(userId, currentOrgId, ApproverTypeEnum.valueOf(ccType), ccList);
1632+
}
1633+
16011634
/**
16021635
* 获取当前资源审批实例第一个节点
16031636
* @param instance 审批实例
@@ -1643,8 +1676,8 @@ private ApprovalNodeResponse getNextNodeWithExceptionHandler(ApprovalInstance in
16431676
ApprovalNodeApproverResponse nextApproverNode = (ApprovalNodeApproverResponse) nextNode;
16441677
if (ApprovalTypeEnum.valueOf(nextApproverNode.getApprovalType()) == ApprovalTypeEnum.AUTO_PASS) {
16451678
// 自动通过, 插入审批记录, 获取下一个节点
1646-
saveAutoRecord(instance.getId(), nodeId, ApprovalStatus.APPROVED, null);
1647-
return getNextNodeWithExceptionHandler(instance, nodeId, fieldValues, currentOrgId);
1679+
saveAutoRecord(instance.getId(), nextApproverNode.getId(), ApprovalStatus.APPROVED, null);
1680+
return getNextNodeWithExceptionHandler(instance, nextApproverNode.getId(), fieldValues, currentOrgId);
16481681
}
16491682
if (ApprovalTypeEnum.valueOf(nextApproverNode.getApprovalType()) == ApprovalTypeEnum.AUTO_REJECT) {
16501683
// 自动驳回, 插入审批记录
@@ -1654,8 +1687,8 @@ private ApprovalNodeResponse getNextNodeWithExceptionHandler(ApprovalInstance in
16541687
return exNode;
16551688
}
16561689
// 人工审批, 异常处理
1657-
List<User> nextApprovers = getCurrentNodeApproverList(nextApproverNode.getId(), instance.getSubmitterId(), currentOrgId);
1658-
List<User> nextCcList = getCurrentNodeCcList(nextApproverNode.getId(), instance.getSubmitterId(), currentOrgId);
1690+
List<User> nextApprovers = getCurrentNodeApproverList(nextApproverNode.getApproverType(), nextApproverNode.getApproverList(), instance.getSubmitterId(), currentOrgId);
1691+
List<User> nextCcList = getCurrentNodeCcList(nextApproverNode.getCcType(), nextApproverNode.getCcList(), instance.getSubmitterId(), currentOrgId);
16591692
nextApproverNode.setApproverList(nextApprovers.stream().map(User::getId).collect(Collectors.toList()));
16601693
nextApproverNode.setCcList(nextCcList.stream().map(User::getId).collect(Collectors.toList()));
16611694
// 审批人为空
@@ -1664,8 +1697,8 @@ private ApprovalNodeResponse getNextNodeWithExceptionHandler(ApprovalInstance in
16641697
switch (emptyAction) {
16651698
case AUTO_PASS -> {
16661699
// 自动通过, 插入审批记录, 获取下一个节点
1667-
saveAutoRecord(instance.getId(), nodeId, ApprovalStatus.APPROVED, "审批人为空,自动通过");
1668-
return getNextNodeWithExceptionHandler(instance, nodeId, fieldValues, currentOrgId);
1700+
saveAutoRecord(instance.getId(), nextApproverNode.getId(), ApprovalStatus.APPROVED, "审批人为空,自动通过");
1701+
return getNextNodeWithExceptionHandler(instance, nextApproverNode.getId(), fieldValues, currentOrgId);
16691702
}
16701703
case ASSIGN_SPECIFIC -> {
16711704
//指定人员处理: 返回人员列表

backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalInstanceService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package cn.cordys.crm.approval.service;
22

33
import cn.cordys.common.constants.FormKey;
4+
import cn.cordys.common.exception.GenericException;
45
import cn.cordys.common.util.BeanUtils;
56
import cn.cordys.common.util.CommonBeanFactory;
7+
import cn.cordys.common.util.Translator;
68
import cn.cordys.crm.approval.constants.ApprovalAction;
79
import cn.cordys.crm.approval.constants.ApprovalAddSignType;
810
import cn.cordys.crm.approval.constants.ApprovalStatus;
@@ -83,6 +85,9 @@ public ApprovalInstance getLatestInstance(String resourceId) {
8385
LambdaQueryWrapper<ApprovalInstance> wrapper = new LambdaQueryWrapper<>();
8486
wrapper.eq(ApprovalInstance::getResourceId, resourceId);
8587
List<ApprovalInstance> list = approvalInstanceMapper.selectListByLambda(wrapper);
88+
if (CollectionUtils.isEmpty(list)) {
89+
throw new GenericException(Translator.get("no.approval.instance"));
90+
}
8691
return CollectionUtils.isEmpty(list) ? null : list.stream().sorted(Comparator.comparing(ApprovalInstance::getSubmitTime)).toList().getLast();
8792
}
8893

backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalResourceService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ private void updateSnapshotApprovalStatus(FormKey formKey, String resourceId, St
193193
Map<FormKey, String> snapshotServiceMap = Map.of(
194194
FormKey.INVOICE, "contractInvoiceService",
195195
FormKey.QUOTATION, "opportunityQuotationService",
196-
FormKey.CONTRACT, "customerContactService"
196+
FormKey.CONTRACT, "contractService",
197+
FormKey.ORDER, "orderService"
197198
);
198199

199200
String serviceBeanName = snapshotServiceMap.get(formKey);

backend/crm/src/main/java/cn/cordys/crm/contract/service/ContractInvoiceService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ public ModuleFormConfigDTO getBusinessFormConfig(String organizationId) {
580580
}
581581

582582
/**
583-
* 由审批执行操作统一调用, 勿修改
583+
* ⚠️反射调用: 由审批执行操作统一调用, 勿修改
584584
* @param param 参数
585585
*/
586586
public void updateSnapshotApprovalStatus(ResourceSnapshotApprovalParam param) {

backend/crm/src/main/java/cn/cordys/crm/contract/service/ContractService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ private void updateStatusSnapshot(String id, String stage, String approvalStatus
679679
}
680680

681681
/**
682-
* 由审批执行操作统一调用, 勿修改
682+
* ⚠️反射调用: 由审批执行操作统一调用, 勿修改
683683
* @param param 参数
684684
*/
685685
public void updateSnapshotApprovalStatus(ResourceSnapshotApprovalParam param) {

backend/crm/src/main/java/cn/cordys/crm/opportunity/service/OpportunityQuotationService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ private void updateSnapshot(String id, String approvalStatus, ModuleFormConfigDT
458458
}
459459

460460
/**
461-
* 由审批执行操作统一调用, 勿修改
461+
* ⚠️反射调用: 由审批执行操作统一调用, 勿修改
462462
* @param param 参数
463463
*/
464464
public void updateSnapshotApprovalStatus(ResourceSnapshotApprovalParam param) {

backend/crm/src/main/java/cn/cordys/crm/order/service/OrderService.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@
2929
import cn.cordys.crm.approval.constants.ApprovalFormTypeEnum;
3030
import cn.cordys.crm.approval.constants.ApprovalStatus;
3131
import cn.cordys.crm.approval.constants.ExecuteTimingEnum;
32+
import cn.cordys.crm.approval.dto.ResourceSnapshotApprovalParam;
3233
import cn.cordys.crm.approval.service.ApprovalFlowService;
3334
import cn.cordys.crm.contract.domain.Contract;
35+
import cn.cordys.crm.contract.domain.ContractSnapshot;
36+
import cn.cordys.crm.contract.dto.response.ContractGetResponse;
3437
import cn.cordys.crm.customer.domain.Customer;
3538
import cn.cordys.crm.order.domain.Order;
3639
import cn.cordys.crm.order.domain.OrderSnapshot;
@@ -446,6 +449,22 @@ public OrderGetResponse getSnapshot(String id) {
446449
return response;
447450
}
448451

452+
/**
453+
* ⚠️反射调用: 由审批执行操作统一调用, 勿修改
454+
* @param param 参数
455+
*/
456+
public void updateSnapshotApprovalStatus(ResourceSnapshotApprovalParam param) {
457+
OrderSnapshot snapshotCriteria = new OrderSnapshot();
458+
snapshotCriteria.setOrderId(param.getResourceId());
459+
OrderSnapshot snapshot = snapshotBaseMapper.selectOne(snapshotCriteria);
460+
if (snapshot != null) {
461+
OrderGetResponse response = JSON.parseObject(snapshot.getOrderValue(), OrderGetResponse.class);
462+
response.setApprovalStatus(param.getApprovalStatus());
463+
snapshot.setOrderValue(JSON.toJSONString(response));
464+
snapshotBaseMapper.update(snapshot);
465+
}
466+
}
467+
449468

450469
/**
451470
* 订单列表

backend/crm/src/main/resources/i18n/cordys-crm_en_US.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,3 +851,4 @@ no.revoke.approval=Cannot revoke
851851
no.approval.next.node=No subsequent node found, check the approval flow configuration
852852
auto.approval.passed=Auto passed
853853
auto.approval.rejected=Auto rejected
854+
no.approval.instance=No approval instance!

backend/crm/src/main/resources/i18n/cordys-crm_zh_CN.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -849,4 +849,5 @@ reject_approval=驳回审批
849849
no.revoke.approval=无法撤销
850850
no.approval.next.node=未找到后续节点,请检查审批流配置
851851
auto.approval.passed=自动通过
852-
auto.approval.rejected=自动驳回
852+
auto.approval.rejected=自动驳回
853+
no.approval.instance=审批实例为空!

0 commit comments

Comments
 (0)