From 8168aef3c7557c9e1361892270a1ebe35dbddba5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 10 十一月 2026 11:42:19 +0800
Subject: [PATCH] refactor(erp): 采购申请与询价比价流程重构
---
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java | 141 +++++++++++++++--------------------------------
1 files changed, 45 insertions(+), 96 deletions(-)
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
index 4c2366e..9ffba24 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseRequestServiceImpl.java
@@ -4,7 +4,6 @@
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.number.MoneyUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
@@ -30,9 +29,8 @@
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
+import cn.iocoder.yudao.module.erp.enums.ErpPurchaseOrderSourceTypeEnum;
import cn.iocoder.yudao.module.erp.enums.ErpPurchaseRequestStatusEnum;
-import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi;
-import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -86,8 +84,6 @@
@Resource
private ErpSupplierService supplierService;
@Resource
- private SrmSupplierApi srmSupplierApi;
- @Resource
private MdmItemApi mdmItemApi;
@Resource
@@ -128,7 +124,7 @@
.setStatus(ErpPurchaseRequestStatusEnum.DRAFT.getStatus())
.setRequestUserId(userId)
.setRequestDeptId(deptId));
- calculateTotalPrice(purchaseRequest, requestItems);
+ calculateTotalCount(purchaseRequest, requestItems);
purchaseRequestMapper.insert(purchaseRequest);
// 6. 缁戝畾闄勪欢
@@ -156,7 +152,7 @@
// 4. 鏇存柊鐢宠鍗�
ErpPurchaseRequestDO updateObj = BeanUtils.toBean(updateReqVO, ErpPurchaseRequestDO.class);
- calculateTotalPrice(updateObj, requestItems);
+ calculateTotalCount(updateObj, requestItems);
purchaseRequestMapper.updateById(updateObj);
// 5. 鏇存柊鐢宠鏄庣粏
@@ -182,39 +178,24 @@
return respVO;
}
- // 1. 棰勭儹鈥滀緵搴斿晢鍚嶇О/缂栫爜 -> 渚涘簲鍟嗙紪鍙封�濇槧灏勶紙渚涘簲鍟嗕负鍙�夛級
- Map<String, Long> supplierIdMap = new HashMap<>();
- CommonResult<List<SrmSupplierRespDTO>> supplierResult = srmSupplierApi.getSupplierSimpleList();
- if (supplierResult != null && CollUtil.isNotEmpty(supplierResult.getData())) {
- supplierResult.getData().forEach(supplier -> {
- if (StrUtil.isNotBlank(supplier.getName())) {
- supplierIdMap.putIfAbsent(supplier.getName().trim(), supplier.getId());
- }
- if (StrUtil.isNotBlank(supplier.getCode())) {
- supplierIdMap.putIfAbsent(supplier.getCode().trim(), supplier.getId());
- }
- });
- }
-
- // 2. 鎸夆�滈噰璐敵璇峰崟鍙封�濆垎缁�
+ // 1. 鎸夆�滈噰璐敵璇峰崟鍙封�濆垎缁�
Map<String, List<ErpPurchaseRequestImportExcelVO>> groups = new LinkedHashMap<>();
for (int i = 0; i < importList.size(); i++) {
ErpPurchaseRequestImportExcelVO row = importList.get(i);
- if (row == null || (StrUtil.isBlank(row.getProductCode()) && StrUtil.isBlank(row.getSupplierName())
- && StrUtil.isBlank(row.getNo()))) {
+ if (row == null || (StrUtil.isBlank(row.getProductCode()) && StrUtil.isBlank(row.getNo()))) {
continue; // 璺宠繃绌鸿
}
String key = StrUtil.isNotBlank(row.getNo()) ? row.getNo().trim() : "__row_" + (i + 2);
groups.computeIfAbsent(key, k -> new ArrayList<>()).add(row);
}
- // 3. 閫愬紶鐢宠瀵煎叆
+ // 2. 閫愬紶鐢宠瀵煎叆
for (Map.Entry<String, List<ErpPurchaseRequestImportExcelVO>> entry : groups.entrySet()) {
List<ErpPurchaseRequestImportExcelVO> rows = entry.getValue();
String label = StrUtil.isNotBlank(rows.get(0).getNo()) ? rows.get(0).getNo().trim()
: "绗� " + entry.getKey().substring("__row_".length()) + " 琛�";
try {
- ErpPurchaseRequestDO purchaseRequest = createPurchaseRequestByImport(rows, supplierIdMap);
+ ErpPurchaseRequestDO purchaseRequest = createPurchaseRequestByImport(rows);
respVO.getCreateList().add(purchaseRequest.getNo());
} catch (Exception ex) {
respVO.getFailureList().put(label, resolveImportErrorMessage(ex));
@@ -228,21 +209,10 @@
/**
* 渚濇嵁瀵煎叆鏁版嵁鍒涘缓涓�寮犻噰璐敵璇凤紙鍚槑缁嗭級銆傜敵璇蜂汉/鐢宠閮ㄩ棬鐢卞綋鍓嶇櫥褰曠敤鎴疯嚜鍔ㄥ~鍏咃紱鐘舵�佷负鈥滄湭鎻愪氦(0)鈥濄��
*/
- private ErpPurchaseRequestDO createPurchaseRequestByImport(List<ErpPurchaseRequestImportExcelVO> rows,
- Map<String, Long> supplierIdMap) {
+ private ErpPurchaseRequestDO createPurchaseRequestByImport(List<ErpPurchaseRequestImportExcelVO> rows) {
ErpPurchaseRequestImportExcelVO head = rows.get(0);
- // 1. 渚涘簲鍟嗭紙鍙�夛級锛氬~浜嗗垯鎸夊悕绉�/缂栫爜鍖归厤骞舵牎楠�
- Long supplierId = null;
- if (StrUtil.isNotBlank(head.getSupplierName())) {
- supplierId = supplierIdMap.get(head.getSupplierName().trim());
- if (supplierId == null) {
- throw new IllegalArgumentException("渚涘簲鍟嗕笉瀛樺湪锛�" + head.getSupplierName());
- }
- supplierService.validateSupplier(supplierId);
- }
-
- // 2. 鏄庣粏
+ // 1. 鏄庣粏
List<ErpPurchaseRequestSaveReqVO.Item> items = new ArrayList<>();
for (ErpPurchaseRequestImportExcelVO row : rows) {
if (StrUtil.isBlank(row.getProductCode())) {
@@ -262,13 +232,8 @@
ErpPurchaseRequestSaveReqVO.Item itemVO = new ErpPurchaseRequestSaveReqVO.Item();
itemVO.setProductId(item.getId());
itemVO.setProductUnitId(item.getUnitMeasureId());
- // 鍗曚环锛氭湭濉啓鏃跺彇鐗╂枡鐨勯噰璐环
- itemVO.setProductPrice(row.getProductPrice() != null ? row.getProductPrice()
- : (item.getPurchasePrice() != null ? item.getPurchasePrice() : BigDecimal.ZERO));
itemVO.setCount(row.getCount());
- itemVO.setTaxPercent(row.getTaxPercent());
itemVO.setDemandTime(parseImportDate(row.getDemandTime()));
- itemVO.setQcCheckFlag("鏄�".equals(StrUtil.trim(row.getQcCheckFlag())));
itemVO.setRemark(row.getRemark());
items.add(itemVO);
}
@@ -293,17 +258,15 @@
// 5. 缁勮涓昏〃锛堢姸鎬佷负鈥滄湭鎻愪氦鈥濓級
ErpPurchaseRequestDO purchaseRequest = new ErpPurchaseRequestDO();
purchaseRequest.setNo(no);
- purchaseRequest.setSupplierId(supplierId);
purchaseRequest.setRequestTime(parseImportDateTime(head.getRequestTime()));
purchaseRequest.setRequestReason(head.getRequestReason());
purchaseRequest.setRemark(head.getRemark());
purchaseRequest.setStatus(ErpPurchaseRequestStatusEnum.DRAFT.getStatus());
purchaseRequest.setRequestUserId(userId);
purchaseRequest.setRequestDeptId(deptId);
- purchaseRequest.setDepositPrice(BigDecimal.ZERO);
List<ErpPurchaseRequestItemDO> itemDOs = validatePurchaseRequestItems(items);
- calculateTotalPrice(purchaseRequest, itemDOs);
+ calculateTotalCount(purchaseRequest, itemDOs);
purchaseRequestMapper.insert(purchaseRequest);
itemDOs.forEach(item -> item.setRequestId(purchaseRequest.getId()));
purchaseRequestItemMapper.insertBatch(itemDOs);
@@ -359,30 +322,19 @@
return StrUtil.blankToDefault(ex.getMessage(), "瀵煎叆澶辫触");
}
- private void calculateTotalPrice(ErpPurchaseRequestDO purchaseRequest, List<ErpPurchaseRequestItemDO> requestItems) {
+ private void calculateTotalCount(ErpPurchaseRequestDO purchaseRequest, List<ErpPurchaseRequestItemDO> requestItems) {
purchaseRequest.setTotalCount(getSumValue(requestItems, ErpPurchaseRequestItemDO::getCount, BigDecimal::add));
- purchaseRequest.setTotalProductPrice(getSumValue(requestItems, ErpPurchaseRequestItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO));
- purchaseRequest.setTotalTaxPrice(getSumValue(requestItems, ErpPurchaseRequestItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO));
- // 鍗曚环涓哄惈绋庡崟浠凤細浠风◣鍚堣 = 鍗曚环 * 鏁伴噺锛岀◣棰濆凡鍖呭惈鍦ㄥ崟浠蜂腑锛屼笉鍐嶉澶栧姞绋�
- purchaseRequest.setTotalPrice(purchaseRequest.getTotalProductPrice());
- // 璁$畻浼樻儬浠锋牸
- if (purchaseRequest.getDiscountPercent() == null) {
- purchaseRequest.setDiscountPercent(BigDecimal.ZERO);
- }
- purchaseRequest.setDiscountPrice(MoneyUtils.priceMultiplyPercent(purchaseRequest.getTotalPrice(), purchaseRequest.getDiscountPercent()));
- purchaseRequest.setTotalPrice(purchaseRequest.getTotalPrice().subtract(purchaseRequest.getDiscountPrice()));
}
private List<ErpPurchaseRequestItemDO> validatePurchaseRequestItems(List<ErpPurchaseRequestSaveReqVO.Item> list) {
- return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseRequestItemDO.class, item -> {
- if (item.getProductPrice() != null && item.getCount() != null) {
- item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()));
- if (item.getTaxPercent() != null) {
- // 鍗曚环涓哄惈绋庡崟浠凤細绋庨浠庝环绋庡悎璁′腑鍙嶇畻锛岃�屼笉鏄湪鍚堣涓婂啀鍔犵◣
- item.setTaxPrice(MoneyUtils.taxPriceIncluded(item.getTotalPrice(), item.getTaxPercent()));
- }
+ return convertList(list, o -> {
+ ErpPurchaseRequestItemDO item = BeanUtils.toBean(o, ErpPurchaseRequestItemDO.class);
+ // 閲囪喘鐢宠涓嶅啀濉啓鈥滄槸鍚﹁川妫�鈥濓紝榛樿闇�瑕佹潵鏂欐楠岋紝鐢熸垚鍙拌处鍚庡彲鍦ㄥ彴璐︿腑璋冩暣
+ if (item.getQcCheckFlag() == null) {
+ item.setQcCheckFlag(true);
}
- }));
+ return item;
+ });
}
private void updatePurchaseRequestItemList(Long id, List<ErpPurchaseRequestItemDO> newList) {
@@ -538,23 +490,11 @@
}
// 2. 鏍规嵁瀹℃壒缁撴灉鏇存柊鐘舵��
+ // 瀹℃壒閫氳繃鍚庝笉鑷姩鐢熸垚閲囪喘鍙拌处锛氱敱閲囪喘鍛樺湪鍒楄〃涓喅瀹氥�屽彂璧疯浠枫�嶆垨銆岀洿鎺ョ敓鎴愰噰璐彴璐︺��
Integer newStatus = convertBpmResultToStatus(bpmResult);
if (newStatus != null) {
purchaseRequestMapper.updateById(new ErpPurchaseRequestDO()
.setId(id).setStatus(newStatus));
- }
-
- // 3. 瀹℃壒閫氳繃涓旀湁渚涘簲鍟嗭紝鑷姩鐢熸垚閲囪喘璁㈠崟
- if (ErpPurchaseRequestStatusEnum.APPROVE.getStatus().equals(newStatus)
- && purchaseRequest.getSupplierId() != null
- && purchaseRequest.getOrderId() == null) {
- try {
- Long orderId = doGeneratePurchaseOrder(purchaseRequest);
- log.info("[updatePurchaseRequestAuditStatus] 閲囪喘鐢宠({}) 鑷姩鐢熸垚閲囪喘璁㈠崟({})", id, orderId);
- } catch (Exception e) {
- log.error("[updatePurchaseRequestAuditStatus] 閲囪喘鐢宠({}) 鑷姩鐢熸垚閲囪喘璁㈠崟澶辫触", id, e);
- // 涓嶆姏鍑哄紓甯革紝閬垮厤褰卞搷鐘舵�佹洿鏂�
- }
}
}
@@ -570,15 +510,18 @@
if (purchaseRequest.getOrderId() != null) {
throw exception(PURCHASE_REQUEST_ORDER_EXISTS);
}
- // 3. 渚涘簲鍟嗕互閲囪喘鐢宠鍗曚负鍑嗭細鐢宠鎻愪氦鏃跺凡缁忛�夎繃渚涘簲鍟嗭紝鐢熸垚璁㈠崟涓嶅啀瑕佹眰閲嶆柊閫夋嫨
- // 鍏煎鏃ц皟鐢ㄦ柟浠嶆樉寮忎紶 supplierId 鐨勬儏鍐碉紝浼犱簡鍒欎互浼犲叆鍊间负鍑�
- Long targetSupplierId = supplierId != null ? supplierId : purchaseRequest.getSupplierId();
- if (targetSupplierId == null) {
- throw exception(PURCHASE_REQUEST_SUPPLIER_REQUIRED);
+ // 3. 宸插彂璧疯浠风殑鐢宠锛屽繀椤荤瓑璇环纭锛堢‘瀹氫环鏍硷級鍚庢墠鑳界敓鎴愰噰璐彴璐�
+ if (purchaseRequest.getInquiryId() != null) {
+ throw exception(PURCHASE_REQUEST_INQUIRY_EXISTS);
}
- supplierService.validateSupplier(targetSupplierId);
+ // 4. 渚涘簲鍟嗕笉鍦ㄨ繖閲岀‘瀹氾細閲囪喘鐢宠鏈韩涓嶅~渚涘簲鍟嗭紝鐩存帴鐢熸垚鍙拌处鏃朵篃鍏佽涓虹┖锛�
+ // 鐢遍噰璐憳鍦ㄩ噰璐彴璐﹁崏绋块噷琛ュ厖渚涘簲鍟嗕笌浠锋牸鍚庡啀鎻愪氦瀹℃壒
+ Long targetSupplierId = supplierId != null ? supplierId : purchaseRequest.getSupplierId();
+ if (targetSupplierId != null) {
+ supplierService.validateSupplier(targetSupplierId);
+ }
- // 4. 璁剧疆渚涘簲鍟嗗苟鐢熸垚璁㈠崟
+ // 5. 鐢熸垚璁㈠崟锛坰upplierId 鍙负绌猴紝鐣欏緟鍙拌处琛ュ厖锛�
purchaseRequest.setSupplierId(targetSupplierId);
return doGeneratePurchaseOrder(purchaseRequest);
}
@@ -611,12 +554,17 @@
purchaseOrder.setSupplierId(purchaseRequest.getSupplierId());
purchaseOrder.setOrderTime(purchaseRequest.getRequestTime());
purchaseOrder.setTotalCount(purchaseRequest.getTotalCount());
- purchaseOrder.setTotalPrice(purchaseRequest.getTotalPrice());
- purchaseOrder.setTotalProductPrice(purchaseRequest.getTotalProductPrice());
- purchaseOrder.setTotalTaxPrice(purchaseRequest.getTotalTaxPrice());
- purchaseOrder.setDiscountPercent(purchaseRequest.getDiscountPercent());
- purchaseOrder.setDiscountPrice(purchaseRequest.getDiscountPrice());
- purchaseOrder.setDepositPrice(purchaseRequest.getDepositPrice() != null ? purchaseRequest.getDepositPrice() : BigDecimal.ZERO);
+ // 閲囪喘鐢宠涓嶅惈浠锋牸锛氬彴璐﹀厛浠� 0 閲戦鐢熸垚鑽夌锛岀敱閲囪喘鍛樺湪鍙拌处涓ˉ褰曞崟浠�/绋庣巼鍚庡啀鎻愪氦瀹℃壒
+ purchaseOrder.setTotalPrice(BigDecimal.ZERO);
+ purchaseOrder.setTotalProductPrice(BigDecimal.ZERO);
+ purchaseOrder.setTotalTaxPrice(BigDecimal.ZERO);
+ purchaseOrder.setDiscountPercent(BigDecimal.ZERO);
+ purchaseOrder.setDiscountPrice(BigDecimal.ZERO);
+ purchaseOrder.setDepositPrice(BigDecimal.ZERO);
+ purchaseOrder.setSourceType(ErpPurchaseOrderSourceTypeEnum.PURCHASE_REQUEST.getType());
+ purchaseOrder.setSourceId(purchaseRequest.getId());
+ purchaseOrder.setSourceNo(purchaseRequest.getNo());
+ purchaseOrder.setPurchaseRequestId(purchaseRequest.getId());
purchaseOrder.setRemark(purchaseRequest.getRemark());
purchaseOrder.setInCount(BigDecimal.ZERO);
purchaseOrder.setInStatus(0);
@@ -629,11 +577,12 @@
orderItem.setRequestItemId(item.getId()); // 鍏宠仈閲囪喘鐢宠鏄庣粏
orderItem.setProductId(item.getProductId());
orderItem.setProductUnitId(item.getProductUnitId());
- orderItem.setProductPrice(item.getProductPrice());
+ // 鍗曚环/绋庣巼寰呴噰璐憳鍦ㄥ彴璐︿腑琛ュ綍锛屽厛鎸� 0 淇濆瓨
+ orderItem.setProductPrice(BigDecimal.ZERO);
orderItem.setCount(item.getCount());
- orderItem.setTotalPrice(item.getTotalPrice());
- orderItem.setTaxPercent(item.getTaxPercent());
- orderItem.setTaxPrice(item.getTaxPrice());
+ orderItem.setTotalPrice(BigDecimal.ZERO);
+ orderItem.setTaxPercent(BigDecimal.ZERO);
+ orderItem.setTaxPrice(BigDecimal.ZERO);
orderItem.setRemark(item.getRemark());
orderItem.setInCount(BigDecimal.ZERO);
// 鏄惁璐ㄦ涓庨噰璐敵璇蜂繚鎸佷竴鑷达細鏄庣粏鏈槑纭爣璁版椂榛樿涓恒�屾槸銆嶏紙鍘嗗彶鐢宠鍗曞彲鑳戒负 null锛�
--
Gitblit v1.9.3