From d5cd948848595b0cffe098ba542a9c879b0f9165 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 13 七月 2026 10:09:39 +0800
Subject: [PATCH] 1.仓储物流-采购模块联动 2.仓储物流-销售模块联动 3.清理表数据
---
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java | 131 ++++++++++++++++++++++++++++++++++++++++---
1 files changed, 120 insertions(+), 11 deletions(-)
diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
index 1ce3f41..6518016 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/contract/CrmContractServiceImpl.java
@@ -10,6 +10,9 @@
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractPageReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractSaveReqVO;
import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.contract.CrmContractTransferReqVO;
@@ -29,7 +32,6 @@
import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
-import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderCreateReqDTO;
@@ -49,10 +51,15 @@
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+
+import org.flowable.engine.repository.ProcessDefinition;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
@@ -75,6 +82,11 @@
*/
public static final String BPM_PROCESS_DEFINITION_KEY = "crm-contract-audit";
+ /**
+ * BPM 鍚堝悓瀹℃壒鍒嗙被缂栫爜
+ */
+ private static final String CONTRACT_APPROVE_CATEGORY_CODE = "contract_approve";
+
@Resource
private CrmContractMapper contractMapper;
@Resource
@@ -85,8 +97,6 @@
@Resource
private CrmPermissionService crmPermissionService;
- @Resource
- private CrmProductService productService;
@Resource
private CrmCustomerService customerService;
@Resource
@@ -102,6 +112,10 @@
private AdminUserApi adminUserApi;
@Resource
private BpmProcessInstanceApi bpmProcessInstanceApi;
+ @Resource
+ private BpmCategoryService bpmCategoryService;
+ @Resource
+ private BpmProcessDefinitionService bpmProcessDefinitionService;
@Resource
private ErpSaleOrderApi saleOrderApi;
@Resource
@@ -123,7 +137,9 @@
}
// 2.1 鎻掑叆鍚堝悓
- CrmContractDO contract = BeanUtils.toBean(createReqVO, CrmContractDO.class).setNo(no);
+ CrmContractDO contract = BeanUtils.toBean(createReqVO, CrmContractDO.class)
+ .setNo(no)
+ .setAuditStatus(CrmAuditStatusEnum.DRAFT.getStatus()); // 榛樿涓烘湭鎻愪氦鐘舵��
calculateTotalPrice(contract, contractProducts);
contractMapper.insert(contract);
// 2.2 鎻掑叆鍚堝悓鍏宠仈鍟嗗搧
@@ -308,23 +324,98 @@
@Transactional(rollbackFor = Exception.class)
@LogRecord(type = CRM_CONTRACT_TYPE, subType = CRM_CONTRACT_SUBMIT_SUB_TYPE, bizNo = "{{#id}}",
success = CRM_CONTRACT_SUBMIT_SUCCESS)
- public void submitContract(Long id, Long userId) {
+ public void submitContract(Long id, String processDefinitionKey, Long userId) {
// 1. 鏍¢獙鍚堝悓鏄惁鍦ㄥ鎵�
CrmContractDO contract = validateContractExists(id);
if (ObjUtil.notEqual(contract.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus())) {
throw exception(CONTRACT_SUBMIT_FAIL_NOT_DRAFT);
}
- // 2. 鍒涘缓鍚堝悓瀹℃壒娴佺▼瀹炰緥
- String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO()
- .setProcessDefinitionKey(BPM_PROCESS_DEFINITION_KEY).setBusinessKey(String.valueOf(id)));
+ // 2. 鏍¢獙鍒嗙被鍜屾祦绋嬪畾涔夋槸鍚﹀瓨鍦�
+ validateContractApproveCategoryAndProcessDefinition();
- // 3. 鏇存柊鍚堝悓宸ヤ綔娴佺紪鍙�
+ // 3. 鏍¢獙浼犲叆鐨勬祦绋嬪畾涔� Key 鏄惁灞炰簬璇ュ垎绫讳笖澶勪簬婵�娲荤姸鎬�
+ ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey);
+ if (processDefinition == null) {
+ throw exception(CONTRACT_BPM_PROCESS_DEFINITION_NOT_EXISTS);
+ }
+
+ // 4. 鍒涘缓鍚堝悓瀹℃壒娴佺▼瀹炰緥
+ String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO()
+ .setProcessDefinitionKey(processDefinitionKey).setBusinessKey(String.valueOf(id)));
+
+ // 5. 鏇存柊鍚堝悓宸ヤ綔娴佺紪鍙�
contractMapper.updateById(new CrmContractDO().setId(id).setProcessInstanceId(processInstanceId)
.setAuditStatus(CrmAuditStatusEnum.PROCESS.getStatus()));
- // 3. 璁板綍鏃ュ織
+ // 6. 璁板綍鏃ュ織
LogRecordContext.putVariable("contractName", contract.getName());
+ }
+
+ /**
+ * 鏍¢獙 BPM 鍚堝悓瀹℃壒鍒嗙被鍜屾祦绋嬪畾涔夋槸鍚﹀瓨鍦�
+ */
+ private void validateContractApproveCategoryAndProcessDefinition() {
+ // 1. 鏍¢獙鍒嗙被鏄惁瀛樺湪
+ List<String> codes = Collections.singletonList(CONTRACT_APPROVE_CATEGORY_CODE);
+ Map<String, ?> categoryMap = bpmCategoryService.getCategoryMap(codes);
+ if (!categoryMap.containsKey(CONTRACT_APPROVE_CATEGORY_CODE)) {
+ throw exception(CONTRACT_BPM_PROCESS_DEFINITION_NOT_EXISTS);
+ }
+
+ // 2. 鏍¢獙鍒嗙被涓嬫槸鍚︽湁鍙敤鐨勬祦绋嬪畾涔�
+ List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService
+ .getProcessDefinitionInfoListByCategory(CONTRACT_APPROVE_CATEGORY_CODE);
+ if (CollUtil.isEmpty(definitionInfoList)) {
+ throw exception(CONTRACT_BPM_PROCESS_DEFINITION_NOT_EXISTS);
+ }
+
+ // 3. 鏍¢獙鏄惁鏈夋縺娲荤姸鎬佺殑娴佺▼瀹氫箟
+ Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId);
+ List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds);
+ boolean hasActiveDefinition = processDefinitions.stream()
+ .anyMatch(pd -> !pd.isSuspended());
+ if (!hasActiveDefinition) {
+ throw exception(CONTRACT_BPM_PROCESS_DEFINITION_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public List<Map<String, Object>> getContractApproveProcessDefinitionList() {
+ // 1. 鏍¢獙鍒嗙被鍜屾祦绋嬪畾涔夋槸鍚﹀瓨鍦�
+ validateContractApproveCategoryAndProcessDefinition();
+
+ // 2. 鑾峰彇鍒嗙被涓嬬殑娴佺▼瀹氫箟淇℃伅
+ List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService
+ .getProcessDefinitionInfoListByCategory(CONTRACT_APPROVE_CATEGORY_CODE);
+
+ // 3. 鑾峰彇娴佺▼瀹氫箟璇︽儏
+ Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId);
+ List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds);
+
+ // 4. 杩囨护锛氬彧淇濈暀婵�娲荤姸鎬侊紝涓旂浉鍚� key 鍙繚鐣欐渶鏂扮増鏈�
+ Map<String, ProcessDefinition> latestVersionMap = new HashMap<>();
+ for (ProcessDefinition pd : processDefinitions) {
+ if (pd.isSuspended()) {
+ continue;
+ }
+ ProcessDefinition existing = latestVersionMap.get(pd.getKey());
+ if (existing == null || pd.getVersion() > existing.getVersion()) {
+ latestVersionMap.put(pd.getKey(), pd);
+ }
+ }
+
+ // 5. 杩斿洖娴佺▼瀹氫箟鍒楄〃
+ List<Map<String, Object>> result = new ArrayList<>();
+ for (ProcessDefinition pd : latestVersionMap.values()) {
+ Map<String, Object> item = new HashMap<>();
+ item.put("id", pd.getId());
+ item.put("key", pd.getKey());
+ item.put("name", pd.getName());
+ item.put("version", pd.getVersion());
+ result.add(item);
+ }
+ return result;
}
@Override
@@ -462,7 +553,8 @@
createReqDTO.setContractNo(contract.getNo());
createReqDTO.setSaleUserId(contract.getOwnerUserId());
createReqDTO.setOrderTime(LocalDateTime.now().toString());
- createReqDTO.setDiscountPercent(contract.getDiscountPercent());
+ createReqDTO.setDiscountPercent(contract.getDiscountPercent() != null ? contract.getDiscountPercent() : BigDecimal.ZERO);
+ createReqDTO.setDepositPrice(contract.getDepositPrice() != null ? contract.getDepositPrice() : BigDecimal.ZERO);
createReqDTO.setRemark("鐢卞悎鍚屻��" + contract.getNo() + "銆戣嚜鍔ㄧ敓鎴�");
// 5. 鏋勫缓璁㈠崟椤�
@@ -494,4 +586,21 @@
return orderId;
}
+ @Override
+ public void updateContractStatus(Long id, Integer status) {
+ contractMapper.updateById(new CrmContractDO()
+ .setId(id)
+ .setAuditStatus(status));
+ }
+
+ @Override
+ public void updateContractStatusByOrderId(Long orderId, Integer status) {
+ CrmContractDO contract = contractMapper.selectByOrderId(orderId);
+ if (contract != null) {
+ contractMapper.updateById(new CrmContractDO()
+ .setId(contract.getId())
+ .setAuditStatus(status));
+ }
+ }
+
}
--
Gitblit v1.9.3