From cba29f2b769ae2010dd91ec5ed4e4199ead90ce6 Mon Sep 17 00:00:00 2001
From: Ryan <creaycat@gmail.com>
Date: 星期三, 02 四月 2025 18:49:03 +0800
Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop

---
 rsf-admin/src/page/taskItem/TaskItemCreate.jsx                                                  |    7 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java            |  123 ++++++++++
 rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx                                               |   20 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinItemController.java |   12 +
 rsf-admin/src/page/asnOrder/AsnWareModal.jsx                                                    |    4 
 rsf-admin/src/page/taskItem/TaskItemList.jsx                                                    |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java  |   27 +
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java         |   57 ++++
 rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java                         |   49 ++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java                |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java                 |    8 
 rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx                                |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java       |   31 ++
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/OperateStockDto.java             |    8 
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/CheckObjDto.java                 |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java   |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java                   |   17 
 rsf-server/src/main/resources/application.yml                                                   |    2 
 rsf-admin/src/i18n/zh.js                                                                        |    8 
 rsf-admin/src/i18n/en.js                                                                        |    4 
 rsf-admin/src/page/waitPakin/WaitPakinPanel.jsx                                                 |    2 
 rsf-admin/.env                                                                                  |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java                |    2 
 rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx                                                   |   10 
 rsf-admin/src/page/waitPakinLog/WaitPakinLogPanel.jsx                                           |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinController.java     |   16 +
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java                  |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java             |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java            |   18 +
 rsf-admin/src/page/qlyInspect/QlyInspectList.jsx                                                |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Stock.java                       |   33 +-
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java               |    5 
 rsf-admin/src/page/task/TaskList.jsx                                                            |  138 ++++++++++-
 rsf-admin/src/page/asnOrderLog/AsnOrderLogPanel.jsx                                             |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OpStockParams.java        |   19 +
 rsf-admin/src/page/taskItem/TaskItemEdit.jsx                                                    |    7 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java          |   13 +
 rsf-admin/src/page/asnOrder/AsnOrderModal.jsx                                                   |    4 
 38 files changed, 567 insertions(+), 109 deletions(-)

diff --git a/rsf-admin/.env b/rsf-admin/.env
index ebc08a7..75359a8 100644
--- a/rsf-admin/.env
+++ b/rsf-admin/.env
@@ -1,3 +1,3 @@
-VITE_BASE_IP=localhost
+VITE_BASE_IP=192.168.4.13
 # VITE_BASE_IP=47.76.147.249
 VITE_BASE_PORT=8080
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 8e79beb..3f3392d 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -436,6 +436,7 @@
                 disQty: "disQty",
                 safeQty: "safeQty",
                 picPath: "picPath",
+                trackCode: "trackCode",
             },
             dictType: {
                 code: "Code",
@@ -783,6 +784,9 @@
         siteInit: 'site init',
         batch: 'batch',
         confirm: 'confirm',
+        cancel: "cancel",
+        top: "top",
+        resort: "sort",
         subzone: 'subzone',
         bindmatnr: 'bind matnr',
         bindloc: 'bind loc',
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index aae3f75..52264fc 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -422,7 +422,7 @@
             qlyInspect: {
                 asnId: "鏀惰揣閫氱煡鍗曞彿",
                 asnCode: "鏀惰揣閫氱煡鍗曠紪鐮�",
-                code: "缂栫爜",
+                code: "璐ㄦ鍗曠紪鐮�",
                 wkType: "涓氬姟绫诲瀷",
                 safeQty: "鍚堟牸鏁伴噺",
                 dlyQty: "閫佽揣鏁伴噺",
@@ -445,6 +445,7 @@
                 disQty: "涓嶅悎鏁伴噺",
                 safeQty: "鍚堟牸鏁伴噺",
                 picPath: "鍥剧墖璺緞",
+                trackCode: "鏉″舰鐮�",
             },
             dictType: {
                 code: "瀛楀吀缂栫爜",
@@ -520,7 +521,7 @@
                 poDetlCode: "PO鍗曠紪鐮�",
                 matnrId: "鐗╂枡鏍囪瘑",
                 maktx: "鐗╂枡鍚嶇О",
-                maktxCode: "鐗╂枡缂栫爜",
+                matnrCode: "鐗╂枡缂栫爜",
                 anfme: "鏁伴噺",
                 stockUnit: "搴撳瓨鍗曚綅",
                 purQty: "璁″垝鏀惰揣鏁伴噺",
@@ -795,6 +796,9 @@
         siteInit: '绔欑偣鍒濆鍖�',
         batch: '鎵归噺鎿嶄綔',
         confirm: '纭',
+        cancel: "鍙栨秷",
+        top: "缃《",
+        resort: "鎺掑簭",
         subzone: '缁戝畾鍒嗗尯',
         bindmatnr: '缁戝畾鐗╂枡',
         bindloc: '缁戝畾搴撲綅',
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
index 1f301cd..9bb5800 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
@@ -264,8 +264,8 @@
             editable: false,
         },
         {
-            field: 'maktxCode',
-            headerName: translate('table.field.asnOrderItem.maktxCode'),
+            field: 'matnrCode',
+            headerName: translate('table.field.asnOrderItem.matnrCode'),
             width: 130,
             editable: false,
         },
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
index 2b674ec..031f9f8 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
@@ -59,10 +59,10 @@
             field: 'poDetlCode',
             headerName: translate('table.field.asnOrderItem.poDetlCode')
         },
-        // {
-        //     field: 'matnrCode',
-        //     headerName: translate('table.field.asnOrderItem.matnrCode')
-        // },
+        {
+            field: 'matnrCode',
+            headerName: translate('table.field.asnOrderItem.matnrCode')
+        },
         {
             field: 'maktx',
             headerName: translate('table.field.asnOrderItem.maktx'),
@@ -142,7 +142,7 @@
         }}>
 
             <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', alignItems: 'center' }}>
-                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} />
+                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} size="small" />
 
                 <div style={{ display: 'flex', gap: '10px' }}>
                     <PrintsButton rows={selectedRows} />
