skyouc
2025-03-13 d20c04c88f55e1581bb2054d99483aba95f04fee
Merge branch 'front' into devlop
29个文件已修改
2185 ■■■■■ 已修改文件
rsf-admin/src/config/MyDataProvider.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/core/chineseMessages.js 412 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/ResourceContent.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrder/AsnOrderCreate.jsx 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrder/AsnOrderEdit.jsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrder/AsnOrderList.jsx 317 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrderItem/AsnOrderItemCreate.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrderItem/AsnOrderItemList.jsx 321 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/ImportModal.jsx 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/MyCreateButton.jsx 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/MyExportButton.jsx 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/purchase/PurchaseCreate.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/purchase/PurchaseEdit.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/purchase/PurchaseList.jsx 296 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/purchaseItem/PurchaseItemCreate.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx 298 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/qlyInspect/QlyInspectCreate.jsx 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/qlyInspect/QlyInspectEdit.jsx 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/qlyInspect/QlyInspectList.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/dicts/dictData/DictDataCreate.jsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/dicts/dictData/DictDataEdit.jsx 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/dicts/dictData/DictDataList.jsx 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/dicts/dictType/DictTypeCreate.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/operationRecord/OperationRecordList.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/serialRule/SerialRuleDetail.jsx 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/config/MyDataProvider.js
@@ -135,7 +135,6 @@
  // export excel from all data
  export: async (resource, params) => {
    console.log("export", resource, params);
    const _params = Common.integrateParams(params);
    try {
      const res = await request.post(`${resource}/export`, _params, {
rsf-admin/src/i18n/core/chineseMessages.js
@@ -1,213 +1,205 @@
const chineseMessages = {
    ra: {
        action: {
            add_filter: '过滤条件',
            add: '添加',
            back: '返回',
            bulk_actions: '1 item selected |||| %{smart_count} items selected',
            cancel: '取消',
            clear_array_input: '情空列表',
            clear_input_value: '清空',
            clone: '克隆',
            confirm: '确定',
            create: '添加',
            create_item: '添加 %{item}',
            delete: '删除',
            edit: '编辑',
            export: '导出',
            list: '列表',
            refresh: '刷新',
            remove_filter: 'Remove this filter',
            remove_all_filters: '移除所有',
            remove: '移除',
            save: '保存',
            search: '搜索',
            select_all: '全部选中',
            select_row: '选中一行',
            show: '显示',
            sort: '排序',
            undo: '撤销',
            unselect: '取消选择',
            expand: '展开',
            close: '关闭',
            open_menu: 'Open menu',
            close_menu: 'Close menu',
            update: '修改',
            move_up: 'Move up',
            move_down: 'Move down',
            open: 'Open',
            toggle_theme: 'Toggle light/dark mode',
            select_columns: '筛选列',
            update_application: 'Reload Application',
        },
        boolean: {
            true: '是',
            false: '否',
            null: ' ',
        },
        page: {
            create: 'Create %{name}',
            dashboard: 'Dashboard',
            edit: '%{name} %{recordRepresentation}',
            error: 'Something went wrong',
            list: '%{name}',
            loading: 'Loading',
            not_found: 'Not Found',
            show: '%{name} %{recordRepresentation}',
            empty: 'No %{name} yet.',
            invite: 'Do you want to add one?',
        },
        input: {
            file: {
                upload_several:
                    '拖放一些要上传的文件,或单击以选择一个',
                upload_single: '拖放要上传的文件,或单击以选择它',
            },
            image: {
                upload_several:
                    'Drop some pictures to upload, or click to select one.',
                upload_single:
                    'Drop a picture to upload, or click to select it.',
            },
            references: {
                all_missing: 'Unable to find references data.',
                many_missing:
                    'At least one of the associated references no longer appears to be available.',
                single_missing:
                    'Associated reference no longer appears to be available.',
            },
            password: {
                toggle_visible: 'Hide password',
                toggle_hidden: 'Show password',
            },
        },
        message: {
            about: 'About',
            are_you_sure: 'Are you sure?',
            auth_error:
                'An error occurred while validating the authentication token.',
            bulk_delete_content:
                'Are you sure you want to delete this %{name}? |||| Are you sure you want to delete these %{smart_count} items?',
            bulk_delete_title:
                '删除 %{name} |||| 删除 %{smart_count} %{name}',
            bulk_update_content:
                'Are you sure you want to update this %{name}? |||| Are you sure you want to update these %{smart_count} items?',
            bulk_update_title:
                '修改 %{name} |||| 修改 %{smart_count} %{name}',
            clear_array_input: 'Are you sure you want to clear the whole list?',
            delete_content: '您确实要删除此项吗?',
            delete_title: '删除 %{name} #%{id}',
            details: 'Details',
            error: "A client error occurred and your request couldn't be completed.",
            invalid_form: '表单无效 请检查是否有错误!',
            loading: 'Please wait',
            no: 'No',
            not_found:
                'Either you typed a wrong URL, or you followed a bad link.',
            yes: 'Yes',
            unsaved_changes:
                "Some of your changes weren't saved. Are you sure you want to ignore them?",
        },
        navigation: {
            no_results: '没有找到数据',
            no_more_results:
                'The page number %{page} is out of boundaries. Try the previous page.',
            page_out_of_boundaries: 'Page number %{page} out of boundaries',
            page_out_from_end: 'Cannot go after last page',
            page_out_from_begin: 'Cannot go before page 1',
            page_range_info: '%{offsetBegin}-%{offsetEnd} of %{total}',
            partial_page_range_info:
                '%{offsetBegin}-%{offsetEnd} of more than %{offsetEnd}',
            current_page: 'Page %{page}',
            page: 'Go to page %{page}',
            first: 'Go to first page',
            last: 'Go to last page',
            next: 'Go to next page',
            previous: 'Go to previous page',
            page_rows_per_page: '每页数量:',
            skip_nav: 'Skip to content',
        },
        sort: {
            sort_by: 'Sort by %{field} %{order}',
            ASC: 'ascending',
            DESC: 'descending',
        },
        auth: {
            auth_check_error: 'Please login to continue',
            user_menu: 'Profile',
            username: 'Username',
            password: 'Password',
            sign_in: 'Sign in',
            sign_in_error: 'Authentication failed, please retry',
            logout: 'Logout',
        },
        notification: {
            updated: '修改成功 |||| %{smart_count} 项 修改成功',
            created: '添加成功',
            deleted: '删除成功 |||| %{smart_count} 项 删除成功',
            bad_item: 'Incorrect element',
            item_doesnt_exist: 'Element does not exist',
            http_error: 'Server communication error',
            data_provider_error:
                'dataProvider error. Check the console for details.',
            i18n_error:
                'Cannot load the translations for the specified language',
            canceled: 'Action cancelled',
            logged_out: 'Your session has ended, please reconnect.',
            not_authorized: "You're not authorized to access this resource.",
            application_update_available: 'A new version is available.',
        },
        validation: {
            required: '必填项',
            minLength: 'Must be %{min} characters at least',
            maxLength: 'Must be %{max} characters or less',
            minValue: 'Must be at least %{min}',
            maxValue: 'Must be %{max} or less',
            number: 'Must be a number',
            email: 'Must be a valid email',
            oneOf: 'Must be one of: %{options}',
            regex: 'Must match a specific format (regexp): %{pattern}',
            unique: 'Must be unique',
        },
        saved_queries: {
            label: '保存过滤',
            query_name: 'Query name',
            new_label: '保存过滤条件...',
            new_dialog_title: 'Save current query as',
            remove_label: '移除过滤条件',
            remove_label_with_name: 'Remove query "%{name}"',
            remove_dialog_title: '移除过滤条件?',
            remove_message:
                '您确定要移除已保存过滤条件吗?',
            help: 'Filter the list and save this query for later',
        },
        configurable: {
            customize: 'Customize',
            configureMode: 'Configure this page',
            inspector: {
                title: 'Inspector',
                content: 'Hover the application UI elements to configure them',
                reset: 'Reset Settings',
                hideAll: 'Hide All',
                showAll: 'Show All',
            },
            Datagrid: {
                title: 'Datagrid',
                unlabeled: 'Unlabeled column #%{column}',
            },
            SimpleForm: {
                title: 'Form',
                unlabeled: 'Unlabeled input #%{input}',
            },
            SimpleList: {
                title: 'List',
                primaryText: 'Primary text',
                secondaryText: 'Secondary text',
                tertiaryText: 'Tertiary text',
            },
        },
  ra: {
    action: {
      add_filter: "过滤条件",
      add: "添加",
      back: "返回",
      bulk_actions: "1 item selected |||| %{smart_count} items selected",
      cancel: "取消",
      clear_array_input: "情空列表",
      clear_input_value: "清空",
      clone: "克隆",
      confirm: "确定",
      create: "添加",
      create_item: "添加 %{item}",
      delete: "删除",
      edit: "编辑",
      export: "导出",
      import: "导入",
      list: "列表",
      refresh: "刷新",
      remove_filter: "Remove this filter",
      remove_all_filters: "移除所有",
      remove: "移除",
      save: "保存",
      search: "搜索",
      select_all: "全部选中",
      select_row: "选中一行",
      show: "显示",
      sort: "排序",
      undo: "撤销",
      unselect: "取消选择",
      expand: "展开",
      close: "关闭",
      open_menu: "Open menu",
      close_menu: "Close menu",
      update: "修改",
      move_up: "Move up",
      move_down: "Move down",
      open: "Open",
      toggle_theme: "Toggle light/dark mode",
      select_columns: "筛选列",
      update_application: "Reload Application",
    },
}
    boolean: {
      true: "是",
      false: "否",
      null: " ",
    },
    page: {
      create: "Create %{name}",
      dashboard: "Dashboard",
      edit: "%{name} %{recordRepresentation}",
      error: "Something went wrong",
      list: "%{name}",
      loading: "Loading",
      not_found: "Not Found",
      show: "%{name} %{recordRepresentation}",
      empty: "No %{name} yet.",
      invite: "Do you want to add one?",
    },
    input: {
      file: {
        upload_several: "拖放一些要上传的文件,或单击以选择一个",
        upload_single: "拖放要上传的文件,或单击以选择它",
      },
      image: {
        upload_several: "Drop some pictures to upload, or click to select one.",
        upload_single: "Drop a picture to upload, or click to select it.",
      },
      references: {
        all_missing: "Unable to find references data.",
        many_missing:
          "At least one of the associated references no longer appears to be available.",
        single_missing:
          "Associated reference no longer appears to be available.",
      },
      password: {
        toggle_visible: "Hide password",
        toggle_hidden: "Show password",
      },
    },
    message: {
      about: "About",
      are_you_sure: "Are you sure?",
      auth_error:
        "An error occurred while validating the authentication token.",
      bulk_delete_content:
        "Are you sure you want to delete this %{name}? |||| Are you sure you want to delete these %{smart_count} items?",
      bulk_delete_title: "删除 %{name} |||| 删除 %{smart_count} %{name}",
      bulk_update_content:
        "Are you sure you want to update this %{name}? |||| Are you sure you want to update these %{smart_count} items?",
      bulk_update_title: "修改 %{name} |||| 修改 %{smart_count} %{name}",
      clear_array_input: "Are you sure you want to clear the whole list?",
      delete_content: "您确实要删除此项吗?",
      delete_title: "删除 %{name} #%{id}",
      details: "Details",
      error: "A client error occurred and your request couldn't be completed.",
export default chineseMessages;
      invalid_form: "表单无效 请检查是否有错误!",
      loading: "Please wait",
      no: "No",
      not_found: "Either you typed a wrong URL, or you followed a bad link.",
      yes: "Yes",
      unsaved_changes:
        "Some of your changes weren't saved. Are you sure you want to ignore them?",
    },
    navigation: {
      no_results: "没有找到数据",
      no_more_results:
        "The page number %{page} is out of boundaries. Try the previous page.",
      page_out_of_boundaries: "Page number %{page} out of boundaries",
      page_out_from_end: "Cannot go after last page",
      page_out_from_begin: "Cannot go before page 1",
      page_range_info: "%{offsetBegin}-%{offsetEnd} of %{total}",
      partial_page_range_info:
        "%{offsetBegin}-%{offsetEnd} of more than %{offsetEnd}",
      current_page: "Page %{page}",
      page: "Go to page %{page}",
      first: "Go to first page",
      last: "Go to last page",
      next: "Go to next page",
      previous: "Go to previous page",
      page_rows_per_page: "每页数量:",
      skip_nav: "Skip to content",
    },
    sort: {
      sort_by: "Sort by %{field} %{order}",
      ASC: "ascending",
      DESC: "descending",
    },
    auth: {
      auth_check_error: "Please login to continue",
      user_menu: "Profile",
      username: "Username",
      password: "Password",
      sign_in: "Sign in",
      sign_in_error: "Authentication failed, please retry",
      logout: "Logout",
    },
    notification: {
      updated: "修改成功 |||| %{smart_count} 项 修改成功",
      created: "添加成功",
      deleted: "删除成功 |||| %{smart_count} 项 删除成功",
      bad_item: "Incorrect element",
      item_doesnt_exist: "Element does not exist",
      http_error: "Server communication error",
      data_provider_error: "dataProvider error. Check the console for details.",
      i18n_error: "Cannot load the translations for the specified language",
      canceled: "Action cancelled",
      logged_out: "Your session has ended, please reconnect.",
      not_authorized: "You're not authorized to access this resource.",
      application_update_available: "A new version is available.",
    },
    validation: {
      required: "必填项",
      minLength: "Must be %{min} characters at least",
      maxLength: "Must be %{max} characters or less",
      minValue: "Must be at least %{min}",
      maxValue: "Must be %{max} or less",
      number: "Must be a number",
      email: "Must be a valid email",
      oneOf: "Must be one of: %{options}",
      regex: "Must match a specific format (regexp): %{pattern}",
      unique: "Must be unique",
    },
    saved_queries: {
      label: "保存过滤",
      query_name: "Query name",
      new_label: "保存过滤条件...",
      new_dialog_title: "Save current query as",
      remove_label: "移除过滤条件",
      remove_label_with_name: 'Remove query "%{name}"',
      remove_dialog_title: "移除过滤条件?",
      remove_message: "您确定要移除已保存过滤条件吗?",
      help: "Filter the list and save this query for later",
    },
    configurable: {
      customize: "Customize",
      configureMode: "Configure this page",
      inspector: {
        title: "Inspector",
        content: "Hover the application UI elements to configure them",
        reset: "Reset Settings",
        hideAll: "Hide All",
        showAll: "Show All",
      },
      Datagrid: {
        title: "Datagrid",
        unlabeled: "Unlabeled column #%{column}",
      },
      SimpleForm: {
        title: "Form",
        unlabeled: "Unlabeled input #%{input}",
      },
      SimpleList: {
        title: "List",
        primaryText: "Primary text",
        secondaryText: "Secondary text",
        tertiaryText: "Tertiary text",
      },
    },
  },
};
export default chineseMessages;
rsf-admin/src/i18n/en.js
@@ -142,6 +142,7 @@
        whMat: 'Warehouse Mat',
        fields: 'Extend Fields',
        fieldsItem: 'Extend Fields Items',
        warehouseAreasItem: 'WarehouseAreasItem',
    },
    table: {
        field: {
@@ -303,6 +304,25 @@
                flagLabelMange: "flagLabelMange",
                flagMix: "flagMix",
            },
            warehouseAreasItem: {
                areaId: "areaId",
                areaName: "areaName",
                matnrId: "matnrId",
                matnrName: "matnrName",
                matnrCode: "matnrCode",
                fieldsIndex: "fieldsIndex",
                barcode: "barcode",
                anfme: "anfme",
                batch: "batch",
                unit: "unit",
                stockUnit: "stockUnit",
                brand: "brand",
                shipperId: "shipperId",
                splrId: "splrId",
                weight: "weight",
                prodTime: "prodTime",
                splrBtch: "splrBtch",
            },
            loc: {
                warehouseId: "Warehouse",
                areaId: "Area",
@@ -346,8 +366,13 @@
                projectName: "ProjectName",
            },
            qlyInspect: {
                code: "Code",
                name: "Name",
                code: "code",
                name: "name",
                barcode: "barcode",
                asnItemId: "asnItemId",
                poItemId: "poItemId",
                safeQty: "safeQty",
                disQty: "disQty",
            },
            dictType: {
                code: "Code",
@@ -553,7 +578,12 @@
            shipper: 'shipper is required',
            groupId: 'groupId is required',
        }
    }
    },
    toolbar: {
        inspection: "Inspection",
        creatcode: "creatcode",
        print: "print",
    },
};
export default customEnglishMessages;
rsf-admin/src/i18n/zh.js
@@ -141,6 +141,7 @@
        whMat: '库区物料关系',
        fields: '扩展字段',
        fieldsItem: '扩展字段明细',
        warehouseAreasItem: '库区库存信息',
    },
    table: {
        field: {
@@ -302,6 +303,25 @@
                flagLabelMange: "标签管理",
                flagMix: "混放",
            },
            warehouseAreasItem: {
                areaId: "仓库区域",
                areaName: "区域名称    ",
                matnrId: "物料标识",
                matnrName: "物料名称",
                matnrCode: "物料编码",
                fieldsIndex: "扩展字段唯一标识",
                barcode: "条形码",
                anfme: "数量",
                batch: "批次号",
                unit: "计量单位",
                stockUnit: "库存单位",
                brand: "品牌",
                shipperId: "货主标识",
                splrId: "供应商标识",
                weight: "收货重量",
                prodTime: "生产日期",
                splrBtch: "供应商批次",
            },
            loc: {
                warehouseId: "仓库",
                areaId: "库区",
@@ -348,11 +368,16 @@
            qlyInspect: {
                code: "编码",
                name: "名称",
                barcode: "标签码",
                asnItemId: "通知单明细标识",
                poItemId: "PO单明细标识",
                safeQty: "合格数量",
                disQty: "不合格数量",
            },
            dictType: {
                code: "字典编码",
                name: "字典名称",
                description: "内容描述",
                description: "内容",
            },
            dictData: {
                dictTypeId: "字典标识",
@@ -411,7 +436,7 @@
                wkType: "业务类型",
                anfme: "数量",
                qty: "已完成数量",
                logisNo: "logisNo",
                logisNo: "物流单号",
                arrTime: "预计到达时间",
                rleStatus: "释放状态",
                ntyStatus: "质检上报状态",
@@ -460,7 +485,7 @@
                anfme: "数量",
                qty: "已完成",
                nromQty: "标包数量",
                asnQty:  "单据数量",
                asnQty: "单据数量",
                printQty: "打印数量",
                splrName: "供应商名称",
                splrCode: "供应商编码",
@@ -555,7 +580,12 @@
            shipper: '货主不能为空',
            groupId: '分组不能为空',
        }
    }
    },
    toolbar: {
        inspection: "报检",
        creatcode: "生成条码",
        print: "打印",
    },
};
export default customChineseMessages;
rsf-admin/src/page/ResourceContent.js
@@ -33,7 +33,7 @@
import purchase from './purchase';
import fields from './fields';
import fieldsItem from './fieldsItem';
import warehouseAreasItem from './warehouseAreasItem';
const ResourceContent = (node) => {
    switch (node.component) {
@@ -63,6 +63,8 @@
            return warehouse;
        case 'warehouseAreas':
            return warehouseAreas;
        case 'warehouseAreasItem':
            return warehouseAreasItem;
        case 'loc':
            return loc;
        case 'container':
rsf-admin/src/page/asnOrder/AsnOrderCreate.jsx
@@ -84,14 +84,14 @@
                        </DialogTitle>
                        <DialogContent sx={{ mt: 2 }}>
                            <Grid container rowSpacing={2} columnSpacing={2}>
                                <Grid item xs={6} display="flex" gap={1}>
                                {/* <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.asnOrder.code"
                                        source="code"
                                        parse={v => v}
                                        autoFocus
                                    />
                                </Grid>
                                </Grid> */}
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.asnOrder.poCode"
@@ -121,20 +121,20 @@
                                        validate={required()}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                {/* <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.asnOrder.anfme"
                                        source="anfme"
                                        validate={required()}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                </Grid> */}
                                {/* <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.asnOrder.qty"
                                        source="qty"
                                        validate={required()}
                                    />
                                </Grid>
                                </Grid> */}
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.asnOrder.logisNo"
@@ -154,7 +154,7 @@
                                        source="rleStatus"
                                        choices={[
                                            { id: 0, name: ' 正常' },
                                            { id:  1, name: ' 已释放' },
                                            { id: 1, name: ' 已释放' },
                                        ]}
                                    />
                                </Grid>
rsf-admin/src/page/asnOrder/AsnOrderEdit.jsx
@@ -63,14 +63,14 @@
                        <Typography variant="h6" gutterBottom>
                            {translate('common.edit.title.main')}
                        </Typography>
                        <Stack direction='row' gap={2}>
                        {/* <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.asnOrder.code"
                                source="code"
                                parse={v => v}
                                autoFocus
                            />
                        </Stack>
                        </Stack> */}
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.asnOrder.poCode"
@@ -100,7 +100,7 @@
                                validate={required()}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                        {/* <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.asnOrder.anfme"
                                source="anfme"
@@ -113,7 +113,7 @@
                                source="qty"
                                validate={required()}
                            />
                        </Stack>
                        </Stack> */}
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.asnOrder.logisNo"
@@ -133,7 +133,7 @@
                                source="rleStatus"
                                choices={[
                                    { id: 0, name: ' 正常' },
                                    { id:  1, name: ' 已释放' },
                                    { id: 1, name: ' 已释放' },
                                ]}
                                validate={required()}
                            />
rsf-admin/src/page/asnOrder/AsnOrderList.jsx
@@ -1,36 +1,37 @@
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,
  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,
  Button
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -43,134 +44,158 @@
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import ConstructionIcon from "@mui/icons-material/Construction";
import FileDownloadIcon from '@mui/icons-material/FileDownload';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
  '& .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 />,
  <SearchInput source="condition" alwaysOn />,
    <TextInput source="code" label="table.field.asnOrder.code" />,
    <TextInput source="poCode" label="table.field.asnOrder.poCode" />,
    <NumberInput source="poId" label="table.field.asnOrder.poId" />,
    <TextInput source="type" label="table.field.asnOrder.type" />,
    <TextInput source="wkType" label="table.field.asnOrder.wkType" />,
    <NumberInput source="anfme" label="table.field.asnOrder.anfme" />,
    <NumberInput source="qty" label="table.field.asnOrder.qty" />,
    <TextInput source="logisNo" label="table.field.asnOrder.logisNo" />,
    <DateInput source="arrTime" label="table.field.asnOrder.arrTime" />,
    <SelectInput source="rleStatus" label="table.field.asnOrder.rleStatus"
        choices={[
            { id: 0, name: ' 正常' },
            { id:  1, name: ' 已释放' },
        ]}
    />,
  <TextInput source="code" label="table.field.asnOrder.code" />,
  <TextInput source="poCode" label="table.field.asnOrder.poCode" />,
  <NumberInput source="poId" label="table.field.asnOrder.poId" />,
  <TextInput source="type" label="table.field.asnOrder.type" />,
  <TextInput source="wkType" label="table.field.asnOrder.wkType" />,
  <NumberInput source="anfme" label="table.field.asnOrder.anfme" />,
  <NumberInput source="qty" label="table.field.asnOrder.qty" />,
  <TextInput source="logisNo" label="table.field.asnOrder.logisNo" />,
  <DateInput source="arrTime" label="table.field.asnOrder.arrTime" />,
  <SelectInput source="rleStatus" label="table.field.asnOrder.rleStatus"
    choices={[
      { id: 0, name: ' 正常' },
      { id: 1, name: ' 已释放' },
    ]}
  />,
    <TextInput label="common.field.memo" source="memo" />,
    <SelectInput
        label="common.field.status"
        source="status"
        choices={[
            { id: '1', name: 'common.enums.statusTrue' },
            { id: '0', name: 'common.enums.statusFalse' },
        ]}
        resettable
    />,
  <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 AsnOrderList = () => {
    const translate = useTranslate();
  const translate = useTranslate();
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
  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.asnOrder"}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                filters={filters}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='asnOrder' />
                        <MyExportButton />
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='asnOrder'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false}
                    expand={() => <AsnOrderPanel />}
                    expandSingle={true}
                    omit={['id', 'createTime', 'createBy', 'memo']}
                >
                    <NumberField source="id" />
                    <TextField source="code" label="table.field.asnOrder.code" />
                    <TextField source="poCode" label="table.field.asnOrder.poCode" />
                    <NumberField source="poId" label="table.field.asnOrder.poId" />
                    <TextField source="type" label="table.field.asnOrder.type" />
                    <TextField source="wkType" label="table.field.asnOrder.wkType" />
                    <NumberField source="anfme" label="table.field.asnOrder.anfme" />
                    <NumberField source="qty" label="table.field.asnOrder.qty" />
                    <TextField source="logisNo" label="table.field.asnOrder.logisNo" />
                    <DateField source="arrTime" label="table.field.asnOrder.arrTime" showTime />
                    <TextField source="rleStatus$" label="table.field.asnOrder.rleStatus" sortable={false} />
                    <TextField source="name" label="table.field.asnOrder.name" />
  const navigate = useNavigate();
  const assign = (record) => {
    navigate(`/asnOrderItem?asnId=${record.id}`);
  };
                    <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>
            <AsnOrderCreate
                open={createDialog}
                setOpen={setCreateDialog}
            />
            <PageDrawer
                title='AsnOrder Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
  const importList = () => { };
  const inspection = () => { };
  const print = () => { };
  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.asnOrder"}
        empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
        filters={filters}
        sort={{ field: "create_time", order: "desc" }}
        actions={(
          <TopToolbar>
            <Button onClick={inspection} label={"toolbar.inspection"}>
              <ConstructionIcon />
            </Button>
            <FilterButton />
            <MyCreateButton onClick={() => { setCreateDialog(true) }} />
            <SelectColumnsButton preferenceKey='asnOrder' />
            <MyExportButton />
          </TopToolbar>
        )}
        perPage={DEFAULT_PAGE_SIZE}
      >
        <StyledDatagrid
          preferenceKey='asnOrder'
          bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
          rowClick={(id, resource, record) => false}
          expand={() => <AsnOrderPanel />}
          expandSingle={true}
          omit={['id', 'createTime', 'createBy', 'memo']}
        >
          <NumberField source="id" />
          <MyField
            source="code"
            label="table.field.asnOrder.code"
            onClick={(event, record, val) => {
              event.stopPropagation();
              assign(record);
            }}
          />
          <TextField source="poCode" label="table.field.asnOrder.poCode" />
          <NumberField source="poId" label="table.field.asnOrder.poId" />
          <TextField source="type" label="table.field.asnOrder.type" />
          <TextField source="wkType" label="table.field.asnOrder.wkType" />
          <NumberField source="anfme" label="table.field.asnOrder.anfme" />
          <NumberField source="qty" label="table.field.asnOrder.qty" />
          <TextField source="logisNo" label="table.field.asnOrder.logisNo" />
          <DateField source="arrTime" label="table.field.asnOrder.arrTime" showTime />
          <TextField source="rleStatus$" label="table.field.asnOrder.rleStatus" sortable={false} />
          <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">
            <Button label="toolbar.print" onClick={print}>
              <FileDownloadIcon />
            </Button>
            <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
          </WrapperField>
        </StyledDatagrid>
      </List>
      <AsnOrderCreate
        open={createDialog}
        setOpen={setCreateDialog}
      />
      <PageDrawer
        title='AsnOrder Detail'
        drawerVal={drawerVal}
        setDrawerVal={setDrawerVal}
      >
      </PageDrawer>
    </Box>
  )
}
export default AsnOrderList;
rsf-admin/src/page/asnOrderItem/AsnOrderItemCreate.jsx
@@ -32,7 +32,7 @@
import MemoInput from "../components/MemoInput";
const AsnOrderItemCreate = (props) => {
    const { open, setOpen } = props;
    const { open, setOpen, row } = props;
    const translate = useTranslate();
    const notify = useNotify();
@@ -88,7 +88,7 @@
                                    <NumberInput
                                        label="table.field.asnOrderItem.asnId"
                                        source="asnId"
                                        autoFocus
                                        defaultValue={row.asnId}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
rsf-admin/src/page/asnOrderItem/AsnOrderItemList.jsx
@@ -1,36 +1,37 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import { useNavigate, useLocation } from 'react-router-dom';
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
  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,
  Button
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -43,140 +44,156 @@
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import CustomerTopToolBar from "../components/EditTopToolBar";
import QrCodeIcon from "@mui/icons-material/QrCode";
import ImportButton from "../components/ImportButton";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
  '& .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 />,
  <SearchInput source="condition" alwaysOn />,
    <NumberInput source="asnId" label="table.field.asnOrderItem.asnId" />,
    <TextInput source="asnCode" label="table.field.asnOrderItem.asnCode" />,
    <TextInput source="poDetlId" label="table.field.asnOrderItem.poDetlId" />,
    <TextInput source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" />,
    <TextInput source="matnrId" label="table.field.asnOrderItem.matnrId" />,
    <TextInput source="matnk" label="table.field.asnOrderItem.matnk" />,
    <NumberInput source="anfme" label="table.field.asnOrderItem.anfme" />,
    <TextInput source="stockUnit" label="table.field.asnOrderItem.stockUnit" />,
    <NumberInput source="purQty" label="table.field.asnOrderItem.purQty" />,
    <TextInput source="purUnit" label="table.field.asnOrderItem.purUnit" />,
    <NumberInput source="qty" label="table.field.asnOrderItem.qty" />,
    <TextInput source="splrCode" label="table.field.asnOrderItem.splrCode" />,
    <TextInput source="splrName" label="table.field.asnOrderItem.splrName" />,
    <TextInput source="qrcode" label="table.field.asnOrderItem.qrcode" />,
    <TextInput source="barcode" label="table.field.asnOrderItem.barcode" />,
    <TextInput source="packName" label="table.field.asnOrderItem.packName" />,
  <NumberInput source="asnId" label="table.field.asnOrderItem.asnId" />,
  <TextInput source="asnCode" label="table.field.asnOrderItem.asnCode" />,
  <TextInput source="poDetlId" label="table.field.asnOrderItem.poDetlId" />,
  <TextInput source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" />,
  <TextInput source="matnrId" label="table.field.asnOrderItem.matnrId" />,
  <TextInput source="matnk" label="table.field.asnOrderItem.matnk" />,
  <NumberInput source="anfme" label="table.field.asnOrderItem.anfme" />,
  <TextInput source="stockUnit" label="table.field.asnOrderItem.stockUnit" />,
  <NumberInput source="purQty" label="table.field.asnOrderItem.purQty" />,
  <TextInput source="purUnit" label="table.field.asnOrderItem.purUnit" />,
  <NumberInput source="qty" label="table.field.asnOrderItem.qty" />,
  <TextInput source="splrCode" label="table.field.asnOrderItem.splrCode" />,
  <TextInput source="splrName" label="table.field.asnOrderItem.splrName" />,
  <TextInput source="qrcode" label="table.field.asnOrderItem.qrcode" />,
  <TextInput source="barcode" label="table.field.asnOrderItem.barcode" />,
  <TextInput source="packName" label="table.field.asnOrderItem.packName" />,
    <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
    />,
  <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 AsnOrderItemList = () => {
    const translate = useTranslate();
  const translate = useTranslate();
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
  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.asnOrderItem"}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                filters={filters}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='asnOrderItem' />
                        <MyExportButton />
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='asnOrderItem'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false}
                    expand={() => <AsnOrderItemPanel />}
                    expandSingle={true}
                    omit={['id', 'createTime', 'createBy', 'memo']}
                >
                    <NumberField source="id" />
                    <NumberField source="asnId" label="table.field.asnOrderItem.asnId" />
                    <TextField source="asnCode" label="table.field.asnOrderItem.asnCode" />
                    <TextField source="poDetlId" label="table.field.asnOrderItem.poDetlId" />
                    <TextField source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" />
                    <TextField source="matnrId" label="table.field.asnOrderItem.matnrId" />
                    <TextField source="matnk" label="table.field.asnOrderItem.matnk" />
                    <NumberField source="anfme" label="table.field.asnOrderItem.anfme" />
                    <TextField source="stockUnit" label="table.field.asnOrderItem.stockUnit" />
                    <NumberField source="purQty" label="table.field.asnOrderItem.purQty" />
                    <TextField source="purUnit" label="table.field.asnOrderItem.purUnit" />
                    <NumberField source="qty" label="table.field.asnOrderItem.qty" />
                    <TextField source="splrCode" label="table.field.asnOrderItem.splrCode" />
                    <TextField source="splrName" label="table.field.asnOrderItem.splrName" />
                    <TextField source="qrcode" label="table.field.asnOrderItem.qrcode" />
                    <TextField source="barcode" label="table.field.asnOrderItem.barcode" />
                    <TextField source="packName" label="table.field.asnOrderItem.packName" />
  const location = useLocation();
  const queryParams = new URLSearchParams(location.search);
  const asnId = queryParams.get("asnId");
                    <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>
            <AsnOrderItemCreate
                open={createDialog}
                setOpen={setCreateDialog}
            />
            <PageDrawer
                title='AsnOrderItem Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
  const creatCode = () => { };
  return (
    <>
      {asnId && <CustomerTopToolBar backPrevious={true} />}
      <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.asnOrderItem"}
          empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
          filters={filters}
          sort={{ field: "create_time", order: "desc" }}
          actions={(
            <TopToolbar>
              <Button onClick={creatCode} label={"toolbar.creatcode"}>
                <QrCodeIcon />
              </Button>
              <FilterButton />
              <MyCreateButton onClick={() => { setCreateDialog(true) }} />
              <SelectColumnsButton preferenceKey='asnOrderItem' />
              <ImportButton value={'asnOrder'} parmas={{ asnId: asnId }} />
              <MyExportButton />
            </TopToolbar>
          )}
          perPage={DEFAULT_PAGE_SIZE}
        >
          <StyledDatagrid
            preferenceKey='asnOrderItem'
            bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
            rowClick={(id, resource, record) => false}
            expand={() => <AsnOrderItemPanel />}
            expandSingle={true}
            omit={['id', 'createTime', 'createBy', 'memo']}
          >
            <NumberField source="id" />
            <NumberField source="asnId" label="table.field.asnOrderItem.asnId" />
            <TextField source="asnCode" label="table.field.asnOrderItem.asnCode" />
            <TextField source="poDetlId" label="table.field.asnOrderItem.poDetlId" />
            <TextField source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" />
            <TextField source="matnrId" label="table.field.asnOrderItem.matnrId" />
            <TextField source="matnk" label="table.field.asnOrderItem.matnk" />
            <NumberField source="anfme" label="table.field.asnOrderItem.anfme" />
            <TextField source="stockUnit" label="table.field.asnOrderItem.stockUnit" />
            <NumberField source="purQty" label="table.field.asnOrderItem.purQty" />
            <TextField source="purUnit" label="table.field.asnOrderItem.purUnit" />
            <NumberField source="qty" label="table.field.asnOrderItem.qty" />
            <TextField source="splrCode" label="table.field.asnOrderItem.splrCode" />
            <TextField source="splrName" label="table.field.asnOrderItem.splrName" />
            <TextField source="qrcode" label="table.field.asnOrderItem.qrcode" />
            <TextField source="barcode" label="table.field.asnOrderItem.barcode" />
            <TextField source="packName" label="table.field.asnOrderItem.packName" />
            <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>
        <AsnOrderItemCreate
          open={createDialog}
          setOpen={setCreateDialog}
          row={{ asnId }}
        />
        <PageDrawer
          title='AsnOrderItem Detail'
          drawerVal={drawerVal}
          setDrawerVal={setDrawerVal}
        >
        </PageDrawer>
      </Box>
    </>
  )
}
AsnOrderItemList.Context = React.createContext()
export default AsnOrderItemList;
rsf-admin/src/page/components/ImportModal.jsx
@@ -1,4 +1,4 @@
import { useEffect, useState } from 'react';
import { useEffect, useState, createContext, useContext } from 'react';
import { Box, CircularProgress, Stack, Typography } from '@mui/material';
import Alert from '@mui/material/Alert';
import Dialog from '@mui/material/Dialog';
@@ -13,14 +13,16 @@
    Form,
    Toolbar,
    useRefresh,
    useTranslate
    useTranslate,
    useNotify
} from 'react-admin';
import { Link } from 'react-router-dom';
import DialogCloseButton from './DialogCloseButton';
import { usePapaParse } from './usePapaParse';
import MatnrList from '../basicInfo/matnr/MatnrList';
import request from '@/utils/request'
const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10 }) => {
const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10, value, parmas = {} }) => {
    const refresh = useRefresh();
    const translate = useTranslate();
@@ -31,6 +33,7 @@
    });
    const [file, setFile] = useState(null);
    const notify = useNotify();
    useEffect(() => {
        if (importer.state === 'complete') {
@@ -46,10 +49,25 @@
        if (!file) {
            return;
        }
        console.log(file);
        //TODO 添加上文件上传接口
        const form = new FormData();
        for (const key in parmas) {
            if (parmas.hasOwnProperty(key)) {
                form.append(key, parmas[key]);
            }
        }
        form.append('file', file);
        const { data: { code, data, msg } } = await request.post(`/${value}/import`, form)
        if (code === 200) {
            handleClose()
        } else {
            notify(msg);
        }
    };
    const handleClose = () => {
        reset();
@@ -211,12 +229,12 @@
        </Dialog>
    );
}
{/**下载打印模板,传入type类型,调用下载模板接口 */}
{/**下载打印模板,传入type类型,调用下载模板接口 */ }
const downloadTemplate = (type) => {
    // 下载物料模板
    if (type != undefined &&  type == 'matnr') {
    }
    if (type != undefined && type == 'matnr') {
    }
    console.log('======>');
    console.log(type);
}
rsf-admin/src/page/components/MyCreateButton.jsx
@@ -1,70 +1,64 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
    Button,
    useTranslate,
} from 'react-admin';
import { Fab, useMediaQuery } from '@mui/material';
import ContentAdd from '@mui/icons-material/Add';
import { styled } from '@mui/material/styles';
import { Link } from 'react-router-dom';
import { Button, useTranslate } from "react-admin";
import { Fab, useMediaQuery } from "@mui/material";
import ContentAdd from "@mui/icons-material/Add";
import { styled } from "@mui/material/styles";
import { Link } from "react-router-dom";
const MyCreateButton = (props) => {
    const translate = useTranslate();
  const translate = useTranslate();
  const isSmall = useMediaQuery((theme) => theme.breakpoints.down("md"));
    const isSmall = useMediaQuery((theme) =>
        theme.breakpoints.down('md')
    );
  return isSmall ? (
    <StyledFab
      color="primary"
      className={CreateButtonClasses.floating}
      aria-label={label && translate(label)}
      onClick={props.onClick}
      {...props}
    >
      {defaultIcon}
    </StyledFab>
  ) : (
    <StyledButton
      className={CreateButtonClasses.floating}
      label={label}
      onClick={props.onClick}
      {...props}
    >
      {defaultIcon}
    </StyledButton>
  );
};
    return isSmall ? (
        <StyledFab
            color="primary"
            className={CreateButtonClasses.floating}
            aria-label={label && translate(label)}
            onClick={props.onClick}
            {...props}
        >
            {defaultIcon}
        </StyledFab>
    ) : (
        <StyledButton
            className={CreateButtonClasses.floating}
            label={label}
            onClick={props.onClick}
            {...props}
        >
            {defaultIcon}
        </StyledButton>
    );
}
const label = 'ra.action.create';
const PREFIX = 'RaCreateButton';
const label = "ra.action.create";
const PREFIX = "RaCreateButton";
const defaultIcon = <ContentAdd />;
export const CreateButtonClasses = {
    root: `${PREFIX}-root`,
    floating: `${PREFIX}-floating`,
  root: `${PREFIX}-root`,
  floating: `${PREFIX}-floating`,
};
const StyledFab = styled(Fab, {
    name: PREFIX,
    overridesResolver: (_props, styles) => styles.root,
  name: PREFIX,
  overridesResolver: (_props, styles) => styles.root,
})(({ theme }) => ({
    [`&.${CreateButtonClasses.floating}`]: {
        color: theme.palette.getContrastText(theme.palette.primary.main),
        margin: 0,
        top: 'auto',
        right: 20,
        bottom: 60,
        left: 'auto',
        position: 'fixed',
        zIndex: 1000,
    },
  [`&.${CreateButtonClasses.floating}`]: {
    color: theme.palette.getContrastText(theme.palette.primary.main),
    margin: 0,
    top: "auto",
    right: 20,
    bottom: 60,
    left: "auto",
    position: "fixed",
    zIndex: 1000,
  },
}));
const StyledButton = styled(Button, {
    name: PREFIX,
    overridesResolver: (_props, styles) => styles.root,
  name: PREFIX,
  overridesResolver: (_props, styles) => styles.root,
})({});
export default MyCreateButton;
export default MyCreateButton;
rsf-admin/src/page/components/MyExportButton.jsx
@@ -1,87 +1,84 @@
import * as React from 'react';
import { useCallback } from 'react';
import DownloadIcon from '@mui/icons-material/GetApp';
import * as React from "react";
import { useCallback } from "react";
import DownloadIcon from "@mui/icons-material/GetApp";
import {
    Button, useDataProvider, useNotify, useListContext
} from 'react-admin';
  Button,
  useDataProvider,
  useNotify,
  useListContext,
} from "react-admin";
const MyExportButton = (props) => {
    const {
        maxResults = 1000,
        onClick,
        label = 'ra.action.export',
        icon = defaultIcon,
        exporter: customExporter,
        meta,
        ...rest
    } = props;
  const {
    maxResults = 1000,
    onClick,
    label = "ra.action.export",
    icon = defaultIcon,
    exporter: customExporter,
    meta,
    ...rest
  } = props;
    const {
        filter,
        filterValues,
        resource,
        sort,
        total,
    } = useListContext();
  const { filter, filterValues, resource, sort, total } = useListContext();
    const dataProvider = useDataProvider();
    const notify = useNotify();
  const dataProvider = useDataProvider();
  const notify = useNotify();
    const handleClick = useCallback(
        event => {
            dataProvider.export(resource, {
                sort,
                filter: filter
                    ? { ...filterValues, ...filter }
                    : filterValues,
                pagination: { page: 1, perPage: maxResults },
                meta,
            }).then((res) => {
                const url = window.URL.createObjectURL(new Blob([res.data], { type: res.headers['content-type'] }));
                const link = document.createElement('a');
                link.href = url;
                link.setAttribute('download', `${resource}.xlsx`);
                document.body.appendChild(link);
                link.click();
                link.remove();
            }).catch(error => {
                console.error(error);
                notify('ra.notification.http_error', { type: 'error' });
            });
            if (typeof onClick === 'function') {
                onClick(event);
            }
        },
        [
            dataProvider,
            filter,
            filterValues,
            maxResults,
            notify,
            onClick,
            resource,
            sort,
            meta,
        ]
    );
  const handleClick = useCallback(
    (event) => {
      dataProvider
        .export(resource, {
          sort,
          filter: filter ? { ...filterValues, ...filter } : filterValues,
          pagination: { page: 1, perPage: maxResults },
          meta,
        })
        .then((res) => {
          const url = window.URL.createObjectURL(
            new Blob([res.data], { type: res.headers["content-type"] }),
          );
          const link = document.createElement("a");
          link.href = url;
          link.setAttribute("download", `${resource}.xlsx`);
          document.body.appendChild(link);
          link.click();
          link.remove();
        })
        .catch((error) => {
          console.error(error);
          notify("ra.notification.http_error", { type: "error" });
        });
      if (typeof onClick === "function") {
        onClick(event);
      }
    },
    [
      dataProvider,
      filter,
      filterValues,
      maxResults,
      notify,
      onClick,
      resource,
      sort,
      meta,
    ],
  );
    return (
        <Button
            onClick={handleClick}
            label={label}
            disabled={total === 0}
            {...sanitizeRestProps(rest)}
        >
            {icon}
        </Button>
    );
  return (
    <Button
      onClick={handleClick}
      label={label}
      disabled={total === 0}
      {...sanitizeRestProps(rest)}
    >
      {icon}
    </Button>
  );
};
const defaultIcon = <DownloadIcon />;
const sanitizeRestProps = ({
    resource,
    ...rest
}) => rest;
const sanitizeRestProps = ({ resource, ...rest }) => rest;
export default MyExportButton;
rsf-admin/src/page/purchase/PurchaseCreate.jsx
@@ -84,14 +84,14 @@
                        </DialogTitle>
                        <DialogContent sx={{ mt: 2 }}>
                            <Grid container rowSpacing={2} columnSpacing={2}>
                                <Grid item xs={6} display="flex" gap={1}>
                                {/* <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.purchase.code"
                                        source="code"
                                        parse={v => v}
                                        autoFocus
                                    />
                                </Grid>
                                </Grid> */}
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.purchase.type"
rsf-admin/src/page/purchase/PurchaseEdit.jsx
@@ -63,14 +63,14 @@
                        <Typography variant="h6" gutterBottom>
                            {translate('common.edit.title.main')}
                        </Typography>
                        <Stack direction='row' gap={2}>
                        {/* <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.purchase.code"
                                source="code"
                                parse={v => v}
                                autoFocus
                            />
                        </Stack>
                        </Stack> */}
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.purchase.type"
rsf-admin/src/page/purchase/PurchaseList.jsx
@@ -1,36 +1,36 @@
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,
  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';
