From d734647a726a0fc1e693619ad6b1b112f2ff0997 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期五, 08 八月 2025 16:32:46 +0800 Subject: [PATCH] 日出入库汇总统计报表 --- rsf-admin/src/page/statistics/deadTime/LocItemDeadList.jsx | 7 rsf-admin/src/page/statistics/inStockItem/InStockItemList.jsx | 145 ++++++++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockStatisticController.java | 7 rsf-admin/src/page/statistics/outStockNum/OutStockNumList.jsx | 140 ++++++++++ rsf-admin/src/page/statistics/inStockItem/index.jsx | 16 + rsf-admin/src/page/statistics/stockStatisticNum/index.jsx | 16 + rsf-admin/src/page/statistics/outStockItem/OutStockItemList.jsx | 145 ++++++++++ rsf-admin/src/page/statistics/outStockItem/index.jsx | 16 + rsf-admin/src/page/statistics/stockStatisticNum/stockStatisticList.jsx | 140 ++++++++++ rsf-admin/src/page/statistics/outStockNum/index.jsx | 16 + rsf-admin/src/i18n/zh.js | 39 +- rsf-admin/src/i18n/en.js | 32 + rsf-admin/src/page/ResourceContent.js | 15 + rsf-admin/src/page/statistics/inStockNum/InStockNumList.jsx | 102 ++---- 14 files changed, 742 insertions(+), 94 deletions(-) diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index 32dd056..501e315 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -215,6 +215,8 @@ statisticReport: 'Statistical Report', locDeadReport: 'Locs Dead Report', stockStatistic: 'Stock Statistic', + statisticCount: 'Statistic Count', + }, table: { field: { @@ -826,18 +828,24 @@ startTime: "startTime", endTime: "endTime", }, - stockStatistic: { - id: "id", - dayTime: "dayTime", - taskType: "taskType", - taskStatus: "taskStatus", - maktx: "maktx", - matnrCode: "matnrCode", - count: "count", - batch: "batch", - anfme: "anfme", - unit: "unit", - }, + stockStatistic: { + id: "id", + dayTime: "dayTime", + taskType: "taskType", + taskStatus: "taskStatus", + maktx: "maktx", + matnrCode: "matnrCode", + count: "count", + inAnfmeCount: 'In Anfme Count', + outAnfmeCount: 'Count Anfme Count', + inAnfme: 'In Anfme', + outAnfme: 'Out Anfme', + locCode: 'Loc Code', + barcode: 'Barcode', + batch: "batch", + anfme: "anfme", + unit: "unit", + }, delivery: { code: "code", platId: "platId", diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index e30ae5a..320d013 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -220,8 +220,13 @@ transferItem: '璋冩嫈鍗曟槑缁�', locRevise: '搴撳瓨璋冩暣', statisticReport: '鏃ュ織鎶ヨ〃', - locDeadReport : '搴撳瓨鍋滄粸鎶ヨ〃', - stockStatistic: '鏃ュ簱瀛樼粺璁�', + locDeadReport: '搴撳瓨鍋滄粸鎶ヨ〃', + stockStatistic: '鏃ュ叆搴撴眹鎬绘煡璇�', + outStatistic: '鏃ュ嚭搴撴眹鎬绘煡璇�', + inStatistic: '鏃ュ叆搴撴眹鎬绘煡璇�', + inStatisticItem: '鏃ュ叆搴撴槑缁嗘煡璇�', + outStatisticItem: '鏃ュ嚭搴撴槑缁嗘煡璇�', + statisticCount: '鏃ュ嚭鍏ュ簱姹囨�荤粺璁�', }, table: { field: { @@ -480,18 +485,24 @@ useStatus: '搴撲綅鐘舵��', locAreaId: '閫昏緫鍒嗗尯' }, - stockStatistic: { - id: "id", - dayTime: "鏃ユ湡", - taskType: "浠诲姟绫诲瀷", - taskStatus: "浠诲姟鐘舵��", - maktx: "鐗╂枡鍚嶇О", - matnrCode: "鐗╂枡缂栫爜", - count: "娆℃暟", - batch: "鎵规", - anfme: "鏁伴噺", - unit: "鍗曚綅", - }, + stockStatistic: { + id: "id", + dayTime: "鏃ユ湡", + taskType: "浠诲姟绫诲瀷", + taskStatus: "浠诲姟鐘舵��", + inAnfmeCount: '鍏ュ簱娆℃暟', + outAnfmeCount: '鍑哄簱娆℃暟', + inAnfme: '鍏ュ簱閲�', + outAnfme: '鍑哄簱閲�', + maktx: "鐗╂枡鍚嶇О", + matnrCode: "鐗╂枡缂栫爜", + locCode: '搴撲綅', + barcode: '鎵樼洏鐮�', + count: "鎬绘鏁�", + batch: "鎵规", + anfme: "鏁伴噺", + unit: "鍗曚綅", + }, locType: { name: "搴撲綅绫诲瀷", code: "缂栧彿", diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js index 211fb4b..5b835c3 100644 --- a/rsf-admin/src/page/ResourceContent.js +++ b/rsf-admin/src/page/ResourceContent.js @@ -58,6 +58,11 @@ import transfer from "./orders/transfer"; import locRevise from './stockManage/locRevise'; import locDeadReport from './statistics/deadTime'; +import inStatistic from './statistics/inStockNum'; +import outStatistic from './statistics/outStockNum'; +import outStatisticItem from './statistics/outStockItem'; +import inStatisticItem from './statistics/inStockItem'; +import statisticCount from './statistics/stockStatisticNum'; const ResourceContent = (node) => { switch (node.component) { @@ -169,6 +174,16 @@ return locRevise; case "locDeadReport": return locDeadReport; + case "inStatistic": + return inStatistic; + case "outStatistic": + return outStatistic; + case "outStatisticItem": + return outStatisticItem; + case "inStatisticItem": + return inStatisticItem; + case "statisticCount": + return statisticCount; default: return { list: ListGuesser, diff --git a/rsf-admin/src/page/statistics/deadTime/LocItemDeadList.jsx b/rsf-admin/src/page/statistics/deadTime/LocItemDeadList.jsx index b9a85d3..82bbf32 100644 --- a/rsf-admin/src/page/statistics/deadTime/LocItemDeadList.jsx +++ b/rsf-admin/src/page/statistics/deadTime/LocItemDeadList.jsx @@ -47,16 +47,15 @@ '& .RaDatagrid-row': { cursor: 'auto' }, + '& .column-deadTime': { width: 140, textAlign: 'center', color: 'red', }, - '& .RaDatagrid-headerCell': { color: 'black', }, - '& .column-maktx': { width: 150 }, @@ -105,7 +104,7 @@ return ( <Box display="flex"> <List - resource="inStock/num" + resource="locItem" sx={{ flexGrow: 1, transition: (theme) => @@ -126,7 +125,7 @@ perPage={DEFAULT_PAGE_SIZE} > <StyledDatagrid - preferenceKey='InStockNumList' + preferenceKey='locDeadReport' bulkActionButtons={false} rowClick={(id, resource, record) => false} expand={false} diff --git a/rsf-admin/src/page/statistics/inStockItem/InStockItemList.jsx b/rsf-admin/src/page/statistics/inStockItem/InStockItemList.jsx new file mode 100644 index 0000000..a278687 --- /dev/null +++ b/rsf-admin/src/page/statistics/inStockItem/InStockItemList.jsx @@ -0,0 +1,145 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { useNavigate } from 'react-router-dom'; +import { + List, + DatagridConfigurable, + SearchInput, + TopToolbar, + SelectColumnsButton, + EditButton, + FilterButton, + CreateButton, + ExportButton, + BulkDeleteButton, + WrapperField, + useRecordContext, + useTranslate, + useNotify, + useListContext, + FunctionField, + TextField, + NumberField, + DateField, + BooleanField, + ReferenceField, + TextInput, + DateTimeInput, + DateInput, + SelectInput, + NumberInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + DeleteButton, + useGetRecordId, +} from 'react-admin'; + +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_PAGE_SIZE } from '@/config/setting'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + + '& .column-dayTime': { + width: 120, + textAlign: 'center', + }, + + '& .column-taskType$': { + width: 130, + }, + + '& .column-matnrCode': { + width: 150, + textAlign: 'center', + }, + + '& .RaDatagrid-headerCell': { + color: 'black', + }, + + '& .column-maktx': { + width: 350 + }, +})); + +const InStockItemList = () => { + 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" />, + ] + + return ( + <Box display="flex"> + <List + resource="inStatisticItem" + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + }} + title={false} + empty={false} + filter={{ taskType: 1, taskStatus: 100 }} + filters={filters} + sort={{ field: "day_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <SelectColumnsButton preferenceKey='inStatisticItem' /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='inStatisticItem' + bulkActionButtons={false} + rowClick={(id, resource, record) => false} + expand={false} + expandSingle={true} + omit={['id']} + > + <TextField source="id" key="id-key" /> + {/* <TextField source="taskType$" label="table.field.stockStatistic.taskType" /> */} + <TextField source="locCode" label="table.field.stockStatistic.locCode" /> + <TextField source="matnrCode" label="table.field.locItem.matnrCode" /> + <TextField source="maktx" label="table.field.locItem.maktx" /> + <NumberField source="anfme" label="table.field.locItem.anfme" /> + <TextField source="batch" label="table.field.locItem.batch" /> + <TextField source="unit" label="table.field.locItem.unit" /> + <TextField source="barcode" label="table.field.stockStatistic.barcode" /> + <TextField source="updateBy$" label="common.field.updateBy" /> + <DateField source="updateTime" label="common.field.updateTime" showTime /> + <TextField source="createBy$" label="common.field.createBy" /> + <DateField source="createTime" label="common.field.createTime" showTime /> + </StyledDatagrid> + </List> + </Box> + ) +} + +export default InStockItemList; diff --git a/rsf-admin/src/page/statistics/inStockItem/index.jsx b/rsf-admin/src/page/statistics/inStockItem/index.jsx new file mode 100644 index 0000000..ef0b5ab --- /dev/null +++ b/rsf-admin/src/page/statistics/inStockItem/index.jsx @@ -0,0 +1,16 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import InStockItemList from "./InStockItemList"; + +export default { + list: InStockItemList, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.id}` + } +}; diff --git a/rsf-admin/src/page/statistics/inStockNum/InStockNumList.jsx b/rsf-admin/src/page/statistics/inStockNum/InStockNumList.jsx index 662b688..b5c4a57 100644 --- a/rsf-admin/src/page/statistics/inStockNum/InStockNumList.jsx +++ b/rsf-admin/src/page/statistics/inStockNum/InStockNumList.jsx @@ -37,8 +37,6 @@ import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_PAGE_SIZE } from '@/config/setting'; import { Box, Typography, Card, Stack } from '@mui/material'; import { styled } from '@mui/material/styles'; -import { display, width } from "@mui/system"; -import { color } from "framer-motion"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -47,10 +45,19 @@ '& .RaDatagrid-row': { cursor: 'auto' }, - '& .column-deadTime': { - width: 140, + + '& .column-dayTime': { + width: 120, textAlign: 'center', - color: 'red', + }, + + '& .column-taskType$': { + width: 130, + }, + + '& .column-matnrCode': { + width: 150, + textAlign: 'center', }, '& .RaDatagrid-headerCell': { @@ -58,103 +65,72 @@ }, '& .column-maktx': { - width: 150 - }, - '& .opt': { - width: 200 + width: 350 }, })); - -const filters = [ - <SearchInput source="condition" alwaysOn />, - <DateInput label='common.time.after' source="timeStart" />, - <DateInput label='common.time.before' source="timeEnd" />, - <NumberInput source="locId" label="table.field.locItem.locId" />, - <NumberInput source="orderId" label="table.field.locItem.orderId" />, - <TextInput source="type$" label="table.field.locItem.type" />, - <NumberInput source="orderItemId" label="table.field.locItem.orderItemId" />, - <NumberInput source="wkType$" label="table.field.locItem.wkType" />, - <NumberInput source="matnrId" label="table.field.locItem.matnrId" />, - <TextInput source="maktx" label="table.field.locItem.maktx" />, - <TextInput source="matnrCode" label="table.field.locItem.matnrCode" />, - <TextInput source="trackCode" label="table.field.locItem.trackCode" />, - <TextInput source="unit" label="table.field.locItem.unit" />, - <NumberInput source="anfme" label="table.field.locItem.anfme" />, - <TextInput source="batch" label="table.field.locItem.batch" />, - <TextInput source="splrBatch" label="table.field.locItem.splrBatch" />, - <TextInput source="spec" label="table.field.locItem.spec" />, - <TextInput source="model" label="table.field.locItem.model" />, - <TextInput source="fieldsIndex" label="table.field.locItem.fieldsIndex" />, - <TextInput label="common.field.memo" source="memo" />, - <SelectInput - label="common.field.status" - source="status" - choices={[ - { id: '1', name: 'common.enums.statusTrue' }, - { id: '0', name: 'common.enums.statusFalse' }, - ]} - resettable - />, -] const InStockNumList = () => { 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" />, + ] return ( <Box display="flex"> <List - resource="locItem" + resource="inStatistic" sx={{ flexGrow: 1, transition: (theme) => theme.transitions.create(['all'], { duration: theme.transitions.duration.enteringScreen, }), - marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, }} - title={"menu.locItem"} + title={false} empty={false} + filter={{taskType: 1, taskStatus: 100}} filters={filters} - sort={{ field: "create_time", order: "asc" }} + sort={{ field: "day_time", order: "desc" }} actions={( <TopToolbar> <FilterButton /> - <SelectColumnsButton preferenceKey='locItem' /> + <SelectColumnsButton preferenceKey='stockStatistic' /> </TopToolbar> )} perPage={DEFAULT_PAGE_SIZE} > <StyledDatagrid - preferenceKey='locDeadReport' + preferenceKey='stockStatistics' bulkActionButtons={false} rowClick={(id, resource, record) => false} expand={false} expandSingle={true} omit={['id', 'locId', 'orderId', 'orderItemId', 'matnrId', 'trackCode', 'fieldsIndex', 'splrBatch', 'memo']} > - <NumberField source="id" /> - <TextField source="locCode" label="table.field.locItem.locCode" /> - <NumberField source="deadTime" label="table.field.locItem.deadTime" /> - <NumberField source="locId" label="table.field.locItem.locId" /> - <NumberField source="matnrId" label="table.field.locItem.matnrId" /> + <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" /> <NumberField source="anfme" label="table.field.locItem.anfme" /> <TextField source="batch" label="table.field.locItem.batch" /> - <TextField source="trackCode" label="table.field.locItem.trackCode" /> <TextField source="unit" label="table.field.locItem.unit" /> - <TextField source="splrBatch" label="table.field.locItem.splrBatch" /> - <TextField source="spec" label="table.field.locItem.spec" /> - <TextField source="model" label="table.field.locItem.model" /> - <TextField source="fieldsIndex" label="table.field.locItem.fieldsIndex" /> - <TextField source="updateBy$" label="common.field.updateBy" /> - <DateField source="updateTime" label="common.field.updateTime" showTime /> - <TextField source="createBy$" label="common.field.createBy" /> - <DateField source="createTime" label="common.field.createTime" showTime /> - <BooleanField source="statusBool" label="common.field.status" sortable={false} /> - <TextField source="memo" label="common.field.memo" sortable={false} /> </StyledDatagrid> </List> </Box> diff --git a/rsf-admin/src/page/statistics/outStockItem/OutStockItemList.jsx b/rsf-admin/src/page/statistics/outStockItem/OutStockItemList.jsx new file mode 100644 index 0000000..e3508ca --- /dev/null +++ b/rsf-admin/src/page/statistics/outStockItem/OutStockItemList.jsx @@ -0,0 +1,145 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { useNavigate } from 'react-router-dom'; +import { + List, + DatagridConfigurable, + SearchInput, + TopToolbar, + SelectColumnsButton, + EditButton, + FilterButton, + CreateButton, + ExportButton, + BulkDeleteButton, + WrapperField, + useRecordContext, + useTranslate, + useNotify, + useListContext, + FunctionField, + TextField, + NumberField, + DateField, + BooleanField, + ReferenceField, + TextInput, + DateTimeInput, + DateInput, + SelectInput, + NumberInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + DeleteButton, + useGetRecordId, +} from 'react-admin'; + +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_PAGE_SIZE } from '@/config/setting'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + + '& .column-dayTime': { + width: 120, + textAlign: 'center', + }, + + '& .column-taskType$': { + width: 130, + }, + + '& .column-matnrCode': { + width: 150, + textAlign: 'center', + }, + + '& .RaDatagrid-headerCell': { + color: 'black', + }, + + '& .column-maktx': { + width: 350 + }, +})); + +const OutStockNumList = () => { + 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" />, + ] + + return ( + <Box display="flex"> + <List + resource="outStatisticItem" + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + }} + title={false} + empty={false} + filter={{ taskType: 101, taskStatus: 200 }} + filters={filters} + sort={{ field: "day_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <SelectColumnsButton preferenceKey='outStatisticItem' /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='outStatisticItem' + bulkActionButtons={false} + rowClick={(id, resource, record) => false} + expand={false} + expandSingle={true} + omit={['id', 'memo']} + > + <TextField source="id" key="id-key" /> + <TextField source="dayTime" label="table.field.stockStatistic.dayTime" /> + <TextField source="locCode" label="table.field.stockStatistic.locCode" /> + <TextField source="matnrCode" label="table.field.locItem.matnrCode" /> + <TextField source="maktx" label="table.field.locItem.maktx" /> + <NumberField source="anfme" label="table.field.locItem.anfme" /> + <TextField source="batch" label="table.field.locItem.batch" /> + <TextField source="unit" label="table.field.locItem.unit" /> + <TextField source="barcode" label="table.field.stockStatistic.barcode" /> + <TextField source="updateBy$" label="common.field.updateBy" /> + <DateField source="updateTime" label="common.field.updateTime" showTime /> + <TextField source="createBy$" label="common.field.createBy" /> + <DateField source="createTime" label="common.field.createTime" showTime /> + </StyledDatagrid> + </List> + </Box> + ) +} + +export default OutStockNumList; diff --git a/rsf-admin/src/page/statistics/outStockItem/index.jsx b/rsf-admin/src/page/statistics/outStockItem/index.jsx new file mode 100644 index 0000000..428b379 --- /dev/null +++ b/rsf-admin/src/page/statistics/outStockItem/index.jsx @@ -0,0 +1,16 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import OutStockItemList from "./OutStockItemList"; + +export default { + list: OutStockItemList, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.id}` + } +}; diff --git a/rsf-admin/src/page/statistics/outStockNum/OutStockNumList.jsx b/rsf-admin/src/page/statistics/outStockNum/OutStockNumList.jsx new file mode 100644 index 0000000..574553a --- /dev/null +++ b/rsf-admin/src/page/statistics/outStockNum/OutStockNumList.jsx @@ -0,0 +1,140 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { useNavigate } from 'react-router-dom'; +import { + List, + DatagridConfigurable, + SearchInput, + TopToolbar, + SelectColumnsButton, + EditButton, + FilterButton, + CreateButton, + ExportButton, + BulkDeleteButton, + WrapperField, + useRecordContext, + useTranslate, + useNotify, + useListContext, + FunctionField, + TextField, + NumberField, + DateField, + BooleanField, + ReferenceField, + TextInput, + DateTimeInput, + DateInput, + SelectInput, + NumberInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + DeleteButton, + useGetRecordId, +} from 'react-admin'; + +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_PAGE_SIZE } from '@/config/setting'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + + '& .column-dayTime': { + width: 120, + textAlign: 'center', + }, + + '& .column-taskType$': { + width: 130, + }, + + '& .column-matnrCode': { + width: 150, + textAlign: 'center', + }, + + '& .RaDatagrid-headerCell': { + color: 'black', + }, + + '& .column-maktx': { + width: 350 + }, +})); + +const OutStockNumList = () => { + 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" />, + ] + + return ( + <Box display="flex"> + <List + resource="outStatistic" + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + }} + title={false} + empty={false} + filter={{taskType: 101, taskStatus: 200}} + filters={filters} + sort={{ field: "day_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <SelectColumnsButton preferenceKey='outStatistic' /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='outStatistic' + bulkActionButtons={false} + rowClick={(id, resource, record) => false} + expand={false} + expandSingle={true} + 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" /> + <NumberField source="anfme" label="table.field.locItem.anfme" /> + <TextField source="batch" label="table.field.locItem.batch" /> + <TextField source="unit" label="table.field.locItem.unit" /> + </StyledDatagrid> + </List> + </Box> + ) +} + +export default OutStockNumList; diff --git a/rsf-admin/src/page/statistics/outStockNum/index.jsx b/rsf-admin/src/page/statistics/outStockNum/index.jsx new file mode 100644 index 0000000..70f7a68 --- /dev/null +++ b/rsf-admin/src/page/statistics/outStockNum/index.jsx @@ -0,0 +1,16 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import OutStockNumList from "./OutStockNumList"; + +export default { + list: OutStockNumList, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.id}` + } +}; diff --git a/rsf-admin/src/page/statistics/stockStatisticNum/index.jsx b/rsf-admin/src/page/statistics/stockStatisticNum/index.jsx new file mode 100644 index 0000000..ae7d7ed --- /dev/null +++ b/rsf-admin/src/page/statistics/stockStatisticNum/index.jsx @@ -0,0 +1,16 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import StockStatistic from "./stockStatisticList"; + +export default { + list: StockStatistic, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.id}` + } +}; diff --git a/rsf-admin/src/page/statistics/stockStatisticNum/stockStatisticList.jsx b/rsf-admin/src/page/statistics/stockStatisticNum/stockStatisticList.jsx new file mode 100644 index 0000000..e6eeff5 --- /dev/null +++ b/rsf-admin/src/page/statistics/stockStatisticNum/stockStatisticList.jsx @@ -0,0 +1,140 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { useNavigate } from 'react-router-dom'; +import { + List, + DatagridConfigurable, + SearchInput, + TopToolbar, + SelectColumnsButton, + EditButton, + FilterButton, + CreateButton, + ExportButton, + BulkDeleteButton, + WrapperField, + useRecordContext, + useTranslate, + useNotify, + useListContext, + FunctionField, + TextField, + NumberField, + DateField, + BooleanField, + ReferenceField, + TextInput, + DateTimeInput, + DateInput, + SelectInput, + NumberInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + DeleteButton, + useGetRecordId, +} from 'react-admin'; + +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_PAGE_SIZE } from '@/config/setting'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + + '& .column-dayTime': { + width: 120, + textAlign: 'center', + }, + + '& .column-taskType$': { + width: 130, + }, + + '& .column-matnrCode': { + width: 150, + textAlign: 'center', + }, + + '& .RaDatagrid-headerCell': { + color: 'black', + }, + + '& .column-maktx': { + width: 350 + }, +})); + +const stockStatisticList = () => { + 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" />, + ] + + return ( + <Box display="flex"> + <List + resource="statistic/num" + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + }} + title={false} + empty={false} + filter={{ taskType: 101, taskStatus: 200 }} + filters={filters} + sort={{ field: "day_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <SelectColumnsButton preferenceKey='outStatisticCount' /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='outStatisticCount' + bulkActionButtons={false} + rowClick={(id, resource, record) => false} + expand={false} + expandSingle={true} + omit={['id', 'memo']} + > + <NumberField source="id" key="id-key" /> + <TextField source="dayTime" label="table.field.stockStatistic.dayTime" /> + <NumberField source="count" label="table.field.stockStatistic.count" /> + <TextField source="inAnfmeCount" label="table.field.stockStatistic.inAnfmeCount" /> + <TextField source="outAnfmeCount" label="table.field.stockStatistic.outAnfmeCount" /> + <NumberField source="anfme" label="table.field.stockStatistic.anfme" /> + <NumberField source="inAnfme" label="table.field.stockStatistic.inAnfme" /> + <TextField source="outAnfme" label="table.field.stockStatistic.outAnfme" /> + </StyledDatagrid> + </List> + </Box> + ) +} + +export default stockStatisticList; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockStatisticController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockStatisticController.java index c4bf3c7..19f0baf 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockStatisticController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/StockStatisticController.java @@ -84,7 +84,12 @@ BaseParam baseParam = buildParam(map, BaseParam.class); PageParam<StockStatistic, BaseParam> pageParam = new PageParam<>(baseParam, StockStatistic.class); QueryWrapper<StockStatistic> wrapper = pageParam.buildWrapper(true); - wrapper.select("id, day_time, COUNT( barcode ) `count`, SUM( anfme ) anfme, COUNT(IF (task_type = 1, 0, NULL)) in_anfme_count, COUNT(IF ( task_type = 101, 0, NULL)) out_anfme_count, SUM(CASE WHEN task_type = 1 THEN)"); + wrapper.select("id, day_time, COUNT( barcode ) `count`, " + + "SUM( anfme ) anfme," + + "COUNT(IF (task_type = 1, 0, NULL)) in_anfme_count, " + + "COUNT(IF ( task_type = 101, 0, NULL)) out_anfme_count, " + + "SUM( CASE WHEN task_type = 1 THEN anfme ELSE 0 END ) in_anfme," + + "SUM( CASE WHEN task_type = 101 THEN anfme ELSE 0 END ) out_anfme"); wrapper.groupBy("barcode, day_time"); return R.ok().add(stockStatisticService.page(pageParam, wrapper)); } -- Gitblit v1.9.1