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

---
 rsf-admin/src/page/taskLog/index.jsx                                                            |   18 
 rsf-admin/src/page/taskLog/TaskLogEdit.jsx                                                      |  188 +++++
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java                 |    6 
 rsf-admin/src/page/taskItem/TaskItemList.jsx                                                    |   21 
 rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java                         |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java                |    4 
 rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx                                |    2 
 rsf-admin/src/page/taskItemLog/index.jsx                                                        |   18 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java                    |   21 
 rsf-admin/src/page/taskItemLog/TaskItemLogList.jsx                                              |  171 ++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java                        |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java   |   78 ++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java                    |   12 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/StockItem.java                   |    8 
 rsf-admin/src/i18n/en.js                                                                        |   38 +
 rsf-admin/src/page/ResourceContent.js                                                           |    7 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java      |   15 
 rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx                                                   |   18 
 rsf-admin/src/page/taskLog/TaskLogList.jsx                                                      |  181 ++++
 rsf-admin/src/page/qlyInspect/QlyInspectList.jsx                                                |   24 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.java                 |    3 
 rsf-admin/src/page/basicInfo/loc/InitModal.jsx                                                  |    7 
 rsf-admin/src/page/task/TaskList.jsx                                                            |   39 
 rsf-admin/src/page/waitPakin/WaitPakinList.jsx                                                  |   35 
 rsf-admin/src/page/taskItemLog/TaskItemLogPanel.jsx                                             |  147 +++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java            |   55 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java  |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java             |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java         |  105 -
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java       |    7 
 rsf-admin/src/page/taskItemLog/TaskItemLogEdit.jsx                                              |  188 +++++
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/TaskQueueDto.java                |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java                 |    3 
 rsf-admin/src/i18n/zh.js                                                                        |   46 +
 rsf-admin/src/page/taskLog/TaskLogCreate.jsx                                                    |  216 +++++
 rsf-admin/src/page/taskItemLog/TaskItemLogCreate.jsx                                            |  216 +++++
 rsf-server/src/main/resources/application-dev.yml                                               |    4 
 rsf-admin/src/page/asnOrder/AsnOrderList.jsx                                                    |   33 
 rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java               |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockItemController.java     |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java                  |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java            |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java            |    1 
 rsf-admin/src/page/basicInfo/loc/LocList.jsx                                                    |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java                     |    3 
 rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx                                        |   14 
 rsf-admin/src/page/taskLog/TaskLogPanel.jsx                                                     |  147 +++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java          |   50 +
 rsf-admin/src/page/asnOrder/AsnOrderModal.jsx                                                   |    4 
 50 files changed, 2,032 insertions(+), 156 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 3f3392d..2e67cf6 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -155,6 +155,8 @@
         waitPakinItem: 'WaitPakinItem',
         task: 'Task',
         taskItem: 'TaskItem',
+        taskItemLog: 'TaskItemLog',
+        taskLog: 'TaskLog',
     },
     table: {
         field: {
@@ -684,6 +686,24 @@
                 startTime: "startTime",
                 endTime: "endTime",
             },
+            taskLog: {
+                taskId: "taskId",
+                taskCode: "taskCode",
+                taskStatus: "taskStatus",
+                taskType: "taskType",
+                orgLoc: "orgLoc",
+                orgSite: "orgSite",
+                targLoc: "targLoc",
+                targSite: "targSite",
+                barcode: "barcode",
+                robotCode: "robotCode",
+                exceStatus: "exceStatus",
+                expDesc: "expDesc",
+                sort: "sort",
+                expCode: "expCode",
+                startTime: "startTime",
+                endTime: "endTime",
+            },
             taskItem: {
                 taskId: "taskId",
                 orderId: "orderId",
@@ -693,6 +713,23 @@
                 matnrId: "matnrId",
                 maktx: "maktx",
                 matnrCode: "matnrCode",
+                unit: "unit",
+                anfme: "anfme",
+                batch: "batch",
+                spec: "spec",
+                model: "model",
+            },
+            taskItemLog: {
+                taskItemId: "taskItemId",
+                taskId: "taskId",
+                orderId: "orderId",
+                orderType: "orderType",
+                orderItemId: "orderItemId",
+                source: "source",
+                matnrId: "matnrId",
+                maktx: "maktx",
+                matnrCode: "matnrCode",
+                trackCode: "trackCode",
                 unit: "unit",
                 anfme: "anfme",
                 batch: "batch",
@@ -802,6 +839,7 @@
         complete: "complete",
         close: "close",
         asnCreate: "asnCreate",
+        createTask: "createTask",
     },
 };
 
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 52264fc..c19a91a 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -157,6 +157,8 @@
         waitPakinItemLog: '缁勬嫋鍘嗗彶妗f槑缁�',
         task: '浠诲姟宸ヤ綔妗�',
         taskItem: '浠诲姟妗f槑缁�',
