From ee608e161f17082b9fd6e1ed236214a0ac5c2f0e Mon Sep 17 00:00:00 2001
From: skyouc <creaycat@gmail.com>
Date: 星期五, 02 五月 2025 17:55:09 +0800
Subject: [PATCH] Asn订单功优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java        |   10 +++++
 rsf-admin/src/page/components/ImportButton.jsx                                                    |    2 
 rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx                                           |    6 ++-
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java |   58 ++++++++++++++++++++--------
 rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx                                               |    9 +++-
 rsf-admin/src/page/components/ImportModal.jsx                                                     |    8 +--
 rsf-admin/src/i18n/core/chineseMessages.js                                                        |    2 
 rsf-admin/src/i18n/zh.js                                                                          |    7 ++-
 rsf-admin/src/i18n/en.js                                                                          |    5 ++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java                  |   10 ++++-
 10 files changed, 83 insertions(+), 34 deletions(-)

diff --git a/rsf-admin/src/i18n/core/chineseMessages.js b/rsf-admin/src/i18n/core/chineseMessages.js
index d61dfd5..55cf186 100644
--- a/rsf-admin/src/i18n/core/chineseMessages.js
+++ b/rsf-admin/src/i18n/core/chineseMessages.js
@@ -85,7 +85,7 @@
       auth_error:
         "An error occurred while validating the authentication token.",
       bulk_delete_content:
-        "Are you sure you want to delete this %{name}? |||| Are you sure you want to delete these %{smart_count} items?",
+        "纭畾瑕佸垹闄よ繖涓� %{name}? |||| 纭瑕佸垹闄よ繖浜� %{smart_count} 鏄庣粏?",
       bulk_delete_title: "鍒犻櫎 %{name} |||| 鍒犻櫎 %{smart_count} %{name}",
       bulk_update_content:
         "Are you sure you want to update this %{name}? |||| Are you sure you want to update these %{smart_count} items?",
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index d569c3d..a58cbe5 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -576,6 +576,8 @@
                 poDetlCode: "poDetlCode",
                 matnrId: "matnrId",
                 maktx: "maktx",
+                spec: "Spec",
+                model: "Model",
                 anfme: "anfme",
                 stockUnit: "stockUnit",
                 purQty: "purQty",
@@ -1033,7 +1035,8 @@
     },
     request: {
         error: {
-            stock: "Insufficient inventory to deliver 锛侊紒"
+            stock: "Insufficient inventory to deliver 锛侊紒",
+            select_error_order: "Please Select Asn Orders",
         }
 
     }
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index cd137a4..6cb7348 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -565,6 +565,8 @@
                 poDetlCode: "PO鍗�",
                 matnrId: "鐗╂枡鏍囪瘑",
                 maktx: "鐗╂枡鍚嶇О",
+                spec: "瑙勬牸",
+                model: "鍨嬪彿",
                 matnrCode: "鐗╂枡缂栫爜",
                 anfme: "璁″垝鏀惰揣鏁�",
                 stockUnit: "搴撳瓨鍗曚綅",
@@ -611,7 +613,7 @@
                 poId: "PO鏍囪瘑",
                 type: "鍗曟嵁绫诲瀷",
                 wkType: "涓氬姟绫诲瀷",
-                anfme: "鏁伴噺",
+                anfme: "璁″垝鏁伴噺",
                 qty: "宸插畬鎴愭暟閲�",
                 logisNo: "鐗╂祦鍗曞彿",
                 arrTime: "棰勮鍒拌揪鏃堕棿",
@@ -1048,7 +1050,8 @@
     },
     request: {
         error: {
-            stock: "搴撳瓨涓嶈冻锛屾棤娉曟彁浜わ紒锛�"
+            stock: "搴撳瓨涓嶈冻锛屾棤娉曟彁浜わ紒锛�", 
+            select_error_order: "璇烽�夋嫨閫氱煡鍗�",
         }
 
     }
