From 15ed897e0bd9ec3ac56f260e326b21ffd4bafae9 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期五, 13 六月 2025 08:04:25 +0800
Subject: [PATCH] 新增自定义编辑列 新增自定义出库路由

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java  |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java   |    9 --
 rsf-admin/src/page/orders/outStock/OutOrderModal.jsx                                           |   18 ++++-
 rsf-admin/src/page/orders/outStock/OutStockPublic.jsx                                          |   72 ++++++++++++++++++------
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java     |   11 +++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java |   29 +++++++++
 rsf-server/src/main/resources/application.yml                                                  |    2 
 rsf-admin/src/i18n/zh.js                                                                       |    2 
 rsf-admin/src/page/orders/outStock/OutOrderList.jsx                                            |    9 ++
 rsf-admin/src/i18n/en.js                                                                       |    2 
 10 files changed, 120 insertions(+), 36 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 1365548..1d4627b 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -79,6 +79,8 @@
                 result: 'Contacts import complete. Imported %{success} success, with %{error} errors',
             },
             loadMore: 'Load More Data',
+            updateSucc: 'Update Success',
+            updateFaild: 'Update Failed',
             complete: 'Complete',
             deprecate: 'Deprecate',
             stockError: 'Empty',
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 119968f..a52e088 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -81,6 +81,8 @@
                 result: '瀵煎叆瀹屾垚銆傚凡瀵煎叆 %{success} 鎴愬姛, 鍜� %{error} 澶辫触',
             },
             loadMore: '鍔犺浇鏇村',
+            updateSucc: '鏇存柊鎴愬姛',
+            updateFaild: '鏇存柊澶辫触',
             complete: '瀹屾垚',
             deprecate: '搴熷純',
             stockError: '娌℃湁搴撳瓨',
diff --git a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx
index a13d58c..955b074 100644
--- a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx
@@ -37,6 +37,7 @@
   Button,
   useRedirect,
   useUnselectAll,
+  useRecordSelection,
 } from 'react-admin';
 import { Box, Typography, Card, Stack, Drawer } from '@mui/material';
 import { styled } from '@mui/material/styles';
@@ -57,6 +58,7 @@
 import AddTaskIcon from '@mui/icons-material/AddTask';
 import PageEditDrawer from "../../components/PageEditDrawer";
 import OutStockPublic from "./OutStockPublic";
+import OutOrderPreview from "./OutOrderPreview";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
   '& .css-1vooibu-MuiSvgIcon-root': {
@@ -114,6 +116,7 @@
   const translate = useTranslate();
   const [createDialog, setCreateDialog] = useState(false);
   const [manualDialog, setManualDialog] = useState(false);
+  const [preview, setPreview] = useState(false);
   const [drawerVal, setDrawerVal] = useState(false);
   const [modalType, setmodalType] = useState(0);
   const [select, setSelect] = useState(0);
@@ -191,13 +194,16 @@
       <OutOrderModal
         open={createDialog}
         setOpen={setCreateDialog}
+        preview={preview} 
+        setPreview={setPreview}
       />
+      <OutOrderPreview open={preview} setOpen={setPreview} />
       <PageEditDrawer
         title={"toolbar.publicWorking"}
         drawerVal={drawerVal}
         setDrawerVal={setDrawerVal}
       >
-        <OutStockPublic record={select} open={drawerVal} setOpen={setDrawerVal}/>
+        <OutStockPublic record={select} open={drawerVal} setOpen={setDrawerVal} />
       </PageEditDrawer>
     </Box >
   )
@@ -257,7 +263,6 @@
   const record = useRecordContext();
   const notify = useNotify();
   const refresh = useRefresh();
