From 766c38fe0e8a7ba9ae62b5d6113e13b9df2707db Mon Sep 17 00:00:00 2001
From: DESKTOP-LMJ82IJ\Eno <creaycat@gmail.com>
Date: 星期日, 13 四月 2025 14:09:23 +0800
Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java |   19 
 rsf-admin/src/page/purchase/PurchaseItemList.jsx                                                |   15 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java                   |    6 
 rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx                                       |  170 +++++++
 rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx                                       |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java         |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java  |  101 ++-
 rsf-admin/src/page/qlyInspect/QlyInspectOpCreate.jsx                                            |  178 +++++++
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java         |   52 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java                |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/MatnrDefectType.java           |   26 +
 rsf-admin/src/page/basicInfo/loc/BindModal.jsx                                                  |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java                   |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaitPakinParam.java   |    3 
 rsf-admin/src/layout/SubMenu.jsx                                                                |    5 
 rsf-admin/src/page/system/dicts/dictType/DictDataCreate.jsx                                     |    0 
 rsf-admin/src/page/system/serialRule/SerialRuleItemEdit.jsx                                     |  162 +++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java   |    7 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java                    |    1 
 rsf-admin/src/i18n/zh.js                                                                        |    7 
 rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx                                              |    9 
 rsf-admin/src/i18n/en.js                                                                        |    7 
 rsf-admin/src/page/ResourceContent.js                                                           |   12 
 rsf-admin/src/config/setting.js                                                                 |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/QlyInspectService.java          |    2 
 rsf-admin/src/page/asnOrder/AsnOrderList.jsx                                                    |   29 
 rsf-admin/src/page/system/dicts/dictType/DictDataEdit.jsx                                       |  166 +++++++
 rsf-admin/src/page/system/serialRule/SerialRuleList.jsx                                         |   27 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java  |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java                  |    2 
 rsf-admin/src/page/system/serialRule/SerialRuleCreate.jsx                                       |   13 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java            |   20 
 rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx                                     |   52 +-
 rsf-admin/src/page/qlyInspect/QlyInspectList.jsx                                                |   15 
 rsf-admin/src/page/locAreaRela/LocAreaRelaList.jsx                                              |  154 ++++++
 rsf-admin/src/page/basicInfo/loc/LocList.jsx                                                    |    1 
 rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx                                                |    4 
 rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx                                   |   16 
 /dev/null                                                                                       |   18 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/QlyInspectController.java    |    5 
 rsf-admin/src/page/system/dicts/dictType/index.jsx                                              |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java        |    8 
 rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx                                       |   17 
 rsf-admin/src/App.jsx                                                                           |   20 
 rsf-admin/src/page/asnOrder/AsnOrderModal.jsx                                                   |    5 
 45 files changed, 1,160 insertions(+), 218 deletions(-)

diff --git a/rsf-admin/src/App.jsx b/rsf-admin/src/App.jsx
index f3fbe6b..7ede214 100644
--- a/rsf-admin/src/App.jsx
+++ b/rsf-admin/src/App.jsx
@@ -30,6 +30,8 @@
 import ResourceContent from "./page/ResourceContent";
 import { getSystemInfo, getSystemDicts, tenants } from "@/api/auth";
 import chineseMessages from 'ra-language-chinese';
+import { createTheme, ThemeProvider } from '@mui/material/styles';
+import { zhCN } from '@mui/material/locale';
 
 const i18nProvider = polyglotI18nProvider(
   (locale) => {
@@ -48,6 +50,15 @@
     allowMissing: true,
   },
 );
+
+
+const theme = createTheme(
+  {
+    palette: { main: '#1976d2' },
+  },
+  zhCN
+)
+
 
 const store = localStorageStore(SPA_VERSION, SPA_NAME);
 
@@ -101,9 +112,12 @@
 };
 
 const AppWrapper = () => (
-  <StoreContextProvider value={store}>
-    <App />
-  </StoreContextProvider>
+  <ThemeProvider theme={theme}>
+    <StoreContextProvider value={store}>
+      <App />
+    </StoreContextProvider>
+  </ThemeProvider>
+
 );
 
 export default AppWrapper;
\ No newline at end of file
diff --git a/rsf-admin/src/config/setting.js b/rsf-admin/src/config/setting.js
index 9fe0af1..2e86d71 100644
--- a/rsf-admin/src/config/setting.js
+++ b/rsf-admin/src/config/setting.js
@@ -31,7 +31,7 @@
 
 export const REFERENCE_INPUT_PAGESIZE = 1000;
 
-export const OPERATE_MODE = 'undoable'; // pessimistic | optimistic(tip) | undoable
+export const OPERATE_MODE = 'pessimistic'; // pessimistic | optimistic(tip) | undoable
 
 export const EDIT_MODE = 'pessimistic'; // pessimistic | undoable
 
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index daf2177..a9d204c 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -9,6 +9,9 @@
             fail: "Fail",
             dataError: "Submit data was error, Please check",
         },
+        button: {
+            edit: "Edit",
+        },
         field: {
             id: 'ID',
             uuid: 'uuid',
@@ -134,7 +137,7 @@
         container: 'Container',
         contract: 'Contract',
         qlyInspect: 'QlyInspect',
-        qlyIsptItem: '璐ㄦ淇℃伅鏄庣粏',
+        qlyIsptItem: 'qlyIsptItem',
         dictType: 'DictType',
         dictData: 'DictData',
         companys: 'Companys',
@@ -422,6 +425,7 @@
                 dlyQty: "dlyQty",
                 rcptQty: "rcptQty",
                 isptQty: "isptQty",
+                isptResult: "isptResult",
                 isptStatus: "isptStatus",
             },
             qlyIsptItem: {
@@ -506,6 +510,7 @@
                 arrTime: "Arrived",
                 rleStatus: "Release",
                 ntyStatus: "Notify",
+                exceStatus: 'bill status'
             },
             asnOrderItem: {
                 asnId: "asnId",
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index e1546a9..d1e20f5 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -9,6 +9,9 @@
             fail: "鏈嶅姟鍣ㄩ敊璇�",
             dataError: "鏁版嵁閿欒锛岃浠旂粏妫�鏌�",
         },
+        button: {
+            edit: "缂栬緫",
+        },
         field: {
             id: 'ID',
             uuid: '缂栧彿',
@@ -430,6 +433,7 @@
                 dlyQty: "閫佽揣鏁伴噺",
                 rcptQty: "鏀惰揣鏁伴噺	",
                 isptQty: "璐ㄦ鏁伴噺",
+                isptResult: "璐ㄦ缁撴灉",
                 isptStatus: "璐ㄦ鐘舵��",
             },
             qlyIsptItem: {
@@ -513,8 +517,9 @@
                 qty: "瀹屾垚鏁伴噺",
                 logisNo: "鐗╂祦鍗曞彿",
                 arrTime: "棰勮鍒拌揪鏃堕棿",
-                rleStatus: "鐘舵��",
+                rleStatus: "閲婃斁鐘舵��",
                 ntyStatus: "涓婃姤鐘舵��",
+                exceStatus: '鍗曟嵁鐘舵��'
             },
             asnOrderItem: {
                 asnId: "涓诲崟鏍囪瘑",
diff --git a/rsf-admin/src/layout/SubMenu.jsx b/rsf-admin/src/layout/SubMenu.jsx
index bb979eb..d79867e 100644
--- a/rsf-admin/src/layout/SubMenu.jsx
+++ b/rsf-admin/src/layout/SubMenu.jsx
@@ -10,7 +10,8 @@
 } from '@mui/material';
 import ExpandMore from '@mui/icons-material/ExpandMore';
 import { useTranslate, useSidebarState } from 'react-admin';
-
+import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
+import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';
 const SubMenu = (props) => {
     const { handleToggle, isOpen, name, icon, children, dense } = props;
     const translate = useTranslate();
@@ -21,7 +22,7 @@
         <MenuItem dense={dense} onClick={handleToggle} sx={{ display: 'flex', alignItems: 'center' }}>
             <ListItemIcon sx={{ minWidth: 40, color: 'text.secondary', display: 'flex', alignItems: 'center' }}>
                 {/* {isOpen ? <ExpandMore /> : icon}  */}
-                {icon}
+                {isOpen ? <KeyboardArrowDownIcon /> : <KeyboardArrowRightIcon />}
             </ListItemIcon>
             <Typography variant="inherit" color="textSecondary" sx={{ ml: 1, display: 'flex', alignItems: 'center' }}>
                 {translate(name)}
diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js
index 7f54c8c..82f7ee1 100644
--- a/rsf-admin/src/page/ResourceContent.js
+++ b/rsf-admin/src/page/ResourceContent.js
@@ -23,13 +23,13 @@
 import qlyInspect from './qlyInspect';
 import qlyIsptItem from './qlyIsptItem';
 import dictType from './system/dicts/dictType';
-import dictData from './system/dicts/dictData';
+// import dictData from './system/dicts/dictData';
 import companys from './basicInfo/companys';
 import locType from './basicInfo/locType';
 import locArea from './basicInfo//locArea';
 import locAreaMatRela from './basicInfo/locAreaMatRela';
 import locAreaMat from './basicInfo/locAreaMat';
-import serialRuleItem from './system/serialRuleItem';
+// import serialRuleItem from './system/serialRuleItem';
 import serialRule from './system/serialRule';
 import whMat from './basicInfo/whMat';
 import asnOrder from './asnOrder';
@@ -89,12 +89,12 @@
             return qlyIsptItem;
         case 'dictType':
             return dictType;
-        case 'dictData':
-            return dictData;
+        // case 'dictData':
+        //     return dictData;
         case 'companys':
             return companys;
-        case 'serialRuleItem':
-            return serialRuleItem;
+        // case 'serialRuleItem':
+        //     return serialRuleItem;
         case 'serialRule':
             return serialRule;
         case 'whMat':
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
index ec50864..c73a22c 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
@@ -78,7 +78,9 @@
   <TextInput source="poCode" label="table.field.asnOrder.poCode" />,
   <NumberInput source="poId" label="table.field.asnOrder.poId" />,
   <TextInput source="type" label="table.field.asnOrder.type" />,
-  <TextInput source="wkType" label="table.field.asnOrder.wkType" />,
+  <ReferenceInput source="wkType" reference="dictData" filter={{dictTypeCode: 'sys_business_type'}}  label="table.field.asnOrder.wkType">
+    <AutocompleteInput label="table.field.asnOrder.wkType" optionValue="value" />
+  </ReferenceInput>,
   <NumberInput source="anfme" label="table.field.asnOrder.anfme" />,
   <NumberInput source="qty" label="table.field.asnOrder.qty" />,
   <TextInput source="logisNo" label="table.field.asnOrder.logisNo" />,
@@ -92,22 +94,23 @@
 
   <TextInput label="common.field.memo" source="memo" />,
   <DictionarySelect
-    label='common.field.status'
+    label='table.field.asnOrder.exceStatus'
     name="exceStatus"
     dictTypeCode="sys_asn_exce_status"
+    alwaysOn
   />,
 
 ]
 
 const AsnOrderList = () => {
   const translate = useTranslate();
-
   const [createDialog, setCreateDialog] = useState(false);
   const [drawerVal, setDrawerVal] = useState(false);
   const [modalType, setmodalType] = useState(0);
   const billReload = useRef();
-
   const navigate = useNavigate();
+  const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type')) || [];
+
   const assign = (record) => {
     navigate(`/asnOrderItem?asnId=${record.id}`);
   };
@@ -129,17 +132,16 @@
         sort={{ field: "create_time", order: "desc" }}
         actions={(
           <TopToolbar>
-
             <FilterButton />
             <MyCreateButton onClick={() => { setCreateDialog(true); setmodalType(0) }} />
             <SelectColumnsButton preferenceKey='asnOrder' />
-
             <MyExportButton />
           </TopToolbar>
         )}
         perPage={DEFAULT_PAGE_SIZE}
       >
         <StyledDatagrid
+          sx={{ width: '100%' }}
           preferenceKey='asnOrder'
           bulkActionButtons={<> <InspectionsButton /><BulkDeleteButton mutationMode={OPERATE_MODE} /></>}
           rowClick={() => false}
@@ -152,22 +154,21 @@
           <TextField source="poCode" label="table.field.asnOrder.poCode" />
           <NumberField source="poId" label="table.field.asnOrder.poId" />
           <TextField source="type$" label="table.field.asnOrder.type" />
+          {/* <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+            <TextField source="wkType" />
+          </ReferenceField> */}
+          {/* <AutocompleteInput choices={dicts} optionText="label" label="table.field.qlyInspect.wkType" source="wkType" optionValue="value" /> */}
           <TextField source="wkType$" label="table.field.asnOrder.wkType" />
           <NumberField source="anfme" label="table.field.asnOrder.anfme" />
           <NumberField source="qty" label="table.field.asnOrder.qty" />
           <TextField source="logisNo" label="table.field.asnOrder.logisNo" />
           <DateField source="arrTime" label="table.field.asnOrder.arrTime" showTime />
           <TextField source="rleStatus$" label="table.field.asnOrder.rleStatus" sortable={false} />
-
-          <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
-            <TextField source="nickname" />
-          </ReferenceField>
+          <TextField source="updateBy$" label="common.field.updateBy" />
           <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>
+          <TextField source="createBy$" label="common.field.createBy" />
           <DateField source="createTime" label="common.field.createTime" showTime />
-          <BillStatusField cellClassName="status" source="exceStatus" label="common.field.status" />
+          <BillStatusField cellClassName="status" source="exceStatus" label="table.field.asnOrder.exceStatus" />
           <TextField source="memo" label="common.field.memo" sortable={false} />
           <WrapperField cellClassName="opt" label="common.field.opt" width={300} >
             {/* <Button label="toolbar.print" onClick={print}>
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
index 89de5f9..f12bc46 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx
@@ -233,10 +233,7 @@
                                         dictTypeCode="sys_order_type"
                                         required
                                     />
-
-
                                 </Grid>
-
                                 <Grid item md={3}>
                                     <DictSelect
                                         label={translate("table.field.asnOrder.wkType")}
@@ -246,7 +243,6 @@
                                         required
                                     />
                                 </Grid>
-
                                 <Grid item md={3}>
                                     <TextField
                                         label={translate("table.field.asnOrder.poCode")}
@@ -254,7 +250,6 @@
                                         onChange={(e) => handleChange(e.target.value, 'poCode')}
                                     />
                                 </Grid>
-
                                 <Grid item md={3}>
                                     <TextField
                                         label={translate("table.field.asnOrder.logisNo")}
diff --git a/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx b/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx
index 3160580..4e61d1b 100644
--- a/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx
+++ b/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx
@@ -22,16 +22,11 @@
 } from 'react-admin';
 import { useWatch, useFormContext } from "react-hook-form";
 import { Stack, Grid, Box, Typography, Card } from '@mui/material';
-import * as Common from '@/utils/common';
 import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
 import EditBaseAside from "../components/EditBaseAside";
 import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
-// import AsnOrderItemLogList from "./AsnOrderItemLogList"
+import AsnOrderItemLogList from "./AsnOrderItemLogList"
 const FormToolbar = () => {
-    const { getValues } = useFormContext();
-
     return (
         <Toolbar sx={{ justifyContent: 'end' }}>
             <SaveButton />
@@ -141,7 +136,7 @@
                     {translate('common.edit.title.common')}
                 </Typography>
             </Grid>
-            {/* <AsnOrderItemLogList /> */}
+            <AsnOrderItemLogList />
         </>
     )
 }
diff --git a/rsf-admin/src/page/basicInfo/loc/BindModal.jsx b/rsf-admin/src/page/basicInfo/loc/BindModal.jsx
index 41e8d6f..e0f7338 100644
--- a/rsf-admin/src/page/basicInfo/loc/BindModal.jsx
+++ b/rsf-admin/src/page/basicInfo/loc/BindModal.jsx
@@ -110,6 +110,7 @@
         const parmas = {
             locId: selectedIds,
             areaMatId: formData.areaMatId,
+            groupId: formData.groupId,
             matnrId: formData.matnrId,
         }
 
@@ -170,7 +171,7 @@
                                 <ReferenceArrayInput source="matnrId" reference="matnr" filter={{ groupId: formData.groupId }}>
                                     <SelectArrayInput
                                         label="table.field.locAreaMatRela.matnrId"
-                                        validate={required()}
+                                        // validate={required()}
                                         value={formData.matnrId}
                                         onChange={(e) => handleChange(e.target.value, 'matnrId')}
                                     />
diff --git a/rsf-admin/src/page/basicInfo/loc/LocList.jsx b/rsf-admin/src/page/basicInfo/loc/LocList.jsx
index bac9056..8811f4d 100644
--- a/rsf-admin/src/page/basicInfo/loc/LocList.jsx
+++ b/rsf-admin/src/page/basicInfo/loc/LocList.jsx
@@ -172,7 +172,6 @@
                                 onClick={() => { setCreateDialog(true) }}>
                                 {translate('create.empty.button')}
                             </Button>
-
                             <Button
                                 variant="contained"
                                 color="primary"
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
index 04ff032..2d14bcd 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
@@ -369,7 +369,9 @@
     const { ...parmas } = props;
     const form = useFormContext();
     const field = `extendFields.${parmas.source}`;
-    const value = form.getValues(field);
+
+    const value = form.getValues(field) || form.formState.defaultValues?.extendFields?.[parmas.source];
+
     value && form.setValue(parmas.source, value);
     return (
         <TextInput
diff --git a/rsf-admin/src/page/locAreaRela/LocAreaRelaList.jsx b/rsf-admin/src/page/locAreaRela/LocAreaRelaList.jsx
new file mode 100644
index 0000000..cb1ae2b
--- /dev/null
+++ b/rsf-admin/src/page/locAreaRela/LocAreaRelaList.jsx
@@ -0,0 +1,154 @@
+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 LocAreaRelaCreate from "./LocAreaRelaCreate";
+import LocAreaRelaPanel from "./LocAreaRelaPanel";
+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="locAreaId" label="table.field.locAreaRela.locAreaId" />,
+    <NumberInput source="locId" label="table.field.locAreaRela.locId" />,
+
+    <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 LocAreaRelaList = () => {
+    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.locAreaRela"}
+                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
+                filters={filters}
+                sort={{ field: "create_time", order: "desc" }}
+                actions={(
+                    <TopToolbar>
+                        <FilterButton />
+                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                        <SelectColumnsButton preferenceKey='locAreaRela' />
+                        <MyExportButton />
+                    </TopToolbar>
+                )}
+                perPage={DEFAULT_PAGE_SIZE}
+            >
+                <StyledDatagrid
+                    preferenceKey='locAreaRela'
+                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                    rowClick={(id, resource, record) => false}
+                    expand={() => <LocAreaRelaPanel />}
+                    expandSingle={true}
+                    omit={['id', 'createTime', 'createBy', 'memo']}
+                >
+                    <NumberField source="id" />
+                    <NumberField source="locAreaId" label="table.field.locAreaRela.locAreaId" />
+                    <NumberField source="locId" label="table.field.locAreaRela.locId" />
+
+                    <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>
+            <LocAreaRelaCreate
+                open={createDialog}
+                setOpen={setCreateDialog}
+            />
+            <PageDrawer
+                title='LocAreaRela Detail'
+                drawerVal={drawerVal}
+                setDrawerVal={setDrawerVal}
+            >
+            </PageDrawer>
+        </Box>
+    )
+}
+
+export default LocAreaRelaList;
diff --git a/rsf-admin/src/page/purchase/PurchaseItemList.jsx b/rsf-admin/src/page/purchase/PurchaseItemList.jsx
index 970263d..ae4fd96 100644
--- a/rsf-admin/src/page/purchase/PurchaseItemList.jsx
+++ b/rsf-admin/src/page/purchase/PurchaseItemList.jsx
@@ -1,5 +1,4 @@
 import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
-import { useNavigate, useLocation } from 'react-router-dom';
 import {
   List,
   DatagridConfigurable,
@@ -8,28 +7,16 @@
   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,
   useGetRecordId,
 } from 'react-admin';
@@ -58,7 +45,6 @@
 
 const filters = [
   <SearchInput source="condition" alwaysOn />,
-
   <NumberInput source="purchaseId" label="table.field.purchaseItem.purchaseId" />,
   <TextInput source="platItemId" label="table.field.purchaseItem.platItemId" />,
   <TextInput source="matnrCode" label="table.field.purchaseItem.matnrCode" />,
@@ -72,7 +58,6 @@
   <TextInput source="splrName" label="table.field.purchaseItem.splrName" />,
   <TextInput source="splrCode" label="table.field.purchaseItem.splrCode" />,
   <TextInput source="splrBatch" label="table.field.purchaseItem.splrBatch" />,
-
   <TextInput label="common.field.memo" source="memo" />,
   <SelectInput
     label="common.field.status"
diff --git a/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx b/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
index 46b4912..5a0bbc3 100644
--- a/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
+++ b/rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
@@ -52,7 +52,7 @@
 import request from '@/utils/request';
 import AsnSelModal from "./AsnSelModal";
 import InspectModal from "./InspectModal";
-
+import QlyInspectOpCreate from './QlyInspectOpCreate';
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
         height: '.9em'
@@ -69,14 +69,12 @@
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-
     <TextInput source="code" label="table.field.qlyInspect.code" />,
     <TextInput source="wkType" label="table.field.qlyInspect.wkType" />,
     <NumberInput source="safeQty" label="table.field.qlyInspect.safeQty" />,
     <NumberInput source="dlyQty" label="table.field.qlyInspect.dlyQty" />,
     <NumberInput source="rcptQty" label="table.field.qlyInspect.rcptQty" />,
     <NumberInput source="isptQty" label="table.field.qlyInspect.isptQty" />,
-
     <TextInput label="common.field.memo" source="memo" />,
     <SelectInput
         label="common.field.status"
@@ -91,9 +89,9 @@
 
 const QlyInspectList = () => {
     const translate = useTranslate();
-
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
+    const [opCreateDialog, setOpCreateDialog] = useState(false);
 
     return (
         <Box display="flex">
@@ -119,6 +117,7 @@
                 actions={(
                     <TopToolbar>
                         <AsnCreatButton />
+                        <MyCreateButton onClick={() => { setOpCreateDialog(true) }} />
                         <FilterButton />
                         <SelectColumnsButton preferenceKey='qlyInspect' />
                         <MyExportButton />
@@ -167,14 +166,16 @@
                 open={createDialog}
                 setOpen={setCreateDialog}
             />
+            <QlyInspectOpCreate
+                open={opCreateDialog}
+                setOpen={setOpCreateDialog}
+            />
             <PageDrawer
                 title='QlyInspect Detail'
                 drawerVal={drawerVal}
                 setDrawerVal={setDrawerVal}
             >
             </PageDrawer>
-
-
         </Box>
     )
 }
@@ -186,7 +187,7 @@
     const notify = useNotify();
     const refresh = useRefresh();
     const [createDialog, setCreateDialog] = useState(false);
-
+    const [opCreateDialog, setOpCreateDialog] = useState(false);
 
     return (
         <>
diff --git a/rsf-admin/src/page/qlyInspect/QlyInspectOpCreate.jsx b/rsf-admin/src/page/qlyInspect/QlyInspectOpCreate.jsx
new file mode 100644
index 0000000..ea33da9
--- /dev/null
+++ b/rsf-admin/src/page/qlyInspect/QlyInspectOpCreate.jsx
@@ -0,0 +1,178 @@
+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,
+    ReferenceField,
+} 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 QlyInspectOpCreate = (props) => {
+    const { open, setOpen } = props;
+    const translate = useTranslate();
+    const notify = useNotify();
+    const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type')) || [];
+    const isptResult = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_inspect_result')) || [];
+    const isptStatus = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_qly_inspect_status')) || [];
+
+    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}>
+                                    <ReferenceInput
+                                        source="asnCode"
+                                        reference="asnOrder"
+                                    >
+                                        <AutocompleteInput
+                                            label="table.field.qlyInspect.asnCode"
+                                            optionText="code"
+                                            filterToQuery={(val) => ({ name: val })}
+                                        />
+                                    </ReferenceInput>
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <AutocompleteInput
+                                        choices={dicts}
+                                        optionText="label"
+                                        label="table.field.qlyInspect.wkType"
+                                        source="wkType"
+                                        optionValue="value"
+                                        parse={v => v}
+                                        validate={[required()]} />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.qlyInspect.safeQty"
+                                        source="safeQty"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.qlyInspect.dlyQty"
+                                        source="dlyQty"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.qlyInspect.rcptQty"
+                                        source="rcptQty"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <NumberInput
+                                        label="table.field.qlyInspect.isptQty"
+                                        source="isptQty"
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <AutocompleteInput
+                                        choices={isptStatus}
+                                        optionText="label"
+                                        label="table.field.qlyInspect.isptStatus"
+                                        source="isptStatus"
+                                        optionValue="value"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
+                                    <AutocompleteInput
+                                        choices={isptResult}
+                                        optionText="label"
+                                        label="table.field.qlyInspect.isptResult"
+                                        source="isptResult"
+                                        optionValue="value"
+                                        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 QlyInspectOpCreate;
diff --git a/rsf-admin/src/page/system/dicts/dictData/index.jsx b/rsf-admin/src/page/system/dicts/dictData/index.jsx
deleted file mode 100644
index 31b11ac..0000000
--- a/rsf-admin/src/page/system/dicts/dictData/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    ListGuesser,
-    EditGuesser,
-    ShowGuesser,
-} from "react-admin";
-
-import DictDataList from "./DictDataList";
-import DictDataEdit from "./DictDataEdit";
-
-export default {
-    list: DictDataList,
-    edit: DictDataEdit,
-    show: ShowGuesser,
-    recordRepresentation: (record) => {
-        return `${record.id}`
-    }
-};
diff --git a/rsf-admin/src/page/system/dicts/dictData/DictDataCreate.jsx b/rsf-admin/src/page/system/dicts/dictType/DictDataCreate.jsx
similarity index 100%
rename from rsf-admin/src/page/system/dicts/dictData/DictDataCreate.jsx
rename to rsf-admin/src/page/system/dicts/dictType/DictDataCreate.jsx
diff --git a/rsf-admin/src/page/system/dicts/dictType/DictDataEdit.jsx b/rsf-admin/src/page/system/dicts/dictType/DictDataEdit.jsx
new file mode 100644
index 0000000..dcd06ee
--- /dev/null
+++ b/rsf-admin/src/page/system/dicts/dictType/DictDataEdit.jsx
@@ -0,0 +1,166 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    SimpleForm,
+    Form,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    DeleteButton,
+    useNotify,
+    useRedirect,
+    useEditContext,
+    EditBase,
+    useGetOne,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import DialogCloseButton from "../../../components/DialogCloseButton";
+import EditBaseAside from "../../../components/EditBaseAside";
+import MemoInput from "../../../components/MemoInput";
+import StatusSelectInput from "../../../components/StatusSelectInput";
+
+const EditToolbar = () => {
+    const form = useFormContext();
+    const { record, isPending } = useEditContext();
+    const redirect = useRedirect();
+    return (
+        <Toolbar sx={{ justifyContent: 'end' }}>
+            <SaveButton type="button" mutationOptions={{
+                onSuccess: () => {
+                    redirect('/dictType/' + record?.dictTypeId)
+                }
+            }} />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const DictDataEdit = (props) => {
+    const { open, setOpen, record } = props;
+    const translate = useTranslate();
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+    const {data, isPending, } = useGetOne('dictData', {id: record?.id});
+    if (data == null || data == undefined) {return}
+    return (
+        <>
+            <Edit
+                id={record?.id}
+                resource="dictData"
+                mutationMode={EDIT_MODE}
+            >
+                <Dialog
+                    open={open}
+                    onClose={handleClose}
+                    aria-labelledby="form-dialog-title"
+                    fullWidth
+                    disableRestoreFocus
+                    maxWidth="md"
+                >
+                    <Form>
+                        <DialogTitle id="form-dialog-title" sx={{
+                            position: 'sticky',
+                            top: 0,
+                            backgroundColor: 'background.paper',
+                            zIndex: 1000
+                        }}
+                        >
+                            {translate('update.title')}
+                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                                <DialogCloseButton onClose={handleClose} />
+                            </Box>
+                        </DialogTitle>
+                        <DialogContent sx={{ mt: 2 }}>
+                            <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
+                                <Grid item xs={12} md={8}>
+                                    <Typography variant="h6" gutterBottom>
+                                        {translate('common.edit.title.main')}
+                                    </Typography>
+                                    <Stack direction='row' gap={2}>
+                                        <TextInput
+                                            label="table.field.dictData.dictTypeId"
+                                            source="dictTypeId"
+                                            readOnly
+                                            defaultValue={record?.id}
+                                            parse={v => v}
+                                            validate={required()}
+                                        />
+                                    </Stack>
+                                    <Stack direction='row' gap={2}>
+                                        <TextInput
+                                            label="table.field.dictData.dictTypeCode"
+                                            source="dictTypeCode"
+                                            defaultValue={record?.code}
+                                            readOnly
+                                            parse={v => v}
+                                            validate={required()}
+                                        />
+                                    </Stack>
+                                    <Stack direction='row' gap={2}>
+                                        <TextInput
+                                            label="table.field.dictData.value"
+                                            source="value"
+                                            parse={v => v}
+                                            validate={required()}
+                                        />
+                                    </Stack>
+                                    <Stack direction='row' gap={2}>
+                                        <TextInput
+                                            label="table.field.dictData.label"
+                                            source="label"
+                                            validate={required()}
+                                            parse={v => v}
+                                        />
+                                    </Stack>
+                                    <Stack direction='row' gap={2}>
+                                        <NumberInput
+                                            label="table.field.dictData.sort"
+                                            source="sort"
+                                        />
+                                    </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>
+                        </DialogContent>
+                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                            <Toolbar sx={{ width: '100%', justifyContent: 'end' }}  >
+                                <SaveButton type="button" mutationOptions={{
+                                    onSuccess: () => {
+                                        setOpen(false)
+                                    }
+                                }} />
+                            </Toolbar>
+                        </DialogActions>
+                    </Form>
+                </Dialog>
+            </Edit >
+        </>
+    )
+}
+
+export default DictDataEdit;
diff --git a/rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx b/rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx
new file mode 100644
index 0000000..9f5bad2
--- /dev/null
+++ b/rsf-admin/src/page/system/dicts/dictType/DictDataList.jsx
@@ -0,0 +1,170 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import { useNavigate, useLocation } 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,
+    useGetRecordId,
+    useGetPathForRecord,
+    useGetOne,
+    Button,
+} from 'react-admin';
+import { Box, Typography, Card, Stack } from '@mui/material';
+import { styled } from '@mui/material/styles';
+import DictDataCreate from "./DictDataCreate";
+import EmptyData from "../../../components/EmptyData";
+import MyCreateButton from "../../../components/MyCreateButton";
+import MyExportButton from '../../../components/MyExportButton';
+import PageDrawer from "../../../components/PageDrawer";
+import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import DictDataEdit from "./DictDataEdit";
+import { use } from "react";
+
+
+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 />,
+    <TextInput source="dictTypeId" label="table.field.dictData.dictTypeId" />,
+    <TextInput source="dictTypeCode" label="table.field.dictData.dictTypeCode" />,
+    <TextInput source="value" label="table.field.dictData.value" />,
+    <TextInput source="label" label="table.field.dictData.label" />,
+    <NumberInput source="sort" label="table.field.dictData.sort" />,
+    // <TextInput source="color" label="table.field.dictData.color" />,
+    <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 DictDataList = () => {
+    const translate = useTranslate();
+    const [createDialog, setCreateDialog] = useState(false);
+    const [editDialog, setEditDialog] = useState(false);
+    const [drawerVal, setDrawerVal] = useState(false);
+    const [select, setSelect] = useState({});
+    const dictId = useGetRecordId();
+    const { data: dicts, isPending, error } = useGetOne('dictType', { id: dictId });
+
+    return (
+        <>
+            <Box display="flex" >
+                <List
+                    resource="dictData"
+                    sx={{
+                        flexGrow: 1,
+                        transition: (theme) =>
+                            theme.transitions.create(['all'], {
+                                duration: theme.transitions.duration.enteringScreen,
+                            }),
+                        marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+                    }}
+                    title={"menu.dictData"}
+                    empty={false}
+                    filters={filters}
+                    filter={{ dictTypeId: dictId }}
+                    sort={{ field: "create_time", order: "desc" }}
+                    actions={(
+                        <TopToolbar>
+                            <FilterButton />
+                            <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+                            <SelectColumnsButton preferenceKey='dictData' />
+                            <MyExportButton />
+                        </TopToolbar>
+                    )}
+                    perPage={DEFAULT_PAGE_SIZE}
+                >
+                    <StyledDatagrid
+                        bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
+                        rowClick={(id, resource, record) => {
+                            setSelect(record)
+                            setEditDialog(true)
+                        }}
+                        omit={['id', 'createTime', 'createBy', 'memo']}
+                    >
+                        <NumberField source="id" />
+                        <TextField source="dictTypeId" label="table.field.dictData.dictTypeId" />
+                        <TextField source="dictTypeCode" label="table.field.dictData.dictTypeCode" />
+                        <TextField source="value" label="table.field.dictData.value" />
+                        <TextField source="label" label="table.field.dictData.label" />
+                        <NumberField source="sort" label="table.field.dictData.sort" />
+                        <TextField source="updateBy$" label="common.field.updateBy" />
+                        <DateField source="updateTime" label="common.field.updateTime" showTime />
+                        <TextField source="createBy$" label="common.field.createBy" />
+                        <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">
+                            <Button onClick={() => { setEditDialog(true) }}>缂栬緫</Button>
+                            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode='pessimistic' redirect={"/dictType/" + dictId} />
+                        </WrapperField>
+                    </StyledDatagrid>
+                </List>
+                <DictDataEdit
+                    open={editDialog}
+                    record={select}
+                    setOpen={setEditDialog}
+                />
+                <DictDataCreate
+                    open={createDialog}
+                    record={dicts}
+                    setOpen={setCreateDialog}
+                />
+                <PageDrawer
+                    title='DictData Detail'
+                    drawerVal={drawerVal}
+                    setDrawerVal={setDrawerVal}
+                >
+                </PageDrawer>
+            </Box>
+        </>
+
+    )
+}
+
+export default DictDataList;
diff --git a/rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx b/rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx
index d938890..c9905f0 100644
--- a/rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx
+++ b/rsf-admin/src/page/system/dicts/dictType/DictTypeEdit.jsx
@@ -28,12 +28,13 @@
 import CustomerTopToolBar from "../../../components/EditTopToolBar";
 import MemoInput from "../../../components/MemoInput";
 import StatusSelectInput from "../../../components/StatusSelectInput";
-import DictDataList from "../dictData/DictDataList";
+import DictDataEdit  from "./DictDataEdit";
+import DictDataList from "./DictDataList";
 
 const FormToolbar = () => {
     const { getValues } = useFormContext();
     return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
+        <Toolbar sx={{ justifyContent: 'end' }}>
             <SaveButton />
             <DeleteButton mutationMode="optimistic" />
         </Toolbar>
@@ -42,7 +43,6 @@
 
 const DictTypeEdit = () => {
     const translate = useTranslate();
-
     return (
         <>
             <Edit
diff --git a/rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx b/rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx
index 0236497..e5b7332 100644
--- a/rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx
+++ b/rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx
@@ -38,7 +38,6 @@
 import EmptyData from "../../../components/EmptyData";
 import MyCreateButton from "../../../components/MyCreateButton";
 import MyExportButton from '../../../components/MyExportButton';
-import MyField from "../../../components/MyField";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
@@ -57,8 +56,8 @@
 
 const filters = [
     <SearchInput source="condition" alwaysOn />,
-    <DateInput label='common.time.after' source="timeStart"  />,
-    <DateInput label='common.time.before' source="timeEnd"  />,
+    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
+    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
     <TextInput source="code" label="table.field.dictType.code" />,
     <TextInput source="name" label="table.field.dictType.name" />,
     <TextInput source="description" label="table.field.dictType.description" />,
@@ -106,15 +105,15 @@
                 <StyledDatagrid
                     preferenceKey='dictType'
                     bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
-                    rowClick={(id, resource, record) => false}
+                    rowClick={'edit'}
                     omit={['id', 'createTime', 'createBy', 'memo']}
                 >
                     <NumberField source="id" />
-                    <MyField source="code" label="table.field.dictType.code"
-                        onClick={(event, record, val) => {
-                            event.stopPropagation();
-                            assign(record);
-                        }}
+                    <TextField source="code" label="table.field.dictType.code"
+                        // onClick={(event, record, val) => {
+                        //     event.stopPropagation();
+                        //     assign(record);
+                        // }}
                     />
                     <TextField source="name" label="table.field.dictType.name" />
                     <TextField source="description" label="table.field.dictType.description" />
diff --git a/rsf-admin/src/page/system/dicts/dictType/index.jsx b/rsf-admin/src/page/system/dicts/dictType/index.jsx
index 7dc7dcb..b0f025e 100644
--- a/rsf-admin/src/page/system/dicts/dictType/index.jsx
+++ b/rsf-admin/src/page/system/dicts/dictType/index.jsx
@@ -11,7 +11,7 @@
 export default {
     list: DictTypeList,
     edit: DictTypeEdit,
-    show: ShowGuesser,
+    // show: ShowGuesser,
     recordRepresentation: (record) => {
         return `${record.name}`
     }
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleCreate.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleCreate.jsx
index d1ef481..7ea0c01 100644
--- a/rsf-admin/src/page/system/serialRule/SerialRuleCreate.jsx
+++ b/rsf-admin/src/page/system/serialRule/SerialRuleCreate.jsx
@@ -47,6 +47,7 @@
     setOpen(false);
     notify("common.response.success");
   };
+  const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_task_reset_type')) || [];
 
   const handleError = async (error) => {
     notify(error.message || "common.response.fail", {
@@ -113,13 +114,23 @@
                     parse={(v) => v}
                   />
                 </Grid>
-                <Grid item xs={6} display="flex" gap={1}>
+                {/* <Grid item xs={6} display="flex" gap={1}>
                   <TextInput
                     label="table.field.serialRule.reset"
                     source="reset"
                     parse={(v) => v}
                     validate={required()}
                   />
+                </Grid> */}
+                <Grid item xs={6} display="flex" gap={1}>
+                  <AutocompleteInput
+                    choices={dicts}
+                    optionText="label"
+                    label="table.field.serialRule.reset"
+                    source="reset"
+                    optionValue="value"
+                    parse={v => v}
+                    validate={[required()]} />
                 </Grid>
                 <Grid item xs={6} display="flex" gap={1}>
                   <TextInput
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleDetail.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleDetail.jsx
deleted file mode 100644
index c3d15cc..0000000
--- a/rsf-admin/src/page/system/serialRule/SerialRuleDetail.jsx
+++ /dev/null
@@ -1,90 +0,0 @@
-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 SerialRuleItem from "../serialRuleItem/index";
-
-const SerialRuleDetail = (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 (
-    <>
-      <Dialog
-        open={open}
-        onClose={handleClose}
-        aria-labelledby="form-dialog-title"
-        fullWidth
-        disableRestoreFocus
-        maxWidth="xl" // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
-      >
-        <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 }}>
-          <SerialRuleItem.list />
-        </DialogContent>
-      </Dialog>
-    </>
-  );
-};
-
-export default SerialRuleDetail;
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx
index f51326e..e589cce 100644
--- a/rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx
+++ b/rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx
@@ -32,11 +32,11 @@
 import MemoInput from "../../components/MemoInput";
 
 const SerialRuleItemCreate = (props) => {
-    const { open, setOpen } = props;
+    const { open, setOpen, record } = props;
 
     const translate = useTranslate();
     const notify = useNotify();
-
+    const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_rule_item_type')) || [];
     const handleClose = (event, reason) => {
         if (reason !== "backdropClick") {
             setOpen(false);
@@ -88,15 +88,19 @@
                                     <NumberInput
                                         label="table.field.serialRuleItem.ruleId"
                                         source="ruleId"
-                                        autoFocus
+                                        defaultValue={record?.id}
+                                        readOnly
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
+                                    <AutocompleteInput
+                                        choices={dicts}
+                                        optionText="label"
                                         label="table.field.serialRuleItem.wkType"
-                                        source="wkType"
+                                        source="type"
+                                        optionValue="value"
                                         parse={v => v}
-                                    />
+                                        validate={[required()]} />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
                                     <TextInput
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleItemEdit.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleItemEdit.jsx
new file mode 100644
index 0000000..8cf98bf
--- /dev/null
+++ b/rsf-admin/src/page/system/serialRule/SerialRuleItemEdit.jsx
@@ -0,0 +1,162 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    Edit,
+    Form,
+    SimpleForm,
+    FormDataConsumer,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    SaveButton,
+    Toolbar,
+    Labeled,
+    NumberField,
+    required,
+    useRecordContext,
+    useGetOne,
+    DeleteButton,
+} from 'react-admin';
+import { useWatch, useFormContext } from "react-hook-form";
+import { Stack, Grid, Box, Typography, Dialog, DialogContent, DialogTitle, DialogActions } from '@mui/material';
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "../../components/EditBaseAside";
+import DialogCloseButton from "../../components/DialogCloseButton";
+import CustomerTopToolBar from "../../components/EditTopToolBar";
+import MemoInput from "../../components/MemoInput";
+import StatusSelectInput from "../../components/StatusSelectInput";
+
+const FormToolbar = () => {
+    const { getValues } = useFormContext();
+
+    return (
+        <Toolbar sx={{ justifyContent: 'end' }}>
+            <SaveButton />
+            <DeleteButton mutationMode="optimistic" />
+        </Toolbar>
+    )
+}
+
+const SerialRuleItemEdit = (props) => {
+    const { open, setOpen, record } = props;
+    const translate = useTranslate();
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+    const {data, isPending, } = useGetOne('serialRuleItem', {id: record?.id});
+    if (data == null || data == undefined) {return}
+
+    return (
+        <Edit
+            id={record.id}
+            redirect="list"
+            resource="serialRuleItem"
+            mutationMode={EDIT_MODE}
+        >
+            <Dialog
+                open={open}
+                onClose={handleClose}
+                aria-labelledby="form-dialog-title"
+                fullWidth
+                disableRestoreFocus
+                maxWidth="md"
+            >
+                <Form
+                    shouldUnregister
+                    warnWhenUnsavedChanges
+                    toolbar={<FormToolbar />}
+                    mode="onTouched"
+                    defaultValues={{}}
+                >
+                    <DialogTitle id="form-dialog-title" sx={{
+                        position: 'sticky',
+                        top: 0,
+                        backgroundColor: 'background.paper',
+                        zIndex: 1000
+                    }}
+                    >
+                        {translate('update.title')}
+                        <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                            <DialogCloseButton onClose={handleClose} />
+                        </Box>
+                    </DialogTitle>
+                    <DialogContent>
+                        <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.serialRuleItem.ruleId"
+                                        source="ruleId"
+                                        readOnly
+                                        autoFocus
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <TextInput
+                                        label="table.field.serialRuleItem.wkType"
+                                        source="wkType$"
+                                        readOnly
+                                        parse={v => v}
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <TextInput
+                                        label="table.field.serialRuleItem.feildValue"
+                                        source="feildValue"
+                                        parse={v => v}
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <NumberInput
+                                        label="table.field.serialRuleItem.len"
+                                        source="len"
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <NumberInput
+                                        label="table.field.serialRuleItem.lenStr"
+                                        source="lenStr"
+                                        validate={required()}
+                                    />
+                                </Stack>
+                                <Stack direction='row' gap={2}>
+                                    <NumberInput
+                                        label="table.field.serialRuleItem.sort"
+                                        source="sort"
+                                        validate={required()}
+                                    />
+                                </Stack>
+
+                            </Grid>
+                            <Grid item xs={12} md={4}>
+                                <Typography variant="h6" gutterBottom>
+                                    {translate('common.edit.title.common')}
+                                </Typography>
+                                <StatusSelectInput />
+                                <Box mt="2em" />
+                                <MemoInput />
+                            </Grid>
+                        </Grid>
+                    </DialogContent>
+                    <DialogActions>
+
+                    </DialogActions>
+                </Form>
+
+            </Dialog>
+        </Edit >
+    )
+}
+
+export default SerialRuleItemEdit;
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx
index c99a1bc..9ae1736 100644
--- a/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx
+++ b/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx
@@ -38,6 +38,8 @@
   AutocompleteInput,
   DeleteButton,
   useGetRecordId,
+  useGetOne,
+  Button,
 } from "react-admin";
 import { Box, Typography, Card, Stack } from "@mui/material";
 import { styled } from "@mui/material/styles";
@@ -54,6 +56,7 @@
 } from "@/config/setting";
 import * as Common from "@/utils/common";
 import CustomerTopToolBar from "../../components/EditTopToolBar";
+import SerialRuleItemEdit from "./SerialRuleItemEdit";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
   "& .css-1vooibu-MuiSvgIcon-root": {
@@ -93,9 +96,11 @@
 const SerialRuleItemList = () => {
   const translate = useTranslate();
   const [createDialog, setCreateDialog] = useState(false);
+  const [editDialog, setEditDialog] = useState(false);
   const [drawerVal, setDrawerVal] = useState(false);
+  const [select, setSelect] = useState({});
   const ruleId = useGetRecordId();
-
+  const { data: dicts, isPending, error } = useGetOne('serialRule', { id: ruleId });
   return (
     <>
       <Box display="flex">
@@ -110,13 +115,7 @@
             marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
           }}
           title={"menu.serialRuleItem"}
-          empty={
-            <EmptyData
-              onClick={() => {
-                setCreateDialog(true);
-              }}
-            />
-          }
+          empty={false}
           filters={filters}
           filter={{ ruleId: ruleId }}
           sort={{ field: "create_time", order: "desc" }}
@@ -139,7 +138,10 @@
             bulkActionButtons={() => (
               <BulkDeleteButton mutationMode={OPERATE_MODE} />
             )}
-            rowClick={false}
+            rowClick={(id, resource, record) => {
+              setSelect(record)
+              setEditDialog(true)
+            }}
             omit={["id", "createTime", "createBy", "memo"]}
           >
             <NumberField source="id" />
@@ -164,29 +166,19 @@
               source="sort"
               label="table.field.serialRuleItem.sort"
             />
-            <ReferenceField
-              source="updateBy"
+            <TextField
+              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"
+            <TextField
+              source="createBy$"
               label="common.field.createBy"
-              reference="user"
-              link={false}
-              sortable={false}
-            >
-              <TextField source="nickname" />
-            </ReferenceField>
+            />
             <DateField
               source="createTime"
               label="common.field.createTime"
@@ -203,15 +195,21 @@
               sortable={false}
             />
             <WrapperField cellClassName="opt" label="common.field.opt">
-              <EditButton sx={{ padding: "1px", fontSize: ".75rem" }} />
+              <Button onClick={() => {
+                setSelect(record)
+                setEditDialog(true)
+              }} label={'ra.action.edit'}
+              > </Button>
               <DeleteButton
                 sx={{ padding: "1px", fontSize: ".75rem" }}
                 mutationMode={OPERATE_MODE}
+                redirect={'/serialRule/' + ruleId}
               />
             </WrapperField>
           </StyledDatagrid>
         </List>
-        <SerialRuleItemCreate open={createDialog} setOpen={setCreateDialog} />
+        <SerialRuleItemCreate open={createDialog} setOpen={setCreateDialog} record={dicts} />
+        <SerialRuleItemEdit open={editDialog} setOpen={setEditDialog} record={select} />
         <PageDrawer
           title="SerialRuleItem Detail"
           drawerVal={drawerVal}
diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx
index 8b4c623..d7a19a9 100644
--- a/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx
+++ b/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx
@@ -41,8 +41,6 @@
 import { Box, Typography, Card, Stack } from "@mui/material";
 import { styled } from "@mui/material/styles";
 import SerialRuleCreate from "./SerialRuleCreate";
-import SerialRuleDetail from "./SerialRuleDetail";
-import SerialRulePanel from "./SerialRulePanel";
 import EmptyData from "../../components/EmptyData";
 import MyCreateButton from "../../components/MyCreateButton";
 import MyExportButton from "../../components/MyExportButton";
@@ -79,7 +77,6 @@
   <TextInput source="resetDep" label="table.field.serialRule.resetDep" />,
   <TextInput source="currValue" label="table.field.serialRule.currValue" />,
   <TextInput source="lastCode" label="table.field.serialRule.lastCode" />,
-
   <TextInput label="common.field.memo" source="memo" />,
   <SelectInput
     label="common.field.status"
@@ -165,29 +162,19 @@
             label="table.field.serialRule.lastCode"
           />
 
-          <ReferenceField
-            source="updateBy"
+          <TextField
+            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"
+          <TextField
+            source="createBy$"
             label="common.field.createBy"
-            reference="user"
-            link={false}
-            sortable={false}
-          >
-            <TextField source="nickname" />
-          </ReferenceField>
+          />
           <DateField
             source="createTime"
             label="common.field.createTime"
@@ -209,7 +196,7 @@
         </StyledDatagrid>
       </List>
       <SerialRuleCreate open={createDialog} setOpen={setCreateDialog} />
-      <SerialRuleDetail open={detailDialog} setOpen={setDetailDialog} />
+      {/* <SerialRuleDetail open={detailDialog} setOpen={setDetailDialog} /> */}
       <PageDrawer
         title="SerialRule Detail"
         drawerVal={drawerVal}
diff --git a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemCreate.jsx b/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemCreate.jsx
deleted file mode 100644
index f51326e..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemCreate.jsx
+++ /dev/null
@@ -1,151 +0,0 @@
-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 SerialRuleItemCreate = (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.serialRuleItem.ruleId"
-                                        source="ruleId"
-                                        autoFocus
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.serialRuleItem.wkType"
-                                        source="wkType"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.serialRuleItem.feildValue"
-                                        source="feildValue"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.serialRuleItem.len"
-                                        source="len"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.serialRuleItem.lenStr"
-                                        source="lenStr"
-                                        validate={required()}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.serialRuleItem.sort"
-                                        source="sort"
-                                        validate={required()}
-                                    />
-                                </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 SerialRuleItemCreate;
diff --git a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemEdit.jsx b/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemEdit.jsx
deleted file mode 100644
index ecd5ba0..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemEdit.jsx
+++ /dev/null
@@ -1,123 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    Edit,
-    SimpleForm,
-    FormDataConsumer,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    SaveButton,
-    Toolbar,
-    Labeled,
-    NumberField,
-    required,
-    useRecordContext,
-    DeleteButton,
-} from 'react-admin';
-import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
-import * as Common from '@/utils/common';
-import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../../components/EditBaseAside";
-import CustomerTopToolBar from "../../components/EditTopToolBar";
-import MemoInput from "../../components/MemoInput";
-import StatusSelectInput from "../../components/StatusSelectInput";
-
-const FormToolbar = () => {
-    const { getValues } = useFormContext();
-
-    return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
-            <SaveButton />
-            <DeleteButton mutationMode="optimistic" />
-        </Toolbar>
-    )
-}
-
-const SerialRuleItemEdit = () => {
-    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.serialRuleItem.ruleId"
-                                source="ruleId"
-                                autoFocus
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.serialRuleItem.wkType"
-                                source="wkType"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.serialRuleItem.feildValue"
-                                source="feildValue"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.serialRuleItem.len"
-                                source="len"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.serialRuleItem.lenStr"
-                                source="lenStr"
-                                validate={required()}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.serialRuleItem.sort"
-                                source="sort"
-                                validate={required()}
-                            />
-                        </Stack>
-
-                    </Grid>
-                    <Grid item xs={12} md={4}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.common')}
-                        </Typography>
-                        <StatusSelectInput />
-                        <Box mt="2em" />
-                        <MemoInput />
-                    </Grid>
-                </Grid>
-            </SimpleForm>
-        </Edit >
-    )
-}
-
-export default SerialRuleItemEdit;
diff --git a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemList.jsx b/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemList.jsx
deleted file mode 100644
index 703190d..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemList.jsx
+++ /dev/null
@@ -1,234 +0,0 @@
-import React, {
-  useState,
-  useRef,
-  useEffect,
-  useMemo,
-  useCallback,
-} from "react";
-import { useNavigate, useLocation } 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 SerialRuleItemCreate from "./SerialRuleItemCreate";
-import SerialRuleItemPanel from "./SerialRuleItemPanel";
-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";
-import CustomerTopToolBar from "../../components/EditTopToolBar";
-
-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="ruleId" label="table.field.serialRuleItem.ruleId" />,
-  <TextInput source="wkType" label="table.field.serialRuleItem.wkType" />,
-  <TextInput
-    source="feildValue"
-    label="table.field.serialRuleItem.feildValue"
-  />,
-  <NumberInput source="len" label="table.field.serialRuleItem.len" />,
-  <NumberInput source="lenStr" label="table.field.serialRuleItem.lenStr" />,
-  <NumberInput source="sort" label="table.field.serialRuleItem.sort" />,
-
-  <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 SerialRuleItemList = () => {
-  const translate = useTranslate();
-  const [createDialog, setCreateDialog] = useState(false);
-  const [drawerVal, setDrawerVal] = useState(false);
-
-  const location = useLocation();
-  const queryParams = new URLSearchParams(location.search);
-  const ruleId = queryParams.get("ruleId");
-
-  return (
-    <>
-      {ruleId && <CustomerTopToolBar backPrevious={true} />}
-      <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.serialRuleItem"}
-          empty={
-            <EmptyData
-              onClick={() => {
-                setCreateDialog(true);
-              }}
-            />
-          }
-          filters={filters}
-          filter={ruleId ? { ruleId } : undefined}
-          sort={{ field: "create_time", order: "desc" }}
-          actions={
-            <TopToolbar>
-              <FilterButton />
-              <MyCreateButton
-                onClick={() => {
-                  setCreateDialog(true);
-                }}
-              />
-              <SelectColumnsButton preferenceKey="serialRuleItem" />
-              <MyExportButton />
-            </TopToolbar>
-          }
-          perPage={DEFAULT_PAGE_SIZE}
-        >
-          <StyledDatagrid
-            preferenceKey="serialRuleItem"
-            bulkActionButtons={() => (
-              <BulkDeleteButton mutationMode={OPERATE_MODE} />
-            )}
-            rowClick={(id, resource, record) => false}
-            omit={["id", "createTime", "createBy", "memo"]}
-          >
-            <NumberField source="id" />
-            <NumberField
-              source="ruleId"
-              label="table.field.serialRuleItem.ruleId"
-            />
-            <TextField
-              source="wkType"
-              label="table.field.serialRuleItem.wkType"
-            />
-            <TextField
-              source="feildValue"
-              label="table.field.serialRuleItem.feildValue"
-            />
-            <NumberField source="len" label="table.field.serialRuleItem.len" />
-            <NumberField
-              source="lenStr"
-              label="table.field.serialRuleItem.lenStr"
-            />
-            <NumberField
-              source="sort"
-              label="table.field.serialRuleItem.sort"
-            />
-
-            <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>
-        <SerialRuleItemCreate open={createDialog} setOpen={setCreateDialog} />
-        <PageDrawer
-          title="SerialRuleItem Detail"
-          drawerVal={drawerVal}
-          setDrawerVal={setDrawerVal}
-        ></PageDrawer>
-      </Box>
-    </>
-  );
-};
-
-export default SerialRuleItemList;
diff --git a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemPanel.jsx b/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemPanel.jsx
deleted file mode 100644
index 47d94ce..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/SerialRuleItemPanel.jsx
+++ /dev/null
@@ -1,87 +0,0 @@
-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 SerialRuleItemPanel = () => {
-    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.serialRuleItem.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.serialRuleItem.ruleId" 
-                                property={record.ruleId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.wkType" 
-                                property={record.wkType$}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.feildValue" 
-                                property={record.feildValue}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.len" 
-                                property={record.len}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.lenStr" 
-                                property={record.lenStr}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.serialRuleItem.sort" 
-                                property={record.sort}
-                            />
-                        </Grid>
-
-                    </Grid>
-                </CardContent>
-            </Card >
-        </>
-    );
-};
-
-export default SerialRuleItemPanel;
diff --git a/rsf-admin/src/page/system/serialRuleItem/index.jsx b/rsf-admin/src/page/system/serialRuleItem/index.jsx
deleted file mode 100644
index d7a3bde..0000000
--- a/rsf-admin/src/page/system/serialRuleItem/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    ListGuesser,
-    EditGuesser,
-    ShowGuesser,
-} from "react-admin";
-
-import SerialRuleItemList from "./SerialRuleItemList";
-import SerialRuleItemEdit from "./SerialRuleItemEdit";
-
-export default {
-    list: SerialRuleItemList,
-    edit: SerialRuleItemEdit,
-    show: ShowGuesser,
-    recordRepresentation: (record) => {
-        return `${record.id}`
-    }
-};
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 aaffe4f..ddeb48c 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
@@ -264,4 +264,24 @@
         return mobileService.completeOrder(id, getLoginUserId());
     }
 
+
+    @ApiOperation("鑾峰彇涓嶈壇鎵樼洏鐗╂枡")
+    @PostMapping("/defect/matnrs")
+    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
+    public R getAsnDefectItemByCode(@RequestBody Map<String, Object> map) {
+        if (Objects.isNull(map)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return mobileService.getItemByContainer(map);
+    }
+
+    @ApiOperation("鑾峰彇璁㈠崟涓嶈壇鐗╂枡")
+    @PostMapping("/defect/{trackCode}")
+    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
+    public R defectProducts(@PathVariable String trackCode) {
+        if (Objects.isNull(trackCode)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return mobileService.defectProducts(trackCode);
+    }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/MatnrDefectType.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/MatnrDefectType.java
new file mode 100644
index 0000000..34563ec
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/MatnrDefectType.java
@@ -0,0 +1,26 @@
+package com.vincent.rsf.server.api.entity.enums;
+
+/**
+ * @author Ryan
+ * @version 1.0
+ * @title MatnrDefectType
+ * @description
+ * @create 2025/4/12 09:34
+ */
+public enum MatnrDefectType {
+    //鐗╂枡涓嶈壇绫诲瀷
+    MATNR_DEFECT_NORMAL("0", "姝e父"),
+    MATNR_DEFECT_FIX("1", "寰呰繑淇�"),
+    MATNR_DEFECT_SCRAP("2", "寰呮姤搴�"),
+    MATNR_DEFECT_DEGRADE("3", "寰呴檷绾�"),
+    MATNR_DEFECT_PENDING("4", "寰呭畾"),
+    ;
+
+    MatnrDefectType(String type, String desc) {
+        this.type = Short.parseShort(type);
+        this.val = desc;
+    }
+
+    public Short type;
+    public String val;
+}
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 b63ead2..ab4daa7 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
@@ -61,4 +61,6 @@
     R completeOrder(Long id, Long loginUserId);
 
     R getItemByContainer(Map<String, Object> params);
+
+    R defectProducts(String trackCode);
 }
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 0229436..c8cd598 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
@@ -213,6 +213,10 @@
 
         Double receiptQty = receipts.stream().mapToDouble(ReceiptDetlsDto::getReceiptQty).sum();
 
+        if (Objects.isNull(receiptQty) || receiptQty.compareTo(0.00) <= 0) {
+            throw new CoolException("鏀惰揣鏁伴噺涓嶈兘灏忎簬鎴栫瓑浜庨浂锛侊紒");
+        }
+
         String asnCode = receipts.stream().findFirst().get().getAsnCode();
 
         AsnOrder asnOrder = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>()
@@ -740,8 +744,13 @@
     public R getItemByContainer(Map<String, Object> params) {
         //鑾峰彇缁勬嫋鏈敓鎴愪换鍔$殑缁勬嫋妗�
         List<Short> asList = Arrays.asList(Short.valueOf(PakinIOStatus.PAKIN_IO_STATUS_DONE.val), Short.valueOf(PakinIOStatus.PAKIN_IO_STATUS_DONE.val));
+        Short flagDefect = 0;
+        if (!Objects.isNull(params.get("type")) && params.get("type").equals("defective")) {
+            flagDefect = 1;
+        }
         WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
                 .eq(WaitPakin::getBarcode, params.get("barcode").toString())
+                        .eq(WaitPakin::getFlagDefect, flagDefect)
                 .in(WaitPakin::getIoStatus, asList));
         if (Objects.isNull(waitPakin)) {
             return R.ok(new ArrayList<>());
@@ -751,22 +760,39 @@
         if (pakinItems.isEmpty()) {
             return R.ok(new ArrayList<>());
         }
-        List<String> list = pakinItems.stream().map(WaitPakinItem::getTrackCode).collect(Collectors.toList());
-        LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new QueryWrapper<WarehouseAreasItem>()
-                .select("SUM(anfme) as anfme, track_code, asn_code, id, splr_batch, ispt_result, plat_item_id, batch, qty, work_qty, matnr_code, matnr_id, maktx")
-                .lambda()
-                .in(WarehouseAreasItem::getTrackCode, list)
-                .groupBy(WarehouseAreasItem::getSplrBatch,
-                        WarehouseAreasItem::getTrackCode);
-        List<WarehouseAreasItem> warehouseAreasItems = warehouseAreasItemService.list(queryWrapper);
-        for (int i = 0; i < warehouseAreasItems.size(); i++) {
-            for (WaitPakinItem pakinItem : pakinItems) {
-                if (warehouseAreasItems.get(i).getTrackCode().equals(pakinItem.getTrackCode())) {
-                    warehouseAreasItems.get(i).setAnfme(pakinItem.getAnfme());
+        if (!Objects.isNull(params.get("type")) && params.get("type").equals("defective")) {
+            return R.ok(pakinItems);
+        } else {
+            List<String> list = pakinItems.stream().map(WaitPakinItem::getTrackCode).collect(Collectors.toList());
+            LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new QueryWrapper<WarehouseAreasItem>()
+                    .select("SUM(anfme) as anfme, track_code, asn_code, id, splr_batch, ispt_result, plat_item_id, batch, qty, work_qty, matnr_code, matnr_id, maktx")
+                    .lambda()
+                    .in(WarehouseAreasItem::getTrackCode, list)
+                    .groupBy(WarehouseAreasItem::getSplrBatch,
+                            WarehouseAreasItem::getTrackCode);
+            List<WarehouseAreasItem> warehouseAreasItems = warehouseAreasItemService.list(queryWrapper);
+            for (int i = 0; i < warehouseAreasItems.size(); i++) {
+                for (WaitPakinItem pakinItem : pakinItems) {
+                    if (warehouseAreasItems.get(i).getTrackCode().equals(pakinItem.getTrackCode())) {
+                        warehouseAreasItems.get(i).setAnfme(pakinItem.getAnfme());
+                    }
                 }
             }
+            return R.ok(warehouseAreasItems);
         }
-        return R.ok(warehouseAreasItems);
+    }
+
+    /**
+     * @author Ryan
+     * @description 涓嶈壇鏍囩
+     * @param
+     * @return
+     * @time 2025/4/12 08:12
+     */
+    @Override
+    public R defectProducts(String trackCode) {
+        AsnOrderItem orderItem = asnOrderItemMapper.selectOne(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getTrackCode, trackCode));
+        return R.ok(orderItem);
     }
 
     /**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java
index 6469f3d..ad98507 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java
@@ -107,7 +107,7 @@
                     FieldsItem item = new FieldsItem();
                     item.setUuid(uuid)
                             .setValue(template.get(obj.getFields()).toString())
-                            .setMatnrId(Long.parseLong(template.get("matnrId").toString()))
+                            .setMatnrId(!Objects.isNull(template.get("matnrId")) ? Long.parseLong(template.get("matnrId").toString()) : null)
                             .setFieldsId(obj.getId());
                     fieldsItems.add(item);
                 }
@@ -157,7 +157,7 @@
                             FieldsItem item = new FieldsItem();
                             item.setUuid(index)
                                     .setFieldsId(field.getId())
-                                    .setMatnrId(Long.parseLong(params.get("matnrId").toString()))
+                                    .setMatnrId(!Objects.isNull(params.get("matnrId")) ? Long.parseLong(params.get("matnrId").toString()) : null)
                                     .setValue(params.get(field.getFields()).toString());
                             if (!fieldsItemService.save(item)) {
                                 throw new CoolException("鎵╁睍瀛楁淇敼澶辫触锛侊紒");
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
index 267ca22..3ca24bd 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
@@ -125,7 +125,7 @@
         if (!Objects.isNull(map.get("ids"))) {
             orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getId, map.get("ids")).eq(AsnOrderItem::getStatus, 1));
         } else {
-            orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().last("limit 1"));
+            orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>());
         }
 
         ExcelUtil.build(ExcelUtil.create(orderItems, AsnOrderItem.class, true), response);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java
index 091cf4a..2067080 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrController.java
@@ -204,9 +204,9 @@
         if (!Objects.isNull(map.get("ids"))) {
             matnrs = matnrService.list(new LambdaQueryWrapper<Matnr>().in(Matnr::getId, map.get("ids")).eq(Matnr::getStatus, 1));
         } else {
-            matnrs = matnrService.list(new LambdaQueryWrapper<Matnr>().last("limit 1"));
+            matnrs = matnrService.list();
         }
-        ExcelUtil.build(ExcelUtil.create(matnrs, Matnr.class, true), response);
+        ExcelUtil.build(ExcelUtil.create(matnrs, Matnr.class, false), response);
     }
 
     @PreAuthorize("hasAuthority('manager:matnr:list')")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/QlyInspectController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/QlyInspectController.java
index 57d0e20..6c9ff33 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/QlyInspectController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/QlyInspectController.java
@@ -14,9 +14,12 @@
 import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem;
 import com.vincent.rsf.server.manager.entity.QlyInspect;
 import com.vincent.rsf.server.manager.service.QlyInspectService;
+import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.controller.BaseController;
+import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -104,7 +107,7 @@
     public R save(@RequestBody QlyInspect qlyInspect) {
         qlyInspect.setCreateBy(getLoginUserId());
         qlyInspect.setUpdateBy(getLoginUserId());
-        if (!qlyInspectService.save(qlyInspect)) {
+        if (!qlyInspectService.qlySave(qlyInspect)) {
             return R.error("Save Fail");
         }
         return R.ok("Save Success").add(qlyInspect);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaitPakinParam.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaitPakinParam.java
index 5a8ca9d..9e83b73 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaitPakinParam.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/WaitPakinParam.java
@@ -19,5 +19,8 @@
     @ApiModelProperty("璺熻釜鐮�")
     private List<PakinItem> items;
 
+    @ApiModelProperty("缁勬嫋绫诲瀷{null: 缁勬嫋, defective: 涓嶈壇鍝亇")
+    private String type;
+
 }
 
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 9ea862d..f8c4cf4 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
@@ -124,7 +124,6 @@
      * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
      */
     @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
-    @TableLogic
     private Integer deleted;
 
     /**
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 0e1a978..572b4d2 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
@@ -190,7 +190,6 @@
      * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
      */
     @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
-    @TableLogic
     private Integer deleted;
 
     /**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java
index d4b1461..3bd249f 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java
@@ -62,6 +62,12 @@
     private Short ioStatus;
 
     /**
+     * 鏄惁涓嶈壇鍝�
+     */
+    @ApiModelProperty("鏄惁涓嶈壇鍝�")
+    private Short flagDefect;
+
+    /**
      * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
      */
     @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java
index 9904ef6..cb9e44e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/MatnrsTemplate.java
@@ -22,22 +22,22 @@
 public class MatnrsTemplate {
 
     @NotNull
-    @Excel(name = "鐗╂枡鍚嶇О")
+    @Excel(name = "鐗╂枡鍚嶇О*")
     @ExcelComment(example = "鍗庝负鎵嬫満")
     private String name;
 
     @NotNull
-    @Excel(name = "鍒嗙被鍔╄鐮�")
+    @Excel(name = "鍒嗙被鍔╄鐮�*")
     @ExcelComment(example = "256874556")
     private String groupCode;
 
     @NotNull
-    @Excel(name = "鍒嗙被鍚嶇О")
+    @Excel(name = "鍒嗙被鍚嶇О*")
     @ExcelComment(example = "绉诲姩璁惧")
     private String groupName;
 
     @NotNull
-    @Excel(name = "鐗╂枡鍔╄鐮�")
+    @Excel(name = "鐗╂枡鍔╄鐮�*")
     @ExcelComment(example = "P3528461569")
     private String erpCode;
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/QlyInspectService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/QlyInspectService.java
index 74f09eb..06d5073 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/QlyInspectService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/QlyInspectService.java
@@ -20,4 +20,6 @@
     List<AsnOrder> getUnInspect(Map<String, Object> map);
 
     R saveSelected(IsptOrderParam param, Long loginUserId);
+
+    boolean qlySave(QlyInspect qlyInspect);
 }
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 6c91462..08d52a5 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
@@ -267,9 +267,9 @@
         if (orderItems.isEmpty()) {
             throw new CoolException("鏀惰揣鏄庣粏涓虹┖锛侊紒");
         }
-        if (Objects.isNull(asrder.getAnfme()) || asrder.getAnfme().compareTo(0.00) == 0) {
-            throw new CoolException("鏀惰揣鏁伴噺涓嶈兘涓洪浂锛侊紒");
-        }
+//        if (Objects.isNull(asrder.getAnfme()) || asrder.getAnfme().compareTo(0.00) == 0) {
+//            throw new CoolException("鏀惰揣鏁伴噺涓嶈兘涓洪浂锛侊紒");
+//        }
         AsnOrder order = this.getById(asrder.getId());
         AsnOrderLog orderLog = new AsnOrderLog();
         order.setExceStatus(Short.parseShort(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val));
@@ -290,6 +290,7 @@
             AsnOrderItemLog itemLog = new AsnOrderItemLog();
             BeanUtils.copyProperties(item, itemLog);
             itemLog.setAsnItemId(itemLog.getId())
+                    .setLogId(orderLog.getId())
                     .setAsnId(item.getAsnId());
             logs.add(itemLog);
         });
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 e4330bc..568cf81 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
@@ -176,4 +176,23 @@
         }
         return R.ok("淇濆瓨鎴愬姛锛侊紒");
     }
+
+    @Override
+    public boolean qlySave(QlyInspect qlyInspect) {
+        String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_INSPECT_CODE, qlyInspect);
+        if (Objects.isNull(code) || StringUtils.isBlank(code)) {
+            throw new CoolException("缂栫爜瑙勫垯閿欒锛�" + "璇锋鏌ョ紪鐮侊細" + "銆孲YS_INSPECT_CODE銆�" + "鏄惁璁剧疆鎴愬姛锛侊紒");
+        }
+        qlyInspect.setCode(code);
+        if (Objects.isNull(qlyInspect.getAsnCode()) || StringUtils.isBlank(qlyInspect.getAsnCode())) {
+            throw new CoolException("鏀惰揣鍗曞彿涓嶈兘涓虹┖锛侊紒");
+        }
+        AsnOrder asnOrder = asnOrderService.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, qlyInspect.getAsnCode()));
+        if (Objects.isNull(asnOrder)) {
+            throw new CoolException("鏀惰揣鍗曚笉瀛樺湪锛侊紒");
+        }
+        qlyInspect.setAsnCode(asnOrder.getCode()).setAsnId(asnOrder.getId());
+
+        return this.save(qlyInspect);
+    }
 }
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 75bdb0e..07e3d46 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
@@ -107,48 +107,69 @@
                 throw new CoolException("鍘熷崟鎹竻闄ゅけ璐ワ紒锛�");
             }
         }
