From b67bf724fc788cb3b86641c7eb7a35cdbc4c7a93 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期二, 06 五月 2025 20:17:25 +0800
Subject: [PATCH] PO单导入功能优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java        |   12 +++
 rsf-admin/src/page/orders/purchase/PurchaseItemList.jsx                                           |    2 
 rsf-admin/src/page/orders/purchase/PurchaseList.jsx                                               |   10 +-
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CompanysController.java        |   10 +++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java |    8 +-
 rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java               |    5 +
 rsf-admin/src/page/components/ImportModal.jsx                                                     |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java                  |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java |   96 ++++++++++++++++++++++++++++---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java        |    6 +-
 rsf-admin/src/App.jsx                                                                             |    9 ++-
 11 files changed, 133 insertions(+), 31 deletions(-)

diff --git a/rsf-admin/src/App.jsx b/rsf-admin/src/App.jsx
index 60630eb..86babcc 100644
--- a/rsf-admin/src/App.jsx
+++ b/rsf-admin/src/App.jsx
@@ -44,9 +44,12 @@
   [
     { locale: "en", name: "English" },
     { locale: "zh", name: "绠�浣撲腑鏂�" },
-    // { locale: "zh", name: "绠�浣撲腑鏂�" },
-    // { locale: "zh", name: "绠�浣撲腑鏂�" },
-    // { locale: "zh", name: "绠�浣撲腑鏂�" },
+    { locale: "jp", name: "鏃ユ湰瑾�" },
+    { locale: "kr", name: "頃滉淡鞚�" },
+    { locale: "ru", name: "Russian" },
+    { locale: "lk", name: "袪褍褋褋泻懈泄" },
+    { locale: "es", name: "Espa帽ola" },
+    	
   ],
   {
     // msg in console
diff --git a/rsf-admin/src/page/components/ImportModal.jsx b/rsf-admin/src/page/components/ImportModal.jsx
index 71328ff..63c2edf 100644
--- a/rsf-admin/src/page/components/ImportModal.jsx
+++ b/rsf-admin/src/page/components/ImportModal.jsx
@@ -62,7 +62,9 @@
             notify(msg);
             refresh()
         } else {
+            handleClose()
             notify(msg);
+            refresh()
         }
 
     };
diff --git a/rsf-admin/src/page/orders/purchase/PurchaseItemList.jsx b/rsf-admin/src/page/orders/purchase/PurchaseItemList.jsx
index 13222c9..0522994 100644
--- a/rsf-admin/src/page/orders/purchase/PurchaseItemList.jsx
+++ b/rsf-admin/src/page/orders/purchase/PurchaseItemList.jsx
@@ -117,7 +117,7 @@
               setSelect(record)
               setEditDialog(true)
             }}
-            omit={['id', 'createTime', 'purchaseId', 'platItemId', 'createBy', 'memo']}
+            omit={['id', 'createTime', 'purchaseId', 'platItemId','asnQty', 'printQty',  'createBy', 'memo']}
           >
             <NumberField source="id" />
             <NumberField source="purchaseId" label="table.field.purchaseItem.purchaseId" />
diff --git a/rsf-admin/src/page/orders/purchase/PurchaseList.jsx b/rsf-admin/src/page/orders/purchase/PurchaseList.jsx
index df7db49..2a505de 100644
--- a/rsf-admin/src/page/orders/purchase/PurchaseList.jsx
+++ b/rsf-admin/src/page/orders/purchase/PurchaseList.jsx
@@ -106,7 +106,7 @@
           marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
         }}
         title={"menu.purchase"}