-
   const createByOrder = async (event) => {
     event.stopPropagation();
     setCreateDialog(true);
diff --git a/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx
index b8222e7..229b284 100644
--- a/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx
@@ -46,6 +46,8 @@
 import request from '@/utils/request';
 import SaveIcon from '@mui/icons-material/Save';
 import CheckCircleIcon from '@mui/icons-material/CheckCircle';
+import EditableTextField from "../../components/EditableTextField";
+import OutOrderPreview from "./OutOrderPreview";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -90,9 +92,11 @@
 ]
 
 const OutOrderModal = (props) => {
-    const { open, setOpen, record } = props;
+    const { open, setOpen, preview, setPreview, record } = props;
     const translate = useTranslate();
     const [params, setParams] = useState({});
+    const [select, setSelect] = useState([]);
+
     const [drawerVal, setDrawerVal] = useState(false);
     const refresh = useRefresh();
 
@@ -221,7 +225,7 @@
                                 />
                                 <StyledDatagrid
                                     preferenceKey='deliveryItem'
-                                    bulkActionButtons={<AddOutStockButton setOpen={setOpen} />}
+                                    bulkActionButtons={<AddOutStockButton setOpen={setOpen} setPreview={setPreview} setSelect={setSelect}/>}
                                     rowClick={(id, resource, record) => false}
                                     expand={false}
                                     expandSingle={true}
@@ -247,6 +251,9 @@
                     </Grid>
                 </DialogContent>
             </Grid>
+            <Grid>
+                <OutOrderPreview open={preview} setOpen={setPreview} selectedIds={select} />
+            </Grid>
         </Dialog >
     )
 }
@@ -254,7 +261,7 @@
 export default OutOrderModal;
 
 const AddOutStockButton = (props) => {
-    const { setOpen } = props;
+    const { setOpen, setPreview, setSelect } = props;
     const { selectedIds, onUnselectItems } = useListContext();
     const notify = useNotify();
     const refresh = useRefresh();
@@ -265,9 +272,10 @@
         } else {
             notify(res.data.msg);
         }
-        refresh();
+        setPreview(true)
+        setSelect(selectedIds);
         onUnselectItems();