diff --git a/rsf-admin/src/page/asnOrder/AsnWareModal.jsx b/rsf-admin/src/page/asnOrder/AsnWareModal.jsx
index 3c08bfe..bf73182 100644
--- a/rsf-admin/src/page/asnOrder/AsnWareModal.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnWareModal.jsx
@@ -71,7 +71,7 @@
             return {
                 matnrId: el.id,
                 maktx: el.name,
-                maktxCode: el.code,
+                matnrCode: el.code,
                 stockUnit: el.stockUnit || '',
                 purUnit: el.purchaseUnit || '',
                 ...dynamicFields
@@ -193,7 +193,7 @@
     const [columns, setColumns] = useState([
         // { field: 'id', headerName: 'ID', width: 100 },
         { field: 'name', headerName: translate('table.field.matnr.name'), width: 300 },
-        { field: 'code', headerName: translate('table.field.matnr.code'), width: 100 },
+        { field: 'code', headerName: translate('table.field.matnr.code'), width: 200 },
         { field: 'groupId$', headerName: translate('table.field.matnr.groupId'), width: 100 },
         { field: 'spec', headerName: translate('table.field.matnr.spec'), width: 100 },
         { field: 'model', headerName: translate('table.field.matnr.model'), width: 100 },
diff --git a/rsf-admin/src/page/asnOrderLog/AsnOrderLogPanel.jsx b/rsf-admin/src/page/asnOrderLog/AsnOrderLogPanel.jsx
index 49a6832..e141811 100644
--- a/rsf-admin/src/page/asnOrderLog/AsnOrderLogPanel.jsx
+++ b/rsf-admin/src/page/asnOrderLog/AsnOrderLogPanel.jsx
@@ -120,7 +120,7 @@
         }}>
 
             <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', alignItems: 'center' }}>
-                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} />
+                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} size="small" />
 
                 <div style={{ display: 'flex', gap: '10px' }}>
                 </div>
diff --git a/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx b/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
index 0cb65c3..b30ce29 100644
--- a/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
+++ b/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
@@ -129,11 +129,11 @@
                     omit={['id', 'createTime', 'createBy', 'memo', 'asnId', 'statusBool']}
                 >
                     <NumberField source="id" />
-                    <NumberField source="asnId" label="table.field.qlyInspect.asnId" />
-                    <NumberField source="asnCode" label="table.field.qlyInspect.asnCode" />
                     <TextField source="code" label="table.field.qlyInspect.code" />
                     <TextField source="isptStatus$" label="table.field.qlyInspect.isptStatus" />
                     <TextField source="wkType$" label="table.field.qlyInspect.wkType" />
+                    <NumberField source="asnId" label="table.field.qlyInspect.asnId" />
+                    <NumberField source="asnCode" label="table.field.qlyInspect.asnCode" />
                     <NumberField source="safeQty" label="table.field.qlyInspect.safeQty" />
                     <NumberField source="dlyQty" label="table.field.qlyInspect.dlyQty" />
                     <NumberField source="rcptQty" label="table.field.qlyInspect.rcptQty" />
diff --git a/rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx b/rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx
index 6abfaa5..427d182 100644
--- a/rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx
+++ b/rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx
@@ -47,13 +47,19 @@
         },
         {
             field: 'matnrCode',
-            headerName: translate('table.field.qlyIsptItem.matnrCode')
+            headerName: translate('table.field.qlyIsptItem.matnrCode'),
+            width: 200
         },
         {
             field: 'maktx',
             headerName: translate('table.field.qlyIsptItem.maktx'),
             width: 200
         },
+        // {
+        //     field: 'trackCode',
+        //     headerName: translate('table.field.qlyIsptItem.trackCode'),
+        //     width: 200
+        // },
         // {
         //     field: 'label',
         //     headerName: translate('table.field.qlyIsptItem.label')
@@ -91,9 +97,13 @@
             headerName: translate('table.field.qlyIsptItem.safeQty')
         },
         {
-            field: 'picPath',
-            headerName: translate('table.field.qlyIsptItem.picPath')
-        }
+            field: 'isptResult$',
+            headerName: translate('table.field.qlyIsptItem.isptResult')
+        },
+        // {
+        //     field: 'picPath',
+        //     headerName: translate('table.field.qlyIsptItem.picPath')
+        // }
     ];
 
     const maktxChange = (value) => {
@@ -107,7 +117,7 @@
         }}>
 
             <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', alignItems: 'center' }}>
-                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} />
+                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} size="small" />
 
                 <div style={{ display: 'flex', gap: '10px' }}>
                 </div>
diff --git a/rsf-admin/src/page/task/TaskList.jsx b/rsf-admin/src/page/task/TaskList.jsx
index 4866fb1..64b1462 100644
--- a/rsf-admin/src/page/task/TaskList.jsx
+++ b/rsf-admin/src/page/task/TaskList.jsx
@@ -31,6 +31,7 @@
     ReferenceArrayInput,
     AutocompleteInput,
     DeleteButton,
+    Button,
 } from 'react-admin';
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
@@ -39,6 +40,10 @@
 import EmptyData from "../components/EmptyData";
 import MyCreateButton from "../components/MyCreateButton";
 import MyExportButton from '../components/MyExportButton';
+import SwapVertIcon from '@mui/icons-material/SwapVert';
+import AlignVerticalTopIcon from '@mui/icons-material/AlignVerticalTop';
+import TaskAltIcon from '@mui/icons-material/TaskAlt';
+import CancelIcon from '@mui/icons-material/Cancel';
 import PageDrawer from "../components/PageDrawer";
 import MyField from "../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
@@ -62,7 +67,6 @@
     <SearchInput source="condition" alwaysOn />,
     <DateInput label='common.time.after' source="timeStart" alwaysOn />,
     <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
-
     <TextInput source="taskCode" label="table.field.task.taskCode" />,
     <NumberInput source="taskStatus" label="table.field.task.taskStatus" />,
     <NumberInput source="taskType" label="table.field.task.taskType" />,
@@ -78,7 +82,6 @@
     <TextInput source="expCode" label="table.field.task.expCode" />,
     <DateInput source="startTime" label="table.field.task.startTime" />,
     <DateInput source="endTime" label="table.field.task.endTime" />,
-
     <TextInput label="common.field.memo" source="memo" />,
     <SelectInput
         label="common.field.status"
@@ -93,7 +96,6 @@
 
 const TaskList = () => {
     const translate = useTranslate();
-
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
 
@@ -109,26 +111,33 @@
                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.task"}
-                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                // empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                 filters={filters}
                 sort={{ field: "create_time", order: "desc" }}
                 actions={(
                     <TopToolbar>
                         <FilterButton />
-                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */}
                         <SelectColumnsButton preferenceKey='task' />
-                        <MyExportButton />
+                        {/* <MyExportButton /> */}
                     </TopToolbar>
                 )}
                 perPage={DEFAULT_PAGE_SIZE}
             >
                 <StyledDatagrid
                     preferenceKey='task'