@@ -45,128 +45,138 @@
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
    },
  '& .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 />,
    <TextInput source="code" label="table.field.purchase.code" />,
    <TextInput source="type" label="table.field.purchase.type" />,
    <TextInput source="source" label="table.field.purchase.source" />,
    <DateInput source="preArr" label="table.field.purchase.preArr" />,
    <NumberInput source="anfme" label="table.field.purchase.anfme" />,
    <NumberInput source="qty" label="table.field.purchase.qty" />,
    <NumberInput source="workQty" label="table.field.purchase.workQty" />,
    <TextInput source="channel" label="table.field.purchase.channel" />,
    <TextInput source="platCode" label="table.field.purchase.platCode" />,
    <DateInput source="startTime" label="table.field.purchase.startTime" />,
    <DateInput source="endTime" label="table.field.purchase.endTime" />,
    <TextInput source="project" label="table.field.purchase.project" />,
    <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
    />,
  <SearchInput source="condition" alwaysOn />,
  <TextInput source="code" label="table.field.purchase.code" />,
  <TextInput source="type" label="table.field.purchase.type" />,
  <TextInput source="source" label="table.field.purchase.source" />,
  <DateInput source="preArr" label="table.field.purchase.preArr" />,
  <NumberInput source="anfme" label="table.field.purchase.anfme" />,
  <NumberInput source="qty" label="table.field.purchase.qty" />,
  <NumberInput source="workQty" label="table.field.purchase.workQty" />,
  <TextInput source="channel" label="table.field.purchase.channel" />,
  <TextInput source="platCode" label="table.field.purchase.platCode" />,
  <DateInput source="startTime" label="table.field.purchase.startTime" />,
  <DateInput source="endTime" label="table.field.purchase.endTime" />,
  <TextInput source="project" label="table.field.purchase.project" />,
  <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 PurchaseList = () => {
    const translate = useTranslate();
  const translate = useTranslate();
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
  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.purchase"}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                filters={filters}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='purchase' />
                        <MyExportButton />
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='purchase'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false}
                    expand={() => <PurchasePanel />}
                    expandSingle={true}
                    omit={['id', 'createTime', 'createBy', 'memo']}
                >
                    <NumberField source="id" />
                    <TextField source="code" label="table.field.purchase.code" />
                    <TextField source="type" label="table.field.purchase.type" />
                    <TextField source="source" label="table.field.purchase.source" />
                    <DateField source="preArr" label="table.field.purchase.preArr" showTime />
                    <NumberField source="anfme" label="table.field.purchase.anfme" />
                    <NumberField source="qty" label="table.field.purchase.qty" />
                    <NumberField source="workQty" label="table.field.purchase.workQty" />
                    <TextField source="channel" label="table.field.purchase.channel" />
                    <TextField source="platCode" label="table.field.purchase.platCode" />
                    <DateField source="startTime" label="table.field.purchase.startTime" showTime />
                    <DateField source="endTime" label="table.field.purchase.endTime" showTime />
                    <TextField source="project" label="table.field.purchase.project" />
  const navigate = useNavigate();
  const assign = (record) => {
    navigate(`/purchaseItem?poId=${record.id}`);
  };
                    <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>
            <PurchaseCreate
                open={createDialog}
                setOpen={setCreateDialog}
            />
            <PageDrawer
                title='Purchase Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
  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.purchase"}
        empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
        filters={filters}
        sort={{ field: "create_time", order: "desc" }}
        actions={(
          <TopToolbar>
            <FilterButton />
            <MyCreateButton onClick={() => { setCreateDialog(true) }} />
            <SelectColumnsButton preferenceKey='purchase' />
            <MyExportButton />
          </TopToolbar>
        )}
        perPage={DEFAULT_PAGE_SIZE}
      >
        <StyledDatagrid
          preferenceKey='purchase'
          bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
          rowClick={(id, resource, record) => false}
          expand={() => <PurchasePanel />}
          expandSingle={true}
          omit={['id', 'createTime', 'createBy', 'memo']}
        >
          <NumberField source="id" />
          <MyField
            source="code"
            label="table.field.purchase.code"
            onClick={(event, record, val) => {
              event.stopPropagation();
              assign(record);
            }}
          />
          <TextField source="type" label="table.field.purchase.type" />
          <TextField source="source" label="table.field.purchase.source" />
          <DateField source="preArr" label="table.field.purchase.preArr" showTime />
          <NumberField source="anfme" label="table.field.purchase.anfme" />
          <NumberField source="qty" label="table.field.purchase.qty" />
          <NumberField source="workQty" label="table.field.purchase.workQty" />
          <TextField source="channel" label="table.field.purchase.channel" />
          <TextField source="platCode" label="table.field.purchase.platCode" />
          <DateField source="startTime" label="table.field.purchase.startTime" showTime />
          <DateField source="endTime" label="table.field.purchase.endTime" showTime />
          <TextField source="project" label="table.field.purchase.project" />
          <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>
      <PurchaseCreate
        open={createDialog}
        setOpen={setCreateDialog}
      />
      <PageDrawer
        title='Purchase Detail'
        drawerVal={drawerVal}
        setDrawerVal={setDrawerVal}
      >
      </PageDrawer>
    </Box>
  )
}
export default PurchaseList;
rsf-admin/src/page/purchaseItem/PurchaseItemCreate.jsx
@@ -32,7 +32,7 @@
import MemoInput from "../components/MemoInput";
const PurchaseItemCreate = (props) => {
    const { open, setOpen } = props;
    const { open, setOpen, row } = props;
    const translate = useTranslate();
    const notify = useNotify();
@@ -88,7 +88,7 @@
                                    <NumberInput
                                        label="table.field.purchaseItem.purchaseId"
                                        source="purchaseId"
                                        autoFocus
                                        defaultValue={row.poId}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx
@@ -1,36 +1,36 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import { useNavigate, useLocation } from 'react-router-dom';
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
  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';
@@ -43,134 +43,140 @@
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import CustomerTopToolBar from "../components/EditTopToolBar";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
  '& .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 />,
  <SearchInput source="condition" alwaysOn />,
    <NumberInput source="purchaseId" label="table.field.purchaseItem.purchaseId" />,
    <TextInput source="platItemId" label="table.field.purchaseItem.platItemId" />,
    <TextInput source="matnrCode" label="table.field.purchaseItem.matnrCode" />,
    <TextInput source="matnrName" label="table.field.purchaseItem.matnrName" />,
    <TextInput source="unit" label="table.field.purchaseItem.unit" />,
    <NumberInput source="anfme" label="table.field.purchaseItem.anfme" />,
    <NumberInput source="qty" label="table.field.purchaseItem.qty" />,
    <NumberInput source="nromQty" label="table.field.purchaseItem.nromQty" />,
    <NumberInput source="asnQty" label="table.field.purchaseItem.asnQty" />,
    <NumberInput source="printQty" label="table.field.purchaseItem.printQty" />,
    <TextInput source="splrName" label="table.field.purchaseItem.splrName" />,
    <TextInput source="splrCode" label="table.field.purchaseItem.splrCode" />,
    <TextInput source="splrBatch" label="table.field.purchaseItem.splrBatch" />,
  <NumberInput source="purchaseId" label="table.field.purchaseItem.purchaseId" />,
  <TextInput source="platItemId" label="table.field.purchaseItem.platItemId" />,
  <TextInput source="matnrCode" label="table.field.purchaseItem.matnrCode" />,
  <TextInput source="matnrName" label="table.field.purchaseItem.matnrName" />,
  <TextInput source="unit" label="table.field.purchaseItem.unit" />,
  <NumberInput source="anfme" label="table.field.purchaseItem.anfme" />,
  <NumberInput source="qty" label="table.field.purchaseItem.qty" />,
  <NumberInput source="nromQty" label="table.field.purchaseItem.nromQty" />,
  <NumberInput source="asnQty" label="table.field.purchaseItem.asnQty" />,
  <NumberInput source="printQty" label="table.field.purchaseItem.printQty" />,
  <TextInput source="splrName" label="table.field.purchaseItem.splrName" />,
  <TextInput source="splrCode" label="table.field.purchaseItem.splrCode" />,
  <TextInput source="splrBatch" label="table.field.purchaseItem.splrBatch" />,
    <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
    />,
  <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 PurchaseItemList = () => {
    const translate = useTranslate();
  const translate = useTranslate();
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
  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.purchaseItem"}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                filters={filters}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='purchaseItem' />
                        <MyExportButton />
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='purchaseItem'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false}
                    expand={() => <PurchaseItemPanel />}
                    expandSingle={true}
                    omit={['id', 'createTime', 'createBy', 'memo']}
                >
                    <NumberField source="id" />
                    <NumberField source="purchaseId" label="table.field.purchaseItem.purchaseId" />
                    <TextField source="platItemId" label="table.field.purchaseItem.platItemId" />
                    <TextField source="matnrCode" label="table.field.purchaseItem.matnrCode" />
                    <TextField source="matnrName" label="table.field.purchaseItem.matnrName" />
                    <TextField source="unit" label="table.field.purchaseItem.unit" />
                    <NumberField source="anfme" label="table.field.purchaseItem.anfme" />
                    <NumberField source="qty" label="table.field.purchaseItem.qty" />
                    <NumberField source="nromQty" label="table.field.purchaseItem.nromQty" />
                    <NumberField source="asnQty" label="table.field.purchaseItem.asnQty" />
                    <NumberField source="printQty" label="table.field.purchaseItem.printQty" />
                    <TextField source="splrName" label="table.field.purchaseItem.splrName" />
                    <TextField source="splrCode" label="table.field.purchaseItem.splrCode" />
                    <TextField source="splrBatch" label="table.field.purchaseItem.splrBatch" />
  const location = useLocation();
  const queryParams = new URLSearchParams(location.search);
  const poId = queryParams.get("poId");
                    <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>
            <PurchaseItemCreate
                open={createDialog}
                setOpen={setCreateDialog}
            />
            <PageDrawer
                title='PurchaseItem Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
  return (
    <>
      {poId && <CustomerTopToolBar backPrevious={true} />}
      <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.purchaseItem"}
          empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
          filters={filters}
          sort={{ field: "create_time", order: "desc" }}
          actions={(
            <TopToolbar>
              <FilterButton />
              <MyCreateButton onClick={() => { setCreateDialog(true) }} />
              <SelectColumnsButton preferenceKey='purchaseItem' />
              <MyExportButton />
            </TopToolbar>
          )}
          perPage={DEFAULT_PAGE_SIZE}
        >
          <StyledDatagrid
            preferenceKey='purchaseItem'
            bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
            rowClick={(id, resource, record) => false}
            expand={() => <PurchaseItemPanel />}
            expandSingle={true}
            omit={['id', 'createTime', 'createBy', 'memo']}
          >
            <NumberField source="id" />
            <NumberField source="purchaseId" label="table.field.purchaseItem.purchaseId" />
            <TextField source="platItemId" label="table.field.purchaseItem.platItemId" />
            <TextField source="matnrCode" label="table.field.purchaseItem.matnrCode" />
            <TextField source="matnrName" label="table.field.purchaseItem.matnrName" />
            <TextField source="unit" label="table.field.purchaseItem.unit" />
            <NumberField source="anfme" label="table.field.purchaseItem.anfme" />
            <NumberField source="qty" label="table.field.purchaseItem.qty" />
            <NumberField source="nromQty" label="table.field.purchaseItem.nromQty" />
            <NumberField source="asnQty" label="table.field.purchaseItem.asnQty" />
            <NumberField source="printQty" label="table.field.purchaseItem.printQty" />
            <TextField source="splrName" label="table.field.purchaseItem.splrName" />
            <TextField source="splrCode" label="table.field.purchaseItem.splrCode" />
            <TextField source="splrBatch" label="table.field.purchaseItem.splrBatch" />
            <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>
        <PurchaseItemCreate
          open={createDialog}
          setOpen={setCreateDialog}
          row={{ poId }}
        />
        <PageDrawer
          title='PurchaseItem Detail'
          drawerVal={drawerVal}
          setDrawerVal={setDrawerVal}
        >
        </PageDrawer>
      </Box></>
  )
}
export default PurchaseItemList;
rsf-admin/src/page/qlyInspect/QlyInspectCreate.jsx
@@ -100,6 +100,37 @@
                                        parse={v => v}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.qlyInspect.barcode"
                                        source="barcode"
                                        parse={v => v}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.qlyInspect.asnItemId"
                                        source="asnItemId"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.qlyInspect.poItemId"
                                        source="poItemId"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.qlyInspect.safeQty"
                                        source="safeQty"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.qlyInspect.disQty"
                                        source="disQty"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <StatusSelectInput />