-        setOpen(false);
+        // refresh();
     }
 
     return (
diff --git a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
index e63b5a2..b5748f6 100644
--- a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
@@ -69,14 +69,39 @@
     const notify = useNotify();
     const gridRef = useGridApiRef();
     const [rows, setRows] = useState([]);
+    const [fetchRows, setFetchRows] = useState([]);
     const translate = useTranslate();
+    const [rowSelectedIds, setRowSelectedIds] = useState([]);
+    const [selectedMatnr, setSelectedMatnr] = useState([]);
     const [selectedIds, setSelectedIds] = useState([]);
-    const [formData, setFormData] = useState({
-        orderId: record?.id,
-        waveId: DEFAULT_TYPE
-    });
+    const [formData, setFormData] = useState({ orderId: record?.id, waveId: DEFAULT_TYPE });
     const [dialog, setDialog] = useState(false);
     const [selectedValue, setSelectedValue] = useState({});
+
+    useEffect(() => {
+        if (selectedMatnr.length < 1) {
+            setRows(fetchRows)
+        } else {
+            const mas = fetchRows.filter(item => selectedMatnr.includes(item.matnrCode));
+            setRows(mas)
+        }
+    }, [selectedMatnr])
+
+
+    const handleRowClick = (id, resource, record) => {
+        setRowSelectedIds(prev =>
+            prev.includes(id)
+                ? prev.filter(item => item !== id)  // 鍙栨秷閫夋嫨
+                : [...prev, id]                     // 娣诲姞閫夋嫨
+        );
+
+        //璁剧疆搴撲綅淇℃伅绛涢�夋潯浠�
+        setSelectedMatnr(prev =>
+            prev.includes(record?.matnrCode)
+                ? prev.filter(item => item !== record?.matnrCode)  // 鍙栨秷閫夋嫨
+                : [...prev, record?.matnrCode]                     // 娣诲姞閫夋嫨
+        );
+    };
 
     const handleClickOpen = () => {
         setDialog(true);
@@ -85,13 +110,23 @@
     const handleClose = (value) => {
         setDialog(false);
         setSelectedValue(value);
-        const newRows = rows.map(item => {
-            return selectedIds.includes(item?.id) ? {
-                ...item,
-                siteNo: value?.site
-            } : item
-        })
-        setRows(newRows);
+        if (selectedIds.length == 0) {
+            const newRows = rows.map(item => {
+                return {
+                    ...item,
+                    siteNo: value?.site
+                }
+            })
+            setRows(newRows);
+        } else {
+            const newRows = rows.map(item => {
+                return selectedIds.includes(item?.id) ? {
+                    ...item,
+                    siteNo: value?.site
+                } : item
+            })
+            setRows(newRows);
+        }
     };
 
     useEffect(() => {
@@ -107,6 +142,7 @@
         const { data: { code, data, msg } } = await request.post('/outStock/order/getOutTaskItems', { ...formData });
         if (code === 200) {
             setRows(data)
+            setFetchRows(data)
         } else {
             notify(msg);
         }
@@ -161,9 +197,11 @@
                                     sx={{ height: "2px", position: 'absolute', top: 0, left: 0, right: 0, }}
                                 />
                                 <StyledDatagrid
+                                    storeKey={"outStockPublic"}
                                     preferenceKey='outStockItem'
                                     bulkActionButtons={<></>}
-                                    rowClick={false}
+                                    rowClick={handleRowClick}
+                                    selectedIds={rowSelectedIds}
                                     omit={['id', 'splrName', 'qty', 'poCode', 'workQty']}
                                 >
                                     <NumberField source="id" />
@@ -181,8 +219,8 @@
                         </Card>
                     </Grid>
                     <Grid item xl={6.3} gap={2}>
-                        <Card>
-                            <Box sx={{ height: 500, width: '100%' }}>
+                        <Card sx={{ minHeight: 1050, height: 'calc(100% - 10px)', width: '100%' }}>
+                            <Box>
                                 <PreviewTable
                                     rows={rows}
                                     gridRef={gridRef}
@@ -223,7 +261,6 @@
         }
     }, [selectedIds])
 
-
     const baseColumns = [
         // { field: 'id', headerName: 'ID', width: 40 },
         { field: 'locCode', headerName: '搴撲綅', width: 110 },
@@ -232,8 +269,7 @@
         { field: 'batch', headerName: '鎵规', width: 90 },
         { field: 'unit', headerName: '鍗曚綅', width: 60 },
         { field: 'outQty', headerName: '鍑哄簱鏁伴噺', width: 110, },
-        {
-            field: 'anfme', headerName: '搴撳瓨鏁伴噺', width: 110,
+        { field: 'anfme', headerName: '搴撳瓨鏁伴噺', width: 110,
             renderCell: (params) => (
                 <OutStockAnfme value={params.value} />
             )
@@ -379,6 +415,7 @@
 
     return (
         <DataGrid
+            storeKey={"locItemPreview"}
             rows={rows}
             columns={columns}
             slots={{ toolbar: CustomToolBar }}
@@ -393,7 +430,6 @@
         />
     )
 }
-
 
 
 //鎻愪氦鎸夐挳
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
index 1ee268e..e140809 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -63,6 +63,17 @@
     }
 
     @PreAuthorize("hasAuthority('manager:outStock:list')")
+    @PostMapping("/outStock/dialog/page")
+    public R dialogPage(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<AsnOrder, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrder.class);
+        QueryWrapper<AsnOrder> queryWrapper = pageParam.buildWrapper(true);
+        List<String> list = Arrays.asList(OrderType.ORDER_OUT.type);
+        queryWrapper.in("type", list);
+        return R.ok().add(outStockService.page(pageParam, queryWrapper));
+    }
+
+    @PreAuthorize("hasAuthority('manager:outStock:list')")
     @PostMapping("/outStock/list")
     public R list(@RequestBody Map<String, Object> map) {
         return R.ok().add(outStockService.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getType, OrderType.ORDER_OUT.type)));
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java
index 0e11b1c..1ad99ee 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java
@@ -4,6 +4,7 @@
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.vincent.rsf.framework.common.Cools;
 import com.vincent.rsf.framework.common.R;