-        empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+        empty={false}
         filters={filters}
         sort={{ field: "create_time", order: "desc" }}
         actions={(
@@ -122,11 +122,11 @@
       >
         <StyledDatagrid
           preferenceKey='purchase'
-          bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+          bulkActionButtons={() => <BulkDeleteButton mutationMode="pessimistic"/>}
           rowClick={'edit'}
           expand={false}
           expandSingle={true}
-          omit={['id', 'createTime', 'createBy', 'memo', 'preArr', 'channel','startTime','workQty', 'endTime']}
+          omit={['id', 'createTime', 'createBy','channel', 'platCode', 'memo', 'preArr', 'channel','startTime','workQty', 'endTime']}
         >
           <NumberField source="id" />
           <TextField source="code" label="table.field.purchase.code" />
@@ -136,7 +136,7 @@
           <DateField source="preArr" label="table.field.purchase.preArr" showTime />
           <NumberField source="anfme" label="table.field.purchase.anfme" />
           <NumberField source="qty" label="table.field.purchase.qty" />
-          <NumberField source="workQty" label="table.field.purchase.workQty" />
+          {/* <NumberField source="workQty" label="table.field.purchase.workQty" /> */}
           <TextField source="channel" label="table.field.purchase.channel" />
           <TextField source="platCode" label="table.field.purchase.platCode" />
           <DateField source="startTime" label="table.field.purchase.startTime" showTime />
@@ -150,7 +150,7 @@
           <TextField source="memo" label="common.field.memo" sortable={false} />
           <WrapperField cellClassName="opt" label="common.field.opt">
             <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
-            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode="pessimistic"/>
           </WrapperField>
         </StyledDatagrid>
       </List>
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CompanysController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CompanysController.java
index 6b4d172..c10934b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CompanysController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CompanysController.java
@@ -13,8 +13,11 @@
 import com.vincent.rsf.server.manager.entity.Companys;
 import com.vincent.rsf.server.manager.entity.Warehouse;
 import com.vincent.rsf.server.manager.service.CompanysService;
+import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.controller.BaseController;
+import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import io.swagger.annotations.Api;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -85,6 +88,13 @@
 
         companys.setCreateBy(getLoginUserId());
         companys.setUpdateBy(getLoginUserId());
+        if (StringUtils.isNotBlank(companys.getCode())) {
+            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_COMPANYS_CODE, companys);
+            if (StringUtils.isBlank(ruleCode)) {
+                throw new CoolException("缂栫爜瑙勫垯閿欒锛氳妫�鏌ャ�孲YS_COMPANYS_CODE銆嶆槸鍚﹁缃畬鎴愶紒锛�");
+            }
+            companys.setCode(ruleCode);
+        }
         if (!companysService.save(companys)) {
             return R.error("Save Fail");
         }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java
index 2865546..a47d715 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java
@@ -11,7 +11,9 @@
 import com.vincent.rsf.server.common.domain.PageParam;
 import com.vincent.rsf.server.manager.entity.AsnOrderItem;
 import com.vincent.rsf.server.manager.entity.Purchase;
+import com.vincent.rsf.server.manager.entity.PurchaseItem;
 import com.vincent.rsf.server.manager.service.AsnOrderItemService;
+import com.vincent.rsf.server.manager.service.PurchaseItemService;
 import com.vincent.rsf.server.manager.service.PurchaseService;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.controller.BaseController;
@@ -33,6 +35,9 @@
 
     @Autowired
     private AsnOrderItemService asnOrderItemService;
+
+    @Autowired
+    private PurchaseItemService purchaseItemService;
 
     @PreAuthorize("hasAuthority('manager:purchase:list')")
     @PostMapping("/purchase/page")
@@ -102,9 +107,12 @@
             return R.error("鍗曟嵁鏈夊凡鐢熸垚鐨勬敹璐у崟鏄庣粏锛屼笉鍙墽琛屽垹闄ゆ搷浣滐紒锛�");
         }
         if (!purchaseService.removeByIds(Arrays.asList(ids))) {
-            return R.error("Delete Fail");
+            return R.error("涓诲崟鍒犻櫎澶辫触锛侊紒");
         }
-        return R.ok("Delete Success").add(ids);
+        if (!purchaseItemService.remove(new LambdaQueryWrapper<PurchaseItem>().in(PurchaseItem::getPurchaseId, Arrays.asList(ids)))) {
+            return R.error("鏄庣粏鍒犻櫎澶辫触锛侊紒");
+        }
+        return R.ok("鍒犻櫎鎴愬姛锛侊紒").add(ids);
     }
 
     @PreAuthorize("hasAuthority('manager:purchase:list')")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java
index 67a0bc3..1ee73ed 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java
@@ -90,7 +90,7 @@
      * 鏍囧噯鍖呰
      */
     @ApiModelProperty(value= "鏍囧噯鍖呰")
-    private Double nromQty;
+    private Integer nromQty;
 
     /**
      * ASN鍗曟嵁鏁伴噺
@@ -176,7 +176,7 @@
 
     public PurchaseItem() {}
 
-    public PurchaseItem(Long purchaseId,String erpItemId,String matnrCode,String matnrName,String unit,Double anfme,Double qty,Double nromQty,Double asnQty,Double printQty,String splrName,String splrCode,String splrBatch,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
+    public PurchaseItem(Long purchaseId,String erpItemId,String matnrCode,String matnrName,String unit,Double anfme,Double qty,Integer nromQty,Double asnQty,Double printQty,String splrName,String splrCode,String splrBatch,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
         this.purchaseId = purchaseId;
         this.platItemId = erpItemId;
         this.matnrCode = matnrCode;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java
index a1f9433..c304c4b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java
@@ -35,7 +35,7 @@
 
     @Excel(name = "涓氬姟绫诲瀷")
     @ApiModelProperty(value= "涓氬姟绫诲瀷")
-    @ExcelComment(value = "wkType", example = "ERP")
+    @ExcelComment(value = "wkType", example = "澶栬喘鏀惰揣")
     private String wkType;
 
 
@@ -85,8 +85,8 @@
     /**
      * 宸叉敹鏁伴噺
      */