rsf-admin/src/page/qlyInspect/QlyInspectEdit.jsx
@@ -79,6 +79,37 @@
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.qlyInspect.barcode"
                                source="barcode"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.qlyInspect.asnItemId"
                                source="asnItemId"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.qlyInspect.poItemId"
                                source="poItemId"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.qlyInspect.safeQty"
                                source="safeQty"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.qlyInspect.disQty"
                                source="disQty"
                            />
                        </Stack>
                    </Grid>
                    <Grid item xs={12} md={4}>
rsf-admin/src/page/qlyInspect/QlyInspectList.jsx
@@ -65,6 +65,11 @@
    <TextInput source="code" label="table.field.qlyInspect.code" />,
    <TextInput source="name" label="table.field.qlyInspect.name" />,
    <TextInput source="barcode" label="table.field.qlyInspect.barcode" />,
    <NumberInput source="asnItemId" label="table.field.qlyInspect.asnItemId" />,
    <NumberInput source="poItemId" label="table.field.qlyInspect.poItemId" />,
    <NumberInput source="safeQty" label="table.field.qlyInspect.safeQty" />,
    <NumberInput source="disQty" label="table.field.qlyInspect.disQty" />,
    <TextInput label="common.field.memo" source="memo" />,
    <SelectInput
@@ -120,6 +125,11 @@
                    <NumberField source="id" />
                    <TextField source="code" label="table.field.qlyInspect.code" />
                    <TextField source="name" label="table.field.qlyInspect.name" />
                    <TextField source="barcode" label="table.field.qlyInspect.barcode" />
                    <NumberField source="asnItemId" label="table.field.qlyInspect.asnItemId" />
                    <NumberField source="poItemId" label="table.field.qlyInspect.poItemId" />
                    <NumberField source="safeQty" label="table.field.qlyInspect.safeQty" />
                    <NumberField source="disQty" label="table.field.qlyInspect.disQty" />
                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                        <TextField source="nickname" />