-                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    // bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    bulkActionButtons={
+                        <>
+                            <BulkResortButton />
+                            <BulkCancelButton />
+                            <BulkDeleteButton mutationMode={OPERATE_MODE} />
+                        </>
+                    }
                     rowClick={(id, resource, record) => false}
-                    expand={() => <TaskPanel />}
-                    expandSingle={true}
-                    omit={['id', 'createTime', 'createBy', 'memo']}
+                    // expand={() => <TaskPanel />}
+                    // expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo', 'robotCode', 'exceStatus', 'expDesc', 'expCode', 'sort']}
                 >
                     <NumberField source="id" />
                     <TextField source="taskCode" label="table.field.task.taskCode" />
@@ -155,15 +164,17 @@
                     <BooleanField source="statusBool" label="common.field.status" sortable={false} />
                     <TextField source="memo" label="common.field.memo" sortable={false} />
                     <WrapperField cellClassName="opt" label="common.field.opt">
-                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
-                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                        {/* <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} /> */}
+                        <DoneButton sx={{ padding: '1px', fontSize: '.75rem' }} ></DoneButton>
+                        <CancelButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                        <SetTopButton sx={{ padding: '1px', fontSize: '.75rem' }} ></SetTopButton>
                     </WrapperField>
                 </StyledDatagrid>
             </List>
-            <TaskCreate
+            {/* <TaskCreate
                 open={createDialog}
                 setOpen={setCreateDialog}
-            />
+            /> */}
             <PageDrawer
                 title='Task Detail'
                 drawerVal={drawerVal}
@@ -175,3 +186,102 @@
 }
 
 export default TaskList;
+/**
+ * 瀹屾垚鎿嶄綔
+ * @returns 
+ */
+const DoneButton = () => {
+    const record = useRecordContext();
+    const clickComplete = () => {
+        completeTask([record])
+    };
+    //瀹屾垚浠诲姟
+    const completeTask = async (row) => { }
+    return (
+        <Button
+            onClick={clickComplete}
+            label="toolbar.complete">
+            <TaskAltIcon />
+        </Button>
+    )
+}
+
+/**
+ * 鍙栨秷鎸夐挳
+ * @returns 
+ */
+const CancelButton = () => {
+    const record = useRecordContext();
+    const clickCancel = () => {
+        cancleTask([record])
+    };
+    //鍙栨秷浠诲姟
+    const cancleTask = async (row) => {}
+    return (
+        <Button
+            onClick={clickCancel}
+            label="toolbar.cancel">
+            <CancelIcon />
+        </Button>
+    )
+}
+/**
+ *  缃《鎿嶄綔
+ * @returns 
+ */
+const SetTopButton = () => {
+    const record = useRecordContext();
+    const clickTop = () => {
+        topTask([record])
+    };
+    //缃《浠诲姟
+    const topTask = async (row) => { }
+    return (
+        <Button
+            onClick={clickTop}
+            label="toolbar.top">
+            <AlignVerticalTopIcon />
+        </Button>
+    )
+}
+
+/**
+ * 鎵归噺鍙栨秷
+ * @returns 
+ */
+const BulkCancelButton = () => {
+    const record = useRecordContext();
+    const clickCancel = () => {
+        cancleTask([record])
+    };
+    //鍙栨秷浠诲姟
+    const cancleTask = async (row) => {}
+    return (
+        <Button
+            onClick={clickCancel}
+            label="toolbar.cancel">
+            <CancelIcon />
+        </Button>
+    )
+}
+
+/**
+ * 鎵归噺鎺掑簭
+ * @returns 
+ */
+const BulkResortButton = () => {
+    const record = useRecordContext();
+    const bulkResort = () => {
+        resortTask([record])
+    };
+    //鎵归噺鎺掑簭
+    const resortTask = async (row) => { }
+    return (
+        <Button
+            onClick={bulkResort}
+            label="toolbar.resort">
+            <SwapVertIcon />
+        </Button>
+    )
+
+}
\ No newline at end of file
diff --git a/rsf-admin/src/page/taskItem/TaskItemCreate.jsx b/rsf-admin/src/page/taskItem/TaskItemCreate.jsx
index 5cb91ab..02bdbd1 100644
--- a/rsf-admin/src/page/taskItem/TaskItemCreate.jsx
+++ b/rsf-admin/src/page/taskItem/TaskItemCreate.jsx
@@ -110,13 +110,6 @@
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.taskItem.sourceCode"
-                                        source="sourceCode"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
                                     <NumberInput
                                         label="table.field.taskItem.matnrId"
                                         source="matnrId"
diff --git a/rsf-admin/src/page/taskItem/TaskItemEdit.jsx b/rsf-admin/src/page/taskItem/TaskItemEdit.jsx
index 8d6d4e8..df2b7b6 100644
--- a/rsf-admin/src/page/taskItem/TaskItemEdit.jsx
+++ b/rsf-admin/src/page/taskItem/TaskItemEdit.jsx
@@ -89,13 +89,6 @@
                             />
                         </Stack>
                         <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.taskItem.sourceCode"
-                                source="sourceCode"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
                             <NumberInput
                                 label="table.field.taskItem.matnrId"
                                 source="matnrId"
diff --git a/rsf-admin/src/page/taskItem/TaskItemList.jsx b/rsf-admin/src/page/taskItem/TaskItemList.jsx
index 8b26126..e92a6b7 100644
--- a/rsf-admin/src/page/taskItem/TaskItemList.jsx
+++ b/rsf-admin/src/page/taskItem/TaskItemList.jsx
@@ -74,7 +74,6 @@
     <TextInput source="batch" label="table.field.taskItem.batch" />,
     <TextInput source="spec" label="table.field.taskItem.spec" />,
     <TextInput source="model" label="table.field.taskItem.model" />,
-
     <TextInput label="common.field.memo" source="memo" />,
     <SelectInput
         label="common.field.status"
diff --git a/rsf-admin/src/page/waitPakin/WaitPakinPanel.jsx b/rsf-admin/src/page/waitPakin/WaitPakinPanel.jsx
index 433c2e8..9161c74 100644
--- a/rsf-admin/src/page/waitPakin/WaitPakinPanel.jsx
+++ b/rsf-admin/src/page/waitPakin/WaitPakinPanel.jsx
@@ -103,7 +103,7 @@
         }}>
 
             <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', alignItems: 'center' }}>
-                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} />
+                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} size="small" />
 
                 <div style={{ display: 'flex', gap: '10px' }}>
                 </div>
