From 9c0236bacbd10fb629a4142719c4199bca1038bc Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期二, 15 四月 2025 17:28:58 +0800
Subject: [PATCH] 修改 1. 新增库位明细流界面 2. 修改库存信息表

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java         |    8 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Order.java                    |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java                  |  304 ++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java          |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java      |   54 +
 rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java                      |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java                 |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java    |  168 +++-
 rsf-admin/src/page/locItem/LocItemList.jsx                                                   |   64 +
 rsf-admin/src/page/orders/order/OrderList.jsx                                                |   10 
 rsf-admin/src/page/orders/order/OrderItemEdit.jsx                                            |    8 
 rsf-admin/src/page/locItem/LocItemEdit.jsx                                                   |  160 +--
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/OrderItem.java                |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java    |  110 +++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java                |  318 +++-----
 rsf-admin/src/i18n/zh.js                                                                     |   32 
 rsf-admin/src/i18n/en.js                                                                     |   35 +
 rsf-admin/src/page/ResourceContent.js                                                        |    4 
 rsf-admin/src/page/orders/order/OrderEdit.jsx                                                |  124 +++
 rsf-admin/src/page/locItem/LocItemPanel.jsx                                                  |  147 ++++
 rsf-admin/src/page/orders/order/OrderPanel.jsx                                               |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OrderController.java      |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java |   12 
 rsf-admin/src/page/orders/order/OrderItemCreate.jsx                                          |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java          |    5 
 rsf-server/src/main/java/locItem.sql                                                         |   37 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Stock.java                    |   87 -
 rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml                               |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java            |   12 
 rsf-admin/src/page/orders/order/OrderCreate.jsx                                              |    6 
 /dev/null                                                                                    |  126 ---
 rsf-admin/src/page/locItem/index.jsx                                                         |   18 
 rsf-admin/src/page/locItem/LocItemCreate.jsx                                                 |  160 +--
 rsf-admin/src/page/orders/order/OrderItemList.jsx                                            |   10 
 rsf-admin/src/page/orders/order/index.jsx                                                    |    0 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java          |    8 
 36 files changed, 1,387 insertions(+), 669 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index a509658..1be1035 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -160,6 +160,9 @@
         taskItem: 'TaskItem',
         taskItemLog: 'TaskItemLog',
         taskLog: 'TaskLog',
+        orderItem: 'OrderItem',
+        order: 'Order',
+
     },
     table: {
         field: {
@@ -742,6 +745,36 @@
                 spec: "spec",
                 model: "model",
             },
+            order: {
+                code: "code",
+                sourceCode: "sourceCode",
+                sourceId: "sourceId",
+                type: "type",
+                wkType: "wkType",
+                anfme: "anfme",
+            },
+            orderItem: {
+                orderId: "orderId",
+                orderCode: "orderCode",
+                sourceItemId: "sourceItemId",
+                matnrId: "matnrId",
+                matnrCode: "matnrCode",
+                maktx: "maktx",
+                anfme: "anfme",
+                stockUnit: "stockUnit",
+                workQty: "workQty",
+                purQty: "purQty",
+                purUnit: "purUnit",
+                qty: "qty",
+                splrCode: "splrCode",
+                batch: "batch",
+                splrBatch: "splrBatch",
+                splrName: "splrName",
+                trackCode: "trackCode",
+                barcode: "barcode",
+                prodTime: "prodTime",
+                packName: "packName",
+            },
         }
     },
     page: {
@@ -849,6 +882,8 @@
         asnCreate: "asnCreate",
         createTask: "createTask",
         recover: "recover",
+        order: 'Orders',
+
     },
 };
 
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index d567fd3..4b09dba 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -162,6 +162,8 @@
         taskItem: '浠诲姟妗f槑缁�',
         taskLog: '浠诲姟鍘嗗彶妗�',
         taskItemLog: '浠诲姟鏄庣粏鍘嗗彶妗�',