diff --git a/rsf-admin/src/page/components/ImportButton.jsx b/rsf-admin/src/page/components/ImportButton.jsx
index 147ec9e..3b6e7a4 100644
--- a/rsf-admin/src/page/components/ImportButton.jsx
+++ b/rsf-admin/src/page/components/ImportButton.jsx
@@ -4,7 +4,7 @@
 import ImportModal from './ImportModal';
 
 const ImportButton = (props) => {
-    const [modalOpen, setModalOpen] = useState(false);
+    const [modalOpen, setModalOpen, refresh, notify] = useState(false);
 
     const handleOpenModal = () => {
         setModalOpen(true);
diff --git a/rsf-admin/src/page/components/ImportModal.jsx b/rsf-admin/src/page/components/ImportModal.jsx
index 703a018..71328ff 100644
--- a/rsf-admin/src/page/components/ImportModal.jsx
+++ b/rsf-admin/src/page/components/ImportModal.jsx
@@ -22,7 +22,7 @@
 import MatnrList from '../basicInfo/matnr/MatnrList';
 import request from '@/utils/request'
 
-const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10, value, parmas = {} }) => {
+const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10, value, parmas = {}}) => {
     const refresh = useRefresh();
     const translate = useTranslate();
 
@@ -57,17 +57,15 @@
         }
         form.append('file', file);
         const { data: { code, data, msg } } = await request.post(`/${value}/import`, form)
-
         if (code === 200) {
             handleClose()
+            notify(msg);
+            refresh()
         } else {
             notify(msg);
-
         }
 
     };
-
-
 
     const handleClose = () => {
         reset();
diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx
index a34f785..177912b 100644
--- a/rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx
+++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx
@@ -115,7 +115,7 @@
             marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
           }}
           title={"menu.asnOrderItem"}
-          empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+          empty={false}
           filter={{ asnId: asnId, deleted: 0 }}
           filters={filters}
           sort={{ field: "create_time", order: "desc" }}
@@ -136,7 +136,7 @@
               setSelect(record)
               setEditDialog(true)
             }}
-             omit={['id', 'createTime', 'purQty','purUnit', 'createBy', 'memo', 'poDetlId', 'matnrId', 'asnId']}
+             omit={['id', 'createTime', 'purQty','purUnit','poDetlCode', 'createBy', 'memo', 'packName','poDetlId', 'matnrId', 'asnId']}
           >
             <NumberField source="id" />
             <NumberField source="asnId" label="table.field.asnOrderItem.asnId" />
@@ -146,6 +146,8 @@
             <TextField source="matnrId" label="table.field.asnOrderItem.matnrId" />
             <TextField source="matnrCode" label="table.field.asnOrderItem.matnrCode" />
             <TextField source="maktx" label="table.field.asnOrderItem.maktx" />
+            <TextField source="spec" label="table.field.asnOrderItem.spec" />
+            <TextField source="model" label="table.field.asnOrderItem.spec" />
             <NumberField source="anfme" label="table.field.asnOrderItem.anfme" />
             <TextField source="stockUnit" label="table.field.asnOrderItem.stockUnit" />
             <NumberField source="purQty" label="table.field.asnOrderItem.purQty" />
diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
index 4644ed6..345c3a1 100644
--- a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
+++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
@@ -114,6 +114,8 @@
   const [modalType, setmodalType] = useState(0);
   const [select, setSelect] = useState(0);
   const billReload = useRef();
+  const notify = useNotify();
+  const refresh = useRefresh();
   const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type')) || [];
   return (
     <Box display="flex">
@@ -128,7 +130,7 @@
           marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
         }}
         title={"menu.asnOrder"}
-        empty={<EmptyData onClick={() => { setCreateDialog(true); setmodalType(0) }} />}
+        empty={false}
         filters={filters}
         filter={{deleted: 0}}
         sort={{ field: "create_time", order: "desc" }}
@@ -137,7 +139,7 @@
             <FilterButton />
             <MyCreateButton onClick={() => { setCreateDialog(true); setmodalType(0) }} />
             <SelectColumnsButton preferenceKey='asnOrder' />
-            <ImportButton value={'asnOrderItem'}  />
+            <ImportButton value={'asnOrderItem'} />
             <MyExportButton />
           </TopToolbar>
         )}
@@ -254,10 +256,11 @@
   const { selectedIds, onUnselectItems, data } = useListContext();
   const notify = useNotify();
   const refresh = useRefresh();