@@ -48,7 +49,32 @@
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class);
-        return R.ok().add(outStockItemService.listByAsnId(pageParam, pageParam.buildWrapper(true)));
+        QueryWrapper<AsnOrderItem> queryWrapper = pageParam.buildWrapper(true);
+        if (!Objects.isNull(map.get("poDetlId"))) {
+            queryWrapper.in("po_detl_id", JSONArray.parseArray(JSONArray.toJSONString(map.get("poDetlId")), Long.class));
+        }
+        return R.ok().add(outStockItemService.listByAsnId(pageParam, queryWrapper));
+    }
+
+
+    @PreAuthorize("hasAuthority('manager:outStockItem:list')")
+    @ApiOperation("鍒嗛〉鑾峰彇鍒楄〃")
+    @PostMapping("/outStockItem/edit/page")
+    public R byPoIdspage(@RequestBody Map<String, Object> map) {
+        List<Long> poDetlIds = new ArrayList<>();
+        if (!Objects.isNull(map.get("poDetlId"))) {
+            poDetlIds = JSONArray.parseArray(JSONArray.toJSONString(map.get("poDetlId")), Long.class);
+            map.remove("poDetlId");
+        }
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class);
+        QueryWrapper<AsnOrderItem> queryWrapper = pageParam.buildWrapper(true);
+        if (!poDetlIds.isEmpty()) {
+            queryWrapper.in("po_detl_id", poDetlIds);
+        } else {
+            return R.ok();
+        }
+        return R.ok().add(outStockItemService.listByAsnId(pageParam, queryWrapper));
     }
 
     @PreAuthorize("hasAuthority('manager:outStockItem:list')")
@@ -106,6 +132,7 @@
         return R.ok("Update Success").add(asnOrderItem);
     }
 
+
     @PreAuthorize("hasAuthority('manager:outStockItem:remove')")
     @OperationLog("Delete 鍑哄簱鍗曟槑缁�")
     @PostMapping("/outStockItem/remove/{ids}")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
index 3165298..c1b7c48 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -115,18 +115,11 @@
             }
 
             Double orgQty = locItems.stream().mapToDouble(LocItem::getAnfme).sum();
-            Double workQty = locItems.stream().mapToDouble(LocItem::getWorkQty).sum();
             List<LocItem> locItemList = listMap.get(key);
             Double outQty = locItemList.stream().mapToDouble(LocItem::getOutQty).sum();
 
-//            Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, loc.getBarcode()));
-//            if (!Objects.isNull(serviceOne)) {
-//                throw new CoolException("鎵樼洏浠诲姟鎵ц涓紝涓嶈兘閲嶅鍒涘缓锛�");
-//            }
-
             if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK) || map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK)) {
-                Double useQty = Math.round((outQty + workQty) * 10000) / 10000.0;
-                if (orgQty.compareTo(useQty) > 0) {
+                if (orgQty.compareTo(outQty) > 0) {
                     //鎷f枡鍑哄簱
                     DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
                             .eq(DeviceSite::getSite, siteNo)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
index 7948911..01a31d2 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -446,7 +446,7 @@
             if (Objects.isNull(param)) {
                 continue;
             }
-            Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, param.getBarcode()));
+            Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, param.getLocCode()).eq(Loc::getBarcode, param.getBarcode()));
             if (!Objects.isNull(loc)) {
                 List<LocItem> locItems = new ArrayList<>();
                 LocItem locItem = locItemService.getById(param.getId());
diff --git a/rsf-server/src/main/resources/application.yml b/rsf-server/src/main/resources/application.yml
index ac31a5b..db51329 100644
--- a/rsf-server/src/main/resources/application.yml
+++ b/rsf-server/src/main/resources/application.yml
@@ -25,7 +25,7 @@
   #  global-config:
   #    field-strategy: 0
   configuration:
-#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
     map-underscore-to-camel-case: true
     cache-enabled: true
     call-setters-on-nulls: true

--
Gitblit v1.9.1