+        order: '缁煎悎鍗曟嵁绠$悊',
+
     },
     table: {
         field: {
@@ -752,6 +754,36 @@
                 spec: "瑙勬牸",
                 model: "鍨嬪彿",
             },
+            order: {
+                code: "缂栫爜",
+                sourceCode: "婧愬崟鎹�",
+                sourceId: "婧愬崟鎹甀D",
+                type: "鍗曟嵁绫诲瀷",
+                wkType: "涓氬姟绫诲瀷",
+                anfme: "鏁伴噺",
+            },
+            orderItem: {
+                orderId: "涓诲崟ID",
+                orderCode: "鍗曟嵁缂栫爜",
+                sourceItemId: "婧愭槑缁咺D",
+                matnrId: "鐗╂枡ID",
+                matnrCode: "鐗╂枡缂栫爜",
+                maktx: "鐗╂枡鍚嶇О",
+                anfme: "鏁伴噺",
+                stockUnit: "stockUnit",
+                workQty: "鎵ц鏁�",
+                purQty: "閲囪喘鏁�",
+                purUnit: "閲囪喘鍗曚綅",
+                qty: "鎬绘暟",
+                splrCode: "渚涘簲鍟嗙紪鐮�",
+                batch: "鎵规",
+                splrBatch: "渚涘簲鍟嗘壒娆�",
+                splrName: "渚涘簲鍟嗗悕绉�",
+                trackCode: "璺熻釜鐮�",
+                barcode: "鏉″舰鐮�",
+                prodTime: "鐢熶骇鏃ユ湡",
+                packName: "鍖呰鍚嶇О",
+            },
         }
     },
     page: {
diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js
index 928a557..acd7bfb 100644
--- a/rsf-admin/src/page/ResourceContent.js
+++ b/rsf-admin/src/page/ResourceContent.js
@@ -40,6 +40,7 @@
 import asnOrderLog from './histories/asnOrderLog';
 import task from './task';
 import taskLog from './histories/taskLog';
+import order from './orders/order';
 
 const ResourceContent = (node) => {
     switch (node.component) {
@@ -115,7 +116,8 @@
             return task;
         case 'taskLog':
             return taskLog;
-
+        case 'order':
+            return order;
         default:
             return {
                 list: ListGuesser,
diff --git a/rsf-admin/src/page/order/OrderItemCreate.jsx b/rsf-admin/src/page/locItem/LocItemCreate.jsx
similarity index 68%
copy from rsf-admin/src/page/order/OrderItemCreate.jsx
copy to rsf-admin/src/page/locItem/LocItemCreate.jsx
index 71904b9..d1a51fa 100644
--- a/rsf-admin/src/page/order/OrderItemCreate.jsx
+++ b/rsf-admin/src/page/locItem/LocItemCreate.jsx
@@ -31,7 +31,7 @@
 import StatusSelectInput from "../components/StatusSelectInput";
 import MemoInput from "../components/MemoInput";
 
-const OrderItemCreate = (props) => {
+const LocItemCreate = (props) => {
     const { open, setOpen } = props;
 
     const translate = useTranslate();
@@ -86,140 +86,108 @@
                             <Grid container rowSpacing={2} columnSpacing={2}>
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <NumberInput
-                                        label="table.field.orderItem.orderId"
-                                        source="orderId"
+                                        label="table.field.locItem.locId"
+                                        source="locId"
                                         autoFocus
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.orderItem.orderCode"
-                                        source="orderCode"
-                                        parse={v => v}
+                                    <NumberInput
+                                        label="table.field.locItem.orderId"
+                                        source="orderId"
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
-                                        label="table.field.orderItem.sourceItemId"
-                                        source="sourceItemId"
+                                        label="table.field.locItem.type"
+                                        source="type"
                                         parse={v => v}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.orderItem.matnrId"
+                                    <NumberInput
+                                        label="table.field.locItem.orderItemId"
+                                        source="orderItemId"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.locItem.wkType"
+                                        source="wkType"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.locItem.matnrId"
                                         source="matnrId"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.locItem.maktx"
+                                        source="maktx"
                                         parse={v => v}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
-                                        label="table.field.orderItem.matnrCode"
+                                        label="table.field.locItem.matnrCode"
                                         source="matnrCode"
                                         parse={v => v}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
-                                        label="table.field.orderItem.maktx"
-                                        source="maktx"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.orderItem.anfme"
-                                        source="anfme"
-                                        validate={required()}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.orderItem.stockUnit"
-                                        source="stockUnit"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.orderItem.workQty"
-                                        source="workQty"
-                                        validate={required()}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.orderItem.purQty"
-                                        source="purQty"
-                                        validate={required()}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.orderItem.purUnit"
-                                        source="purUnit"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.orderItem.qty"
-                                        source="qty"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.orderItem.splrCode"
-                                        source="splrCode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.orderItem.batch"
-                                        source="batch"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.orderItem.splrBatch"
-                                        source="splrBatch"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.orderItem.splrName"
-                                        source="splrName"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.orderItem.trackCode"
+                                        label="table.field.locItem.trackCode"
                                         source="trackCode"
                                         parse={v => v}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
-                                        label="table.field.orderItem.barcode"
-                                        source="barcode"
+                                        label="table.field.locItem.unit"
+                                        source="unit"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.locItem.anfme"
+                                        source="anfme"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.locItem.batch"
+                                        source="batch"
                                         parse={v => v}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
-                                        label="table.field.orderItem.prodTime"
-                                        source="prodTime"
+                                        label="table.field.locItem.splrBatch"
+                                        source="splrBatch"
                                         parse={v => v}
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
-                                        label="table.field.orderItem.packName"
-                                        source="packName"
+                                        label="table.field.locItem.spec"
+                                        source="spec"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.locItem.model"
+                                        source="model"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.locItem.fieldsIndex"
+                                        source="fieldsIndex"
                                         parse={v => v}
                                     />
                                 </Grid>
@@ -246,4 +214,4 @@
     )
 }
 
-export default OrderItemCreate;
+export default LocItemCreate;
diff --git a/rsf-admin/src/page/order/OrderItemEdit.jsx b/rsf-admin/src/page/locItem/LocItemEdit.jsx
similarity index 64%
copy from rsf-admin/src/page/order/OrderItemEdit.jsx
copy to rsf-admin/src/page/locItem/LocItemEdit.jsx
index 2133716..c9eb84a 100644
--- a/rsf-admin/src/page/order/OrderItemEdit.jsx
+++ b/rsf-admin/src/page/locItem/LocItemEdit.jsx
@@ -40,7 +40,7 @@
     )
 }
 
-const OrderItemEdit = () => {
+const LocItemEdit = () => {
     const translate = useTranslate();
 
     return (
@@ -65,140 +65,108 @@
                         </Typography>
                         <Stack direction='row' gap={2}>
                             <NumberInput
-                                label="table.field.orderItem.orderId"
-                                source="orderId"
+                                label="table.field.locItem.locId"
+                                source="locId"
                                 autoFocus
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.orderItem.orderCode"
-                                source="orderCode"
-                                parse={v => v}
+                            <NumberInput
+                                label="table.field.locItem.orderId"
+                                source="orderId"
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
                             <TextInput
-                                label="table.field.orderItem.sourceItemId"
-                                source="sourceItemId"
+                                label="table.field.locItem.type"
+                                source="type"
                                 parse={v => v}
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.orderItem.matnrId"
+                            <NumberInput
+                                label="table.field.locItem.orderItemId"
+                                source="orderItemId"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.locItem.wkType"
+                                source="wkType"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.locItem.matnrId"
                                 source="matnrId"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.locItem.maktx"
+                                source="maktx"
                                 parse={v => v}
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
                             <TextInput
-                                label="table.field.orderItem.matnrCode"
+                                label="table.field.locItem.matnrCode"
                                 source="matnrCode"
                                 parse={v => v}
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
                             <TextInput
-                                label="table.field.orderItem.maktx"
-                                source="maktx"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.orderItem.anfme"
-                                source="anfme"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.orderItem.stockUnit"
-                                source="stockUnit"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.orderItem.workQty"
-                                source="workQty"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.orderItem.purQty"
-                                source="purQty"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.orderItem.purUnit"
-                                source="purUnit"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.orderItem.qty"
-                                source="qty"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.orderItem.splrCode"
-                                source="splrCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.orderItem.batch"
-                                source="batch"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.orderItem.splrBatch"
-                                source="splrBatch"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.orderItem.splrName"
-                                source="splrName"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.orderItem.trackCode"
+                                label="table.field.locItem.trackCode"
                                 source="trackCode"
                                 parse={v => v}
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
                             <TextInput
-                                label="table.field.orderItem.barcode"
-                                source="barcode"
+                                label="table.field.locItem.unit"
+                                source="unit"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.locItem.anfme"
+                                source="anfme"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.locItem.batch"
+                                source="batch"
                                 parse={v => v}
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
                             <TextInput
-                                label="table.field.orderItem.prodTime"
-                                source="prodTime"
+                                label="table.field.locItem.splrBatch"
+                                source="splrBatch"
                                 parse={v => v}
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
                             <TextInput
-                                label="table.field.orderItem.packName"
-                                source="packName"
+                                label="table.field.locItem.spec"
+                                source="spec"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.locItem.model"
+                                source="model"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.locItem.fieldsIndex"
+                                source="fieldsIndex"
                                 parse={v => v}
                             />
                         </Stack>
@@ -218,4 +186,4 @@
     )
 }
 
-export default OrderItemEdit;
+export default LocItemEdit;
diff --git a/rsf-admin/src/page/order/OrderList.jsx b/rsf-admin/src/page/locItem/LocItemList.jsx
similarity index 64%
copy from rsf-admin/src/page/order/OrderList.jsx
copy to rsf-admin/src/page/locItem/LocItemList.jsx
index 2a5e126..551d35f 100644
--- a/rsf-admin/src/page/order/OrderList.jsx
+++ b/rsf-admin/src/page/locItem/LocItemList.jsx
@@ -34,8 +34,8 @@
 } from 'react-admin';
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
-import OrderCreate from "./OrderCreate";
-import OrderPanel from "./OrderPanel";
+import LocItemCreate from "./LocItemCreate";
+import LocItemPanel from "./LocItemPanel";
 import EmptyData from "../components/EmptyData";
 import MyCreateButton from "../components/MyCreateButton";
 import MyExportButton from '../components/MyExportButton';
@@ -63,12 +63,22 @@
     <DateInput label='common.time.after' source="timeStart" alwaysOn />,
     <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
 
-    <TextInput source="code" label="table.field.order.code" />,
-    <TextInput source="sourceCode" label="table.field.order.sourceCode" />,
-    <NumberInput source="sourceId" label="table.field.order.sourceId" />,
-    <TextInput source="type" label="table.field.order.type" />,
-    <TextInput source="wkType" label="table.field.order.wkType" />,
-    <NumberInput source="anfme" label="table.field.order.anfme" />,
+    <NumberInput source="locId" label="table.field.locItem.locId" />,
+    <NumberInput source="orderId" label="table.field.locItem.orderId" />,
+    <TextInput source="type" label="table.field.locItem.type" />,
+    <NumberInput source="orderItemId" label="table.field.locItem.orderItemId" />,
+    <NumberInput source="wkType" label="table.field.locItem.wkType" />,
+    <NumberInput source="matnrId" label="table.field.locItem.matnrId" />,
+    <TextInput source="maktx" label="table.field.locItem.maktx" />,
+    <TextInput source="matnrCode" label="table.field.locItem.matnrCode" />,
+    <TextInput source="trackCode" label="table.field.locItem.trackCode" />,
+    <TextInput source="unit" label="table.field.locItem.unit" />,
+    <NumberInput source="anfme" label="table.field.locItem.anfme" />,
+    <TextInput source="batch" label="table.field.locItem.batch" />,
+    <TextInput source="splrBatch" label="table.field.locItem.splrBatch" />,
+    <TextInput source="spec" label="table.field.locItem.spec" />,
+    <TextInput source="model" label="table.field.locItem.model" />,
+    <TextInput source="fieldsIndex" label="table.field.locItem.fieldsIndex" />,
 
     <TextInput label="common.field.memo" source="memo" />,
     <SelectInput
@@ -82,7 +92,7 @@
     />,
 ]
 
-const OrderList = () => {
+const LocItemList = () => {
     const translate = useTranslate();
 
     const [createDialog, setCreateDialog] = useState(false);
@@ -99,7 +109,7 @@
                         }),
                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
-                title={"menu.order"}
+                title={"menu.locItem"}
                 empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                 filters={filters}
                 sort={{ field: "create_time", order: "desc" }}
@@ -107,27 +117,37 @@
                     <TopToolbar>
                         <FilterButton />
                         <MyCreateButton onClick={() => { setCreateDialog(true) }} />
-                        <SelectColumnsButton preferenceKey='order' />
+                        <SelectColumnsButton preferenceKey='locItem' />
                         <MyExportButton />
                     </TopToolbar>
                 )}
                 perPage={DEFAULT_PAGE_SIZE}
             >
                 <StyledDatagrid
-                    preferenceKey='order'
+                    preferenceKey='locItem'
                     bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                     rowClick={(id, resource, record) => false}
-                    expand={() => <OrderPanel />}
+                    expand={() => <LocItemPanel />}
                     expandSingle={true}
                     omit={['id', 'createTime', 'createBy', 'memo']}
                 >
                     <NumberField source="id" />
-                    <TextField source="code" label="table.field.order.code" />
-                    <TextField source="sourceCode" label="table.field.order.sourceCode" />
-                    <NumberField source="sourceId" label="table.field.order.sourceId" />
-                    <TextField source="type" label="table.field.order.type" />
-                    <TextField source="wkType" label="table.field.order.wkType" />
-                    <NumberField source="anfme" label="table.field.order.anfme" />
+                    <NumberField source="locId" label="table.field.locItem.locId" />
+                    <NumberField source="orderId" label="table.field.locItem.orderId" />
+                    <TextField source="type" label="table.field.locItem.type" />
+                    <NumberField source="orderItemId" label="table.field.locItem.orderItemId" />
+                    <NumberField source="wkType" label="table.field.locItem.wkType" />
+                    <NumberField source="matnrId" label="table.field.locItem.matnrId" />
+                    <TextField source="maktx" label="table.field.locItem.maktx" />
+                    <TextField source="matnrCode" label="table.field.locItem.matnrCode" />
+                    <TextField source="trackCode" label="table.field.locItem.trackCode" />
+                    <TextField source="unit" label="table.field.locItem.unit" />
+                    <NumberField source="anfme" label="table.field.locItem.anfme" />
+                    <TextField source="batch" label="table.field.locItem.batch" />
+                    <TextField source="splrBatch" label="table.field.locItem.splrBatch" />
+                    <TextField source="spec" label="table.field.locItem.spec" />
+                    <TextField source="model" label="table.field.locItem.model" />
+                    <TextField source="fieldsIndex" label="table.field.locItem.fieldsIndex" />
 
                     <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                         <TextField source="nickname" />
@@ -145,12 +165,12 @@
                     </WrapperField>
                 </StyledDatagrid>
             </List>
-            <OrderCreate
+            <LocItemCreate
                 open={createDialog}
                 setOpen={setCreateDialog}
             />
             <PageDrawer
-                title='Order Detail'
+                title='LocItem Detail'
                 drawerVal={drawerVal}
                 setDrawerVal={setDrawerVal}
             >
@@ -159,4 +179,4 @@
     )
 }
 