diff --git a/rsf-admin/src/page/waitPakinLog/WaitPakinLogPanel.jsx b/rsf-admin/src/page/waitPakinLog/WaitPakinLogPanel.jsx
index 492ade2..d8975d2 100644
--- a/rsf-admin/src/page/waitPakinLog/WaitPakinLogPanel.jsx
+++ b/rsf-admin/src/page/waitPakinLog/WaitPakinLogPanel.jsx
@@ -93,7 +93,7 @@
         }}>
 
             <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', alignItems: 'center' }}>
-                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} />
+                <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} size="small" />
 
                 <div style={{ display: 'flex', gap: '10px' }}>
                 </div>
diff --git a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
index 566972b..999b8d4 100644
--- a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
+++ b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
@@ -135,7 +135,7 @@
                     <NumberField source="matnrId" label="table.field.warehouseAreasItem.matnrId" />
                     <TextField source="matnrName" label="table.field.warehouseAreasItem.matnrName" />
                     <TextField source="matnrCode" label="table.field.warehouseAreasItem.matnrCode" />
-                    <TextField source="trackCode" label="table.field.warehouseAreasItem.barcode" />
+                    <TextField source="barcode" label="table.field.warehouseAreasItem.barcode" />
                     <NumberField source="anfme" label="table.field.warehouseAreasItem.anfme" />
                     <TextField source="batch" label="table.field.warehouseAreasItem.batch" />
                     <TextField source="unit" label="table.field.warehouseAreasItem.unit" />
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
index ac02aaa..7729419 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
@@ -1,14 +1,13 @@
 package com.vincent.rsf.server.api.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.api.controller.params.CheckObjParams;
+import com.vincent.rsf.server.api.controller.params.OpStockParams;
 import com.vincent.rsf.server.api.controller.params.OtherReceiptParams;
 import com.vincent.rsf.server.api.controller.params.ReceiptParams;
 import com.vincent.rsf.server.api.service.MobileService;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
-import com.vincent.rsf.server.manager.entity.AsnOrderItem;
 import com.vincent.rsf.server.manager.entity.QlyIsptItem;
 import com.vincent.rsf.server.system.controller.BaseController;
 import com.vincent.rsf.server.system.controller.param.LoginParam;
@@ -88,7 +87,6 @@
        }
         return mobileService.receiptToWarehouse(params);
     }
-
 
     @PreAuthorize("hasAuthority('manager:asnOrder:list')")
     @PostMapping("/orders/other")
@@ -186,6 +184,7 @@
         return  mobileService.confirmIspt(id);
     }
 
+    @ApiOperation("蹇�熻川妫�淇℃伅")
     @PreAuthorize("hasAuthority('manager:qlyInspect:list')")
     @PostMapping("/inspect/query")
     public R checkObjs(@RequestBody CheckObjParams params) {
@@ -196,12 +195,23 @@
     }
 
 
