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