-export default OrderList;
+export default LocItemList;
diff --git a/rsf-admin/src/page/locItem/LocItemPanel.jsx b/rsf-admin/src/page/locItem/LocItemPanel.jsx
new file mode 100644
index 0000000..71d21d8
--- /dev/null
+++ b/rsf-admin/src/page/locItem/LocItemPanel.jsx
@@ -0,0 +1,147 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
+import {
+    useTranslate,
+    useRecordContext,
+} from 'react-admin';
+import PanelTypography from "../components/PanelTypography";
+import * as Common from '@/utils/common'
+
+const LocItemPanel = () => {
+    const record = useRecordContext();
+    if (!record) return null;
+    const translate = useTranslate();
+    return (
+        <>
+            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
+                <CardContent>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
+                            <Typography variant="h6" gutterBottom align="left" sx={{
+                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
+                                whiteSpace: 'nowrap',
+                                overflow: 'hidden',
+                                textOverflow: 'ellipsis',
+                            }}>
+                                {Common.camelToPascalWithSpaces(translate('table.field.locItem.id'))}: {record.id}
+                            </Typography>
+                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
+                            <Typography variant="h6" gutterBottom align="right" >
+                                ID: {record.id}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Grid container spacing={2}>
+                        <Grid item xs={12} container alignContent="flex-end">
+                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
+                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
+                            </Typography>
+                        </Grid>
+                    </Grid>
+                    <Box height={20}>&nbsp;</Box>
+                    <Grid container spacing={2}>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.locId" 
+                                property={record.locId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.orderId" 
+                                property={record.orderId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.type" 
+                                property={record.type}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.orderItemId" 
+                                property={record.orderItemId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.wkType" 
+                                property={record.wkType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.matnrId" 
+                                property={record.matnrId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.maktx" 
+                                property={record.maktx}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.matnrCode" 
+                                property={record.matnrCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.trackCode" 
+                                property={record.trackCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.unit" 
+                                property={record.unit}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.anfme" 
+                                property={record.anfme}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.batch" 
+                                property={record.batch}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.splrBatch" 
+                                property={record.splrBatch}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.spec" 
+                                property={record.spec}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.model" 
+                                property={record.model}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.locItem.fieldsIndex" 
+                                property={record.fieldsIndex}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default LocItemPanel;
diff --git a/rsf-admin/src/page/locItem/index.jsx b/rsf-admin/src/page/locItem/index.jsx
new file mode 100644
index 0000000..a02f044
--- /dev/null
+++ b/rsf-admin/src/page/locItem/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import LocItemList from "./LocItemList";
+import LocItemEdit from "./LocItemEdit";
+
+export default {
+    list: LocItemList,
+    edit: LocItemEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/order/OrderEdit.jsx b/rsf-admin/src/page/order/OrderEdit.jsx
deleted file mode 100644
index 3300582..0000000
--- a/rsf-admin/src/page/order/OrderEdit.jsx
+++ /dev/null
@@ -1,126 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    Edit,
-    SimpleForm,
-    FormDataConsumer,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    SaveButton,
-    Toolbar,
-    Labeled,
-    NumberField,
-    required,
-    useRecordContext,
-    DeleteButton,
-} from 'react-admin';
-import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
-import * as Common from '@/utils/common';
-import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../components/EditBaseAside";
-import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
-
-const FormToolbar = () => {
-    const { getValues } = useFormContext();
-
-    return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
-            <SaveButton />
-            <DeleteButton mutationMode="optimistic" />
-        </Toolbar>
-    )
-}
-
-const OrderEdit = () => {
-    const translate = useTranslate();
-
-    return (
-        <Edit
-            redirect="list"
-            mutationMode={EDIT_MODE}
-            actions={<CustomerTopToolBar />}
-            aside={<EditBaseAside />}
-        >
-            <SimpleForm
-                shouldUnregister
-                warnWhenUnsavedChanges
-                toolbar={<FormToolbar />}
-                mode="onTouched"
-                defaultValues={{}}
-            // validate={(values) => { }}
-            >
-                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
-                    <Grid item xs={12} md={8}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.main')}
-                        </Typography>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.order.code"
-                                source="code"
-                                parse={v => v}
-                                autoFocus
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.order.sourceCode"
-                                source="sourceCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.order.sourceId"
-                                source="sourceId"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.order.type"
-                                source="type"
-                                parse={v => v}
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.order.wkType"
-                                source="wkType"
-                                parse={v => v}
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.order.anfme"
-                                source="anfme"
-                                validate={required()}
-                            />
-                        </Stack>
-
-                    </Grid>
-                    <Grid item xs={12} md={4}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.common')}
-                        </Typography>
-                        <StatusSelectInput />
-                        <Box mt="2em" />
-                        <MemoInput />
-                    </Grid>
-                </Grid>
-            </SimpleForm>
-        </Edit >
-    )
-}
-
-export default OrderEdit;
diff --git a/rsf-admin/src/page/order/OrderCreate.jsx b/rsf-admin/src/page/orders/order/OrderCreate.jsx
similarity index 96%
rename from rsf-admin/src/page/order/OrderCreate.jsx
rename to rsf-admin/src/page/orders/order/OrderCreate.jsx
index b0372f2..c7112d4 100644
--- a/rsf-admin/src/page/order/OrderCreate.jsx
+++ b/rsf-admin/src/page/orders/order/OrderCreate.jsx
@@ -27,9 +27,9 @@
     Grid,
     Box,
 } from '@mui/material';
-import DialogCloseButton from "../components/DialogCloseButton";
-import StatusSelectInput from "../components/StatusSelectInput";
-import MemoInput from "../components/MemoInput";
+import DialogCloseButton from "../../components/DialogCloseButton";
+import StatusSelectInput from "../../components/StatusSelectInput";
+import MemoInput from "../../components/MemoInput";
 
 const OrderCreate = (props) => {
     const { open, setOpen } = props;
diff --git a/rsf-admin/src/page/orders/order/OrderEdit.jsx b/rsf-admin/src/page/orders/order/OrderEdit.jsx
new file mode 100644
index 0000000..609e6f7
--- /dev/null
+++ b/rsf-admin/src/page/orders/order/OrderEdit.jsx
@@ -0,0 +1,124 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    required,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../../components/EditBaseAside";
+import CustomerTopToolBar from "../../components/EditTopToolBar";
+import MemoInput from "../../components/MemoInput";
+import StatusSelectInput from "../../components/StatusSelectInput";
+import OrderItemList from "./OrderItemList";
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'space-between' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const OrderEdit = () => {
+    const translate = useTranslate();
+
+    return (
+        <Box>
+            <Edit
+                redirect="list"
+                mutationMode={EDIT_MODE}
+                actions={<CustomerTopToolBar />}
+                aside={<EditBaseAside />}
+            >
+                <SimpleForm
+                    shouldUnregister
+                    warnWhenUnsavedChanges
+                    toolbar={<FormToolbar />}
+                    mode="onTouched"
+                    defaultValues={{}}
+                >
+                    <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                        <Grid item xs={12} md={8}>
+                            <Typography variant="h6" gutterBottom>
+                                {translate('common.edit.title.main')}
+                            </Typography>
+                            <Stack direction='row' gap={2}>
+                                <TextInput
+                                    label="table.field.order.code"
+                                    source="code"
+                                    parse={v => v}
+                                    autoFocus
+                                />
+                            </Stack>
+                            <Stack direction='row' gap={2}>
+                                <TextInput
+                                    label="table.field.order.sourceCode"
+                                    source="sourceCode"
+                                    parse={v => v}
+                                />
+                            </Stack>
+                            <Stack direction='row' gap={2}>
+                                <NumberInput
+                                    label="table.field.order.sourceId"
+                                    source="sourceId"
+                                />
+                            </Stack>
+                            <Stack direction='row' gap={2}>
+                                <TextInput
+                                    label="table.field.order.type"
+                                    source="type"
+                                    parse={v => v}
+                                    validate={required()}
+                                />
+                            </Stack>
+                            <Stack direction='row' gap={2}>
+                                <TextInput
+                                    label="table.field.order.wkType"
+                                    source="wkType"
+                                    parse={v => v}
+                                    validate={required()}
+                                />
+                            </Stack>
+                            <Stack direction='row' gap={2}>
+                                <NumberInput
+                                    label="table.field.order.anfme"
+                                    source="anfme"
+                                    validate={required()}
+                                />
+                            </Stack>
+                        </Grid>
+                        <Grid item xs={12} md={4}>
+                            <Typography variant="h6" gutterBottom>
+                                {translate('common.edit.title.common')}
+                            </Typography>
+                            <StatusSelectInput />
+                            <Box mt="2em" />
+                            <MemoInput />
+                        </Grid>
+                    </Grid>
+                </SimpleForm>
+            </Edit >
+            <OrderItemList />
+        </Box>
+    )
+}
+
+export default OrderEdit;
diff --git a/rsf-admin/src/page/order/OrderItemCreate.jsx b/rsf-admin/src/page/orders/order/OrderItemCreate.jsx
similarity index 98%
rename from rsf-admin/src/page/order/OrderItemCreate.jsx
rename to rsf-admin/src/page/orders/order/OrderItemCreate.jsx
index 71904b9..50f3b84 100644
--- a/rsf-admin/src/page/order/OrderItemCreate.jsx
+++ b/rsf-admin/src/page/orders/order/OrderItemCreate.jsx
@@ -27,9 +27,9 @@
     Grid,
     Box,
 } from '@mui/material';
-import DialogCloseButton from "../components/DialogCloseButton";
-import StatusSelectInput from "../components/StatusSelectInput";
-import MemoInput from "../components/MemoInput";
+import DialogCloseButton from "../../components/DialogCloseButton";
+import StatusSelectInput from "../../components/StatusSelectInput";
+import MemoInput from "../../components/MemoInput";
 
 const OrderItemCreate = (props) => {
     const { open, setOpen } = props;
diff --git a/rsf-admin/src/page/order/OrderItemEdit.jsx b/rsf-admin/src/page/orders/order/OrderItemEdit.jsx
similarity index 97%
rename from rsf-admin/src/page/order/OrderItemEdit.jsx
rename to rsf-admin/src/page/orders/order/OrderItemEdit.jsx
index 2133716..351d602 100644
--- a/rsf-admin/src/page/order/OrderItemEdit.jsx
+++ b/rsf-admin/src/page/orders/order/OrderItemEdit.jsx
@@ -24,10 +24,10 @@
 import { Stack, Grid, Box, Typography } from '@mui/material';
 import * as Common from '@/utils/common';
 import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../components/EditBaseAside";
-import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
+import EditBaseAside from "../../components/EditBaseAside";
+import CustomerTopToolBar from "../../components/EditTopToolBar";
+import MemoInput from "../../components/MemoInput";
+import StatusSelectInput from "../../components/StatusSelectInput";
 
 const FormToolbar = () => {
     const { getValues } = useFormContext();
diff --git a/rsf-admin/src/page/order/OrderItemList.jsx b/rsf-admin/src/page/orders/order/OrderItemList.jsx
similarity index 96%
rename from rsf-admin/src/page/order/OrderItemList.jsx
rename to rsf-admin/src/page/orders/order/OrderItemList.jsx
index 0fe52ac..6a301f7 100644
--- a/rsf-admin/src/page/order/OrderItemList.jsx
+++ b/rsf-admin/src/page/orders/order/OrderItemList.jsx
@@ -35,11 +35,11 @@
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
 import OrderItemCreate from "./OrderItemCreate";
-import EmptyData from "../components/EmptyData";
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
-import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
+import EmptyData from "../../components/EmptyData";
+import MyCreateButton from "../../components/MyCreateButton";
+import MyExportButton from '../../components/MyExportButton';
+import PageDrawer from "../../components/PageDrawer";
+import MyField from "../../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
 import * as Common from '@/utils/common';
 
diff --git a/rsf-admin/src/page/order/OrderList.jsx b/rsf-admin/src/page/orders/order/OrderList.jsx
similarity index 95%
rename from rsf-admin/src/page/order/OrderList.jsx
rename to rsf-admin/src/page/orders/order/OrderList.jsx
index 2a5e126..c04146a 100644
--- a/rsf-admin/src/page/order/OrderList.jsx
+++ b/rsf-admin/src/page/orders/order/OrderList.jsx
@@ -36,11 +36,11 @@
 import { styled } from '@mui/material/styles';
 import OrderCreate from "./OrderCreate";
 import OrderPanel from "./OrderPanel";
-import EmptyData from "../components/EmptyData";
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
-import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
+import EmptyData from "../../components/EmptyData";
+import MyCreateButton from "../../components/MyCreateButton";
+import MyExportButton from '../../components/MyExportButton';
+import PageDrawer from "../../components/PageDrawer";
+import MyField from "../../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
 import * as Common from '@/utils/common';
 
diff --git a/rsf-admin/src/page/order/OrderPanel.jsx b/rsf-admin/src/page/orders/order/OrderPanel.jsx
similarity index 98%
rename from rsf-admin/src/page/order/OrderPanel.jsx
rename to rsf-admin/src/page/orders/order/OrderPanel.jsx
index 5a18f22..e33ead2 100644
--- a/rsf-admin/src/page/order/OrderPanel.jsx
+++ b/rsf-admin/src/page/orders/order/OrderPanel.jsx
@@ -4,7 +4,7 @@
     useTranslate,
     useRecordContext,
 } from 'react-admin';
-import PanelTypography from "../components/PanelTypography";
+import PanelTypography from "../../components/PanelTypography";
 import * as Common from '@/utils/common'
 
 const OrderPanel = () => {
diff --git a/rsf-admin/src/page/order/index.jsx b/rsf-admin/src/page/orders/order/index.jsx
similarity index 100%
rename from rsf-admin/src/page/order/index.jsx
rename to rsf-admin/src/page/orders/order/index.jsx
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
index 79542a6..198b8f1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -84,6 +84,8 @@
     private QlyIsptItemService qlyIsptItemService;
     @Resource
     private StockItemMapper stockItemMapper;
+    @Autowired
+    private LocItemService locItemService;
     @Resource
     private PurchaseItemMapper purchaseItemMapper;
     @Resource
@@ -619,32 +621,55 @@
             throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
         }
         Stock stock = new Stock();
-        stock.setAsnId(OrderId).setAsnCode(order.getCode());
-        if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) {
-            Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode()));
-            if (!Objects.isNull(purchase)) {
-                stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId());
-            }
-        }
+//        if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) {
+//            Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode()));
+//            if (!Objects.isNull(purchase)) {
+//                stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId());
+//            }
+//        }
         String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null);
         if (StringUtils.isBlank(ruleCode)) {
             throw new CoolException("褰撳墠涓氬姟锛�" + SerialRuleCode.SYS_STOCK_CODE + "锛岀紪鐮佽鍒欎笉瀛樺湪锛侊紒");
         }
+        List<AsnOrderItem> itemList = params.getItemList();
+        double sum = itemList.stream().mapToDouble(AsnOrderItem::getAnfme).sum();
+        stock.setAnfme(sum)
+                .setSourceId(order.getId())
+                .setType(order.getType())
+                .setWkType(Short.parseShort(order.getWkType()));
         if (!stockService.save(stock)) {
             throw new CoolException("搴撳瓨淇濆瓨澶辫触锛侊紒");
         }
+        //TODO  骞冲簱涓婃灦绛栫暐闂锛� 1 骞冲簱搴撲綅鏄崟鐙璁★紝杩樻槸涓庝骇搴撲竴璧风敤绫诲瀷鍖哄垎
         Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, params.getLocCode()));
         if (Objects.isNull(loc)) {
             throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�");
         }
+        //locItemSerivce
+        List<LocItem> locItems = new ArrayList<>();
+        itemList.forEach(asnOrderItem -> {
+            LocItem item = new LocItem();
+            BeanUtils.copyProperties(asnOrderItem, item);
+            item.setId(loc.getId())
+                    .setOrderId(order.getId())
+                    .setOrderItemId(asnOrderItem.getId())
+                    .setWkType(Short.parseShort(order.getWkType()))
+                    .setType(order.getType());
+            locItems.add(item);
+        });
+        if (!locItemService.saveBatch(locItems)) {
+            throw new CoolException("搴撲綅鏄庣粏鏇存柊澶辫触锛侊紒");
+        }
+
         List<StockItem> stockItems = new ArrayList<>();
-        params.getItemList().forEach(orderItem -> {
+        itemList.forEach(orderItem -> {
             StockItem stockItem = new StockItem();
             BeanUtils.copyProperties(orderItem, stockItem);
-            stockItem.setAsnItemId(orderItem.getId())
+            stockItem.setSourceItemId(orderItem.getId())
                     .setBarcode(orderItem.getBarcode())
-                    .setLocId(loc.getId())
+                    .setStockCode(stock.getCode())
                     .setUpdateBy(loginUserId)
+                    .setCreateBy(loginUserId)
                     .setId(null)
                     .setStockId(stock.getId());
             stockItems.add(stockItem);
@@ -829,14 +854,15 @@
                 detlsDto.setInspect(inspect.getStatus$());
             }
             //鑾峰彇褰撳墠搴撳瓨淇℃伅
-            StockItem stockItem = stockItemMapper.selectOne(new LambdaQueryWrapper<StockItem>()
-                    .eq(StockItem::getAsnItemId, asnOrderItem.getId())
-                    .eq(StockItem::getMatnrId, asnOrderItem.getMatnrId()));
+            LocItem stockItem = locItemService.getOne(new LambdaQueryWrapper<LocItem>()
+                    .eq(LocItem::getOrderItemId, asnOrderItem.getId())
+                    .eq(LocItem::getBatch, asnOrderItem.getBatch())
+                    .eq(LocItem::getMatnrId, asnOrderItem.getMatnrId()));
             //SET 褰撳墠搴撳瓨鏁伴噺
             if (Objects.isNull(stockItem)) {
                 detlsDto.setStockQty(0.0);
             } else {
-                detlsDto.setStockQty(stockItem.getQty() + stockItem.getWorkQty());
+                detlsDto.setStockQty(stockItem.getAnfme() + stockItem.getWorkQty());
             }
 
             if (!Objects.isNull(asnOrderItem.getPoDetlId())) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
index bf648fa..83e71ea 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
@@ -22,8 +22,8 @@
 //        generator.username="sa";
 //        generator.password="Zoneyung@zy56$";
 
-        generator.table="man_order_item";
-        generator.tableDesc="缁煎悎璁㈠崟鏄庣粏绠$悊";
+        generator.table="man_loc_item";
+        generator.tableDesc="搴撲綅鏄庣粏";
         generator.packagePath="com.vincent.rsf.server.manager";
 
         generator.build();
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java
new file mode 100644
index 0000000..9e4110b
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java
@@ -0,0 +1,110 @@
+package com.vincent.rsf.server.manager.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.manager.entity.LocItem;
+import com.vincent.rsf.server.manager.service.LocItemService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@RestController
+public class LocItemController extends BaseController {
+
+    @Autowired
+    private LocItemService locItemService;
+
+    @PreAuthorize("hasAuthority('manager:locItem:list')")
+    @PostMapping("/locItem/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<LocItem, BaseParam> pageParam = new PageParam<>(baseParam, LocItem.class);
+        return R.ok().add(locItemService.page(pageParam, pageParam.buildWrapper(true)));
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItem:list')")
+    @PostMapping("/locItem/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(locItemService.list());
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItem:list')")
+    @PostMapping({"/locItem/many/{ids}", "/locItems/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(locItemService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItem:list')")
+    @GetMapping("/locItem/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(locItemService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItem:save')")
+    @OperationLog("Create 搴撲綅鏄庣粏")
+    @PostMapping("/locItem/save")
+    public R save(@RequestBody LocItem locItem) {
+        locItem.setCreateBy(getLoginUserId());
+        locItem.setCreateTime(new Date());
+        locItem.setUpdateBy(getLoginUserId());
+        locItem.setUpdateTime(new Date());
+        if (!locItemService.save(locItem)) {
+            return R.error("Save Fail");
+        }
+        return R.ok("Save Success").add(locItem);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItem:update')")
+    @OperationLog("Update 搴撲綅鏄庣粏")
+    @PostMapping("/locItem/update")
+    public R update(@RequestBody LocItem locItem) {
+        locItem.setUpdateBy(getLoginUserId());
+        locItem.setUpdateTime(new Date());
+        if (!locItemService.updateById(locItem)) {
+            return R.error("Update Fail");
+        }
+        return R.ok("Update Success").add(locItem);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItem:remove')")
+    @OperationLog("Delete 搴撲綅鏄庣粏")
+    @PostMapping("/locItem/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!locItemService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItem:list')")
+    @PostMapping("/locItem/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<LocItem> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(LocItem::getId, condition);
+        }
+        locItemService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locItem:list')")
+    @PostMapping("/locItem/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        ExcelUtil.build(ExcelUtil.create(locItemService.list(), LocItem.class), response);
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OrderController.java
index e026ce2..e1f4da1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OrderController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OrderController.java
@@ -12,6 +12,7 @@
 import com.vincent.rsf.server.manager.entity.Order;
 import com.vincent.rsf.server.manager.service.OrderService;
 import com.vincent.rsf.server.system.controller.BaseController;
+import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -19,6 +20,7 @@
 import javax.servlet.http.HttpServletResponse;
 import java.util.*;
 
+@Api(tags = "缁煎悎璁㈠崟绠$悊")
 @RestController
 public class OrderController extends BaseController {
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
new file mode 100644
index 0000000..3a38ea6
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
@@ -0,0 +1,304 @@
+package com.vincent.rsf.server.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.SpringUtils;
+import com.vincent.rsf.server.system.service.UserService;
+import com.vincent.rsf.server.system.entity.User;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+@TableName("man_loc_item")
+public class LocItem implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 涓诲崟ID
+     */
+    @ApiModelProperty(value= "涓诲崟ID")
+    private Long locId;
+
+    /**
+     * 鍗曟嵁ID
+     */
+    @ApiModelProperty(value= "鍗曟嵁ID")
+    private Long orderId;
+
+    /**
+     * 鍗曟嵁绫诲瀷
+     */
+    @ApiModelProperty(value= "鍗曟嵁绫诲瀷")
+    private String type;
+
+    /**
+     * 璁㈠崟鏄庣粏id
+     */
+    @ApiModelProperty(value= "璁㈠崟鏄庣粏id")
+    private Long orderItemId;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    @ApiModelProperty(value= "涓氬姟绫诲瀷")
+    private Short wkType;
+
+    /**
+     * 鐗╂枡ID
+     */
+    @ApiModelProperty(value= "鐗╂枡ID")
+    private Long matnrId;
+
+    /**
+     * 鐗╂枡鍚嶇О
+     */
+    @ApiModelProperty(value= "鐗╂枡鍚嶇О")
+    private String maktx;
+
+    /**
+     * 鐗╂枡缂栫爜
+     */
+    @ApiModelProperty(value= "鐗╂枡缂栫爜")
+    private String matnrCode;
+
+    /**
+     * 鐗╂枡璺熻釜鐮�
+     */
+    @ApiModelProperty(value= "鐗╂枡璺熻釜鐮�")
+    private String trackCode;
+
+    /**
+     * 搴撳瓨鍗曚綅
+     */
+    @ApiModelProperty(value= "搴撳瓨鍗曚綅")
+    private String unit;
+
+    /**
+     * 鏁伴噺
+     */
+    @ApiModelProperty(value= "鏁伴噺")
+    private Double anfme;
+
+    @ApiModelProperty("鎵ц鏁伴噺")
+    private Double workQty;
+
+    /**
+     * 搴撳瓨鎵规
+     */
+    @ApiModelProperty(value= "搴撳瓨鎵规")
+    private String batch;
+
+    /**
+     * 渚涘簲鍟嗘壒娆�
+     */
+    @ApiModelProperty(value= "渚涘簲鍟嗘壒娆�")
+    private String splrBatch;
+
+    /**
+     * 瑙勬牸
+     */
+    @ApiModelProperty(value= "瑙勬牸")
+    private String spec;
+
+    /**
+     * 鍨嬪彿
+     */
+    @ApiModelProperty(value= "鍨嬪彿")
+    private String model;
+
+    /**
+     * 瀛楁绱㈠紩
+     */
+    @ApiModelProperty(value= "瀛楁绱㈠紩")
+    private String fieldsIndex;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    @TableLogic
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Integer tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public LocItem() {}
+
+    public LocItem(Long locId,Long orderId,String type,Long orderItemId,Short wkType,Long matnrId,String maktx,String matnrCode,String trackCode,String unit,Double anfme,String batch,String splrBatch,String spec,String model,String fieldsIndex,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
+        this.locId = locId;
+        this.orderId = orderId;
+        this.type = type;
+        this.orderItemId = orderItemId;
+        this.wkType = wkType;
+        this.matnrId = matnrId;
+        this.maktx = maktx;
+        this.matnrCode = matnrCode;
+        this.trackCode = trackCode;
+        this.unit = unit;
+        this.anfme = anfme;
+        this.batch = batch;
+        this.splrBatch = splrBatch;
+        this.spec = spec;
+        this.model = model;
+        this.fieldsIndex = fieldsIndex;
+        this.status = status;
+        this.deleted = deleted;
+        this.tenantId = tenantId;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+    }
+
+//    LocItem locItem = new LocItem(
+//            null,    // 涓诲崟ID
+//            null,    // 鍗曟嵁ID
+//            null,    // 鍗曟嵁绫诲瀷
+//            null,    // 璁㈠崟鏄庣粏id
+//            null,    // 涓氬姟绫诲瀷
+//            null,    // 鐗╂枡ID
+//            null,    // 鐗╂枡鍚嶇О
+//            null,    // 鐗╂枡缂栫爜
+//            null,    // 鐗╂枡璺熻釜鐮�
+//            null,    // 搴撳瓨鍗曚綅
+//            null,    // 鏁伴噺
+//            null,    // 搴撳瓨鎵规
+//            null,    // 渚涘簲鍟嗘壒娆�
+//            null,    // 瑙勬牸
+//            null,    // 鍨嬪彿
+//            null,    // 瀛楁绱㈠紩
+//            null,    // 鐘舵�乕闈炵┖]
+//            null,    // 鏄惁鍒犻櫎[闈炵┖]
+//            null,    // 绉熸埛
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿[闈炵┖]
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿[闈炵┖]
+//            null    // 澶囨敞
+//    );
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "鍐荤粨";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Order.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Order.java
index c5b6cb7..aedf5a6 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Order.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Order.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+
+import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -22,6 +24,7 @@
 import java.util.Date;
 
 @Data
+@Accessors(chain = true)
 @TableName("man_order")
 public class Order implements Serializable {
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/OrderItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/OrderItem.java
index fd261ff..7ed3564 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/OrderItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/OrderItem.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+
+import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -22,6 +24,7 @@
 import java.util.Date;
 
 @Data
+@Accessors(chain = true)
 @TableName("man_order_item")
 public class OrderItem implements Serializable {
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Stock.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Stock.java
index 4c92d50..42f6657 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Stock.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Stock.java
@@ -29,7 +29,6 @@
 @Accessors(chain = true)
 @TableName("man_stock")
 public class Stock implements Serializable {
-
     private static final long serialVersionUID = 1L;
 
     /**
@@ -40,61 +39,40 @@
     private Long id;
 
     /**
-     * ASN鍗曟嵁锛� 甯﹀嚭PO鍗�
+     * 缂栧彿
      */
-    @ApiModelProperty(value= "ASN鍗曟嵁锛� 甯﹀嚭PO鍗�")
-    private Long asnId;
-    @ApiModelProperty("璁㈠崟缂栫爜")
-    private String asnCode;
+    @ApiModelProperty(value= "缂栧彿")
+    private String code;
 
     /**
-     * ERP鍑瘉
+     * 婧愬崟鎹紪鐮�
      */
-    @ApiModelProperty(value= "plat鍑瘉")
-    private String platToken;
+    @ApiModelProperty(value= "婧愬崟鎹紪鐮�")
+    private String sourceCode;
 
     /**
-     * plat鍗曞彿
+     * 婧愬崟鎹甀D
      */
-    @ApiModelProperty(value= "plat鍗曞彿")
-    private String platOrderNo;
+    @ApiModelProperty(value= "婧愬崟鎹甀D")
+    private Long sourceId;
 
     /**
-     * plat搴撳瓨鍦板潃
+     * 鍗曟嵁绫诲瀷
      */
-    @ApiModelProperty(value= "plat搴撳瓨鍦板潃")
-    private String platStkAdr;
+    @ApiModelProperty(value= "鍗曟嵁绫诲瀷")
+    private String type;
 
     /**
-     * 鍚堝悓鏍囪瘑
+     * 涓氬姟绫诲瀷
      */
-    @ApiModelProperty(value= "鍚堝悓鏍囪瘑")
-    private String contractId;
+    @ApiModelProperty(value= "涓氬姟绫诲瀷")
+    private Short wkType;
 
     /**
-     * 閿佸畾鍘熷洜
+     * 搴撳瓨鏁伴噺
      */
-    @ApiModelProperty(value= "閿佸畾鍘熷洜")
-    private String lockReason;
-
-    /**
-     * 閿佸畾鐘舵��
-     */
-    @ApiModelProperty(value= "閿佸畾鐘舵��")
-    private Short lockStatus;
-
-    /**
-     * 閿佸畾浜�
-     */
-    @ApiModelProperty(value= "閿佸畾浜�")
-    private String locker;
-
-    /**
-     * 閿佸畾鏃堕棿
-     */
-    @ApiModelProperty(value= "閿佸畾鏃堕棿")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
-    private Date lockedTime;
+    @ApiModelProperty(value= "搴撳瓨鏁伴噺")
+    private Double anfme;
 
     /**
      * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
@@ -149,16 +127,13 @@
 
     public Stock() {}
 
-    public Stock(String asnOrder,String platToken,String platOrder,String platStkAdr,String contractId,String lockReason,Short lockStatus,String locker,Date lockedTime,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
-        this.platOrderNo = asnOrder;
-        this.platToken = platToken;
-        this.platOrderNo = platOrder;
-        this.platStkAdr = platStkAdr;
-        this.contractId = contractId;
-        this.lockReason = lockReason;
-        this.lockStatus = lockStatus;
-        this.locker = locker;
-        this.lockedTime = lockedTime;
+    public Stock(String code,String sourceCode,Long sourceId,String type,Short wkType,Double anfme,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
+        this.code = code;
+        this.sourceCode = sourceCode;
+        this.sourceId = sourceId;
+        this.type = type;
+        this.wkType = wkType;
+        this.anfme = anfme;
         this.status = status;
         this.deleted = deleted;
         this.tenantId = tenantId;
@@ -189,12 +164,12 @@
 //            null    // 澶囨敞
 //    );
 
-    public String getLockedTime$(){
-        if (Cools.isEmpty(this.lockedTime)){
-            return "";
-        }
-        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.lockedTime);
-    }
+//    public String getLockedTime$(){
+//        if (Cools.isEmpty(this.lockedTime)){
+//            return "";
+//        }
+//        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.lockedTime);
+//    }
 
     public String getStatus$(){
         if (null == this.status){ return null; }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java
index d256b0c..48363f4 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java
@@ -37,21 +37,27 @@
     private Long id;
 
     /**
-     * 浠诲姟鏄庣粏ID
+     * 涓诲崟ID
      */
-    @ApiModelProperty("浠诲姟鏄庣粏ID")
-    private Long taskItemId;
-
-    /**
-     * 搴撳瓨澶栭敭鏍囪瘑
-     */
-    @ApiModelProperty(value= "搴撳瓨澶栭敭鏍囪瘑")
+    @ApiModelProperty(value= "涓诲崟ID")
     private Long stockId;
 
     /**
-     * 鐗╂枡鏍囪瘑
+     * 涓诲崟缂栧彿
      */
-    @ApiModelProperty(value= "鐗╂枡鏍囪瘑")
+    @ApiModelProperty(value= "涓诲崟缂栧彿")
+    private String stockCode;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "鏄庣粏ID")
+    private Long sourceItemId;
+
+    /**
+     * 鐗╂枡ID
+     */
+    @ApiModelProperty(value= "鐗╂枡ID")
     private Long matnrId;
 
     /**
@@ -60,21 +66,23 @@
     @ApiModelProperty(value= "鐗╂枡缂栫爜")
     private String matnrCode;
 
-
-    @ApiModelProperty(value = "閫氱煡鍗曟槑缁嗘爣璇�")
-    private Long asnItemId;
-
     /**
-     * 鍚嶇О
+     * 鐗╂枡鍚嶇О
      */
-    @ApiModelProperty(value= "鍚嶇О")
+    @ApiModelProperty(value= "鐗╂枡鍚嶇О")
     private String maktx;
 
     /**
-     * 鏁伴噺
+     * 閫佽揣鏁伴噺
      */
-    @ApiModelProperty(value= "鏁伴噺")
+    @ApiModelProperty(value= "閫佽揣鏁伴噺")
     private Double anfme;
+
+    /**
+     * 搴撳瓨鍗曚綅
+     */
+    @ApiModelProperty(value= "搴撳瓨鍗曚綅")
+    private String stockUnit;
 
     /**
      * 鎵ц涓暟閲�
@@ -83,46 +91,58 @@
     private Double workQty;
 
     /**
-     * 瀹屾垚鏁伴噺
+     * 閲囪喘鏁伴噺
      */
-    @ApiModelProperty(value= "瀹屾垚鏁伴噺")
+    @ApiModelProperty(value= "閲囪喘鏁伴噺")
+    private Double purQty;
+
+    /**
+     * 閲囪喘鍗曚綅
+     */
+    @ApiModelProperty(value= "閲囪喘鍗曚綅")
+    private String purUnit;
+
+    /**
+     * 宸叉敹鏁伴噺
+     */
+    @ApiModelProperty(value= "宸叉敹鏁伴噺")
     private Double qty;
 
     /**
-     * 鏀惰揣閲嶉噺
+     * 渚涘簲鍟嗙紪鐮�
      */
-    @ApiModelProperty(value= "鏀惰揣閲嶉噺")
-    private Double weight;
+    @ApiModelProperty(value= "渚涘簲鍟嗙紪鐮�")
+    private String splrCode;
 
     /**
-     * 鍗曚綅
+     * 搴撳瓨鎵规
      */
-    @ApiModelProperty(value= "鍗曚綅")
-    private String unit;
-
-    /**
-     * 璐т富鏍囪瘑
-     */
-    @ApiModelProperty(value= "璐т富鏍囪瘑")
-    private Long shipperId;
-
-    /**
-     * 渚涘簲鍟嗘爣璇�
-     */
-    @ApiModelProperty(value= "渚涘簲鍟嗘爣璇�")
-    private String splrId;
-
-    /**
-     * 鍝佺墝
-     */
-    @ApiModelProperty(value= "鍝佺墝")
-    private String brand;
-
-    /**
-     * 鎵规
-     */
-    @ApiModelProperty(value= "鎵规")
+    @ApiModelProperty(value= "搴撳瓨鎵规")
     private String batch;
+
+    /**
+     * 渚涘簲鍟嗘壒娆�
+     */
+    @ApiModelProperty(value= "渚涘簲鍟嗘壒娆�")
+    private String splrBatch;
+
+    /**
+     * 渚涘簲鍟嗗悕绉�
+     */
+    @ApiModelProperty(value= "渚涘簲鍟嗗悕绉�")
+    private String splrName;
+
+    /**
+     * 璺熻釜鐮�
+     */
+    @ApiModelProperty(value= "璺熻釜鐮�")
+    private String trackCode;
+
+    /**
+     * 鏉″舰鐮�
+     */
+    @ApiModelProperty(value= "鏉″舰鐮�")
+    private String barcode;
 
     /**
      * 鐢熶骇鏃ユ湡
@@ -131,86 +151,10 @@
     private String prodTime;
 
     /**
-     * 璐ㄦ鏍囪瘑
+     * 鍖呰鍚嶇О
      */
-    @ApiModelProperty(value= "璐ㄦ鏍囪瘑")
-    private Long inspectId;
-
-    /**
-     * 渚涘簲鍟嗘壒娆�
-     */
-    @ApiModelProperty(value= "渚涘簲鍟嗘壒娆�")
-    private String splrBtch;
-
-    /**
-     * ASN鍗曟嵁,甯﹀嚭PO鍗�
-     */
-    @ApiModelProperty(value= "ASN鍗曟嵁,甯﹀嚭PO鍗�")
-    @TableField(exist = false)
-    private String asnOrder;
-
-    /**
-     * ERP鍑瘉
-     */
-    @ApiModelProperty(value= "ERP鍑瘉")
-    @TableField(exist = false)
-    private String erpToken;
-
-    /**
-     * ERP鍗曞彿
-     */
-    @ApiModelProperty(value= "ERP鍗曞彿")
-    @TableField(exist = false)
-    private String erpOrder;
-
-    /**
-     * ERP搴撳瓨鍦板潃
-     */
-    @ApiModelProperty(value= "ERP搴撳瓨鍦板潃")
-    @TableField(exist = false)
-    private String erpStkAdr;
-
-    /**
-     * 搴撲綅鏍囪瘑
-     */
-    @ApiModelProperty(value= "搴撲綅鏍囪瘑")
-    private Long locId;
-
-    /**
-     * 瀹瑰櫒缂栫爜
-     */
-    @ApiModelProperty(value= "瀹瑰櫒缂栫爜")
-    private String barcode;
-
-    /**
-     * 閲囪喘鍗曚綅
-     */
-    @ApiModelProperty(value= "閲囪喘鍗曚綅")
-    private Double purPrice;
-
-    /**
-     * 閿佸畾鍘熷洜
-     */
-    @ApiModelProperty(value= "閿佸畾鍘熷洜")
-    private String lockReason;
-
-    /**
-     * 閿佸畾鐘舵��
-     */
-    @ApiModelProperty(value= "閿佸畾鐘舵��")
-    private Short lockStatus;
-
-    /**
-     * 閿佸畾浜�
-     */
-    @ApiModelProperty(value= "閿佸畾浜�")
-    private String locker;
-
-    /**
-     * 閿佸畾鏃堕棿
-     */
-    @ApiModelProperty(value= "閿佸畾鏃堕棿")
-    private Date lockedTime;
+    @ApiModelProperty(value= "鍖呰鍚嶇О")
+    private String packName;
 
     /**
      * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
@@ -265,35 +209,27 @@
 
     public StockItem() {}
 
-    public StockItem(Long stockId,Long matnrId,Long asnItemId, String code,String matnrk,Double anfme,Double workQty,Double qty,Double weight,String unit,Long shipperId,String splrId,String brand,String batch,String prodTime,Long inspectId,String splrBtch,String asnOrder,String erpToken,String erpOrder,String erpStkAdr,Long locId,String barcode,Double purPrice,String lockReason,Short lockStatus,String locker,Date lockedTime,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
-        this.stockId = stockId;
+    public StockItem(Long orderId,String orderCode,Long sourceItemId,Long matnrId,String matnrCode,String maktx,Double anfme,String stockUnit,Double workQty,Double purQty,String purUnit,Double qty,String splrCode,String batch,String splrBatch,String splrName,String trackCode,String barcode,String prodTime,String packName,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
+        this.stockId = orderId;
+        this.stockCode = orderCode;
+        this.sourceItemId = sourceItemId;
         this.matnrId = matnrId;
-        this.asnItemId = asnItemId;
-        this.matnrCode = code;
-        this.maktx = matnrk;
+        this.matnrCode = matnrCode;
+        this.maktx = maktx;
         this.anfme = anfme;
+        this.stockUnit = stockUnit;
         this.workQty = workQty;
+        this.purQty = purQty;
+        this.purUnit = purUnit;
         this.qty = qty;
-        this.weight = weight;
-        this.unit = unit;
-        this.shipperId = shipperId;
-        this.splrId = splrId;
-        this.brand = brand;
+        this.splrCode = splrCode;
         this.batch = batch;
-        this.prodTime = prodTime;
-        this.inspectId = inspectId;
-        this.splrBtch = splrBtch;
-        this.asnOrder = asnOrder;
-        this.erpToken = erpToken;
-        this.erpOrder = erpOrder;
-        this.erpStkAdr = erpStkAdr;
-        this.locId = locId;
+        this.splrBatch = splrBatch;
+        this.splrName = splrName;
+        this.trackCode = trackCode;
         this.barcode = barcode;
-        this.purPrice = purPrice;
-        this.lockReason = lockReason;
-        this.lockStatus = lockStatus;
-        this.locker = locker;
-        this.lockedTime = lockedTime;
+        this.prodTime = prodTime;
+        this.packName = packName;
         this.status = status;
         this.deleted = deleted;
         this.tenantId = tenantId;
@@ -342,14 +278,14 @@
 //            null    // 澶囨敞
 //    );
 
-    public String getStockId$(){
-        StockService service = SpringUtils.getBean(StockService.class);
-        Stock stock = service.getById(this.stockId);
-        if (!Cools.isEmpty(stock)){
-            return String.valueOf(stock.getId());
-        }
-        return null;
-    }
+//    public String getStockId$(){
+//        StockService service = SpringUtils.getBean(StockService.class);
+//        Stock stock = service.getById(this.stockId);
+//        if (!Cools.isEmpty(stock)){
+//            return String.valueOf(stock.getId());
+//        }
+//        return null;
+//    }
 
     public String getMatnrId$(){
         MatnrService service = SpringUtils.getBean(MatnrService.class);
@@ -360,14 +296,14 @@
         return null;
     }
 
-    public String getShipperId$(){
-        CompanysService service = SpringUtils.getBean(CompanysService.class);
-        Companys shipper = service.getById(this.shipperId);
-        if (!Cools.isEmpty(shipper)){
-            return String.valueOf(shipper.getName());
-        }
-        return null;
-    }
+//    public String getShipperId$(){
+//        CompanysService service = SpringUtils.getBean(CompanysService.class);
+//        Companys shipper = service.getById(this.shipperId);
+//        if (!Cools.isEmpty(shipper)){
+//            return String.valueOf(shipper.getName());
+//        }
+//        return null;
+//    }
 
 //    public String getSplrId$(){
 //        SupplierService service = SpringUtils.getBean(SupplierService.class);
@@ -378,30 +314,30 @@
 //        return null;
 //    }
 //
-    public String getInspectId$(){
-        QlyInspectService service = SpringUtils.getBean(QlyInspectService.class);
-        QlyInspect qlyInspect = service.getById(this.inspectId);
-        if (!Cools.isEmpty(qlyInspect)){
-            return String.valueOf(qlyInspect.getCode());
-        }
-        return null;
-    }
-
-    public String getLocId$(){
-        LocService service = SpringUtils.getBean(LocService.class);
-        Loc loc = service.getById(this.locId);
-        if (!Cools.isEmpty(loc)){
-            return String.valueOf(loc.getCode());
-        }
-        return null;
-    }
-
-    public String getLockedTime$(){
-        if (Cools.isEmpty(this.lockedTime)){
-            return "";
-        }
-        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.lockedTime);
-    }
+//    public String getInspectId$(){
+//        QlyInspectService service = SpringUtils.getBean(QlyInspectService.class);
+//        QlyInspect qlyInspect = service.getById(this.inspectId);
+//        if (!Cools.isEmpty(qlyInspect)){
+//            return String.valueOf(qlyInspect.getCode());
+//        }
+//        return null;
+//    }
+//
+//    public String getLocId$(){
+//        LocService service = SpringUtils.getBean(LocService.class);
+//        Loc loc = service.getById(this.locId);
+//        if (!Cools.isEmpty(loc)){
+//            return String.valueOf(loc.getCode());
+//        }
+//        return null;
+//    }
+//
+//    public String getLockedTime$(){
+//        if (Cools.isEmpty(this.lockedTime)){
+//            return "";
+//        }
+//        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.lockedTime);
+//    }
 
     public String getStatus$(){
         if (null == this.status){ return null; }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java
index acbbbd4..5424d53 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java
@@ -67,6 +67,9 @@
     @ApiModelProperty("鍗曟嵁绫诲瀷")
     private String orderType;
 
+    @ApiModelProperty("涓氬姟绫诲瀷")
+    private Short wkType;
+
     @ApiModelProperty("鍗曟嵁鏄庣粏ID")
     private Long orderItemId;
     /**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java
new file mode 100644
index 0000000..b6a4e29
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.manager.mapper;
+
+import com.vincent.rsf.server.manager.entity.LocItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface LocItemMapper extends BaseMapper<LocItem> {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
index 6e4e4bd..4cf03ae 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
@@ -184,7 +184,6 @@
      * @return
      * @time 2025/3/29 12:36
      */
-//    @Scheduled(cron = "0 0/05 * * * ?  ")
     @Scheduled(cron = "0/25 * * * * ?")
     @Transactional(rollbackFor = Exception.class)
     public void pakinLog() {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
index 1e857c8..aa19574 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -50,6 +50,10 @@
     private StockService stockService;
     @Autowired
     private LocService locService;
+    @Autowired
+    private OrderService orderService;
+    @Autowired
+    private OrderItemService orderItemService;
     /**
     * @author Ryan
     * @description 瀹屾垚鍏ュ簱锛屾洿鏂板簱瀛�
@@ -88,6 +92,7 @@
         if (taskItems.isEmpty()) {
             return;
         }
+
         List<TaskLog> taskLogs = new ArrayList<>();
         tasks.forEach(task -> {
             TaskLog taskLog = new TaskLog();
@@ -99,15 +104,18 @@
             throw new CoolException("浠诲姟鍘嗗彶妗d繚瀛樺け璐ワ紒锛�");
         }
         List<TaskItemLog >itemLogs = new ArrayList<>();
+
         taskItems.forEach(item -> {
             TaskItemLog itemLog = new TaskItemLog();
             BeanUtils.copyProperties(item, itemLog);
             itemLog.setId(null).setTaskItemId(item.getId());
             itemLogs.add(itemLog);
         });
+
         if (!taskItemLogService.saveBatch(itemLogs)) {
             throw new CoolException("浠诲姟鏄庣粏鍘嗗彶妗d繚瀛樺け璐ワ紒锛�");
         }
+
         if (!taskService.removeByIds(list)) {
             throw new CoolException("鍘熷浠诲姟鍒犻櫎澶辫触锛侊紒");
         }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java
new file mode 100644
index 0000000..ce85d82
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.manager.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.server.manager.entity.LocItem;
+
+public interface LocItemService extends IService<LocItem> {
+
+}
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
new file mode 100644
index 0000000..9cc069f
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -0,0 +1,12 @@
+package com.vincent.rsf.server.manager.service.impl;
+
+import com.vincent.rsf.server.manager.mapper.LocItemMapper;
+import com.vincent.rsf.server.manager.entity.LocItem;
+import com.vincent.rsf.server.manager.service.LocItemService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("locItemService")
+public class LocItemServiceImpl extends ServiceImpl<LocItemMapper, LocItem> implements LocItemService {
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index cca988c..78e4034 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -53,6 +53,14 @@
     @Autowired
     private DeviceSiteService deviceSiteService;
 
+    @Autowired
+    private OrderService orderService;
+
+    @Autowired
+    private OrderItemService orderItemService;
+
+    @Autowired
+    private LocItemService locItemService;
 
 
     /**
@@ -113,8 +121,13 @@
             waitPakinItems.forEach(item -> {
                 TaskItem taskItem = new TaskItem();
                 BeanUtils.copyProperties(item, taskItem);
+                AsnOrder order = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, item.getAsnId()));
+                if (Objects.isNull(order)) {
+                    throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
+                }
                 taskItem.setTaskId(task.getId())
                         .setOrderType(OrderType.ORDER_RECEIPT.type)
+                        .setWkType(Short.parseShort(order.getWkType()))
                         .setSource(item.getId())
                         .setTrackCode(item.getTrackCode())
                         .setCreateBy(loginUserId)
@@ -139,7 +152,7 @@
     }
 
     /**
-     * 瀹屾垚浠诲姟
+     * 瀹屾垚浠诲姟 鏇存柊搴撲綅鏄庣粏淇℃伅锛屽皢鍗曟嵁搴撳瓨鏇存柊鍒板崟鎹簱瀛樿〃
      * @param tasks
      * @throws Exception
      */
@@ -152,59 +165,36 @@
         List<Long> list = tasks.stream().map(Task::getId).collect(Collectors.toList());
         List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, list));
         if (taskItems.isEmpty()) {
-            throw new CoolException("浠诲姟鏄庣粏涓嶈兘涓虹┖锛侊紒");
+            throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�");
         }
+        List<String> locCodes = tasks.stream().map(Task::getTargLoc).collect(Collectors.toList());
+        Map<Long, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getTaskId));
+        /**瀵逛换鍔℃槑缁嗘寜浠诲姟涓诲崟杩涜鍒嗙粍*/
+        listMap.keySet().forEach(key -> {
+            List<TaskItem> items = listMap.get(key);
+            //鏇存柊搴撲綅鏄庣粏
+            try {
+                saveLocItem(items, key);
+            } catch (Exception e) {
+                throw new CoolException("搴撲綅鏄庣粏鏇存柊澶辫触锛侊紒");
+            }
+        });
+
         /**瀵逛换鍔℃槑缁嗘寜璁㈠崟杩涜鍒嗙粍*/
         Map<Long, List<TaskItem>> orderMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getOrderId));
-        List<StockItem> stockItems = new ArrayList<>();
         orderMap.keySet().forEach(key -> {
             AsnOrder order = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>()
                     .eq(AsnOrder::getId, key)
                     .select(AsnOrder::getId, AsnOrder::getPoCode, AsnOrder::getCode));
-            Stock stock = new Stock();
-            if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) {
-                Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode()));
-                if (!Objects.isNull(purchase)) {
-                    stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId());
-                }
-            }
-            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null);
-            if (StringUtils.isBlank(ruleCode)) {
-                throw new CoolException("褰撳墠涓氬姟锛�" + SerialRuleCode.SYS_STOCK_CODE + "锛岀紪鐮佽鍒欎笉瀛樺湪锛侊紒");
-            }
-            stock.setAsnId(order.getId()).setAsnCode(order.getCode());
-            if (!stockService.save(stock)) {
-                throw new CoolException("搴撳瓨淇濆瓨澶辫触锛侊紒");
-            }
             List<TaskItem> items = orderMap.get(key);
-            for (TaskItem item : items) {
-                /**閫氳繃浠诲姟鏄庣粏涓殑taskId鏌ヨ,鑾峰彇TASK鐨勭洰鏍囧簱浣嶄俊鎭�*/
-                Task taskServiceOne = this.getOne(new LambdaQueryWrapper<Task>()
-                        .select(Task::getId, Task::getTargLoc, Task::getOrgLoc, Task::getBarcode)
-                        .eq(Task::getId, item.getTaskId()));
-                Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, taskServiceOne.getTargLoc()));
-                if (Objects.isNull(loc)) {
-                    throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�");
-                }
-                AsnOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getId, item.getOrderItemId()));
-                if (Objects.isNull(orderItem)) {
-                    throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�");
-                }
-                StockItem stockItem = new StockItem();
-                BeanUtils.copyProperties(orderItem, stockItem);
-                stockItem.setAsnItemId(item.getOrderItemId())
-                        .setBarcode(taskServiceOne.getBarcode())
-                        .setLocId(loc.getId())
-                        .setId(null)
-                        .setStockId(stock.getId());
-                stockItems.add(stockItem);
-            }
-            if (!stockItemService.saveBatch(stockItems)) {
-                throw new CoolException("搴撳瓨淇敼鏋跺け璐ワ紒锛�");
+            //淇濆瓨搴撳瓨鏄庣粏
+            try {
+                saveStockItems(items, order);
+            } catch (Exception e) {
+                throw new CoolException("搴撳瓨绠$悊淇濆瓨鏇存柊澶辫触锛侊紒");
             }
         });
         /**淇敼搴撲綅鐘舵�佷负F.鍦ㄥ簱*/