+    @ApiOperation("蹇甫璐ㄦ")
     @PreAuthorize("hasAuthority('manager:qlyInspect:update')")
     @PostMapping("/inspect/check/update")
     public R checkUpdate(@RequestBody QlyIsptItem params) {
         if (Objects.isNull(params)) {
-            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
         return mobileService.checkUpdate(params);
     }
+
+    @ApiOperation("鑾峰彇涓婃灦淇℃伅")
+    @PreAuthorize("hasAuthority('manager:qlyInspect:list')")
+    @PostMapping("/stock/operate")
+    public R operateToStock(@RequestBody OpStockParams params) {
+        if (Objects.isNull(params)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return mobileService.operateToStock(params);
+    }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OpStockParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OpStockParams.java
new file mode 100644
index 0000000..a0f2e0a
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OpStockParams.java
@@ -0,0 +1,19 @@
+package com.vincent.rsf.server.api.controller.params;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "OpStockParams", description = "浜哄伐涓婃灦鍙傛暟")
+public class OpStockParams {
+
+    @ApiModelProperty("鎷栫洏鐮�")
+    private String barcode;
+    @ApiModelProperty("鍗曞彿")
+    private String asnCode;
+    @ApiModelProperty("鐗╂枡缂栫爜")
+    private String matnrCode;
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/CheckObjDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/CheckObjDto.java
index ead8f00..241379c 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/CheckObjDto.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/CheckObjDto.java
@@ -14,6 +14,8 @@
 
     private static final long serialVersionUID = 1L;
 
+    @ApiModelProperty("ID")
+    private Long id;
     @ApiModelProperty("璐ㄦ鍗�")
     private String isptCode;
     @ApiModelProperty("鐗╂枡缂栫爜")
@@ -28,12 +30,16 @@
     private String splrBatch;
     @ApiModelProperty("鏀惰揣鏁伴噺")
     private Double rcptQty;
+    @ApiModelProperty("閫佽揣鏁伴噺")
+    private Double dlyQty;
     @ApiModelProperty("鍚堟牸鏁伴噺")
     private Double safeQty;
     @ApiModelProperty("涓嶅悎鏍兼暟閲�")
     private Double disQty;
     @ApiModelProperty("鍥剧墖璺緞")
     private String picPath;
+    @ApiModelProperty("璐ㄦ缁撴灉")
+    private String isptResult;
     @ApiModelProperty("澶囨敞")
     private String memo;
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/OperateStockDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/OperateStockDto.java
new file mode 100644
index 0000000..861b04d
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/OperateStockDto.java
@@ -0,0 +1,8 @@
+package com.vincent.rsf.server.api.entity.dto;
+
+import com.vincent.rsf.server.manager.entity.AsnOrderItem;
+
+public class OperateStockDto extends AsnOrderItem {
+
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java
index 53568c0..5fc1dfc 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java
@@ -2,16 +2,13 @@
 
 public enum TaskStsType {
 
+    //浠诲姟鐘舵��
     GENERATE_IN(1L, "鍒涘缓鍏ュ簱浠诲姟"),
     WCS_EXECUTE_IN(2L, "RCS浠诲姟宸蹭笅鍙�"),
     WCS_CONTAINER_RECEIVE(3L, "RCS瀹瑰櫒鍒拌揪"),
-
     WCS_CONVEYOR_START(4L, "RCS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙�"),
-
     WCS_TOTE_LOAD(5L, "RCS鍙栫瀹屾垚"),
-
     WCS_TOTE_UNLOAD(6L, "RCS鏀剧瀹屾垚"),
-
     WCS_PUTAWAY_SUCESS(7L, "RCS浠诲姟瀹屾垚"),
 
 //    WCS_PUTAWAY_FAILED(11L, "浠诲姟澶辫触"),
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
index 173025d..76c5b8c 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
@@ -2,6 +2,7 @@
 
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.server.api.controller.params.CheckObjParams;
+import com.vincent.rsf.server.api.controller.params.OpStockParams;
 import com.vincent.rsf.server.api.controller.params.OtherReceiptParams;
 import com.vincent.rsf.server.api.controller.params.ReceiptParams;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
@@ -50,4 +51,6 @@
     R checkObjs(CheckObjParams params);
 
     R checkUpdate(QlyIsptItem params);
+
+    R operateToStock(OpStockParams params);
 }
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 e53bd94..bced611 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
@@ -5,6 +5,7 @@
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.api.controller.params.CheckObjParams;
+import com.vincent.rsf.server.api.controller.params.OpStockParams;
 import com.vincent.rsf.server.api.controller.params.OtherReceiptParams;
 import com.vincent.rsf.server.api.controller.params.ReceiptParams;
 import com.vincent.rsf.server.api.entity.dto.CheckObjDto;
@@ -35,7 +36,7 @@
 import com.vincent.rsf.server.system.service.FieldsService;
 import com.vincent.rsf.server.system.service.UserLoginService;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
-import org.apache.tika.utils.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -107,6 +108,9 @@
     @Autowired
     private FieldsItemService fieldsItemService;
 
+    @Autowired
+    private LocService locService;
+
 
     /**
      * @author Ryan
@@ -152,7 +156,7 @@
      */
     @Override
     public R getOrderByCode(String barcode) {
-        if (StringUtils.isEmpty(barcode)) {
+        if (StringUtils.isBlank(barcode)) {
             return R.error("鏍囩鐮佷笉鑳戒负绌猴紒锛�");
         }
         List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getTrackCode, barcode));
@@ -522,10 +526,13 @@
         CheckObjDto objDto = new CheckObjDto();
         objDto.setIsptCode(inspect.getCode())
                 .setAsnCode(inspect.getAsnCode())
+                .setId(isptItem.getId())
                 .setMatnrCode(isptItem.getMatnrCode())
                 .setMaktx(isptItem.getMaktx())
                 .setDisQty(isptItem.getDisQty())
+                .setDlyQty(isptItem.getDlyQty())
                 .setRcptQty(isptItem.getRcptQty())
+                .setIsptResult(isptItem.getIsptResult())
                 .setSplrBatch(isptItem.getSplrBatch())
                 .setSplrName(isptItem.getSplrName())
                 .setPicPath(isptItem.getPicPath())
@@ -541,7 +548,7 @@
      */
     @Override
     public R checkUpdate(QlyIsptItem params) {
-        if (Objects.isNull(params.getId()) || Objects.isNull(params.getIspectId())) {
+        if (Objects.isNull(params.getId())) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
         IsptItemsParams itemsParams = new IsptItemsParams();
@@ -556,6 +563,50 @@
     }
 
     /**
+    * @author Ryan
+    * @description 浜哄伐涓婃灦
+    * @param
+    * @return
+    * @time 2025/4/2 16:33
+    */
+    @Override
+    public R operateToStock(OpStockParams params) {
+        if (org.apache.commons.lang3.StringUtils.isBlank(params.getBarcode())) {
+            throw new CoolException("鎷栫洏鐮佷笉鑳戒负绌猴紒锛�");
+        }
+        if (StringUtils.isBlank(params.getAsnCode())) {
+            throw new CoolException("鍗曟嵁涓嶈兘涓虹┖锛侊紒");
+        }
+        if (StringUtils.isBlank(params.getMatnrCode())) {
+            throw new CoolException("鐗╂枡缂栫爜涓嶈兘涓虹┖锛侊紒");
+        }
+        AsnOrder asnOrders = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, params.getAsnCode()));
+        if (Objects.isNull(asnOrders)) {
+            throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
+        }
+        List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, params.getBarcode()));
+        if (!locs.isEmpty()) {
+            throw new CoolException("鎷栫洏宸蹭娇鐢�");
+        }
+        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, params.getBarcode()));
+        if (!waitPakins.isEmpty()) {
+            throw new CoolException("鎷栫洏宸蹭娇鐢�!!");
+        }
+        List<AsnOrderItem> orderItems = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>()
+                .eq(AsnOrderItem::getAsnId, asnOrders.getId())
+                .eq(AsnOrderItem::getMatnrCode, params.getMatnrCode()));
+        if (orderItems.isEmpty()) {
+            throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�");
+        }
+        List<AsnOrderItem> stocks = new ArrayList<>();
+        orderItems.forEach(item -> {
+            item.setBarcode(params.getBarcode());
+            stocks.add(item);
+        });
+        return R.ok(stocks);
+    }
+
+    /**
      * 鑾峰彇ReceiptDetlsDtos
      */
     private R getAsnOrderItem(List<AsnOrderItem> items) {
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
new file mode 100644
index 0000000..9f88a5c
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
@@ -0,0 +1,49 @@
+package com.vincent.rsf.server.common;
+
+
+import com.vincent.rsf.framework.generators.ReactGenerator;
+import com.vincent.rsf.framework.generators.constant.SqlOsType;
+
+/**
+ * Created by vincent on 2019-06-04
+ */
+public class CodeBuilder {
+
+    public static void main(String[] args) throws Exception {
+        ReactGenerator generator = new ReactGenerator();
+        generator.backendPrefixPath = "rsf-server/";
+        generator.frontendPrefixPath = "rsf-admin/";
+
+        generator.sqlOsType = SqlOsType.MYSQL;
+        generator.url="192.168.4.24:3306/rsf";
+        generator.username="root";
+        generator.password="34821015";
+//        generator.url="47.97.1.152:51433;databasename=jkasrs";
+//        generator.username="sa";
+//        generator.password="Zoneyung@zy56$";
+
+        generator.table="man_ispt_histories";
+        generator.tableDesc="浠诲姟宸ヤ綔妗�";
+        generator.packagePath="com.vincent.rsf.server.manager";
+
+        generator.build();
+    }
+/*
+ CREATE TABLE `man_tablename` (
+ `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `code` VARCHAR(255) DEFAULT NULL COMMENT '缂栧彿',
+ `name` VARCHAR(255) DEFAULT NULL COMMENT '鍚嶇О(*)',
+ `status` INT(1) NOT NULL DEFAULT '1' COMMENT '鐘舵�亄1:姝e父,0:鍐荤粨}',
+ `deleted` INT(1) NOT NULL DEFAULT '0' COMMENT '鏄惁鍒犻櫎{1:鏄�,0:鍚',
+ `tenant_id` INT(11) DEFAULT NULL COMMENT '绉熸埛[sys_tenant]',
+ `create_by` BIGINT(20) DEFAULT NULL COMMENT '娣诲姞浜哄憳[sys_user]',
+ `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '娣诲姞鏃堕棿',
+ `update_by` BIGINT(20) DEFAULT NULL COMMENT '淇敼浜哄憳[sys_user]',
+ `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '淇敼鏃堕棿',
+ `memo` VARCHAR(255) DEFAULT NULL COMMENT '澶囨敞',
+ PRIMARY KEY (`id`)
+ ) ENGINE=INNODB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
+ */
+
+}
+
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
index 2805e07..ced3cec 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
@@ -4,6 +4,7 @@
 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.framework.exception.CoolException;
 import com.vincent.rsf.server.common.utils.ExcelUtil;
 import com.vincent.rsf.server.common.annotation.OperationLog;
 import com.vincent.rsf.server.common.domain.BaseParam;
@@ -14,6 +15,7 @@
 import com.vincent.rsf.server.manager.service.TaskItemService;
 import com.vincent.rsf.server.manager.service.TaskService;
 import com.vincent.rsf.server.system.controller.BaseController;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
@@ -121,4 +123,15 @@
         ExcelUtil.build(ExcelUtil.create(taskService.list(), Task.class), response);
     }
 
