From 34079a90f7fbdd0f1c47aeb75588628ebf21f15a Mon Sep 17 00:00:00 2001 From: verou <857149855@qq.com> Date: 星期四, 10 四月 2025 13:25:20 +0800 Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop --- rsf-admin/src/page/system/serialRule/SerialRuleEdit.jsx | 156 +++---- rsf-admin/src/page/system/serialRule/SerialRuleList.jsx | 28 - rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java | 4 rsf-admin/src/page/asnOrderLog/AsnOrderItemLogList.jsx | 177 +++++++++ rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx | 225 +++++++++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaitPakinServiceImpl.java | 98 +++- rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java | 20 rsf-admin/src/page/task/TaskPanel.jsx | 3 rsf-admin/src/page/waitPakinLog/WaitPakinLogList.jsx | 16 rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx | 151 +++++++ /dev/null | 18 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseAreasItemService.java | 4 rsf-admin/src/page/task/TaskList.jsx | 15 rsf-admin/src/page/waitPakinLog/WaitPakinItemLogList.jsx | 34 - rsf-admin/src/page/waitPakinLog/WaitPakinLogEdit.jsx | 125 ++--- rsf-admin/src/page/ResourceContent.js | 13 16 files changed, 787 insertions(+), 300 deletions(-) diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js index ed01cd9..2ead1d2 100644 --- a/rsf-admin/src/page/ResourceContent.js +++ b/rsf-admin/src/page/ResourceContent.js @@ -43,14 +43,9 @@ import waitPakin from './waitPakin'; import waitPakinItem from './waitPakinItem'; import waitPakinLog from './waitPakinLog'; -import waitPakinItemLog from './waitPakinItemLog'; import asnOrderLog from './asnOrderLog'; -// import asnOrderItemLog from './asnOrderItemLog'; import task from './task'; -// import taskItem from './taskItem'; import taskLog from './taskLog'; -// import taskItemLog from './taskItemLog'; - const ResourceContent = (node) => { switch (node.component) { @@ -110,8 +105,6 @@ return asnOrderItem; case 'asnOrderLog': return asnOrderLog; - // case 'asnOrderItemLog': - // return asnOrderItemLog; case 'purchaseItem': return purchaseItem; case 'purchase': @@ -136,16 +129,10 @@ return waitPakinItem; case 'waitPakinLog': return waitPakinLog; - case 'waitPakinItemLog': - return waitPakinItemLog; case 'task': return task; - // case 'taskItem': - // return taskItem; case 'taskLog': return taskLog; - // case 'taskItemLog': - // return taskItemLog; default: return { diff --git a/rsf-admin/src/page/asnOrderLog/AsnOrderItemLogList.jsx b/rsf-admin/src/page/asnOrderLog/AsnOrderItemLogList.jsx new file mode 100644 index 0000000..643d4ca --- /dev/null +++ b/rsf-admin/src/page/asnOrderLog/AsnOrderItemLogList.jsx @@ -0,0 +1,177 @@ +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, + useGetRecordId, +} from 'react-admin'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; +import EmptyData from "../components/EmptyData"; +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 />, + + <NumberInput source="asnId" label="table.field.asnOrderItemLog.asnId" />, + <TextInput source="asnCode" label="table.field.asnOrderItemLog.asnCode" />, + <TextInput source="platItemId" label="table.field.asnOrderItemLog.platItemId" />, + <NumberInput source="poDetlId" label="table.field.asnOrderItemLog.poDetlId" />, + <TextInput source="poCode" label="table.field.asnOrderItemLog.poCode" />, + <TextInput source="fieldsIndex" label="table.field.asnOrderItemLog.fieldsIndex" />, + <TextInput source="matnrId" label="table.field.asnOrderItemLog.matnrId" />, + <TextInput source="matnrCode" label="table.field.asnOrderItemLog.matnrCode" />, + <TextInput source="maktx" label="table.field.asnOrderItemLog.maktx" />, + <NumberInput source="anfme" label="table.field.asnOrderItemLog.anfme" />, + <TextInput source="stockUnit" label="table.field.asnOrderItemLog.stockUnit" />, + <NumberInput source="purQty" label="table.field.asnOrderItemLog.purQty" />, + <TextInput source="purUnit" label="table.field.asnOrderItemLog.purUnit" />, + <NumberInput source="qty" label="table.field.asnOrderItemLog.qty" />, + <TextInput source="splrCode" label="table.field.asnOrderItemLog.splrCode" />, + <TextInput source="splrBatch" label="table.field.asnOrderItemLog.splrBatch" />, + <TextInput source="splrName" label="table.field.asnOrderItemLog.splrName" />, + <TextInput source="qrcode" label="table.field.asnOrderItemLog.qrcode" />, + <TextInput source="trackCode" label="table.field.asnOrderItemLog.trackCode" />, + <TextInput source="barcode" label="table.field.asnOrderItemLog.barcode" />, + <TextInput source="packName" label="table.field.asnOrderItemLog.packName" />, + <SelectInput source="ntyStatus" label="table.field.asnOrderItemLog.ntyStatus" + choices={[ + { id: 0, name: ' 鏈笂鎶�' }, + { id: 1, name: ' 宸蹭笂鎶�' }, + ]} + />, + + <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 AsnOrderItemLogList = () => { + const translate = useTranslate(); + const [createDialog, setCreateDialog] = useState(false); + const [drawerVal, setDrawerVal] = useState(false); + const recodeId = useGetRecordId(); + + return ( + <Box display="flex"> + <List + resource="asnOrderItemLog" + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, + }} + title={"menu.asnOrderItemLog"} + empty={false} + filters={filters} + filter={{ logId: recodeId }} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <SelectColumnsButton preferenceKey='asnOrderItemLog' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='asnOrderItemLog' + bulkActionButtons={false} + rowClick={(id, resource, record) => false} + omit={['id', 'asnId', 'poDetlId', 'poCode', 'qrcode', 'packName', 'createTime', 'memo', 'fieldsIndex', 'matnrId', 'splrCode', 'status', 'createBy$']} + > + <NumberField source="id" /> + <NumberField source="asnId" label="table.field.asnOrderItemLog.asnId" /> + <TextField source="asnCode" label="table.field.asnOrderItemLog.asnCode" /> + <TextField source="platItemId" label="table.field.asnOrderItemLog.platItemId" /> + <NumberField source="poDetlId" label="table.field.asnOrderItemLog.poDetlId" /> + <TextField source="poCode" label="table.field.asnOrderItemLog.poCode" /> + <TextField source="fieldsIndex" label="table.field.asnOrderItemLog.fieldsIndex" /> + <TextField source="matnrId" label="table.field.asnOrderItemLog.matnrId" /> + <TextField source="matnrCode" label="table.field.asnOrderItemLog.matnrCode" /> + <TextField source="maktx" label="table.field.asnOrderItemLog.maktx" /> + <NumberField source="anfme" label="table.field.asnOrderItemLog.anfme" /> + <NumberField source="purQty" label="table.field.asnOrderItemLog.purQty" /> + <TextField source="purUnit" label="table.field.asnOrderItemLog.purUnit" /> + <NumberField source="qty" label="table.field.asnOrderItemLog.qty" /> + <TextField source="splrCode" label="table.field.asnOrderItemLog.splrCode" /> + <TextField source="splrBatch" label="table.field.asnOrderItemLog.splrBatch" /> + <TextField source="splrName" label="table.field.asnOrderItemLog.splrName" /> + <TextField source="qrcode" label="table.field.asnOrderItemLog.qrcode" /> + <TextField source="trackCode" label="table.field.asnOrderItemLog.trackCode" /> + <TextField source="packName" label="table.field.asnOrderItemLog.packName" /> + <TextField source="ntyStatus$" label="table.field.asnOrderItemLog.ntyStatus" sortable={false} /> + <TextField source="updateBy$" label="common.field.updateBy" /> + <TextField source="createBy$" label="common.field.createBy" /> + <DateField source="createTime" label="common.field.createTime" showTime /> + <TextField source="memo" label="common.field.memo" sortable={false} /> + </StyledDatagrid> + </List> + <PageDrawer + title='AsnOrderItemLog Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default AsnOrderItemLogList; diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleEdit.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleEdit.jsx index 4440c43..53cf77d 100644 --- a/rsf-admin/src/page/system/serialRule/SerialRuleEdit.jsx +++ b/rsf-admin/src/page/system/serialRule/SerialRuleEdit.jsx @@ -28,12 +28,13 @@ import CustomerTopToolBar from "../../components/EditTopToolBar"; import MemoInput from "../../components/MemoInput"; import StatusSelectInput from "../../components/StatusSelectInput"; +import SerialRuleItemList from "./SerialRuleItemList"; const FormToolbar = () => { const { getValues } = useFormContext(); return ( - <Toolbar sx={{ justifyContent: 'space-between' }}> + <Toolbar sx={{ justifyContent: 'end' }}> <SaveButton /> <DeleteButton mutationMode="optimistic" /> </Toolbar> @@ -44,89 +45,82 @@ const translate = useTranslate(); return ( - <Edit - redirect="list" - mutationMode={EDIT_MODE} - actions={<CustomerTopToolBar />} - aside={<EditBaseAside />} - > - <SimpleForm - shouldUnregister - warnWhenUnsavedChanges - toolbar={<FormToolbar />} - mode="onTouched" - defaultValues={{}} - // validate={(values) => { }} + <> + <Edit + redirect="list" + mutationMode={EDIT_MODE} + actions={<CustomerTopToolBar />} + aside={<EditBaseAside />} > - <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.serialRule.code" - source="code" - parse={v => v} - autoFocus - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.serialRule.name" - source="name" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.serialRule.delimit" - source="delimit" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.serialRule.reset" - source="reset" - parse={v => v} - validate={required()} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.serialRule.resetDep" - source="resetDep" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.serialRule.currValue" - source="currValue" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.serialRule.lastCode" - source="lastCode" - parse={v => v} - /> - </Stack> + <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}> + <TextInput + label="table.field.serialRule.code" + source="code" + parse={v => v} + readOnly + /> + <TextInput + label="table.field.serialRule.name" + source="name" + parse={v => v} + /> + <TextInput + label="table.field.serialRule.delimit" + source="delimit" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.serialRule.reset" + source="reset" + parse={v => v} + validate={required()} + /> + <TextInput + label="table.field.serialRule.resetDep" + source="resetDep" + parse={v => v} + /> + <TextInput + label="table.field.serialRule.currValue" + source="currValue" + parse={v => v} + /> + <TextInput + label="table.field.serialRule.lastCode" + source="lastCode" + parse={v => v} + /> + </Stack> + </Grid> + <Grid item xs={12} md={4}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.common')} + </Typography> + <StatusSelectInput /> + <Box mt="2em" /> + <MemoInput /> + </Grid> </Grid> - <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 > + </SimpleForm> + </Edit > + <SerialRuleItemList></SerialRuleItemList> + </> ) } diff --git a/rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx new file mode 100644 index 0000000..f51326e --- /dev/null +++ b/rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx @@ -0,0 +1,151 @@ +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/serialRule/SerialRuleItemList.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx new file mode 100644 index 0000000..c99a1bc --- /dev/null +++ b/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx @@ -0,0 +1,225 @@ +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, +} from "react-admin"; +import { Box, Typography, Card, Stack } from "@mui/material"; +import { styled } from "@mui/material/styles"; +import SerialRuleItemCreate from "./SerialRuleItemCreate"; +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" />, + <DateInput label="common.time.before" source="timeEnd" />, + <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 ruleId = useGetRecordId(); + + return ( + <> + <Box display="flex"> + <List + resource="serialRuleItem" + 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 }} + 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={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/serialRule/SerialRuleList.jsx b/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx index 6008fab..8b4c623 100644 --- a/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx +++ b/rsf-admin/src/page/system/serialRule/SerialRuleList.jsx @@ -72,7 +72,6 @@ <SearchInput source="condition" alwaysOn />, <DateInput label="common.time.after" source="timeStart" alwaysOn />, <DateInput label="common.time.before" source="timeEnd" alwaysOn />, - <TextInput source="code" label="table.field.serialRule.code" />, <TextInput source="name" label="table.field.serialRule.name" />, <TextInput source="delimit" label="table.field.serialRule.delimit" />, @@ -100,10 +99,10 @@ const [drawerVal, setDrawerVal] = useState(false); const [detailDialog, setDetailDialog] = useState(false); - const navigate = useNavigate(); - const assign = (record) => { - navigate(`/serialRuleItem?ruleId=${record.id}`); - }; + // const navigate = useNavigate(); + // const assign = (record) => { + // navigate(`/serialRuleItem?ruleId=${record.id}`); + // }; return ( <Box display="flex"> @@ -145,26 +144,11 @@ 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.serialRule.code" - onClick={(event, record, val) => { - event.stopPropagation(); - assign(record); - }} - /> - {/* <MyField - source="code" - label="table.field.serialRule.code" - onClick={() => { - setDetailDialog(true); - }} - /> */} - + <TextField source="code" label="table.field.serialRule.code" /> <TextField source="name" label="table.field.serialRule.name" /> <TextField source="delimit" label="table.field.serialRule.delimit" /> <TextField source="reset" label="table.field.serialRule.reset" /> diff --git a/rsf-admin/src/page/task/TaskList.jsx b/rsf-admin/src/page/task/TaskList.jsx index dc8eceb..7f6cce0 100644 --- a/rsf-admin/src/page/task/TaskList.jsx +++ b/rsf-admin/src/page/task/TaskList.jsx @@ -8,33 +8,22 @@ SearchInput, TopToolbar, SelectColumnsButton, - EditButton, FilterButton, - CreateButton, - ExportButton, BulkDeleteButton, WrapperField, useRecordContext, useTranslate, useNotify, useRefresh, - useDataProvider, - useListContext, - FunctionField, TextField, NumberField, DateField, BooleanField, - ReferenceField, TextInput, - DateTimeInput, DateInput, SelectInput, NumberInput, - ReferenceInput, - ReferenceArrayInput, - AutocompleteInput, - DeleteButton, + Button, } from 'react-admin'; import { Box, Typography, Card, Stack, Drawer } from '@mui/material'; @@ -100,9 +89,7 @@ const TaskList = () => { const translate = useTranslate(); - const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); - const [data, setData] = useState([]); return ( <Box display="flex"> <List diff --git a/rsf-admin/src/page/task/TaskPanel.jsx b/rsf-admin/src/page/task/TaskPanel.jsx index a207d24..6207229 100644 --- a/rsf-admin/src/page/task/TaskPanel.jsx +++ b/rsf-admin/src/page/task/TaskPanel.jsx @@ -48,7 +48,7 @@ marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, }} filter={{ taskId: record.id }} - title={"menu.taskItem"} + // title={"menu.taskItem"} pagination={false} empty={false} actions={false} @@ -77,7 +77,6 @@ <TextField source="createBy$" label="common.field.createBy"/> <DateField source="updateTime" label="common.field.updateTime" showTime /> <DateField source="createTime" label="common.field.createTime" showTime /> - <BooleanField source="statusBool" label="common.field.status" sortable={false} /> <TextField source="memo" label="common.field.memo" sortable={false} /> </StyledDatagrid> </List> diff --git a/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogCreate.jsx b/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogCreate.jsx deleted file mode 100644 index 0ee7ce6..0000000 --- a/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogCreate.jsx +++ /dev/null @@ -1,220 +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 WaitPakinItemLogCreate = (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}> - <ReferenceInput - source="pakinId" - reference="waitPakin" - autoFocus - > - <AutocompleteInput - label="table.field.waitPakinItemLog.pakinId" - optionText="id" - filterToQuery={(val) => ({ id: val })} - /> - </ReferenceInput> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.waitPakinItemLog.pakinItemId" - source="pakinItemId" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.waitPakinItemLog.asnId" - source="asnId" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.waitPakinItemLog.asnCode" - source="asnCode" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.waitPakinItemLog.asnItemId" - source="asnItemId" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.waitPakinItemLog.trackCode" - source="trackCode" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.waitPakinItemLog.maktx" - source="maktx" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <ReferenceInput - source="matnrId" - reference="matnr" - > - <AutocompleteInput - label="table.field.waitPakinItemLog.matnrId" - optionText="unit" - filterToQuery={(val) => ({ unit: val })} - /> - </ReferenceInput> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.waitPakinItemLog.matnrCode" - source="matnrCode" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.waitPakinItemLog.anfme" - source="anfme" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.waitPakinItemLog.workQty" - source="workQty" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.waitPakinItemLog.unit" - source="unit" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.waitPakinItemLog.fieldsIndex" - source="fieldsIndex" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.waitPakinItemLog.qty" - source="qty" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.waitPakinItemLog.batch" - source="batch" - 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 WaitPakinItemLogCreate; diff --git a/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogEdit.jsx b/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogEdit.jsx deleted file mode 100644 index 80599c0..0000000 --- a/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogEdit.jsx +++ /dev/null @@ -1,194 +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 WaitPakinItemLogEdit = () => { - 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}> - <ReferenceInput - source="pakinId" - reference="waitPakin" - perPage={REFERENCE_INPUT_PAGESIZE} - autoFocus - > - <AutocompleteInput - label="table.field.waitPakinItemLog.pakinId" - optionText="id" - filterToQuery={(val) => ({ id: val })} - /> - </ReferenceInput> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.waitPakinItemLog.pakinItemId" - source="pakinItemId" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.waitPakinItemLog.asnId" - source="asnId" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.waitPakinItemLog.asnCode" - source="asnCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.waitPakinItemLog.asnItemId" - source="asnItemId" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.waitPakinItemLog.trackCode" - source="trackCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.waitPakinItemLog.maktx" - source="maktx" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <ReferenceInput - source="matnrId" - reference="matnr" - perPage={REFERENCE_INPUT_PAGESIZE} - > - <AutocompleteInput - label="table.field.waitPakinItemLog.matnrId" - optionText="unit" - filterToQuery={(val) => ({ unit: val })} - /> - </ReferenceInput> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.waitPakinItemLog.matnrCode" - source="matnrCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.waitPakinItemLog.anfme" - source="anfme" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.waitPakinItemLog.workQty" - source="workQty" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.waitPakinItemLog.unit" - source="unit" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.waitPakinItemLog.fieldsIndex" - source="fieldsIndex" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.waitPakinItemLog.qty" - source="qty" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.waitPakinItemLog.batch" - source="batch" - parse={v => v} - /> - </Stack> - - </Grid> - <Grid item xs={12} md={4}> - <Typography variant="h6" gutterBottom> - {translate('common.edit.title.common')} - </Typography> - <StatusSelectInput /> - <Box mt="2em" /> - <MemoInput /> - </Grid> - </Grid> - </SimpleForm> - </Edit > - ) -} - -export default WaitPakinItemLogEdit; diff --git a/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogPanel.jsx b/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogPanel.jsx deleted file mode 100644 index 8bb4f7e..0000000 --- a/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogPanel.jsx +++ /dev/null @@ -1,141 +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 WaitPakinItemLogPanel = () => { - 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.waitPakinItemLog.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.waitPakinItemLog.pakinId" - property={record.pakinId$} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.pakinItemId" - property={record.pakinItemId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.asnId" - property={record.asnId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.asnCode" - property={record.asnCode} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.asnItemId" - property={record.asnItemId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.trackCode" - property={record.trackCode} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.maktx" - property={record.maktx} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.matnrId" - property={record.matnrId$} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.matnrCode" - property={record.matnrCode} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.anfme" - property={record.anfme} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.workQty" - property={record.workQty} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.unit" - property={record.unit} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.fieldsIndex" - property={record.fieldsIndex} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.qty" - property={record.qty} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.waitPakinItemLog.batch" - property={record.batch} - /> - </Grid> - - </Grid> - </CardContent> - </Card > - </> - ); -}; - -export default WaitPakinItemLogPanel; diff --git a/rsf-admin/src/page/waitPakinItemLog/index.jsx b/rsf-admin/src/page/waitPakinItemLog/index.jsx deleted file mode 100644 index 52cacba..0000000 --- a/rsf-admin/src/page/waitPakinItemLog/index.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React, { useState, useRef, useEffect, useMemo } from "react"; -import { - ListGuesser, - EditGuesser, - ShowGuesser, -} from "react-admin"; - -import WaitPakinItemLogList from "./WaitPakinItemLogList"; -import WaitPakinItemLogEdit from "./WaitPakinItemLogEdit"; - -export default { - list: WaitPakinItemLogList, - edit: WaitPakinItemLogEdit, - show: ShowGuesser, - recordRepresentation: (record) => { - return `${record.id}` - } -}; diff --git a/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogList.jsx b/rsf-admin/src/page/waitPakinLog/WaitPakinItemLogList.jsx similarity index 84% rename from rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogList.jsx rename to rsf-admin/src/page/waitPakinLog/WaitPakinItemLogList.jsx index 767197a..31b2e7d 100644 --- a/rsf-admin/src/page/waitPakinItemLog/WaitPakinItemLogList.jsx +++ b/rsf-admin/src/page/waitPakinLog/WaitPakinItemLogList.jsx @@ -31,12 +31,10 @@ ReferenceArrayInput, AutocompleteInput, DeleteButton, + useGetRecordId, } from 'react-admin'; import { Box, Typography, Card, Stack } from '@mui/material'; -import { styled } from '@mui/material/styles'; -import WaitPakinItemLogCreate from "./WaitPakinItemLogCreate"; -import WaitPakinItemLogPanel from "./WaitPakinItemLogPanel"; -import EmptyData from "../components/EmptyData"; +import { styled } from '@mui/material/styles'; import EmptyData from "../components/EmptyData"; import MyCreateButton from "../components/MyCreateButton"; import MyExportButton from '../components/MyExportButton'; import PageDrawer from "../components/PageDrawer"; @@ -60,7 +58,6 @@ const filters = [ <SearchInput source="condition" alwaysOn />, - <ReferenceInput source="pakinId" label="table.field.waitPakinItemLog.pakinId" reference="waitPakin"> <AutocompleteInput label="table.field.waitPakinItemLog.pakinId" optionText="id" filterToQuery={(val) => ({ id: val })} /> </ReferenceInput>, @@ -80,7 +77,6 @@ <TextInput source="fieldsIndex" label="table.field.waitPakinItemLog.fieldsIndex" />, <NumberInput source="qty" label="table.field.waitPakinItemLog.qty" />, <TextInput source="batch" label="table.field.waitPakinItemLog.batch" />, - <TextInput label="common.field.memo" source="memo" />, <SelectInput label="common.field.status" @@ -95,13 +91,14 @@ const WaitPakinItemLogList = () => { const translate = useTranslate(); - const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); + const recordId = useGetRecordId(); return ( <Box display="flex"> <List + resource="waitPakinItemLog" sx={{ flexGrow: 1, transition: (theme) => @@ -113,11 +110,11 @@ title={"menu.waitPakinItemLog"} empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} filters={filters} + filter={{ logId: recordId }} sort={{ field: "create_time", order: "desc" }} actions={( <TopToolbar> <FilterButton /> - <MyCreateButton onClick={() => { setCreateDialog(true) }} /> <SelectColumnsButton preferenceKey='waitPakinItemLog' /> <MyExportButton /> </TopToolbar> @@ -127,8 +124,8 @@ <StyledDatagrid preferenceKey='waitPakinItemLog' bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} - rowClick={(id, resource, record) => false} - omit={['id', 'createTime', 'createBy', 'memo']} + rowClick={ false} + omit={['id', 'createTime', 'createBy', 'memo', 'pakinId', 'pakinItemId', 'asnId' ,'asnItemId', 'createBy$', 'fieldsIndex']} > <NumberField source="id" /> <ReferenceField source="pakinId" label="table.field.waitPakinItemLog.pakinId" reference="waitPakin" link={false} sortable={false}> @@ -150,27 +147,14 @@ <TextField source="fieldsIndex" label="table.field.waitPakinItemLog.fieldsIndex" /> <NumberField source="qty" label="table.field.waitPakinItemLog.qty" /> <TextField source="batch" label="table.field.waitPakinItemLog.batch" /> - - <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 /> <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> - <WaitPakinItemLogCreate - open={createDialog} - setOpen={setCreateDialog} - /> <PageDrawer title='WaitPakinItemLog Detail' drawerVal={drawerVal} diff --git a/rsf-admin/src/page/waitPakinLog/WaitPakinLogEdit.jsx b/rsf-admin/src/page/waitPakinLog/WaitPakinLogEdit.jsx index 3570c73..ac2350e 100644 --- a/rsf-admin/src/page/waitPakinLog/WaitPakinLogEdit.jsx +++ b/rsf-admin/src/page/waitPakinLog/WaitPakinLogEdit.jsx @@ -28,12 +28,13 @@ import CustomerTopToolBar from "../components/EditTopToolBar"; import MemoInput from "../components/MemoInput"; import StatusSelectInput from "../components/StatusSelectInput"; +import WaitPakinItemLogList from "./WaitPakinItemLogList"; const FormToolbar = () => { const { getValues } = useFormContext(); return ( - <Toolbar sx={{ justifyContent: 'space-between' }}> + <Toolbar sx={{ justifyContent: 'end' }}> <SaveButton /> <DeleteButton mutationMode="optimistic" /> </Toolbar> @@ -44,76 +45,62 @@ const translate = useTranslate(); return ( - <Edit - redirect="list" - mutationMode={EDIT_MODE} - actions={<CustomerTopToolBar />} - aside={<EditBaseAside />} - > - <SimpleForm - shouldUnregister - warnWhenUnsavedChanges - toolbar={<FormToolbar />} - mode="onTouched" - defaultValues={{}} - // validate={(values) => { }} + <> + <Edit + redirect="list" + mutationMode={EDIT_MODE} + actions={<CustomerTopToolBar />} + aside={<EditBaseAside />} > - <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.waitPakinLog.pakinId" - source="pakinId" - autoFocus - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.waitPakinLog.code" - source="code" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.waitPakinLog.barcode" - source="barcode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.waitPakinLog.anfme" - source="anfme" - /> - </Stack> - <Stack direction='row' gap={2}> - <SelectInput - label="table.field.waitPakinLog.ioStatus" - source="ioStatus" - choices={[ - { id: 0, name: '寰呭叆搴�' }, - { id: 1, name: ' 鍏ュ簱涓�' }, - ]} - validate={required()} - /> - </Stack> - + <SimpleForm + shouldUnregister + warnWhenUnsavedChanges + toolbar={<FormToolbar />} + mode="onTouched" + defaultValues={{}} + // validate={(values) => { }} + > + <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> + <Grid item xs={24} md={12}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.main')} + </Typography> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.waitPakinLog.pakinId" + source="pakinId" + autoFocus + /> + <TextInput + label="table.field.waitPakinLog.code" + source="code" + parse={v => v} + /> + <TextInput + label="table.field.waitPakinLog.barcode" + source="barcode" + parse={v => v} + /> + <NumberInput + label="table.field.waitPakinLog.anfme" + source="anfme" + /> + <SelectInput + label="table.field.waitPakinLog.ioStatus" + source="ioStatus" + choices={[ + { id: 0, name: '寰呭叆搴�' }, + { id: 1, name: ' 鍏ュ簱涓�' }, + ]} + validate={required()} + /> + </Stack> + </Grid> </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 > + </SimpleForm> + </Edit > + <WaitPakinItemLogList /> + </> ) } diff --git a/rsf-admin/src/page/waitPakinLog/WaitPakinLogList.jsx b/rsf-admin/src/page/waitPakinLog/WaitPakinLogList.jsx index e9cb3f8..c689002 100644 --- a/rsf-admin/src/page/waitPakinLog/WaitPakinLogList.jsx +++ b/rsf-admin/src/page/waitPakinLog/WaitPakinLogList.jsx @@ -34,13 +34,9 @@ } from 'react-admin'; import { Box, Typography, Card, Stack } from '@mui/material'; import { styled } from '@mui/material/styles'; -import WaitPakinLogCreate from "./WaitPakinLogCreate"; -import WaitPakinLogPanel from "./WaitPakinLogPanel"; 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'; @@ -86,7 +82,6 @@ const WaitPakinLogList = () => { const translate = useTranslate(); - const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); @@ -108,7 +103,6 @@ actions={( <TopToolbar> <FilterButton /> - {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */} <SelectColumnsButton preferenceKey='waitPakinLog' /> <MyExportButton /> </TopToolbar> @@ -117,9 +111,9 @@ > <StyledDatagrid preferenceKey='waitPakinLog' - bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} - rowClick={(id, resource, record) => false} - expand={() => <WaitPakinLogPanel />} + bulkActionButtons={false} + rowClick={'edit'} + expand={false} expandSingle={true} omit={['id', 'createTime', 'createBy', 'memo']} > @@ -146,10 +140,6 @@ </WrapperField> </StyledDatagrid> </List> - <WaitPakinLogCreate - open={createDialog} - setOpen={setCreateDialog} - /> <PageDrawer title='WaitPakinLog Detail' drawerVal={drawerVal} 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 3d93a98..0229436 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 @@ -248,7 +248,7 @@ throw new CoolException("閫氱煡鍗曟槑缁嗕笉瀛樺湪锛侊紒"); } if (Objects.isNull(dto.getReceiptQty()) || Double.compare(dto.getReceiptQty(), 0.0) == 0) { - throw new CoolException("鏀惰揣鏁伴噺涓嶈兘涓洪浂锛侊紒"); + throw new CoolException("鐗╂枡:" + dto.getMaktx() + "鏀惰揣鏁伴噺涓嶈兘涓洪浂锛侊紒"); } Double itemRcptQty = dto.getReceiptQty() + orderItem.getQty(); orderItem.setQty(itemRcptQty) @@ -291,7 +291,7 @@ .setWeight(dto.getWeigth()) .setStockUnit(dto.getStockUnit()) .setBatch(SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_RECEIPT_BATCH, dto)) - .setAnfme(itemRcptQty) + .setAnfme(dto.getReceiptQty()) .setSplrBatch(dto.getSplrBatch()) .setMatnrCode(matnr.getCode()) .setMatnrId(matnr.getId()) @@ -738,6 +738,7 @@ */ @Override 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)); WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>() .eq(WaitPakin::getBarcode, params.get("barcode").toString()) @@ -756,11 +757,16 @@ .lambda() .in(WarehouseAreasItem::getTrackCode, list) .groupBy(WarehouseAreasItem::getSplrBatch, - WarehouseAreasItem::getAsnId, - WarehouseAreasItem::getAreaId, - WarehouseAreasItem::getTrackCode, - WarehouseAreasItem::getMatnrId); - return R.ok(warehouseAreasItemService.list(queryWrapper)); + 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); } /** 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 d5ae471..d4b1461 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 @@ -152,6 +152,10 @@ return "寰呭叆搴�"; case 1: return " 鍏ュ簱涓�"; + case 2: + return "浠诲姟鎵ц涓�"; + case 3: + return "浠诲姟瀹屾垚"; default: return String.valueOf(this.ioStatus); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseAreasItemService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseAreasItemService.java index 3018867..6870db3 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseAreasItemService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseAreasItemService.java @@ -1,12 +1,14 @@ package com.vincent.rsf.server.manager.service; +import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.service.IService; import com.vincent.rsf.server.manager.entity.WarehouseAreasItem; +import org.apache.ibatis.annotations.Param; import java.util.List; -import java.util.Map; public interface WarehouseAreasItemService extends IService<WarehouseAreasItem> { List<WarehouseAreasItem> getList(); + } 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 b50c28e..75bdb0e 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 @@ -1,6 +1,7 @@ package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.controller.params.PakinItem; @@ -13,15 +14,13 @@ import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; @Service("waitPakinService") @@ -36,6 +35,8 @@ private WaitPakinService waitPakinService; @Autowired private WaitPakinItemService waitPakinItemService; + @Autowired + private WarehouseAreasItemService warehouseAreasItemService; @Autowired private LocService locService; @@ -55,52 +56,73 @@ if (StringUtils.isBlank(waitPakin.getBarcode())) { throw new CoolException("鍙傛暟閿欒锛氭墭鐩樼爜涓虹┖锛侊紒"); } - - List<WaitPakin> list = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, waitPakin.getBarcode())); - if (!list.isEmpty()) { - List<String> stringList = list.stream().map(WaitPakin::getCode).collect(Collectors.toList()); - String join = StringUtils.join(stringList, ","); - throw new CoolException("鎷栫洏鐮侊細" + waitPakin.getBarcode() + "宸茶缁勬嫋鍗曪細" + join + "浣跨敤锛侊紒"); + List<Short> asList = Arrays.asList(Short.valueOf(PakinIOStatus.PAKIN_IO_STATUS_DONE.val), Short.valueOf(PakinIOStatus.PAKIN_IO_STATUS_DONE.val)); + WaitPakin list = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>() + .notIn(WaitPakin::getIoStatus, asList) + .eq(WaitPakin::getBarcode, waitPakin.getBarcode())); + if (!Objects.isNull(list)) { + throw new CoolException("鎷栫洏鐮侊細" + waitPakin.getBarcode() + "宸茶缁勬嫋鍗曪細" + list.getCode() + "浣跨敤锛侊紒"); } - List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, waitPakin.getBarcode())); if (!locs.isEmpty()) { List<String> locCodes = locs.stream().map(Loc::getCode).collect(Collectors.toList()); String join = StringUtils.join(locCodes, ","); throw new CoolException("鎷栫洏鐮侊細" + waitPakin.getBarcode() + "宸茶搴撲綅锛�" + join + "浣跨敤锛侊紒"); } - double sum = waitPakin.getItems().stream().mapToDouble(PakinItem::getReceiptQty).sum(); - WaitPakin pakin = new WaitPakin(); - - String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_WAIT_PAKIN_CODE, null); - if (StringUtils.isBlank(ruleCode)) { - throw new CoolException("缂栫爜瑙勫垯閿欒锛� 缂栫爜瑙勫垯銆孲YS_WAIT_PAKIN_CODE銆嶈鍒欐槸涓嶅瓨鍦�"); + WaitPakin waitPakin1 = new WaitPakin(); + WaitPakin pakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>() + .in(WaitPakin::getIoStatus, asList) + .eq(WaitPakin::getBarcode, waitPakin.getBarcode())); + if (Objects.isNull(pakin)) { + String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_WAIT_PAKIN_CODE, null); + if (StringUtils.isBlank(ruleCode)) { + throw new CoolException("缂栫爜瑙勫垯閿欒锛� 缂栫爜瑙勫垯銆孲YS_WAIT_PAKIN_CODE銆嶈鍒欐槸涓嶅瓨鍦�"); + } + waitPakin1.setCode(ruleCode) + //鐘舵�佷慨鏀逛负鍏ュ簱涓� + .setIoStatus(Short.parseShort(PakinIOStatus.PAKIN_IO_STATUS_DONE.val)) + .setAnfme(sum) + .setBarcode(waitPakin.getBarcode()); + if (!this.save(waitPakin1)) { + throw new CoolException("涓诲崟淇濆瓨澶辫触锛侊紒"); + } + } else { + BeanUtils.copyProperties(pakin, waitPakin1); + waitPakin1.setAnfme(sum); + if (!this.saveOrUpdate(waitPakin1)) { + throw new CoolException("涓诲崟淇敼澶辫触锛侊紒"); + } } - pakin.setCode(ruleCode) - //鐘舵�佷慨鏀逛负鍏ュ簱涓� - .setIoStatus(Short.parseShort(PakinIOStatus.PAKIN_IO_STATUS_DONE.val)) - .setAnfme(sum) - .setBarcode(waitPakin.getBarcode()); - if (!this.save(pakin)) { - throw new CoolException("涓诲崟淇濆瓨澶辫触锛侊紒"); - } - /**鐗╂枡璺熻釜鐮�*/ List<String> tracks = waitPakin.getItems().stream().map(PakinItem::getTrackCode).collect(Collectors.toList()); - - List<AsnOrderItem> asnOrderItems = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>() - .in(AsnOrderItem::getTrackCode, tracks)); - if (Objects.isNull(asnOrderItems) || asnOrderItems.isEmpty()) { - throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�"); + List<WaitPakinItem> pakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>() + .eq(WaitPakinItem::getPakinId, waitPakin1.getId()) + .in(WaitPakinItem::getTrackCode, tracks)); + if (!pakinItems.isEmpty()) { + if (!waitPakinItemService.remove(new LambdaQueryWrapper<WaitPakinItem>() + .eq(WaitPakinItem::getPakinId, waitPakin1.getId()) + .in(WaitPakinItem::getTrackCode, tracks))) { + 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 (AsnOrderItem item : asnOrderItems) { + for (WarehouseAreasItem item : warehouseAreasItems) { WaitPakinItem pakinItem = new WaitPakinItem(); pakinItem.setAnfme(item.getAnfme()) - .setPakinId(pakin.getId()) + .setPakinId(waitPakin1.getId()) .setAsnId(item.getAsnId()) .setAsnCode(item.getAsnCode()) .setAsnItemId(item.getId()) @@ -112,9 +134,10 @@ .setMatnrCode(item.getMatnrCode()); for (PakinItem waitPakinItem : waitPakin.getItems()) { if (waitPakinItem.getTrackCode().equals(item.getTrackCode())) { -// Double v = item.getWorkQty() + waitPakinItem.getReceiptQty(); + if (waitPakinItem.getReceiptQty() > item.getAnfme()) { + throw new CoolException("缁勬嫋鏁伴噺涓嶈兘澶т簬鏀惰揣鏁伴噺锛侊紒"); + } pakinItem - .setWorkQty(waitPakinItem.getReceiptQty()) .setAnfme(waitPakinItem.getReceiptQty()) .setTrackCode(waitPakinItem.getTrackCode()); /**鏇存柊鍗曟嵁鎵ц涓簱瀛�*/ @@ -127,9 +150,14 @@ } items.add(pakinItem); } + double sum1 = items.stream().mapToDouble(WaitPakinItem::getAnfme).sum(); if (!waitPakinItemService.saveBatch(items)) { throw new CoolException("缁勬嫋鏄庣粏淇濆瓨澶辫触锛侊紒"); } + waitPakin1.setAnfme(sum1); + if (!this.updateById(waitPakin1)) { + throw new CoolException("缁勬嫋鏁伴噺淇敼澶辫触锛侊紒"); + } return pakin; } -- Gitblit v1.9.1