Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop
| | |
| | | VITE_BASE_IP=127.0.0.1 |
| | | VITE_BASE_IP=192.168.4.24 |
| | | # VITE_BASE_IP=47.76.147.249 |
| | | VITE_BASE_PORT=8080 |
| | |
| | | |
| | | // create a record |
| | | create: async (resource, params) => { |
| | | console.log("create", resource, params); |
| | | const res = await request.post(resource + "/save", params?.data); |
| | | const { code, msg, data } = res.data; |
| | | if (code === 200) { |
| | |
| | | |
| | | // update a record based on a patch |
| | | update: async (resource, params) => { |
| | | console.log("update", resource, params); |
| | | const res = await request.post(resource + "/update", { |
| | | id: params.id, |
| | | ...params.data, |
| | |
| | | name: "物料名称", |
| | | code: "物料编码", |
| | | shipperId: "货主标识", |
| | | groupId: "分组标识", |
| | | groupId: "物料分组", |
| | | rglarId: "批次规则标识", |
| | | platCode: "ERP编码", |
| | | spec: "规格", |
| | |
| | | asnCode: "主单编码", |
| | | platItemId: "erp标识", |
| | | poDetlId: "PO单标识", |
| | | poCode: "PO单编码", |
| | | poDetlCode: "PO单编码", |
| | | fieldsIndex: "字段索引", |
| | | matnrId: "物料标识", |
| | | matnrCode: "物料编码", |
| | |
| | | import EmptyData from "../components/EmptyData"; |
| | | import MyCreateButton from "../components/MyCreateButton"; |
| | | import MyExportButton from '../components/MyExportButton'; |
| | | import BillStatusField from '../components/BillStatusField'; |
| | | import ConfirmButton from '../components/ConfirmButton'; |
| | | import PageDrawer from "../components/PageDrawer"; |
| | | import MyField from "../components/MyField"; |
| | | import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; |
| | |
| | | import FileDownloadIcon from '@mui/icons-material/FileDownload'; |
| | | import EditIcon from '@mui/icons-material/Edit'; |
| | | import TaskIcon from '@mui/icons-material/Task'; |
| | | import CloseIcon from '@mui/icons-material/Close'; |
| | | import request from '@/utils/request'; |
| | | |
| | | import DictionarySelect from "../components/DictionarySelect"; |
| | | |
| | | const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ |
| | | '& .css-1vooibu-MuiSvgIcon-root': { |
| | |
| | | '& .column-name': { |
| | | }, |
| | | '& .opt': { |
| | | width: 300 |
| | | width: 320 |
| | | }, |
| | | '& .status': { |
| | | width: 100 |
| | | }, |
| | | })); |
| | | |
| | |
| | | />, |
| | | |
| | | <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 |
| | | <DictionarySelect |
| | | label='common.field.status' |
| | | name="exceStatus" |
| | | dictTypeCode="sys_asn_exce_status" |
| | | />, |
| | | |
| | | ] |
| | | |
| | | const AsnOrderList = () => { |
| | |
| | | <TextField source="nickname" /> |
| | | </ReferenceField> |
| | | <DateField source="createTime" label="common.field.createTime" showTime /> |
| | | <TextField source="exceStatus$" label="common.field.status" /> |
| | | {/* <BooleanField source="statusBool" label="common.field.status" sortable={false} /> */} |
| | | <BillStatusField cellClassName="status" source="exceStatus" label="common.field.status" /> |
| | | <TextField source="memo" label="common.field.memo" sortable={false} /> |
| | | <WrapperField cellClassName="opt" label="common.field.opt" width={300} > |
| | | {/* <Button label="toolbar.print" onClick={print}> |
| | |
| | | </Button> */} |
| | | <InspectionButton /> |
| | | <CompleteButton /> |
| | | <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> |
| | | {/* <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> */} |
| | | <CloseButton /> |
| | | </WrapperField> |
| | | </StyledDatagrid> |
| | | </List> |
| | |
| | | |
| | | |
| | | return ( |
| | | <Button onClick={requestComplete} label={"toolbar.complete"} color="success"> |
| | | record.exceStatus === 1 && (record.anfme === record.qty ? <Button onClick={requestComplete} label={"toolbar.complete"} color="success"> |
| | | <TaskIcon /> |
| | | </Button> |
| | | </Button> : <ConfirmButton label={"toolbar.complete"} color="success" data={'当前收货数量小于计划数量,是否确认完成'} startIcon={<TaskIcon />} onConfirm={requestComplete} />) |
| | | |
| | | ) |
| | | |
| | | |
| | | } |
| | | |
| | | const CloseButton = () => { |
| | | const record = useRecordContext(); |
| | | const notify = useNotify(); |
| | | const refresh = useRefresh(); |
| | | const requestClose = async () => { |
| | | const { data: { code, data, msg } } = await request.post(`/asnOrder/close/${record.id}`); |
| | | |
| | | if (code === 200) { |
| | | notify(msg); |
| | | refresh() |
| | | } else { |
| | | notify(msg); |
| | | } |
| | | } |
| | | |
| | | return ( |
| | | (<Button onClick={requestClose} label={"toolbar.close"} color="error"> |
| | | <CloseIcon /> |
| | | </Button>) |
| | | ) |
| | | } |
| | |
| | | requestGetHead() |
| | | requestGetBody() |
| | | } |
| | | setDisabled(false) |
| | | }, [open]) |
| | | |
| | | const handleClose = (event, reason) => { |
| | |
| | | [name]: value |
| | | })); |
| | | }; |
| | | |
| | | const resetData = () => { |
| | | setFormData({ |
| | | type: '', |
| | | wkType: '', |
| | | }) |
| | | setTableData([]) |
| | | } |
| | | |
| | | const setFinally = () => { |
| | | const rows = tableRef.current.state.editRows; |
| | |
| | | setOpen(false); |
| | | refresh(); |
| | | billReload?.current() |
| | | resetData() |
| | | } else { |
| | | notify(res.data.msg); |
| | | } |
| | |
| | | setOpen(false); |
| | | refresh(); |
| | | billReload?.current() |
| | | |
| | | resetData() |
| | | } else { |
| | | notify(res.data.msg); |
| | | } |
| | |
| | | import debounce from 'lodash/debounce'; |
| | | import { DataGrid } from '@mui/x-data-grid'; |
| | | import PrintModal from './PrintModal'; |
| | | import { width } from "@mui/system"; |
| | | import PrintIcon from '@mui/icons-material/Print'; |
| | | const AsnOrderPanel = ({ billReload }) => { |
| | | const record = useRecordContext(); |
| | | if (!record) return null; |
| | |
| | | |
| | | |
| | | <DataGrid |
| | | sx={{ width: 'calc(100vw - 280px)' }} |
| | | size="small" |
| | | rows={rows} |
| | | columns={columns} |
| | |
| | | |
| | | return ( |
| | | <> |
| | | <Button size="small" variant="contained" color="secondary" onClick={modalChange}>{translate("toolbar.batchPrint")}</Button> |
| | | <Button size="small" color="secondary" onClick={modalChange} startIcon={<PrintIcon />}>{translate("toolbar.batchPrint")}</Button> |
| | | |
| | | <PrintModal |
| | | open={createDialog} |
| | |
| | | |
| | | return ( |
| | | <> |
| | | <Button size="small" variant="contained" color="secondary" onClick={() => setCreateDialog(true)}>{translate("toolbar.print")}</Button> |
| | | <Button size="small" color="secondary" onClick={() => setCreateDialog(true)} startIcon={<PrintIcon />}>{translate("toolbar.print")}</Button> |
| | | |
| | | <PrintModal |
| | | open={createDialog} |
| | |
| | | const MatnrEdit = () => { |
| | | const translate = useTranslate(); |
| | | const [value, setValue] = React.useState(0); |
| | | const form = useForm(); |
| | | |
| | | const notify = useNotify(); |
| | | const [dynamicFields, setDynamicFields] = useState([]); |
| | |
| | | {dynamicFields.map((item) => { |
| | | return ( |
| | | <Grid key={item.id} item xs={6} display="flex" gap={1}> |
| | | <TextInput |
| | | <DynamicFields |
| | | label={item.fieldsAlise} |
| | | source={item.fields} |
| | | validate={item.unique === 1 ? required() : false} |
| | |
| | | </Grid> |
| | | ) |
| | | })} |
| | | |
| | | |
| | | |
| | | </Grid> |
| | | |
| | |
| | | } |
| | | |
| | | export default MatnrEdit; |
| | | |
| | | const DynamicFields = (props) => { |
| | | const { ...parmas } = props; |
| | | const form = useFormContext(); |
| | | const field = `extendFields.${parmas.source}`; |
| | | const value = form.getValues(field); |
| | | value && form.setValue(parmas.source, value); |
| | | return ( |
| | | <TextInput |
| | | {...parmas} |
| | | /> |
| | | ) |
| | | } |
New file |
| | |
| | | import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; |
| | | import { |
| | | useRecordContext, |
| | | } from 'react-admin'; |
| | | import { Box, Typography, Card, Stack } from '@mui/material'; |
| | | import { useTheme } from '@mui/material/styles'; |
| | | import CircleIcon from '@mui/icons-material/Circle'; |
| | | |
| | | const BillStatusField = () => { |
| | | const record = useRecordContext(); |
| | | const theme = useTheme(); |
| | | const color = { |
| | | 0: '#BFBFBF', |
| | | 1: '#FFC53D', |
| | | 2: '#52C41A', |
| | | 3: '#595959', |
| | | 4: '#FF4D4F', |
| | | } |
| | | return ( |
| | | <Typography |
| | | variant="body2" |
| | | sx={{ display: 'flex', alignItems: 'center' }} |
| | | > |
| | | <CircleIcon sx={{ fontSize: 10, color: color[record.exceStatus || 0], marginRight: '3px' }} /> {record.exceStatus$} |
| | | </Typography > |
| | | ) |
| | | |
| | | } |
| | | |
| | | export default BillStatusField; |
| | |
| | | <DialogTitle>{translate('common.msg.confirm.tip')}</DialogTitle> |
| | | <DialogContent> |
| | | <DialogContentText> |
| | | {translate('common.msg.confirm.desc')} |
| | | {data ? data : translate('common.msg.confirm.desc')} |
| | | </DialogContentText> |
| | | </DialogContent> |
| | | <DialogActions> |
| | |
| | | const resource = useResourceContext(); |
| | | const translate = useTranslate(); |
| | | |
| | | |
| | | |
| | | return ( |
| | | <TopToolbar sx={{ |
| | | marginTop: 1, |
| | |
| | | required, |
| | | useRecordContext, |
| | | DeleteButton, |
| | | useNotify, |
| | | useRedirect, |
| | | } from 'react-admin'; |
| | | import { useWatch, useFormContext } from "react-hook-form"; |
| | | import { Stack, Grid, Box, Typography } from '@mui/material'; |
| | |
| | | import StatusSelectInput from "../../../components/StatusSelectInput"; |
| | | |
| | | const FormToolbar = () => { |
| | | const { getValues } = useFormContext(); |
| | | const form = useFormContext(); |
| | | const redirect = useRedirect(); |
| | | const notify = useNotify(); |
| | | const onSuccess = (data) => { |
| | | const { dictTypeId, dictTypeCode } = data |
| | | notify(`修改成功!`); |
| | | redirect(`/dictData?dictTypeId=${dictTypeId}&code=${dictTypeCode}`); |
| | | } |
| | | |
| | | return ( |
| | | <Toolbar sx={{ justifyContent: 'space-between' }}> |
| | | <SaveButton /> |
| | | <SaveButton type="button" mutationOptions={{ onSuccess }} /> |
| | | <DeleteButton mutationMode="optimistic" /> |
| | | </Toolbar> |
| | | ) |
| | |
| | | |
| | | const filters = [ |
| | | <SearchInput source="condition" alwaysOn />, |
| | | <DateInput label='common.time.after' source="timeStart" alwaysOn />, |
| | | <DateInput label='common.time.before' source="timeEnd" alwaysOn />, |
| | | |
| | | <TextInput source="dictTypeId" label="table.field.dictData.dictTypeId" />, |
| | | <TextInput source="dictTypeCode" label="table.field.dictData.dictTypeCode" />, |