+
+    @PreAuthorize("hasAuthority('manager:task:update')")
+    @ApiOperation("瀹屾垚浠诲姟")
+    @GetMapping("/task/complete/{id}")
+    public R completeTask(@PathVariable String id) {
+        if (Objects.isNull(id)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return taskService.completeTask(id);
+    }
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinController.java
index 0c29bfe..4a674b5 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinController.java
@@ -11,8 +11,10 @@
 import com.vincent.rsf.server.common.domain.KeyValVo;
 import com.vincent.rsf.server.common.domain.PageParam;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
+import com.vincent.rsf.server.manager.entity.TaskItem;
 import com.vincent.rsf.server.manager.entity.WaitPakin;
 import com.vincent.rsf.server.manager.entity.WaitPakinItem;
+import com.vincent.rsf.server.manager.service.TaskItemService;
 import com.vincent.rsf.server.manager.service.TaskService;
 import com.vincent.rsf.server.manager.service.WaitPakinItemService;
 import com.vincent.rsf.server.manager.service.WaitPakinService;
@@ -22,10 +24,12 @@
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Api(tags = "缁勬嫋閫氱煡妗�")
 @RestController
@@ -39,6 +43,8 @@
 
     @Autowired
     private TaskService taskService;
+    @Autowired
+    private TaskItemService taskItemService;
 
     @PreAuthorize("hasAuthority('manager:waitPakin:list')")
     @PostMapping("/waitPakin/page")
@@ -100,15 +106,23 @@
     @PreAuthorize("hasAuthority('manager:waitPakin:remove')")
     @OperationLog("Delete 缁勬嫋妗�")
     @PostMapping("/waitPakin/remove/{ids}")
+    @Transactional(rollbackFor = Exception.class)
     public R remove(@PathVariable Long[] ids) {
         List<WaitPakinItem> pakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>()
                 .in(WaitPakinItem::getPakinId, ids));
         if (!pakinItems.isEmpty()) {
-            return R.error("缁勬嫋妗f湁鏄庣粏浠诲姟");
+            List<Long> list = pakinItems.stream().map(WaitPakinItem::getId).collect(Collectors.toList());
+            List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getSource, list));
+            if (!taskItems.isEmpty()) {
+                return R.error("缁勬嫋妗f湁鏄庣粏浠诲姟");
+            }
         }
         if (!waitPakinService.removeByIds(Arrays.asList(ids))) {
             return R.error("Delete Fail");
         }
+        if (!waitPakinItemService.removeByIds(pakinItems)) {
+            throw new CoolException("鏄庣粏鍒犻櫎澶辫触锛侊紒");
+        }
         return R.ok("Delete Success").add(ids);
     }
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinItemController.java
index fef2580..edd0274 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinItemController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaitPakinItemController.java
@@ -4,12 +4,15 @@
 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.framework.exception.CoolException;
 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.TaskItem;
 import com.vincent.rsf.server.manager.entity.WaitPakinItem;
+import com.vincent.rsf.server.manager.service.TaskItemService;
 import com.vincent.rsf.server.manager.service.WaitPakinItemService;
 import com.vincent.rsf.server.system.controller.BaseController;
 import io.swagger.annotations.Api;
@@ -26,6 +29,8 @@
 
     @Autowired
     private WaitPakinItemService waitPakinItemService;
+    @Autowired
+    private TaskItemService taskItemService;
 
     @PreAuthorize("hasAuthority('manager:waitPakinItem:list')")
     @PostMapping("/waitPakinItem/page")
@@ -83,6 +88,13 @@
     @OperationLog("Delete 缁勬嫋妗f槑缁�")
     @PostMapping("/waitPakinItem/remove/{ids}")
     public R remove(@PathVariable Long[] ids) {
+        if (Objects.isNull(ids) || ids.length < 1) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getSource, ids));
+        if (!taskItems.isEmpty()) {
+            throw new CoolException("鏈変换鍔℃槑缁嗘湭瀹屾垚");
+        }
         if (!waitPakinItemService.removeByIds(Arrays.asList(ids))) {
             return R.error("Delete Fail");
         }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
