From b5e8045d5f5b5401b696db12f62fdbcc86dc5c5d Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期四, 10 四月 2025 11:40:02 +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/taskLog/TaskLogEdit.jsx | 249 ++---- rsf-admin/src/page/task/TaskItemCreate.jsx | 0 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java | 3 rsf-admin/src/page/fields/FieldsList.jsx | 6 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaitPakin.java | 4 rsf-admin/src/page/asnOrderLog/AsnOrderItemLogList.jsx | 177 +++++ 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 | 103 ++ rsf-admin/src/page/system/role/AssignPermissions.jsx | 5 rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx | 2 rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/UserServiceImpl.java | 5 rsf-admin/src/page/fields/FieldsCreate.jsx | 10 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WarehouseAreasItemService.java | 4 rsf-admin/src/page/qlyInspect/AsnSelModal.jsx | 12 rsf-admin/src/page/task/TaskEdit.jsx | 238 ++---- rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItemLog.java | 2 rsf-admin/src/i18n/zh.js | 5 rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx | 222 ++--- rsf-admin/src/i18n/en.js | 1 rsf-admin/src/page/ResourceContent.js | 18 rsf-admin/src/config/setting.js | 2 rsf-server/src/main/resources/application-dev.yml | 8 rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx | 14 rsf-admin/src/page/fields/FieldsEdit.jsx | 8 rsf-admin/src/page/taskLog/TaskLogList.jsx | 50 rsf-admin/src/page/system/serialRule/SerialRuleList.jsx | 28 rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java | 4 rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx | 11 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java | 17 rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx | 233 ++++++ rsf-admin/src/page/taskLog/TaskItemLogList.jsx | 23 rsf-admin/src/page/system/user/UserList.jsx | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java | 34 rsf-admin/src/page/system/serialRule/SerialRuleItemCreate.jsx | 151 ++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.java | 3 rsf-admin/src/page/task/TaskItemList.jsx | 44 /dev/null | 18 rsf-admin/src/page/task/TaskList.jsx | 14 rsf-admin/src/page/system/role/RoleList.jsx | 4 rsf-server/src/main/java/com/vincent/rsf/server/system/service/UserService.java | 1 rsf-admin/src/page/purchase/PurchaseList.jsx | 2 rsf-admin/src/page/asnOrder/AsnOrderModal.jsx | 38 43 files changed, 1,266 insertions(+), 765 deletions(-) diff --git a/rsf-admin/src/config/setting.js b/rsf-admin/src/config/setting.js index 18ec5ad..9fe0af1 100644 --- a/rsf-admin/src/config/setting.js +++ b/rsf-admin/src/config/setting.js @@ -15,7 +15,7 @@ export const DEFAULT_THEME_NAME = 'rsf'; -export const DEFAULT_THEME_MODE = 'dark'; +export const DEFAULT_THEME_MODE = 'light'; export const TOKEN_HEADER_NAME = 'Authorization'; diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index 2e67cf6..daf2177 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -840,6 +840,7 @@ close: "close", asnCreate: "asnCreate", createTask: "createTask", + recover: "recover", }, }; diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index 8b0c4ab..7a43338 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -537,7 +537,7 @@ packName: "鍖呰鍚嶇О", ntyStatus: "鎶ユ鐘舵��", prodTime: "鐢熶骇鏃ユ湡", - platItemId: 'PO琛屽彿' + platItemId: 'PO鍗曞彿' }, asnOrderLog: { code: "缂栫爜", @@ -609,7 +609,7 @@ fields: { fields: "瀛楁", fieldsAlise: "瀛楁鍒悕", - unique: "绱㈠紩瀛楁", + unique: "鏄惁蹇呭~", flagEnable: "鍚敤", }, fieldsItem: { @@ -854,6 +854,7 @@ close: "鍏抽棴", asnCreate: "閫氳繃ASN鍒涘缓", createTask: "鐢熸垚浠诲姟", + recover: "缁х画鏀惰揣", }, }; diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js index daf5821..ed01cd9 100644 --- a/rsf-admin/src/page/ResourceContent.js +++ b/rsf-admin/src/page/ResourceContent.js @@ -45,11 +45,11 @@ import waitPakinLog from './waitPakinLog'; import waitPakinItemLog from './waitPakinItemLog'; import asnOrderLog from './asnOrderLog'; -import asnOrderItemLog from './asnOrderItemLog'; +// import asnOrderItemLog from './asnOrderItemLog'; import task from './task'; -import taskItem from './taskItem'; +// import taskItem from './taskItem'; import taskLog from './taskLog'; -import taskItemLog from './taskItemLog'; +// import taskItemLog from './taskItemLog'; const ResourceContent = (node) => { @@ -110,8 +110,8 @@ return asnOrderItem; case 'asnOrderLog': return asnOrderLog; - case 'asnOrderItemLog': - return asnOrderItemLog; + // case 'asnOrderItemLog': + // return asnOrderItemLog; case 'purchaseItem': return purchaseItem; case 'purchase': @@ -140,12 +140,12 @@ return waitPakinItemLog; case 'task': return task; - case 'taskItem': - return taskItem; + // case 'taskItem': + // return taskItem; case 'taskLog': return taskLog; - case 'taskItemLog': - return taskItemLog; + // case 'taskItemLog': + // return taskItemLog; default: return { diff --git a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx index e8fa4ac..1791f4d 100644 --- a/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx +++ b/rsf-admin/src/page/asnOrder/AsnOrderModal.jsx @@ -88,6 +88,8 @@ const [formData, setFormData] = useState({ type: '', wkType: '', + poCode: '', + logisNo: '' }); const [tabelData, setTableData] = useState([]); @@ -104,6 +106,8 @@ setFormData({ type: '', wkType: '', + poCode: '', + logisNo: '' }) setTableData([]) } @@ -222,7 +226,7 @@ <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Form> <Grid container spacing={2}> - <Grid item md={4}> + <Grid item md={3}> <DictSelect label={translate("table.field.asnOrder.type")} value={formData.type} @@ -234,13 +238,29 @@ </Grid> - <Grid item md={4}> + <Grid item md={3}> <DictSelect label={translate("table.field.asnOrder.wkType")} value={formData.wkType} onChange={(e) => handleChange(e.target.value, 'wkType')} dictTypeCode="sys_business_type" required + /> + </Grid> + + <Grid item md={3}> + <TextField + label={translate("table.field.asnOrder.poCode")} + value={formData.poCode} + onChange={(e) => handleChange(e.target.value, 'poCode')} + /> + </Grid> + + <Grid item md={3}> + <TextField + label={translate("table.field.asnOrder.logisNo")} + value={formData.logisNo} + onChange={(e) => handleChange(e.target.value, 'logisNo')} /> </Grid> </Grid> @@ -307,10 +327,7 @@ minWidth: 100, flex: 1, editable: true, - // preProcessEditCellProps: (params) => { - // const hasError = params.props.value.length !== ''; - // return { ...params.props, error: hasError }; - // }, + valueFormatter: (val) => val < 0 ? 0 : val }, { field: 'splrCode', @@ -463,7 +480,14 @@ disableColumnSorting disableMultipleColumnsSorting processRowUpdate={processRowUpdate} - autoPageSize + initialState={{ + pagination: { + paginationModel: { + pageSize: 25, + }, + }, + }} + pageSizeOptions={[10, 25, 50, 100]} editMode="row" checkboxSelection onRowSelectionModelChange={handleSelectionChange} diff --git a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx index 00c0a89..3a6c137 100644 --- a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx +++ b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx @@ -140,15 +140,13 @@ } - return ( <Box sx={{ position: 'relative', padding: '5px 10px' }}> - <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', alignItems: 'center' }}> - <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} size="small" /> + <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" sx={{ width: '300px' }} size="small" /> <div style={{ display: 'flex', gap: '10px' }}> <PrintsButton rows={selectedRows} /> @@ -168,6 +166,16 @@ disableColumnMenu={true} disableColumnSorting disableMultipleColumnsSorting + columnHeaderHeight={40} + rowHeight={42} + initialState={{ + pagination: { + paginationModel: { + pageSize: 10, + }, + }, + }} + pageSizeOptions={[10, 25, 50]} /> </Box > 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/asnOrderLog/AsnOrderLogEdit.jsx b/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx index 2e044bd..a1c2e7c 100644 --- a/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx +++ b/rsf-admin/src/page/asnOrderLog/AsnOrderLogEdit.jsx @@ -21,21 +21,20 @@ DeleteButton, } from 'react-admin'; import { useWatch, useFormContext } from "react-hook-form"; -import { Stack, Grid, Box, Typography } from '@mui/material'; +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" const FormToolbar = () => { const { getValues } = useFormContext(); return ( - <Toolbar sx={{ justifyContent: 'space-between' }}> + <Toolbar sx={{ justifyContent: 'end' }}> <SaveButton /> - <DeleteButton mutationMode="optimistic" /> </Toolbar> ) } @@ -44,125 +43,106 @@ 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.asnOrderLog.code" - source="code" - parse={v => v} - autoFocus - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.asnOrderLog.poCode" - source="poCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.asnOrderLog.poId" - source="poId" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.asnOrderLog.type" - source="type" - parse={v => v} - validate={required()} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.asnOrderLog.wkType" - source="wkType" - parse={v => v} - validate={required()} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.asnOrderLog.anfme" - source="anfme" - validate={required()} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.asnOrderLog.qty" - source="qty" - validate={required()} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.asnOrderLog.logisNo" - source="logisNo" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <DateInput - label="table.field.asnOrderLog.arrTime" - source="arrTime" - /> - </Stack> - <Stack direction='row' gap={2}> - <SelectInput - label="table.field.asnOrderLog.rleStatus" - source="rleStatus" - choices={[ - { id: 0, name: ' 姝e父' }, - { id: 1, name: ' 宸查噴鏀�' }, - ]} - validate={required()} - /> - </Stack> - <Stack direction='row' gap={2}> - <SelectInput - label="table.field.asnOrderLog.ntyStatus" - source="ntyStatus" - choices={[ - { id: 0, name: ' 鏈笂鎶�' }, - { id: 1, name: ' 宸蹭笂鎶�' }, - { id: 2, 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}> + <TextInput + label="table.field.asnOrderLog.code" + source="code" + parse={v => v} + readOnly + /> + <TextInput + label="table.field.asnOrderLog.poCode" + source="poCode" + readOnly + parse={v => v} + /> + <NumberInput + label="table.field.asnOrderLog.poId" + readOnly + source="poId" + /> + <TextInput + label="table.field.asnOrderLog.type" + source="type" + readOnly + parse={v => v} + validate={required()} + /> + <TextInput + label="table.field.asnOrderLog.wkType" + source="wkType" + readOnly + parse={v => v} + validate={required()} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.asnOrderLog.anfme" + source="anfme" + readOnly + validate={required()} + /> + <NumberInput + label="table.field.asnOrderLog.qty" + source="qty" + readOnly + validate={required()} + /> + <TextInput + label="table.field.asnOrderLog.logisNo" + source="logisNo" + readOnly + parse={v => v} + /> + <DateInput + label="table.field.asnOrderLog.arrTime" + readOnly + source="arrTime" + /> + <SelectInput + label="table.field.asnOrderLog.ntyStatus" + source="ntyStatus" + readOnly + choices={[ + { id: 0, name: ' 鏈笂鎶�' }, + { id: 1, name: ' 宸蹭笂鎶�' }, + { id: 2, 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 > + <Grid item xs={24} md={16} sx={{ marginTop: '1em' }}> + <Typography variant="h6" gutterBottom > + {translate('common.edit.title.common')} + </Typography> + </Grid> + <AsnOrderItemLogList /> + </> ) } diff --git a/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx b/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx index a4e8f60..29c4a09 100644 --- a/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx +++ b/rsf-admin/src/page/asnOrderLog/AsnOrderLogList.jsx @@ -98,7 +98,6 @@ const AsnOrderLogList = () => { const translate = useTranslate(); - const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); @@ -120,7 +119,7 @@ actions={( <TopToolbar> <FilterButton /> - <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */} <SelectColumnsButton preferenceKey='asnOrderLog' /> <MyExportButton /> </TopToolbar> @@ -130,8 +129,8 @@ <StyledDatagrid preferenceKey='asnOrderLog' bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} - rowClick={(id, resource, record) => false} - expand={() => <AsnOrderLogPanel />} + rowClick={'edit'} + expand={false} expandSingle={true} omit={['id', 'createTime', 'createBy', 'memo']} > @@ -158,10 +157,6 @@ <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> <AsnOrderLogCreate diff --git a/rsf-admin/src/page/fields/FieldsCreate.jsx b/rsf-admin/src/page/fields/FieldsCreate.jsx index cd84b28..87afbb0 100644 --- a/rsf-admin/src/page/fields/FieldsCreate.jsx +++ b/rsf-admin/src/page/fields/FieldsCreate.jsx @@ -89,6 +89,7 @@ label="table.field.fields.fields" source="fields" parse={v => v} + validate={required()} autoFocus /> </Grid> @@ -96,6 +97,7 @@ <TextInput label="table.field.fields.fieldsAlise" source="fieldsAlise" + validate={required()} parse={v => v} /> </Grid> @@ -104,9 +106,10 @@ label="table.field.fields.unique" source="unique" choices={[ - { id: 0, name: ' 闈炲敮涓�' }, - { id: 1, name: ' 鍞竴' }, + { id: 0, name: ' 闈炲繀濉�' }, + { id: 1, name: ' 蹇呭~' }, ]} + validate={required()} /> </Grid> <Grid item xs={6} display="flex" gap={1}> @@ -115,8 +118,9 @@ source="flagEnable" choices={[ { id: 0, name: ' 涓嶅惎鐢�' }, - { id: 1, name: ' 鍚敤' }, + { id: 1, name: ' 鍚敤' }, ]} + validate={required()} /> </Grid> diff --git a/rsf-admin/src/page/fields/FieldsEdit.jsx b/rsf-admin/src/page/fields/FieldsEdit.jsx index de6bcea..b474bd2 100644 --- a/rsf-admin/src/page/fields/FieldsEdit.jsx +++ b/rsf-admin/src/page/fields/FieldsEdit.jsx @@ -69,6 +69,7 @@ source="fields" parse={v => v} autoFocus + validate={required()} /> </Stack> <Stack direction='row' gap={2}> @@ -76,6 +77,7 @@ label="table.field.fields.fieldsAlise" source="fieldsAlise" parse={v => v} + validate={required()} /> </Stack> <Stack direction='row' gap={2}> @@ -83,8 +85,8 @@ label="table.field.fields.unique" source="unique" choices={[ - { id: 0, name: ' 闈炲敮涓�' }, - { id: 1, name: ' 鍞竴' }, + { id: 0, name: ' 闈炲繀濉�' }, + { id: 1, name: ' 蹇呭~' }, ]} validate={required()} /> @@ -95,7 +97,7 @@ source="flagEnable" choices={[ { id: 0, name: ' 涓嶅惎鐢�' }, - { id: 1, name: ' 鍚敤' }, + { id: 1, name: ' 鍚敤' }, ]} validate={required()} /> diff --git a/rsf-admin/src/page/fields/FieldsList.jsx b/rsf-admin/src/page/fields/FieldsList.jsx index 78970d9..795c931 100644 --- a/rsf-admin/src/page/fields/FieldsList.jsx +++ b/rsf-admin/src/page/fields/FieldsList.jsx @@ -60,15 +60,13 @@ const filters = [ <SearchInput source="condition" alwaysOn />, - <DateInput label='common.time.after' source="timeStart" alwaysOn />, - <DateInput label='common.time.before' source="timeEnd" alwaysOn />, <TextInput source="fields" label="table.field.fields.fields" />, <TextInput source="fieldsAlise" label="table.field.fields.fieldsAlise" />, <SelectInput source="unique" label="table.field.fields.unique" choices={[ - { id: 0, name: ' 闈炲敮涓�' }, - { id: 1, name: ' 鍞竴' }, + { id: 0, name: ' 闈炲繀濉�' }, + { id: 1, name: ' 蹇呭~' }, ]} />, <SelectInput source="flagEnable" label="table.field.fields.flagEnable" diff --git a/rsf-admin/src/page/purchase/PurchaseList.jsx b/rsf-admin/src/page/purchase/PurchaseList.jsx index adc1921..ffdb648 100644 --- a/rsf-admin/src/page/purchase/PurchaseList.jsx +++ b/rsf-admin/src/page/purchase/PurchaseList.jsx @@ -123,7 +123,7 @@ <StyledDatagrid preferenceKey='purchase' bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} - rowClick={(id, resource, record) => false} + rowClick={'edit'} expand={() => <PurchasePanel />} expandSingle={true} omit={['id', 'createTime', 'createBy', 'memo']} diff --git a/rsf-admin/src/page/qlyInspect/AsnSelModal.jsx b/rsf-admin/src/page/qlyInspect/AsnSelModal.jsx index 7e3f206..f51a761 100644 --- a/rsf-admin/src/page/qlyInspect/AsnSelModal.jsx +++ b/rsf-admin/src/page/qlyInspect/AsnSelModal.jsx @@ -38,7 +38,7 @@ }; const [formData, setFormData] = useState({ - code: '' + asnCode: '' }); const [tableData, setTableData] = useState([]); @@ -54,7 +54,7 @@ const reset = () => { setFormData({ - code: '' + asnCode: '' }) } @@ -72,9 +72,7 @@ }; const getData = async () => { - const res = await request.post(`/qlyInspect/asn/list`, { - ...formData, - }); + const res = await request.post(`/qlyInspect/asn/list`, { asnCode: formData.asnCode }); if (res?.data?.code === 200) { setTableData(res.data.data); } else { @@ -116,8 +114,8 @@ <Grid item md={4}> <TextField label={translate('table.field.asnOrder.code')} - name="code" - value={formData.code} + name="asnCode" + value={formData.asnCode} onChange={handleChange} size="small" /> diff --git a/rsf-admin/src/page/system/role/AssignPermissions.jsx b/rsf-admin/src/page/system/role/AssignPermissions.jsx index d9fd08b..7be80ae 100644 --- a/rsf-admin/src/page/system/role/AssignPermissions.jsx +++ b/rsf-admin/src/page/system/role/AssignPermissions.jsx @@ -177,11 +177,11 @@ <Card sx={{ ml: 1, mr: 1, - height: '620px' + height: 'calc(100vh - 140px)', + overflowY: 'auto' }}> <CardContent sx={{ overflow: 'auto', - height: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'space-between' @@ -218,7 +218,6 @@ </Box> <Box sx={{ - height: 480, minWidth: 290, overflow: 'auto', marginTop: '10px', diff --git a/rsf-admin/src/page/system/role/RoleList.jsx b/rsf-admin/src/page/system/role/RoleList.jsx index f02ac2d..cdecd51 100644 --- a/rsf-admin/src/page/system/role/RoleList.jsx +++ b/rsf-admin/src/page/system/role/RoleList.jsx @@ -61,8 +61,6 @@ const filters = [ <SearchInput source="condition" alwaysOn />, - <DateInput label='common.time.after' source="timeStart" alwaysOn />, - <DateInput label='common.time.before' source="timeEnd" alwaysOn />, <TextInput source="name" label="table.field.role.name" />, <TextInput source="code" label="table.field.role.code" />, @@ -132,8 +130,6 @@ preferenceKey='role' bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} rowClick={(id, resource, record) => false} - expand={() => <RolePanel />} - expandSingle={true} omit={['id', 'createTime', 'memo']} > <NumberField source="id" /> 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..709c9f4 --- /dev/null +++ b/rsf-admin/src/page/system/serialRule/SerialRuleItemList.jsx @@ -0,0 +1,233 @@ +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 location = useLocation(); + const ruleId = useGetRecordId(); + + return ( + <> + {ruleId && <CustomerTopToolBar backPrevious={true} />} + <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/system/user/UserList.jsx b/rsf-admin/src/page/system/user/UserList.jsx index 7906b2f..12e20c8 100644 --- a/rsf-admin/src/page/system/user/UserList.jsx +++ b/rsf-admin/src/page/system/user/UserList.jsx @@ -91,8 +91,6 @@ const filters = [ // <SearchInput source="condition" alwaysOn />, - <DateInput label="common.time.after" source="timeStart" alwaysOn />, - <DateInput label="common.time.before" source="timeEnd" alwaysOn />, <TextInput source="username" label="table.field.user.username" />, <TextInput source="nickname" label="table.field.user.nickname" />, @@ -148,8 +146,6 @@ <BulkDeleteButton mutationMode={OPERATE_MODE} /> )} rowClick={(id, resource, record) => false} - expand={() => <UserPanel />} - expandSingle={true} omit={[ "id", "email", diff --git a/rsf-admin/src/page/task/TaskEdit.jsx b/rsf-admin/src/page/task/TaskEdit.jsx index ab88ff1..166b846 100644 --- a/rsf-admin/src/page/task/TaskEdit.jsx +++ b/rsf-admin/src/page/task/TaskEdit.jsx @@ -2,180 +2,118 @@ 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 { useWatch, useFormContext, useForm } 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 TaskItemList from "./TaskItemList"; const FormToolbar = () => { const { getValues } = useFormContext(); - return ( - <Toolbar sx={{ justifyContent: 'space-between' }}> + <Toolbar sx={{ justifyContent: 'end' }}> <SaveButton /> - <DeleteButton mutationMode="optimistic" /> + {/* <DeleteButton mutationMode="optimistic" /> */} </Toolbar> ) } const TaskEdit = () => { 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.task.taskCode" - source="taskCode" - parse={v => v} - autoFocus - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.task.taskStatus" - source="taskStatus" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.task.taskType" - source="taskType" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.orgLoc" - source="orgLoc" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.orgSite" - source="orgSite" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.targLoc" - source="targLoc" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.targSite" - source="targSite" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.barcode" - source="barcode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.robotCode" - source="robotCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.task.exceStatus" - source="exceStatus" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.expDesc" - source="expDesc" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.task.sort" - source="sort" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.expCode" - source="expCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <DateInput - label="table.field.task.startTime" - source="startTime" - /> - </Stack> - <Stack direction='row' gap={2}> - <DateInput - label="table.field.task.endTime" - source="endTime" - /> - </Stack> - + <SimpleForm + shouldUnregister + warnWhenUnsavedChanges + toolbar={<FormToolbar />} + mode="onTouched" + defaultValues={{}} + > + <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> + <Grid item xs={24} md={16}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.main')} + </Typography> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.task.taskCode" + source="taskCode" + readOnly + parse={v => v} + autoFocus + /> + <TextInput + label="table.field.task.taskStatus" + readOnly + source="taskStatus$" + /> + <TextInput + label="table.field.task.taskType" + source="taskType$" + readOnly + /> + <TextInput + label="table.field.task.orgLoc" + source="orgLoc" + readOnly + parse={v => v} + /> + <TextInput + label="table.field.task.targLoc" + source="targLoc" + readOnly + parse={v => v} + /> + <TextInput + label="table.field.task.orgSite" + source="orgSite" + readOnly + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.task.targSite" + source="targSite" + readOnly + parse={v => v} + /> + <TextInput + label="table.field.task.barcode" + source="barcode" + readOnly + parse={v => v} + /> + <NumberInput + label="table.field.task.sort" + source="sort" + /> + </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 > + <Grid item xs={24} md={16} sx={{ margin: '1em', height: 'auto' }}> + <Typography variant="h6" gutterBottom > + {translate('common.edit.title.common')} + </Typography> + </Grid> + <TaskItemList /> + </> ) } diff --git a/rsf-admin/src/page/taskItem/TaskItemCreate.jsx b/rsf-admin/src/page/task/TaskItemCreate.jsx similarity index 100% rename from rsf-admin/src/page/taskItem/TaskItemCreate.jsx rename to rsf-admin/src/page/task/TaskItemCreate.jsx diff --git a/rsf-admin/src/page/taskItem/TaskItemList.jsx b/rsf-admin/src/page/task/TaskItemList.jsx similarity index 87% rename from rsf-admin/src/page/taskItem/TaskItemList.jsx rename to rsf-admin/src/page/task/TaskItemList.jsx index d146e6d..67ae0ab 100644 --- a/rsf-admin/src/page/taskItem/TaskItemList.jsx +++ b/rsf-admin/src/page/task/TaskItemList.jsx @@ -1,62 +1,50 @@ import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; -import { useNavigate } from 'react-router-dom'; +import { useFetcher, 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 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 MyCreateButton from "../components/MyCreateButton"; +import TaskItemCreate from "./TaskItemCreate"; + const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { height: '.9em' }, '& .RaDatagrid-row': { - cursor: 'auto' + cursor: 'auto', + maring: '1em' }, '& .column-name': { }, '& .opt': { - width: 200 + width: 220 }, })); const filters = [ <SearchInput source="condition" alwaysOn />, - <DateInput label='common.time.after' source="timeStart" alwaysOn />, - <DateInput label='common.time.before' source="timeEnd" alwaysOn />, + <DateInput label='common.time.after' source="timeStart" />, + <DateInput label='common.time.before' source="timeEnd" />, <NumberInput source="taskId" label="table.field.taskItem.taskId" />, <NumberInput source="orderId" label="table.field.taskItem.orderId" />, <NumberInput source="orderType" label="table.field.taskItem.orderType" />, @@ -85,10 +73,12 @@ const translate = useTranslate(); const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); + const recordId = useGetRecordId(); return ( <Box display="flex"> <List + resource="taskItem" sx={{ flexGrow: 1, transition: (theme) => @@ -99,12 +89,14 @@ }} title={"menu.taskItem"} empty={false} + pagination={false} filters={filters} + filter={{taskId: recordId}} sort={{ field: "create_time", order: "desc" }} actions={( <TopToolbar> <FilterButton /> - {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */} + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> <SelectColumnsButton preferenceKey='taskItem' /> {/* <MyExportButton /> */} </TopToolbar> @@ -113,7 +105,7 @@ > <StyledDatagrid preferenceKey='taskItem' - // bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + bulkActionButtons={false} rowClick={(id, resource, record) => false} // expand={() => <TaskItemPanel />} expandSingle={true} @@ -132,7 +124,6 @@ <TextField source="batch" label="table.field.taskItem.batch" /> <TextField source="spec" label="table.field.taskItem.spec" /> <TextField source="model" label="table.field.taskItem.model" /> - <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> <TextField source="nickname" /> </ReferenceField> @@ -145,6 +136,9 @@ <TextField source="memo" label="common.field.memo" sortable={false} /> </StyledDatagrid> </List> + <TaskItemCreate + open={createDialog} + setOpen={setCreateDialog} /> <PageDrawer title='TaskItem Detail' drawerVal={drawerVal} diff --git a/rsf-admin/src/page/task/TaskList.jsx b/rsf-admin/src/page/task/TaskList.jsx index 7528252..7f6cce0 100644 --- a/rsf-admin/src/page/task/TaskList.jsx +++ b/rsf-admin/src/page/task/TaskList.jsx @@ -26,7 +26,7 @@ Button, } from 'react-admin'; -import { Box, Typography, Card, Stack } from '@mui/material'; +import { Box, Typography, Card, Stack, Drawer } from '@mui/material'; import { styled } from '@mui/material/styles'; import TaskCreate from "./TaskCreate"; import TaskPanel from "./TaskPanel"; @@ -52,7 +52,7 @@ '& .column-name': { }, '& .opt': { - width: 200 + width: 248 }, })); @@ -122,10 +122,10 @@ <BulkDeleteButton mutationMode={OPERATE_MODE} /> </> } - rowClick={false} - expand={() => <TaskPanel/>} + rowClick={'edit'} + expand={false} expandSingle={true} - omit={['id', 'createTime', 'createBy', 'memo', 'robotCode', 'exceStatus', 'expDesc', 'expCode', 'sort']} + omit={['id', 'createTime', 'createBy', 'memo', 'robotCode', 'exceStatus', 'expDesc', 'expCode', 'status', 'sort']} > <NumberField source="id" /> <TextField source="taskCode" label="table.field.task.taskCode" /> @@ -145,7 +145,7 @@ <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} /> + {/* <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"> <DoneButton sx={{ padding: '1px', fontSize: '.75rem' }} ></DoneButton> @@ -165,6 +165,8 @@ } export default TaskList; + + /** * 瀹屾垚鎿嶄綔 * @returns diff --git a/rsf-admin/src/page/taskItem/TaskItemEdit.jsx b/rsf-admin/src/page/taskItem/TaskItemEdit.jsx deleted file mode 100644 index df2b7b6..0000000 --- a/rsf-admin/src/page/taskItem/TaskItemEdit.jsx +++ /dev/null @@ -1,161 +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 TaskItemEdit = () => { - 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.taskItem.taskId" - source="taskId" - autoFocus - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItem.orderId" - source="orderId" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItem.orderType" - source="orderType" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItem.orderItemId" - source="orderItemId" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItem.matnrId" - source="matnrId" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItem.maktx" - source="maktx" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItem.matnrCode" - source="matnrCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItem.unit" - source="unit" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItem.anfme" - source="anfme" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItem.batch" - source="batch" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItem.spec" - source="spec" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItem.model" - source="model" - 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 TaskItemEdit; diff --git a/rsf-admin/src/page/taskItem/TaskItemPanel.jsx b/rsf-admin/src/page/taskItem/TaskItemPanel.jsx deleted file mode 100644 index 9bc1f7a..0000000 --- a/rsf-admin/src/page/taskItem/TaskItemPanel.jsx +++ /dev/null @@ -1,123 +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 TaskItemPanel = () => { - 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.taskItem.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.taskItem.taskId" - property={record.taskId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.orderId" - property={record.orderId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.orderType" - property={record.orderType} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.orderItemId" - property={record.orderItemId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.matnrId" - property={record.matnrId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.maktx" - property={record.maktx} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.matnrCode" - property={record.matnrCode} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.unit" - property={record.unit} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.anfme" - property={record.anfme} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.batch" - property={record.batch} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.spec" - property={record.spec} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItem.model" - property={record.model} - /> - </Grid> - - </Grid> - </CardContent> - </Card > - </> - ); -}; - -export default TaskItemPanel; diff --git a/rsf-admin/src/page/taskItem/index.jsx b/rsf-admin/src/page/taskItem/index.jsx deleted file mode 100644 index da6cff0..0000000 --- a/rsf-admin/src/page/taskItem/index.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React, { useState, useRef, useEffect, useMemo } from "react"; -import { - ListGuesser, - EditGuesser, - ShowGuesser, -} from "react-admin"; - -import TaskItemList from "./TaskItemList"; -import TaskItemEdit from "./TaskItemEdit"; - -export default { - list: TaskItemList, - edit: TaskItemEdit, - show: ShowGuesser, - recordRepresentation: (record) => { - return `${record.id}` - } -}; diff --git a/rsf-admin/src/page/taskItemLog/TaskItemLogCreate.jsx b/rsf-admin/src/page/taskItemLog/TaskItemLogCreate.jsx deleted file mode 100644 index 29f89f7..0000000 --- a/rsf-admin/src/page/taskItemLog/TaskItemLogCreate.jsx +++ /dev/null @@ -1,216 +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 TaskItemLogCreate = (props) => { - const { open, setOpen } = props; - - const translate = useTranslate(); - const notify = useNotify(); - - const handleClose = (event, reason) => { - if (reason !== "backdropClick") { - setOpen(false); - } - }; - - const handleSuccess = async (data) => { - setOpen(false); - notify('common.response.success'); - }; - - const handleError = async (error) => { - notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } }); - }; - - return ( - <> - <CreateBase - record={{}} - transform={(data) => { - return data; - }} - mutationOptions={{ onSuccess: handleSuccess, onError: handleError }} - > - <Dialog - open={open} - onClose={handleClose} - aria-labelledby="form-dialog-title" - fullWidth - disableRestoreFocus - maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' - > - <Form> - <DialogTitle id="form-dialog-title" sx={{ - position: 'sticky', - top: 0, - backgroundColor: 'background.paper', - zIndex: 1000 - }} - > - {translate('create.title')} - <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> - <DialogCloseButton onClose={handleClose} /> - </Box> - </DialogTitle> - <DialogContent sx={{ mt: 2 }}> - <Grid container rowSpacing={2} columnSpacing={2}> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.taskItemLog.taskItemId" - source="taskItemId" - autoFocus - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.taskItemLog.taskId" - source="taskId" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.taskItemLog.orderId" - source="orderId" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.taskItemLog.orderType" - source="orderType" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.taskItemLog.orderItemId" - source="orderItemId" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.taskItemLog.source" - source="source" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.taskItemLog.matnrId" - source="matnrId" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.taskItemLog.maktx" - source="maktx" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.taskItemLog.matnrCode" - source="matnrCode" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.taskItemLog.trackCode" - source="trackCode" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.taskItemLog.unit" - source="unit" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <NumberInput - label="table.field.taskItemLog.anfme" - source="anfme" - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.taskItemLog.batch" - source="batch" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.taskItemLog.spec" - source="spec" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.taskItemLog.model" - source="model" - parse={v => v} - /> - </Grid> - <Grid item xs={6} display="flex" gap={1}> - <TextInput - label="table.field.taskItemLog.fieldsIndex" - source="fieldsIndex" - parse={v => v} - /> - </Grid> - - <Grid item xs={6} display="flex" gap={1}> - <StatusSelectInput /> - </Grid> - <Grid item xs={12} display="flex" gap={1}> - <Stack direction="column" spacing={1} width={'100%'}> - <MemoInput /> - </Stack> - </Grid> - </Grid> - </DialogContent> - <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> - <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > - <SaveButton /> - </Toolbar> - </DialogActions> - </Form> - </Dialog> - </CreateBase> - </> - ) -} - -export default TaskItemLogCreate; diff --git a/rsf-admin/src/page/taskItemLog/TaskItemLogEdit.jsx b/rsf-admin/src/page/taskItemLog/TaskItemLogEdit.jsx deleted file mode 100644 index 229ce32..0000000 --- a/rsf-admin/src/page/taskItemLog/TaskItemLogEdit.jsx +++ /dev/null @@ -1,188 +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 TaskItemLogEdit = () => { - const translate = useTranslate(); - - return ( - <Edit - redirect="list" - mutationMode={EDIT_MODE} - actions={<CustomerTopToolBar />} - aside={<EditBaseAside />} - > - <SimpleForm - shouldUnregister - warnWhenUnsavedChanges - toolbar={<FormToolbar />} - mode="onTouched" - defaultValues={{}} - // validate={(values) => { }} - > - <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> - <Grid item xs={12} md={8}> - <Typography variant="h6" gutterBottom> - {translate('common.edit.title.main')} - </Typography> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItemLog.taskItemId" - source="taskItemId" - autoFocus - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItemLog.taskId" - source="taskId" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItemLog.orderId" - source="orderId" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItemLog.orderType" - source="orderType" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItemLog.orderItemId" - source="orderItemId" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItemLog.source" - source="source" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItemLog.matnrId" - source="matnrId" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItemLog.maktx" - source="maktx" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItemLog.matnrCode" - source="matnrCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItemLog.trackCode" - source="trackCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItemLog.unit" - source="unit" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskItemLog.anfme" - source="anfme" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItemLog.batch" - source="batch" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItemLog.spec" - source="spec" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItemLog.model" - source="model" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskItemLog.fieldsIndex" - source="fieldsIndex" - parse={v => v} - /> - </Stack> - - </Grid> - <Grid item xs={12} md={4}> - <Typography variant="h6" gutterBottom> - {translate('common.edit.title.common')} - </Typography> - <StatusSelectInput /> - <Box mt="2em" /> - <MemoInput /> - </Grid> - </Grid> - </SimpleForm> - </Edit > - ) -} - -export default TaskItemLogEdit; diff --git a/rsf-admin/src/page/taskItemLog/TaskItemLogPanel.jsx b/rsf-admin/src/page/taskItemLog/TaskItemLogPanel.jsx deleted file mode 100644 index 6f863f8..0000000 --- a/rsf-admin/src/page/taskItemLog/TaskItemLogPanel.jsx +++ /dev/null @@ -1,147 +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 TaskItemLogPanel = () => { - const record = useRecordContext(); - if (!record) return null; - const translate = useTranslate(); - return ( - <> - <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}> - <CardContent> - <Grid container spacing={2}> - <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}> - <Typography variant="h6" gutterBottom align="left" sx={{ - maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' }, - whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', - }}> - {Common.camelToPascalWithSpaces(translate('table.field.taskItemLog.id'))}: {record.id} - </Typography> - {/* inherit, primary, secondary, textPrimary, textSecondary, error */} - <Typography variant="h6" gutterBottom align="right" > - ID: {record.id} - </Typography> - </Grid> - </Grid> - <Grid container spacing={2}> - <Grid item xs={12} container alignContent="flex-end"> - <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}> - {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo} - </Typography> - </Grid> - </Grid> - <Box height={20}> </Box> - <Grid container spacing={2}> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.taskItemId" - property={record.taskItemId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.taskId" - property={record.taskId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.orderId" - property={record.orderId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.orderType" - property={record.orderType} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.orderItemId" - property={record.orderItemId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.source" - property={record.source} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.matnrId" - property={record.matnrId} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.maktx" - property={record.maktx} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.matnrCode" - property={record.matnrCode} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.trackCode" - property={record.trackCode} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.unit" - property={record.unit} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.anfme" - property={record.anfme} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.batch" - property={record.batch} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.spec" - property={record.spec} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.model" - property={record.model} - /> - </Grid> - <Grid item xs={6}> - <PanelTypography - title="table.field.taskItemLog.fieldsIndex" - property={record.fieldsIndex} - /> - </Grid> - - </Grid> - </CardContent> - </Card > - </> - ); -}; - -export default TaskItemLogPanel; diff --git a/rsf-admin/src/page/taskItemLog/index.jsx b/rsf-admin/src/page/taskItemLog/index.jsx deleted file mode 100644 index 0208e30..0000000 --- a/rsf-admin/src/page/taskItemLog/index.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React, { useState, useRef, useEffect, useMemo } from "react"; -import { - ListGuesser, - EditGuesser, - ShowGuesser, -} from "react-admin"; - -import TaskItemLogList from "./TaskItemLogList"; -import TaskItemLogEdit from "./TaskItemLogEdit"; - -export default { - list: TaskItemLogList, - edit: TaskItemLogEdit, - show: ShowGuesser, - recordRepresentation: (record) => { - return `${record.id}` - } -}; diff --git a/rsf-admin/src/page/taskItemLog/TaskItemLogList.jsx b/rsf-admin/src/page/taskLog/TaskItemLogList.jsx similarity index 87% rename from rsf-admin/src/page/taskItemLog/TaskItemLogList.jsx rename to rsf-admin/src/page/taskLog/TaskItemLogList.jsx index 58c7f4f..acf1ae7 100644 --- a/rsf-admin/src/page/taskItemLog/TaskItemLogList.jsx +++ b/rsf-admin/src/page/taskLog/TaskItemLogList.jsx @@ -31,18 +31,13 @@ ReferenceArrayInput, AutocompleteInput, DeleteButton, + useGetRecordId, } from 'react-admin'; import { Box, Typography, Card, Stack } from '@mui/material'; import { styled } from '@mui/material/styles'; -import TaskItemLogCreate from "./TaskItemLogCreate"; -import TaskItemLogPanel from "./TaskItemLogPanel"; -import EmptyData from "../components/EmptyData"; -import MyCreateButton from "../components/MyCreateButton"; import MyExportButton from '../components/MyExportButton'; import PageDrawer from "../components/PageDrawer"; -import MyField from "../components/MyField"; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; -import * as Common from '@/utils/common'; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -94,13 +89,15 @@ const TaskItemLogList = () => { const translate = useTranslate(); - const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); + const recodeId = useGetRecordId(); + return ( <Box display="flex"> <List + resource="taskItemLog" sx={{ flexGrow: 1, transition: (theme) => @@ -112,6 +109,7 @@ title={"menu.taskItemLog"} filters={filters} empty={false} + filter={{logId: Number(recodeId) }} sort={{ field: "create_time", order: "desc" }} actions={( <TopToolbar> @@ -130,7 +128,6 @@ omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']} > <NumberField source="id" /> - <NumberField source="taskItemId" label="table.field.taskItemLog.taskItemId" /> <NumberField source="taskId" label="table.field.taskItemLog.taskId" /> <NumberField source="orderId" label="table.field.taskItemLog.orderId" /> <TextField source="orderType" label="table.field.taskItemLog.orderType" /> @@ -145,15 +142,9 @@ <TextField source="batch" label="table.field.taskItemLog.batch" /> <TextField source="spec" label="table.field.taskItemLog.spec" /> <TextField source="model" label="table.field.taskItemLog.model" /> - <TextField source="fieldsIndex" label="table.field.taskItemLog.fieldsIndex" /> - - <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> - <TextField source="nickname" /> - </ReferenceField> + <TextField source="updateBy$" label="common.field.updateBy" /> + <TextField source="createBy$" label="common.field.createBy" /> <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} /> diff --git a/rsf-admin/src/page/taskLog/TaskLogEdit.jsx b/rsf-admin/src/page/taskLog/TaskLogEdit.jsx index ec5c658..6c366fc 100644 --- a/rsf-admin/src/page/taskLog/TaskLogEdit.jsx +++ b/rsf-admin/src/page/taskLog/TaskLogEdit.jsx @@ -2,187 +2,122 @@ 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 { useWatch, useFormContext, useForm } 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 TaskItemLogList from "./TaskItemLogList"; const FormToolbar = () => { const { getValues } = useFormContext(); - return ( - <Toolbar sx={{ justifyContent: 'space-between' }}> + <Toolbar sx={{ justifyContent: 'end' }}> <SaveButton /> - <DeleteButton mutationMode="optimistic" /> + {/* <DeleteButton mutationMode="optimistic" /> */} </Toolbar> ) } -const TaskLogEdit = () => { +const TaskItemLog = () => { 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.taskLog.taskId" - source="taskId" - autoFocus - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskLog.taskCode" - source="taskCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskLog.taskStatus" - source="taskStatus" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskLog.taskType" - source="taskType" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskLog.orgLoc" - source="orgLoc" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskLog.orgSite" - source="orgSite" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskLog.targLoc" - source="targLoc" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskLog.targSite" - source="targSite" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskLog.barcode" - source="barcode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskLog.robotCode" - source="robotCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskLog.exceStatus" - source="exceStatus" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskLog.expDesc" - source="expDesc" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.taskLog.sort" - source="sort" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.taskLog.expCode" - source="expCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <DateInput - label="table.field.taskLog.startTime" - source="startTime" - /> - </Stack> - <Stack direction='row' gap={2}> - <DateInput - label="table.field.taskLog.endTime" - source="endTime" - /> - </Stack> - + <SimpleForm + shouldUnregister + warnWhenUnsavedChanges + toolbar={<FormToolbar />} + mode="onTouched" + defaultValues={{}} + > + <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> + <Grid item xs={24} md={16}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.main')} + </Typography> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.task.taskCode" + source="taskCode" + readOnly + parse={v => v} + autoFocus + /> + <TextInput + label="table.field.task.taskStatus" + readOnly + source="taskStatus$" + /> + <TextInput + label="table.field.task.taskType" + source="taskType$" + readOnly + /> + <TextInput + label="table.field.task.orgLoc" + source="orgLoc" + readOnly + parse={v => v} + /> + <TextInput + label="table.field.task.targLoc" + source="targLoc" + readOnly + parse={v => v} + /> + <TextInput + label="table.field.task.orgSite" + source="orgSite" + readOnly + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.task.targSite" + source="targSite" + readOnly + parse={v => v} + /> + <TextInput + label="table.field.task.barcode" + source="barcode" + readOnly + parse={v => v} + /> + <NumberInput + label="table.field.task.sort" + readOnly + source="sort" + /> + </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> + </SimpleForm> + </Edit > + <Card sx={{ marginTop: '1em', }}> + <Grid item xs={24} md={16} sx={{ margin: '1em' }}> + <Typography variant="h6" gutterBottom > + {translate('common.edit.title.common')} + </Typography> + <TaskItemLogList /> </Grid> - </SimpleForm> - </Edit > + </Card> + </> ) } -export default TaskLogEdit; +export default TaskItemLog; diff --git a/rsf-admin/src/page/taskLog/TaskLogList.jsx b/rsf-admin/src/page/taskLog/TaskLogList.jsx index 5ffad18..fd93f6e 100644 --- a/rsf-admin/src/page/taskLog/TaskLogList.jsx +++ b/rsf-admin/src/page/taskLog/TaskLogList.jsx @@ -54,7 +54,7 @@ '& .column-name': { }, '& .opt': { - width: 200 + width: 250 }, })); @@ -125,43 +125,31 @@ <StyledDatagrid preferenceKey='taskLog' bulkActionButtons={false} - rowClick={(id, resource, record) => false} - expand={() => <TaskLogPanel />} + rowClick={'edit'} + expand={false} expandSingle={true} omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'robotCode', 'exceStatus', 'sort', 'expCode']} > <NumberField source="id" /> - <NumberField source="taskId" label="table.field.taskLog.taskId" /> - <TextField source="taskCode" label="table.field.taskLog.taskCode" /> - <NumberField source="taskStatus" label="table.field.taskLog.taskStatus" /> - <NumberField source="taskType" label="table.field.taskLog.taskType" /> - <TextField source="orgLoc" label="table.field.taskLog.orgLoc" /> - <TextField source="orgSite" label="table.field.taskLog.orgSite" /> - <TextField source="targLoc" label="table.field.taskLog.targLoc" /> - <TextField source="targSite" label="table.field.taskLog.targSite" /> - <TextField source="barcode" label="table.field.taskLog.barcode" /> - <TextField source="robotCode" label="table.field.taskLog.robotCode" /> - <NumberField source="exceStatus" label="table.field.taskLog.exceStatus" /> - <TextField source="expDesc" label="table.field.taskLog.expDesc" /> - <NumberField source="sort" label="table.field.taskLog.sort" /> - <TextField source="expCode" label="table.field.taskLog.expCode" /> - <DateField source="startTime" label="table.field.taskLog.startTime" showTime /> - <DateField source="endTime" label="table.field.taskLog.endTime" showTime /> - - <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> - <TextField source="nickname" /> - </ReferenceField> + <TextField source="taskCode" label="table.field.task.taskCode" /> + <NumberField source="taskStatus$" label="table.field.task.taskStatus" /> + <NumberField source="taskType$" label="table.field.task.taskType" /> + <TextField source="orgLoc" label="table.field.task.orgLoc" /> + <TextField source="orgSite" label="table.field.task.orgSite" /> + <TextField source="targLoc" label="table.field.task.targLoc" /> + <TextField source="targSite" label="table.field.task.targSite" /> + <TextField source="barcode" label="table.field.task.barcode" /> + <TextField source="robotCode" label="table.field.task.robotCode" /> + <NumberField source="exceStatus" label="table.field.task.exceStatus" /> + <TextField source="expDesc" label="table.field.task.expDesc" /> + <NumberField source="sort" label="table.field.task.sort" /> + <TextField source="expCode" label="table.field.task.expCode" /> + <TextField source="updateBy$" label="common.field.updateBy" /> + <TextField source="createBy$" label="common.field.createBy" /> <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} /> + {/* <BooleanField source="statusBool" label="common.field.status" sortable={false} /> */} <TextField source="memo" label="common.field.memo" sortable={false} /> - <WrapperField cellClassName="opt" label="common.field.opt"> - <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} /> - <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> - </WrapperField> </StyledDatagrid> </List> {/* <TaskLogCreate diff --git a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx index 37aa8a0..21bc154 100644 --- a/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx +++ b/rsf-admin/src/page/warehouseAreasItem/WarehouseAreasItemList.jsx @@ -135,7 +135,7 @@ <NumberField source="matnrId" label="table.field.warehouseAreasItem.matnrId" /> <TextField source="matnrName" label="table.field.warehouseAreasItem.matnrName" /> <TextField source="matnrCode" label="table.field.warehouseAreasItem.matnrCode" /> - <TextField source="barcode" label="table.field.warehouseAreasItem.barcode" /> + <TextField source="trackCode" label="table.field.warehouseAreasItem.barcode" /> <NumberField source="anfme" label="table.field.warehouseAreasItem.anfme" /> <TextField source="batch" label="table.field.warehouseAreasItem.batch" /> <TextField source="unit" label="table.field.warehouseAreasItem.unit" /> 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 72da8c5..aaffe4f 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 @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -130,6 +131,16 @@ return mobileService.getDeltByCode(code); } + @PreAuthorize("hasAuthority('manager:asnOrderItem:list')") + @ApiOperation("鑾峰彇鎷栫洏鏄庣粏") + @PostMapping("/asnOrderItem/container") + public R getItemByContainer(@RequestBody Map<String, Object> params) { + if (Objects.isNull(params)) { + return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + return mobileService.getItemByContainer(params); + } + @PreAuthorize("hasAuthority('manager:waitPakin:update')") @ApiOperation("缁勬嫋") @PostMapping("/waitPakin/merge") @@ -193,11 +204,11 @@ } - @ApiOperation("蹇甫璐ㄦ") + @ApiOperation("蹇�熻川妫�") @PreAuthorize("hasAuthority('manager:qlyInspect:update')") @PostMapping("/inspect/check/update") - public R checkUpdate(@RequestBody QlyIsptItem params) { - if (Objects.isNull(params)) { + public R checkUpdate(@RequestBody List<QlyIsptItem> params) { + if (Objects.isNull(params) || params.isEmpty()) { return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒"); } return mobileService.checkUpdate(params); 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 a1c2e6f..b63ead2 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 @@ -48,7 +48,7 @@ R checkObjs(CheckObjParams params); - R checkUpdate(QlyIsptItem params); + R checkUpdate(List<QlyIsptItem> params); R operateToStock(OpStockParams params); @@ -59,4 +59,6 @@ R taskGetLocs(String code) throws Exception; R completeOrder(Long id, Long loginUserId); + + R getItemByContainer(Map<String, Object> params); } 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 92838b8..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 @@ -22,6 +22,7 @@ import com.vincent.rsf.server.manager.controller.params.WaitPakinParam; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.enums.AsnExceStatus; +import com.vincent.rsf.server.manager.enums.PakinIOStatus; import com.vincent.rsf.server.manager.mapper.*; import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.system.constant.CodeRes; @@ -34,8 +35,10 @@ import com.vincent.rsf.server.system.mapper.UserMapper; import com.vincent.rsf.server.system.service.FieldsItemService; import com.vincent.rsf.server.system.service.UserLoginService; +import com.vincent.rsf.server.system.service.UserService; import com.vincent.rsf.server.system.utils.ExtendFieldsUtils; import com.vincent.rsf.server.system.utils.SerialRuleUtils; +import net.sf.jsqlparser.statement.select.Wait; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -66,7 +69,7 @@ @Autowired private TenantMapper tenantService; @Autowired - private UserMapper userService; + private UserService userService; @Autowired private UserLoginService userLoginService; @Autowired @@ -147,7 +150,7 @@ if (user.getStatus() != 1) { return R.parse(CodeRes.USER_10002); } - if (!user.getPassword().equals(param.getPassword())) { + if (!userService.comparePassword(user.getPassword(), param.getPassword())) { return R.parse(CodeRes.USER_10003); } @@ -245,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) @@ -494,36 +497,36 @@ if (Objects.isNull(params.getIsptCode())) { throw new CoolException("璐ㄦ鍗曚笉鑳戒负绌�"); } - if (Objects.isNull(params.getMatnrCode())) { - throw new CoolException("鐗╂枡缂栫爜涓嶈兘涓虹┖锛�"); - } QlyInspect inspect = qlyInspectMapper.selectOne(new LambdaQueryWrapper<QlyInspect>().eq(QlyInspect::getCode, params.getIsptCode())); if (Objects.isNull(inspect)) { throw new CoolException("璐ㄦ鍗曟嵁涓嶅瓨鍦紒!"); } - QlyIsptItem isptItem = qlyIsptItemService.getOne(new LambdaQueryWrapper<QlyIsptItem>() - .eq(QlyIsptItem::getMatnrCode, params.getMatnrCode()) + List<QlyIsptItem> isptItems = qlyIsptItemService.list(new LambdaQueryWrapper<QlyIsptItem>() + .eq(StringUtils.isNotBlank(params.getMatnrCode()), QlyIsptItem::getMatnrCode, StringUtils.isNotBlank(params.getMatnrCode()) ? params.getMatnrCode() : null) .eq(QlyIsptItem::getIspectId, inspect.getId())); - if (Objects.isNull(isptItem)) { + if (Objects.isNull(isptItems)) { throw new CoolException("璐ㄦ鍗曟槑缁嗕笉瀛樺湪锛侊紒"); } - - CheckObjDto objDto = new CheckObjDto(); - objDto.setIsptCode(inspect.getCode()) - .setAsnCode(inspect.getAsnCode()) - .setId(isptItem.getId()) - .setMatnrCode(isptItem.getMatnrCode()) - .setMaktx(isptItem.getMaktx()) - .setDisQty(isptItem.getDisQty()) - .setDlyQty(isptItem.getDlyQty()) - .setRcptQty(isptItem.getRcptQty()) - .setIsptResult(isptItem.getIsptResult()) - .setSplrBatch(isptItem.getSplrBatch()) - .setSplrName(isptItem.getSplrName()) - .setPicPath(isptItem.getPicPath()) - .setMemo(isptItem.getMemo()) - .setSafeQty(isptItem.getSafeQty()); - return R.ok(objDto); + List<CheckObjDto> dtos = new ArrayList<>(); + isptItems.forEach(isptItem -> { + CheckObjDto objDto = new CheckObjDto(); + objDto.setIsptCode(inspect.getCode()) + .setAsnCode(inspect.getAsnCode()) + .setId(isptItem.getId()) + .setMatnrCode(isptItem.getMatnrCode()) + .setMaktx(isptItem.getMaktx()) + .setDisQty(isptItem.getDisQty()) + .setDlyQty(isptItem.getDlyQty()) + .setRcptQty(isptItem.getRcptQty()) + .setIsptResult(isptItem.getIsptResult()) + .setSplrBatch(isptItem.getSplrBatch()) + .setSplrName(isptItem.getSplrName()) + .setPicPath(isptItem.getPicPath()) + .setMemo(isptItem.getMemo()) + .setSafeQty(isptItem.getSafeQty()); + dtos.add(objDto); + }); + return R.ok(dtos); } /** @@ -532,14 +535,12 @@ * @return */ @Override - public R checkUpdate(QlyIsptItem params) { - if (Objects.isNull(params.getId())) { + public R checkUpdate(List<QlyIsptItem> params) { + if (Objects.isNull(params) || params.isEmpty()) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); } IsptItemsParams itemsParams = new IsptItemsParams(); - List<QlyIsptItem> items = new ArrayList<>(); - items.add(params); - itemsParams.setIsptItem(items).setType("0"); + itemsParams.setIsptItem(params).setType("0"); if (qlyIsptItemService.batchUpdate(itemsParams)) { return R.ok(); } else { @@ -729,6 +730,46 @@ } /** + * @author Ryan + * @description 閫氳繃瀹瑰櫒鑾峰彇缁勬嫋鐗╂枡 + * @param + * @return + * @time 2025/4/9 16:57 + */ + @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()) + .in(WaitPakin::getIoStatus, asList)); + if (Objects.isNull(waitPakin)) { + return R.ok(new ArrayList<>()); + } + List<WaitPakinItem> pakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>() + .eq(WaitPakinItem::getPakinId, waitPakin.getId())); + 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()); + } + } + } + return R.ok(warehouseAreasItems); + } + + /** * 鑾峰彇ReceiptDetlsDtos */ private R getAsnOrderItem(List<AsnOrderItem> items) { diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItemLog.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItemLog.java index 6522439..767d42d 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItemLog.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItemLog.java @@ -37,6 +37,8 @@ @TableId(value = "id", type = IdType.AUTO) private Long id; + @ApiModelProperty("涓诲崟ID") + private Long logId; @ApiModelProperty("Item ID") private Long asnItemId; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.java index 498f156..18dc247 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItemLog.java @@ -37,6 +37,9 @@ @TableId(value = "id", type = IdType.AUTO) private Long id; + @ApiModelProperty("涓诲崟ID") + private Long logId; + /** * 涓诲崟ID */ diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java index 22db504..606c1b7 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskLog.java @@ -1,8 +1,12 @@ package com.vincent.rsf.server.manager.entity; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.vincent.rsf.server.system.constant.DictTypeCode; +import com.vincent.rsf.server.system.entity.DictData; +import com.vincent.rsf.server.system.service.DictDataService; import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; @@ -230,6 +234,34 @@ // null // 澶囨敞 // ); + public String getTaskStatus$(){ + if (Cools.isEmpty(this.taskStatus)) { + return null; + } + DictDataService dictDataService = SpringUtils.getBean(DictDataService.class); + DictData dictDatas = dictDataService.getOne(new LambdaQueryWrapper<DictData>() + .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_TASK_STATUS) + .eq(DictData::getValue, this.taskStatus)); + if (Objects.isNull(dictDatas) || Objects.isNull(dictDatas.getLabel())) { + return null; + } + return dictDatas.getLabel(); + } + + public String getTaskType$() { + if (Cools.isEmpty(this.taskType)) { + return null; + } + DictDataService dictDataService = SpringUtils.getBean(DictDataService.class); + DictData dictDatas = dictDataService.getOne(new LambdaQueryWrapper<DictData>() + .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_TASK_TYPE) + .eq(DictData::getValue, this.taskType)); + if (Objects.isNull(dictDatas) || Objects.isNull(dictDatas.getLabel())) { + return null; + } + return dictDatas.getLabel(); + } + public String getStartTime$(){ if (Cools.isEmpty(this.startTime)){ return ""; 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/QlyInspectServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyInspectServiceImpl.java index e826e7f..e4330bc 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 @@ -106,8 +106,7 @@ public List<AsnOrder> getUnInspect(Map<String, Object> params) { List<AsnOrder> asnOrders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>() .eq(AsnOrder::getStatus, 1) - .eq(!Objects.isNull(params.get("asnCode")), AsnOrder::getCode, !Objects.isNull(params.get("asnCode")) ? params.get("asnCode").toString() : "") - .eq(AsnOrder::getNtyStatus, 0)); + .eq(!Objects.isNull(params.get("asnCode")) && StringUtils.isNotBlank(params.get("asnCode").toString()), AsnOrder::getCode, StringUtils.isNotBlank(params.get("asnCode").toString()) ? params.get("asnCode").toString() : null)); return asnOrders; } 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; } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/UserService.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/UserService.java index 1687006..9981a93 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/UserService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/UserService.java @@ -21,4 +21,5 @@ String encodePassword(String password); + User selectByUsernameWithoutTenant(String username, Long tenantId); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/UserServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/UserServiceImpl.java index a08797c..dea12b4 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/UserServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/service/impl/UserServiceImpl.java @@ -65,4 +65,9 @@ return password == null ? null : bCryptPasswordEncoder.encode(password); } + @Override + public User selectByUsernameWithoutTenant(String username, Long tenantId) { + return baseMapper.selectByUsernameWithoutTenant(username,tenantId); + } + } diff --git a/rsf-server/src/main/resources/application-dev.yml b/rsf-server/src/main/resources/application-dev.yml index 2fa0bcc..93d6e25 100644 --- a/rsf-server/src/main/resources/application-dev.yml +++ b/rsf-server/src/main/resources/application-dev.yml @@ -12,10 +12,10 @@ matching-strategy: ANT_PATH_MATCHER datasource: driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://47.76.147.249:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai -# username: root -# url: jdbc:mysql://192.168.4.24:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai - username: rsf +# url: jdbc:mysql://47.76.147.249:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai + username: root + url: jdbc:mysql://192.168.4.24:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai +# username: rsf password: 34821015 type: com.alibaba.druid.pool.DruidDataSource druid: -- Gitblit v1.9.1