+        taskLog: '浠诲姟鍘嗗彶妗�',
+        taskItemLog: '浠诲姟鏄庣粏鍘嗗彶妗�',
     },
     table: {
         field: {
@@ -311,9 +313,9 @@
             },
             warehouseAreas: {
                 uuid: "鍞竴缂栫爜",
-                name: "鍚嶇О",
+                name: "搴撳尯鍚嶇О",
                 wareId: "鎵�灞炰粨搴�",
-                code: "缂栫爜",
+                code: "搴撳尯缂栫爜",
                 shipperId: "璐т富",
                 supplierId: "渚涘簲鍟�",
                 flagMinus: "鍏佽璐熷簱瀛�",
@@ -342,7 +344,7 @@
             loc: {
                 warehouseId: "鎵�灞炰粨搴�",
                 areaId: "鎵�灞炲簱鍖�",
-                code: "缂栫爜",
+                code: "搴撲綅缂栫爜",
                 type: "搴撲綅绫诲瀷",
                 name: "鍚嶇О",
                 flagLogic: "铏氭嫙搴撲綅",
@@ -694,15 +696,50 @@
                 startTime: "寮�濮嬫椂闂�",
                 endTime: "缁撴潫鏃堕棿",
             },
+            taskLog: {
+                taskId: "浠诲姟ID",
+                taskCode: "浠诲姟鍙�",
+                taskStatus: "鐘舵��",
+                taskType: "绫诲瀷",
+                orgLoc: "婧愬簱浣�",
+                orgSite: "婧愮珯鐐�",
+                targLoc: "鐩爣搴撲綅",
+                targSite: "鐩爣绔欑偣",
+                barcode: "鎷栫洏鐮�",
+                robotCode: "鏈哄櫒缂栫爜",
+                exceStatus: "鎵ц鐘舵��",
+                expDesc: "寮傚父璇存槑",
+                sort: "浼樺厛绾�",
+                expCode: "寮傚父缂栫爜",
+                startTime: "寮�濮嬫椂闂�",
+                endTime: "缁撴潫鏃堕棿",
+            },
             taskItem: {
                 taskId: "taskId",
                 orderId: "璁㈠崟ID",
                 orderType: "鍗曟嵁绫诲瀷",
                 orderItemId: "璁㈠崟鏄庣粏ID",
-                sourceCode: "璁㈠崟鍙�",
+                source: "婧怚D",
                 matnrId: "鐗╂枡ID",
                 maktx: "鐗╂枡鍚嶇О",
                 matnrCode: "鐗╂枡缂栫爜",
+                unit: "鍗曚綅",
+                anfme: "鏁伴噺",
+                batch: "鎵规",
+                spec: "瑙勬牸",
+                model: "鍨嬪彿",
+            },
+            taskItemLog: {
+                taskItemId: "taskItemId",
+                taskId: "taskId",
+                orderId: "璁㈠崟ID",
+                orderType: "鍗曟嵁绫诲瀷",
+                orderItemId: "璁㈠崟鏄庣粏ID",
+                source: "婧怚D",
+                matnrId: "鐗╂枡ID",
+                maktx: "鐗╂枡鍚嶇О",
+                matnrCode: "鐗╂枡缂栫爜",
+                trackCode: "璺熻釜鐮�",
                 unit: "鍗曚綅",
                 anfme: "鏁伴噺",
                 batch: "鎵规",
@@ -816,6 +853,7 @@
         complete: "瀹屾垚",
         close: "鍏抽棴",
         asnCreate: "閫氳繃ASN鍒涘缓",
+        createTask: "鐢熸垚浠诲姟",
     },
 };
 
diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js
index 04eb0c5..daf5821 100644
--- a/rsf-admin/src/page/ResourceContent.js
+++ b/rsf-admin/src/page/ResourceContent.js
@@ -48,6 +48,8 @@
 import asnOrderItemLog from './asnOrderItemLog';
 import task from './task';
 import taskItem from './taskItem';
+import taskLog from './taskLog';
+import taskItemLog from './taskItemLog';
 
 
 const ResourceContent = (node) => {
@@ -140,7 +142,10 @@
             return task;
         case 'taskItem':
             return taskItem;
-
+        case 'taskLog':
+            return taskLog;
+        case 'taskItemLog':
+            return taskItemLog;
 
         default:
             return {
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
index f0a45e4..08016e7 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
@@ -48,6 +48,7 @@
 import ConstructionIcon from "@mui/icons-material/Construction";
 import FileDownloadIcon from '@mui/icons-material/FileDownload';
 import EditIcon from '@mui/icons-material/Edit';
+import TaskIcon from '@mui/icons-material/Task';
 import request from '@/utils/request';
 
 
@@ -67,7 +68,6 @@
 
 const filters = [
   <SearchInput source="condition" alwaysOn />,
-
   <TextInput source="code" label="table.field.asnOrder.code" />,
   <TextInput source="poCode" label="table.field.asnOrder.poCode" />,
   <NumberInput source="poId" label="table.field.asnOrder.poId" />,
@@ -102,6 +102,7 @@
   const [createDialog, setCreateDialog] = useState(false);
   const [drawerVal, setDrawerVal] = useState(false);
   const [modalType, setmodalType] = useState(0);
+  const [billReload, setBillReload] = useState(null);
 
   const navigate = useNavigate();
   const assign = (record) => {
@@ -139,7 +140,7 @@
           preferenceKey='asnOrder'
           bulkActionButtons={<> <InspectionsButton /><BulkDeleteButton mutationMode={OPERATE_MODE} /></>}
           rowClick={() => false}
-          expand={<AsnOrderPanel />}
+          expand={<AsnOrderPanel setBillReload={setBillReload} />}
           expandSingle={true}
           omit={['id', 'createTime', 'createBy', 'memo', 'poId']}
         >
@@ -163,7 +164,8 @@
             <TextField source="nickname" />
           </ReferenceField>
           <DateField source="createTime" label="common.field.createTime" showTime />
-          <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+          <TextField source="exceStatus$" label="common.field.status" />
+          {/* <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" >
             {/* <Button label="toolbar.print" onClick={print}>
@@ -180,6 +182,7 @@
             >
             </Button> */}
             <InspectionButton />
+            <CompleteButton />
             <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
           </WrapperField>
         </StyledDatagrid>
@@ -188,6 +191,7 @@
         open={createDialog}
         setOpen={setCreateDialog}
         asnId={modalType}
+        billReload={billReload}
       />
       <PageDrawer
         title='AsnOrder Detail'
@@ -279,3 +283,26 @@
     </Button>
   )
 }
+
+const CompleteButton = () => {
+  const record = useRecordContext();
+  const notify = useNotify();
+  const refresh = useRefresh();
+  const requestComplete = async () => {
+    const { data: { code, data, msg } } = await request.post(`/asnOrder/complete/${record.id}`);
+
+    if (code === 200) {
+      notify(msg);
+      refresh()
+    } else {
+      notify(msg);
+    }
+  }
+
+
+  return (
+    <Button onClick={requestComplete} label={"toolbar.complete"} color="success">
+      <TaskIcon />
+    </Button>
+  )
+}
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
index 9bb5800..3f6b568 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
@@ -57,7 +57,7 @@
 import DictSelect from "../components/DictSelect";
 
 const AsnOrderModal = (props) => {
-    const { open, setOpen, asnId } = props;
+    const { open, setOpen, asnId, billReload } = props;
 
     const translate = useTranslate();
     const notify = useNotify();
@@ -108,6 +108,7 @@
             const res = await request.post(`/asnOrder/items/save`, parmas);
             if (res?.data?.code === 200) {
                 setOpen(false);
+                billReload()
                 refresh();
             } else {
                 notify(res.data.msg);
@@ -121,6 +122,7 @@
             if (res?.data?.code === 200) {
                 setOpen(false);
                 refresh();
+
             } else {
                 notify(res.data.msg);
             }
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
index 031f9f8..0d858d2 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
@@ -15,7 +15,7 @@
 import { DataGrid } from '@mui/x-data-grid';
 import PrintModal from './PrintModal';
 import { width } from "@mui/system";
-const AsnOrderPanel = () => {
+const AsnOrderPanel = ({ setBillReload }) => {
     const record = useRecordContext();
     if (!record) return null;
     const translate = useTranslate();
@@ -26,7 +26,13 @@
 
     useEffect(() => {
         debouncedHttp({ maktx });
+        setBillReload(http)
     }, [asnId, maktx]);
+
+    useEffect(() => {
+        setBillReload(http)
+    }, []);
+
 
 
     const http = async (parmas) => {
@@ -37,6 +43,7 @@
             notify(res.data.msg);
         }
     }
+
 
     const debouncedHttp = useMemo(() => debounce(http, 300), []);
 
@@ -49,7 +56,8 @@
         },
         {
             field: 'asnCode',
-            headerName: translate('table.field.asnOrderItem.asnCode')
+            headerName: translate('table.field.asnOrderItem.asnCode'),
+            width: 150,
         },
         {
             field: 'poDetlId',
@@ -61,7 +69,8 @@
         },
         {
             field: 'matnrCode',
-            headerName: translate('table.field.asnOrderItem.matnrCode')
+            headerName: translate('table.field.asnOrderItem.matnrCode'),
+            width: 150,
         },
         {
             field: 'maktx',
@@ -102,7 +111,8 @@
         },
         {
             field: 'trackCode',
-            headerName: translate('table.field.asnOrderItem.barcode')
+            headerName: translate('table.field.asnOrderItem.barcode'),
+            width: 150
         },
         {
             field: 'prodTime',
diff --git a/rsf-admin/src/page/basicInfo/loc/InitModal.jsx b/rsf-admin/src/page/basicInfo/loc/InitModal.jsx
index c3c685a..7d7ee4b 100644
--- a/rsf-admin/src/page/basicInfo/loc/InitModal.jsx
+++ b/rsf-admin/src/page/basicInfo/loc/InitModal.jsx
@@ -152,9 +152,12 @@
 
 
                             <Grid item xs={4}>
-                                <ReferenceArrayInput source="typeIds" reference="dictData" filter={{}}>
-                                    <SelectArrayInput label="table.field.loc.type" onChange={(e) => handleChange(e.target.value, 'typeIds')} validate={[required()]} />
+                                <ReferenceArrayInput source="typeIds" reference="locType" >
+                                    <SelectArrayInput label="table.field.loc.type" validate={[required()]} onChange={(e) => handleChange(e.target.value, 'typeIds')} />
                                 </ReferenceArrayInput>
+                                {/* <ReferenceArrayInput source="typeIds" reference="dictData" filter={{}}>
+                                    <SelectArrayInput label="table.field.loc.type" onChange={(e) => handleChange(e.target.value, 'typeIds')} validate={[required()]} />
+                                </ReferenceArrayInput> */}
                             </Grid>
 
                             <Grid item xs={4}>
diff --git a/rsf-admin/src/page/basicInfo/loc/LocList.jsx b/rsf-admin/src/page/basicInfo/loc/LocList.jsx
index c6a9228..bac9056 100644
--- a/rsf-admin/src/page/basicInfo/loc/LocList.jsx
+++ b/rsf-admin/src/page/basicInfo/loc/LocList.jsx
@@ -87,7 +87,6 @@
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-
     <ReferenceInput
         source="warehouseId"
         label="table.field.loc.warehouseId"
diff --git a/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx b/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
index b30ce29..46b4912 100644
--- a/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
+++ b/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
@@ -107,7 +107,13 @@
                     marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.qlyInspect"}
-                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                empty={<EmptyData
+                    children={
+                        <Box sx={{ gap: 2, display: 'flex' }}>
+                            <AsnCreatButton isInit={true} />
+                        </Box>
+                    }
+                    onClick={() => { }} />}
                 filters={filters}
                 sort={{ field: "create_time", order: "desc" }}
                 actions={(
@@ -244,19 +250,23 @@
     )
 }
 
-const AsnCreatButton = () => {
+const AsnCreatButton = ({ isInit }) => {
     const record = useRecordContext();
     const notify = useNotify();
     const refresh = useRefresh();
     const [createDialog, setCreateDialog] = useState(false);
 
-
-
     return (
         <>
-            <Button onClick={() => setCreateDialog(true)} label={"toolbar.asnCreate"}>
-                <AddIcon />
-            </Button>
+            {
+                isInit ? <Button onClick={() => setCreateDialog(true)} label={"toolbar.asnCreate"} variant="contained"
+                    color="primary">
+                    <AddIcon />
+                </Button> : <Button onClick={() => setCreateDialog(true)} label={"toolbar.asnCreate"} >
+                    <AddIcon />
+                </Button>
+            }
+
 
             <AsnSelModal
                 open={createDialog}
diff --git a/rsf-admin/src/page/task/TaskList.jsx b/rsf-admin/src/page/task/TaskList.jsx
index 64b1462..72cfe20 100644
--- a/rsf-admin/src/page/task/TaskList.jsx
+++ b/rsf-admin/src/page/task/TaskList.jsx
@@ -1,5 +1,7 @@
 import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
 import { useNavigate } from 'react-router-dom';
+import request from '@/utils/request';
+
 import {
     List,
     DatagridConfigurable,
@@ -15,6 +17,7 @@
     useRecordContext,
     useTranslate,
     useNotify,
+    useRefresh,
     useListContext,
     FunctionField,
     TextField,
@@ -111,9 +114,9 @@
                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.task"}
-                // empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                empty={<EmptyData onClick={() => { }} />}
                 filters={filters}
-                sort={{ field: "create_time", order: "desc" }}
+                sort={{ field: "sort", order: "desc" }}
                 actions={(
                     <TopToolbar>
                         <FilterButton />
@@ -212,11 +215,22 @@
  */
 const CancelButton = () => {
     const record = useRecordContext();
+    const notify = useNotify();
+    const refresh = useRefresh();
     const clickCancel = () => {
-        cancleTask([record])
+        cancleTask(record)
     };
     //鍙栨秷浠诲姟
-    const cancleTask = async (row) => {}
+    const cancleTask = async (row) => {
+        console.log(row);
+        const { data: { code, data, msg } } = await request.post(`/task/remove/` + row.id);
+        if (code === 200) {
+            notify(msg);
+            refresh();
+        } else {
+            notify(msg);
+        }
+    }
     return (
         <Button
             onClick={clickCancel}
@@ -231,11 +245,21 @@
  */
 const SetTopButton = () => {
     const record = useRecordContext();
+    const notify = useNotify();
+    const refresh = useRefresh();
     const clickTop = () => {
-        topTask([record])
+        topTask(record)
     };
     //缃《浠诲姟
-    const topTask = async (row) => { }
+    const topTask = async (row) => {
+        const { data: { code, data, msg } } = await request.post(`/task/top/` + row.id);
+        if (code === 200) {
+            notify(msg);
+            refresh();
+        } else {
+            notify(msg);
+        }
+     }
     return (
         <Button
             onClick={clickTop}
@@ -255,7 +279,7 @@
         cancleTask([record])
     };
     //鍙栨秷浠诲姟
-    const cancleTask = async (row) => {}
+    const cancleTask = async (row) => { }
     return (
         <Button
             onClick={clickCancel}
@@ -283,5 +307,4 @@
             <SwapVertIcon />
         </Button>
     )
-
 }
\ No newline at end of file
diff --git a/rsf-admin/src/page/taskItem/TaskItemList.jsx b/rsf-admin/src/page/taskItem/TaskItemList.jsx
index e92a6b7..42d1a09 100644
--- a/rsf-admin/src/page/taskItem/TaskItemList.jsx
+++ b/rsf-admin/src/page/taskItem/TaskItemList.jsx
@@ -104,31 +104,30 @@
                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
                 title={"menu.taskItem"}
-                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='taskItem' />
-                        <MyExportButton />
+                        {/* <MyExportButton /> */}
                     </TopToolbar>
                 )}
                 perPage={DEFAULT_PAGE_SIZE}
             >
                 <StyledDatagrid
                     preferenceKey='taskItem'
-                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    // bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                     rowClick={(id, resource, record) => false}
-                    expand={() => <TaskItemPanel />}
+                    // expand={() => <TaskItemPanel />}
                     expandSingle={true}
-                    omit={['id', 'createTime', 'createBy', 'memo']}
+                    omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']}
                 >
                     <NumberField source="id" />
                     <NumberField source="taskId" label="table.field.taskItem.taskId" />
                     <NumberField source="orderId" label="table.field.taskItem.orderId" />
-                    <NumberField source="orderType" label="table.field.taskItem.orderType" />
+                    <NumberField source="orderType$" label="table.field.taskItem.orderType" />
                     <NumberField source="orderItemId" label="table.field.taskItem.orderItemId" />
                     <NumberField source="matnrId" label="table.field.taskItem.matnrId" />
                     <TextField source="maktx" label="table.field.taskItem.maktx" />
@@ -149,16 +148,8 @@
                     <DateField source="createTime" label="common.field.createTime" showTime />
                     <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} />
-                    </WrapperField>
                 </StyledDatagrid>
             </List>
-            <TaskItemCreate
-                open={createDialog}
-                setOpen={setCreateDialog}
-            />
             <PageDrawer
                 title='TaskItem Detail'
                 drawerVal={drawerVal}
diff --git a/rsf-admin/src/page/taskItemLog/TaskItemLogCreate.jsx b/rsf-admin/src/page/taskItemLog/TaskItemLogCreate.jsx
new file mode 100644
index 0000000..29f89f7
--- /dev/null
+++ b/rsf-admin/src/page/taskItemLog/TaskItemLogCreate.jsx
@@ -0,0 +1,216 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const TaskItemLogCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskItemLog.taskItemId"
+                                        source="taskItemId"
+                                        autoFocus
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskItemLog.taskId"
+                                        source="taskId"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskItemLog.orderId"
+                                        source="orderId"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskItemLog.orderType"
+                                        source="orderType"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskItemLog.orderItemId"
+                                        source="orderItemId"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskItemLog.source"
+                                        source="source"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskItemLog.matnrId"
+                                        source="matnrId"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskItemLog.maktx"
+                                        source="maktx"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskItemLog.matnrCode"
+                                        source="matnrCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskItemLog.trackCode"
+                                        source="trackCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskItemLog.unit"
+                                        source="unit"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskItemLog.anfme"
+                                        source="anfme"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskItemLog.batch"
+                                        source="batch"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskItemLog.spec"
+                                        source="spec"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskItemLog.model"
+                                        source="model"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskItemLog.fieldsIndex"
+                                        source="fieldsIndex"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default TaskItemLogCreate;
diff --git a/rsf-admin/src/page/taskItemLog/TaskItemLogEdit.jsx b/rsf-admin/src/page/taskItemLog/TaskItemLogEdit.jsx
new file mode 100644
index 0000000..229ce32
--- /dev/null
+++ b/rsf-admin/src/page/taskItemLog/TaskItemLogEdit.jsx
@@ -0,0 +1,188 @@
+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 TaskItemLogEdit = () => {
+    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}>
+                            <NumberInput
+                                label="table.field.taskItemLog.taskItemId"
+                                source="taskItemId"
+                                autoFocus
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskItemLog.taskId"
+                                source="taskId"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskItemLog.orderId"
+                                source="orderId"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskItemLog.orderType"
+                                source="orderType"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskItemLog.orderItemId"
+                                source="orderItemId"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskItemLog.source"
+                                source="source"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskItemLog.matnrId"
+                                source="matnrId"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskItemLog.maktx"
+                                source="maktx"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskItemLog.matnrCode"
+                                source="matnrCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskItemLog.trackCode"
+                                source="trackCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskItemLog.unit"
+                                source="unit"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskItemLog.anfme"
+                                source="anfme"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskItemLog.batch"
+                                source="batch"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskItemLog.spec"
+                                source="spec"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskItemLog.model"
+                                source="model"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskItemLog.fieldsIndex"
+                                source="fieldsIndex"
+                                parse={v => v}
+                            />
+                        </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 TaskItemLogEdit;
diff --git a/rsf-admin/src/page/taskItemLog/TaskItemLogList.jsx b/rsf-admin/src/page/taskItemLog/TaskItemLogList.jsx
new file mode 100644
index 0000000..3e3c9f2
--- /dev/null
+++ b/rsf-admin/src/page/taskItemLog/TaskItemLogList.jsx
@@ -0,0 +1,171 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import TaskItemLogCreate from "./TaskItemLogCreate";
+import TaskItemLogPanel from "./TaskItemLogPanel";
+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';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <NumberInput source="taskItemId" label="table.field.taskItemLog.taskItemId" />,
+    <NumberInput source="taskId" label="table.field.taskItemLog.taskId" />,
+    <NumberInput source="orderId" label="table.field.taskItemLog.orderId" />,
+    <TextInput source="orderType" label="table.field.taskItemLog.orderType" />,
+    <NumberInput source="orderItemId" label="table.field.taskItemLog.orderItemId" />,
+    <NumberInput source="source" label="table.field.taskItemLog.source" />,
+    <NumberInput source="matnrId" label="table.field.taskItemLog.matnrId" />,
+    <TextInput source="maktx" label="table.field.taskItemLog.maktx" />,
+    <TextInput source="matnrCode" label="table.field.taskItemLog.matnrCode" />,
+    <TextInput source="trackCode" label="table.field.taskItemLog.trackCode" />,
+    <TextInput source="unit" label="table.field.taskItemLog.unit" />,
+    <NumberInput source="anfme" label="table.field.taskItemLog.anfme" />,
+    <TextInput source="batch" label="table.field.taskItemLog.batch" />,
+    <TextInput source="spec" label="table.field.taskItemLog.spec" />,
+    <TextInput source="model" label="table.field.taskItemLog.model" />,
+    <TextInput source="fieldsIndex" label="table.field.taskItemLog.fieldsIndex" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const TaskItemLogList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.taskItemLog"}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <SelectColumnsButton preferenceKey='taskItemLog' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='taskItemLog'
+                    bulkActionButtons={false}
+                    rowClick={(id, resource, record) => false}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']}
+                >
+                    <NumberField source="id" />
+                    <NumberField source="taskItemId" label="table.field.taskItemLog.taskItemId" />
+                    <NumberField source="taskId" label="table.field.taskItemLog.taskId" />
+                    <NumberField source="orderId" label="table.field.taskItemLog.orderId" />
+                    <TextField source="orderType" label="table.field.taskItemLog.orderType" />
+                    <NumberField source="orderItemId" label="table.field.taskItemLog.orderItemId" />
+                    <NumberField source="source" label="table.field.taskItemLog.source" />
+                    <NumberField source="matnrId" label="table.field.taskItemLog.matnrId" />
+                    <TextField source="maktx" label="table.field.taskItemLog.maktx" />
+                    <TextField source="matnrCode" label="table.field.taskItemLog.matnrCode" />
+                    <TextField source="trackCode" label="table.field.taskItemLog.trackCode" />
+                    <TextField source="unit" label="table.field.taskItemLog.unit" />
+                    <NumberField source="anfme" label="table.field.taskItemLog.anfme" />
+                    <TextField source="batch" label="table.field.taskItemLog.batch" />
+                    <TextField source="spec" label="table.field.taskItemLog.spec" />
+                    <TextField source="model" label="table.field.taskItemLog.model" />
+                    <TextField source="fieldsIndex" label="table.field.taskItemLog.fieldsIndex" />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
+                    <TextField source="memo" label="common.field.memo" sortable={false} />
+                </StyledDatagrid>
+            </List>
+            <PageDrawer
+                title='TaskItemLog Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default TaskItemLogList;
diff --git a/rsf-admin/src/page/taskItemLog/TaskItemLogPanel.jsx b/rsf-admin/src/page/taskItemLog/TaskItemLogPanel.jsx
new file mode 100644
index 0000000..6f863f8
--- /dev/null
+++ b/rsf-admin/src/page/taskItemLog/TaskItemLogPanel.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 TaskItemLogPanel = () => {
+    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.taskItemLog.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.taskItemLog.taskItemId" 
+                                property={record.taskItemId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.taskId" 
+                                property={record.taskId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.orderId" 
+                                property={record.orderId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.orderType" 
+                                property={record.orderType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.orderItemId" 
+                                property={record.orderItemId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.source" 
+                                property={record.source}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.matnrId" 
+                                property={record.matnrId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.maktx" 
+                                property={record.maktx}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.matnrCode" 
+                                property={record.matnrCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.trackCode" 
+                                property={record.trackCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.unit" 
+                                property={record.unit}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.anfme" 
+                                property={record.anfme}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.batch" 
+                                property={record.batch}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.spec" 
+                                property={record.spec}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.model" 
+                                property={record.model}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskItemLog.fieldsIndex" 
+                                property={record.fieldsIndex}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default TaskItemLogPanel;
diff --git a/rsf-admin/src/page/taskItemLog/index.jsx b/rsf-admin/src/page/taskItemLog/index.jsx
new file mode 100644
index 0000000..0208e30
--- /dev/null
+++ b/rsf-admin/src/page/taskItemLog/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import TaskItemLogList from "./TaskItemLogList";
+import TaskItemLogEdit from "./TaskItemLogEdit";
+
+export default {
+    list: TaskItemLogList,
+    edit: TaskItemLogEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/taskLog/TaskLogCreate.jsx b/rsf-admin/src/page/taskLog/TaskLogCreate.jsx
new file mode 100644
index 0000000..248a643
--- /dev/null
+++ b/rsf-admin/src/page/taskLog/TaskLogCreate.jsx
@@ -0,0 +1,216 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Stack,
+    Grid,
+    Box,
+} from '@mui/material';
+import DialogCloseButton from "../components/DialogCloseButton";
+import StatusSelectInput from "../components/StatusSelectInput";
+import MemoInput from "../components/MemoInput";
+
+const TaskLogCreate = (props) => {
+    const { open, setOpen } = props;
+
+    const translate = useTranslate();
+    const notify = useNotify();
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const handleSuccess = async (data) => {
+        setOpen(false);
+        notify('common.response.success');
+    };
+
+    const handleError = async (error) => {
+        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
+    };
+
+    return (
+        <>
+            <CreateBase
+                record={{}}
+                transform={(data) => {
+                    return data;
+                }}
+                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('create.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container rowSpacing={2} columnSpacing={2}>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskLog.taskId"
+                                        source="taskId"
+                                        autoFocus
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskLog.taskCode"
+                                        source="taskCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskLog.taskStatus"
+                                        source="taskStatus"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskLog.taskType"
+                                        source="taskType"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskLog.orgLoc"
+                                        source="orgLoc"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskLog.orgSite"
+                                        source="orgSite"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskLog.targLoc"
+                                        source="targLoc"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskLog.targSite"
+                                        source="targSite"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskLog.barcode"
+                                        source="barcode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskLog.robotCode"
+                                        source="robotCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskLog.exceStatus"
+                                        source="exceStatus"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskLog.expDesc"
+                                        source="expDesc"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.taskLog.sort"
+                                        source="sort"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.taskLog.expCode"
+                                        source="expCode"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskLog.startTime"
+                                        source="startTime"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <DateInput
+                                        label="table.field.taskLog.endTime"
+                                        source="endTime"
+                                    />
+                                </Grid>
+
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <StatusSelectInput />
+                                </Grid>
+                                <Grid item xs={12} display="flex" gap={1}>
+                                    <Stack direction="column" spacing={1} width={'100%'}>
+                                        <MemoInput />
+                                    </Stack>
+                                </Grid>
+                            </Grid>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
+                                <SaveButton />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </CreateBase>
+        </>
+    )
+}
+
+export default TaskLogCreate;
diff --git a/rsf-admin/src/page/taskLog/TaskLogEdit.jsx b/rsf-admin/src/page/taskLog/TaskLogEdit.jsx
new file mode 100644
index 0000000..ec5c658
--- /dev/null
+++ b/rsf-admin/src/page/taskLog/TaskLogEdit.jsx
@@ -0,0 +1,188 @@
+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 TaskLogEdit = () => {
+    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}>
+                            <NumberInput
+                                label="table.field.taskLog.taskId"
+                                source="taskId"
+                                autoFocus
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskLog.taskCode"
+                                source="taskCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskLog.taskStatus"
+                                source="taskStatus"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskLog.taskType"
+                                source="taskType"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskLog.orgLoc"
+                                source="orgLoc"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskLog.orgSite"
+                                source="orgSite"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskLog.targLoc"
+                                source="targLoc"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskLog.targSite"
+                                source="targSite"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskLog.barcode"
+                                source="barcode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskLog.robotCode"
+                                source="robotCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskLog.exceStatus"
+                                source="exceStatus"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskLog.expDesc"
+                                source="expDesc"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <NumberInput
+                                label="table.field.taskLog.sort"
+                                source="sort"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <TextInput
+                                label="table.field.taskLog.expCode"
+                                source="expCode"
+                                parse={v => v}
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskLog.startTime"
+                                source="startTime"
+                            />
+                        </Stack>
+                        <Stack direction='row' gap={2}>
+                            <DateInput
+                                label="table.field.taskLog.endTime"
+                                source="endTime"
+                            />
+                        </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 TaskLogEdit;
diff --git a/rsf-admin/src/page/taskLog/TaskLogList.jsx b/rsf-admin/src/page/taskLog/TaskLogList.jsx
new file mode 100644
index 0000000..ff2084f
--- /dev/null
+++ b/rsf-admin/src/page/taskLog/TaskLogList.jsx
@@ -0,0 +1,181 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate } from 'react-router-dom';
+import {
+    List,
+    DatagridConfigurable,
+    SearchInput,
+    TopToolbar,
+    SelectColumnsButton,
+    EditButton,
+    FilterButton,
+    CreateButton,
+    ExportButton,
+    BulkDeleteButton,
+    WrapperField,
+    useRecordContext,
+    useTranslate,
+    useNotify,
+    useListContext,
+    FunctionField,
+    TextField,
+    NumberField,
+    DateField,
+    BooleanField,
+    ReferenceField,
+    TextInput,
+    DateTimeInput,
+    DateInput,
+    SelectInput,
+    NumberInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    DeleteButton,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import TaskLogCreate from "./TaskLogCreate";
+import TaskLogPanel from "./TaskLogPanel";
+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';
+
+const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
+    '& .css-1vooibu-MuiSvgIcon-root': {
+        height: '.9em'
+    },
+    '& .RaDatagrid-row': {
+        cursor: 'auto'
+    },
+    '& .column-name': {
+    },
+    '& .opt': {
+        width: 200
+    },
+}));
+
+const filters = [
+    <SearchInput source="condition" alwaysOn />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
+
+    <NumberInput source="taskId" label="table.field.taskLog.taskId" />,
+    <TextInput source="taskCode" label="table.field.taskLog.taskCode" />,
+    <NumberInput source="taskStatus" label="table.field.taskLog.taskStatus" />,
+    <NumberInput source="taskType" label="table.field.taskLog.taskType" />,
+    <TextInput source="orgLoc" label="table.field.taskLog.orgLoc" />,
+    <TextInput source="orgSite" label="table.field.taskLog.orgSite" />,
+    <TextInput source="targLoc" label="table.field.taskLog.targLoc" />,
+    <TextInput source="targSite" label="table.field.taskLog.targSite" />,
+    <TextInput source="barcode" label="table.field.taskLog.barcode" />,
+    <TextInput source="robotCode" label="table.field.taskLog.robotCode" />,
+    <NumberInput source="exceStatus" label="table.field.taskLog.exceStatus" />,
+    <TextInput source="expDesc" label="table.field.taskLog.expDesc" />,
+    <NumberInput source="sort" label="table.field.taskLog.sort" />,
+    <TextInput source="expCode" label="table.field.taskLog.expCode" />,
+    <DateInput source="startTime" label="table.field.taskLog.startTime" />,
+    <DateInput source="endTime" label="table.field.taskLog.endTime" />,
+
+    <TextInput label="common.field.memo" source="memo" />,
+    <SelectInput
+        label="common.field.status"
+        source="status"
+        choices={[
+            { id: '1', name: 'common.enums.statusTrue' },
+            { id: '0', name: 'common.enums.statusFalse' },
+        ]}
+        resettable
+    />,
+]
+
+const TaskLogList = () => {
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+
+    return (
+        <Box display="flex">
+            <List
+                sx={{
+                    flexGrow: 1,
+                    transition: (theme) =>
+                        theme.transitions.create(['all'], {
+                            duration: theme.transitions.duration.enteringScreen,
+                        }),
+                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                }}
+                title={"menu.taskLog"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <SelectColumnsButton preferenceKey='taskLog' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='taskLog'
+                    bulkActionButtons={false}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <TaskLogPanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'robotCode', 'exceStatus', 'sort', 'expCode']}
+                >
+                    <NumberField source="id" />
+                    <NumberField source="taskId" label="table.field.taskLog.taskId" />
+                    <TextField source="taskCode" label="table.field.taskLog.taskCode" />
+                    <NumberField source="taskStatus" label="table.field.taskLog.taskStatus" />
+                    <NumberField source="taskType" label="table.field.taskLog.taskType" />
+                    <TextField source="orgLoc" label="table.field.taskLog.orgLoc" />
+                    <TextField source="orgSite" label="table.field.taskLog.orgSite" />
+                    <TextField source="targLoc" label="table.field.taskLog.targLoc" />
+                    <TextField source="targSite" label="table.field.taskLog.targSite" />
+                    <TextField source="barcode" label="table.field.taskLog.barcode" />
+                    <TextField source="robotCode" label="table.field.taskLog.robotCode" />
+                    <NumberField source="exceStatus" label="table.field.taskLog.exceStatus" />
+                    <TextField source="expDesc" label="table.field.taskLog.expDesc" />
+                    <NumberField source="sort" label="table.field.taskLog.sort" />
+                    <TextField source="expCode" label="table.field.taskLog.expCode" />
+                    <DateField source="startTime" label="table.field.taskLog.startTime" showTime />
+                    <DateField source="endTime" label="table.field.taskLog.endTime" showTime />
+
+                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="updateTime" label="common.field.updateTime" showTime />
+                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+                        <TextField source="nickname" />
+                    </ReferenceField>
+                    <DateField source="createTime" label="common.field.createTime" showTime />
+                    <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} />
+                    </WrapperField>
+                </StyledDatagrid>
+            </List>
+            {/* <TaskLogCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            /> */}
+            <PageDrawer
+                title='TaskLog Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default TaskLogList;
diff --git a/rsf-admin/src/page/taskLog/TaskLogPanel.jsx b/rsf-admin/src/page/taskLog/TaskLogPanel.jsx
new file mode 100644
index 0000000..5288345
--- /dev/null
+++ b/rsf-admin/src/page/taskLog/TaskLogPanel.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 TaskLogPanel = () => {
+    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.taskLog.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.taskLog.taskId" 
+                                property={record.taskId}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.taskCode" 
+                                property={record.taskCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.taskStatus" 
+                                property={record.taskStatus}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.taskType" 
+                                property={record.taskType}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.orgLoc" 
+                                property={record.orgLoc}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.orgSite" 
+                                property={record.orgSite}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.targLoc" 
+                                property={record.targLoc}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.targSite" 
+                                property={record.targSite}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.barcode" 
+                                property={record.barcode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.robotCode" 
+                                property={record.robotCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.exceStatus" 
+                                property={record.exceStatus}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.expDesc" 
+                                property={record.expDesc}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.sort" 
+                                property={record.sort}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.expCode" 
+                                property={record.expCode}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.startTime" 
+                                property={record.startTime$}
+                            />
+                        </Grid>
+                        <Grid item xs={6}>
+                            <PanelTypography
+                                title="table.field.taskLog.endTime" 
+                                property={record.endTime$}
+                            />
+                        </Grid>
+
+                    </Grid>
+                </CardContent>
+            </Card >
+        </>
+    );
+};
+
+export default TaskLogPanel;
diff --git a/rsf-admin/src/page/taskLog/index.jsx b/rsf-admin/src/page/taskLog/index.jsx
new file mode 100644
index 0000000..d66a10b
--- /dev/null
+++ b/rsf-admin/src/page/taskLog/index.jsx
@@ -0,0 +1,18 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    ListGuesser,
+    EditGuesser,
+    ShowGuesser,
+} from "react-admin";
+
+import TaskLogList from "./TaskLogList";
+import TaskLogEdit from "./TaskLogEdit";
+
+export default {
+    list: TaskLogList,
+    edit: TaskLogEdit,
+    show: ShowGuesser,
+    recordRepresentation: (record) => {
+        return `${record.id}`
+    }
+};
diff --git a/rsf-admin/src/page/waitPakin/WaitPakinList.jsx b/rsf-admin/src/page/waitPakin/WaitPakinList.jsx
index b8cd4cd..11405c2 100644
--- a/rsf-admin/src/page/waitPakin/WaitPakinList.jsx
+++ b/rsf-admin/src/page/waitPakin/WaitPakinList.jsx
@@ -31,6 +31,8 @@
     ReferenceArrayInput,
     AutocompleteInput,
     DeleteButton,
+    Button,
+    useRefresh
 } from 'react-admin';
 import { Box, Typography, Card, Stack } from '@mui/material';
 import { styled } from '@mui/material/styles';
@@ -43,6 +45,8 @@
 import MyField from "../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
 import * as Common from '@/utils/common';
+import AddIcon from '@mui/icons-material/Add';
+import request from '@/utils/request';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -118,7 +122,7 @@
             >
                 <StyledDatagrid
                     preferenceKey='waitPakin'
-                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    bulkActionButtons={<> <CreateTaskButton /> <BulkDeleteButton mutationMode={OPERATE_MODE} /></>}
                     rowClick={(id, resource, record) => false}
                     expand={() => <WaitPakinPanel />}
                     expandSingle={true}
@@ -163,3 +167,32 @@
 }
 
 export default WaitPakinList;
+
+const CreateTaskButton = () => {
+    const record = useRecordContext();
+    const notify = useNotify();
+    const refresh = useRefresh();
+    const { selectedIds, onUnselectItems, data } = useListContext();
+    const createTask = async () => {
+        const rows = data.filter((item) => selectedIds.includes(item.id)) || [];
+        const res = await request.post(`/waitPakin/merge`, rows);
+        if (res?.data?.code === 200) {
+            refresh()
+            notify(res.data.msg);
+
+        } else {
+            notify(res.data.msg);
+        }
+    }
+
+    return (
+        <>
+            <Button onClick={() => createTask()} label={"toolbar.createTask"}>
+                <AddIcon />
+            </Button>
+
+
+        </>
+
+    )
+}
diff --git a/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx b/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx
index 180bcf2..c90866a 100644
--- a/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx
+++ b/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx
@@ -63,7 +63,17 @@
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-    <TextField source="warehouseId" label="table.field.warehouseAreas.wareId" />,
+    <ReferenceInput
+        source="warehouseId"
+        label="table.field.loc.warehouseId"
+        reference="warehouse"
+    >
+        <AutocompleteInput
+            label="table.field.loc.warehouseId"
+            optionText="name"
+            filterToQuery={(val) => ({ name: val })}
+        />
+    </ReferenceInput>,
     <TextInput source="uuid" label="table.field.warehouseAreas.uuid" />,
     <TextInput source="name" label="table.field.warehouseAreas.name" />,
     <TextInput source="code" label="table.field.warehouseAreas.code" />,
@@ -122,7 +132,7 @@
                 title={"menu.warehouseAreas"}
                 empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                 filters={filters}
-                sort={{ field: "create_time", order: "desc" }}
+                sort={{ field: "warehouseId", order: "desc" }}
                 actions={(
                     <TopToolbar>
                         <FilterButton />
diff --git a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
index 999b8d4..37aa8a0 100644
--- a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
+++ b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx
@@ -127,7 +127,7 @@
                     preferenceKey='warehouseAreasItem'
                     bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                     rowClick={(id, resource, record) => false}
-                    omit={['id', 'createTime', 'createBy', 'memo']}
+                    omit={['id', 'createTime', 'createBy', 'memo', 'areaId', 'matnrId']}
                 >
                     <NumberField source="id" />
                     <NumberField source="areaId" label="table.field.warehouseAreasItem.areaId" />
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 13eb3eb..330b9e5 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
@@ -219,7 +219,7 @@
         if (Objects.isNull(params)) {
             return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
-        return mobileService.publicToStock(params);
+        return mobileService.publicToStock(params, getLoginUserId());
     }
 
     @ApiOperation("鑾峰彇浠诲姟淇℃伅")
@@ -234,7 +234,7 @@
 
     @ApiOperation("浠诲姟涓婃灦")
     @PreAuthorize("hasAuthority('manager:qlyInspect:update')")
-    @PostMapping("/task/stock")
+    @PostMapping("/task/public/{code}")
     public R taskToLocs(@PathVariable String code) throws Exception {
         if (Objects.isNull(code)) {
             return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/TaskQueueDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/TaskQueueDto.java
index 36c9383..dbe935a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/TaskQueueDto.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/TaskQueueDto.java
@@ -1,6 +1,5 @@
 package com.vincent.rsf.server.api.entity.dto;
 
-import com.vincent.rsf.server.manager.entity.Loc;
 import com.vincent.rsf.server.manager.entity.Task;
 import com.vincent.rsf.server.manager.entity.TaskItem;
 import io.swagger.annotations.ApiModel;
@@ -14,7 +13,7 @@
 @Data
 @Accessors(chain = true)
 @ApiModel(value = "TaskQueueDto", description = "浠诲姟淇℃伅")
-public class TaskQueueDto implements Serializable {
+public class TaskQueueDto implements Serializable{
 
     @ApiModelProperty("浠诲姟涓诲崟")
     private Task task;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java
index 94649d4..023b103 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java
@@ -10,8 +10,10 @@
 public enum OrderType {
     //璁㈠崟绫诲瀷
     ORDER_PURCHASE_IN("purchase", "閲囪喘鍏ュ簱鍗�"),
-    ORDER_OUT("out", "閲囪喘鍑哄簱鍗�"),
-    ORDER_RECEIPT("receipt", "鏀惰揣")
+    ORDER_OUT("out", "鍑哄簱鍗�"),
+    ORDER_IN("in", "鍏ュ簱鍗�"),
+    ORDER_RECEIPT("receipt", "鏀惰揣鍗�"),
+    ORDER_PLAT_IN("plat in", "骞冲簱鍏ュ簱鍗�"),
 
     ;
 
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 8609f3e..492b889 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
@@ -51,7 +51,7 @@
 
     R operateToStock(OpStockParams params);
 
-    R publicToStock(PublicToStockParams params);
+    R publicToStock(PublicToStockParams params, Long loginUserId);
 
     R taskToStock(String code);
 
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 6df867e..e84ec9b 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
@@ -6,6 +6,7 @@
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.api.controller.params.*;
 import com.vincent.rsf.server.api.entity.dto.*;
+import com.vincent.rsf.server.api.entity.enums.OrderType;
 import com.vincent.rsf.server.api.entity.enums.OrderWorkType;
 import com.vincent.rsf.server.api.service.MobileService;
 import com.vincent.rsf.server.common.config.ConfigProperties;
@@ -27,21 +28,18 @@
 import com.vincent.rsf.server.system.mapper.TenantMapper;
 import com.vincent.rsf.server.system.mapper.UserMapper;
 import com.vincent.rsf.server.system.service.FieldsItemService;
-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.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -204,7 +202,7 @@
         List<ReceiptDetlsDto> receipts = params.getReceipts();
         List<WarehouseAreasItem> allOrders = new ArrayList<>();
 
-        double receiptQty = receipts.stream().mapToDouble(ReceiptDetlsDto::getReceiptQty).sum();
+        Double receiptQty = receipts.stream().mapToDouble(ReceiptDetlsDto::getReceiptQty).sum();
 
         String asnCode = receipts.stream().findFirst().get().getAsnCode();
 
@@ -213,7 +211,9 @@
         if (Objects.isNull(asnOrder)) {
             throw new CoolException("鏁版嵁閿欒锛氫富鍗曚笉瀛樺湪锛侊紒");
         }
-        asnOrder.setQty(receiptQty);
+        /**鏀惰揣鏁伴噺绱姞锛�1. 浼氬嚭瓒呮敹鎯呭喌 2. 浼氭湁鏀惰揣涓嶈冻鎯呭喌*/
+        Double rcptedQty = asnOrder.getQty() + receiptQty;
+        asnOrder.setQty(rcptedQty);
 
         if (!asnOrderMapper.updateById(asnOrder)) {
             throw new CoolException("宸叉敹璐ф暟閲忎慨鏀瑰け璐ワ紒锛�");
@@ -305,60 +305,18 @@
         if (!warehouseAreasItemService.saveBatch(allOrders)) {
             throw new CoolException("鏀惰揣澶辫触锛侊紒");
         }
-
-        //鑾峰彇閲囪喘鏁伴噺
-        double purQty = receipts.stream().mapToDouble(ReceiptDetlsDto::getPurQty).sum();
-
-        BigDecimal subtract = BigDecimal.valueOf(receiptQty).subtract(BigDecimal.valueOf(purQty));
-        //鍒ゆ柇宸叉敹璐ф暟閲忔槸鍚﹀皬浜庣瓑浜庨噰璐暟閲�
-        if (subtract.compareTo(new BigDecimal("0.0")) <= 0) {
-            asnOrder.setRleStatus(Short.valueOf("1"));
-            //鏃ュ織琛ㄦ搷浣�
-            operateOrderLogs(asnOrder);
-        }
-
+//        //鑾峰彇閲囪喘鏁伴噺
+//        double purQty = receipts.stream().mapToDouble(ReceiptDetlsDto::getPurQty).sum();
+//
+//        BigDecimal subtract = BigDecimal.valueOf(receiptQty).subtract(BigDecimal.valueOf(purQty));
+//        //鍒ゆ柇宸叉敹璐ф暟閲忔槸鍚﹀皬浜庣瓑浜庨噰璐暟閲�
+//        if (subtract.compareTo(new BigDecimal("0.0")) <= 0) {
+//            asnOrder.setRleStatus(Short.valueOf("1"));
+//            //鏃ュ織琛ㄦ搷浣�
+//            operateOrderLogs(asnOrder);
+//        }
         return R.ok("鎿嶄綔鎴愬姛");
     }
-
-    /**
-     * @author Ryan
-     * @description 鍒犻櫎鍘熶富鍗曞強鏄庣粏锛屽姞鍏ュ巻鍙叉。
-     * @param
-     * @return
-     * @time 2025/3/19 19:53
-     */
-    private void operateOrderLogs(AsnOrder asnOrder) {
-        if (!asnOrderMapper.removeById(asnOrder.getId())) {
-            throw new CoolException("鍘熷崟鎹垹闄ゅけ璐ワ紒锛�");
-        }
-
-        AsnOrderLog orderLog = new AsnOrderLog();
-        BeanUtils.copyProperties(asnOrder, orderLog);
-        orderLog.setAsnId(asnOrder.getId());
-
-        if (!asnOrderLogService.save(orderLog)) {
-            throw new CoolException("涓诲崟鍘嗗彶妗f坊鍔犲け璐ワ紒锛�");
-        }
-
-        List<AsnOrderItemLog> logs = new ArrayList<>();
-        List<AsnOrderItem> items = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, asnOrder.getId()));
-        items.forEach(item -> {
-            AsnOrderItemLog itemLog = new AsnOrderItemLog();
-            BeanUtils.copyProperties(item, itemLog);
-            itemLog.setAsnItemId(itemLog.getId())
-                    .setAsnId(item.getAsnId());
-            logs.add(itemLog);
-        });
-
-        if (!asnOrderItemLogService.saveBatch(logs)) {
-            throw new CoolException("閫氱煡鍗曟槑缁嗗巻鍙叉。淇濆瓨澶辫触锛侊紒");
-        }
-
-        if (asnOrderItemMapper.delete(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, asnOrder.getId())) < 1) {
-            throw new CoolException("鍘熷崟鎹槑缁嗗垹闄ゅけ璐ワ紒锛�");
-        }
-    }
-
 
     /**
      * @author Ryan
@@ -599,28 +557,27 @@
         if (!waitPakins.isEmpty()) {
             throw new CoolException("鎷栫洏宸蹭娇鐢�!!");
         }
-        List<AsnOrderItem> orderItems = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>()
+        AsnOrderItem orderItems = asnOrderItemMapper.selectOne(new LambdaQueryWrapper<AsnOrderItem>()
                 .eq(AsnOrderItem::getAsnId, asnOrders.getId())
                 .eq(AsnOrderItem::getMatnrCode, params.getMatnrCode()));
-        if (orderItems.isEmpty()) {
-            throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�");
+        if (Objects.isNull(orderItems)) {
+            return R.ok(null);
         }
-        List<AsnOrderItem> stocks = new ArrayList<>();
-        orderItems.forEach(item -> {
-            item.setBarcode(params.getBarcode());
-            stocks.add(item);
-        });
-        return R.ok(stocks);
+        orderItems.setBarcode(params.getBarcode());
+
+        return R.ok(orderItems);
     }
 
     /**
      * 浜哄伐涓婃灦鍏ュ簱
+     *
      * @param params
+     * @param loginUserId
      * @return
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public R publicToStock(PublicToStockParams params) {
+    public R publicToStock(PublicToStockParams params, Long loginUserId) {
         if (Objects.isNull(params.getLocCode()) || StringUtils.isBlank(params.getLocCode())) {
             throw new CoolException("搴撲綅涓嶈兘涓虹┖锛侊紒");
         }
@@ -628,7 +585,10 @@
             throw new CoolException("鍗曟嵁鏄庣粏涓嶈兘涓虹┖锛侊紒");
         }
         Long OrderId = params.getItemList().stream().findFirst().get().getAsnId();
-        AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, OrderId));
+        /**鑾峰彇骞冲簱璁㈠崟*/
+        AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>()
+                .eq(AsnOrder::getId, OrderId)
+                .eq(AsnOrder::getType, OrderType.ORDER_PLAT_IN.type));
         if (Objects.isNull(order)) {
             throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
         }
@@ -636,7 +596,9 @@
         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()));
-            stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId());
+            if (!Objects.isNull(purchase)) {
+                stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId());
+            }
         }
         String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null);
         if (StringUtils.isBlank(ruleCode)) {
@@ -645,7 +607,7 @@
         if (!stockService.save(stock)) {
             throw new CoolException("搴撳瓨淇濆瓨澶辫触锛侊紒");
         }
-        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, params.getLocCode()));
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, params.getLocCode()));
         if (Objects.isNull(loc)) {
             throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�");
         }
@@ -656,6 +618,7 @@
             stockItem.setAsnItemId(orderItem.getId())
                     .setBarcode(orderItem.getBarcode())
                     .setLocId(loc.getId())
+                    .setUpdateBy(loginUserId)
                     .setId(null)
                     .setStockId(stock.getId());
             stockItems.add(stockItem);
@@ -682,7 +645,7 @@
             throw new CoolException("鎷栫洏浠诲姟涓嶅瓨鍦紒锛�");
         }
         List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
-        if (!taskItems.isEmpty()) {
+        if (taskItems.isEmpty()) {
             throw new CoolException("鎷栫洏浠诲姟鏄庣粏涓嶅瓨鍦紒锛�");
         }
         TaskQueueDto queueDto = new TaskQueueDto();
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 9f88a5c..fd4f57b 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,7 +22,7 @@
 //        generator.username="sa";
 //        generator.password="Zoneyung@zy56$";
 
-        generator.table="man_ispt_histories";
+        generator.table="man_task_item_log";
         generator.tableDesc="浠诲姟宸ヤ綔妗�";
         generator.packagePath="com.vincent.rsf.server.manager";
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
index 108115b..0ddc29c 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
@@ -190,4 +190,19 @@
         }
         return R.ok(asnOrderService.batchUpdate(params, getLoginUserId()));
     }
+
+    @ApiOperation("涓�閿敹璐�")
+    @PostMapping("/asnOrder/complete/{id}")
+    @PreAuthorize("hasAuthority('manager:asnOrder:update')")
+    public R completeOrder(@PathVariable Long id) {
+        if (Objects.isNull(id)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return asnOrderService.completeOrder(id, getLoginUserId());
+    }
+
+
+
+
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockItemController.java
index 47e8a1b..844c06b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockItemController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockItemController.java
@@ -95,10 +95,10 @@
         List<KeyValVo> vos = new ArrayList<>();
         LambdaQueryWrapper<StockItem> wrapper = new LambdaQueryWrapper<>();
         if (!Cools.isEmpty(condition)) {
-            wrapper.like(StockItem::getMatnrk, condition);
+            wrapper.like(StockItem::getMaktx, condition);
         }
         stockItemService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
-                item -> vos.add(new KeyValVo(item.getId(), item.getMatnrk()))
+                item -> vos.add(new KeyValVo(item.getId(), item.getMaktx()))
         );
         return R.ok().add(vos);
     }
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 af1b7ed..11a8dc0 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
@@ -1,10 +1,12 @@
 package com.vincent.rsf.server.manager.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 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.api.entity.enums.TaskStsType;
 import com.vincent.rsf.server.common.utils.ExcelUtil;
 import com.vincent.rsf.server.common.annotation.OperationLog;
 import com.vincent.rsf.server.common.domain.BaseParam;
@@ -93,12 +95,16 @@
         if (Objects.isNull(ids) || ids.length < 1) {
             return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
-        List<TaskItem> list = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getTaskId, ids));
-        if (!list.isEmpty()) {
-            return R.error("鏈夋槑缁嗗垪琛ㄥ瓨鍦� 锛侊紒");
+        List<Long> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
+        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().in(Task::getId, ids).in(Task::getTaskStatus, longs));
+        if (tasks.isEmpty()) {
+            throw new CoolException("浠诲姟宸插鎵ц鐘舵�佷笉鍙彇娑堬紒锛�");
         }
         if (!taskService.removeByIds(Arrays.asList(ids))) {
             return R.error("Delete Fail");
+        }
+        if (!taskItemService.remove(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getTaskId, ids))) {
+            return R.error("Details delete Failed");
         }
         return R.ok("Delete Success").add(ids);
     }
@@ -123,16 +129,46 @@
         ExcelUtil.build(ExcelUtil.create(taskService.list(), Task.class), response);
     }
 
-
     @PreAuthorize("hasAuthority('manager:task:update')")
     @ApiOperation("瀹屾垚浠诲姟")
-    @GetMapping("/task/complete/{id}")
+    @PostMapping("/task/complete/{id}")
     public R completeTask(@PathVariable String id) {
         if (Objects.isNull(id)) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
-//        return taskService.completeTask(id);
-        return null;
+        List<Long> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
+        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getId, id).in(Task::getTaskStatus, longs));
+        if (tasks.isEmpty()) {
+            throw new CoolException("浠诲姟宸插鎵ц鐘舵�佷笉鍙竴閿畬鎴愶紒锛�");
+        }
+        try {
+            taskService.completeTask(tasks);
+        } catch (Exception ex) {
+            return R.error("浠诲姟寮傚父锛屾棤娉曞畬鎴愶紒锛�");
+        }
+        return R.ok();
+    }
+
+    @PreAuthorize("hasAuthority('manager:task:update')")
+    @ApiOperation("浠诲姟鍑哄簱缃《")
+    @PostMapping("/task/top/{id}")
+    public R setTop(@PathVariable String id) {
+        if (Objects.isNull(id)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        List<Long> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
+        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getId, id).in(Task::getTaskStatus, longs));
+        if (tasks.isEmpty()) {
+            throw new CoolException("浠诲姟宸插鎵ц鐘舵�佷笉鍙竴閿疆椤讹紒锛�");
+        }
+        try {
+            if (!taskService.update(new LambdaUpdateWrapper<Task>().set(Task::getSort, 100).eq(Task::getId, id))) {
+                throw new CoolException("缃《澶辫触锛侊紒");
+            }
+        } catch (Exception ex) {
+            return R.error("浠诲姟寮傚父锛屾棤娉曞畬鎴愶紒锛�");
+        }
+        return R.ok();
     }
 
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java
index 9adbe56..9ea862d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java
@@ -210,6 +210,18 @@
 //            null    // 澶囨敞
 //    );
 
+    public String getExceStatus$() {
+        if (Cools.isEmpty(this.exceStatus)){
+            return "";
+        }
+        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
+        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, DictTypeCode.DICT_ASN_EXCE_STATUS).eq(DictData::getValue, this.exceStatus));
+        if (Objects.isNull(dictData)) {
+            return null;
+        }
+        return dictData.getLabel();
+    }
+
     public String getType$(){
         if (Cools.isEmpty(this.type)){
             return "";
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 b2f899c..0e1a978 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
@@ -86,7 +86,7 @@
      * 鐗╂枡鏍囪瘑
      */
     @ApiModelProperty(value= "鐗╂枡鏍囪瘑")
-    private String matnrId;
+    private Long matnrId;
 
     /**
      * 鐗╂枡缂栫爜
@@ -233,7 +233,7 @@
 
     public AsnOrderItem() {}
 
-    public AsnOrderItem(Long asnId,String asnCode,Long poDetlId, String matnrCode, String poCode,String matnrId,String matnk,Double anfme,String stockUnit,Double purQty,String purUnit,Double qty,String splrCode,String splrName,String qrcode,String barcode,String packName,Integer status, Integer ntyStatus,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
+    public AsnOrderItem(Long asnId,String asnCode,Long poDetlId, String matnrCode, String poCode,Long matnrId,String matnk,Double anfme,String stockUnit,Double purQty,String purUnit,Double qty,String splrCode,String splrName,String qrcode,String barcode,String packName,Integer status, Integer ntyStatus,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
         this.asnId = asnId;
         this.asnCode = asnCode;
         this.poDetlId = poDetlId;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java
index 59d39db..346f37e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderLog.java
@@ -112,6 +112,9 @@
     @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
     private Integer status;
 
+    @ApiModelProperty("鎵ц鐘舵��")
+    private Short exceStatus;
+
     /**
      * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
      */
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 d90bbe0..d256b0c 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
@@ -58,7 +58,7 @@
      * 鐗╂枡缂栫爜
      */
     @ApiModelProperty(value= "鐗╂枡缂栫爜")
-    private String code;
+    private String matnrCode;
 
 
     @ApiModelProperty(value = "閫氱煡鍗曟槑缁嗘爣璇�")
@@ -68,7 +68,7 @@
      * 鍚嶇О
      */
     @ApiModelProperty(value= "鍚嶇О")
-    private String matnrk;
+    private String maktx;
 
     /**
      * 鏁伴噺
@@ -269,8 +269,8 @@
         this.stockId = stockId;
         this.matnrId = matnrId;
         this.asnItemId = asnItemId;
-        this.code = code;
-        this.matnrk = matnrk;
+        this.matnrCode = code;
+        this.maktx = matnrk;
         this.anfme = anfme;
         this.workQty = workQty;
         this.qty = qty;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
index 7d2e4a6..278ef22 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
@@ -34,10 +34,8 @@
 @Data
 @Accessors(chain = true)
 @TableName("man_task")
+@ApiModel(value = "Task", description = "浠诲姟妗�")
 public class Task implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
     /**
      * ID
      */
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 9658a4e..acbbbd4 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
@@ -4,6 +4,10 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.vincent.rsf.server.system.constant.DictTypeCode;
+import com.vincent.rsf.server.system.entity.DictData;
+import com.vincent.rsf.server.system.service.DictDataService;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 import java.text.SimpleDateFormat;
@@ -22,14 +26,13 @@
 import com.vincent.rsf.server.system.entity.User;
 import java.io.Serializable;
 import java.util.Date;
+import java.util.Objects;
 
 @Data
 @Accessors(chain = true)
 @TableName("man_task_item")
+@ApiModel(value = "TaskItem", description = "浠诲姟妗f槑缁�")
 public class TaskItem implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
     /**
      * ID
      */
@@ -207,6 +210,18 @@
 //            null    // 澶囨敞
 //    );
 
+    public String getOrderType$(){
+        if (null == this.orderType) {return  null;}
+        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
+        DictData dictDatas = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
+                .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_ORDER_TYPE)
+                .eq(DictData::getValue, this.orderType));
+        if (Objects.isNull(dictDatas) || Objects.isNull(dictDatas.getLabel())) {
+            return null;
+        }
+        return dictDatas.getLabel();
+    }
+
     public String getStatus$(){
         if (null == this.status){ return null; }
         switch (this.status){
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.java
index 9816e65..498f156 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.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_task_item_log")
 public class TaskItemLog implements Serializable {
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java
index 9dffe19..22db504 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java
@@ -2,6 +2,8 @@
 
 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;
@@ -26,6 +28,7 @@
 import java.util.Date;
 
 @Data
+@Accessors(chain = true)
 @TableName("man_task_log")
 public class TaskLog implements Serializable {
 
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 3ea93c3..86d45c9 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
@@ -68,7 +68,7 @@
      */
     @Scheduled(cron = "0 0/05 * * * ?  ")
     @Transactional(rollbackFor = Exception.class)
-    public void genAsnOrder() {
+    public synchronized void genAsnOrder() {
         //鍒ゆ柇鏄惁寮�鍚嚜鍔ㄧ敓鎴怉SN鍗曟嵁
         if (!flowProperties.getFlagAutoAsn()) {
             return;
@@ -129,7 +129,7 @@
                         .setPurUnit(item.getUnit())
                         .setMatnrCode(matnr.getCode())
                         .setMaktx(matnr.getName())
-                        .setMatnrId(matnr.getId() + "");
+                        .setMatnrId(matnr.getId());
                 orderItems.add(orderItem);
             });
             if (!asnOrderItemService.saveBatch(orderItems)) {
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 7d72b1c..1e857c8 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
@@ -35,6 +35,10 @@
     @Autowired
     private TaskItemService taskItemService;
     @Autowired
+    private TaskLogService taskLogService;
+    @Autowired
+    private TaskItemLogService taskItemLogService;
+    @Autowired
     private StockItemService stockItemService;
     @Autowired
     private PurchaseService purchaseService;
@@ -63,4 +67,55 @@
         }
         taskService.completeTask(tasks);
     }
+
+
+    /**
+    * @author Ryan
+    * @description 宸插畬鎴愪换鍔″姞鍏ュ巻鍙叉。
+    * @param
+    * @return
+    * @time 2025/4/3 12:54
+    */
+    @Scheduled(cron = "0 0/05 * * * ?  ")
+    @Transactional(rollbackFor = Exception.class)
+    public void taskLogUpdate() {
+        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.UPDATED_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>().in(TaskItem::getTaskId, list));
+        if (taskItems.isEmpty()) {
+            return;
+        }
+        List<TaskLog> taskLogs = new ArrayList<>();
+        tasks.forEach(task -> {
+            TaskLog taskLog = new TaskLog();
+            BeanUtils.copyProperties(task, taskLog);
+            taskLog.setTaskId(task.getId()).setId(null);
+            taskLogs.add(taskLog);
+        });
+        if (!taskLogService.saveBatch(taskLogs)) {
+            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("鍘熷浠诲姟鍒犻櫎澶辫触锛侊紒");
+        }
+        List<Long> itemIds = taskItems.stream().map(TaskItem::getId).collect(Collectors.toList());
+
+        if (!taskItemService.removeByIds(itemIds)) {
+            throw new CoolException("鍘熷浠诲姟鏄庣粏鍒犻櫎澶辫触锛侊紒");
+        }
+
+    }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
index 81ac399..64d420a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java
@@ -21,4 +21,5 @@
 
     boolean batchUpdate(BatchUpdateParam params, Long loginUserId);
 
+    R completeOrder(Long id, Long loginUserId);
 }
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 b385eed..99b749e 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
@@ -11,15 +11,20 @@
 import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
 import com.vincent.rsf.server.manager.controller.params.BatchUpdateParam;
 import com.vincent.rsf.server.manager.entity.AsnOrderItem;
+import com.vincent.rsf.server.manager.entity.AsnOrderItemLog;
+import com.vincent.rsf.server.manager.entity.AsnOrderLog;
 import com.vincent.rsf.server.manager.mapper.AsnOrderMapper;
 import com.vincent.rsf.server.manager.entity.AsnOrder;
 import com.vincent.rsf.server.manager.mapper.PurchaseMapper;
+import com.vincent.rsf.server.manager.service.AsnOrderItemLogService;
 import com.vincent.rsf.server.manager.service.AsnOrderItemService;
+import com.vincent.rsf.server.manager.service.AsnOrderLogService;
 import com.vincent.rsf.server.manager.service.AsnOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.mapper.SerialRuleMapper;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -46,6 +51,10 @@
     private PurchaseMapper purchaseMapper;
     @Autowired
     private AsnOrderItemService asnOrderItemService;
+    @Autowired
+    private AsnOrderLogService asnOrderLogService;
+    @Autowired
+    private AsnOrderItemLogService asnOrderItemLogService;
     @Resource
     private SerialRuleMapper serialRuleMapper;
 
@@ -171,6 +180,75 @@
                         .set(!Objects.isNull(order.getWkType()), AsnOrder::getWkType, order.getWkType())
                         .set(!Objects.isNull(order.getExceStatus()), AsnOrder::getExceStatus, order.getExceStatus())
                 .set(AsnOrder::getUpdateBy, userId));
+    }
 
