From beb003f8e8cd5ae31a0ac55d0624ed2b2ad862bb Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期四, 14 八月 2025 11:21:49 +0800
Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop

---
 rsf-admin/src/page/dashboard/NbList.jsx        |   65 ++++-
 rsf-admin/src/page/components/CardWithIcon.jsx |  123 ++++++----
 rsf-admin/src/page/dashboard/NbCard.jsx        |  102 ++++----
 rsf-admin/src/i18n/zh.js                       |   18 +
 rsf-admin/src/i18n/en.js                       |   11 +
 rsf-admin/src/page/dashboard/index.jsx         |  219 ++++++++-----------
 rsf-admin/src/page/dashboard/NbPie.jsx         |   53 ++++
 rsf-admin/src/page/dashboard/NbChart.jsx       |   22 +
 8 files changed, 364 insertions(+), 249 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 33a5693..4312ccf 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -1211,6 +1211,17 @@
             welcome: {
                 title: 'Welcome to the WMS website',
             },
+            header: {
+                inStockQty: '',
+                outStockQty: '',
+                taskWorkQty: '',
+            },
+            chart: {
+                histories: 'Orders Echart',
+            },
+            list: {
+                stock: 'Stock Pie',
+            }
         },
         welcome: {
             index: '    Welcome to the RSF Management System.',
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 2046fac..2ca1992 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -1223,6 +1223,24 @@
             welcome: {
                 title: '娆㈣繋浣跨敤 WMS 绯荤粺',
             },
+            header: {
+                inStockQty: '浠婃棩鍏ュ簱鍗曟暟鎹�',
+                outStockQty: '浠婃棩鍑哄簱鍗曟暟鎹�',
+                taskWorkQty: '寰呭姙浠诲姟鎻愰啋',
+                planQty: '璁″垝',
+                realQty: '瀹為檯',
+                waitQty: '寰呭叆',
+                waitOutQty: '寰呭嚭',
+
+            },
+            chart: {
+                histories: '鍑哄叆搴撹秼鍔垮浘',
+            },
+            list: {
+                stock: '鎬诲簱瀛橀噺',
+            },
+
+
         },
         welcome: {
             index: '  娆㈣繋浣跨敤RSF绠$悊绯荤粺',
diff --git a/rsf-admin/src/page/components/CardWithIcon.jsx b/rsf-admin/src/page/components/CardWithIcon.jsx
index 606911e..567a0bb 100644
--- a/rsf-admin/src/page/components/CardWithIcon.jsx
+++ b/rsf-admin/src/page/components/CardWithIcon.jsx
@@ -1,60 +1,85 @@
 import * as React from 'react';
 import { FC, createElement } from 'react';
-import { Card, Box, Typography, Divider } from '@mui/material';
+import { Card, Box, Typography, Divider, Stack } from '@mui/material';
+import { useTranslate } from 'react-admin';
+
 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
+const CardWithIcon = ({ icon, title, subtitle, to, children, statistic, type }) => {
+    const translate = useTranslate();
+    return (
+        <Card
             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,
+                width: '100%',
+                minHeight: 52,
+                flexDirection: 'column',
+                flex: '1',
+                '& a': {
+                    textDecoration: 'none',
+                    color: 'inherit',
                 },
             }}
         >
-            <Box width="3em" className="icon">
-                {createElement(icon, { fontSize: 'large' })}
+            <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 variant="h5" component="h2">
+                        {subtitle || '鈥�'}
+                    </Typography>
+                    {type ? <Box sx={{ display: "flex" }}>
+                        <Box sx={{ display: 'flex', padding: '1em' }}>
+                            <Typography color="textSecondary">{translate("page.dashboard.header.planQty")}锛�</Typography>
+                            <Typography color="textSecondary">{statistic?.inAnf}</Typography>
+                        </Box>
+                        {!children && <Box sx={{ display: "flex" }}>
+                            <Box sx={{ display: 'flex', padding: '1em' }}>
+                                <Typography color="textSecondary">{translate("page.dashboard.header.realQty")}锛�</Typography>
+                                <Typography color="textSecondary">{statistic?.taskIn}</Typography>
+                            </Box>
+                            <Box sx={{ display: 'flex', padding: '1em' }}>
+                                <Typography color="textSecondary">{type == 'in' ? translate("page.dashboard.header.waitQty") : translate("page.dashboard.header.waitOutQty")}锛�</Typography>
+                                <Typography color="textSecondary">{type == 'in' ? statistic?.taskIn : statistic?.taskOut}</Typography>
+                            </Box>
+                        </Box>}
+                    </Box> : <Box>
+                        <Typography  sx={{ display: 'flex', padding: '1em' }}>
+                            {'鈥�12234'}
+                        </Typography>
+                    </Box>}
+                </Box>
             </Box>
-            <Box textAlign="right">
-                <Typography color="textSecondary">{title}</Typography>
-                <Typography variant="h5" component="h2">
-                    {subtitle || '鈥�'}
-                </Typography>
-            </Box>
-        </Box>
-        {children && <Divider />}
-        {children}
-    </Card>
-);
+            {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
index eb22c20..4701aef 100644
--- a/rsf-admin/src/page/dashboard/NbCard.jsx
+++ b/rsf-admin/src/page/dashboard/NbCard.jsx
@@ -37,21 +37,22 @@
     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>
+        <>
+            <CardWithIcon
+                icon={CommentIcon}
+                title={translate('page.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',
@@ -66,41 +67,42 @@
                                 </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}>&nbsp;</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>
+                                <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}>&nbsp;</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>
+        </>
     );
 };
 
