From e6cf7f032bee1cef9c49258746da44d66ca85c6c Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期三, 17 九月 2025 14:56:59 +0800
Subject: [PATCH] 添加仓库类型 单据添加上报完成类型

---
 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