+  const translate = useTranslate();
   const inspection = (btn) => {
     btn.stopPropagation();
     if (selectedIds.length === 0) {
-      notify('璇烽�夋嫨閫氱煡鍗�');
+      notify(translate("request.error.select_error_order"));
       return;
     } else {
       const rows = data.filter((item) => selectedIds.includes(item.id))
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
index 6724931..9a2e1f0 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
@@ -31,6 +31,7 @@
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -111,10 +112,19 @@
     @PreAuthorize("hasAuthority('manager:asnOrder:remove')")
     @OperationLog("Delete ASN鍗曟嵁")
     @PostMapping("/asnOrder/remove/{ids}")
+    @Transactional(rollbackFor = Exception.class)
     public R remove(@PathVariable Long[] ids) {
         if (!asnOrderService.removeByIds(Arrays.asList(ids))) {
             return R.error("Delete Fail");
         }
+        for (Long id : ids) {
+            List<AsnOrderItem> list = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, id));
+            if (!list.isEmpty()) {
+                if (!asnOrderItemService.remove(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getAsnId, ids))) {
+                    throw new CoolException("Details Delete Fail");
+                }
+            }
+        }
         return R.ok("Delete Success").add(ids);
     }
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
index 4af2a41..70dfef1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
@@ -102,6 +102,12 @@
     @ApiModelProperty(value= "鐗╂枡鍚嶇О")
     private String maktx;
 
+    @ApiModelProperty("瑙勬牸")
+    private String spec;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String model;
+
     /**
      * 閫佽揣鏁伴噺
      */
@@ -183,13 +189,13 @@
     private Integer ntyStatus;
 
     /**
-     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨
      */
     @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
     private Integer status;
 
     /**
-     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�
      */
     @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
     private Integer deleted;
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 40753d9..a74e45b 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
@@ -17,6 +17,7 @@
 import com.vincent.rsf.server.common.utils.ExcelUtil;
 import com.vincent.rsf.server.common.utils.FieldsUtils;
 import com.vincent.rsf.server.manager.entity.AsnOrder;
+import com.vincent.rsf.server.manager.entity.Companys;
 import com.vincent.rsf.server.manager.entity.Matnr;
 import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
 import com.vincent.rsf.server.manager.mapper.AsnOrderItemMapper;
@@ -24,6 +25,7 @@
 import com.vincent.rsf.server.manager.service.AsnOrderItemService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vincent.rsf.server.manager.service.AsnOrderService;
+import com.vincent.rsf.server.manager.service.CompanysService;
 import com.vincent.rsf.server.manager.service.MatnrService;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.service.FieldsItemService;
@@ -54,6 +56,9 @@
 
     @Autowired
     private AsnOrderItemService asnOrderItemService;
+
+    @Autowired
+    private CompanysService companysService;
 
     @Override
     public R generateBarcode(List<Long> orders) {
@@ -90,13 +95,15 @@
         }
         List<AsnOrderTemplate> resultList = result.getList();
         Map<String, List<AsnOrderTemplate>> listMap = resultList.stream().collect(Collectors.groupingBy(AsnOrderTemplate::getCode));
+        StringBuffer sbFaild = new StringBuffer();
         for (String key : listMap.keySet()) {
             AsnOrderTemplate template = listMap.get(key).stream().findFirst().get();
-            AsnOrder asnOrder = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, template.getCode()));
-            if (!Objects.isNull(asnOrder)) {
+            AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, key));
+            if (!Objects.isNull(order)) {
+                sbFaild.append(template.getCode()).append(",宸叉坊鍔狅紒锛�");
                 continue;
             }
-            AsnOrder order = new AsnOrder();
+            order = new AsnOrder();
             order.setCode(template.getCode())
                     .setPoCode(template.getPoCode())
                     .setMemo(template.getMemo())