-    @Excel(name = "宸叉敹鏁伴噺")
-    @ApiModelProperty(value= "宸叉敹鏁伴噺")
+    @Excel(name = "宸插畬鎴愰噺")
+    @ApiModelProperty(value= "宸插畬鎴愰噺")
     @ExcelComment(value = "qty", example = "0")
     private Double qty;
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
index 9255348..ea2eef7 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
@@ -102,7 +102,7 @@
             AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, key));
             if (!Objects.isNull(order)) {
                 sbFaild.append(template.getCode()).append(",宸叉坊鍔狅紒锛�");
-                continue;
+                throw new CoolException(sbFaild.toString());
             }
             order = new AsnOrder();
             order.setCode(template.getCode())
@@ -120,13 +120,13 @@
             for (AsnOrderTemplate orderTemplate : listMap.get(key)) {
                 AsnOrderItem orderItem = new AsnOrderItem();
                 if (StringUtils.isBlank(orderTemplate.getMatnrCode())) {
-                    continue;
+                    throw new CoolException(orderTemplate.getPoCode() + "锛氱墿鏂欑紪鐮佷笉鑳戒负绌猴紒锛�");
                 }
                 Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>()
                         .eq(Matnr::getCode, orderTemplate.getMatnrCode()));
                 if (Objects.isNull(matnr)) {
                     sbFaild.append(orderTemplate.getMatnrCode()).append("鐗╂枡涓嶅瓨鍦�");
-                    continue;
+                    throw new CoolException(sbFaild.toString());
                 }
                 String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, matnr);
                 orderItem.setAsnId(order.getId())
