From 6fa82a1ad7c3ae061ef499f0d0806a16846e122b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 10 十一月 2026 16:55:02 +0800
Subject: [PATCH] feat(mes): 来料检验与不合格退货闭环优化
---
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java | 68 +++++++++++++++++++++++++++------
1 files changed, 55 insertions(+), 13 deletions(-)
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
index b14e32a..3a95fea 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -136,10 +136,8 @@
accountService.validateAccount(createReqVO.getAccountId());
}
// 1.4 鐢熸垚璁㈠崟鍙凤紝骞舵牎楠屽敮涓�鎬�
- String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX);
- if (purchaseOrderMapper.selectByNo(no) != null) {
- throw exception(PURCHASE_ORDER_NO_EXISTS);
- }
+ String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX,
+ candidate -> purchaseOrderMapper.selectByNo(candidate) != null);
// 2.1 鎻掑叆璁㈠崟锛坰ubmit=false 鏃朵繚瀛樹负鑽夌锛岀瓑寰呬笟鍔$‘璁ゅ悗鎵嬪姩鎻愪氦瀹℃壒锛�
ErpPurchaseOrderDO purchaseOrder = BeanUtils.toBean(createReqVO, ErpPurchaseOrderDO.class, in -> in
@@ -302,15 +300,21 @@
itemVO.setCount(row.getCount());
itemVO.setTaxPercent(row.getTaxPercent());
itemVO.setRemark(row.getRemark());
- itemVO.setQcCheckFlag("鏄�".equals(StrUtil.trim(row.getQcCheckFlag())));
+ // 閲囪喘鍙拌处涓嶅啀鎻愪緵銆屾槸鍚﹁川妫�銆嶉�夋嫨锛氬鍏ョ殑鏄庣粏涓�寰嬮渶瑕佹潵鏂欐楠�
+ itemVO.setQcCheckFlag(true);
items.add(itemVO);
}
// 3. 鍗曞彿锛氬~浜嗗氨鐢紙鏍¢獙鍞竴锛夛紝娌″~鑷姩鐢熸垚
- String no = StrUtil.isNotBlank(head.getNo()) ? head.getNo().trim()
- : noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX);
- if (purchaseOrderMapper.selectByNo(no) != null) {
- throw new IllegalArgumentException("閲囪喘鍗曠紪鍙峰凡瀛樺湪锛�" + no);
+ String no;
+ if (StrUtil.isNotBlank(head.getNo())) {
+ no = head.getNo().trim();
+ if (purchaseOrderMapper.selectByNo(no) != null) {
+ throw new IllegalArgumentException("閲囪喘鍗曠紪鍙峰凡瀛樺湪锛�" + no);
+ }
+ } else {
+ no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX,
+ candidate -> purchaseOrderMapper.selectByNo(candidate) != null);
}
// 4. 缁勮涓昏〃锛氬嬀閫夆�滄槸鍚﹀鏍糕�� => 宸插鏍�(20)锛屽惁鍒欐湭瀹℃牳(10)
@@ -450,6 +454,43 @@
}
}
+ /**
+ * 鎻愪氦瀹℃壒鍓嶆牎楠岄噰璐彴璐︽暟鎹槸鍚﹀凡琛ラ綈
+ *
+ * <p>閲囪喘鐢宠鐩存帴鐢熸垚鐨勫彴璐﹀彧鏈夌墿鏂欎笌鏁伴噺锛堥浂閲戦銆佹棤渚涘簲鍟嗭級锛�
+ * 閲囪喘鍛橀渶瑕佸湪鍙拌处閲岃ˉ褰曚緵搴斿晢銆佸崟浠枫�佷粯娆炬棩鏈熷悗鎵嶈兘鎻愪氦瀹℃壒銆傞�愰」鏍¢獙锛屽懡涓涓�澶勫嵆鎻愮ず鍏蜂綋鎬庝箞鏀广��</p>
+ *
+ * @param purchaseOrder 閲囪喘鍙拌处
+ */
+ private void validatePurchaseOrderReadyForSubmit(ErpPurchaseOrderDO purchaseOrder) {
+ // 2.1 渚涘簲鍟嗗繀閫�
+ if (purchaseOrder.getSupplierId() == null) {
+ throw exception(PURCHASE_ORDER_SUBMIT_SUPPLIER_REQUIRED, purchaseOrder.getNo());
+ }
+ // 2.2 浠樻鏃ユ湡蹇呴�夛細閲囪喘鐢宠鑷姩鐢熸垚鐨勮崏绋胯鍗曟病鏈変粯娆炬棩鏈�
+ if (purchaseOrder.getPaymentDate() == null) {
+ throw exception(PURCHASE_ORDER_PAYMENT_DATE_REQUIRED);
+ }
+ // 2.3 鏄庣粏鍗曚环蹇呴』琛ュ綍锛堝ぇ浜� 0锛�
+ List<ErpPurchaseOrderItemDO> items = purchaseOrderItemMapper.selectListByOrderId(purchaseOrder.getId());
+ if (CollUtil.isEmpty(items)) {
+ throw exception(PURCHASE_ORDER_SUBMIT_ITEM_REQUIRED, purchaseOrder.getNo());
+ }
+ Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
+ convertSet(items, ErpPurchaseOrderItemDO::getProductId));
+ for (ErpPurchaseOrderItemDO item : items) {
+ BigDecimal productPrice = item.getProductPrice();
+ if (productPrice != null && productPrice.compareTo(BigDecimal.ZERO) > 0) {
+ continue;
+ }
+ MdmItemRespDTO itemDTO = itemMap.get(item.getProductId());
+ String itemName = itemDTO != null && StrUtil.isNotBlank(itemDTO.getName())
+ ? itemDTO.getName() : "ID=" + item.getProductId();
+ throw exception(PURCHASE_ORDER_SUBMIT_PRICE_REQUIRED, itemName,
+ productPrice == null ? "鏈~鍐�" : productPrice.toPlainString());
+ }
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
public void submitPurchaseOrder(Long id, String processDefinitionKey, Long userId) {
@@ -460,10 +501,9 @@
if (!submitable) {
throw exception(PURCHASE_ORDER_SUBMIT_FAIL_STATUS);
}
- // 2. 浠樻鏃ユ湡蹇呴�夛細閲囪喘鐢宠鑷姩鐢熸垚鐨勮崏绋胯鍗曟病鏈変粯娆炬棩鏈燂紝鎻愪氦鍓嶅繀椤诲厛缂栬緫琛ラ綈
- if (purchaseOrder.getPaymentDate() == null) {
- throw exception(PURCHASE_ORDER_PAYMENT_DATE_REQUIRED);
- }
+ // 2. 鎻愪氦鍓嶆牎楠屽彴璐︽暟鎹凡琛ラ綈锛氶噰璐敵璇风洿鎺ョ敓鎴愮殑鑽夌鍙湁鐗╂枡涓庢暟閲忥紝
+ // 渚涘簲鍟嗐�佸崟浠风瓑闇�瑕侀噰璐憳鍦ㄥ彴璐︿腑琛ュ綍鍚庢墠鑳芥彁浜ゅ鎵�
+ validatePurchaseOrderReadyForSubmit(purchaseOrder);
// 3. 鍒涘缓 BPM 娴佺▼瀹炰緥
// 鍏ㄥ眬鍏嶅鎵癸細涓氬姟鏍¢獙閫氳繃鍚庣洿鎺ユ墽琛屽鎵归�氳繃閫昏緫锛屾棤闇�娴佺▼妯″瀷銆�
@@ -572,6 +612,8 @@
private List<ErpPurchaseOrderItemDO> validatePurchaseOrderItems(List<ErpPurchaseOrderSaveReqVO.Item> list) {
// 杞寲涓� ErpPurchaseOrderItemDO 鍒楄〃锛堜骇鍝侀獙璇佸凡绉婚櫎锛�
List<ErpPurchaseOrderItemDO> items = convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseOrderItemDO.class, item -> {
+ // 閲囪喘鍙拌处涓嶅啀鎻愪緵銆屾槸鍚﹁川妫�銆嶉�夋嫨锛氶噰璐槑缁嗕竴寰嬮渶瑕佹潵鏂欐楠�
+ item.setQcCheckFlag(true);
item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount()));
if (item.getTotalPrice() == null) {
return;
--
Gitblit v1.9.3