From 05ab6e3f69a5e73624b2573db043f5923e8f7d8b Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期四, 05 十一月 2026 14:17:19 +0800
Subject: [PATCH] fix 修复bug
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 204 insertions(+), 0 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
index 4403d20..8f2a662 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
@@ -2,12 +2,19 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptImportExcelVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineSaveReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.vo.MesWmDocImportRespVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
+import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
+import cn.iocoder.yudao.module.srm.api.supplier.dto.SrmSupplierRespDTO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO;
@@ -34,12 +41,19 @@
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.validation.annotation.Validated;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -61,6 +75,8 @@
@Resource
private MesWmItemReceiptLineService itemReceiptLineService;
@Resource
+ private PlatformTransactionManager transactionManager;
+ @Resource
private MesWmItemReceiptDetailService itemReceiptDetailService;
@Resource
@Lazy
@@ -76,6 +92,10 @@
@Resource
private MesWmArrivalNoticeLineService arrivalNoticeLineService;
+
+ @Resource
+ @Lazy
+ private MesMdItemService mdItemService;
@Resource
private BpmProcessInstanceApi processInstanceApi;
@@ -518,4 +538,188 @@
return "IR" + System.currentTimeMillis();
}
+ // ==================== 鎵归噺瀵煎叆 ====================
+
+ @Override
+ public MesWmDocImportRespVO importItemReceiptList(List<MesWmItemReceiptImportExcelVO> importList) {
+ MesWmDocImportRespVO respVO = MesWmDocImportRespVO.empty();
+ if (CollUtil.isEmpty(importList)) {
+ return respVO;
+ }
+ // 1. 鎸夈�屽叆搴撳崟缂栫爜銆嶅綊骞舵垚鍗曟嵁 + 鏄庣粏琛�
+ Map<String, List<MesWmItemReceiptImportExcelVO>> grouped = new LinkedHashMap<>();
+ int index = 0;
+ for (MesWmItemReceiptImportExcelVO row : importList) {
+ index++;
+ String code = StrUtil.trim(row.getReceiptCode());
+ if (StrUtil.isBlank(code)) {
+ respVO.getFailureCodes().put("绗� " + index + " 琛�", "鍏ュ簱鍗曠紪鐮佷笉鑳戒负绌�");
+ continue;
+ }
+ grouped.computeIfAbsent(code, k -> new ArrayList<>()).add(row);
+ }
+
+ // 2. 棰勫姞杞戒緵搴斿晢锛屾寜鍚嶇О寤虹储寮�
+ // 娉ㄦ剰锛歡etSupplierSimpleList() 鍙繑鍥炵壒瀹氱姸鎬佺殑渚涘簲鍟嗭紝鍙兘缂哄皯鍘嗗彶/鍋滅敤渚涘簲鍟嗭紝
+ // 鍥犳杩欓噷浠ャ�屼緵搴斿晢鍚嶇О銆嶉�愯鍏滃簳鏌ヨ锛堣 resolveVendorId锛夈��
+ Map<String, Long> vendorMap = new HashMap<>();
+ try {
+ List<SrmSupplierRespDTO> suppliers = srmSupplierApi.getSupplierSimpleList().getCheckedData();
+ if (CollUtil.isNotEmpty(suppliers)) {
+ suppliers.forEach(s -> {
+ if (StrUtil.isNotBlank(s.getName())) {
+ vendorMap.put(s.getName().trim(), s.getId());
+ }
+ });
+ }
+ } catch (Exception e) {
+ log.warn("[importItemReceiptList][鍔犺浇渚涘簲鍟嗙畝娲佸垪琛ㄥけ璐ワ紝灏嗛�愯鏌ヨ]", e);
+ }
+
+ // 3. 閫愬紶鍗曟嵁澶勭悊
+ for (Map.Entry<String, List<MesWmItemReceiptImportExcelVO>> entry : grouped.entrySet()) {
+ String code = entry.getKey();
+ List<MesWmItemReceiptImportExcelVO> rows = entry.getValue();
+ MesWmItemReceiptImportExcelVO head = rows.get(0);
+ try {
+ // 3.1 鏍¢獙渚涘簲鍟�
+ String vendorName = StrUtil.trim(head.getVendorName());
+ Long vendorId = vendorName == null ? null : vendorMap.get(vendorName);
+ if (vendorId == null && vendorName != null) {
+ // 鍏滃簳锛氱畝娲佸垪琛ㄥ彲鑳芥湭瑕嗙洊璇ヤ緵搴斿晢锛屾寜鍚嶇О鏌ヨ
+ SrmSupplierRespDTO supplier = findSupplierByName(vendorName);
+ if (supplier != null) {
+ vendorId = supplier.getId();
+ vendorMap.put(vendorName, vendorId);
+ }
+ }
+ if (vendorId == null) {
+ respVO.getFailureCodes().put(code, "渚涘簲鍟哰" + vendorName + "]涓嶅瓨鍦�");
+ continue;
+ }
+ // 3.2 鏍¢獙鏃ユ湡涓庣紪鐮�
+ LocalDateTime receiptDate = parseImportDateTime(head.getReceiptDate());
+ if (receiptDate == null) {
+ respVO.getFailureCodes().put(code, "鍏ュ簱鏃ユ湡涓嶈兘涓虹┖鎴栨牸寮忎笉姝g‘锛堟敮鎸� yyyy-MM-dd / yyyy-MM-dd HH:mm:ss锛�");
+ continue;
+ }
+ if (itemReceiptMapper.selectByCode(code) != null) {
+ respVO.getFailureCodes().put(code, "鍏ュ簱鍗曠紪鐮佸凡瀛樺湪");
+ continue;
+ }
+ // 3.3 鍒涘缓鍗曟嵁澶�
+ MesWmItemReceiptSaveReqVO saveReqVO = new MesWmItemReceiptSaveReqVO();
+ saveReqVO.setCode(code);
+ saveReqVO.setName(StrUtil.blankToDefault(StrUtil.trim(head.getReceiptName()), code));
+ saveReqVO.setVendorId(vendorId);
+ saveReqVO.setReceiptDate(receiptDate);
+ saveReqVO.setPurchaseOrderCode(StrUtil.trim(head.getPurchaseOrderCode()));
+ saveReqVO.setRemark(StrUtil.trim(head.getRemark()));
+ Long receiptId = createItemReceipt(saveReqVO);
+ // 3.4 閫愯鍒涘缓鏄庣粏
+ int createdLines = 0;
+ for (MesWmItemReceiptImportExcelVO row : rows) {
+ if (createItemReceiptLineByImport(receiptId, row, respVO, code)) {
+ createdLines++;
+ }
+ }
+ if (createdLines == 0) {
+ // 娌℃湁浠讳綍鏈夋晥鏄庣粏鏃朵笉淇濈暀绌哄崟锛屼篃涓嶆姤鍛婂鍏ユ垚鍔熴��
+ itemReceiptMapper.deleteById(receiptId);
+ } else {
+ respVO.getCreateCodes().add(code);
+ }
+ } catch (Exception e) {
+ respVO.getFailureCodes().put(code, e.getMessage() == null ? "瀵煎叆澶辫触" : e.getMessage());
+ }
+ }
+ return respVO;
+ }
+
+ /**
+ * 瀵煎叆鏃跺垱寤哄崟琛屾槑缁嗭紱澶辫触鍙褰曚笉鎶涘嚭锛岄伩鍏嶅奖鍝嶆暣寮犲崟鎹殑鍏跺畠琛�
+ */
+ private boolean createItemReceiptLineByImport(Long receiptId, MesWmItemReceiptImportExcelVO row,
+ MesWmDocImportRespVO respVO, String receiptCode) {
+ String itemCode = StrUtil.trim(row.getItemCode());
+ MesMdItemDO item = itemCode == null ? null : mdItemService.getItemByCode(itemCode);
+ if (item == null) {
+ respVO.getFailureCodes().put(receiptCode, "鐗╂枡缂栫爜[" + itemCode + "]涓嶅瓨鍦紝璇ヨ宸茶烦杩�");
+ return false;
+ }
+ if (row.getReceivedQuantity() == null || row.getReceivedQuantity().signum() <= 0) {
+ respVO.getFailureCodes().put(receiptCode, "鐗╂枡[" + itemCode + "]鍏ュ簱鏁伴噺蹇呴』澶т簬 0锛岃琛屽凡璺宠繃");
+ return false;
+ }
+ try {
+ MesWmItemReceiptLineSaveReqVO lineReqVO = new MesWmItemReceiptLineSaveReqVO();
+ lineReqVO.setReceiptId(receiptId);
+ lineReqVO.setItemId(item.getId());
+ lineReqVO.setReceivedQuantity(row.getReceivedQuantity());
+ lineReqVO.setProductionDate(parseImportDateTime(row.getProductionDate()));
+ lineReqVO.setExpireDate(parseImportDateTime(row.getExpireDate()));
+ lineReqVO.setLotNumber(StrUtil.trim(row.getLotNumber()));
+ lineReqVO.setRemark(StrUtil.trim(row.getRemark()));
+ // 姣忚鐙珛浜嬪姟锛氭壒娆℃牎楠屽け璐ユ椂鍙洖婊氳琛岋紝閬垮厤姹℃煋鏁存瀵煎叆浜嬪姟銆�
+ new TransactionTemplate(transactionManager).executeWithoutResult(
+ status -> itemReceiptLineService.createItemReceiptLine(lineReqVO));
+ return true;
+ } catch (Exception e) {
+ respVO.getFailureCodes().put(receiptCode, "鐗╂枡[" + itemCode + "]鏄庣粏鍒涘缓澶辫触锛�" + e.getMessage());
+ return false;
+ }
+ }
+
+ /**
+ * 鎸夊悕绉版煡鎵句緵搴斿晢锛堝厹搴曪級
+ *
+ * getSupplierSimpleList() 鍙繑鍥炲凡閫氳繃鍑嗗叆瀹℃壒鐨勪緵搴斿晢锛�
+ * 鍘嗗彶瀵煎叆鎴栨湭璧板噯鍏ユ祦绋嬬殑渚涘簲鍟嗕笉鍦ㄥ叾涓紝鍥犳閫�鍖栦负鍏ㄩ噺鍖归厤銆�
+ */
+ private SrmSupplierRespDTO findSupplierByName(String name) {
+ try {
+ var simple = srmSupplierApi.getSupplierSimpleList();
+ if (simple != null && CollUtil.isNotEmpty(simple.getCheckedData())) {
+ SrmSupplierRespDTO hit = simple.getCheckedData().stream()
+ .filter(s -> name.equals(StrUtil.trim(s.getName())))
+ .findFirst().orElse(null);
+ if (hit != null) {
+ return hit;
+ }
+ }
+ } catch (Exception e) {
+ log.warn("[findSupplierByName][绠�娲佸垪琛ㄦ煡璇㈠け璐ワ紝鏀圭敤鍏ㄩ噺]", e);
+ }
+ try {
+ var all = srmSupplierApi.getSupplierAllList();
+ if (all != null && CollUtil.isNotEmpty(all.getCheckedData())) {
+ return all.getCheckedData().stream()
+ .filter(s -> name.equals(StrUtil.trim(s.getName())))
+ .findFirst().orElse(null);
+ }
+ } catch (Exception e) {
+ log.warn("[findSupplierByName][鍏ㄩ噺鍒楄〃鏌ヨ澶辫触]", e);
+ }
+ return null;
+ }
+
+ /**
+ * 瑙f瀽瀵煎叆鏃ユ湡锛屾敮鎸� yyyy-MM-dd 涓� yyyy-MM-dd HH:mm:ss锛屽け璐ヨ繑鍥� null
+ */
+ private LocalDateTime parseImportDateTime(String text) {
+ if (StrUtil.isBlank(text)) {
+ return null;
+ }
+ String value = text.trim().replace('/', '-');
+ try {
+ if (value.length() <= 10) {
+ return LocalDate.parse(value).atStartOfDay();
+ }
+ return LocalDateTime.parse(value.replace(' ', 'T'));
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
}
+
--
Gitblit v1.9.3