rsf-admin/src/page/qlyInspect/QlyInspectPanel.jsx
@@ -52,6 +52,36 @@
                                property={record.name}
                            />
                        </Grid>
                        <Grid item xs={6}>
                            <PanelTypography
                                title="table.field.qlyInspect.barcode"
                                property={record.barcode}
                            />
                        </Grid>
                        <Grid item xs={6}>
                            <PanelTypography
                                title="table.field.qlyInspect.asnItemId"
                                property={record.asnItemId}
                            />
                        </Grid>
                        <Grid item xs={6}>
                            <PanelTypography
                                title="table.field.qlyInspect.poItemId"
                                property={record.poItemId}
                            />
                        </Grid>
                        <Grid item xs={6}>
                            <PanelTypography
                                title="table.field.qlyInspect.safeQty"
                                property={record.safeQty}
                            />
                        </Grid>
                        <Grid item xs={6}>
                            <PanelTypography
                                title="table.field.qlyInspect.disQty"
                                property={record.disQty}
                            />
                        </Grid>
                    </Grid>
                </CardContent>
rsf-admin/src/page/system/dicts/dictData/DictDataCreate.jsx
@@ -32,7 +32,7 @@
import MemoInput from "../../../components/MemoInput";
const DictDataCreate = (props) => {
    const { open, setOpen } = props;
    const { open, setOpen, row } = props;
    const translate = useTranslate();
    const notify = useNotify();
@@ -91,6 +91,7 @@
                                        parse={v => v}
                                        autoFocus
                                        validate={required()}
                                        defaultValue={row.dictTypeId}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
@@ -99,6 +100,7 @@
                                        source="dictTypeCode"
                                        parse={v => v}
                                        validate={required()}
                                        defaultValue={row.dictTypeCode}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
@@ -114,7 +116,6 @@
                                        label="table.field.dictData.label"
                                        source="label"
                                        parse={v => v}
                                        validate={required()}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
@@ -123,13 +124,13 @@
                                        source="sort"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                {/* <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.dictData.color"
                                        source="color"
                                        parse={v => v}
                                    />
                                </Grid>
                                </Grid> */}
                                <Grid item xs={6} display="flex" gap={1}>
                                    <StatusSelectInput />
rsf-admin/src/page/system/dicts/dictData/DictDataEdit.jsx
@@ -94,7 +94,6 @@
                                label="table.field.dictData.label"
                                source="label"
                                parse={v => v}
                                validate={required()}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
@@ -103,13 +102,13 @@
                                source="sort"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                        {/* <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.dictData.color"
                                source="color"
                                parse={v => v}
                            />
                        </Stack>
                        </Stack> */}
                    </Grid>
                    <Grid item xs={12} md={4}>
rsf-admin/src/page/system/dicts/dictData/DictDataList.jsx
@@ -70,7 +70,7 @@
    <TextInput source="value" label="table.field.dictData.value" />,
    <TextInput source="label" label="table.field.dictData.label" />,
    <NumberInput source="sort" label="table.field.dictData.sort" />,
    <TextInput source="color" label="table.field.dictData.color" />,
    // <TextInput source="color" label="table.field.dictData.color" />,
    <TextInput label="common.field.memo" source="memo" />,
    <SelectInput
@@ -93,11 +93,7 @@
    const location = useLocation();
    const queryParams = new URLSearchParams(location.search);
    const dictTypeId = queryParams.get('dictTypeId');
    console.log(dictTypeId);
    if (dictTypeId != null && dictTypeId != undefined) {
        console.log(dictTypeId);
        console.log(fit);
    }
    const dictTypeCode = queryParams.get('code');
    return (
        <>
@@ -111,7 +107,7 @@
                            theme.transitions.create(['all'], {
                                duration: theme.transitions.duration.enteringScreen,
                            }),
                        marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                        marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                    }}
                    title={"menu.dictData"}
                    empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
