Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop
 
	
	
	
	
	
	
	
	
	
	
	
	
	
 |  |  | 
 |  |  |         waitPakinItem: 'WaitPakinItem', | 
 |  |  |         task: 'Task', | 
 |  |  |         taskItem: 'TaskItem', | 
 |  |  |         taskItemLog: 'TaskItemLog', | 
 |  |  |         taskLog: 'TaskLog', | 
 |  |  |     }, | 
 |  |  |     table: { | 
 |  |  |         field: { | 
 |  |  | 
 |  |  |                 startTime: "startTime", | 
 |  |  |                 endTime: "endTime", | 
 |  |  |             }, | 
 |  |  |             taskLog: { | 
 |  |  |                 taskId: "taskId", | 
 |  |  |                 taskCode: "taskCode", | 
 |  |  |                 taskStatus: "taskStatus", | 
 |  |  |                 taskType: "taskType", | 
 |  |  |                 orgLoc: "orgLoc", | 
 |  |  |                 orgSite: "orgSite", | 
 |  |  |                 targLoc: "targLoc", | 
 |  |  |                 targSite: "targSite", | 
 |  |  |                 barcode: "barcode", | 
 |  |  |                 robotCode: "robotCode", | 
 |  |  |                 exceStatus: "exceStatus", | 
 |  |  |                 expDesc: "expDesc", | 
 |  |  |                 sort: "sort", | 
 |  |  |                 expCode: "expCode", | 
 |  |  |                 startTime: "startTime", | 
 |  |  |                 endTime: "endTime", | 
 |  |  |             }, | 
 |  |  |             taskItem: { | 
 |  |  |                 taskId: "taskId", | 
 |  |  |                 orderId: "orderId", | 
 |  |  | 
 |  |  |                 spec: "spec", | 
 |  |  |                 model: "model", | 
 |  |  |             }, | 
 |  |  |             taskItemLog: { | 
 |  |  |                 taskItemId: "taskItemId", | 
 |  |  |                 taskId: "taskId", | 
 |  |  |                 orderId: "orderId", | 
 |  |  |                 orderType: "orderType", | 
 |  |  |                 orderItemId: "orderItemId", | 
 |  |  |                 source: "source", | 
 |  |  |                 matnrId: "matnrId", | 
 |  |  |                 maktx: "maktx", | 
 |  |  |                 matnrCode: "matnrCode", | 
 |  |  |                 trackCode: "trackCode", | 
 |  |  |                 unit: "unit", | 
 |  |  |                 anfme: "anfme", | 
 |  |  |                 batch: "batch", | 
 |  |  |                 spec: "spec", | 
 |  |  |                 model: "model", | 
 |  |  |             }, | 
 |  |  |         } | 
 |  |  |     }, | 
 |  |  |     page: { | 
 
 |  |  | 
 |  |  |         waitPakinItemLog: '组拖历史档明细', | 
 |  |  |         task: '任务工作档', | 
 |  |  |         taskItem: '任务档明细', | 
 |  |  |         taskLog: '任务历史档', | 
 |  |  |         taskItemLog: '任务明细历史档', | 
 |  |  |     }, | 
 |  |  |     table: { | 
 |  |  |         field: { | 
 |  |  | 
 |  |  |                 startTime: "开始时间", | 
 |  |  |                 endTime: "结束时间", | 
 |  |  |             }, | 
 |  |  |             taskLog: { | 
 |  |  |                 taskId: "任务ID", | 
 |  |  |                 taskCode: "任务号", | 
 |  |  |                 taskStatus: "状态", | 
 |  |  |                 taskType: "类型", | 
 |  |  |                 orgLoc: "源库位", | 
 |  |  |                 orgSite: "源站点", | 
 |  |  |                 targLoc: "目标库位", | 
 |  |  |                 targSite: "目标站点", | 
 |  |  |                 barcode: "拖盘码", | 
 |  |  |                 robotCode: "机器编码", | 
 |  |  |                 exceStatus: "执行状态", | 
 |  |  |                 expDesc: "异常说明", | 
 |  |  |                 sort: "优先级", | 
 |  |  |                 expCode: "异常编码", | 
 |  |  |                 startTime: "开始时间", | 
 |  |  |                 endTime: "结束时间", | 
 |  |  |             }, | 
 |  |  |             taskItem: { | 
 |  |  |                 taskId: "taskId", | 
 |  |  |                 orderId: "订单ID", | 
 |  |  |                 orderType: "单据类型", | 
 |  |  |                 orderItemId: "订单明细ID", | 
 |  |  |                 sourceCode: "订单号", | 
 |  |  |                 source: "源ID", | 
 |  |  |                 matnrId: "物料ID", | 
 |  |  |                 maktx: "物料名称", | 
 |  |  |                 matnrCode: "物料编码", | 
 |  |  | 
 |  |  |                 spec: "规格", | 
 |  |  |                 model: "型号", | 
 |  |  |             }, | 
 |  |  |             taskItemLog: { | 
 |  |  |                 taskItemId: "taskItemId", | 
 |  |  |                 taskId: "taskId", | 
 |  |  |                 orderId: "订单ID", | 
 |  |  |                 orderType: "单据类型", | 
 |  |  |                 orderItemId: "订单明细ID", | 
 |  |  |                 source: "源ID", | 
 |  |  |                 matnrId: "物料ID", | 
 |  |  |                 maktx: "物料名称", | 
 |  |  |                 matnrCode: "物料编码", | 
 |  |  |                 trackCode: "跟踪码", | 
 |  |  |                 unit: "单位", | 
 |  |  |                 anfme: "数量", | 
 |  |  |                 batch: "批次", | 
 |  |  |                 spec: "规格", | 
 |  |  |                 model: "型号", | 
 |  |  |             }, | 
 |  |  |         } | 
 |  |  |     }, | 
 |  |  |     page: { | 
 
 |  |  | 
 |  |  | import asnOrderItemLog from './asnOrderItemLog'; | 
 |  |  | import task from './task'; | 
 |  |  | import taskItem from './taskItem'; | 
 |  |  | import taskLog from './taskLog'; | 
 |  |  | import taskItemLog from './taskItemLog'; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | const ResourceContent = (node) => { | 
 |  |  | 
 |  |  |             return task; | 
 |  |  |         case 'taskItem': | 
 |  |  |             return taskItem; | 
 |  |  |  | 
 |  |  |         case 'taskLog': | 
 |  |  |             return taskLog; | 
 |  |  |         case 'taskItemLog': | 
 |  |  |             return taskItemLog; | 
 |  |  |  | 
 |  |  |         default: | 
 |  |  |             return { | 
 
 |  |  | 
 |  |  |                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, | 
 |  |  |                 }} | 
 |  |  |                 title={"menu.taskItem"} | 
 |  |  |                 empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} | 
 |  |  |                 filters={filters} | 
 |  |  |                 sort={{ field: "create_time", order: "desc" }} | 
 |  |  |                 actions={( | 
 |  |  |                     <TopToolbar> | 
 |  |  |                         <FilterButton /> | 
 |  |  |                         <MyCreateButton onClick={() => { setCreateDialog(true) }} /> | 
 |  |  |                         {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */} | 
 |  |  |                         <SelectColumnsButton preferenceKey='taskItem' /> | 
 |  |  |                         <MyExportButton /> | 
 |  |  |                         {/* <MyExportButton /> */} | 
 |  |  |                     </TopToolbar> | 
 |  |  |                 )} | 
 |  |  |                 perPage={DEFAULT_PAGE_SIZE} | 
 |  |  |             > | 
 |  |  |                 <StyledDatagrid | 
 |  |  |                     preferenceKey='taskItem' | 
 |  |  |                     bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} | 
 |  |  |                     // bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} | 
 |  |  |                     rowClick={(id, resource, record) => false} | 
 |  |  |                     expand={() => <TaskItemPanel />} | 
 |  |  |                     // expand={() => <TaskItemPanel />} | 
 |  |  |                     expandSingle={true} | 
 |  |  |                     omit={['id', 'createTime', 'createBy', 'memo']} | 
 |  |  |                     omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']} | 
 |  |  |                 > | 
 |  |  |                     <NumberField source="id" /> | 
 |  |  |                     <NumberField source="taskId" label="table.field.taskItem.taskId" /> | 
 |  |  |                     <NumberField source="orderId" label="table.field.taskItem.orderId" /> | 
 |  |  |                     <NumberField source="orderType" label="table.field.taskItem.orderType" /> | 
 |  |  |                     <NumberField source="orderType$" label="table.field.taskItem.orderType" /> | 
 |  |  |                     <NumberField source="orderItemId" label="table.field.taskItem.orderItemId" /> | 
 |  |  |                     <NumberField source="matnrId" label="table.field.taskItem.matnrId" /> | 
 |  |  |                     <TextField source="maktx" label="table.field.taskItem.maktx" /> | 
 |  |  | 
 |  |  |                     <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> | 
 |  |  |             <TaskItemCreate | 
 |  |  |                 open={createDialog} | 
 |  |  |                 setOpen={setCreateDialog} | 
 |  |  |             /> | 
 |  |  |             <PageDrawer | 
 |  |  |                 title='TaskItem Detail' | 
 |  |  |                 drawerVal={drawerVal} | 
 
