From adb83050b74c2d7fa1845f18e016ef3b18496543 Mon Sep 17 00:00:00 2001
From: zc <zyzc>
Date: 星期三, 22 十月 2025 17:15:43 +0800
Subject: [PATCH] pda波次揀貨優化 放貨成功上報優化 出入庫站點功能優化
---
rsf-admin/src/page/dashboard/index.jsx | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 175 insertions(+), 5 deletions(-)
diff --git a/rsf-admin/src/page/dashboard/index.jsx b/rsf-admin/src/page/dashboard/index.jsx
index 0ee3aa1..a41514c 100644
--- a/rsf-admin/src/page/dashboard/index.jsx
+++ b/rsf-admin/src/page/dashboard/index.jsx
@@ -1,9 +1,28 @@
+import { useTranslate, useAuthProvider, Title, useNotify } from 'react-admin';
+import { Box, Typography, LinearProgress, Stack, Grid } from '@mui/material';
import React, { useState, useRef, useEffect, useMemo } from "react";
-import { useNavigate } from 'react-router-dom';
+import SensorOccupiedIcon from '@mui/icons-material/SensorOccupied';
+import CardWithIcon from '../components/CardWithIcon';
+import CommentIcon from '@mui/icons-material/Comment';
+import WifiIcon from '@mui/icons-material/Wifi';
import { useTheme } from '@mui/material/styles';
-import { useTranslate, useAuthProvider } from 'react-admin';
-import { WordEffect } from './WordEffect';
+import { useNavigate } from 'react-router-dom';
import { getSystemDicts } from '@/api/auth'
+import { WordEffect } from './WordEffect';
+import request from '@/utils/request';
+import Welcome from "./Welcome";
+import NbChart from "./NbChart";
+import NbList from "./NbList";
+import NbCard from "./NbCard";
+import NbPie from './NbPie';
+
+const styles = {
+ flex: { display: 'flex' },
+ flexColumn: { display: 'flex', flexDirection: 'column' },
+ leftCol: { flex: 1, },
+ rightCol: { flex: 1, },
+ singleCol: { marginTop: '1em', marginBottom: '1em' },
+};
const Dashboard = () => {
const authProvider = useAuthProvider();
@@ -22,6 +41,9 @@
return (
<>
+ <Title title={"menu.dashboard"} />
+ <Welcome />
+ <DashboardSummaryView />
<div
style={{
boxSizing: 'border-box',
@@ -34,17 +56,165 @@
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({});
+ const [stock, setStock] = useState([]);
+ const [deadStock, setDeadStock] = useState([]);
+ const [locUsage, setLocUsages] = useState([]);
+ const [tasks, setTasks] = useState([]);
+ const [total, setTotal] = useState(0);
+
+
+ useEffect(() => {
+ getDashBoardHeader()
+ getRecentTrands()
+ getRecentStocks()
+ getRecentUsage()
+ getExcingTasks()
+
+ }, [])
+
+ const getDashBoardHeader = async () => {
+ await request.post('/asnOrder/dashbord/header').then(res => {
+ const { code, msg, data } = res?.data;
+ console.log(code);
+
+ if (code === 200) {
+ setStatistic(data);
+ } else {
+ notify(msg, { type: 'error', messageArgs: { _: msg } });
+ }
+ }).catch((error) => {
+ notify(error.message, { type: 'error', messageArgs: { _: error.message } });
+ })
+ }
+
+ const getRecentStocks = async () => {
+ await request.post('/locItem/page', { current: 1, pageSize: 10, orderBy: 'create_time asc' }).then(res => {
+ const { code, msg, data } = res?.data;
+ if (code === 200) {
+ setDeadStock(data?.records);
+ } else {
+ notify(msg, { type: 'error', messageArgs: { _: msg } });
+ }
+ }).catch((error) => {
+ notify(error.message, { type: 'error', messageArgs: { _: error.message } });
+ })
+ }
+
+ const getExcingTasks = async () => {
+ await request.post('/task/page', { current: 1, pageSize: 100, orderBy: 'sort desc' }).then(res => {
+ const { code, msg, data } = res?.data;
+ if (code === 200) {
+ setTasks(data?.records)
+ setTotal(data?.total)
+ } else {
+ notify(msg, { type: 'error', messageArgs: { _: msg } });
+ }
+ }).catch((error) => {
+ notify(error.message, { type: 'error', messageArgs: { _: error.message } });
+ })
+ }
+
+ const getRecentUsage = () => {
+ request.post("/loc/pie/list").then(res => {
+ const { code, msg, data } = res?.data;
+ if (code === 200) {
+ setLocUsages(data?.data)
+ } else {
+ notify(msg, { type: 'error', messageArgs: { _: msg } });
+ }
+ }).catch((error) => {
+ notify(error.message, { type: 'error', messageArgs: { _: error.message } });
+ })
+ }
+
+ /**
+ * 鑾峰彇搴撹繎涓�涓湀鍑哄叆搴撲俊鎭�
+ */
+ const getRecentTrands = async () => {
+ await request.post('/asnOrder/stock/trand').then(res => {
+ const { code, msg, data } = res.data?.data;
+ if (code === 200) {
+ setStock(data)
+ } else {
+ notify(msg, { type: 'error', messageArgs: { _: msg } });
+ }
+ }).catch((error) => {
+ notify(error.message, { type: 'error', messageArgs: { _: error.message } });
+ })
+ }
+
+ return (
+ <>
+ <Grid container md={12} item>
+ <Grid item md={8}>
+ <Box sx={{ display: "flex" }}>
+ <CardWithIcon
+ icon={WifiIcon}
+ subtitle={translate('page.dashboard.header.inStockQty')}
+ title={`${statistic?.inAnf}`}
+ type={"in"}
+ statistic={statistic}
+ />
+ <Spacer />
+ <CardWithIcon
+ icon={SensorOccupiedIcon}
+ subtitle={translate('page.dashboard.header.outStockQty')}
+ title={`${statistic?.outAnf}`}
+ type={"out"}
+ statistic={statistic}
+ />
+ </Box>
+ <Spacer />
+ <Box>
+ <NbChart orders={stock} />
+ </Box>
+ <Spacer />
+ <Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
+ <NbList deadStock={deadStock} />
+ <NbPie locUsage={locUsage} />
+ </Box>
+ <Spacer />
+ </Grid>
+ <Grid item md={4}>
+ <Box sx={{ display: 'flex' }}>
+ <Spacer />
+ <NbCard
+ icon={CommentIcon}
+ subtitle={translate('page.dashboard.header.taskWorkQty')}
+ title={`${statistic?.taskQty}`}
+ total={total}
+ to={{
+ pathname: '/task',
+ search: JSON.stringify({
+ filter: JSON.stringify({ status: 1 }),
+ }),
+ }}
+ tasks={tasks}
+ />
+ </Box>
+ </Grid>
+ </Grid>
+ </>
+ )
+}
+
+const Spacer = () => <span style={{ width: '1em' }} />;
+
export default Dashboard;
\ No newline at end of file
--
Gitblit v1.9.1