+    /**
+     * @param id
+     * @param loginUserId
+     * @return
+     * @author Ryan
+     * @description 涓�閿敹璐�
+     * @time 2025/4/3 15:45
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R completeOrder(Long id, Long loginUserId) {
+        AsnOrder asnOrder = this.getById(id);
+        if (Objects.isNull(asnOrder)) {
+            throw new CoolException("鍗曟嵁涓嶅瓨鍦�!!");
+        }
+        //涓�閿姞鍏ュ巻鍙叉。
+        try {
+            operateOrderLogs(asnOrder);
+        } catch (Exception e) {
+            throw new CoolException("鏀惰揣瀹屾垚澶辫触锛侊紒");
+        }
+        return R.ok("鏀惰揣鎴愬姛锛侊紒");
+    }
+
+    /**
+     * @author Ryan
+     * @description 鍒犻櫎鍘熶富鍗曞強鏄庣粏锛屽姞鍏ュ巻鍙叉。
+     * @param
+     * @return
+     * @time 2025/3/19 19:53
+     */
+    @Transactional(rollbackFor = Exception.class)
+    private void operateOrderLogs(AsnOrder asrder) throws Exception{
+        if (Objects.isNull(asrder) || Objects.isNull(asrder.getId())) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        AsnOrder order = this.getById(asrder.getId());
+        AsnOrderLog orderLog = new AsnOrderLog();
+        order.setExceStatus(Short.valueOf("2"));
+        BeanUtils.copyProperties(order, orderLog);
+        orderLog.setId(null);
+        orderLog.setAsnId(order.getId());
+
+        if (!this.saveOrUpdate(order)) {
+            throw new CoolException("鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
+        if (!asnOrderLogService.save(orderLog)) {
+            throw new CoolException("涓诲崟鍘嗗彶妗f坊鍔犲け璐ワ紒锛�");
+        }
+        List<AsnOrderItemLog> logs = new ArrayList<>();
+        List<AsnOrderItem> items = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, order.getId()));
+        items.forEach(item -> {
+            AsnOrderItemLog itemLog = new AsnOrderItemLog();
+            BeanUtils.copyProperties(item, itemLog);
+            itemLog.setAsnItemId(itemLog.getId())
+                    .setAsnId(item.getAsnId());
+            logs.add(itemLog);
+        });
+
+        if (!asnOrderItemLogService.saveBatch(logs)) {
+            throw new CoolException("閫氱煡鍗曟槑缁嗗巻鍙叉。淇濆瓨澶辫触锛侊紒");
+        }
+        if (!asnOrderItemService.remove(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, order.getId()))) {
+            throw new CoolException("鍘熷崟鎹槑缁嗗垹闄ゅけ璐ワ紒锛�");
+        }
+        if (!this.removeById(asrder.getId())) {
+            throw new CoolException("鍘熷崟鎹垹闄ゅけ璐ワ紒锛�");
+        }
     }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java