| New file | 
 |  |  | 
 |  |  | 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; | 
 
| New file | 
 |  |  | 
 |  |  | 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; | 
 
| New file | 
 |  |  | 
 |  |  | import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; | 
 |  |  | import { useNavigate } from 'react-router-dom'; | 
 |  |  | import { | 
 |  |  |     List, | 
 |  |  |     DatagridConfigurable, | 
 |  |  |     SearchInput, | 
 |  |  |     TopToolbar, | 
 |  |  |     SelectColumnsButton, | 
 |  |  |     EditButton, | 
 |  |  |     FilterButton, | 
 |  |  |     CreateButton, | 
 |  |  |     ExportButton, | 
 |  |  |     BulkDeleteButton, | 
 |  |  |     WrapperField, | 
 |  |  |     useRecordContext, | 
 |  |  |     useTranslate, | 
 |  |  |     useNotify, | 
 |  |  |     useListContext, | 
 |  |  |     FunctionField, | 
 |  |  |     TextField, | 
 |  |  |     NumberField, | 
 |  |  |     DateField, | 
 |  |  |     BooleanField, | 
 |  |  |     ReferenceField, | 
 |  |  |     TextInput, | 
 |  |  |     DateTimeInput, | 
 |  |  |     DateInput, | 
 |  |  |     SelectInput, | 
 |  |  |     NumberInput, | 
 |  |  |     ReferenceInput, | 
 |  |  |     ReferenceArrayInput, | 
 |  |  |     AutocompleteInput, | 
 |  |  |     DeleteButton, | 
 |  |  | } from 'react-admin'; | 
 |  |  | import { Box, Typography, Card, Stack } from '@mui/material'; | 
 |  |  | import { styled } from '@mui/material/styles'; | 
 |  |  | import 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': { | 
 |  |  |         height: '.9em' | 
 |  |  |     }, | 
 |  |  |     '& .RaDatagrid-row': { | 
 |  |  |         cursor: 'auto' | 
 |  |  |     }, | 
 |  |  |     '& .column-name': { | 
 |  |  |     }, | 
 |  |  |     '& .opt': { | 
 |  |  |         width: 200 | 
 |  |  |     }, | 
 |  |  | })); | 
 |  |  |  | 
 |  |  | const filters = [ | 
 |  |  |     <SearchInput source="condition" alwaysOn />, | 
 |  |  |     <DateInput label='common.time.after' source="timeStart" alwaysOn />, | 
 |  |  |     <DateInput label='common.time.before' source="timeEnd" alwaysOn />, | 
 |  |  |  | 
 |  |  |     <NumberInput source="taskItemId" label="table.field.taskItemLog.taskItemId" />, | 
 |  |  |     <NumberInput source="taskId" label="table.field.taskItemLog.taskId" />, | 
 |  |  |     <NumberInput source="orderId" label="table.field.taskItemLog.orderId" />, | 
 |  |  |     <TextInput source="orderType" label="table.field.taskItemLog.orderType" />, | 
 |  |  |     <NumberInput source="orderItemId" label="table.field.taskItemLog.orderItemId" />, | 
 |  |  |     <NumberInput source="source" label="table.field.taskItemLog.source" />, | 
 |  |  |     <NumberInput source="matnrId" label="table.field.taskItemLog.matnrId" />, | 
 |  |  |     <TextInput source="maktx" label="table.field.taskItemLog.maktx" />, | 
 |  |  |     <TextInput source="matnrCode" label="table.field.taskItemLog.matnrCode" />, | 
 |  |  |     <TextInput source="trackCode" label="table.field.taskItemLog.trackCode" />, | 
 |  |  |     <TextInput source="unit" label="table.field.taskItemLog.unit" />, | 
 |  |  |     <NumberInput source="anfme" label="table.field.taskItemLog.anfme" />, | 
 |  |  |     <TextInput source="batch" label="table.field.taskItemLog.batch" />, | 
 |  |  |     <TextInput source="spec" label="table.field.taskItemLog.spec" />, | 
 |  |  |     <TextInput source="model" label="table.field.taskItemLog.model" />, | 
 |  |  |     <TextInput source="fieldsIndex" label="table.field.taskItemLog.fieldsIndex" />, | 
 |  |  |  | 
 |  |  |     <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 TaskItemLogList = () => { | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |  | 
 |  |  |     const [createDialog, setCreateDialog] = useState(false); | 
 |  |  |     const [drawerVal, setDrawerVal] = useState(false); | 
 |  |  |  | 
 |  |  |     return ( | 
 |  |  |         <Box display="flex"> | 
 |  |  |             <List | 
 |  |  |                 sx={{ | 
 |  |  |                     flexGrow: 1, | 
 |  |  |                     transition: (theme) => | 
 |  |  |                         theme.transitions.create(['all'], { | 
 |  |  |                             duration: theme.transitions.duration.enteringScreen, | 
 |  |  |                         }), | 
 |  |  |                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, | 
 |  |  |                 }} | 
 |  |  |                 title={"menu.taskItemLog"} | 
 |  |  |                 filters={filters} | 
 |  |  |                 sort={{ field: "create_time", order: "desc" }} | 
 |  |  |                 actions={( | 
 |  |  |                     <TopToolbar> | 
 |  |  |                         <FilterButton /> | 
 |  |  |                         <SelectColumnsButton preferenceKey='taskItemLog' /> | 
 |  |  |                         <MyExportButton /> | 
 |  |  |                     </TopToolbar> | 
 |  |  |                 )} | 
 |  |  |                 perPage={DEFAULT_PAGE_SIZE} | 
 |  |  |             > | 
 |  |  |                 <StyledDatagrid | 
 |  |  |                     preferenceKey='taskItemLog' | 
 |  |  |                     bulkActionButtons={false} | 
 |  |  |                     rowClick={(id, resource, record) => false} | 
 |  |  |                     expandSingle={true} | 
 |  |  |                     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" /> | 
 |  |  |                     <NumberField source="orderItemId" label="table.field.taskItemLog.orderItemId" /> | 
 |  |  |                     <NumberField source="source" label="table.field.taskItemLog.source" /> | 
 |  |  |                     <NumberField source="matnrId" label="table.field.taskItemLog.matnrId" /> | 
 |  |  |                     <TextField source="maktx" label="table.field.taskItemLog.maktx" /> | 
 |  |  |                     <TextField source="matnrCode" label="table.field.taskItemLog.matnrCode" /> | 
 |  |  |                     <TextField source="trackCode" label="table.field.taskItemLog.trackCode" /> | 
 |  |  |                     <TextField source="unit" label="table.field.taskItemLog.unit" /> | 
 |  |  |                     <NumberField source="anfme" label="table.field.taskItemLog.anfme" /> | 
 |  |  |                     <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> | 
 |  |  |                     <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} /> | 
 |  |  |                 </StyledDatagrid> | 
 |  |  |             </List> | 
 |  |  |             <PageDrawer | 
 |  |  |                 title='TaskItemLog Detail' | 
 |  |  |                 drawerVal={drawerVal} | 
 |  |  |                 setDrawerVal={setDrawerVal} | 
 |  |  |             > | 
 |  |  |             </PageDrawer> | 
 |  |  |         </Box> | 
 |  |  |     ) | 
 |  |  | } | 
 |  |  |  | 
 |  |  | export default TaskItemLogList; | 
 