@@ -156,7 +156,7 @@
                         orderItem.setSplrCode(companys.getCode()).setSplrName(companys.getName());
                     } else {
                         sbFaild.append("渚涘簲鍟�:" + orderTemplate.getSplrCode()).append("涓嶅瓨鍦�");
-                        continue;
+                        throw new CoolException(sbFaild.toString());
                     }
                 } else {
                     continue;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
index 59905b3..10f5477 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
@@ -5,32 +5,46 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.server.api.entity.enums.OrderType;
+import com.vincent.rsf.server.api.entity.enums.OrderWorkType;
 import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.manager.entity.Companys;
+import com.vincent.rsf.server.manager.entity.Matnr;
 import com.vincent.rsf.server.manager.entity.Purchase;
 import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
 import com.vincent.rsf.server.manager.entity.excel.PurchaseTemplate;
+import com.vincent.rsf.server.manager.enums.CompanysType;
 import com.vincent.rsf.server.manager.mapper.PurchaseItemMapper;
 import com.vincent.rsf.server.manager.entity.PurchaseItem;
+import com.vincent.rsf.server.manager.service.CompanysService;
+import com.vincent.rsf.server.manager.service.MatnrService;
 import com.vincent.rsf.server.manager.service.PurchaseItemService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vincent.rsf.server.manager.service.PurchaseService;
+import com.vincent.rsf.server.system.constant.SerialRuleCode;
+import com.vincent.rsf.server.system.utils.SerialRuleUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service("purchaseItemService")
 public class PurchaseItemServiceImpl extends ServiceImpl<PurchaseItemMapper, PurchaseItem> implements PurchaseItemService {
 
-    private final PurchaseServiceImpl purchaseService;
+    @Autowired
+    private PurchaseService purchaseService;
 
-    public PurchaseItemServiceImpl(PurchaseServiceImpl purchaseService) {
-        this.purchaseService = purchaseService;
-    }
+    @Autowired
+    private MatnrService matnrService;
+
+    @Autowired
+    private CompanysService companysService;
 
     /**
      * @author Ryan
@@ -39,6 +53,7 @@
      * @version 1.0
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public R excelImport(MultipartFile file, Long loginUserId) throws Exception {
         ExcelImportResult result = ExcelImportUtil.importExcelMore(file.getInputStream(), PurchaseTemplate.class, ExcelUtil.getDefaultImportParams());
         if (result.getList().isEmpty()) {
@@ -53,14 +68,73 @@
             List<PurchaseTemplate> list = listMap.get(key);
             Purchase serviceOne = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, key));
             if (!Objects.isNull(serviceOne)) {
-                continue;
+//                return R.error(serviceOne.getCode() +  "鍗曟嵁宸插瓨鍦紒锛�");
+                throw new CoolException(serviceOne.getCode() +  "鍗曟嵁宸插瓨鍦紒锛�");
             }
             PurchaseTemplate template = list.stream().findFirst().get();
             Purchase purchase = new Purchase();
-            purchase.setCode(template.getPoCode()).set;
+            BeanUtils.copyProperties(template, purchase);
+            purchase.setCode(template.getPoCode());
+            if (StringUtils.isBlank(template.getPoCode())) {
+                String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ORDER_PO_CODE, purchase);
+                purchase.setCode(ruleCode);
+            }
+            purchase.setType(OrderType.getTypeVal(template.getType()))
+                    .setWkType(OrderWorkType.getWorkType(template.getWkType()))
+                    .setSource(template.getSource())
+                    .setCreateBy(loginUserId)
+                    .setUpdateBy(loginUserId);
+            if (!purchaseService.save(purchase)) {
+                throw new CoolException("涓诲崟淇濆瓨澶辫触锛侊紒");
+            }
+            List<PurchaseItem> items = new ArrayList<>();
+            for (PurchaseTemplate purchaseTemplate : list) {
+                PurchaseItem item = new PurchaseItem();
+                if (StringUtils.isBlank(purchaseTemplate.getMatnrCode())) {
+                    throw new CoolException(purchaseTemplate.getPoCode() + "锛氱墿鏂欑紪鐮佷笉鑳戒负绌猴紒锛�");
+                }
+                Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, template.getMatnrCode()));
+                if (Objects.isNull(matnr)) {
+                    throw new CoolException(template.getMatnrCode() + "鐗╂枡涓嶅瓨鍦紒锛�");
+                }
+                item.setMatnrName(matnr.getName())
+                        .setMatnrCode(matnr.getCode())
+                        .setPlatItemId(template.getPlatItemId())
+                        .setAnfme(template.getAnfme())
+                        .setQty(template.getQty())
+                        .setPurchaseId(purchase.getId())
+                        .setNromQty(matnr.getNromNum())
+                        .setSplrBatch(template.getSplrBatch())
+                        .setCreateBy(loginUserId)
+                        .setUpdateBy(loginUserId)
+                        .setUnit(template.getUnit());
 
+                if (StringUtils.isNotBlank(purchaseTemplate.getSplrCode())) {
+                    Companys companys = companysService.getOne(new LambdaQueryWrapper<Companys>()
+                            .eq(Companys::getType, CompanysType.COMPANYS_TYPE_SUPPLIER.val)
+                            .eq(Companys::getCode, template.getSplrCode()));
+                    if (!Objects.isNull(companys)) {
+                        item.setSplrCode(companys.getCode()).setSplrName(companys.getName());
+                    } else {
+                        throw new CoolException("渚涘簲鍟嗭細" + template.getSplrName() + "涓嶅瓨鍦紒锛�");
+                    }
+                } else {
+                    throw new CoolException("渚涘簲鍟嗕笉鑳戒负绌猴紒锛�");
+                }
+                if (!this.save(item)) {
+                    throw new CoolException("鍗曟嵁鏄庣粏淇濆瓨澶辫触锛侊紒");
+                }
+                items.add(item);
+            }
 
+            double anfmes = items.stream().mapToDouble(PurchaseItem::getAnfme).sum();
+            double qty = items.stream().mapToDouble(PurchaseItem::getQty).sum();
+            purchase.setAnfme(anfmes).setQty(qty);
+
+           if (!purchaseService.updateById(purchase)) {
+               throw new CoolException("涓诲崟鏁伴噺淇敼澶辫触锛侊紒");
+           }
         }
-        return null;
+        return R.ok("瀵煎叆鎴愬姛锛侊紒");
     }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
index 04dc68c..07f2ea3 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
@@ -77,4 +77,9 @@
     /**PO鍗曠紪鐮�*/
     public final static String SYS_ORDER_PO_CODE = "sys_order_po_code";
 
+    /**浼佷笟缂栫爜*/
+    public final static String SYS_COMPANYS_CODE = "sys_companys_code";
+
+
+
 }

--
Gitblit v1.9.1