verou
2025-04-08 e05481bd5cc560f3287ceb60f1f771329e27ae4d
feat:收货单新增完成和关闭
8个文件已修改
1个文件已添加
102 ■■■■ 已修改文件
rsf-admin/.env 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/config/MyDataProvider.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrder/AsnOrderList.jsx 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/BillStatusField.jsx 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/ConfirmButton.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/EditTopToolBar.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/dicts/dictData/DictDataEdit.jsx 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/dicts/dictData/DictDataList.jsx 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/.env
@@ -1,3 +1,3 @@
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
rsf-admin/src/config/MyDataProvider.js
@@ -60,7 +60,6 @@
  // 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) {
@@ -75,7 +74,6 @@
  // 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,
rsf-admin/src/page/asnOrder/AsnOrderList.jsx
@@ -41,6 +41,8 @@
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';
@@ -49,6 +51,7 @@
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';
@@ -62,7 +65,10 @@
  '& .column-name': {
  },
  '& .opt': {
    width: 300
    width: 320
  },
  '& .status': {
    width: 90
  },
}));
@@ -164,8 +170,7 @@
            <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}>
@@ -183,7 +188,8 @@
            </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>
@@ -301,8 +307,33 @@
  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>)
  )
}
rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
@@ -14,7 +14,7 @@
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;
@@ -196,7 +196,7 @@
    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}
@@ -218,7 +218,7 @@
    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}
rsf-admin/src/page/components/BillStatusField.jsx
New file
@@ -0,0 +1,30 @@
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;
rsf-admin/src/page/components/ConfirmButton.jsx
@@ -44,7 +44,7 @@
                <DialogTitle>{translate('common.msg.confirm.tip')}</DialogTitle>
                <DialogContent>
                    <DialogContentText>
                        {translate('common.msg.confirm.desc')}
                        {data ? data : translate('common.msg.confirm.desc')}
                    </DialogContentText>
                </DialogContent>
                <DialogActions>
rsf-admin/src/page/components/EditTopToolBar.jsx
@@ -9,7 +9,7 @@
    const resource = useResourceContext();
    const translate = useTranslate();
    return (
        <TopToolbar sx={{
            marginTop: 1,
rsf-admin/src/page/system/dicts/dictData/DictDataEdit.jsx
@@ -19,6 +19,8 @@
    required,
    useRecordContext,
    DeleteButton,
    useNotify,
    useRedirect,
} from 'react-admin';
import { useWatch, useFormContext } from "react-hook-form";
import { Stack, Grid, Box, Typography } from '@mui/material';
@@ -30,11 +32,18 @@
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>
    )
rsf-admin/src/page/system/dicts/dictData/DictDataList.jsx
@@ -62,8 +62,6 @@
const filters = [
    <SearchInput source="condition" alwaysOn />,
    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
    <TextInput source="dictTypeId" label="table.field.dictData.dictTypeId" />,
    <TextInput source="dictTypeCode" label="table.field.dictData.dictTypeCode" />,