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