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