index c64cd4a..e826e7f 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.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.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.manager.controller.params.IsptOrderParam;
@@ -171,6 +172,9 @@
                 throw new CoolException("鏄庣粏淇濆瓨澶辫触锛侊紒");
             }
         }
+        if (!asnOrderService.update(new LambdaUpdateWrapper<AsnOrder>().in(AsnOrder::getId, param.getIds()).set(AsnOrder::getNtyStatus, 1))) {
+            throw new CoolException("鎶ユ鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
         return R.ok("淇濆瓨鎴愬姛锛侊紒");
     }
 }
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 b3335ec..e902543 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
@@ -148,7 +148,9 @@
             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());
+                if (!Objects.isNull(purchase)) {
+                    stock.setPlatOrderNo(purchase.getPlatCode()).setPlatToken(purchase.getPlatId());
+                }
             }
             String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null);
             if (StringUtils.isBlank(ruleCode)) {
@@ -190,5 +192,8 @@
         if (!locService.update(new LambdaUpdateWrapper<Loc>().set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).in(Loc::getCode, locCodes))) {
             throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
         }
+        if (!this.update(new LambdaUpdateWrapper<Task>().set(Task::getTaskStatus, TaskStsType.UPDATED_IN.id))) {
+            throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
     }
 }
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 cc8f42a..e2c40cb 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
@@ -108,7 +108,7 @@
                     .setUnit(item.getStockUnit())
                     .setFieldsIndex(item.getFieldsIndex())
                     .setUnit(item.getStockUnit())