-        List<String> locCodes = tasks.stream().map(Task::getTargLoc).collect(Collectors.toList());
         if (!locService.update(new LambdaUpdateWrapper<Loc>().set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).in(Loc::getCode, locCodes))) {
             throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
         }
@@ -212,4 +202,96 @@
             throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
         }
     }
+
+    /**
+     * @author Ryan
+     * @description 鏇存柊搴撲綅鏄庣粏
+     * @param
+     * @return
+     * @time 2025/4/15 15:28
+     */
+    @Transactional(rollbackFor = Exception.class)
+    private void saveLocItem(List<TaskItem> items, Long taskId) throws Exception {
+        Task task = this.getById(taskId);
+        if (Objects.isNull(task)) {
+            throw new CoolException("浠诲姟涓嶅瓨鍦�!!");
+        }
+        List<LocItem> locItems = new ArrayList<>();
+        items.forEach(taskItem -> {
+            Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()));
+            LocItem item = new LocItem();
+            BeanUtils.copyProperties(taskItem, item);
+            item.setLocId(loc.getId()).setType(taskItem.getOrderType());
+            locItems.add(item);
+        });
+        if (!locItemService.saveBatch(locItems)) {
+            throw new CoolException("搴撲綅鏄庣粏鏇存柊澶辫触锛侊紒");
+        }
+    }
+
+    /**
+     * 鐢熸垚搴撳瓨鏄庣粏
+     * @param items
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    private void saveStockItems(List<TaskItem> items, AsnOrder order) throws Exception {
+        Stock stock = new Stock();
+//        if (!Objects.isNull(order.getPoCode()) && StringUtils.isNotBlank(order.getPoCode())) {
+//            Purchase purchase = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, order.getPoCode()));
+//            if (!Objects.isNull(purchase)) {
+//                stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId());
+//            }
+//        }
+        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null);
+        if (StringUtils.isBlank(ruleCode)) {
+            throw new CoolException("褰撳墠涓氬姟锛�" + SerialRuleCode.SYS_STOCK_CODE + "锛岀紪鐮佽鍒欎笉瀛樺湪锛侊紒");
+        }
+        stock.setSourceId(order.getId()).setSourceCode(order.getCode());
+        if (!stockService.save(stock)) {
+            throw new CoolException("搴撳瓨淇濆瓨澶辫触锛侊紒");
+        }
+
+        List<StockItem> stockItems = new ArrayList<>();
+        for (TaskItem item : items) {
+            /**閫氳繃浠诲姟鏄庣粏涓殑taskId鏌ヨ,鑾峰彇TASK鐨勭洰鏍囧簱浣嶄俊鎭�*/
+            AsnOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getId, item.getOrderItemId()));
+            if (Objects.isNull(orderItem)) {
+                throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�");
+            }
+            StockItem stockItem = new StockItem();
+            BeanUtils.copyProperties(orderItem, stockItem);
+            stockItem.setSourceItemId(item.getOrderItemId())
+                    .setStockCode(stock.getCode())
+                    .setSourceItemId(orderItem.getId())
+                    .setId(null)
+                    .setStockId(stock.getId());
+            stockItems.add(stockItem);
+        }
+        if (!stockItemService.saveBatch(stockItems)) {
+            throw new CoolException("搴撳瓨淇敼鏋跺け璐ワ紒锛�");
+        }
+    }
+
+//    public void generateOrders() {
+//        Map<Long, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getOrderId));
+//        listMap.keySet().forEach(key -> {
+//            double sum = listMap.get(key).stream().mapToDouble(TaskItem::getAnfme).sum();
+//            listMap.get(key).forEach(taskItem -> {
+//                Order order = new Order();
+//                String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_MANAGE_ORDER_CODE, taskItem);
+//                if (Objects.isNull(ruleCode) || StringUtils.isBlank(ruleCode)) {
+//                    throw new CoolException("缂栫爜瑙勫垯閿欒锛�" + "璇锋煡鐪嬬紪鐮侊細" + "銆孲YS_MANAGE_ORDER_CODE銆�" + "鏄惁璁剧疆");
+//                }
+//                order.setCode(ruleCode).setAnfme(sum).setSourceId(taskItem.getOrderId());
+//            });
+//        });
+//
+//        if (!orderItemService.saveBatch(orderItems)) {
+//            throw new CoolException("鍗曟嵁鏄庣粏淇濆瓨澶辫触锛侊紒");
+//        }
+//    }
+
+
+
 }
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 9c1961c..1a030bc 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
@@ -53,4 +53,9 @@
      * 浠撳簱缂栫爜瑙勫垯
      */
     public final static String SYS_STOCK_CODE = "sys_stock_code";