index b9a8b68..b2f899c 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
@@ -23,7 +23,6 @@
 public class AsnOrderItem implements Serializable {
 
     private static final long serialVersionUID = 1L;
-
     /**
      * ID
      */
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java
index a80dafc..f2104be 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/QlyIsptItem.java
@@ -36,49 +36,41 @@
     @ApiModelProperty(value= "ID")
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
-
     /**
      * 涓诲崟ID
      */
     @ApiModelProperty(value= "涓诲崟ID")
     private Long ispectId;
-
     @ApiModelProperty("璐ㄦ鍗曠姸鎬�")
     private String isptStatus;
 
     @ApiModelProperty("鍗曟嵁鏄庣粏ID")
     private Long asnItemId;
-
     /**
      * 缂栧彿
      */
     @ApiModelProperty(value= "缂栧彿")
     private String matnrCode;
-
     /**
      * 鐗╂枡鍚嶇О
      */
     @ApiModelProperty(value= "鐗╂枡鍚嶇О")
     private String maktx;
-
     /**
      * 鏍囩
      */
     @ApiModelProperty(value= "鏍囩")
     private String label;
-
     /**鈭�
      * 渚涘簲鍟嗗悕绉�
      */
     @ApiModelProperty(value= "渚涘簲鍟嗗悕绉�")
     private String splrName;
-
     /**
      * 渚涘簲鍟嗘壒娆�
      */
     @ApiModelProperty(value= "渚涘簲鍟嗘壒娆�")
     private String splrBatch;
-
     /**
      * 搴撳瓨鎵规
      */
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 670c7d5..4c92d50 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
@@ -2,6 +2,8 @@
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
+
+import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import java.text.SimpleDateFormat;
@@ -24,6 +26,7 @@
 import java.util.Date;
 
 @Data
+@Accessors(chain = true)
 @TableName("man_stock")
 public class Stock implements Serializable {
 
@@ -40,25 +43,27 @@
      * ASN鍗曟嵁锛� 甯﹀嚭PO鍗�
      */
     @ApiModelProperty(value= "ASN鍗曟嵁锛� 甯﹀嚭PO鍗�")
-    private String asnOrder;
+    private Long asnId;
+    @ApiModelProperty("璁㈠崟缂栫爜")
+    private String asnCode;
 
     /**
      * ERP鍑瘉
      */
-    @ApiModelProperty(value= "ERP鍑瘉")
-    private String erpToken;
+    @ApiModelProperty(value= "plat鍑瘉")
+    private String platToken;
 
     /**
-     * ERP鍗曞彿
+     * plat鍗曞彿
      */
-    @ApiModelProperty(value= "ERP鍗曞彿")
-    private String erpOrder;
+    @ApiModelProperty(value= "plat鍗曞彿")
+    private String platOrderNo;
 
     /**
-     * ERP搴撳瓨鍦板潃
+     * plat搴撳瓨鍦板潃
      */
-    @ApiModelProperty(value= "ERP搴撳瓨鍦板潃")
-    private String erpStkAdr;
+    @ApiModelProperty(value= "plat搴撳瓨鍦板潃")
+    private String platStkAdr;
 
     /**
      * 鍚堝悓鏍囪瘑
@@ -144,11 +149,11 @@
 
     public Stock() {}
 
-    public Stock(String asnOrder,String erpToken,String erpOrder,String erpStkAdr,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.asnOrder = asnOrder;
-        this.erpToken = erpToken;
-        this.erpOrder = erpOrder;
-        this.erpStkAdr = erpStkAdr;
+    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;
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 7abbf6c..d90bbe0 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
@@ -5,6 +5,7 @@
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.vincent.rsf.server.manager.service.*;
+import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.text.SimpleDateFormat;
@@ -22,6 +23,7 @@
 import java.io.Serializable;
 
 @Data
+@Accessors(chain = true)
 @TableName("man_stock_item")
 public class StockItem implements Serializable {
 
@@ -35,10 +37,16 @@
     private Long id;
 
     /**
+     * 浠诲姟鏄庣粏ID
+     */
+    @ApiModelProperty("浠诲姟鏄庣粏ID")
+    private Long taskItemId;
+
+    /**
      * 搴撳瓨澶栭敭鏍囪瘑
      */
     @ApiModelProperty(value= "搴撳瓨澶栭敭鏍囪瘑")
-    private String stockId;
+    private Long stockId;
 
     /**
      * 鐗╂枡鏍囪瘑
@@ -184,29 +192,24 @@
      * 閿佸畾鍘熷洜
      */
     @ApiModelProperty(value= "閿佸畾鍘熷洜")
-    @TableField(exist = false)
     private String lockReason;
 
     /**
      * 閿佸畾鐘舵��
      */
     @ApiModelProperty(value= "閿佸畾鐘舵��")
-    @TableField(exist = false)
     private Short lockStatus;
 
     /**
      * 閿佸畾浜�
      */
     @ApiModelProperty(value= "閿佸畾浜�")
-    @TableField(exist = false)
     private String locker;
 
     /**
      * 閿佸畾鏃堕棿
      */
     @ApiModelProperty(value= "閿佸畾鏃堕棿")
-    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
-    @TableField(exist = false)
     private Date lockedTime;
 
     /**
@@ -262,7 +265,7 @@
 
     public StockItem() {}
 
-    public StockItem(String 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) {
+    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;
         this.matnrId = matnrId;
         this.asnItemId = asnItemId;
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
new file mode 100644
index 0000000..3156c74
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -0,0 +1,123 @@
+package com.vincent.rsf.server.manager.schedules;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.server.api.entity.enums.TaskStsType;
+import com.vincent.rsf.server.manager.entity.*;
+import com.vincent.rsf.server.manager.service.*;
+import com.vincent.rsf.server.system.constant.SerialRuleCode;
+import com.vincent.rsf.server.system.enums.LocStsType;
+import com.vincent.rsf.server.system.utils.SerialRuleUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Array;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @Author Ryan
+ * 浠诲姟宸ヤ綔妗�
+ */
+@Component
+public class TaskSchedules {
+
+    @Autowired
+    private TaskService taskService;
+    @Autowired
+    private TaskItemService taskItemService;
+    @Autowired
+    private StockItemService stockItemService;
+    @Autowired
+    private PurchaseService purchaseService;
+    @Autowired
+    private AsnOrderService asnOrderService;
+    @Autowired
+    private AsnOrderItemService asnOrderItemService;
+    @Autowired
+    private StockService stockService;
+    @Autowired
+    private LocService locService;
+    /**
+    * @author Ryan
+    * @description 瀹屾垚鍏ュ簱锛屾洿鏂板簱瀛�
+    * @param
+    * @return
+    * @time 2025/4/2 12:37
+    */
+    @Scheduled(cron = "0 0/05 * * * ?  ")
+//  @Scheduled(cron = "0/5 * * * * ?")
+    @Transactional(rollbackFor = Exception.class)
+    public void completeInStock() {
+        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id));
+        if (tasks.isEmpty()) {
+            return;
+        }
+        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("浠诲姟鏄庣粏涓虹┖锛侊紒");
+        }
+        /**瀵逛换鍔℃槑缁嗘寜璁㈠崟杩涜鍒嗙粍*/
+        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()));
+                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 = taskService.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("搴撳瓨淇敼鏋跺け璐ワ紒锛�");
+            }
+        });
+        /**淇敼搴撲綅鐘舵�佷负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("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
+    }
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
index 8051c06..b2ee0b1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -10,4 +10,6 @@
 public interface TaskService extends IService<Task> {
 
     R generateTasks(List<WaitPakin> waitPakin, Long loginUserId);
+
+    R completeTask(String id);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
index d5f0293..b385eed 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
@@ -59,6 +59,9 @@
             throw new CoolException("ASN鍗曟嵁涓嶈兘涓虹┖锛侊紒");
         }
         List<PoItemsDto> items = purchaseMapper.poList(asnIds);
+        if (items.isEmpty()) {
+            throw new CoolException("鐗╂枡鎵�灞為噰璐崟鎹笉瀛樺湪锛侊紒");
+        }
         if (reportMsgService.reportInspectNotify(items)) {
             return true;
         } else {
@@ -74,7 +77,6 @@
         List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>()
                 .like(!Objects.isNull(params.get("maktx")), AsnOrderItem::getMaktx, params.get("maktx"))
                 .eq(!Objects.isNull(params.get("matnrCode")), AsnOrderItem::getMatnrCode, params.get("matnrCode")));
-
         if (orderItems.isEmpty()) {
             return new ArrayList<>();
         }
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 cd40c71..69a060d 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
@@ -1,6 +1,7 @@
 package com.vincent.rsf.server.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.vincent.rsf.server.api.entity.enums.OrderType;
 import com.vincent.rsf.server.api.entity.enums.TaskStsType;
 import com.vincent.rsf.framework.common.R;
@@ -12,11 +13,13 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vincent.rsf.server.manager.utils.LocManageUtil;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
+import com.vincent.rsf.server.system.enums.LocStsType;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -32,6 +35,9 @@
     private TaskItemService taskItemService;
     @Autowired
     private WaitPakinItemService waitPakinItemService;
+    @Autowired
+    private LocService locService;
+
 
 
 
@@ -44,7 +50,8 @@
      * @time 2025/3/29 15:59
      */
     @Override