-                    .setMatnrId(StringUtils.isNotBlank(item.getMatnrId()) ? Long.parseLong(item.getMatnrId()) : null)
+                    .setMatnrId(item.getMatnrId())
                     .setMaktx(item.getMaktx())
                     .setMatnrCode(item.getMatnrCode());
             for (PakinItem waitPakinItem : waitPakin.getItems()) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java
index 34fb329..3239e46 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java
@@ -49,4 +49,9 @@
      */
     public final static String DICT_INSPECT_RESULT = "sys_inspect_result";
 
+    /**
+     * ASN璁㈠崟鎵ц鐘舵��
+     */
+    public final static String DICT_ASN_EXCE_STATUS = "sys_asn_exce_status";
+
 }
diff --git a/rsf-server/src/main/resources/application-dev.yml b/rsf-server/src/main/resources/application-dev.yml
index 2c4c6f0..888318c 100644
--- a/rsf-server/src/main/resources/application-dev.yml
+++ b/rsf-server/src/main/resources/application-dev.yml
@@ -12,9 +12,9 @@
       matching-strategy: ANT_PATH_MATCHER
   datasource:
     driver-class-name: com.mysql.jdbc.Driver
-#    url: jdbc:mysql://192.168.4.24:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://192.168.4.24:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
     username: root
-    url: jdbc:mysql://localhost:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+#    url: jdbc:mysql://localhost:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
 #    username: rsf
 
     password: 34821015

--
Gitblit v1.9.1