verou
2025-03-11 8c2c1c08526015c310a4687e9afc876c6c550ff0
fix:po order
11个文件已修改
4324 ■■■■ 已修改文件
rsf-admin/src/config/MyDataProvider.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/core/chineseMessages.js 412 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js 1073 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 1056 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrder/AsnOrderList.jsx 380 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrderItem/AsnOrderItemList.jsx 406 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/MyCreateButton.jsx 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/MyExportButton.jsx 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/purchase/PurchaseList.jsx 365 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/purchaseItem/PurchaseItemList.jsx 384 ●●●●● 补丁 | 查看 | 原始文档 | 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
@@ -1,544 +1,565 @@
import englishMessages from 'ra-language-english';
import englishMessages from "ra-language-english";
const customEnglishMessages = {
    ...englishMessages,
    hello: 'Hello World',
    common: {
        response: {
            success: "Success",
            fail: "Fail",
            dataError: "Submit data was error, Please check",
        },
        field: {
            id: 'ID',
            uuid: 'uuid',
            name: 'name',
            createTime: 'create time',
            createBy: 'create by',
            updateTime: 'update time',
            updateBy: 'update by',
            status: 'status',
            memoWrap: 'memo wrap',
            memo: 'memo',
            opt: 'operate',
        },
        list: {
            empty: {
                tip: 'No data to display',
            }
        },
        edit: {
            title: {
                main: 'Main',
                common: 'Common',
                changePwd: 'Change Password',
            },
            side: {
                title: 'More Info'
            }
        },
  ...englishMessages,
  hello: "Hello World",
  common: {
    response: {
      success: "Success",
      fail: "Fail",
      dataError: "Submit data was error, Please check",
    },
    field: {
      id: "ID",
      uuid: "uuid",
      name: "name",
      createTime: "create time",
      createBy: "create by",
      updateTime: "update time",
      updateBy: "update by",
      status: "status",
      memoWrap: "memo wrap",
      memo: "memo",
      opt: "operate",
    },
    list: {
      empty: {
        tip: "No data to display",
      },
    },
    edit: {
      title: {
        main: "Main",
        common: "Common",
        changePwd: "Change Password",
      },
      side: {
        title: "More Info",
      },
    },
    enums: {
      statusTrue: "Enable",
      statusFalse: "Disable",
      true: "Yes",
      false: "No",
    },
    time: {
      after: "Time After",
      before: "Time Before",
    },
    action: {
      reset: "Reset",
      expand: "Expand",
      expandAll: "Expand All",
      collapse: "Collapse",
      collapseAll: "Collapse All",
      scope: "Assign",
      import: {
        title: "Import",
        stop: "Stop import",
        msg: "Here is a sample CSV file you can use as a template",
        tips: "The import is running, please do not close this tab.",
        err: "Failed to import this file, please make sure your provided a valid CSV file.",
        download: "Download Import Template",
        result:
          "Contacts import complete. Imported %{success} success, with %{error} errors",
      },
      loadMore: "Load More Data",
      complete: "Complete",
      deprecate: "Deprecate",
      resend: "RESEND",
      selected: "selected",
    },
    msg: {
      confirm: {
        tip: "Tip",
        desc: "Are you sure you want to proceed?",
      },
      placeholder: "Please enter your search content",
    },
  },
  filters: {
    lastCreated: "Last created",
    today: "Today",
    thisWeek: "This week",
    lastWeek: "Last week",
    thisMonth: "This month",
    lastMonth: "Last month",
    earlier: "Earlier...",
  },
  validate: {
    pwdMisMatch: "The password confirmation is not the same as the password.",
  },
  settings: {
    base: "Base",
    security: "Security",
  },
  create: {
    title: "Create",
    empty: {
      title: "Data Empty",
      desc: "Please Create Data First",
      button: "Create Data",
    },
  },
  update: {
    title: "Update",
  },
  menu: {
    dashboard: "Dashboard",
    basicInfo: "BasicInfo",
    settings: "Settings",
    basicInfo: "BasicInfo",
    system: "System",
    user: "User",
    role: "Role",
    menu: "Menu",
    host: "Host",
    department: "Department",
    token: "Token",
    operation: "Operation",
    config: "Config",
    tenant: "Tenant",
    userLogin: "Token",
    customer: "Customer",
    shipper: "shipper",
    matnr: "Matnr",
    matnrGroup: "MatnrGroup",
    warehouse: "Warehouse",
    warehouseAreas: "WarehouseAreas",
    loc: "Loc",
    container: "Container",
    contract: "Contract",
    qlyInspect: "QlyInspect",
    dictType: "DictType",
    dictData: "DictData",
    companys: "Companys",
    serialRuleItem: "SerialRuleItem",
    serialRule: "SerialRule",
    asnOrder: "AsnOrder",
    asnOrderItem: "AsnOrderItem",
    purchase: "Purchase",
    purchaseItem: "PurchaseItem",
    whMat: "Warehouse Mat",
  },
  table: {
    field: {
      host: {},
      config: {
        uuid: "uuid",
        name: "name",
        flag: "flag",
        val: "val",
        content: "content",
        type: "type",
      },
      tenant: {
        name: "name",
        flag: "flag",
        root: "root",
      },
      role: {
        name: "name",
        code: "code",
      },
      userLogin: {
        userId: "user",
        token: "token",
        ip: "ip",
        type: "type",
        system: "system",
      },
      dept: {
        name: "name",
        parentId: "parent id",
        parentName: "higher",
        path: "path",
        pathName: "path name",
        fullName: "full name",
        brief: "brief",
        code: "code",
        type: "type",
        leader: "leader",
        count: "count",
        sort: "sort",
      },
      menu: {
        name: "name",
        parentId: "parent id",
        parentName: "higher",
        path: "path",
        pathName: "pathName",
        route: "route",
        component: "component",
        brief: "brief",
        code: "code",
        type: "type",
        authority: "authority",
        icon: "icon",
        sort: "sort",
        meta: "meta",
        enums: {
            statusTrue: 'Enable',
            statusFalse: 'Disable',
            true: 'Yes',
            false: 'No',
          menu: "Menu",
          button: "Button",
        },
        time: {
            after: 'Time After',
            before: 'Time Before'
      },
      user: {
        username: "username",
        password: "password",
        confirmPwd: "confirm password",
        nickname: "nickname",
        avatar: "avatar",
        code: "code",
        sex: "sex",
        phone: "phone",
        email: "email",
        emailVerified: "email verified",
        deptId: "department",
        realName: "real name",
        idCard: "idCard",
        birthday: "birthday",
        introduction: "introduction",
        role: "role",
        sexes: {
          male: "Male",
          female: "Female",
          unknown: "Unknown",
        },
        action: {
            reset: 'Reset',
            expand: 'Expand',
            expandAll: 'Expand All',
            collapse: 'Collapse',
            collapseAll: 'Collapse All',
            scope: 'Assign',
            import: {
                title: 'Import',
                stop: 'Stop import',
                msg: 'Here is a sample CSV file you can use as a template',
                tips: 'The import is running, please do not close this tab.',
                err: 'Failed to import this file, please make sure your provided a valid CSV file.',
                download: 'Download Import Template',
                result: 'Contacts import complete. Imported %{success} success, with %{error} errors',
            },
            loadMore: 'Load More Data',
            complete: 'Complete',
            deprecate: 'Deprecate',
            resend: 'RESEND',
            selected: 'selected',
        },
        msg: {
            confirm: {
                tip: 'Tip',
                desc: 'Are you sure you want to proceed?',
            },
            placeholder: 'Please enter your search content',
        },
      },
      operationRecord: {
        namespace: "namespace",
        url: "url",
        appkey: "appkey",
        timestamp: "timestamp",
        clientIp: "client ip",
        request: "request",
        response: "response",
        spendTime: "spend time",
        err: "error",
        result: "result",
        userId: "user",
      },
      customer: {
        uuid: "uuid",
        name: "name",
      },
      shipper: {
        uuid: "uuid",
        name: "name",
      },
      matnr: {
        name: "name",
        code: "code",
        shipperId: "shipperId",
        groupId: "groupId",
        rglarId: "RegularId",
        erpCode: "erpCode",
        spec: "spec",
        model: "model",
        weight: "weight",
        color: "color",
        size: "size",
        describle: "describle",
        nromNum: "nromNum",
        unit: "unit",
        purUnit: "purchaseUnit",
        stockUnit: "stockUnit",
        stockLevel: "stockLeval",
        isLabelMange: "isLabelMange",
        safeQty: "safetyQty",
        minQty: "minQty",
        maxQty: "maxQty",
        stagn: "stagnate",
        valid: "validity",
        validWarn: "validityWarn",
        flagCheck: "flagCheck",
      },
      matnrGroup: {
        name: "name",
        code: "code",
        parentId: "parentId",
      },
      warehouse: {
        name: "name",
        code: "code",
        factory: "factory",
        address: "address",
        longitude: "longitude",
        latgitude: "latgitude",
        length: "length",
        width: "width",
        height: "height",
      },
      warehouseAreas: {
        uuid: "uuid",
        name: "name",
        code: "code",
        shipperId: "shipperId",
        supplierId: "supplierId",
        flagMinus: "flagMinus",
        flagLabelMange: "flagLabelMange",
        flagMix: "flagMix",
      },
      loc: {
        warehouseId: "Warehouse",
        areaId: "Area",
        code: "Code",
        type: "Type",
        name: "Name",
        flagLogic: "FlagLogic",
        fucAtrrs: "FucAtrrs",
        barcode: "Barcode",
        unit: "Unit",
        size: "Size",
        row: "Row",
        col: "Col",
        lev: "Lev",
        channel: "Channel",
        maxParts: "MaxParts",
        maxPack: "MaxPack",
        flagLabelMange: "FlagLabelMange",
        locAttrs: "LocAttrs",
      },
      container: {
        code: "Code",
        name: "Name",
        typeId: "TypeId",
        used: "Used",
        lenght: "Lenght",
        width: "Width",
        height: "Height",
        rstLen: "RstLen",
        rstWid: "RstWid",
        rstWei: "RstWei",
        rstHei: "RstHei",
        panrentId: "PanrentId",
        vaildTime: "VaildTime",
        flagRycle: "FlagRycle",
        flagLogic: "FlagLogic",
      },
      contract: {
        code: "Code",
        name: "Name",
        projectName: "ProjectName",
      },
      qlyInspect: {
        code: "Code",
        name: "Name",
      },
      dictType: {
        code: "Code",
        name: "Name",
        description: "Description",
      },
      dictData: {
        dictTypeId: "dictTypeId",
        dictTypeCode: "dictTypeCode",
        value: "value",
        label: "label",
        sort: "sort",
        color: "color",
      },
      companys: {
        code: "Code",
        name: "Name",
        nameEn: "NameEn",
        breifCode: "BreifCode",
        type: "Type",
        contact: "Contact",
        tel: "Tel",
        email: "Email",
        pcode: "PCode",
        province: "Province",
        city: "City",
        address: "Address",
      },
      serialRuleItem: {
        ruleId: "ruleId",
        wkType: "wkType",
        feildValue: "feildValue",
        len: "len",
        lenStr: "lenStr",
        sort: "sort",
      },
      serialRule: {
        code: "code",
        name: "name",
        delimit: "delimit",
        reset: "reset",
        resetDep: "resetDep",
        currValue: "currValue",
        lastCode: "lastCode",
      },
      whMat: {
        matnrCode: "matnrCode",
        matnrName: "matnrName",
        matnrGroupId: "matnrGroupId",
        spec: "spec",
        color: "color",
        size: "size",
        minWeight: "minWeight",
        maxWeight: "maxWeight",
      },
      asnOrder: {
        code: "Code",
        poCode: "poCode",
        poId: "poId",
        type: "Type",
        wkType: "wkType",
        anfme: "anfme",
        qty: "qty",
        logisNo: "logisNo",
        arrTime: "Arrived",
        rleStatus: "Release",
        ntyStatus: "Notify",
      },
      asnOrderItem: {
        asnId: "asnId",
        asnCode: "asnCode",
        poDetlId: "poDetlId",
        poDetlCode: "poDetlCode",
        matnrId: "matnrId",
        matnk: "matnk",
        anfme: "anfme",
        stockUnit: "stockUnit",
        purQty: "purQty",
        purUnit: "purUnit",
        qty: "qty",
        splrCode: "splrCode",
        splrName: "splrName",
        qrcode: "qrcode",
        barcode: "barcode",
        packName: "packName",
        ntyStatus: "ntyStatus",
      },
      purchaseItem: {
        purchaseId: "purchaseId",
        erpItemId: "erpItemId",
        matnrCode: "matnrCode",
        matnrName: "matnrName",
        unit: "unit",
        anfme: "anfme",
        qty: "qty",
        nromQty: "nromQty",
        asnQty: "asnQty",
        printQty: "printQty",
        splrName: "splrName",
        splrCode: "splrCode",
        splrBatch: "splrBatch",
      },
      purchase: {
        code: "code",
        erpId: "erpId",
        type: "type",
        wkType: "wkType",
        source: "source",
        preArr: "preArr",
        anfme: "anfme",
        qty: "qty",
        workQty: "workQty",
        channel: "channel",
        erpCode: "erpCode",
        project: "project",
        startTime: "startTime",
        endTime: "endTime",
      },
      purchaseItem: {
        purchaseId: "purchaseId",
        erpItemId: "erpItemId",
        matnrCode: "matnrCode",
        matnrName: "matnrName",
        unit: "unit",
        anfme: "anfme",
        qty: "qty",
        nromQty: "nromQty",
        asnQty: "asnQty",
        printQty: "printQty",
        splrName: "splrName",
        splrCode: "splrCode",
        splrBatch: "splrBatch",
      },
    },
    filters: {
        lastCreated: 'Last created',
        today: 'Today',
        thisWeek: 'This week',
        lastWeek: 'Last week',
        thisMonth: 'This month',
        lastMonth: 'Last month',
        earlier: 'Earlier...',
  },
  page: {
    welcome: {
      index: "    Welcome to the RSF Management System.",
      tech: "    Technology stack: Java 17, SpringBoot2.5.3, Mybatis-plus_3.4.1, Spring Security, Druid 1.2.6, Redis, Mysql5.7, Node18, ReactJs, Material UI5.16, Axios, React-Admin5.1",
    },
    validate: {
        pwdMisMatch: 'The password confirmation is not the same as the password.'
    login: {
      title: "Welcome",
      footer: "Footer Goes Here",
      tenant: "Company",
      email: "Email Address",
      username: "Username",
      password: "Password",
      confirmPwd: "Confirm Password",
      code: "Verification Code",
      tab: {
        login: "SIGN IN",
        register: "SIGN UP",
      },
      button: {
        login: "SIGN IN",
        register: "SIGN UP",
        code: "Send Code",
      },
    },
    settings: {
        base: 'Base',
        security: 'Security',
      resetPwd: {
        currPwd: "Current Password",
        newPwd: "New Password",
        confirmNewPwd: "Confirm Password",
        resetBtn: "Reset",
        tip: {
          usernameLimit:
            "Only 3-20 English letters or numbers are allowed. No special characters.",
          pwdInputLimit:
            "New Password must be 6-13 characters long and include both letters and numbers.",
          pwdNotSameAsOld:
            "New Password cannot be the same as the Current Password.",
          pwdNotMatch: "New Password and Confirm Password do not match.",
        },
      },
    },
    create: {
        title: 'Create',
        empty: {
            title: 'Data Empty',
            desc: 'Please Create Data First',
            button: 'Create Data',
    tenant: {
      create: {
        title: {
          basic: "Basic Information",
          root: "Add Administrator",
          confirm: "Confirm",
        },
        btn: {
          next: "Next Step",
          back: "Back Step",
        },
        tip: {
          onlyEn: "Only 3-20 English letters are allowed.",
        },
      },
    },
    update: {
        title: 'Update'
    matnr: {
      title: {
        basic: "basic info",
        control: "control",
        batchRole: "batch role",
      },
    },
    menu: {
        dashboard: 'Dashboard',
        basicInfo: 'BasicInfo',
        settings: 'Settings',
        basicInfo: 'BasicInfo',
        system: 'System',
        user: 'User',
        role: 'Role',
        menu: 'Menu',
        host: 'Host',
        department: 'Department',
        token: 'Token',
        operation: 'Operation',
        config: 'Config',
        tenant: 'Tenant',
        userLogin: 'Token',
        customer: 'Customer',
        shipper: 'shipper',
        matnr: 'Matnr',
        matnrGroup: 'MatnrGroup',
        warehouse: 'Warehouse',
        warehouseAreas: 'WarehouseAreas',
        loc: 'Loc',
        container: 'Container',
        contract: 'Contract',
        qlyInspect: 'QlyInspect',
        dictType: 'DictType',
        dictData: 'DictData',
        companys: 'Companys',
        serialRuleItem: 'SerialRuleItem',
        serialRule: 'SerialRule',
        asnOrder: 'AsnOrder',
        asnOrderItem: 'AsnOrderItem',
        purchase: 'Purchase',
        purchaseItem: 'PurchaseItem',
        whMat: 'Warehouse Mat',
    whMat: {
      title: {
        add: "add",
      },
    },
    table: {
        field: {
            host: {
            },
            config: {
                uuid: "uuid",
                name: "name",
                flag: "flag",
                val: "val",
                content: "content",
                type: "type",
            },
            tenant: {
                name: "name",
                flag: "flag",
                root: "root",
            },
            role: {
                name: "name",
                code: "code",
            },
            userLogin: {
                userId: "user",
                token: "token",
                ip: "ip",
                type: "type",
                system: "system",
            },
            dept: {
                name: "name",
                parentId: "parent id",
                parentName: "higher",
                path: "path",
                pathName: "path name",
                fullName: "full name",
                brief: "brief",
                code: "code",
                type: "type",
                leader: "leader",
                count: "count",
                sort: "sort",
            },
            menu: {
                name: "name",
                parentId: "parent id",
                parentName: "higher",
                path: "path",
                pathName: "pathName",
                route: "route",
                component: "component",
                brief: "brief",
                code: "code",
                type: "type",
                authority: "authority",
                icon: "icon",
                sort: "sort",
                meta: "meta",
                enums: {
                    menu: 'Menu',
                    button: 'Button',
                }
            },
            user: {
                username: "username",
                password: "password",
                confirmPwd: "confirm password",
                nickname: "nickname",
                avatar: "avatar",
                code: "code",
                sex: "sex",
                phone: "phone",
                email: "email",
                emailVerified: "email verified",
                deptId: "department",
                realName: "real name",
                idCard: "idCard",
                birthday: "birthday",
                introduction: "introduction",
                role: "role",
                sexes: {
                    male: 'Male',
                    female: 'Female',
                    unknown: 'Unknown',
                }
            },
            operationRecord: {
                namespace: "namespace",
                url: "url",
                appkey: "appkey",
                timestamp: "timestamp",
                clientIp: "client ip",
                request: "request",
                response: "response",
                spendTime: "spend time",
                err: "error",
                result: "result",
                userId: "user",
            },
            customer: {
                uuid: "uuid",
                name: "name",
            },
            shipper: {
                uuid: "uuid",
                name: "name",
            },
            matnr: {
                name: "name",
                code: "code",
                shipperId: "shipperId",
                groupId: "groupId",
                rglarId: "RegularId",
                platCode: "platCode",
                spec: "spec",
                model: "model",
                weight: "weight",
                color: "color",
                size: "size",
                describle: "describle",
                nromNum: "nromNum",
                unit: "unit",
                purUnit: "purchaseUnit",
                stockUnit: "stockUnit",
                stockLevel: "stockLeval",
                isLabelMange: "isLabelMange",
                safeQty: "safetyQty",
                minQty: "minQty",
                maxQty: "maxQty",
                stagn: "stagnate",
                valid: "validity",
                validWarn: "validityWarn",
                flagCheck: "flagCheck",
            },
            matnrGroup: {
                name: "name",
                code: "code",
                parentId: "parentId",
            },
            warehouse: {
                name: "name",
                code: "code",
                factory: "factory",
                address: "address",
                longitude: "longitude",
                latgitude: "latgitude",
                length: "length",
                width: "width",
                height: "height",
            },
            warehouseAreas: {
                uuid: "uuid",
                name: "name",
                code: "code",
                shipperId: "shipperId",
                supplierId: "supplierId",
                flagMinus: "flagMinus",
                flagLabelMange: "flagLabelMange",
                flagMix: "flagMix",
            },
            loc: {
                warehouseId: "Warehouse",
                areaId: "Area",
                code: "Code",
                type: "Type",
                name: "Name",
                flagLogic: "FlagLogic",
                fucAtrrs: "FucAtrrs",
                barcode: "Barcode",
                unit: "Unit",
                size: "Size",
                row: "Row",
                col: "Col",
                lev: "Lev",
                channel: "Channel",
                maxParts: "MaxParts",
                maxPack: "MaxPack",
                flagLabelMange: "FlagLabelMange",
                locAttrs: "LocAttrs",
            },
            container: {
                code: "Code",
                name: "Name",
                typeId: "TypeId",
                used: "Used",
                lenght: "Lenght",
                width: "Width",
                height: "Height",
                rstLen: "RstLen",
                rstWid: "RstWid",
                rstWei: "RstWei",
                rstHei: "RstHei",
                panrentId: "PanrentId",
                vaildTime: "VaildTime",
                flagRycle: "FlagRycle",
                flagLogic: "FlagLogic",
            },
            contract: {
                code: "Code",
                name: "Name",
                projectName: "ProjectName",
            },
            qlyInspect: {
                code: "Code",
                name: "Name",
            },
            dictType: {
                code: "Code",
                name: "Name",
                description: "Description",
            },
            dictData: {
                dictTypeId: "dictTypeId",
                dictTypeCode: "dictTypeCode",
                value: "value",
                label: "label",
                sort: "sort",
                color: "color",
            },
            companys: {
                code: "Code",
                name: "Name",
                nameEn: "NameEn",
                breifCode: "BreifCode",
                type: "Type",
                contact: "Contact",
                tel: "Tel",
                email: "Email",
                pcode: "PCode",
                province: "Province",
                city: "City",
                address: "Address",
            },
            serialRuleItem: {
                ruleId: "ruleId",
                wkType: "wkType",
                feildValue: "feildValue",
                len: "len",
                lenStr: "lenStr",
                sort: "sort",
            },
            serialRule: {
                code: "code",
                name: "name",
                delimit: "delimit",
                reset: "reset",
                resetDep: "resetDep",
                currValue: "currValue",
                lastCode: "lastCode",
            },
            whMat: {
                matnrCode: "matnrCode",
                matnrName: "matnrName",
                matnrGroupId: "matnrGroupId",
                spec: "spec",
                color: "color",
                size: "size",
                minWeight: "minWeight",
                maxWeight: "maxWeight",
            },
            asnOrder: {
                code: "Code",
                poCode: "poCode",
                poId: "poId",
                type: "Type",
                wkType: "wkType",
                anfme: "anfme",
                qty: "qty",
                logisNo: "logisNo",
                arrTime: "Arrived",
                rleStatus: "Release",
                ntyStatus: "Notify",
            },
            asnOrderItem: {
                asnId: "asnId",
                asnCode: "asnCode",
                poDetlId: "poDetlId",
                poDetlCode: "poDetlCode",
                matnrId: "matnrId",
                matnk: "matnk",
                anfme: "anfme",
                stockUnit: "stockUnit",
                purQty: "purQty",
                purUnit: "purUnit",
                qty: "qty",
                splrCode: "splrCode",
                splrName: "splrName",
                qrcode: "qrcode",
                barcode: "barcode",
                packName: "packName",
                ntyStatus: "ntyStatus",
            },
            purchase: {
                code: "code",
                platId: "PlatId",
                type: "type",
                wkType: "wkType",
                source: "source",
                preArr: "preArr",
                anfme: "anfme",
                qty: "qty",
                workQty: "workQty",
                channel: "channel",
                platCode: "platCode",
                project: "project",
                startTime: "startTime",
                endTime: "endTime",
            },
            purchaseItem: {
                purchaseId: "purchaseId",
                platItemId: "erpItemId",
                matnrCode: "matnrCode",
                matnrName: "matnrName",
                unit: "unit",
                anfme: "anfme",
                qty: "qty",
                nromQty: "nromQty",
                asnQty: "asnQty",
                printQty: "printQty",
                splrName: "splrName",
                splrCode: "splrCode",
                splrBatch: "splrBatch",
            },
        }
  },
  form: {
    matnr: {
      shipper: "shipper is required",
      groupId: "groupId is required",
    },
    page: {
        welcome: {
            index: '    Welcome to the RSF Management System.',
            tech: '    Technology stack: Java 17, SpringBoot2.5.3, Mybatis-plus_3.4.1, Spring Security, Druid 1.2.6, Redis, Mysql5.7, Node18, ReactJs, Material UI5.16, Axios, React-Admin5.1'
        },
        login: {
            title: 'Welcome',
            footer: 'Footer Goes Here',
            tenant: 'Company',
            email: 'Email Address',
            username: 'Username',
            password: 'Password',
            confirmPwd: 'Confirm Password',
            code: 'Verification Code',
            tab: {
                login: 'SIGN IN',
                register: 'SIGN UP',
            },
            button: {
                login: 'SIGN IN',
                register: 'SIGN UP',
                code: 'Send Code',
            },
        },
        settings: {
            resetPwd: {
                currPwd: 'Current Password',
                newPwd: 'New Password',
                confirmNewPwd: 'Confirm Password',
                resetBtn: 'Reset',
                tip: {
                    usernameLimit: 'Only 3-20 English letters or numbers are allowed. No special characters.',
                    pwdInputLimit: "New Password must be 6-13 characters long and include both letters and numbers.",
                    pwdNotSameAsOld: "New Password cannot be the same as the Current Password.",
                    pwdNotMatch: "New Password and Confirm Password do not match.",
                }
            }
        },
        tenant: {
            create: {
                title: {
                    basic: 'Basic Information',
                    root: 'Add Administrator',
                    confirm: 'Confirm',
                },
                btn: {
                    next: 'Next Step',
                    back: 'Back Step',
                },
                tip: {
                    onlyEn: 'Only 3-20 English letters are allowed.'
                },
            },
        },
        matnr: {
            title: {
                basic: 'basic info',
                control: 'control',
                batchRole: 'batch role',
            }
        },
        whMat: {
            title: {
                add: 'add',
            }
        },
    },
    form: {
        matnr: {
            shipper: 'shipper is required',
            groupId: 'groupId is required',
        }
    }
  },
  toolbar: {
    inspection: "Inspection",
    creatcode: "creatcode",
  },
};
export default customEnglishMessages;
rsf-admin/src/i18n/zh.js
@@ -1,546 +1,548 @@
import chineseMessages from "./core/chineseMessages";
const customChineseMessages = {
    ...chineseMessages,
    hello: '你好世界',
    common: {
        response: {
            success: "操作成功",
            fail: "服务器错误",
            dataError: "数据错误,请仔细检查",
        },
        field: {
            id: 'ID',
            uuid: '编号',
            name: '名称',
            createTime: '添加时间',
            createBy: '添加人员',
            updateTime: '修改时间',
            updateBy: '修改人员',
            status: '状态',
            memoWrap: '显示备注',
            memo: '备注',
            opt: '操作',
        },
        list: {
            empty: {
                tip: '没有可显示数据',
            }
        },
        edit: {
            title: {
                main: '主要',
                common: '通用',
                changePwd: '重置密码',
            },
            side: {
                title: '更多'
            }
        },
  ...chineseMessages,
  hello: "你好世界",
  common: {
    response: {
      success: "操作成功",
      fail: "服务器错误",
      dataError: "数据错误,请仔细检查",
    },
    field: {
      id: "ID",
      uuid: "编号",
      name: "名称",
      createTime: "添加时间",
      createBy: "添加人员",
      updateTime: "修改时间",
      updateBy: "修改人员",
      status: "状态",
      memoWrap: "显示备注",
      memo: "备注",
      opt: "操作",
    },
    list: {
      empty: {
        tip: "没有可显示数据",
      },
    },
    edit: {
      title: {
        main: "主要",
        common: "通用",
        changePwd: "重置密码",
      },
      side: {
        title: "更多",
      },
    },
    enums: {
      statusTrue: "正常",
      statusFalse: "禁用",
      true: "是",
      false: "否",
    },
    time: {
      after: "开始时间",
      before: "结束时间",
    },
    action: {
      reset: "重置",
      expand: "展开",
      expandAll: "全部展开",
      collapse: "折叠",
      collapseAll: "全部折叠",
      scope: "权限",
      import: {
        title: "导入",
        stop: "停止导入",
        msg: "这是一个可以用作模板的示例 CSV 文件",
        tips: "正在导入中,请不要关闭此窗口",
        err: "无法导入此文件,请确保您提供了有效的 CSV 文件",
        download: "下载导入模板",
        result: "导入完成。已导入 %{success} 成功, 和 %{error} 失败",
      },
      loadMore: "加载更多",
      complete: "完成",
      deprecate: "废弃",
      resend: "重发",
      selected: "项选中",
    },
    msg: {
      confirm: {
        tip: "提示",
        desc: "您确定要执行此操作吗?",
      },
      placeholder: "请输入搜索内容",
    },
  },
  filters: {
    lastCreated: "最近创建",
    today: "今天",
    thisWeek: "本周",
    lastWeek: "上周",
    thisMonth: "本月",
    lastMonth: "上月",
    earlier: "更早...",
  },
  validate: {
    pwdMisMatch: "密码不一致",
  },
  settings: {
    base: "基本设置",
    security: "安全设置",
  },
  create: {
    title: "添加",
    empty: {
      title: "暂无数据",
      desc: "请先添加数据",
      button: "添加数据",
    },
  },
  update: {
    title: "修改",
  },
  menu: {
    dashboard: "控制台",
    settings: "个人设置",
    basicInfo: "基础信息",
    system: "系统设置",
    user: "用户管理",
    role: "角色管理",
    menu: "菜单管理",
    host: "机构管理",
    department: "部门管理",
    token: "登录日志",
    operation: "操作日志",
    config: "配置参数",
    tenant: "租户管理",
    userLogin: "登录日志",
    customer: "客户表",
    shipper: "货主信息",
    matnr: "物料表",
    matnrGroup: "物料分组",
    warehouse: "仓库信息",
    warehouseAreas: "仓库库区",
    loc: "基础库位",
    container: "容器管理",
    contract: "合同信息",
    qlyInspect: "质检信息",
    dictType: "数据字典",
    dictData: "字典数据集",
    companys: "往来企业",
    serialRuleItem: "编码规则子表",
    serialRule: "编码规则",
    asnOrder: "收货通知单",
    asnOrderItem: "收货明细",
    purchase: "PO单",
    purchaseItem: "PO单明细",
    whMat: "库区物料关系",
  },
  table: {
    field: {
      host: {},
      config: {
        uuid: "编号",
        name: "配置名",
        flag: "标识 (EN) ",
        val: "配置值",
        content: "配置内容",
        type: "数据类型",
      },
      tenant: {
        name: "租户名",
        flag: "代码",
        root: "管理员",
      },
      role: {
        name: "角色名称",
        code: "角色标识",
      },
      userLogin: {
        userId: "用户",
        token: "token",
        ip: "ip",
        type: "类型",
        system: "系统",
      },
      dept: {
        name: "部门名称",
        parentId: "上级部门ID",
        parentName: "上级部门",
        path: "路径",
        pathName: "路径名",
        fullName: "全称",
        brief: "简述",
        code: "标识",
        type: "类型",
        leader: "负责人",
        count: "数量",
        sort: "排序",
      },
      menu: {
        name: "菜单名称",
        parentId: "上级菜单ID",
        parentName: "上级菜单",
        path: "路径",
        pathName: "路径名",
        route: "路由地址",
        component: "组件",
        brief: "简述",
        code: "标识",
        type: "类型",
        authority: "鉴权",
        icon: "图标",
        sort: "排序",
        meta: "元",
        enums: {
            statusTrue: '正常',
            statusFalse: '禁用',
            true: '是',
            false: '否',
          menu: "菜单",
          button: "按钮",
        },
        time: {
            after: '开始时间',
            before: '结束时间'
      },
      user: {
        username: "账号",
        password: "密码",
        confirmPwd: "确认密码",
        nickname: "昵称",
        avatar: "头像",
        code: "代号",
        sex: "性别",
        phone: "联系方式",
        email: "邮箱",
        emailVerified: "邮箱验证",
        deptId: "部门",
        realName: "真实姓名",
        idCard: "身份证",
        birthday: "生日",
        introduction: "简介",
        role: "角色",
        sexes: {
          male: "男性",
          female: "女性",
          unknown: "未知",
        },
        action: {
            reset: '重置',
            expand: '展开',
            expandAll: '全部展开',
            collapse: '折叠',
            collapseAll: '全部折叠',
            scope: '权限',
            import: {
                title: '导入',
                stop: '停止导入',
                msg: '这是一个可以用作模板的示例 CSV 文件',
                tips: '正在导入中,请不要关闭此窗口',
                err: '无法导入此文件,请确保您提供了有效的 CSV 文件',
                download: '下载导入模板',
                result: '导入完成。已导入 %{success} 成功, 和 %{error} 失败',
            },
            loadMore: '加载更多',
            complete: '完成',
            deprecate: '废弃',
            resend: '重发',
            selected: '项选中',
        },
        msg: {
            confirm: {
                tip: '提示',
                desc: '您确定要执行此操作吗?',
            },
            placeholder: '请输入搜索内容',
        },
      },
      operationRecord: {
        namespace: "命名空间",
        url: "url",
        appkey: "密钥",
        timestamp: "时间戳",
        clientIp: "客户端IP",
        request: "请求内容",
        response: "响应内容",
        spendTime: "花费时间",
        err: "错误信息",
        result: "result",
        userId: "操作用户",
      },
      customer: {
        uuid: "编号",
        name: "客户名",
      },
      shipper: {
        uuid: "编码",
        name: "名称",
      },
      matnr: {
        name: "物料名称",
        code: "物料编码",
        shipperId: "货主标识",
        groupId: "分组标识",
        rglarId: "批次规则标识",
        erpCode: "ERP编码",
        spec: "规格",
        model: "型号",
        weight: "重量",
        color: "颜色",
        size: "尺寸",
        describle: "描述",
        nromNum: "标包数量",
        unit: "单位",
        purUnit: "采购单位",
        stockUnit: "库存单位",
        stockLevel: "ABC分类",
        isLabelMange: "标签管理",
        safeQty: "安全值",
        minQty: "最小值",
        maxQty: "最大值",
        stagn: "停滞预警值",
        valid: "保质期",
        validWarn: "效期预警",
        flagCheck: "免检",
      },
      matnrGroup: {
        name: "名称",
        code: "编码",
        parentId: "父类标识",
      },
      warehouse: {
        name: "名称",
        code: "编码",
        factory: "工厂",
        address: "地址",
        longitude: "经度",
        latgitude: "纬度",
        length: "长",
        width: "宽",
        height: "高",
      },
      warehouseAreas: {
        uuid: "唯一编码",
        name: "名称",
        code: "编码",
        shipperId: "货主",
        supplierId: "供应商",
        flagMinus: "允许负库存",
        flagLabelMange: "标签管理",
        flagMix: "混放",
      },
      loc: {
        warehouseId: "仓库",
        areaId: "库区",
        code: "编码",
        type: "类型",
        name: "名称",
        flagLogic: "虚拟库位",
        fucAtrrs: "功能属性",
        barcode: "容器码",
        unit: "单位",
        size: "长/宽/高",
        row: "排",
        col: "列",
        lev: "层",
        channel: "通道",
        maxParts: "最大零件数",
        maxPack: "最大包装数",
        flagLabelMange: "标签管理",
        locAttrs: "属性",
      },
      container: {
        code: "编码",
        name: "名称",
        typeId: "类型",
        used: "使用次数",
        lenght: "长度",
        width: "宽",
        height: "高",
        rstLen: "限长",
        rstWid: "限宽",
        rstWei: "限重",
        rstHei: "限高",
        panrentId: "父级",
        vaildTime: "有效期",
        flagRycle: "回收",
        flagLogic: "虚拟容器",
      },
      contract: {
        code: "编码",
        name: "名称",
        projectName: "项目名称",
      },
      qlyInspect: {
        code: "编码",
        name: "名称",
      },
      dictType: {
        code: "字典编码",
        name: "字典名称",
        description: "内容描述",
      },
      dictData: {
        dictTypeId: "字典标识",
        dictTypeCode: "字典编码",
        value: "值",
        label: "别名",
        sort: "排序",
        color: "颜色",
      },
      companys: {
        code: "企业编码",
        name: "名称",
        nameEn: "英文别名",
        breifCode: "助记码",
        type: "类型",
        contact: "联系人",
        tel: "联系电话",
        email: "电子邮件",
        pcode: "邮编",
        province: "省份",
        city: "城市",
        address: "地址",
      },
      serialRuleItem: {
        ruleId: "规则标识",
        wkType: "规则类型",
        feildValue: "规则参数",
        len: "截取长度",
        lenStr: "截取起始位置",
        sort: "排序",
      },
      serialRule: {
        code: "规则编码",
        name: "规则名称",
        delimit: "分隔符",
        reset: "重置规则",
        resetDep: "重置依赖",
        currValue: "当前流水号",
        lastCode: "最近生成编码",
      },
      whMat: {
        matnrCode: "物料编码",
        matnrName: "物料名称",
        matnrGroupId: "物料分组",
        spec: "规格",
        color: "颜色",
        size: "尺寸",
        minWeight: "最小重量",
        maxWeight: "最大重量",
      },
      asnOrder: {
        code: "编码",
        poCode: "PO编码",
        poId: "PO标识",
        type: "单据类型",
        wkType: "业务类型",
        anfme: "数量",
        qty: "已完成数量",
        logisNo: "logisNo",
        arrTime: "预计到达时间",
        rleStatus: "释放状态",
        ntyStatus: "质检上报状态",
      },
      asnOrderItem: {
        asnId: "主单标识",
        asnCode: "主单编码",
        poDetlId: "PO单标识",
        poDetlCode: "PO单编码",
        matnrId: "物料标识",
        matnk: "物料名称",
        anfme: "数量",
        stockUnit: "库存单位",
        purQty: "采购数量",
        purUnit: "采购单位",
        qty: "已完成数量",
        splrCode: "供应商编码",
        splrName: "供应商名称",
        qrcode: "二维码",
        barcode: "条形码",
        packName: "包装名称",
        ntyStatus: "报检状态",
      },
      purchase: {
        code: "编码",
        erpId: "erp标识",
        type: "单据类型",
        wkType: "业务类型",
        source: "来源",
        preArr: "预计到达",
        anfme: "数量",
        qty: "已完成数量",
        workQty: "执行中数量",
        channel: "收货通道",
        erpCode: "Erp编码",
        project: "项目名称",
        startTime: "开始时间",
        endTime: "结束时间",
      },
      purchaseItem: {
        purchaseId: "PO主单标识",
        erpItemId: "erp明细标识",
        matnrCode: "物料编码",
        matnrName: "物料名称",
        unit: "计量单位",
        anfme: "数量",
        qty: "已完成",
        nromQty: "标包数量",
        asnQty: "单据数量",
        printQty: "打印数量",
        splrName: "供应商名称",
        splrCode: "供应商编码",
        splrBatch: "供应商批次",
      },
    },
    filters: {
        lastCreated: '最近创建',
        today: '今天',
        thisWeek: '本周',
        lastWeek: '上周',
        thisMonth: '本月',
        lastMonth: '上月',
        earlier: '更早...',
  },
  page: {
    welcome: {
      index: "  欢迎使用RSF管理系统",
      tech: "  技术栈: Java17, SpringBoot2.5.3, Mybatis-plus_3.4.1, Spring Security, Druid 1.2.6, Redis, Mysql5.7, Node18, ReactJs, Material UI5.16, Axios, React-Admin5.1",
    },
    validate: {
        pwdMisMatch: '密码不一致'
    login: {
      title: "欢迎使用",
      footer: "Footer Goes Here",
      tenant: "公司",
      email: "邮箱地址",
      username: "登录账号",
      password: "密码",
      confirmPwd: "确认密码",
      code: "验证码",
      tab: {
        login: "登录",
        register: "注册",
      },
      button: {
        login: "登录",
        register: "注册",
        code: "获取验证码",
      },
    },
    settings: {
        base: '基本设置',
        security: '安全设置',
      resetPwd: {
        currPwd: "当前密码",
        newPwd: "新密码",
        confirmNewPwd: "确认新密码",
        resetBtn: "重置密码",
        tip: {
          usernameLimit: "仅允许输入 3-20 个英文字母或数字,不能包含特殊字符",
          pwdInputLimit: "密码必须为6-13位,且必须包含字母和数字",
          pwdNotSameAsOld: "新密码不能与当前密码相同",
          pwdNotMatch: "确认密码不一致",
        },
      },
    },
    create: {
        title: '添加',
        empty: {
            title: '暂无数据',
            desc: '请先添加数据',
            button: '添加数据'
    tenant: {
      create: {
        title: {
          basic: "基础信息",
          root: "添加管理员",
          confirm: "确认",
        },
        btn: {
          next: "下一步",
          back: "上一步",
        },
        tip: {
          onlyEn: "仅允许输入 3-20 个英文字母",
        },
      },
    },
    update: {
        title: '修改'
    matnr: {
      title: {
        basic: "基础属性",
        control: "控制属性",
        batchRole: "批次规则",
      },
    },
    menu: {
        dashboard: '控制台',
        settings: '个人设置',
        basicInfo: '基础信息',
        system: '系统设置',
        user: '用户管理',
        role: '角色管理',
        menu: '菜单管理',
        host: '机构管理',
        department: '部门管理',
        token: '登录日志',
        operation: '操作日志',
        config: '配置参数',
        tenant: '租户管理',
        userLogin: '登录日志',
        customer: '客户表',
        shipper: '货主信息',
        matnr: '物料表',
        matnrGroup: '物料分组',
        warehouse: '仓库信息',
        warehouseAreas: '仓库库区',
        loc: '基础库位',
        container: '容器管理',
        contract: '合同信息',
        qlyInspect: '质检信息',
        dictType: '数据字典',
        dictData: '字典数据集',
        companys: '往来企业',
        serialRuleItem: '编码规则子表',
        serialRule: '编码规则',
        asnOrder: '收货通知单',
        asnOrderItem: '收货明细',
        purchase: 'PO单',
        purchaseItem: 'PO单明细',
        whMat: '库区物料关系',
    whMat: {
      title: {
        add: "添加",
      },
    },
    table: {
        field: {
            host: {
            },
            config: {
                uuid: "编号",
                name: "配置名",
                flag: "标识 (EN) ",
                val: "配置值",
                content: "配置内容",
                type: "数据类型",
            },
            tenant: {
                name: "租户名",
                flag: "代码",
                root: "管理员",
            },
            role: {
                name: "角色名称",
                code: "角色标识",
            },
            userLogin: {
                userId: "用户",
                token: "token",
                ip: "ip",
                type: "类型",
                system: "系统",
            },
            dept: {
                name: "部门名称",
                parentId: "上级部门ID",
                parentName: "上级部门",
                path: "路径",
                pathName: "路径名",
                fullName: "全称",
                brief: "简述",
                code: "标识",
                type: "类型",
                leader: "负责人",
                count: "数量",
                sort: "排序",
            },
            menu: {
                name: "菜单名称",
                parentId: "上级菜单ID",
                parentName: "上级菜单",
                path: "路径",
                pathName: "路径名",
                route: "路由地址",
                component: "组件",
                brief: "简述",
                code: "标识",
                type: "类型",
                authority: "鉴权",
                icon: "图标",
                sort: "排序",
                meta: "元",
                enums: {
                    menu: '菜单',
                    button: '按钮',
                }
            },
            user: {
                username: "账号",
                password: "密码",
                confirmPwd: "确认密码",
                nickname: "昵称",
                avatar: "头像",
                code: "代号",
                sex: "性别",
                phone: "联系方式",
                email: "邮箱",
                emailVerified: "邮箱验证",
                deptId: "部门",
                realName: "真实姓名",
                idCard: "身份证",
                birthday: "生日",
                introduction: "简介",
                role: "角色",
                sexes: {
                    male: '男性',
                    female: '女性',
                    unknown: '未知',
                }
            },
            operationRecord: {
                namespace: "命名空间",
                url: "url",
                appkey: "密钥",
                timestamp: "时间戳",
                clientIp: "客户端IP",
                request: "请求内容",
                response: "响应内容",
                spendTime: "花费时间",
                err: "错误信息",
                result: "result",
                userId: "操作用户",
            },
            customer: {
                uuid: "编号",
                name: "客户名",
            },
            shipper: {
                uuid: "编码",
                name: "名称",
            },
            matnr: {
                name: "物料名称",
                code: "物料编码",
                shipperId: "货主标识",
                groupId: "分组标识",
                rglarId: "批次规则标识",
                platCode: "ERP编码",
                spec: "规格",
                model: "型号",
                weight: "重量",
                color: "颜色",
                size: "尺寸",
                describle: "描述",
                nromNum: "标包数量",
                unit: "单位",
                purUnit: "采购单位",
                stockUnit: "库存单位",
                stockLevel: "ABC分类",
                isLabelMange: "标签管理",
                safeQty: "安全值",
                minQty: "最小值",
                maxQty: "最大值",
                stagn: "停滞预警值",
                valid: "保质期",
                validWarn: "效期预警",
                flagCheck: "免检",
            },
            matnrGroup: {
                name: "名称",
                code: "编码",
                parentId: "父类标识",
            },
            warehouse: {
                name: "名称",
                code: "编码",
                factory: "工厂",
                address: "地址",
                longitude: "经度",
                latgitude: "纬度",
                length: "长",
                width: "宽",
                height: "高",
            },
            warehouseAreas: {
                uuid: "唯一编码",
                name: "名称",
                code: "编码",
                shipperId: "货主",
                supplierId: "供应商",
                flagMinus: "允许负库存",
                flagLabelMange: "标签管理",
                flagMix: "混放",
            },
            loc: {
                warehouseId: "仓库",
                areaId: "库区",
                code: "编码",
                type: "类型",
                name: "名称",
                flagLogic: "虚拟库位",
                fucAtrrs: "功能属性",
                barcode: "容器码",
                unit: "单位",
                size: "长/宽/高",
                row: "排",
                col: "列",
                lev: "层",
                channel: "通道",
                maxParts: "最大零件数",
                maxPack: "最大包装数",
                flagLabelMange: "标签管理",
                locAttrs: "属性",
            },
            container: {
                code: "编码",
                name: "名称",
                typeId: "类型",
                used: "使用次数",
                lenght: "长度",
                width: "宽",
                height: "高",
                rstLen: "限长",
                rstWid: "限宽",
                rstWei: "限重",
                rstHei: "限高",
                panrentId: "父级",
                vaildTime: "有效期",
                flagRycle: "回收",
                flagLogic: "虚拟容器",
            },
            contract: {
                code: "编码",
                name: "名称",
                projectName: "项目名称",
            },
            qlyInspect: {
                code: "编码",
                name: "名称",
            },
            dictType: {
                code: "字典编码",
                name: "字典名称",
                description: "内容描述",
            },
            dictData: {
                dictTypeId: "字典标识",
                dictTypeCode: "字典编码",
                value: "值",
                label: "别名",
                sort: "排序",
                color: "颜色",
            },
            companys: {
                code: "企业编码",
                name: "名称",
                nameEn: "英文别名",
                breifCode: "助记码",
                type: "类型",
                contact: "联系人",
                tel: "联系电话",
                email: "电子邮件",
                pcode: "邮编",
                province: "省份",
                city: "城市",
                address: "地址",
            },
            serialRuleItem: {
                ruleId: "规则标识",
                wkType: "规则类型",
                feildValue: "规则参数",
                len: "截取长度",
                lenStr: "截取起始位置",
                sort: "排序",
            },
            serialRule: {
                code: "规则编码",
                name: "规则名称",
                delimit: "分隔符",
                reset: "重置规则",
                resetDep: "重置依赖",
                currValue: "当前流水号",
                lastCode: "最近生成编码",
            },
            whMat: {
                matnrCode: "物料编码",
                matnrName: "物料名称",
                matnrGroupId: "物料分组",
                spec: "规格",
                color: "颜色",
                size: "尺寸",
                minWeight: "最小重量",
                maxWeight: "最大重量",
            },
            asnOrder: {
                code: "编码",
                poCode: "PO编码",
                poId: "PO标识",
                type: "单据类型",
                wkType: "业务类型",
                anfme: "数量",
                qty: "已完成数量",
                logisNo: "logisNo",
                arrTime: "预计到达时间",
                rleStatus: "释放状态",
                ntyStatus: "质检上报状态",
            },
            asnOrderItem: {
                asnId: "主单标识",
                asnCode: "主单编码",
                poDetlId: "PO单标识",
                poDetlCode: "PO单编码",
                matnrId: "物料标识",
                matnk: "物料名称",
                anfme: "数量",
                stockUnit: "库存单位",
                purQty: "采购数量",
                purUnit: "采购单位",
                qty: "已完成数量",
                splrCode: "供应商编码",
                splrName: "供应商名称",
                qrcode: "二维码",
                barcode: "条形码",
                packName: "包装名称",
                ntyStatus: "报检状态",
            },
            purchase: {
                code: "编码",
                platId: "平台标识",
                type: "单据类型",
                wkType: "业务类型",
                source: "来源",
                preArr: "预计到达",
                anfme: "数量",
                qty: "已完成数量",
                workQty: "执行中数量",
                channel: "收货通道",
                platCode: "Erp编码",
                project: "项目名称",
                startTime: "开始时间",
                endTime: "结束时间",
            },
            purchaseItem: {
                purchaseId: "PO主单标识",
                platItemId: "erp明细标识",
                matnrCode: "物料编码",
                matnrName: "物料名称",
                unit: "计量单位",
                anfme: "数量",
                qty: "已完成",
                nromQty: "标包数量",
                asnQty:  "单据数量",
                printQty: "打印数量",
                splrName: "供应商名称",
                splrCode: "供应商编码",
                splrBatch: "供应商批次",
            },
        }
  },
  form: {
    matnr: {
      name: "物料名称不能为空",
      code: "物料编码不能为空",
      shipper: "货主不能为空",
      groupId: "分组不能为空",
    },
    page: {
        welcome: {
            index: '  欢迎使用RSF管理系统',
            tech: '  技术栈: Java17, SpringBoot2.5.3, Mybatis-plus_3.4.1, Spring Security, Druid 1.2.6, Redis, Mysql5.7, Node18, ReactJs, Material UI5.16, Axios, React-Admin5.1'
        },
        login: {
            title: '欢迎使用',
            footer: 'Footer Goes Here',
            tenant: '公司',
            email: '邮箱地址',
            username: '登录账号',
            password: '密码',
            confirmPwd: '确认密码',
            code: '验证码',
            tab: {
                login: '登录',
                register: '注册',
            },
            button: {
                login: '登录',
                register: '注册',
                code: '获取验证码',
            },
        },
        settings: {
            resetPwd: {
                currPwd: '当前密码',
                newPwd: '新密码',
                confirmNewPwd: '确认新密码',
                resetBtn: '重置密码',
                tip: {
                    usernameLimit: '仅允许输入 3-20 个英文字母或数字,不能包含特殊字符',
                    pwdInputLimit: "密码必须为6-13位,且必须包含字母和数字",
                    pwdNotSameAsOld: "新密码不能与当前密码相同",
                    pwdNotMatch: "确认密码不一致",
                }
            }
        },
        tenant: {
            create: {
                title: {
                    basic: '基础信息',
                    root: '添加管理员',
                    confirm: '确认',
                },
                btn: {
                    next: '下一步',
                    back: '上一步',
                },
                tip: {
                    onlyEn: '仅允许输入 3-20 个英文字母'
                },
            },
        },
        matnr: {
            title: {
                basic: '基础属性',
                control: '控制属性',
                batchRole: '批次规则',
            }
        },
        whMat: {
            title: {
                add: '添加',
            }
        },
    },
    form: {
        matnr: {
            name: '物料名称不能为空',
            code: '物料编码不能为空',
            shipper: '货主不能为空',
            groupId: '分组不能为空',
        }
    }
  },
  toolbar: {
    inspection: "报检",
    creatcode: "生成条码",
  },
};
export default customChineseMessages;
rsf-admin/src/page/asnOrder/AsnOrderList.jsx
@@ -1,176 +1,248 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import React, {
  useState,
  useRef,
  useEffect,
  useMemo,
  useCallback,
} from "react";
import { useNavigate } from "react-router-dom";
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
  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";
import AsnOrderCreate from "./AsnOrderCreate";
import AsnOrderPanel from "./AsnOrderPanel";
import EmptyData from "../components/EmptyData";
import MyCreateButton from "../components/MyCreateButton";
import MyExportButton from '../components/MyExportButton';
import MyExportButton from "../components/MyExportButton";
import PageDrawer from "../components/PageDrawer";
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import ConstructionIcon from "@mui/icons-material/Construction";
import UploadloadIcon from "@mui/icons-material/Upload";
import {
  PAGE_DRAWER_WIDTH,
  OPERATE_MODE,
  DEFAULT_PAGE_SIZE,
} from "@/config/setting";
import * as Common from "@/utils/common";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
  "& .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 source="name" label="table.field.asnOrder.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}
  const importList = () => {};
  const inspection = () => {};
  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={importList} label={"toolbar.inspection"}>
              <UploadloadIcon />
            </Button>
            <Button onClick={inspection} label={"ra.action.import"}>
              <ConstructionIcon />
            </Button>
            <FilterButton />
            <MyCreateButton
              onClick={() => {
                setCreateDialog(true);
              }}
            />
            <PageDrawer
                title='AsnOrder Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
}
            <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" />
          <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>
  );
};
export default AsnOrderList;
rsf-admin/src/page/asnOrderItem/AsnOrderItemList.jsx
@@ -1,182 +1,268 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import React, {
  useState,
  useRef,
  useEffect,
  useMemo,
  useCallback,
} from "react";
import { useNavigate, useLocation } from "react-router-dom";
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
  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";
import AsnOrderItemCreate from "./AsnOrderItemCreate";
import AsnOrderItemPanel from "./AsnOrderItemPanel";
import EmptyData from "../components/EmptyData";
import MyCreateButton from "../components/MyCreateButton";
import MyExportButton from '../components/MyExportButton';
import MyExportButton from "../components/MyExportButton";
import PageDrawer from "../components/PageDrawer";
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import QrCodeIcon from "@mui/icons-material/QrCode";
import {
  PAGE_DRAWER_WIDTH,
  OPERATE_MODE,
  DEFAULT_PAGE_SIZE,
} from "@/config/setting";
import * as Common from "@/utils/common";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
  "& .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 ruleId = queryParams.get("ruleId");
                    <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}
  const creatCode = () => {};
  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>
            <Button onClick={creatCode} label={"toolbar.creatcode"}>
              <QrCodeIcon />
            </Button>
            <FilterButton />
            <MyCreateButton
              onClick={() => {
                setCreateDialog(true);
              }}
            />
            <PageDrawer
                title='AsnOrderItem Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
}
            <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"
          />
          <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>
  );
};
export default AsnOrderItemList;
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/PurchaseList.jsx
@@ -1,172 +1,233 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import React, {
  useState,
  useRef,
  useEffect,
  useMemo,
  useCallback,
} from "react";
import { useNavigate } from "react-router-dom";
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
  List,
  DatagridConfigurable,
  SearchInput,
  TopToolbar,
  SelectColumnsButton,
  EditButton,
  FilterButton,
  CreateButton,
  ExportButton,
  BulkDeleteButton,
  WrapperField,
  useRecordContext,
  useTranslate,
  useNotify,
  useListContext,
  FunctionField,
  TextField,
  NumberField,
  DateField,
  BooleanField,
  ReferenceField,
  TextInput,
  DateTimeInput,
  DateInput,
  SelectInput,
  NumberInput,
  ReferenceInput,
  ReferenceArrayInput,
  AutocompleteInput,
  DeleteButton,
} from "react-admin";
import { Box, Typography, Card, Stack } from "@mui/material";
import { styled } from "@mui/material/styles";
import PurchaseCreate from "./PurchaseCreate";
import PurchasePanel from "./PurchasePanel";
import EmptyData from "../components/EmptyData";
import MyCreateButton from "../components/MyCreateButton";
import MyExportButton from '../components/MyExportButton';
import MyExportButton from "../components/MyExportButton";
import PageDrawer from "../components/PageDrawer";
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import {
  PAGE_DRAWER_WIDTH,
  OPERATE_MODE,
  DEFAULT_PAGE_SIZE,
} from "@/config/setting";
import * as Common from "@/utils/common";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
  "& .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="from" label="table.field.purchase.from" />,
  <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="erpCode" label="table.field.purchase.erpCode" />,
  <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}
  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);
              }}
            />
            <PageDrawer
                title='Purchase Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
}
            <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="from" label="table.field.purchase.from" />
          <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="erpCode" label="table.field.purchase.erpCode" />
          <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/PurchaseItemList.jsx
@@ -1,176 +1,252 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate } from 'react-router-dom';
import React, {
  useState,
  useRef,
  useEffect,
  useMemo,
  useCallback,
} from "react";
import { useNavigate, useLocation } from "react-router-dom";
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
  List,
  DatagridConfigurable,
  SearchInput,
  TopToolbar,
  SelectColumnsButton,
  EditButton,
  FilterButton,
  CreateButton,
  ExportButton,
  BulkDeleteButton,
  WrapperField,
  useRecordContext,
  useTranslate,
  useNotify,
  useListContext,
  FunctionField,
  TextField,
  NumberField,
  DateField,
  BooleanField,
  ReferenceField,
  TextInput,
  DateTimeInput,
  DateInput,
  SelectInput,
  NumberInput,
  ReferenceInput,
  ReferenceArrayInput,
  AutocompleteInput,
  DeleteButton,
} from "react-admin";
import { Box, Typography, Card, Stack } from "@mui/material";
import { styled } from "@mui/material/styles";
import PurchaseItemCreate from "./PurchaseItemCreate";
import PurchaseItemPanel from "./PurchaseItemPanel";
import EmptyData from "../components/EmptyData";
import MyCreateButton from "../components/MyCreateButton";
import MyExportButton from '../components/MyExportButton';
import MyExportButton from "../components/MyExportButton";
import PageDrawer from "../components/PageDrawer";
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import {
  PAGE_DRAWER_WIDTH,
  OPERATE_MODE,
  DEFAULT_PAGE_SIZE,
} from "@/config/setting";
import * as Common from "@/utils/common";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
  "& .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="erpId" label="table.field.purchaseItem.erpId" />,
  <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="nomQty" label="table.field.purchaseItem.nomQty" />,
  <NumberInput source="asnQty" label="table.field.purchaseItem.asnQty" />,
  <NumberInput source="printQty" label="table.field.purchaseItem.printQty" />,
  <TextInput source="pulrName" label="table.field.purchaseItem.pulrName" />,
  <TextInput source="pulrCode" label="table.field.purchaseItem.pulrCode" />,
  <TextInput source="pulrBatch" label="table.field.purchaseItem.pulrBatch" />,
    <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 ruleId = queryParams.get("ruleId");
                    <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}
  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);
              }}
            />
            <PageDrawer
                title='PurchaseItem Detail'
                drawerVal={drawerVal}
                setDrawerVal={setDrawerVal}
            >
            </PageDrawer>
        </Box>
    )
}
            <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="erpId" label="table.field.purchaseItem.erpId" />
          <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="nomQty"
            label="table.field.purchaseItem.nomQty"
          />
          <NumberField
            source="asnQty"
            label="table.field.purchaseItem.asnQty"
          />
          <NumberField
            source="printQty"
            label="table.field.purchaseItem.printQty"
          />
          <TextField
            source="pulrName"
            label="table.field.purchaseItem.pulrName"
          />
          <TextField
            source="pulrCode"
            label="table.field.purchaseItem.pulrCode"
          />
          <TextField
            source="pulrBatch"
            label="table.field.purchaseItem.pulrBatch"
          />
          <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>
  );
};
export default PurchaseItemList;
rsf-admin/src/page/system/serialRule/SerialRuleDetail.jsx
@@ -54,8 +54,6 @@
    });
  };
  console.log(SerialRuleItem);
  return (
    <>
      <Dialog