-    public R generateTasks(List<WaitPakin> waitPakin, Long loginUserId) {
+    @Transactional(rollbackFor = Exception.class)
+    public synchronized R generateTasks(List<WaitPakin> waitPakin, Long loginUserId) {
         if (Objects.isNull(waitPakin) || waitPakin.isEmpty()) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
@@ -73,6 +80,11 @@
             if (!this.save(task)) {
                 throw new CoolException("浠诲姟淇濆瓨澶辫触锛侊紒");
             }
+            if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getCode, pakin.getCode())
+                    .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type).set(Loc::getBarcode, pakin.getBarcode()))) {
+                throw new CoolException("搴撲綅棰勭害澶辫触锛侊紒");
+            }
+
             /**鑾峰彇缁勬嫋鏄庣粏**/
             List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakin.getId()));
             if (waitPakinItems.isEmpty()) {
@@ -93,14 +105,23 @@
             if (!taskItemService.saveBatch(taskItems)) {
                 throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒");
             }
-
-
-
         });
-        //TODO 浠诲姟鐢熸垚瀹屾垚闇�淇敼浠诲姟ASN璁㈠崟鐘舵�佷负鎵ц涓紝缁勬嫋鍒犻櫎闇�鍒ゆ柇鏄惁鏈夊瓙浠诲姟鍦ㄦ墽琛�
 
         return R.ok("浠诲姟鐢熸垚瀹屾瘯锛�");
     }
 
+    /**
+    * @author Ryan
+    * @description 瀹屾垚浠诲姟
+    * @param
+    * @return
+    * @time 2025/4/2 11:15
+    */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R completeTask(String id) {
+        return null;
+    }
+
 
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java
index 81875e9..cc8f42a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java
@@ -5,20 +5,15 @@
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.manager.controller.params.PakinItem;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
-import com.vincent.rsf.server.manager.entity.AsnOrder;
-import com.vincent.rsf.server.manager.entity.AsnOrderItem;
-import com.vincent.rsf.server.manager.entity.WaitPakinItem;
+import com.vincent.rsf.server.manager.entity.*;
 import com.vincent.rsf.server.manager.mapper.WaitPakinMapper;
-import com.vincent.rsf.server.manager.entity.WaitPakin;
-import com.vincent.rsf.server.manager.service.AsnOrderItemService;
-import com.vincent.rsf.server.manager.service.AsnOrderService;
-import com.vincent.rsf.server.manager.service.WaitPakinItemService;
-import com.vincent.rsf.server.manager.service.WaitPakinService;
+import com.vincent.rsf.server.manager.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.parameters.P;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -40,6 +35,8 @@
     private WaitPakinService waitPakinService;
     @Autowired
     private WaitPakinItemService waitPakinItemService;
+    @Autowired
+    private LocService locService;
 
     /**
      * @author Ryan
@@ -58,6 +55,20 @@
             throw new CoolException("鍙傛暟閿欒锛氭墭鐩樼爜涓虹┖锛侊紒");
         }
 
+        List<WaitPakin> list = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, waitPakin.getBarcode()));
+        if (!list.isEmpty()) {
+            List<String> stringList = list.stream().map(WaitPakin::getCode).collect(Collectors.toList());
+            String join = StringUtils.join(stringList, ",");
+            throw new CoolException("鎷栫洏鐮侊細" + waitPakin.getBarcode() + "宸茶缁勬嫋鍗曪細" + join + "浣跨敤锛侊紒");
+        }
+
+        List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, waitPakin.getBarcode()));
+        if (!locs.isEmpty()) {
+            List<String> locCodes = locs.stream().map(Loc::getCode).collect(Collectors.toList());
+            String join = StringUtils.join(locCodes, ",");
+            throw new CoolException("鎷栫洏鐮侊細" + waitPakin.getBarcode() + "宸茶搴撲綅锛�" + join + "浣跨敤锛侊紒");
+        }
+
         double sum = waitPakin.getItems().stream().mapToDouble(PakinItem::getReceiptQty).sum();
 
         WaitPakin pakin = new WaitPakin();
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 cb7bab2..9c1961c 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
@@ -48,4 +48,9 @@
      * 浠诲姟缂栫爜鐢熸垚瑙勫垯
      */
     public final static String SYS_TASK_CODE = "sys_task_code";
+
+    /**
+     * 浠撳簱缂栫爜瑙勫垯
+     */
+    public final static String SYS_STOCK_CODE = "sys_stock_code";
 }
diff --git a/rsf-server/src/main/resources/application.yml b/rsf-server/src/main/resources/application.yml
index 4a03079..a844729 100644
--- a/rsf-server/src/main/resources/application.yml
+++ b/rsf-server/src/main/resources/application.yml
@@ -23,7 +23,7 @@
   #  global-config:
   #    field-strategy: 0
   configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
     map-underscore-to-camel-case: true
     cache-enabled: true
     call-setters-on-nulls: true

--
Gitblit v1.9.1