diff --git a/rsf-admin/src/page/dashboard/NbChart.jsx b/rsf-admin/src/page/dashboard/NbChart.jsx
index a0b6373..a154760 100644
--- a/rsf-admin/src/page/dashboard/NbChart.jsx
+++ b/rsf-admin/src/page/dashboard/NbChart.jsx
@@ -49,11 +49,12 @@
 
     return (
         <Card>
-            <CardHeader title={translate('pos.dashboard.month_history')} />
+            <CardHeader title={translate('page.dashboard.chart.histories')} />
             <CardContent>
                 <div style={{ width: '100%', height: 300 }}>
                     <ResponsiveContainer>
-                        <AreaChart data={getRevenuePerDay(orders)}>
+                        <AreaChart data={orders?.trandItem
+                        }>
                             <defs>
                                 <linearGradient
                                     id="colorUv"
@@ -75,17 +76,15 @@
                                 </linearGradient>
                             </defs>
                             <XAxis
-                                dataKey="date"
-                                name="Date"
-                                type="number"
-                                scale="time"
+                                dataKey="orderTime"
+
                                 domain={[
                                     addDays(aMonthAgo, 1).getTime(),
                                     new Date().getTime(),
                                 ]}
                                 tickFormatter={dateFormatter}
                             />
-                            <YAxis dataKey="total" name="Revenue" unit="鈧�" />
+                            <YAxis dataKey="inQty" name="Revenue" unit="" />
                             <CartesianGrid strokeDasharray="3 3" />
                             <Tooltip
                                 cursor={{ strokeDasharray: '3 3' }}
@@ -101,7 +100,14 @@
                             />
                             <Area
                                 type="monotone"
-                                dataKey="total"
+                                dataKey="inQty"
+                                stroke="#50911aff"
+                                strokeWidth={2}
+                                fill="url(#colorUv)"
+                            />
+                            <Area
+                                type="monotone"
+                                dataKey="outQty"
                                 stroke="#5091abff"
                                 strokeWidth={2}
                                 fill="url(#colorUv)"
diff --git a/rsf-admin/src/page/dashboard/NbList.jsx b/rsf-admin/src/page/dashboard/NbList.jsx
index 9bb7024..4cb2005 100644
--- a/rsf-admin/src/page/dashboard/NbList.jsx
+++ b/rsf-admin/src/page/dashboard/NbList.jsx
@@ -5,25 +5,25 @@
     ListItemSecondaryAction,
     ListItemAvatar,
     ListItemText,
+    Typography,
     Avatar,
     Box,
     ListItemButton,
     Card,
     CardHeader,
     List,
+    Grid,
 } from '@mui/material';
 import { Link } from 'react-router-dom';
 
-const NbList = (props) => {
-    const { orders = [] } = props;
+const NbList = ({ deadStock }) => {
     const translate = useTranslate();
-
     return (
         <Card sx={{ flex: 1 }}>
-            <CardHeader title={translate('pos.dashboard.pending_orders')} />
+            <CardHeader title={translate('page.dashboard.list.stock')} />
             <List dense={true}>
-                {orders.map(record => (
-                    <PendingOrder key={record.id} order={record} />
+                {deadStock.map(record => (
+                    <PendingOrder key={`record?.id + ${Math.random().toString(36).substr(2, 9)} `} order={record} />
                 ))}
             </List>
         </Card>
@@ -33,12 +33,11 @@
 export const PendingOrder = (props) => {
     const { order } = props;
     console.log(order);
-
     const translate = useTranslate();
-    const { referenceRecord: customer, isPending } = useReference({
-        reference: 'customers',
-        id: order.customer_id,
-    });
+    // const { referenceRecord: customer, isPending } = useReference({
+    //     reference: 'customers',
+    //     id: order.id,
+    // });
 
     return (
         <ListItem disablePadding>
@@ -54,13 +53,41 @@
                         />
                     )}
                 </ListItemAvatar> */}
-                <ListItemText
-                    primary={new Date(order.date).toLocaleString('en-GB')}
-                    secondary={translate('pos.dashboard.order.items', {
-                        name: order.name
+                {/* <ListItemText
+                    primary={new Date(order.createTime).toLocaleString('en-GB')}
+                    secondary={translate('page.dashboard.list.stock', {
+                        name: order.maktx
                     })}
-                />
-                <ListItemSecondaryAction>
+                >
+       
+                </ListItemText> */}
+                <Grid container item md={12}>
+                    <Box sx={{ display: 'flex' }}>
+                        <Box sx={{ display: 'flex', padding: '1em' }}>
+                            <Typography color="textSecondary">{translate("table.field.asnOrderItem.matnrCode")}锛�</Typography>
+                            <Typography color="textSecondary">{order?.matnrCode}</Typography>
+                        </Box>
+                    </Box>
+                    <Box sx={{ display: 'flex' }}>
+                        <Box sx={{ display: 'flex', padding: '1em' }}>
+                            <Typography color="textSecondary">{translate("table.field.asnOrderItem.maktx")}锛�</Typography>
+                            <Typography color="textSecondary" maxWidth="200" overflow="hidden">{order?.maktx}</Typography>
+                        </Box>
+                    </Box>
+                    <Box sx={{ display: 'flex' }}>
+                        <Box sx={{ display: 'flex', padding: '1em' }}>
+                            <Typography color="textSecondary">{translate("table.field.asnOrderItem.anfme")}锛�</Typography>
+                            <Typography color="textSecondary">{order?.anfme}</Typography>
+                        </Box>
+                    </Box>
+                    <Box sx={{ display: 'flex' }}>
+                        <Box sx={{ display: 'flex', padding: '1em' }}>
+                            <Typography color="textSecondary">{translate("table.field.locItem.deadTime")}锛�</Typography>
+                            <Typography color="textSecondary">{order?.deadTime}</Typography>
+                        </Box>
+                    </Box>
+                </Grid>
+                {/* <ListItemSecondaryAction>
                     <Box
                         component="span"
                         sx={{
@@ -68,9 +95,9 @@
                             color: 'text.primary',
                         }}
                     >
-                        {order.total}$
+                        {order.deadTime}
                     </Box>
-                </ListItemSecondaryAction>
+                </ListItemSecondaryAction> */}
             </ListItemButton>
         </ListItem>
     );
diff --git a/rsf-admin/src/page/dashboard/NbPie.jsx b/rsf-admin/src/page/dashboard/NbPie.jsx
new file mode 100644
index 0000000..6b2d64e
--- /dev/null
+++ b/rsf-admin/src/page/dashboard/NbPie.jsx
@@ -0,0 +1,53 @@
+
+import * as React from 'react';
+import { Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';
+import { Card } from "@mui/material";
+import { useTranslate } from "react-admin";
+
+
+const NbPie = ({ deadStock }) => {
+    const translate = useTranslate();
+
+    const data01 = [
+        { name: 'Group A', value: 400 },
+        { name: 'Group B', value: 300 },
+        { name: 'Group C', value: 300 },
+        { name: 'Group D', value: 200 },
+        { name: 'Group E', value: 278 },
+        { name: 'Group F', value: 189 },
+    ];
+
+    const data02 = [
+        { name: 'Group A', value: 2400 },
+        { name: 'Group B', value: 4567 },
+        { name: 'Group C', value: 1398 },
+        { name: 'Group D', value: 9800 },
+        { name: 'Group E', value: 3908 },
+        { name: 'Group F', value: 4800 },
+    ];
+
+    return (
+        <>
+            <Card>
+                <ResponsiveContainer width="100%" height="100%">
+                    <PieChart width={400} height={400}>
+                        <Pie
+                            dataKey="value"
+                            isAnimationActive={false}
+                            data={data01}
+                            cx="50%"
+                            cy="50%"
+                            outerRadius={80}
+                            fill="#8884d8"
+                            label
+                        />
+                        <Pie dataKey="value" data={data02} cx={500} cy={200} innerRadius={40} outerRadius={80} fill="#82ca9d" />
+                        <Tooltip />
+                    </PieChart>
+                </ResponsiveContainer>
+            </Card>
+        </>
+    );
+}
+
+export default NbPie;
\ 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 d8694e0..c2f7fd8 100644
--- a/rsf-admin/src/page/dashboard/index.jsx
+++ b/rsf-admin/src/page/dashboard/index.jsx
@@ -1,24 +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, Title, useNotify } from 'react-admin';
-import { WordEffect } from './WordEffect';
-import { getSystemDicts } from '@/api/auth'
-import Welcome from "./Welcome";
-import CardWithIcon from '../components/CardWithIcon';
+import { Box, Typography, LinearProgress, Stack, Grid } from '@mui/material';
+import React, { useState, useRef, useEffect, useMemo } from "react";
 import SensorOccupiedIcon from '@mui/icons-material/SensorOccupied';
+import CardWithIcon from '../components/CardWithIcon';
 import WifiIcon from '@mui/icons-material/Wifi';
+import { useTheme } from '@mui/material/styles';
+import { useNavigate } from 'react-router-dom';
+import { getSystemDicts } from '@/api/auth'
+import { WordEffect } from './WordEffect';
 import request from '@/utils/request';
-import { Box, Typography, LinearProgress, Stack } from '@mui/material';
+import Welcome from "./Welcome";
 import NbChart from "./NbChart";
 import NbList from "./NbList";
 import NbCard from "./NbCard";
+import { orderBy } from 'lodash';
+import NbPie from './NbPie';
 
 const styles = {
     flex: { display: 'flex' },
     flexColumn: { display: 'flex', flexDirection: 'column' },
-    leftCol: { flex: 1, marginRight: '0.5em' },
-    rightCol: { flex: 1, marginLeft: '0.5em' },
+    leftCol: { flex: 1, },
+    rightCol: { flex: 1, },
     singleCol: { marginTop: '1em', marginBottom: '1em' },
 };
 
@@ -70,139 +72,110 @@
 const DashboardSummaryView = () => {
     const translate = useTranslate();
     const notify = useNotify();
-    const [statistic, setStatistic] = useState(null);
+    const [statistic, setStatistic] = useState({});
+    const [stock, setStock] = useState([]);
+    const [deadStock, setDeadStock] = useState([]);
 
     useEffect(() => {
-        request.get('/dashboard/member/statistic', {
-            params: {}
-        }).then(res => {
-            const { code, msg, data } = res.data;
+        getDashBoardHeader()
+        getRecentTrands()
+        getRecentStocks()
+
+    }, [])
+
+    const getDashBoardHeader = async () => {
+        await request.post('/asnOrder/dashbord/header').then(res => {
+            const { code, msg, data } = res.data?.data;
             if (code === 200) {
                 setStatistic(data);
             } else {
-                // notify(msg, { type: 'error', messageArgs: { _: msg } });
+                notify(msg, { type: 'error', messageArgs: { _: msg } });
             }
         }).catch((error) => {
-            // notify(error.message, { type: 'error', messageArgs: { _: error.message } });
-            console.error(error);
+            notify(error.message, { type: 'error', messageArgs: { _: error.message } });
         })
-    }, [])
+    }
 
-    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
-        },
-    ]
+    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 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 (
         <>
-            <div style={styles.flex}>
-                <div style={styles.leftCol}>
-                    <div style={styles.flex}>
+            <Grid container md={12} item>
+                <Grid item md={8}>
+                    <Box sx={{ display: "flex" }}>
                         <CardWithIcon
                             icon={WifiIcon}
-                            title={translate('page.member.header.onlineMembers')}
-                            subtitle={`${statistic?.membersOnlineQua}`}
+                            subtitle={translate('page.dashboard.header.inStockQty')}
+                            title={`${statistic?.inAnf}`}
+                            type={"in"}
+                            statistic={statistic}
                         />
                         <Spacer />
                         <CardWithIcon
                             icon={SensorOccupiedIcon}
-                            title={translate('page.member.header.totalMembers')}
-                            subtitle={`${statistic?.membersTotalQua}`}
+                            subtitle={translate('page.dashboard.header.outStockQty')}
+                            title={`${statistic?.membersTotalQua}`}
+                            type={"out"}
+                            statistic={statistic}
                         />
-                    </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>
+                    <Spacer />
+                    <Box>
+                        <NbChart orders={stock} />
+                    </Box>
+                    <Spacer />
+                    <Box sx={{ display: 'flex' }}>
+                        <NbList deadStock={deadStock} />
+                        <NbPie />
+                    </Box>
+                    <Spacer />
 
-            {/* <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 > */}
+                </Grid>
+                <Grid item md={4}>
+                    <Box sx={{ display: 'flex' }}>
+                        <Spacer />
+                        <NbCard
+                            icon={SensorOccupiedIcon}
+                            subtitle={translate('page.dashboard.header.taskWorkQty')}
+                            title={`${statistic?.membersTotalQua}`}
+                            to={{
+                                pathname: '/task',
+                                search: JSON.stringify({
+                                    filter: JSON.stringify({ status: 1 }),
+                                }),
+                            }}
+                            list={deadStock}
+                        />
+                    </Box>
+                </Grid>
+            </Grid>
         </>
     )
 }

--
Gitblit v1.9.1