| New file | 
 |  |  | 
 |  |  | 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; | 
 
| New file | 
 |  |  | 
 |  |  | 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}` | 
 |  |  |     } | 
 |  |  | }; | 
 
| New file | 
 |  |  | 
 |  |  | 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 TaskLogCreate = (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.taskLog.taskId" | 
 |  |  |                                         source="taskId" | 
 |  |  |                                         autoFocus | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <TextInput | 
 |  |  |                                         label="table.field.taskLog.taskCode" | 
 |  |  |                                         source="taskCode" | 
 |  |  |                                         parse={v => v} | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <NumberInput | 
 |  |  |                                         label="table.field.taskLog.taskStatus" | 
 |  |  |                                         source="taskStatus" | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <NumberInput | 
 |  |  |                                         label="table.field.taskLog.taskType" | 
 |  |  |                                         source="taskType" | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <TextInput | 
 |  |  |                                         label="table.field.taskLog.orgLoc" | 
 |  |  |                                         source="orgLoc" | 
 |  |  |                                         parse={v => v} | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <TextInput | 
 |  |  |                                         label="table.field.taskLog.orgSite" | 
 |  |  |                                         source="orgSite" | 
 |  |  |                                         parse={v => v} | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <TextInput | 
 |  |  |                                         label="table.field.taskLog.targLoc" | 
 |  |  |                                         source="targLoc" | 
 |  |  |                                         parse={v => v} | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <TextInput | 
 |  |  |                                         label="table.field.taskLog.targSite" | 
 |  |  |                                         source="targSite" | 
 |  |  |                                         parse={v => v} | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <TextInput | 
 |  |  |                                         label="table.field.taskLog.barcode" | 
 |  |  |                                         source="barcode" | 
 |  |  |                                         parse={v => v} | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <TextInput | 
 |  |  |                                         label="table.field.taskLog.robotCode" | 
 |  |  |                                         source="robotCode" | 
 |  |  |                                         parse={v => v} | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <NumberInput | 
 |  |  |                                         label="table.field.taskLog.exceStatus" | 
 |  |  |                                         source="exceStatus" | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <TextInput | 
 |  |  |                                         label="table.field.taskLog.expDesc" | 
 |  |  |                                         source="expDesc" | 
 |  |  |                                         parse={v => v} | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <NumberInput | 
 |  |  |                                         label="table.field.taskLog.sort" | 
 |  |  |                                         source="sort" | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <TextInput | 
 |  |  |                                         label="table.field.taskLog.expCode" | 
 |  |  |                                         source="expCode" | 
 |  |  |                                         parse={v => v} | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <DateInput | 
 |  |  |                                         label="table.field.taskLog.startTime" | 
 |  |  |                                         source="startTime" | 
 |  |  |                                     /> | 
 |  |  |                                 </Grid> | 
 |  |  |                                 <Grid item xs={6} display="flex" gap={1}> | 
 |  |  |                                     <DateInput | 
 |  |  |                                         label="table.field.taskLog.endTime" | 
 |  |  |                                         source="endTime" | 
 |  |  |                                     /> | 
 |  |  |                                 </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 TaskLogCreate; | 
 
| New file | 
 |  |  | 
 |  |  | 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 TaskLogEdit = () => { | 
 |  |  |     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.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> | 
 |  |  |  | 
 |  |  |                     </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 TaskLogEdit; | 
 
| New file | 
 |  |  | 
 |  |  | import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; | 
 |  |  | import { useNavigate } from 'react-router-dom'; | 
 |  |  | import { | 
 |  |  |     List, | 
 |  |  |     DatagridConfigurable, | 
 |  |  |     SearchInput, | 
 |  |  |     TopToolbar, | 
 |  |  |     SelectColumnsButton, | 
 |  |  |     EditButton, | 
 |  |  |     FilterButton, | 
 |  |  |     CreateButton, | 
 |  |  |     ExportButton, | 
 |  |  |     BulkDeleteButton, | 
 |  |  |     WrapperField, | 
 |  |  |     useRecordContext, | 
 |  |  |     useTranslate, | 
 |  |  |     useNotify, | 
 |  |  |     useListContext, | 
 |  |  |     FunctionField, | 
 |  |  |     TextField, | 
 |  |  |     NumberField, | 
 |  |  |     DateField, | 
 |  |  |     BooleanField, | 
 |  |  |     ReferenceField, | 
 |  |  |     TextInput, | 
 |  |  |     DateTimeInput, | 
 |  |  |     DateInput, | 
 |  |  |     SelectInput, | 
 |  |  |     NumberInput, | 
 |  |  |     ReferenceInput, | 
 |  |  |     ReferenceArrayInput, | 
 |  |  |     AutocompleteInput, | 
 |  |  |     DeleteButton, | 
 |  |  | } from 'react-admin'; | 
 |  |  | import { Box, Typography, Card, Stack } from '@mui/material'; | 
 |  |  | import { styled } from '@mui/material/styles'; | 
 |  |  | import TaskLogCreate from "./TaskLogCreate"; | 
 |  |  | import TaskLogPanel from "./TaskLogPanel"; | 
 |  |  | import EmptyData from "../components/EmptyData"; | 
 |  |  | import MyCreateButton from "../components/MyCreateButton"; | 
 |  |  | import MyExportButton from '../components/MyExportButton'; | 
 |  |  | import PageDrawer from "../components/PageDrawer"; | 
 |  |  | import MyField from "../components/MyField"; | 
 |  |  | import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; | 
 |  |  | import * as Common from '@/utils/common'; | 
 |  |  |  | 
 |  |  | const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ | 
 |  |  |     '& .css-1vooibu-MuiSvgIcon-root': { | 
 |  |  |         height: '.9em' | 
 |  |  |     }, | 
 |  |  |     '& .RaDatagrid-row': { | 
 |  |  |         cursor: 'auto' | 
 |  |  |     }, | 
 |  |  |     '& .column-name': { | 
 |  |  |     }, | 
 |  |  |     '& .opt': { | 
 |  |  |         width: 200 | 
 |  |  |     }, | 
 |  |  | })); | 
 |  |  |  | 
 |  |  | const filters = [ | 
 |  |  |     <SearchInput source="condition" alwaysOn />, | 
 |  |  |     <DateInput label='common.time.after' source="timeStart" alwaysOn />, | 
 |  |  |     <DateInput label='common.time.before' source="timeEnd" alwaysOn />, | 
 |  |  |  | 
 |  |  |     <NumberInput source="taskId" label="table.field.taskLog.taskId" />, | 
 |  |  |     <TextInput source="taskCode" label="table.field.taskLog.taskCode" />, | 
 |  |  |     <NumberInput source="taskStatus" label="table.field.taskLog.taskStatus" />, | 
 |  |  |     <NumberInput source="taskType" label="table.field.taskLog.taskType" />, | 
 |  |  |     <TextInput source="orgLoc" label="table.field.taskLog.orgLoc" />, | 
 |  |  |     <TextInput source="orgSite" label="table.field.taskLog.orgSite" />, | 
 |  |  |     <TextInput source="targLoc" label="table.field.taskLog.targLoc" />, | 
 |  |  |     <TextInput source="targSite" label="table.field.taskLog.targSite" />, | 
 |  |  |     <TextInput source="barcode" label="table.field.taskLog.barcode" />, | 
 |  |  |     <TextInput source="robotCode" label="table.field.taskLog.robotCode" />, | 
 |  |  |     <NumberInput source="exceStatus" label="table.field.taskLog.exceStatus" />, | 
 |  |  |     <TextInput source="expDesc" label="table.field.taskLog.expDesc" />, | 
 |  |  |     <NumberInput source="sort" label="table.field.taskLog.sort" />, | 
 |  |  |     <TextInput source="expCode" label="table.field.taskLog.expCode" />, | 
 |  |  |     <DateInput source="startTime" label="table.field.taskLog.startTime" />, | 
 |  |  |     <DateInput source="endTime" label="table.field.taskLog.endTime" />, | 
 |  |  |  | 
 |  |  |     <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 TaskLogList = () => { | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |  | 
 |  |  |     const [createDialog, setCreateDialog] = useState(false); | 
 |  |  |     const [drawerVal, setDrawerVal] = useState(false); | 
 |  |  |  | 
 |  |  |     return ( | 
 |  |  |         <Box display="flex"> | 
 |  |  |             <List | 
 |  |  |                 sx={{ | 
 |  |  |                     flexGrow: 1, | 
 |  |  |                     transition: (theme) => | 
 |  |  |                         theme.transitions.create(['all'], { | 
 |  |  |                             duration: theme.transitions.duration.enteringScreen, | 
 |  |  |                         }), | 
 |  |  |                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, | 
 |  |  |                 }} | 
 |  |  |                 title={"menu.taskLog"} | 
 |  |  |                 empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} | 
 |  |  |                 filters={filters} | 
 |  |  |                 sort={{ field: "create_time", order: "desc" }} | 
 |  |  |                 actions={( | 
 |  |  |                     <TopToolbar> | 
 |  |  |                         <FilterButton /> | 
 |  |  |                         <SelectColumnsButton preferenceKey='taskLog' /> | 
 |  |  |                         <MyExportButton /> | 
 |  |  |                     </TopToolbar> | 
 |  |  |                 )} | 
 |  |  |                 perPage={DEFAULT_PAGE_SIZE} | 
 |  |  |             > | 
 |  |  |                 <StyledDatagrid | 
 |  |  |                     preferenceKey='taskLog' | 
 |  |  |                     bulkActionButtons={false} | 
 |  |  |                     rowClick={(id, resource, record) => false} | 
 |  |  |                     expand={() => <TaskLogPanel />} | 
 |  |  |                     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> | 
 |  |  |                     <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> | 
 |  |  |             {/* <TaskLogCreate | 
 |  |  |                 open={createDialog} | 
 |  |  |                 setOpen={setCreateDialog} | 
 |  |  |             /> */} | 
 |  |  |             <PageDrawer | 
 |  |  |                 title='TaskLog Detail' | 
 |  |  |                 drawerVal={drawerVal} | 
 |  |  |                 setDrawerVal={setDrawerVal} | 
 |  |  |             > | 
 |  |  |             </PageDrawer> | 
 |  |  |         </Box> | 
 |  |  |     ) | 
 |  |  | } | 
 |  |  |  | 
 |  |  | export default TaskLogList; | 
 
| New file | 
 |  |  | 
 |  |  | 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 TaskLogPanel = () => { | 
 |  |  |     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.taskLog.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.taskLog.taskId"  | 
 |  |  |                                 property={record.taskId} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.taskCode"  | 
 |  |  |                                 property={record.taskCode} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.taskStatus"  | 
 |  |  |                                 property={record.taskStatus} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.taskType"  | 
 |  |  |                                 property={record.taskType} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.orgLoc"  | 
 |  |  |                                 property={record.orgLoc} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.orgSite"  | 
 |  |  |                                 property={record.orgSite} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.targLoc"  | 
 |  |  |                                 property={record.targLoc} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.targSite"  | 
 |  |  |                                 property={record.targSite} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.barcode"  | 
 |  |  |                                 property={record.barcode} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.robotCode"  | 
 |  |  |                                 property={record.robotCode} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.exceStatus"  | 
 |  |  |                                 property={record.exceStatus} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.expDesc"  | 
 |  |  |                                 property={record.expDesc} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.sort"  | 
 |  |  |                                 property={record.sort} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.expCode"  | 
 |  |  |                                 property={record.expCode} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.startTime"  | 
 |  |  |                                 property={record.startTime$} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |                         <Grid item xs={6}> | 
 |  |  |                             <PanelTypography | 
 |  |  |                                 title="table.field.taskLog.endTime"  | 
 |  |  |                                 property={record.endTime$} | 
 |  |  |                             /> | 
 |  |  |                         </Grid> | 
 |  |  |  | 
 |  |  |                     </Grid> | 
 |  |  |                 </CardContent> | 
 |  |  |             </Card > | 
 |  |  |         </> | 
 |  |  |     ); | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | export default TaskLogPanel; | 
 
| New file | 
 |  |  | 
 |  |  | import React, { useState, useRef, useEffect, useMemo } from "react"; | 
 |  |  | import { | 
 |  |  |     ListGuesser, | 
 |  |  |     EditGuesser, | 
 |  |  |     ShowGuesser, | 
 |  |  | } from "react-admin"; | 
 |  |  |  | 
 |  |  | import TaskLogList from "./TaskLogList"; | 
 |  |  | import TaskLogEdit from "./TaskLogEdit"; | 
 |  |  |  | 
 |  |  | export default { | 
 |  |  |     list: TaskLogList, | 
 |  |  |     edit: TaskLogEdit, | 
 |  |  |     show: ShowGuesser, | 
 |  |  |     recordRepresentation: (record) => { | 
 |  |  |         return `${record.id}` | 
 |  |  |     } | 
 |  |  | }; | 
 
 |  |  | 
 |  |  | public enum OrderType { | 
 |  |  |     //订单类型 | 
 |  |  |     ORDER_PURCHASE_IN("purchase", "采购入库单"), | 
 |  |  |     ORDER_OUT("out", "采购出库单"), | 
 |  |  |     ORDER_RECEIPT("receipt", "收货") | 
 |  |  |     ORDER_OUT("out", "出库单"), | 
 |  |  |     ORDER_IN("in", "入库单"), | 
 |  |  |     ORDER_RECEIPT("receipt", "收货单") | 
 |  |  |  | 
 |  |  |     ; | 
 |  |  |  | 
 
 |  |  | 
 |  |  | //        generator.username="sa"; | 
 |  |  | //        generator.password="Zoneyung@zy56$"; | 
 |  |  |  | 
 |  |  |         generator.table="man_ispt_histories"; | 
 |  |  |         generator.table="man_task_item_log"; | 
 |  |  |         generator.tableDesc="任务工作档"; | 
 |  |  |         generator.packagePath="com.vincent.rsf.server.manager"; | 
 |  |  |  | 
 
 |  |  | 
 |  |  | import java.text.SimpleDateFormat; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | 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; | 
 |  |  | 
 |  |  | import com.vincent.rsf.server.system.entity.User; | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.Objects; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | @Accessors(chain = true) | 
 |  |  | 
 |  |  | //            null    // 备注 | 
 |  |  | //    ); | 
 |  |  |  | 
 |  |  |     public String getOrderType$(){ | 
 |  |  |         if (null == this.orderType) {return  null;} | 
 |  |  |         DictDataService dictDataService = SpringUtils.getBean(DictDataService.class); | 
 |  |  |         DictData dictDatas = dictDataService.getOne(new LambdaQueryWrapper<DictData>() | 
 |  |  |                 .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_ORDER_TYPE) | 
 |  |  |                 .eq(DictData::getValue, this.orderType)); | 
 |  |  |         if (Objects.isNull(dictDatas) || Objects.isNull(dictDatas.getLabel())) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         return dictDatas.getLabel(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getStatus$(){ | 
 |  |  |         if (null == this.status){ return null; } | 
 |  |  |         switch (this.status){ | 
 
 |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableLogic; | 
 |  |  | import java.text.SimpleDateFormat; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | import lombok.experimental.Accessors; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  | import java.text.SimpleDateFormat; | 
 |  |  | import java.util.Date; | 
 |  |  | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | @Accessors(chain = true) | 
 |  |  | @TableName("man_task_item_log") | 
 |  |  | public class TaskItemLog implements Serializable { | 
 |  |  |  | 
 
 |  |  | 
 |  |  |  | 
 |  |  | import java.text.SimpleDateFormat; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | import lombok.experimental.Accessors; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  | import java.text.SimpleDateFormat; | 
 |  |  | import java.util.Date; | 
 |  |  | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | @Accessors(chain = true) | 
 |  |  | @TableName("man_task_log") | 
 |  |  | public class TaskLog implements Serializable { | 
 |  |  |  | 
 
 |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private TaskItemService taskItemService; | 
 |  |  |     @Autowired | 
 |  |  |     private TaskLogService taskLogService; | 
 |  |  |     @Autowired | 
 |  |  |     private TaskItemLogService taskItemLogService; | 
 |  |  |     @Autowired | 
 |  |  |     private StockItemService stockItemService; | 
 |  |  |     @Autowired | 
 |  |  |     private PurchaseService purchaseService; | 
 |  |  | 
 |  |  |         } | 
 |  |  |         taskService.completeTask(tasks); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |     * @author Ryan | 
 |  |  |     * @description 已完成任务加入历史档 | 
 |  |  |     * @param | 
 |  |  |     * @return | 
 |  |  |     * @time 2025/4/3 12:54 | 
 |  |  |     */ | 
 |  |  |     @Scheduled(cron = "0 0/05 * * * ?  ") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public void taskLogUpdate() { | 
 |  |  |         List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.UPDATED_IN.id)); | 
 |  |  |         if (tasks.isEmpty()) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         List<Long> list = tasks.stream().map(Task::getId).collect(Collectors.toList()); | 
 |  |  |         List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().in(TaskItem::getTaskId, list)); | 
 |  |  |         if (taskItems.isEmpty()) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         List<TaskLog> taskLogs = new ArrayList<>(); | 
 |  |  |         tasks.forEach(task -> { | 
 |  |  |             TaskLog taskLog = new TaskLog(); | 
 |  |  |             BeanUtils.copyProperties(task, taskLog); | 
 |  |  |             taskLog.setTaskId(task.getId()).setId(null); | 
 |  |  |             taskLogs.add(taskLog); | 
 |  |  |         }); | 
 |  |  |         if (!taskLogService.saveBatch(taskLogs)) { | 
 |  |  |             throw new CoolException("任务历史档保存失败!!"); | 
 |  |  |         } | 
 |  |  |         List<TaskItemLog >itemLogs = new ArrayList<>(); | 
 |  |  |         taskItems.forEach(item -> { | 
 |  |  |             TaskItemLog itemLog = new TaskItemLog(); | 
 |  |  |             BeanUtils.copyProperties(item, itemLog); | 
 |  |  |             itemLog.setId(null).setTaskItemId(item.getId()); | 
 |  |  |             itemLogs.add(itemLog); | 
 |  |  |         }); | 
 |  |  |         if (!taskItemLogService.saveBatch(itemLogs)) { | 
 |  |  |             throw new CoolException("任务明细历史档保存失败!!"); | 
 |  |  |         } | 
 |  |  |         if (!taskService.removeByIds(list)) { | 
 |  |  |             throw new CoolException("原始任务删除失败!!"); | 
 |  |  |         } | 
 |  |  |         List<Long> itemIds = taskItems.stream().map(TaskItem::getId).collect(Collectors.toList()); | 
 |  |  |  | 
 |  |  |         if (!taskItemService.removeByIds(itemIds)) { | 
 |  |  |             throw new CoolException("原始任务明细删除失败!!"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  |         if (!locService.update(new LambdaUpdateWrapper<Loc>().set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).in(Loc::getCode, locCodes))) { | 
 |  |  |             throw new CoolException("库位状态修改失败!!"); | 
 |  |  |         } | 
 |  |  |         if (!this.update(new LambdaUpdateWrapper<Task>().set(Task::getTaskStatus, TaskStsType.UPDATED_IN.id))) { | 
 |  |  |             throw new CoolException("任务状态修改失败!!"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } |