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}> </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