@@ -111,28 +118,42 @@
             List<AsnOrderItem> items = new ArrayList<>();
             for (AsnOrderTemplate orderTemplate : listMap.get(key)) {
                 AsnOrderItem orderItem = new AsnOrderItem();
-                Matnr matnr = null;
-                if (!Objects.isNull(orderTemplate.getMatnrCode()) || StringUtils.isNotBlank(orderTemplate.getMatnrCode())) {
-                    matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>()
-                            .eq(Matnr::getCode, orderTemplate.getMatnrCode()));
+                if (StringUtils.isBlank(orderTemplate.getMatnrCode())) {
+                    continue;
+                }
+                Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>()
+                        .eq(Matnr::getCode, orderTemplate.getMatnrCode()));
+                if (Objects.isNull(matnr)) {
+                    sbFaild.append(orderTemplate.getMatnrCode()).append("鐗╂枡涓嶅瓨鍦�");
+                    continue;
                 }
                 orderItem.setAsnId(order.getId())
                         .setAsnCode(order.getCode())
                         .setSplrBatch(orderTemplate.getSplrBatch())
                         .setAnfme(Double.parseDouble(orderTemplate.getAnfme()))
                         .setQty(Double.parseDouble(orderTemplate.getQty()))
-                        .setSplrName(orderTemplate.getSplrName())
                         .setBarcode(orderTemplate.getBarcode())
                         .setTrackCode(orderTemplate.getTrackCode())
-                        .setSplrCode(orderTemplate.getSplrCode())
                         .setPoCode(orderTemplate.getPoCode())
-                        .setMaktx(orderTemplate.getMaktx())
-                        .setMatnrCode(orderTemplate.getMatnrCode())
                         .setPurUnit(orderTemplate.getPurUnit())
-                        .setPurQty(Double.parseDouble(orderTemplate.getPurQty()));
-                if (!Objects.isNull(matnr)) {
-                    orderItem.setMaktx(matnr.getName()).setMatnrCode(matnr.getCode()).setMatnrId(matnr.getId());
+                        .setCreateBy(loginUserId)
+                        .setUpdateBy(loginUserId)
+                        .setSpec(matnr.getSpec())
+                        .setModel(matnr.getModel())
+                        .setPurQty(Double.parseDouble(orderTemplate.getPurQty()))
+                        .setMaktx(matnr.getName())
+                        .setMatnrCode(matnr.getCode())
+                        .setMatnrId(matnr.getId())
+                        .setStockUnit(matnr.getUnit());
+                if (!Objects.nonNull(orderTemplate.getSplrCode())) {
+                    Companys companys = companysService.getOne(new LambdaQueryWrapper<Companys>().eq(Companys::getCode, orderTemplate.getSplrCode()));
+                    if (!Objects.isNull(companys)) {
+                        orderItem.setSplrCode(companys.getCode()).setSplrName(companys.getName());
+                    } else {
+                        orderItem.setSplrCode(orderTemplate.getSplrCode()).setSplrName(companys.getName() + "(渚涘簲鍟嗕笉瀛樺湪锛侊紒)");
+                    }
                 }
+
                 items.add(orderItem);
                 if (!asnOrderItemService.saveBatch(items)) {
                     throw new CoolException("鍗曟嵁鏄庣粏淇濆瓨澶辫触锛侊紒");
@@ -140,14 +161,17 @@
             }
             if (!items.isEmpty()) {
                 double qty = items.stream().mapToDouble(AsnOrderItem::getQty).sum();
-                double purQty = items.stream().mapToDouble(AsnOrderItem::getPurQty).sum();
-                if (!asnOrderMapper.update(new LambdaUpdateWrapper<AsnOrder>().set(AsnOrder::getQty, qty).set(AsnOrder::getAnfme, purQty).eq(AsnOrder::getId, order.getId()))) {
+                double anfme = items.stream().mapToDouble(AsnOrderItem::getAnfme).sum();
+                if (!asnOrderMapper.update(new LambdaUpdateWrapper<AsnOrder>()
+                        .set(AsnOrder::getQty, qty)
+                        .set(AsnOrder::getAnfme, anfme)
+                        .eq(AsnOrder::getId, order.getId()))) {
                     throw new CoolException("鍗曟嵁鏁伴噺淇敼澶辫触锛侊紒");
                 }
             }
         }
 
-        return R.ok("鎿嶄綔鎴愬姛锛侊紒");
+        return R.ok("鎿嶄綔鎴愬姛," + sbFaild.toString());
     }
 
     /**

--
Gitblit v1.9.1