@@ -142,7 +138,7 @@
                        <TextField source="value" label="table.field.dictData.value" />
                        <TextField source="label" label="table.field.dictData.label" />
                        <NumberField source="sort" label="table.field.dictData.sort" />
                        <TextField source="color" label="table.field.dictData.color" />
                        {/* <TextField source="color" label="table.field.dictData.color" /> */}
                        <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                            <TextField source="nickname" />
@@ -163,6 +159,7 @@
                <DictDataCreate
                    open={createDialog}
                    setOpen={setCreateDialog}
                    row={{ dictTypeId, dictTypeCode }}
                />
                <PageDrawer
                    title='DictData Detail'
rsf-admin/src/page/system/dicts/dictType/DictTypeCreate.jsx
@@ -84,7 +84,7 @@
                        </DialogTitle>
                        <DialogContent sx={{ mt: 2 }}>
                            <Grid container rowSpacing={2} columnSpacing={2}>
                            <Grid item xs={6} display="flex" gap={1}>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.dictType.code"
                                        source="code"
@@ -96,6 +96,7 @@
                                        label="table.field.dictType.name"
                                        source="name"
                                        parse={v => v}
                                        validate={required()}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
rsf-admin/src/page/system/dicts/dictType/DictTypeList.jsx
@@ -87,7 +87,7 @@
    const navigate = useNavigate();
    const assign = (record) => {
        navigate(`/dictData?dictTypeId=${record.id}`);
        navigate(`/dictData?dictTypeId=${record.id}&code=${record.code}`);
    }
    return (
@@ -99,7 +99,7 @@
                        theme.transitions.create(['all'], {
                            duration: theme.transitions.duration.enteringScreen,
                        }),
                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                }}
                title={"menu.dictType"}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
rsf-admin/src/page/system/operationRecord/OperationRecordList.jsx
@@ -43,6 +43,7 @@
import rowSx from './rowSx';
import { format } from 'date-fns';
import OperationDetail from './OperationDetail'
import { width } from "@mui/system";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
@@ -122,7 +123,7 @@
                        theme.transitions.create(['all'], {
                            duration: theme.transitions.duration.enteringScreen,
                        }),
                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                    marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                }}
                title={"menu.operation"}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
rsf-admin/src/page/system/serialRule/SerialRuleDetail.jsx
@@ -54,8 +54,6 @@
    });
  };
  console.log(SerialRuleItem);
  return (
    <>
      <Dialog