+
+    /**
+     * 缁煎悎璁㈠崟缂栫爜瑙勫垯
+     */
+    public final static String SYS_MANAGE_ORDER_CODE = "sys_manage_order_code";
 }
diff --git a/rsf-server/src/main/java/locItem.sql b/rsf-server/src/main/java/locItem.sql
new file mode 100644
index 0000000..68bef1f
--- /dev/null
+++ b/rsf-server/src/main/java/locItem.sql
@@ -0,0 +1,37 @@
+-- save locItem record
+-- mysql
+insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.locItem', '0', '/manager/locItem', 'locItem', '0' , '0', '1' , '1');
+
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 搴撲綅鏄庣粏', '', '1', 'manager:locItem:list', '0', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 搴撲綅鏄庣粏', '', '1', 'manager:locItem:save', '1', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 搴撲綅鏄庣粏', '', '1', 'manager:locItem:update', '2', '1', '1');
+insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 搴撲綅鏄庣粏', '', '1', 'manager:locItem:remove', '3', '1', '1');
+
+-- locale menu name
+locItem: 'LocItem',
+
+-- locale field
+locItem: {
+    locId: "locId",
+    orderId: "orderId",
+    type: "type",
+    orderItemId: "orderItemId",
+    wkType: "wkType",
+    matnrId: "matnrId",
+    maktx: "maktx",
+    matnrCode: "matnrCode",
+    trackCode: "trackCode",
+    unit: "unit",
+    anfme: "anfme",
+    batch: "batch",
+    splrBatch: "splrBatch",
+    spec: "spec",
+    model: "model",
+    fieldsIndex: "fieldsIndex",
+},
+
+-- ResourceContent
+import locItem from './locItem';
+
+case 'locItem':
+    return locItem;
diff --git a/rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml b/rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml
new file mode 100644
index 0000000..90ad348
--- /dev/null
+++ b/rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vincent.rsf.server.manager.mapper.LocItemMapper">
+
+</mapper>

--
Gitblit v1.9.1