From ea2904d7ca03b42f5783cd659fe71c0fbedd2277 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期一, 11 八月 2025 17:05:21 +0800
Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop
---
rsf-admin/src/page/dashboard/welcome_illustration.svg | 1
rsf-admin/src/page/orders/wave/WaveList.jsx | 1
rsf-admin/src/page/dashboard/Welcome.jsx | 90 +++
rsf-admin/package.json | 5
rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx | 387 ++++++++--------
rsf-admin/src/page/statistics/outStockNum/OutStockNumList.jsx | 10
rsf-admin/src/page/dashboard/NbChart.jsx | 117 +++++
rsf-admin/src/page/dashboard/NbList.jsx | 79 +++
rsf-admin/src/page/components/CardWithIcon.jsx | 60 ++
rsf-admin/src/page/dashboard/NbCard.jsx | 107 ++++
rsf-admin/src/page/statistics/stockStatisticNum/stockStatisticList.jsx | 24
rsf-admin/src/i18n/zh.js | 7
rsf-admin/package-lock.json | 284 ++++++++++++
rsf-admin/src/i18n/en.js | 5
rsf-admin/src/page/dashboard/index.jsx | 168 +++++++
rsf-admin/src/page/orders/wave/WavePanel.jsx | 4
16 files changed, 1,123 insertions(+), 226 deletions(-)
diff --git a/rsf-admin/package-lock.json b/rsf-admin/package-lock.json
index 2ccac71..fef3d13 100644
--- a/rsf-admin/package-lock.json
+++ b/rsf-admin/package-lock.json
@@ -39,6 +39,7 @@
"react-router-dom": "^6.26.1",
"react-syntax-highlighter": "^15.5.0",
"react-to-print": "^2.14.11",
+ "recharts": "^2.15.0",
"svgpath": "^2.6.0",
"three": "^0.155.0",
"tweedle.js": "^2.1.0"
@@ -2539,6 +2540,69 @@
"integrity": "sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==",
"license": "MIT"
},
+ "node_modules/@types/d3-array": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
+ "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-color": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-color": "*"
+ }
+ },
+ "node_modules/@types/d3-path": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz",
+ "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+ "license": "MIT"
+ },
"node_modules/@types/earcut": {
"version": "2.1.4",
"resolved": "https://registry.npmmirror.com/@types/earcut/-/earcut-2.1.4.tgz",
@@ -3498,6 +3562,127 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT"
},
+ "node_modules/d3-array": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+ "license": "ISC",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-format": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-shape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time-format": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-time": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/data-view-buffer": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
@@ -3584,6 +3769,12 @@
"optional": true
}
}
+ },
+ "node_modules/decimal.js-light": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
+ "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
+ "license": "MIT"
},
"node_modules/decode-uri-component": {
"version": "0.2.2",
@@ -4241,6 +4432,15 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true,
"license": "MIT"
+ },
+ "node_modules/fast-equals": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz",
+ "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
},
"node_modules/fast-glob": {
"version": "3.3.3",
@@ -4939,6 +5139,15 @@
},
"engines": {
"node": ">= 0.4"
+ }
+ },
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/is-alphabetical": {
@@ -6607,6 +6816,21 @@
"react-dom": ">=16.8"
}
},
+ "node_modules/react-smooth": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz",
+ "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-equals": "^5.0.1",
+ "prop-types": "^15.8.1",
+ "react-transition-group": "^4.4.5"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/react-syntax-highlighter": {
"version": "15.6.1",
"resolved": "https://registry.npmmirror.com/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz",
@@ -6652,6 +6876,44 @@
"react": ">=16.6.0",
"react-dom": ">=16.6.0"
}
+ },
+ "node_modules/recharts": {
+ "version": "2.15.4",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz",
+ "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==",
+ "license": "MIT",
+ "dependencies": {
+ "clsx": "^2.0.0",
+ "eventemitter3": "^4.0.1",
+ "lodash": "^4.17.21",
+ "react-is": "^18.3.1",
+ "react-smooth": "^4.0.4",
+ "recharts-scale": "^0.4.4",
+ "tiny-invariant": "^1.3.1",
+ "victory-vendor": "^36.6.8"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/recharts-scale": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
+ "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
+ "license": "MIT",
+ "dependencies": {
+ "decimal.js-light": "^2.4.1"
+ }
+ },
+ "node_modules/recharts/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
},
"node_modules/redux": {
"version": "4.2.1",
@@ -7591,6 +7853,28 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/victory-vendor": {
+ "version": "36.9.2",
+ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz",
+ "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==",
+ "license": "MIT AND ISC",
+ "dependencies": {
+ "@types/d3-array": "^3.0.3",
+ "@types/d3-ease": "^3.0.0",
+ "@types/d3-interpolate": "^3.0.1",
+ "@types/d3-scale": "^4.0.2",
+ "@types/d3-shape": "^3.1.0",
+ "@types/d3-time": "^3.0.0",
+ "@types/d3-timer": "^3.0.0",
+ "d3-array": "^3.1.6",
+ "d3-ease": "^3.0.1",
+ "d3-interpolate": "^3.0.1",
+ "d3-scale": "^4.0.2",
+ "d3-shape": "^3.1.0",
+ "d3-time": "^3.0.0",
+ "d3-timer": "^3.0.1"
+ }
+ },
"node_modules/vite": {
"version": "5.4.19",
"resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.19.tgz",
diff --git a/rsf-admin/package.json b/rsf-admin/package.json
index 4e1d8b2..4cc1046 100644
--- a/rsf-admin/package.json
+++ b/rsf-admin/package.json
@@ -45,7 +45,8 @@
"react-to-print": "^2.14.11",
"svgpath": "^2.6.0",
"three": "^0.155.0",
- "tweedle.js": "^2.1.0"
+ "tweedle.js": "^2.1.0",
+ "recharts": "^2.15.0"
},
"devDependencies": {
"@types/node": "^20.10.7",
@@ -63,4 +64,4 @@
"vite": "^5.3.5"
},
"name": "rsf"
-}
+}
\ No newline at end of file
diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 501e315..33a5693 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -1207,6 +1207,11 @@
}
},
page: {
+ dashboard: {
+ welcome: {
+ title: 'Welcome to the WMS website',
+ },
+ },
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'
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 320d013..2046fac 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -223,7 +223,7 @@
locDeadReport: '搴撳瓨鍋滄粸鎶ヨ〃',
stockStatistic: '鏃ュ叆搴撴眹鎬绘煡璇�',
outStatistic: '鏃ュ嚭搴撴眹鎬绘煡璇�',
- inStatistic: '鏃ュ叆搴撴眹鎬绘煡璇�',
+ inStatistic: '鏃ュ叆搴撴眹鎬绘煡璇�',
inStatisticItem: '鏃ュ叆搴撴槑缁嗘煡璇�',
outStatisticItem: '鏃ュ嚭搴撴槑缁嗘煡璇�',
statisticCount: '鏃ュ嚭鍏ュ簱姹囨�荤粺璁�',
@@ -1219,6 +1219,11 @@
}
},
page: {
+ dashboard: {
+ welcome: {
+ title: '娆㈣繋浣跨敤 WMS 绯荤粺',
+ },
+ },
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'
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
index e838adf..f62588a 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
@@ -127,7 +127,7 @@
aria-labelledby="form-dialog-title"
fullWidth
disableRestoreFocus
- maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+ maxWidth="xl" // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
>
<Form >
<DialogTitle id="form-dialog-title" sx={{
@@ -150,150 +150,159 @@
</Tabs>
<CustomTabPanel value={value} index={0}>
<Grid container rowSpacing={2} columnSpacing={2}>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.name"
- validate={[required()]}
- source="name"
- parse={v => v}
- autoFocus
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.code"
- validate={[required()]}
- source="code"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <ReferenceInput source="shipperId" reference="companys" filter={{ type: 'shipper' }}>
- <AutocompleteInput
- label="table.field.matnr.shipperId"
- optionText="name"
- filterToQuery={(val) => ({ name: val })}
+ <Grid item xs={12} display="flex" gap={1}>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.name"
+ validate={[required()]}
+ source="name"
+ parse={v => v}
+ autoFocus
/>
- </ReferenceInput>
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TreeSelectInput
- label="table.field.matnr.groupId"
- resource={'matnrGroup'}
- source="groupId"
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.platCode"
- source="platCode"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.spec"
- source="spec"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.model"
- source="model"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.matnr.weight"
- source="weight"
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.color"
- source="color"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.size"
- source="size"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.describle"
- source="describle"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.matnr.nromNum"
- source="nromNum"
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.unit"
- source="unit"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.purUnit"
- source="purchaseUnit"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <TextInput
- label="table.field.matnr.stockUnit"
- source="stockUnit"
- parse={v => v}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <SelectInput
- label="table.field.matnr.stockLevel"
- source="stockLevel"
- choices={[
- { id: 0, name: ' A' },
- { id: 1, name: ' B' },
- { id: 2, name: 'C' },
- ]}
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <SelectInput
- label="table.field.matnr.isLabelMange"
- source="flagLabelMange"
- choices={[
- { id: 0, name: ' 鍚�' },
- { id: 1, name: ' 鏄�' },
- ]}
- />
- </Grid>
-
- {dynamicFields.map((item) => {
- return (
- <Grid key={item.id} item xs={6} display="flex" gap={1}>
- <TextInput
- label={item.fieldsAlise}
- source={item.fields}
- validate={item.unique === 1 ? required() : false}
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.code"
+ validate={[required()]}
+ source="code"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <ReferenceInput source="shipperId" reference="companys" filter={{ type: 'shipper' }}>
+ <AutocompleteInput
+ label="table.field.matnr.shipperId"
+ optionText="name"
+ filterToQuery={(val) => ({ name: val })}
/>
- </Grid>
- )
- })}
+ </ReferenceInput>
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TreeSelectInput
+ label="table.field.matnr.groupId"
+ resource={'matnrGroup'}
+ source="groupId"
+ />
+ </Grid>
+ </Grid>
+ <Grid item xs={12} display="flex" gap={1}>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.platCode"
+ source="platCode"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.spec"
+ source="spec"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.model"
+ source="model"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.matnr.weight"
+ source="weight"
+ />
+ </Grid>
+ </Grid>
+ <Grid item xs={12} display="flex" gap={1}>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.color"
+ source="color"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.size"
+ source="size"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.describle"
+ source="describle"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.matnr.nromNum"
+ source="nromNum"
+ />
+ </Grid>
+ </Grid>
+ <Grid item xs={12} display="flex" gap={1}>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.unit"
+ source="unit"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.purUnit"
+ source="purchaseUnit"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnr.stockUnit"
+ source="stockUnit"
+ parse={v => v}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <SelectInput
+ label="table.field.matnr.stockLevel"
+ source="stockLevel"
+ choices={[
+ { id: 0, name: ' A' },
+ { id: 1, name: ' B' },
+ { id: 2, name: 'C' },
+ ]}
+ />
+ </Grid>
+ </Grid>
+ <Grid item xs={12} display="flex" gap={1}>
+ <Grid item xs={6} display="flex" gap={1}>
+ <SelectInput
+ label="table.field.matnr.isLabelMange"
+ source="flagLabelMange"
+ choices={[
+ { id: 0, name: ' 鍚�' },
+ { id: 1, name: ' 鏄�' },
+ ]}
+ />
+ </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <StatusSelectInput />
+ {dynamicFields.map((item) => {
+ return (
+ <Grid key={item.id} item xs={6} display="flex" gap={1}>
+ <TextInput
+ label={item.fieldsAlise}
+ source={item.fields}
+ validate={item.unique === 1 ? required() : false}
+ />
+ </Grid>
+ )
+ })}
+ <Grid item xs={6} display="flex" gap={1}>
+ <StatusSelectInput />
+ </Grid>
</Grid>
<Grid item xs={12} display="flex" gap={1}>
<Stack direction="column" spacing={1} width={'100%'}>
@@ -304,51 +313,57 @@
</CustomTabPanel>
<CustomTabPanel value={value} index={1}>
<Grid container rowSpacing={2} columnSpacing={2}>
- <Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.matnr.safeQty"
- source="safeQty"
- />
+ <Grid item xs={12} display="flex" gap={1}>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.matnr.safeQty"
+ source="safeQty"
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.matnr.minQty"
+ source="minQty"
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.matnr.maxQty"
+ source="maxQty"
+ />
+ </Grid>
</Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.matnr.minQty"
- source="minQty"
- />
+ <Grid item xs={12} display="flex" gap={1}>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.matnr.stagn"
+ source="stagn"
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.matnr.valid"
+ source="valid"
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.matnr.validWarn"
+ source="validWarn"
+ />
+ </Grid>
</Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.matnr.maxQty"
- source="maxQty"
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.matnr.stagn"
- source="stagn"
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.matnr.valid"
- source="valid"
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <NumberInput
- label="table.field.matnr.validWarn"
- source="validWarn"
- />
- </Grid>
- <Grid item xs={6} display="flex" gap={1}>
- <SelectInput
- label="table.field.matnr.flagCheck"
- source="flagCheck"
- choices={[
- { id: 0, name: ' 鍚�' },
- { id: 1, name: ' 鏄�' },
- ]}
- />
+ <Grid item xs={12} display="flex" gap={1}>
+ <Grid item xs={4} display="flex" gap={1}>
+ <SelectInput
+ label="table.field.matnr.flagCheck"
+ source="flagCheck"
+ choices={[
+ { id: 0, name: ' 鍚�' },
+ { id: 1, name: ' 鏄�' },
+ ]}
+ />
+ </Grid>
</Grid>
</Grid>
</CustomTabPanel>
@@ -370,7 +385,7 @@
</CustomTabPanel>
</DialogContent>
<DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
- <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} >
+ <Toolbar sx={{ width: '100%', justifyContent: 'flex-end' }} >
<SaveButton />
</Toolbar>
</DialogActions>
diff --git a/rsf-admin/src/page/components/CardWithIcon.jsx b/rsf-admin/src/page/components/CardWithIcon.jsx
new file mode 100644
index 0000000..606911e
--- /dev/null
+++ b/rsf-admin/src/page/components/CardWithIcon.jsx
@@ -0,0 +1,60 @@
+import * as React from 'react';
+import { FC, createElement } from 'react';
+import { Card, Box, Typography, Divider } from '@mui/material';
+import { Link } from 'react-router-dom';
+
+const CardWithIcon = ({ icon, title, subtitle, to, children }) => (
+ <Card
+ sx={{
+ minHeight: 52,
+ display: 'flex',
+ flexDirection: 'column',
+ flex: '1',
+ '& a': {
+ textDecoration: 'none',
+ color: 'inherit',
+ },
+ }}
+ >
+ <Box
+ sx={{
+ position: 'relative',
+ overflow: 'hidden',
+ padding: '16px',
+ display: 'flex',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ '& .icon': {
+ color: 'primary.main',
+ },
+ '&:before': {
+ position: 'absolute',
+ top: '50%',
+ left: 0,
+ display: 'block',
+ content: `''`,
+ height: '200%',
+ aspectRatio: '1',
+ transform: 'translate(-30%, -60%)',
+ borderRadius: '50%',
+ backgroundColor: 'primary.main',
+ opacity: 0.15,
+ },
+ }}
+ >
+ <Box width="3em" className="icon">
+ {createElement(icon, { fontSize: 'large' })}
+ </Box>
+ <Box textAlign="right">
+ <Typography color="textSecondary">{title}</Typography>
+ <Typography variant="h5" component="h2">
+ {subtitle || '鈥�'}
+ </Typography>
+ </Box>
+ </Box>
+ {children && <Divider />}
+ {children}
+ </Card>
+);
+
+export default CardWithIcon;
\ No newline at end of file
diff --git a/rsf-admin/src/page/dashboard/NbCard.jsx b/rsf-admin/src/page/dashboard/NbCard.jsx
new file mode 100644
index 0000000..eb22c20
--- /dev/null
+++ b/rsf-admin/src/page/dashboard/NbCard.jsx
@@ -0,0 +1,107 @@
+import * as React from 'react';
+import {
+ Avatar,
+ Box,
+ Button,
+ List,
+ ListItem,
+ ListItemAvatar,
+ ListItemButton,
+ ListItemText,
+} from '@mui/material';
+import CommentIcon from '@mui/icons-material/Comment';
+import { Link } from 'react-router-dom';
+import {
+ ReferenceField,
+ FunctionField,
+ useGetList,
+ useTranslate,
+ useIsDataLoaded,
+} from 'react-admin';
+import CardWithIcon from '../components/CardWithIcon';
+
+const NbCard = (props) => {
+ const { list, ...rest } = props;
+ const translate = useTranslate();
+ const {
+ data: reviews,
+ total,
+ isPending,
+ } = useGetList('reviews', {
+ filter: { status: 'pending' },
+ sort: { field: 'date', order: 'DESC' },
+ pagination: { page: 1, perPage: 100 },
+ });
+
+ const display = 'display';
+ const newList = list.concat(list);
+
+ return (
+ <CardWithIcon
+ icon={CommentIcon}
+ title={translate('pos.dashboard.pending_reviews')}
+ subtitle={total}
+ {...rest}
+ >
+ <List sx={{ display }}>
+ {newList?.map((record) => (
+ <ListItem key={record.id} disablePadding>
+ <ListItemButton
+ alignItems="flex-start"
+ component={Link}
+ to={`/task/${record.id}`}
+ >
+ {/* <ListItemAvatar>
+ <Avatar
+ sx={{
+ // bgcolor: 'primary.main',
+ bgcolor: '#a2beeaff',
+ color: 'primary.contrastText', // 閬垮厤鐧藉瓧鐧藉簳
+ // width: 40,
+ // height: 40,
+ // fontSize: 16,
+ }}
+ >
+ {record.id}
+ </Avatar>
+ </ListItemAvatar> */}
+
+ <ListItemText
+ // primary={
+ // <StarRatingField
+ // record={record}
+ // source="rating"
+ // />
+ // }
+ primary={record.date + record.date}
+ secondary={record.total}
+ sx={{
+ overflowY: 'hidden',
+ height: '3em',
+ display: '-webkit-box',
+ WebkitLineClamp: 2,
+ WebkitBoxOrient: 'vertical',
+ paddingRight: 0,
+ }}
+ />
+ </ListItemButton>
+ </ListItem>
+ ))}
+ </List>
+ <Box flexGrow={1}> </Box>
+ <Button
+ sx={{ borderRadius: 0 }}
+ component={Link}
+ to="/task"
+ size="small"
+ color="primary"
+ >
+ <Box p={1} sx={{ color: 'primary.main' }}>
+ {translate('pos.dashboard.all_reviews')}
+ </Box>
+ </Button>
+ </CardWithIcon>
+ );
+};
+
+export default NbCard;
diff --git a/rsf-admin/src/page/dashboard/NbChart.jsx b/rsf-admin/src/page/dashboard/NbChart.jsx
new file mode 100644
index 0000000..a0b6373
--- /dev/null
+++ b/rsf-admin/src/page/dashboard/NbChart.jsx
@@ -0,0 +1,117 @@
+import * as React from 'react';
+import { Card, CardHeader, CardContent } from '@mui/material';
+import {
+ ResponsiveContainer,
+ AreaChart,
+ Area,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+} from 'recharts';
+import { useTranslate } from 'react-admin';
+import { format, subDays, addDays } from 'date-fns';
+
+const lastDay = new Date();
+const lastMonthDays = Array.from({ length: 30 }, (_, i) => subDays(lastDay, i));
+const aMonthAgo = subDays(new Date(), 30);
+
+const dateFormatter = (date) =>
+ new Date(date).toLocaleDateString();
+
+const aggregateOrdersByDay = (orders) =>
+ orders
+ .filter((order) => order.status !== 'cancelled')
+ .reduce(
+ (acc, curr) => {
+ const day = format(curr.date, 'yyyy-MM-dd');
+ if (!acc[day]) {
+ acc[day] = 0;
+ }
+ acc[day] += curr.total;
+ return acc;
+ },
+ {}
+ );
+
+const getRevenuePerDay = (orders) => {
+ const daysWithRevenue = aggregateOrdersByDay(orders);
+ return lastMonthDays.map(date => ({
+ date: date.getTime(),
+ total: daysWithRevenue[format(date, 'yyyy-MM-dd')] || 0,
+ }));
+};
+
+const NbChart = (props) => {
+ const { orders } = props;
+ const translate = useTranslate();
+ if (!orders) return null;
+
+ return (
+ <Card>
+ <CardHeader title={translate('pos.dashboard.month_history')} />
+ <CardContent>
+ <div style={{ width: '100%', height: 300 }}>
+ <ResponsiveContainer>
+ <AreaChart data={getRevenuePerDay(orders)}>
+ <defs>
+ <linearGradient
+ id="colorUv"
+ x1="0"
+ y1="0"
+ x2="0"
+ y2="1"
+ >
+ <stop
+ offset="5%"
+ stopColor="#5091abff"
+ stopOpacity={0.8}
+ />
+ <stop
+ offset="95%"
+ stopColor="#5091abff"
+ stopOpacity={0}
+ />
+ </linearGradient>
+ </defs>
+ <XAxis
+ dataKey="date"
+ name="Date"
+ type="number"
+ scale="time"
+ domain={[
+ addDays(aMonthAgo, 1).getTime(),
+ new Date().getTime(),
+ ]}
+ tickFormatter={dateFormatter}
+ />
+ <YAxis dataKey="total" name="Revenue" unit="鈧�" />
+ <CartesianGrid strokeDasharray="3 3" />
+ <Tooltip
+ cursor={{ strokeDasharray: '3 3' }}
+ formatter={(value) =>
+ new Intl.NumberFormat(undefined, {
+ style: 'currency',
+ currency: 'USD',
+ }).format(value)
+ }
+ labelFormatter={(label) =>
+ dateFormatter(label)
+ }
+ />
+ <Area
+ type="monotone"
+ dataKey="total"
+ stroke="#5091abff"
+ strokeWidth={2}
+ fill="url(#colorUv)"
+ />
+ </AreaChart>
+ </ResponsiveContainer>
+ </div>
+ </CardContent>
+ </Card>
+ );
+};
+
+export default NbChart;
diff --git a/rsf-admin/src/page/dashboard/NbList.jsx b/rsf-admin/src/page/dashboard/NbList.jsx
new file mode 100644
index 0000000..9bb7024
--- /dev/null
+++ b/rsf-admin/src/page/dashboard/NbList.jsx
@@ -0,0 +1,79 @@
+import * as React from 'react';
+import { useTranslate, useReference } from 'react-admin';
+import {
+ ListItem,
+ ListItemSecondaryAction,
+ ListItemAvatar,
+ ListItemText,
+ Avatar,
+ Box,
+ ListItemButton,
+ Card,
+ CardHeader,
+ List,
+} from '@mui/material';
+import { Link } from 'react-router-dom';
+
+const NbList = (props) => {
+ const { orders = [] } = props;
+ const translate = useTranslate();
+
+ return (
+ <Card sx={{ flex: 1 }}>
+ <CardHeader title={translate('pos.dashboard.pending_orders')} />
+ <List dense={true}>
+ {orders.map(record => (
+ <PendingOrder key={record.id} order={record} />
+ ))}
+ </List>
+ </Card>
+ );
+};
+
+export const PendingOrder = (props) => {
+ const { order } = props;
+ console.log(order);
+
+ const translate = useTranslate();
+ const { referenceRecord: customer, isPending } = useReference({
+ reference: 'customers',
+ id: order.customer_id,
+ });
+
+ return (
+ <ListItem disablePadding>
+ <ListItemButton component={Link} to={`/orders/${order.id}`}>
+ {/* <ListItemAvatar>
+ {isPending ? (
+ <Avatar />
+ ) : (
+ <Avatar
+ src={`${customer?.avatar}?size=32x32`}
+ sx={{ bgcolor: 'background.paper' }}
+ alt={`${customer?.first_name} ${customer?.last_name}`}
+ />
+ )}
+ </ListItemAvatar> */}
+ <ListItemText
+ primary={new Date(order.date).toLocaleString('en-GB')}
+ secondary={translate('pos.dashboard.order.items', {
+ name: order.name
+ })}
+ />
+ <ListItemSecondaryAction>
+ <Box
+ component="span"
+ sx={{
+ marginRight: '1em',
+ color: 'text.primary',
+ }}
+ >
+ {order.total}$
+ </Box>
+ </ListItemSecondaryAction>
+ </ListItemButton>
+ </ListItem>
+ );
+};
+
+export default NbList;
\ No newline at end of file
diff --git a/rsf-admin/src/page/dashboard/Welcome.jsx b/rsf-admin/src/page/dashboard/Welcome.jsx
new file mode 100644
index 0000000..756ad55
--- /dev/null
+++ b/rsf-admin/src/page/dashboard/Welcome.jsx
@@ -0,0 +1,90 @@
+import * as React from 'react';
+import { Box, Card, CardActions, Button, Typography, useTheme } from '@mui/material';
+import { useNavigate } from 'react-router-dom';
+import { useTranslate } from 'react-admin';
+import AssignmentIcon from '@mui/icons-material/Assignment';
+import AccountCircleIcon from '@mui/icons-material/AccountCircle';
+
+import publishArticleImage from './welcome_illustration.svg';
+
+const Welcome = () => {
+ const translate = useTranslate();
+ const navigate = useNavigate();
+ const theme = useTheme();
+ const isLight = theme.palette.mode === 'light';
+
+ return (
+ <Card
+ sx={{
+ background: theme =>
+ `linear-gradient(45deg,
+ ${isLight ? theme.palette.secondary.dark : theme.palette.primary.dark} 0%,
+ ${isLight ? theme.palette.secondary.light : theme.palette.primary.light} 50%,
+ ${theme.palette.primary.dark} 100%)`,
+ color: theme => theme.palette.primary.contrastText,
+ padding: '20px',
+ // paddingBottom: '50px',
+ marginTop: 2,
+ marginBottom: '1em',
+ width: '100%',
+ overflow: 'visible'
+ }}
+ >
+ <Box display="flex">
+ <Box flex="1">
+ <Typography variant="h5" component="h2" gutterBottom>
+ {translate('page.dashboard.welcome.title')}
+ </Typography>
+ <Box maxWidth="40em">
+ <Typography variant="body1" component="p" gutterBottom>
+ {translate('page.dashboard.welcome.title')}
+ </Typography>
+ </Box>
+ <CardActions
+ sx={{
+ padding: { xs: 0, xl: null },
+ flexWrap: { xs: 'wrap', xl: null },
+ '& a': {
+ marginTop: { xs: '1em', xl: null },
+ marginLeft: { xs: '0!important', xl: null },
+ marginRight: { xs: '1em', xl: null },
+ },
+ marginTop: 3,
+ }}
+ >
+ <Button
+ variant="contained"
+ startIcon={<AssignmentIcon />}
+ onClick={() => {
+ navigate('/task')
+ }}
+ >
+ {translate('menu.task')}
+ </Button>
+ <Button
+ variant="contained"
+ startIcon={<AccountCircleIcon />}
+ onClick={() => {
+ navigate('/warehouseStock')
+ }}
+ >
+ {translate('menu.warehouseStock')}
+ </Button>
+ </CardActions>
+ </Box>
+ <Box
+ display={{ xs: 'none', sm: 'none', md: 'block' }}
+ sx={{
+ background: `url(${publishArticleImage}) top right / cover`,
+ marginLeft: 'auto',
+ }}
+ width="16em"
+ height="9em"
+ overflow="hidden"
+ />
+ </Box>
+ </Card>
+ );
+};
+
+export default Welcome;
\ No newline at end of file
diff --git a/rsf-admin/src/page/dashboard/index.jsx b/rsf-admin/src/page/dashboard/index.jsx
index 0ee3aa1..d8694e0 100644
--- a/rsf-admin/src/page/dashboard/index.jsx
+++ b/rsf-admin/src/page/dashboard/index.jsx
@@ -1,9 +1,26 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
import { useNavigate } from 'react-router-dom';
import { useTheme } from '@mui/material/styles';
-import { useTranslate, useAuthProvider } from 'react-admin';
+import { useTranslate, useAuthProvider, Title, useNotify } from 'react-admin';
import { WordEffect } from './WordEffect';
import { getSystemDicts } from '@/api/auth'
+import Welcome from "./Welcome";
+import CardWithIcon from '../components/CardWithIcon';
+import SensorOccupiedIcon from '@mui/icons-material/SensorOccupied';
+import WifiIcon from '@mui/icons-material/Wifi';
+import request from '@/utils/request';
+import { Box, Typography, LinearProgress, Stack } from '@mui/material';
+import NbChart from "./NbChart";
+import NbList from "./NbList";
+import NbCard from "./NbCard";
+
+const styles = {
+ flex: { display: 'flex' },
+ flexColumn: { display: 'flex', flexDirection: 'column' },
+ leftCol: { flex: 1, marginRight: '0.5em' },
+ rightCol: { flex: 1, marginLeft: '0.5em' },
+ singleCol: { marginTop: '1em', marginBottom: '1em' },
+};
const Dashboard = () => {
const authProvider = useAuthProvider();
@@ -22,6 +39,9 @@
return (
<>
+ <Title title={"menu.dashboard"} />
+ <Welcome />
+ <DashboardSummaryView />
<div
style={{
boxSizing: 'border-box',
@@ -34,17 +54,159 @@
padding: '2rem 1rem',
}}
>
- <WordEffect
+ {/* <WordEffect
words={translate('page.welcome.index')}
color={theme.palette.mode === 'light' ? '#666' : '#eeeeee'}
/>
<WordEffect
words={translate('page.welcome.tech')}
color={theme.palette.mode === 'light' ? '#666' : '#eeeeee'}
- />
+ /> */}
</div>
</>
)
}
+const DashboardSummaryView = () => {
+ const translate = useTranslate();
+ const notify = useNotify();
+ const [statistic, setStatistic] = useState(null);
+
+ useEffect(() => {
+ request.get('/dashboard/member/statistic', {
+ params: {}
+ }).then(res => {
+ const { code, msg, data } = res.data;
+ if (code === 200) {
+ setStatistic(data);
+ } else {
+ // notify(msg, { type: 'error', messageArgs: { _: msg } });
+ }
+ }).catch((error) => {
+ // notify(error.message, { type: 'error', messageArgs: { _: error.message } });
+ console.error(error);
+ })
+ }, [])
+
+ const recentOrders = [
+ {
+ id: 1,
+ name: 'a',
+ date: "2025-08-10T12:23:56.959Z",
+ total: 138.94
+ },
+ {
+ id: 2,
+ name: 'b',
+ date: "2025-08-03T07:45:00.304Z",
+ total: 214.66
+ },
+ {
+ id: 3,
+ name: 'c',
+ date: "2025-07-28T00:20:10.968Z",
+ total: 68.19
+ },
+ {
+ id: 4,
+ name: 'd',
+ date: "2025-07-22T20:39:00.293Z",
+ total: 36.56
+ },
+ {
+ id: 5,
+ name: 'e',
+ date: "2025-07-16T17:40:24.791Z",
+ total: 100.82
+ },
+ ]
+
+ return (
+ <>
+ <div style={styles.flex}>
+ <div style={styles.leftCol}>
+ <div style={styles.flex}>
+ <CardWithIcon
+ icon={WifiIcon}
+ title={translate('page.member.header.onlineMembers')}
+ subtitle={`${statistic?.membersOnlineQua}`}
+ />
+ <Spacer />
+ <CardWithIcon
+ icon={SensorOccupiedIcon}
+ title={translate('page.member.header.totalMembers')}
+ subtitle={`${statistic?.membersTotalQua}`}
+ />
+ </div>
+ <div style={styles.singleCol}>
+ <NbChart orders={recentOrders} />
+ </div>
+ <div style={styles.singleCol}>
+ <NbList orders={recentOrders} />
+ </div>
+ </div>
+ <div style={styles.rightCol}>
+ <div style={styles.flex}>
+ <NbCard
+ icon={WifiIcon}
+ title={translate('page.member.header.onlineMembers')}
+ subtitle={`${statistic?.membersOnlineQua}`}
+ to={{
+ pathname: '/task',
+ search: JSON.stringify({
+ filter: JSON.stringify({ status: 1 }),
+ }),
+ }}
+ list={recentOrders}
+ />
+ <Spacer />
+ <NbCard
+ icon={SensorOccupiedIcon}
+ title={translate('page.member.header.totalMembers')}
+ subtitle={`${statistic?.membersTotalQua}`}
+ to={{
+ pathname: '/task',
+ search: JSON.stringify({
+ filter: JSON.stringify({ status: 1 }),
+ }),
+ }}
+ list={recentOrders}
+ />
+ </div>
+ </div>
+ </div>
+
+ {/* <Box sx={{
+ display: 'flex',
+ mt: 2,
+ gap: 2,
+ justifyContent: 'space-between',
+ }}>
+ <CardWithIcon
+ icon={WifiIcon}
+ title={translate('page.member.header.onlineMembers')}
+ subtitle={`${statistic?.membersOnlineQua}`}
+ />
+ <CardWithIcon
+ icon={SensorOccupiedIcon}
+ title={translate('page.member.header.totalMembers')}
+ subtitle={`${statistic?.membersTotalQua}`}
+ />
+ <CardWithIcon
+ icon={WifiIcon}
+ title={translate('page.member.header.onlineMembers')}
+ subtitle={`${statistic?.membersOnlineQua}`}
+ />
+ <CardWithIcon
+ icon={SensorOccupiedIcon}
+ title={translate('page.member.header.totalMembers')}
+ subtitle={`${statistic?.membersTotalQua}`}
+ />
+ </Box > */}
+ </>
+ )
+}
+
+const Spacer = () => <span style={{ width: '1em' }} />;
+
export default Dashboard;
\ No newline at end of file
diff --git a/rsf-admin/src/page/dashboard/welcome_illustration.svg b/rsf-admin/src/page/dashboard/welcome_illustration.svg
new file mode 100644
index 0000000..5ad3b75
--- /dev/null
+++ b/rsf-admin/src/page/dashboard/welcome_illustration.svg
@@ -0,0 +1 @@
+<svg id="b66c9c51-8109-402d-a3f9-100a5bb3d153" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="890.30174" height="489.29978" viewBox="0 0 890.30174 489.29978"><title>work_together</title><rect x="182.97245" y="0.39886" width="703.57565" height="450.60114" fill="#e6e6e6"/><rect x="245.18701" y="60.90722" width="254" height="261" fill="#fff"/><rect x="594.18701" y="65.96874" width="254" height="317" fill="#fff"/><ellipse cx="844.80174" cy="477.2616" rx="45.5" ry="6.5" fill="#e6e6e6"/><ellipse cx="389.89961" cy="477.40722" rx="45.5" ry="6.5" fill="#e6e6e6"/><ellipse cx="104.42498" cy="470.90722" rx="104.42498" ry="5" fill="#e6e6e6"/><rect x="182.67203" width="703.57565" height="29.89047" fill="#567aae"/><circle cx="204.88423" cy="15.28159" r="5.53997" fill="#e6e6e6"/><circle cx="225.91256" cy="15.28159" r="5.53997" fill="#e6e6e6"/><circle cx="246.94089" cy="15.28159" r="5.53997" fill="#e6e6e6"/><path d="M947.03614,356.34879H945.4975V314.19823a24.3956,24.3956,0,0,0-24.39567-24.39563H831.80022a24.3956,24.3956,0,0,0-24.39567,24.39563V545.43948a24.3956,24.3956,0,0,0,24.39567,24.39563h89.30161a24.3956,24.3956,0,0,0,24.39567-24.39563V386.35227h1.53864Z" transform="translate(-154.84913 -205.35011)" fill="#3f3d56"/><path d="M921.08621,296.1495H909.42939a8.6555,8.6555,0,0,1-8.01381,11.92446H850.25579A8.65552,8.65552,0,0,1,842.242,296.1495H831.35448a18.21836,18.21836,0,0,0-18.21838,18.21834v230.902a18.21836,18.21836,0,0,0,18.21838,18.21836h89.73173a18.21837,18.21837,0,0,0,18.21839-18.21836v-230.902A18.21837,18.21837,0,0,0,921.08621,296.1495Z" transform="translate(-154.84913 -205.35011)" fill="#fff"/><rect x="284.09023" y="225.77561" width="176.5444" height="8.05267" fill="#e6e6e6"/><rect x="284.09023" y="251.77561" width="176.5444" height="8.05267" fill="#567aae"/><rect x="284.09023" y="277.77561" width="176.5444" height="8.05267" fill="#e6e6e6"/><rect x="670.83934" y="243.34556" width="103.06376" height="8.05267" fill="#e6e6e6"/><rect x="670.83934" y="268.34556" width="103.06376" height="8.05267" fill="#e6e6e6"/><rect x="670.83934" y="293.34556" width="103.06376" height="8.05267" fill="#e6e6e6"/><rect x="922.35071" y="606.56341" width="17.17729" height="17.17729" transform="translate(1391.24229 -521.13741) rotate(90)" fill="#3f3d56"/><rect x="894.67619" y="606.56341" width="17.17729" height="17.17729" transform="translate(1363.56776 -493.46289) rotate(90)" fill="#567aae"/><rect x="867.00166" y="606.56341" width="17.17729" height="17.17729" transform="translate(1335.89323 -465.78836) rotate(90)" fill="#3f3d56"/><rect x="839.32713" y="606.56341" width="17.17729" height="17.17729" transform="translate(1308.2187 -438.11383) rotate(90)" fill="#3f3d56"/><rect x="811.6526" y="606.56341" width="17.17729" height="17.17729" transform="translate(1280.54418 -410.4393) rotate(90)" fill="#3f3d56"/><rect x="692.7424" y="138.9903" width="57.25764" height="57.25764" fill="#567aae"/><path d="M504.45442,480.943l-.74114,1.48227-2.2234-11.117s-2.96454-11.85815,2.96454-11.85815,4.4468,11.85815,4.4468,11.85815v8.15248Z" transform="translate(-154.84913 -205.35011)" fill="#a0616a"/><path d="M601.69555,479.42524l.74113,1.48227,2.22341-11.117s2.96454-11.85815-2.96454-11.85815-4.44681,11.85815-4.44681,11.85815V477.943Z" transform="translate(-154.84913 -205.35011)" fill="#a0616a"/><polygon points="382.215 358.94 373.322 413.784 377.768 467.145 388.144 462.699 386.662 422.677 397.038 390.808 399.261 428.606 394.815 467.886 408.155 469.369 417.79 388.585 417.049 361.163 382.215 358.94" fill="#2f2e41"/><path d="M537.06434,665.82526l-5.18794,8.15248V692.194a2.209,2.209,0,0,0,1.85635,2.18045c2.5428.41721,6.97037.71364,8.51954-1.86831,2.2234-3.70567.74113-11.85816.74113-11.85816s2.96454-5.92907,1.48227-10.37588-2.96454-5.18794-2.96454-5.18794Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><path d="M559.29839,673.23661l1.48227,2.2234s2.2234,2.22341.74113,3.70568a28.96565,28.96565,0,0,0-2.96454,3.70567s-8.15248,2.2234-8.15248-.74114v-9.63475Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><circle cx="401.77827" cy="288.79506" r="9.82427" fill="#a0616a"/><polygon points="395.185 291.867 394.444 305.949 407.784 306.69 407.043 292.608 395.185 291.867" fill="#a0616a"/><path d="M564.48633,512.41037l-2.10384-5.13957s-9.75432-3.75405-12.71885-.04838l-1.48227,4.44681-11.85816-2.96454-6.67021,14.8227,5.92908,42.24468s15.56382,20.01064,36.3156.74113l5.92908-40.02127L573.38,510.9281Z" transform="translate(-154.84913 -205.35011)" fill="#575a89"/><polygon points="417.049 308.543 418.531 305.578 433.354 296.684 442.4 269.907 449.4 272.907 441.506 304.837 420.013 324.847 417.049 308.543" fill="#575a89"/><polygon points="382.956 304.837 381.474 303.355 365.91 293.72 354.793 271.486 345.9 274.45 355.534 301.872 379.251 321.142 382.956 304.837" fill="#575a89"/><path d="M563.91892,479.10047l1.60629-.80315-2.40943-.80314V476.691s-12.04715-4.81886-13.65343,3.21257a16.14329,16.14329,0,0,0,0,19.27544v2.40942l12.85029,1.60629,1.60628-4.81886S571.95036,483.91933,563.91892,479.10047Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><path d="M269.93891,565.15978l-2.85542,1.42771s-11.42168,5.23493-8.09036,8.09035,12.37349-2.85542,12.37349-2.85542l1.90361-2.37952Z" transform="translate(-154.84913 -205.35011)" fill="#ffb8b8"/><polygon points="198.633 359.099 189.807 418.346 176.481 459.749 169.343 456.418 176.005 399.786 156.969 383.605 158.397 359.81 198.633 359.099" fill="#2f2e41"/><path d="M323.24006,663.19583s8.09036-4.28313,8.56626,1.90361l-.95181,6.18674s2.85542,10.94578-6.66264,8.56626-2.85542-9.51806-2.85542-9.51806Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><path d="M318.00513,583.72l-6.18674,5.23493s0,32.36142,4.28312,37.12045,31.40961,29.0301,32.36142,29.9819,5.23494-9.51806,5.23494-9.51806l-25.69878-29.9819,1.90362-18.56023Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><path d="M350.84245,645.11151s7.61445-1.42771,7.61445,3.80722a115.23116,115.23116,0,0,0,.9518,12.37349s1.90362,16.65661-4.28313,14.27709-8.56625-19.03612-8.56625-19.03612a7.08933,7.08933,0,0,1,2.85542-3.33133C351.31835,652.25006,350.84245,645.11151,350.84245,645.11151Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><polygon points="172.198 288.424 173.626 306.033 169.819 312.695 159.349 302.701 158.397 289.376 172.198 288.424" fill="#ffb8b8"/><circle cx="163.6319" cy="282.71335" r="11.42168" fill="#ffb8b8"/><polygon points="168.391 305.557 173.15 291.756 181.716 301.274 197.421 361.713 185.523 368.852 180.289 361.237 179.337 371.231 156.017 366.472 154.114 302.701 158.87 296.002 168.391 305.557" fill="#d0cde1"/><polygon points="161.728 373.135 158.873 296.039 152.686 300.798 141.264 308.412 148.879 335.539 151.258 364.093 161.728 373.135" fill="#2f2e41"/><polygon points="144.596 308.888 141.264 308.412 131.746 336.49 112.71 360.286 119.849 367.9 141.74 346.484 149.831 328.876 144.596 308.888" fill="#2f2e41"/><path d="M351.4174,565.59536l-.64933,3.12573s-2.97081,12.20793,1.33475,11.36336,5.4281-11.48008,5.4281-11.48008l-.68754-2.96869Z" transform="translate(-154.84913 -205.35011)" fill="#ffb8b8"/><polygon points="172.406 290.983 195.993 300.322 193.138 328.876 198.849 360.286 193.138 366.472 172.022 295.028 172.406 290.983" fill="#2f2e41"/><path d="M319.079,468.8806l3.35262-1.6763v1.6763l2.23507-1.11753v2.79384s8.38153,6.14645,6.70522,13.41044-1.67631,7.82276-1.67631,7.82276-2.11922-13.81412-10.50074-11.57905-9.05615,2.63876-11.29122,8.78521l-.60636,2.63647S297.84583,469.99814,319.079,468.8806Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><polygon points="192.662 300.322 196.469 567aae300.322 202.656 333.635 202.656 362.665 195.042 361.237 188.855 317.454 192.662 300.322" fill="#2f2e41"/><rect x="3.53501" y="370.77159" width="140.32096" height="97.51118" fill="#567aae"/><path d="M228.54462,595.14827a29.729,29.729,0,1,0,29.729,29.729A29.81642,29.81642,0,0,0,228.54462,595.14827Zm0,8.9187a8.91871,8.91871,0,1,1-8.91871,8.91871,8.94863,8.94863,0,0,1,8.91871-8.91871Zm0,42.93556a21.65737,21.65737,0,0,1-17.83742-9.519c.14293-5.94581,11.89161-9.21886,17.83742-9.21886s17.69448,3.27305,17.8374,9.21886a21.69344,21.69344,0,0,1-17.83741,9.519Z" transform="translate(-154.84913 -205.35011)" fill="#fff"/><rect x="284.18701" y="90.90722" width="176" height="101" fill="#e6e6e6"/><path d="M963.0513,496.58366l.81548-5.25988s4.75311-10.80516.99606-11.38765-6.89084,9.70426-6.89084,9.70426l1.37467,10.98574Z" transform="translate(-154.84913 -205.35011)" fill="#ffb8b8"/><polygon points="846.67 321.051 813.089 314.306 809.187 289.847 799.302 289.084 799.785 320.707 828.962 336.004 846.67 321.051" fill="#575a89"/><polygon points="846.67 321.051 813.089 314.306 809.187 289.847 799.302 289.084 799.785 320.707 828.962 336.004 846.67 321.051" opacity="0.2"/><rect x="910.1623" y="482.06175" width="103.06376" height="8.05267" transform="translate(1768.53923 766.82607) rotate(-180)" fill="#567aae"/><path d="M956.49034,494.78044l.00669-5.32271s3.05587-11.402-.74606-11.40676-5.33608,10.63873-5.33608,10.63873l3.02818,10.64924Z" transform="translate(-154.84913 -205.35011)" fill="#ffb8b8"/><path d="M1000.2023,510.02489l4.60746-1.12311a11.86169,11.86169,0,0,0,11.64163-14.21088h0a15.50416,15.50416,0,0,0-15.48468-15.52363h0A15.50417,15.50417,0,0,0,985.443,494.65194v0A12.32065,12.32065,0,0,0,1000.2023,510.02489Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><polygon points="818.254 381.458 822.005 422.524 828.797 462.833 840.203 462.847 838.732 423.305 832.709 375.393 818.254 381.458" fill="#2f2e41"/><path d="M985.17015,665.90379l-7.6096,4.55277s-12.1681,1.50549-9.89171,5.31029,28.89279,1.55707,28.8947.03629-.748-9.886-2.26874-9.88789Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><path d="M1006.77139,583.2605s-.21394,5.87095-5.54811,14.98891l.72505,28.13527,27.33,35.01218-9.89553,8.35184-33.40927-38.06137-8.307-45.63372,10.65879-10.63205Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><path d="M1026.99716,661.394s9.12274,1.53224,7.59719,5.33226-5.34945,21.28415-15.23162,18.99057c0,0-4.56232-.00573-3.03773-3.04536a55.0044,55.0044,0,0,1,3.04824-5.31889l.01241-9.885Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><circle cx="840.41522" cy="294.04136" r="11.40581" fill="#ffb8b8"/><polygon points="845.728 301.652 845.712 314.578 833.546 314.563 835.083 301.639 845.728 301.652" fill="#ffb8b8"/><path d="M985.35926,515.34718l3.68652-.9056,11.52122.9247s6.07545,6.09074,5.31316,7.61055-4.611,38.774-4.611,38.774l6.81006,26.62213-24.33429,1.49021-12.16428-1.53605,2.34133-47.90151s-5.30647-12.93326,1.54178-16.7266A29.95429,29.95429,0,0,0,985.35926,515.34718Z" transform="translate(-154.84913 -205.35011)" fill="#575a89"/><polygon points="844.193 313.056 809.978 311.492 802.404 287.911 792.518 288.658 797.801 319.841 828.964 330.526 844.193 313.056" fill="#575a89"/><circle cx="862.43241" cy="278.27937" r="7.35883" fill="#2f2e41"/><path d="M1010.49168,479.67357a7.35536,7.35536,0,0,1,8.807-7.20494A7.3554,7.3554,0,1,0,1014.711,486.331,7.35277,7.35277,0,0,1,1010.49168,479.67357Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><path d="M1004.17862,483.847l-9.92079-1.82669-7.62952,4.78184a11.57336,11.57336,0,0,0-5.33128,11.29456l7.64125-1.93681,1.71106-4.29045,2.03787,3.34024,8.26714,14.45412,8.37-4.55181,5.33322-8.35757Z" transform="translate(-154.84913 -205.35011)" fill="#2f2e41"/><rect x="526.03635" y="245.29674" width="1.99958" height="202.92117" transform="translate(-190.8885 425.93087) rotate(-60.15005)" fill="#fff"/><rect x="425.57556" y="345.75754" width="202.92117" height="1.99958" transform="translate(-257.51689 102.92685) rotate(-29.84553)" fill="#fff"/><rect x="875.53625" y="332.45224" width="1.99979" height="80.61017" transform="translate(-161.69687 523.63263) rotate(-45)" fill="#fff"/><rect x="836.23106" y="371.75743" width="80.61017" height="1.99979" transform="translate(-161.69687 523.63263) rotate(-45)" fill="#fff"/></svg>
\ No newline at end of file
diff --git a/rsf-admin/src/page/orders/wave/WaveList.jsx b/rsf-admin/src/page/orders/wave/WaveList.jsx
index e59f4f3..9717a8a 100644
--- a/rsf-admin/src/page/orders/wave/WaveList.jsx
+++ b/rsf-admin/src/page/orders/wave/WaveList.jsx
@@ -165,7 +165,6 @@
<TextField source="updateBy$" label="common.field.updateBy" />
<DateField source="updateTime" label="common.field.updateTime" showTime />
<TextField source="createBy$" label="common.field.createBy" />
-
<CustomProcess source="progress" label="table.field.wave.progress" />
<TextField source="memo" label="common.field.memo" sortable={false} />
<TextField source="exceStatus$" label="table.field.wave.exceStatus" sortable={false} />
diff --git a/rsf-admin/src/page/orders/wave/WavePanel.jsx b/rsf-admin/src/page/orders/wave/WavePanel.jsx
index ff8f739..dbe6128 100644
--- a/rsf-admin/src/page/orders/wave/WavePanel.jsx
+++ b/rsf-admin/src/page/orders/wave/WavePanel.jsx
@@ -35,9 +35,9 @@
const WavePanel = () => {
const record = useRecordContext();
if (!record) return null;
- const translate = useTranslate();
const [createDialog, setCreateDialog] = useState(false);
const [drawerVal, setDrawerVal] = useState(false);
+ const translate = useTranslate();
const { data, total, isPending, error, refetch, meta } = useGetList('/waveOrderRela', { filter: { waveId: record?.id } });
const listContext = useList({ data, isPending });
@@ -71,7 +71,7 @@
omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']}
>
<NumberField source="id" />,
- <TextField source="asnCode" label="table.field.asnOrderItem.asnCode" />
+ <TextField source="asnCode" label="table.field.asnOrderItem.orderCode" />
<TextField source="matnrCode" label="table.field.asnOrderItem.matnrCode" />
<TextField source="maktx" label="table.field.asnOrderItem.maktx" />
<TextField source="splrBatch" label="table.field.asnOrderItem.splrBatch" />
diff --git a/rsf-admin/src/page/statistics/outStockNum/OutStockNumList.jsx b/rsf-admin/src/page/statistics/outStockNum/OutStockNumList.jsx
index 574553a..0f68b3e 100644
--- a/rsf-admin/src/page/statistics/outStockNum/OutStockNumList.jsx
+++ b/rsf-admin/src/page/statistics/outStockNum/OutStockNumList.jsx
@@ -73,19 +73,10 @@
const translate = useTranslate();
const [createDialog, setCreateDialog] = useState(false);
const [drawerVal, setDrawerVal] = useState(false);
- // const dict = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_task_type' && dict.group == 3)) || [];
-
const filters = [
<SearchInput source="condition" alwaysOn />,
<DateInput label='common.time.before' source="dayTime" alwaysOn />,
- // <AutocompleteInput optionText="label"
- // choices={dict}
- // optionValue="value"
- // label="table.field.stockStatistic.taskType"
- // filter
- // source="taskType"
- // alwaysOn />,
<TextInput source="maktx" label="table.field.locItem.maktx" />,
<TextInput source="matnrCode" label="table.field.locItem.matnrCode" alwaysOn/>,
<TextInput source="batch" label="table.field.locItem.batch" />,
@@ -124,7 +115,6 @@
omit={['id', 'memo']}
>
<NumberField source="id" key="id-key"/>
- {/* <TextField source="taskType$" label="table.field.stockStatistic.taskType" /> */}
<TextField source="dayTime" label="table.field.stockStatistic.dayTime" />
<TextField source="matnrCode" label="table.field.locItem.matnrCode" />
<TextField source="maktx" label="table.field.locItem.maktx" />
diff --git a/rsf-admin/src/page/statistics/stockStatisticNum/stockStatisticList.jsx b/rsf-admin/src/page/statistics/stockStatisticNum/stockStatisticList.jsx
index e6eeff5..97ac3f0 100644
--- a/rsf-admin/src/page/statistics/stockStatisticNum/stockStatisticList.jsx
+++ b/rsf-admin/src/page/statistics/stockStatisticNum/stockStatisticList.jsx
@@ -46,22 +46,14 @@
cursor: 'auto'
},
- '& .column-dayTime': {
- width: 120,
- textAlign: 'center',
- },
-
- '& .column-taskType$': {
- width: 130,
- },
-
- '& .column-matnrCode': {
- width: 150,
+ '& .RaDatagrid-rowCell': {
+ color: 'black',
textAlign: 'center',
},
'& .RaDatagrid-headerCell': {
color: 'black',
+ textAlign: 'center',
},
'& .column-maktx': {
@@ -73,19 +65,10 @@
const translate = useTranslate();
const [createDialog, setCreateDialog] = useState(false);
const [drawerVal, setDrawerVal] = useState(false);
- // const dict = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_task_type' && dict.group == 3)) || [];
-
const filters = [
<SearchInput source="condition" alwaysOn />,
<DateInput label='common.time.before' source="dayTime" alwaysOn />,
- // <AutocompleteInput optionText="label"
- // choices={dict}
- // optionValue="value"
- // label="table.field.stockStatistic.taskType"
- // filter
- // source="taskType"
- // alwaysOn />,
<TextInput source="maktx" label="table.field.locItem.maktx" />,
<TextInput source="matnrCode" label="table.field.locItem.matnrCode" alwaysOn />,
<TextInput source="batch" label="table.field.locItem.batch" />,
@@ -104,7 +87,6 @@
}}
title={false}
empty={false}
- filter={{ taskType: 101, taskStatus: 200 }}
filters={filters}
sort={{ field: "day_time", order: "desc" }}
actions={(
--
Gitblit v1.9.1