-
-        LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new QueryWrapper<WarehouseAreasItem>()
-                .select("SUM(anfme) as anfme, track_code, asn_code, id, splr_batch, ispt_result, plat_item_id, batch, qty, work_qty, matnr_code, matnr_id, maktx")
-                .lambda()
-                .in(WarehouseAreasItem::getTrackCode, tracks)
-                .groupBy(WarehouseAreasItem::getSplrBatch,
-                        WarehouseAreasItem::getTrackCode);
-        List<WarehouseAreasItem> warehouseAreasItems = warehouseAreasItemService.list(queryWrapper);
-        if (Objects.isNull(warehouseAreasItems) || warehouseAreasItems.isEmpty()) {
-            throw new CoolException("鐗╂枡鏈�佽嚦鏀惰揣鍖猴紒锛�");
-        }
         List<WaitPakinItem> items = new ArrayList<>();
-        for (WarehouseAreasItem item : warehouseAreasItems) {
-            WaitPakinItem pakinItem = new WaitPakinItem();
-            pakinItem.setAnfme(item.getAnfme())
-                    .setPakinId(waitPakin1.getId())
-                    .setAsnId(item.getAsnId())
-                    .setAsnCode(item.getAsnCode())
-                    .setAsnItemId(item.getId())
-                    .setBatch(item.getSplrBatch())
-                    .setUnit(item.getStockUnit())
-                    .setFieldsIndex(item.getFieldsIndex())
-                    .setMatnrId(item.getMatnrId())
-                    .setMaktx(item.getMaktx())
-                    .setMatnrCode(item.getMatnrCode());
-            for (PakinItem waitPakinItem : waitPakin.getItems()) {
-                if (waitPakinItem.getTrackCode().equals(item.getTrackCode())) {
-                    if (waitPakinItem.getReceiptQty() > item.getAnfme()) {
-                        throw new CoolException("缁勬嫋鏁伴噺涓嶈兘澶т簬鏀惰揣鏁伴噺锛侊紒");
-                    }
-                    pakinItem
-                            .setAnfme(waitPakinItem.getReceiptQty())
-                            .setTrackCode(waitPakinItem.getTrackCode());
-                    /**鏇存柊鍗曟嵁鎵ц涓簱瀛�*/
-//                    if (v.compareTo(item.getAnfme()) > 0) {throw new CoolException("鎵ц涓暟閲忓ぇ浜庢敹璐ф暟閲忥紒锛�");}
-//                    if (!asnOrderItemService.update(new LambdaUpdateWrapper<AsnOrderItem>()
-//                            .eq(AsnOrderItem::getTrackCode, waitPakinItem.getTrackCode()).set(AsnOrderItem::getWorkQty, v))) {
-//                        throw new CoolException("鎵ц涓簱瀛樻洿鏂板け璐ワ紒锛�");
-//                    }
-                }
+        if (!Objects.isNull(waitPakin.getType()) && waitPakin.getType().equals("defective")) {
+            List<AsnOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getTrackCode, tracks));
+            if (Objects.isNull(orderItems) || orderItems.isEmpty()) {
+                throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
             }
-            items.add(pakinItem);
+            for (AsnOrderItem item : orderItems) {
+                WaitPakinItem pakinItem = new WaitPakinItem();
+                pakinItem.setAnfme(item.getAnfme())
+                        .setPakinId(waitPakin1.getId())
+                        .setAsnId(item.getAsnId())
+                        .setAsnCode(item.getAsnCode())
+                        .setAsnItemId(item.getId())
+                        .setBatch(item.getSplrBatch())
+                        .setUnit(item.getStockUnit())
+                        .setFieldsIndex(item.getFieldsIndex())
+                        .setMatnrId(item.getMatnrId())
+                        .setMaktx(item.getMaktx())
+                        .setMatnrCode(item.getMatnrCode());
+                for (PakinItem waitPakinItem : waitPakin.getItems()) {
+                    if (waitPakinItem.getTrackCode().equals(item.getTrackCode())) {
+                        if (waitPakinItem.getReceiptQty() > item.getAnfme()) {
+                            throw new CoolException("缁勬嫋鏁伴噺涓嶈兘澶т簬鏀惰揣鏁伴噺锛侊紒");
+                        }
+                        pakinItem.setAnfme(waitPakinItem.getReceiptQty()).setTrackCode(waitPakinItem.getTrackCode());
+                    }
+                }
+                items.add(pakinItem);
+            }
+        } else {
+            LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new QueryWrapper<WarehouseAreasItem>()
+                    .select("SUM(anfme) as anfme, track_code, asn_code, id, splr_batch, ispt_result, plat_item_id, batch, qty, work_qty, matnr_code, matnr_id, maktx")
+                    .lambda()
+                    .in(WarehouseAreasItem::getTrackCode, tracks)
+                    .groupBy(WarehouseAreasItem::getSplrBatch,
+                            WarehouseAreasItem::getTrackCode);
+            List<WarehouseAreasItem> warehouseAreasItems = warehouseAreasItemService.list(queryWrapper);
+            if (Objects.isNull(warehouseAreasItems) || warehouseAreasItems.isEmpty()) {
+                throw new CoolException("鐗╂枡鏈�佽嚦鏀惰揣鍖猴紒锛�");
+            }
+            for (WarehouseAreasItem item : warehouseAreasItems) {
+                WaitPakinItem pakinItem = new WaitPakinItem();
+                pakinItem.setAnfme(item.getAnfme())
+                        .setPakinId(waitPakin1.getId())
+                        .setAsnId(item.getAsnId())
+                        .setAsnCode(item.getAsnCode())
+                        .setAsnItemId(item.getId())
+                        .setBatch(item.getSplrBatch())
+                        .setUnit(item.getStockUnit())
+                        .setFieldsIndex(item.getFieldsIndex())
+                        .setMatnrId(item.getMatnrId())
+                        .setMaktx(item.getMaktx())
+                        .setMatnrCode(item.getMatnrCode());
+                for (PakinItem waitPakinItem : waitPakin.getItems()) {
+                    if (waitPakinItem.getTrackCode().equals(item.getTrackCode())) {
+                        if (waitPakinItem.getReceiptQty() > item.getAnfme()) {
+                            throw new CoolException("缁勬嫋鏁伴噺涓嶈兘澶т簬鏀惰揣鏁伴噺锛侊紒");
+                        }
+                        pakinItem.setAnfme(waitPakinItem.getReceiptQty()).setTrackCode(waitPakinItem.getTrackCode());
+                    }
+                }
+                items.add(pakinItem);
+            }
         }
         double sum1 = items.stream().mapToDouble(WaitPakinItem::getAnfme).sum();
         if (!waitPakinItemService.saveBatch(items)) {

--
Gitblit v1.9.1