From bfc43ca0e4683c1c0322a6cad5d5be2bc07decc3 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期四, 24 七月 2025 15:00:44 +0800 Subject: [PATCH] 新增调拔单功能 盘点功能优化 --- rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java | 110 ++++ rsf-admin/src/page/orders/outStock/OutStockPublic.jsx | 7 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java | 8 rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderSourceType.java | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferMapper.java | 12 rsf-admin/src/page/orders/transfer/TransferCreate.jsx | 199 +++++++ rsf-admin/src/page/orders/transfer/TransferList.jsx | 187 ++++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java | 12 rsf-admin/src/page/orders/check/CheckOrderPub.jsx | 57 + rsf-admin/src/page/orders/transfer/TransferPanel.jsx | 123 ++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java | 296 ++++++++++ rsf-admin/src/i18n/zh.js | 15 rsf-admin/src/page/orders/transfer/TransferEdit.jsx | 171 ++++++ rsf-admin/src/page/orders/transfer/index.jsx | 18 rsf-admin/src/i18n/en.js | 16 rsf-admin/src/page/ResourceContent.js | 324 ++++++----- rsf-admin/src/page/orders/check/CheckPreviewTable.jsx | 17 rsf-server/src/main/resources/mapper/manager/TransferMapper.xml | 5 21 files changed, 1,391 insertions(+), 198 deletions(-) diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index e81adc6..38765d7 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -210,6 +210,7 @@ basContainer: 'BasContainer', waveRule: 'Wave Rules', checkDiff: 'Check Diff', + transfer: 'Transfer', }, table: { @@ -654,6 +655,21 @@ checkQty: "Check Qty", exceStatus: "Exce Status", }, + transfer: { + code: "code", + type: "type", + source: "source", + exceStatus: "exceStatus", + orgWareId: "orgWareId", + orgWareName: "orgWareName", + tarWareId: "tarWareId", + tarWareName: "tarWareName", + orgAreaId: "orgAreaId", + orgAreaName: "orgAreaName", + tarAreaId: "tarAreaId", + tarAreaName: "tarAreaName", + }, + checkDiffItem: { checkId: "checkId", orderCode: "orderCode", diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index f6f6b23..6211ee3 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -216,6 +216,7 @@ waveRule: '娉㈡绛栫暐', checkOrder: '鐩樼偣鍗�', checkDiff: '鐩樼偣宸紓鍗�', + transfer: '璋冩嫈鍗�', }, table: { field: { @@ -685,6 +686,20 @@ checkQty: "鐩樼偣鏁伴噺", exceStatus: "鎵ц鐘舵��", }, + transfer: { + code: "璋冩嫈鍗�", + type: "璋冩嫈绫诲瀷", + source: "鍗曟嵁鏉ユ簮", + exceStatus: "鎵ц鐘舵��", + orgWareId: "鍘熶粨搴揑D", + orgWareName: "鍘熶粨搴�", + tarWareId: "鐩爣浠撳簱ID", + tarWareName: "鐩爣浠撳簱", + orgAreaId: "鍘熷簱鍖篒D", + orgAreaName: "鍘熷簱鍖�", + tarAreaId: "鐩爣搴撳尯", + tarAreaName: "鐩爣搴撳尯", + }, checkDiffItem: { checkId: "鐩樼偣鍗旾D", orderCode: "鐩樼偣鍗曞彿", diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js index d729380..bccaf3d 100644 --- a/rsf-admin/src/page/ResourceContent.js +++ b/rsf-admin/src/page/ResourceContent.js @@ -1,172 +1,176 @@ import { - ListGuesser, - EditGuesser, - ShowGuesser, + ListGuesser, + EditGuesser, + ShowGuesser } from "react-admin"; import host from "./system/host"; -import config from './system/config'; -import tenant from './system/tenant'; -import role from './system/role'; -import userLogin from './system/userLogin'; +import config from "./system/config"; +import tenant from "./system/tenant"; +import role from "./system/role"; +import userLogin from "./system/userLogin"; import dept from "./system/dept"; -import menu from './system/menu' -import user from './system/user'; -import operationRecord from './system/operationRecord'; -import matnr from './basicInfo/matnr'; -import matnrGroup from './basicInfo/matnrGroup'; -import warehouse from './basicInfo/warehouse'; -import warehouseAreas from './warehouseAreas'; -import loc from './basicInfo/loc'; -import container from './container'; -import contract from './contract'; -import qlyInspect from './orders/qlyInspect'; -import dictType from './system/dicts/dictType'; -import companys from './basicInfo/companys'; -import locType from './basicInfo/locType'; -import locArea from './basicInfo//locArea'; -import locAreaMatRela from './basicInfo/locAreaMatRela'; -import locAreaMat from './basicInfo/locAreaMat'; -import serialRule from './system/serialRule'; -import whMat from './basicInfo/whMat'; -import asnOrder from './orders/asnOrder'; -import purchase from './orders/purchase'; -import fields from './fields'; -import fieldsItem from './fieldsItem'; -import warehouseAreasItem from './warehouseAreasItem'; -import deviceSite from './basicInfo/deviceSite'; -import waitPakin from './waitPakin'; -import waitPakinLog from './histories/waitPakinLog'; -import asnOrderLog from './histories/asnOrderLog'; -import task from './task'; -import taskLog from './histories/taskLog'; -import stock from './orders/stock'; -import delivery from './orders/delivery'; -import outStock from './orders/outStock'; -import deviceBind from './deviceBind'; -import wave from './orders/wave'; -import locItem from './locItem'; -import basStation from './basicInfo/basStation'; -import warehouseStock from './statistics/stockManage'; -import basContainer from './basicInfo/basContainer'; +import menu from "./system/menu"; +import user from "./system/user"; +import operationRecord from "./system/operationRecord"; +import matnr from "./basicInfo/matnr"; +import matnrGroup from "./basicInfo/matnrGroup"; +import warehouse from "./basicInfo/warehouse"; +import warehouseAreas from "./warehouseAreas"; +import loc from "./basicInfo/loc"; +import container from "./container"; +import contract from "./contract"; +import qlyInspect from "./orders/qlyInspect"; +import dictType from "./system/dicts/dictType"; +import companys from "./basicInfo/companys"; +import locType from "./basicInfo/locType"; +import locArea from "./basicInfo//locArea"; +import locAreaMatRela from "./basicInfo/locAreaMatRela"; +import locAreaMat from "./basicInfo/locAreaMat"; +import serialRule from "./system/serialRule"; +import whMat from "./basicInfo/whMat"; +import asnOrder from "./orders/asnOrder"; +import purchase from "./orders/purchase"; +import fields from "./fields"; +import fieldsItem from "./fieldsItem"; +import warehouseAreasItem from "./warehouseAreasItem"; +import deviceSite from "./basicInfo/deviceSite"; +import waitPakin from "./waitPakin"; +import waitPakinLog from "./histories/waitPakinLog"; +import asnOrderLog from "./histories/asnOrderLog"; +import task from "./task"; +import taskLog from "./histories/taskLog"; +import stock from "./orders/stock"; +import delivery from "./orders/delivery"; +import outStock from "./orders/outStock"; +import deviceBind from "./deviceBind"; +import wave from "./orders/wave"; +import locItem from "./locItem"; +import basStation from "./basicInfo/basStation"; +import warehouseStock from "./statistics/stockManage"; +import basContainer from "./basicInfo/basContainer"; import outBound from "./work/outBound"; import checkOutBound from "./work/checkOutBound"; import stockTransfer from "./work/stockTransfer"; -import waveRule from './waveRule'; -import check from './orders/check'; -import checkDiff from './orders/check/checkDiff'; +import waveRule from "./waveRule"; +import check from "./orders/check"; +import checkDiff from "./orders/check/checkDiff"; +import transfer from "./orders/transfer"; + const ResourceContent = (node) => { - switch (node.component) { - case 'host': - return host; - case 'config': - return config; - case 'tenant': - return tenant; - case 'role': - return role; - case 'userLogin': - return userLogin; - case 'dept': - return dept; - case 'menu': - return menu; - case 'user': - return user; - case 'operationRecord': - return operationRecord; - case 'matnr': - return matnr; - case 'matnrGroup': - return matnrGroup; - case 'warehouse': - return warehouse; - case 'warehouseAreas': - return warehouseAreas; - case 'warehouseAreasItem': - return warehouseAreasItem; - case 'warehouseStock': - return warehouseStock; - case 'loc': - return loc; - case 'container': - return container; - case 'contract': - return contract; - case 'qlyInspect': - return qlyInspect; - case 'dictType': - return dictType; - case 'companys': - return companys; - case 'serialRule': - return serialRule; - case 'whMat': - return whMat; - case 'asnOrder': - return asnOrder; - case 'asnOrderLog': - return asnOrderLog; - case 'purchase': - return purchase; - case 'fields': - return fields; - case 'fieldsItem': - return fieldsItem; - case 'locType': - return locType; - case 'locArea': - return locArea; - case 'locAreaMatRela': - return locAreaMatRela; - case 'locAreaMat': - return locAreaMat; - case 'deviceSite': - return deviceSite; - case 'waitPakin': - return waitPakin; - case 'waitPakinLog': - return waitPakinLog; - case 'task': - return task; - case 'taskLog': - return taskLog; - case 'stock': - return stock; - case 'delivery': - return delivery; - case 'outStock': - return outStock; - case 'deviceBind': - return deviceBind; - case 'wave': - return wave; - case 'locItem': - return locItem; - case 'basStation': - return basStation; - case 'basContainer': - return basContainer; - case 'outBound': - return outBound; - case 'checkOutBound': - return checkOutBound; - case 'stockTransfer': - return stockTransfer; - case 'waveRule': - return waveRule; - case 'check': - return check; - case 'checkDiff': - return checkDiff; - default: - return { - list: ListGuesser, - edit: EditGuesser, - show: ShowGuesser, - } - } -} + switch (node.component) { + case "host": + return host; + case "config": + return config; + case "tenant": + return tenant; + case "role": + return role; + case "userLogin": + return userLogin; + case "dept": + return dept; + case "menu": + return menu; + case "user": + return user; + case "operationRecord": + return operationRecord; + case "matnr": + return matnr; + case "matnrGroup": + return matnrGroup; + case "warehouse": + return warehouse; + case "warehouseAreas": + return warehouseAreas; + case "warehouseAreasItem": + return warehouseAreasItem; + case "warehouseStock": + return warehouseStock; + case "loc": + return loc; + case "container": + return container; + case "contract": + return contract; + case "qlyInspect": + return qlyInspect; + case "dictType": + return dictType; + case "companys": + return companys; + case "serialRule": + return serialRule; + case "whMat": + return whMat; + case "asnOrder": + return asnOrder; + case "asnOrderLog": + return asnOrderLog; + case "purchase": + return purchase; + case "fields": + return fields; + case "fieldsItem": + return fieldsItem; + case "locType": + return locType; + case "locArea": + return locArea; + case "locAreaMatRela": + return locAreaMatRela; + case "locAreaMat": + return locAreaMat; + case "deviceSite": + return deviceSite; + case "waitPakin": + return waitPakin; + case "waitPakinLog": + return waitPakinLog; + case "task": + return task; + case "taskLog": + return taskLog; + case "stock": + return stock; + case "delivery": + return delivery; + case "outStock": + return outStock; + case "deviceBind": + return deviceBind; + case "wave": + return wave; + case "locItem": + return locItem; + case "basStation": + return basStation; + case "basContainer": + return basContainer; + case "outBound": + return outBound; + case "checkOutBound": + return checkOutBound; + case "stockTransfer": + return stockTransfer; + case "waveRule": + return waveRule; + case "check": + return check; + case "checkDiff": + return checkDiff; + case "transfer": + return transfer; + default: + return { + list: ListGuesser, + edit: EditGuesser, + show: ShowGuesser + }; + } +}; export default ResourceContent; \ No newline at end of file diff --git a/rsf-admin/src/page/orders/check/CheckOrderPub.jsx b/rsf-admin/src/page/orders/check/CheckOrderPub.jsx index 56f341a..2acd62d 100644 --- a/rsf-admin/src/page/orders/check/CheckOrderPub.jsx +++ b/rsf-admin/src/page/orders/check/CheckOrderPub.jsx @@ -11,6 +11,7 @@ NumberField, ReferenceInput, AutocompleteInput, + useRecordSelection, required, Form, useRefresh, @@ -18,15 +19,16 @@ TextInput, } from 'react-admin'; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_TYPE } from '@/config/setting'; -import { styled } from '@mui/material/styles'; import { DataGrid, useGridApiContext, GridActionsCellItem, useGridApiRef } from '@mui/x-data-grid'; -import request from '@/utils/request'; import ConfirmationNumberOutlinedIcon from '@mui/icons-material/ConfirmationNumberOutlined'; import CloseSharpIcon from '@mui/icons-material/CloseSharp'; import ConfirmButton from '../../components/ConfirmButton'; import { Delete, Edit, Add } from '@mui/icons-material'; import CheckOrderSiteDialog from "./CheckOrderSiteDialog"; import CheckPreviewTable from "./CheckPreviewTable"; +import { styled } from '@mui/material/styles'; +import request from '@/utils/request'; + const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -44,13 +46,14 @@ const CheckOrderPub = (props) => { const { record, open, setOpen, setManualDialog } = props; const notify = useNotify(); + const translate = useTranslate(); const gridRef = useGridApiRef(); const [rows, setRows] = useState([]); const [fetchRows, setFetchRows] = useState([]); - const translate = useTranslate(); + const [selectItem, setSelectItem] = useState({}); const [rowSelectedIds, setRowSelectedIds] = useState([]); const [selectedMatnr, setSelectedMatnr] = useState([]); - const [selectedIds, setSelectedIds] = useState([]); + const [leftSelectedIds, setLeftSelectedIds] = useState([]); const [formData, setFormData] = useState({ orderId: record?.id, waveId: DEFAULT_TYPE }); const [dialog, setDialog] = useState(false); const [selectedValue, setSelectedValue] = useState({}); @@ -67,8 +70,8 @@ const getLocs = async (ids) => { - let params = {matnrCode: ids} - const { data: { code, data, msg } } = await request.post('/check/locs/', params); + let params = { matnrCode: ids } + const { data: { code, data, msg } } = await request.post('/check/locs/', params); if (code === 200) { setRows(data) const matnrs = selectedMatnr.filter(item => data.some(bigData => bigData.matnrCode === item)); @@ -78,15 +81,16 @@ } } + const ComfirmButton = () => { - const { selectedIds, data, onUnselectItems } = useListContext(); + const { selectedIds, data, onUnselectItems, } = useListContext(); const handleRowClick = () => { const ids = data.filter(item => selectedIds.includes(item.id)); setRowSelectedIds(ids); const mas = data.filter(item => selectedIds.includes(item.id)).map(item => item.matnrCode); //璁剧疆搴撲綅淇℃伅绛涢�夋潯浠� setSelectedMatnr(mas); - onUnselectItems() + onUnselectItems(); } return ( record.exceStatus != 3 ? <><Button label="toolbar.confirm" size="medium" onClick={handleRowClick} /></> : <></> @@ -215,14 +219,22 @@ record={record} formData={formData} selectedMatnr={selectedMatnr} - selectedIds={selectedIds} + leftSelectedIds={leftSelectedIds} setDialog={setDialog} - setSelectedIds={setSelectedIds} + setLeftSelectedIds={setLeftSelectedIds} /> </Box> <Box sx={{ textAlign: 'center' }}> <CloseButton setOpen={setOpen} /> - <SubmitButton selectedIds={selectedIds} setOpen={setOpen} setSelectedIds={setSelectedIds} selectedMatnr={selectedMatnr} rowSelectedIds={rowSelectedIds} gridRef={gridRef} record={record} /> + <SubmitButton + leftSelectedIds={leftSelectedIds} + setOpen={setOpen} + setLeftSelectedIds={setLeftSelectedIds} + selectItem={selectItem} + selectedMatnr={selectedMatnr} + rowSelectedIds={rowSelectedIds} + gridRef={gridRef} + record={record} /> </Box> </Card> </Grid> @@ -240,14 +252,15 @@ } //鎻愪氦鎸夐挳 -const SubmitButton = ({ selectedIds, setSelectedIds, rowSelectedIds, gridRef, record, setOpen, selectedMatnr }) => { +const SubmitButton = ({ leftSelectedIds, setLeftSelectedIds, rowSelectedIds, selectItem, gridRef, record, setOpen, selectedMatnr }) => { const notify = useNotify(); const refresh = useRefresh(); const translate = useTranslate(); const redirect = useRedirect(); const submit = async () => { const items = gridRef.current?.getSortedRows(); - let selctRecord = items.filter(item => selectedIds.includes(item?.id)); + let selctRecord = items.filter(item => leftSelectedIds.includes(item?.id)); + if (selctRecord == undefined || selctRecord.length < 1) { notify(translate('common.msg.locEmpty'), { type: 'error' }); return @@ -263,13 +276,17 @@ let params = records.filter(record => record?.items.length > 0); - const { data: { code, data, msg } } = await request.post('/check/generate/tasks', params); - if (code == 200) { - refresh(); - setOpen(false) - } else { - notify(msg); - } + redirect("/task") + + + // const { data: { code, data, msg } } = await request.post('/check/generate/tasks', params); + // if (code == 200) { + // refresh(); + // redirect("/task") + // setOpen(false) + // } else { + // notify(msg); + // } } return ( <ConfirmButton diff --git a/rsf-admin/src/page/orders/check/CheckPreviewTable.jsx b/rsf-admin/src/page/orders/check/CheckPreviewTable.jsx index 81f4b93..9bcbf61 100644 --- a/rsf-admin/src/page/orders/check/CheckPreviewTable.jsx +++ b/rsf-admin/src/page/orders/check/CheckPreviewTable.jsx @@ -21,18 +21,18 @@ } from 'react-admin'; const CheckPreviewTable = (props) => { - const { rows, gridRef, setRows, record, selectedIds, setSelectedIds, selectedMatnr, setDialog, formData } = props; + const { rows, gridRef, setRows, record, lefSelectedIds, setLeftSelectedIds, selectedMatnr, setDialog, formData } = props; // const translate = useTranslate(); // const refresh = useRefresh(); // const notify = useNotify(); gridRef.current = useGridApiRef(); const translate = useTranslate(); - useEffect(() => { - if (selectedIds.length > 0) { - console.log(selectedIds); - } - }, [selectedIds]) + // useEffect(() => { + // if (lefSelectedIds.length > 0) { + // console.log(lefSelectedIds); + // } + // }, [lefSelectedIds]) const baseColumns = [ { field: 'locCode', headerName: '搴撲綅', width: 110 }, @@ -118,8 +118,6 @@ const [queryParams, setQueryParams] = useState({ locCode: null, channel: null, matnrCode: selectedMatnr }); const notify = useNotify(); const queryClick = async () => { - console.log(queryParams); - console.log(rows); const { data: { code, data, msg } } = await request.post('/check/locs/', queryParams); if (code === 200) { setRows(data) @@ -195,7 +193,6 @@ } - const OutStockSite = (params) => { const { id, field, siteNo, row: { staNos } } = params; const apiRef = useGridApiContext(); @@ -260,7 +257,7 @@ hideFooterPagination={true} // 闅愯棌鍒嗛〉鎺т欢 hideFooter={false} onRowSelectionModelChange={(ids) => { - setSelectedIds(ids) + setLeftSelectedIds(ids) }} /> </Box> diff --git a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx index 719dbf8..0dc8ff5 100644 --- a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx +++ b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx @@ -37,6 +37,7 @@ Form, useRefresh, useRedirect, + useRecordSelection, } from 'react-admin'; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_TYPE } from '@/config/setting'; import { styled } from '@mui/material/styles'; @@ -91,8 +92,12 @@ const ComfirmButton = () => { - const { selectedIds, data } = useListContext(); + const { data } = useListContext(); + const [selectedIds, selectionModifiers] = useRecordSelection(); + const handleRowClick = () => { + console.log(selectedIds); + const ids = data.filter(item => selectedIds.includes(item.id)).map(item => item.id); setRowSelectedIds(ids); const mas = data.filter(item => selectedIds.includes(item.id)).map(item => item.matnrCode); diff --git a/rsf-admin/src/page/orders/transfer/TransferCreate.jsx b/rsf-admin/src/page/orders/transfer/TransferCreate.jsx new file mode 100644 index 0000000..19a4edf --- /dev/null +++ b/rsf-admin/src/page/orders/transfer/TransferCreate.jsx @@ -0,0 +1,199 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + CreateBase, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SaveButton, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + Toolbar, + required, + useDataProvider, + useNotify, + Form, + useCreateController, +} from 'react-admin'; +import { + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Stack, + Grid, + Box, +} from '@mui/material'; +import DialogCloseButton from "../../components/DialogCloseButton.jsx"; +import StatusSelectInput from "../../components/StatusSelectInput.jsx"; +import MemoInput from "../../components/MemoInput.jsx"; + +const TransferCreate = (props) => { + const { open, setOpen } = props; + + const translate = useTranslate(); + const notify = useNotify(); + + const handleClose = (event, reason) => { + if (reason !== "backdropClick") { + setOpen(false); + } + }; + + const handleSuccess = async (data) => { + setOpen(false); + notify('common.response.success'); + }; + + const handleError = async (error) => { + notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } }); + }; + + return ( + <> + <CreateBase + record={{}} + transform={(data) => { + return data; + }} + mutationOptions={{ onSuccess: handleSuccess, onError: handleError }} + > + <Dialog + open={open} + onClose={handleClose} + aria-labelledby="form-dialog-title" + fullWidth + disableRestoreFocus + maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' + > + <Form> + <DialogTitle id="form-dialog-title" sx={{ + position: 'sticky', + top: 0, + backgroundColor: 'background.paper', + zIndex: 1000 + }} + > + {translate('create.title')} + <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> + <DialogCloseButton onClose={handleClose} /> + </Box> + </DialogTitle> + <DialogContent sx={{ mt: 2 }}> + <Grid container rowSpacing={2} columnSpacing={2}> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.transfer.code" + source="code" + parse={v => v} + autoFocus + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.transfer.type" + source="type" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <SelectInput + label="table.field.transfer.source" + source="source" + choices={[ + { id: 1, name: 'ERP绯荤粺' }, + { id: 2, name: 'WMS绯荤粺鐢熸垚' }, + { id: 3, name: 'EXCEL瀵煎叆 ' }, + { id: 4, name: 'QMS绯荤粺' }, + ]} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <SelectInput + label="table.field.transfer.exceStatus" + source="exceStatus" + choices={[ + { id: 0, name: '鏈墽琛�' }, + { id: 1, name: '鎵ц涓�' }, + { id: 2, name: '鎵ц瀹屾垚' }, + ]} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.transfer.orgWareId" + source="orgWareId" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.transfer.orgWareName" + source="orgWareName" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.transfer.tarWareId" + source="tarWareId" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.transfer.tarWareName" + source="tarWareName" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.transfer.orgAreaId" + source="orgAreaId" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.transfer.orgAreaName" + source="orgAreaName" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.transfer.tarAreaId" + source="tarAreaId" + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.transfer.tarAreaName" + source="tarAreaName" + parse={v => v} + /> + </Grid> + + <Grid item xs={6} display="flex" gap={1}> + <StatusSelectInput /> + </Grid> + <Grid item xs={12} display="flex" gap={1}> + <Stack direction="column" spacing={1} width={'100%'}> + <MemoInput /> + </Stack> + </Grid> + </Grid> + </DialogContent> + <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> + <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > + <SaveButton /> + </Toolbar> + </DialogActions> + </Form> + </Dialog> + </CreateBase> + </> + ) +} + +export default TransferCreate; diff --git a/rsf-admin/src/page/orders/transfer/TransferEdit.jsx b/rsf-admin/src/page/orders/transfer/TransferEdit.jsx new file mode 100644 index 0000000..2cd2003 --- /dev/null +++ b/rsf-admin/src/page/orders/transfer/TransferEdit.jsx @@ -0,0 +1,171 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + Edit, + SimpleForm, + FormDataConsumer, + useTranslate, + TextInput, + NumberInput, + BooleanInput, + DateInput, + SelectInput, + ReferenceInput, + ReferenceArrayInput, + AutocompleteInput, + SaveButton, + Toolbar, + Labeled, + NumberField, + required, + useRecordContext, + DeleteButton, +} from 'react-admin'; +import { useWatch, useFormContext } from "react-hook-form"; +import { Stack, Grid, Box, Typography } from '@mui/material'; +import * as Common from '@/utils/common.js'; +import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting.js'; +import EditBaseAside from "../../components/EditBaseAside.jsx"; +import CustomerTopToolBar from "../../components/EditTopToolBar.jsx"; +import MemoInput from "../../components/MemoInput.jsx"; +import StatusSelectInput from "../../components/StatusSelectInput.jsx"; + +const FormToolbar = () => { + const { getValues } = useFormContext(); + + return ( + <Toolbar sx={{ justifyContent: 'space-between' }}> + <SaveButton /> + <DeleteButton mutationMode="optimistic" /> + </Toolbar> + ) +} + +const TransferEdit = () => { + const translate = useTranslate(); + + return ( + <Edit + redirect="list" + mutationMode={EDIT_MODE} + actions={<CustomerTopToolBar />} + aside={<EditBaseAside />} + > + <SimpleForm + shouldUnregister + warnWhenUnsavedChanges + toolbar={<FormToolbar />} + mode="onTouched" + defaultValues={{}} + // validate={(values) => { }} + > + <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> + <Grid item xs={12} md={8}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.main')} + </Typography> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.transfer.code" + source="code" + parse={v => v} + autoFocus + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.transfer.type" + source="type" + /> + </Stack> + <Stack direction='row' gap={2}> + <SelectInput + label="table.field.transfer.source" + source="source" + choices={[ + { id: 1, name: 'ERP绯荤粺' }, + { id: 2, name: 'WMS绯荤粺鐢熸垚' }, + { id: 3, name: 'EXCEL瀵煎叆 ' }, + { id: 4, name: 'QMS绯荤粺' }, + ]} + /> + </Stack> + <Stack direction='row' gap={2}> + <SelectInput + label="table.field.transfer.exceStatus" + source="exceStatus" + choices={[ + { id: 0, name: '鏈墽琛�' }, + { id: 1, name: '鎵ц涓�' }, + { id: 2, name: '鎵ц瀹屾垚' }, + ]} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.transfer.orgWareId" + source="orgWareId" + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.transfer.orgWareName" + source="orgWareName" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.transfer.tarWareId" + source="tarWareId" + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.transfer.tarWareName" + source="tarWareName" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.transfer.orgAreaId" + source="orgAreaId" + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.transfer.orgAreaName" + source="orgAreaName" + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <NumberInput + label="table.field.transfer.tarAreaId" + source="tarAreaId" + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.transfer.tarAreaName" + source="tarAreaName" + parse={v => v} + /> + </Stack> + + </Grid> + <Grid item xs={12} md={4}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.common')} + </Typography> + <StatusSelectInput /> + <Box mt="2em" /> + <MemoInput /> + </Grid> + </Grid> + </SimpleForm> + </Edit > + ) +} + +export default TransferEdit; diff --git a/rsf-admin/src/page/orders/transfer/TransferList.jsx b/rsf-admin/src/page/orders/transfer/TransferList.jsx new file mode 100644 index 0000000..790702b --- /dev/null +++ b/rsf-admin/src/page/orders/transfer/TransferList.jsx @@ -0,0 +1,187 @@ +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, +} from 'react-admin'; +import { Box, Typography, Card, Stack } from '@mui/material'; +import { styled } from '@mui/material/styles'; +import TransferCreate from "./TransferCreate.jsx"; +import TransferPanel from "./TransferPanel.jsx"; +import EmptyData from "../../components/EmptyData.jsx"; +import MyCreateButton from "../../components/MyCreateButton.jsx"; +import MyExportButton from '../../components/MyExportButton.jsx'; +import PageDrawer from "../../components/PageDrawer.jsx"; +import MyField from "../../components/MyField.jsx"; +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting.js'; +import * as Common from '@/utils/common.js'; + +const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ + '& .css-1vooibu-MuiSvgIcon-root': { + height: '.9em' + }, + '& .RaDatagrid-row': { + cursor: 'auto' + }, + '& .column-name': { + }, + '& .opt': { + width: 200 + }, +})); + +const filters = [ + <SearchInput source="condition" alwaysOn />, + <DateInput label='common.time.after' source="timeStart" alwaysOn />, + <DateInput label='common.time.before' source="timeEnd" alwaysOn />, + + <TextInput source="code" label="table.field.transfer.code" />, + <NumberInput source="type" label="table.field.transfer.type" />, + <SelectInput source="source" label="table.field.transfer.source" + choices={[ + { id: 1, name: 'ERP绯荤粺' }, + { id: 2, name: 'WMS绯荤粺鐢熸垚' }, + { id: 3, name: 'EXCEL瀵煎叆 ' }, + { id: 4, name: 'QMS绯荤粺' }, + ]} + />, + <SelectInput source="exceStatus" label="table.field.transfer.exceStatus" + choices={[ + { id: 0, name: '鏈墽琛�' }, + { id: 1, name: '鎵ц涓�' }, + { id: 2, name: '鎵ц瀹屾垚' }, + ]} + />, + <NumberInput source="orgWareId" label="table.field.transfer.orgWareId" />, + <TextInput source="orgWareName" label="table.field.transfer.orgWareName" />, + <NumberInput source="tarWareId" label="table.field.transfer.tarWareId" />, + <TextInput source="tarWareName" label="table.field.transfer.tarWareName" />, + <NumberInput source="orgAreaId" label="table.field.transfer.orgAreaId" />, + <TextInput source="orgAreaName" label="table.field.transfer.orgAreaName" />, + <NumberInput source="tarAreaId" label="table.field.transfer.tarAreaId" />, + <TextInput source="tarAreaName" label="table.field.transfer.tarAreaName" />, + + <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 TransferList = () => { + const translate = useTranslate(); + + const [createDialog, setCreateDialog] = useState(false); + const [drawerVal, setDrawerVal] = useState(false); + + return ( + <Box display="flex"> + <List + sx={{ + flexGrow: 1, + transition: (theme) => + theme.transitions.create(['all'], { + duration: theme.transitions.duration.enteringScreen, + }), + marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, + }} + title={"menu.transfer"} + empty={false} + filters={filters} + sort={{ field: "create_time", order: "desc" }} + actions={( + <TopToolbar> + <FilterButton /> + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> + <SelectColumnsButton preferenceKey='transfer' /> + <MyExportButton /> + </TopToolbar> + )} + perPage={DEFAULT_PAGE_SIZE} + > + <StyledDatagrid + preferenceKey='transfer' + bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + rowClick={(id, resource, record) => false} + expand={() => <TransferPanel />} + expandSingle={true} + omit={['id', 'createTime', 'createBy', 'memo']} + > + <NumberField source="id" /> + <TextField source="code" label="table.field.transfer.code" /> + <NumberField source="type" label="table.field.transfer.type" /> + <TextField source="source$" label="table.field.transfer.source" sortable={false} /> + <TextField source="exceStatus$" label="table.field.transfer.exceStatus" sortable={false} /> + <NumberField source="orgWareId" label="table.field.transfer.orgWareId" /> + <TextField source="orgWareName" label="table.field.transfer.orgWareName" /> + <NumberField source="tarWareId" label="table.field.transfer.tarWareId" /> + <TextField source="tarWareName" label="table.field.transfer.tarWareName" /> + <NumberField source="orgAreaId" label="table.field.transfer.orgAreaId" /> + <TextField source="orgAreaName" label="table.field.transfer.orgAreaName" /> + <NumberField source="tarAreaId" label="table.field.transfer.tarAreaId" /> + <TextField source="tarAreaName" label="table.field.transfer.tarAreaName" /> + + <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <DateField source="updateTime" label="common.field.updateTime" showTime /> + <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> + <TextField source="nickname" /> + </ReferenceField> + <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} /> + <WrapperField cellClassName="opt" label="common.field.opt"> + <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} /> + <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> + </WrapperField> + </StyledDatagrid> + </List> + <TransferCreate + open={createDialog} + setOpen={setCreateDialog} + /> + <PageDrawer + title='Transfer Detail' + drawerVal={drawerVal} + setDrawerVal={setDrawerVal} + > + </PageDrawer> + </Box> + ) +} + +export default TransferList; diff --git a/rsf-admin/src/page/orders/transfer/TransferPanel.jsx b/rsf-admin/src/page/orders/transfer/TransferPanel.jsx new file mode 100644 index 0000000..4bcb9e6 --- /dev/null +++ b/rsf-admin/src/page/orders/transfer/TransferPanel.jsx @@ -0,0 +1,123 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material'; +import { + useTranslate, + useRecordContext, +} from 'react-admin'; +import PanelTypography from "../../components/PanelTypography.jsx"; +import * as Common from '@/utils/common.js' + +const TransferPanel = () => { + const record = useRecordContext(); + if (!record) return null; + const translate = useTranslate(); + return ( + <> + <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}> + <CardContent> + <Grid container spacing={2}> + <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}> + <Typography variant="h6" gutterBottom align="left" sx={{ + maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' }, + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }}> + {Common.camelToPascalWithSpaces(translate('table.field.transfer.id'))}: {record.id} + </Typography> + {/* inherit, primary, secondary, textPrimary, textSecondary, error */} + <Typography variant="h6" gutterBottom align="right" > + ID: {record.id} + </Typography> + </Grid> + </Grid> + <Grid container spacing={2}> + <Grid item xs={12} container alignContent="flex-end"> + <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}> + {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo} + </Typography> + </Grid> + </Grid> + <Box height={20}> </Box> + <Grid container spacing={2}> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.code" + property={record.code} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.type" + property={record.type} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.source" + property={record.source$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.exceStatus" + property={record.exceStatus$} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.orgWareId" + property={record.orgWareId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.orgWareName" + property={record.orgWareName} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.tarWareId" + property={record.tarWareId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.tarWareName" + property={record.tarWareName} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.orgAreaId" + property={record.orgAreaId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.orgAreaName" + property={record.orgAreaName} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.tarAreaId" + property={record.tarAreaId} + /> + </Grid> + <Grid item xs={6}> + <PanelTypography + title="table.field.transfer.tarAreaName" + property={record.tarAreaName} + /> + </Grid> + + </Grid> + </CardContent> + </Card > + </> + ); +}; + +export default TransferPanel; diff --git a/rsf-admin/src/page/orders/transfer/index.jsx b/rsf-admin/src/page/orders/transfer/index.jsx new file mode 100644 index 0000000..ed6b467 --- /dev/null +++ b/rsf-admin/src/page/orders/transfer/index.jsx @@ -0,0 +1,18 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import TransferList from "./TransferList.jsx"; +import TransferEdit from "./TransferEdit.jsx"; + +export default { + list: TransferList, + edit: TransferEdit, + show: ShowGuesser, + recordRepresentation: (record) => { + return `${record.id}` + } +}; diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java index 7cd976f..8c5663c 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java @@ -22,8 +22,8 @@ // generator.username="sa"; // generator.password="Zoneyung@zy56$"; - generator.table = "man_check_diff_item"; - generator.tableDesc = "鐩樼偣鏄庣粏宸紓琛�"; + generator.table = "man_transfer"; + generator.tableDesc = "璋冩嫈鍗�"; generator.packagePath = "com.vincent.rsf.server.manager"; generator.build(); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java new file mode 100644 index 0000000..06600e0 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java @@ -0,0 +1,110 @@ +package com.vincent.rsf.server.manager.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.R; +import com.vincent.rsf.server.common.utils.ExcelUtil; +import com.vincent.rsf.server.common.annotation.OperationLog; +import com.vincent.rsf.server.common.domain.BaseParam; +import com.vincent.rsf.server.common.domain.KeyValVo; +import com.vincent.rsf.server.common.domain.PageParam; +import com.vincent.rsf.server.manager.entity.Transfer; +import com.vincent.rsf.server.manager.service.TransferService; +import com.vincent.rsf.server.system.controller.BaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +@RestController +public class TransferController extends BaseController { + + @Autowired + private TransferService transferService; + + @PreAuthorize("hasAuthority('manager:transfer:list')") + @PostMapping("/transfer/page") + public R page(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<Transfer, BaseParam> pageParam = new PageParam<>(baseParam, Transfer.class); + return R.ok().add(transferService.page(pageParam, pageParam.buildWrapper(true))); + } + + @PreAuthorize("hasAuthority('manager:transfer:list')") + @PostMapping("/transfer/list") + public R list(@RequestBody Map<String, Object> map) { + return R.ok().add(transferService.list()); + } + + @PreAuthorize("hasAuthority('manager:transfer:list')") + @PostMapping({"/transfer/many/{ids}", "/transfers/many/{ids}"}) + public R many(@PathVariable Long[] ids) { + return R.ok().add(transferService.listByIds(Arrays.asList(ids))); + } + + @PreAuthorize("hasAuthority('manager:transfer:list')") + @GetMapping("/transfer/{id}") + public R get(@PathVariable("id") Long id) { + return R.ok().add(transferService.getById(id)); + } + + @PreAuthorize("hasAuthority('manager:transfer:save')") + @OperationLog("Create 璋冩嫈鍗�") + @PostMapping("/transfer/save") + public R save(@RequestBody Transfer transfer) { + transfer.setCreateBy(getLoginUserId()); + transfer.setCreateTime(new Date()); + transfer.setUpdateBy(getLoginUserId()); + transfer.setUpdateTime(new Date()); + if (!transferService.save(transfer)) { + return R.error("Save Fail"); + } + return R.ok("Save Success").add(transfer); + } + + @PreAuthorize("hasAuthority('manager:transfer:update')") + @OperationLog("Update 璋冩嫈鍗�") + @PostMapping("/transfer/update") + public R update(@RequestBody Transfer transfer) { + transfer.setUpdateBy(getLoginUserId()); + transfer.setUpdateTime(new Date()); + if (!transferService.updateById(transfer)) { + return R.error("Update Fail"); + } + return R.ok("Update Success").add(transfer); + } + + @PreAuthorize("hasAuthority('manager:transfer:remove')") + @OperationLog("Delete 璋冩嫈鍗�") + @PostMapping("/transfer/remove/{ids}") + public R remove(@PathVariable Long[] ids) { + if (!transferService.removeByIds(Arrays.asList(ids))) { + return R.error("Delete Fail"); + } + return R.ok("Delete Success").add(ids); + } + + @PreAuthorize("hasAuthority('manager:transfer:list')") + @PostMapping("/transfer/query") + public R query(@RequestParam(required = false) String condition) { + List<KeyValVo> vos = new ArrayList<>(); + LambdaQueryWrapper<Transfer> wrapper = new LambdaQueryWrapper<>(); + if (!Cools.isEmpty(condition)) { + wrapper.like(Transfer::getId, condition); + } + transferService.page(new Page<>(1, 30), wrapper).getRecords().forEach( + item -> vos.add(new KeyValVo(item.getId(), item.getId())) + ); + return R.ok().add(vos); + } + + @PreAuthorize("hasAuthority('manager:transfer:list')") + @PostMapping("/transfer/export") + public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { + ExcelUtil.build(ExcelUtil.create(transferService.list(), Transfer.class), response); + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java new file mode 100644 index 0000000..154ab5b --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java @@ -0,0 +1,296 @@ +package com.vincent.rsf.server.manager.entity; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.text.SimpleDateFormat; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import com.vincent.rsf.framework.common.Cools; +import com.vincent.rsf.framework.common.SpringUtils; +import com.vincent.rsf.server.system.service.UserService; +import com.vincent.rsf.server.system.entity.User; +import java.io.Serializable; +import java.util.Date; + +@Data +@TableName("man_transfer") +public class Transfer implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @ApiModelProperty(value= "ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 璋冩嫈鍗曞彿 + */ + @ApiModelProperty(value= "璋冩嫈鍗曞彿") + private String code; + + /** + * 璋冩嫈绫诲瀷 + */ + @ApiModelProperty(value= "璋冩嫈绫诲瀷") + private Integer type; + + /** + * 鏉ユ簮: 1: ERP绯荤粺 2: WMS绯荤粺鐢熸垚 3: EXCEL瀵煎叆 4: QMS绯荤粺 + */ + @ApiModelProperty(value= "鏉ユ簮: 1: ERP绯荤粺 2: WMS绯荤粺鐢熸垚 3: EXCEL瀵煎叆 4: QMS绯荤粺 ") + private Integer source; + + /** + * 鎵ц鐘舵��: 0: 鏈墽琛� 1: 鎵ц涓� 2: 鎵ц瀹屾垚 + */ + @ApiModelProperty(value= "鎵ц鐘舵��: 0: 鏈墽琛� 1: 鎵ц涓� 2: 鎵ц瀹屾垚 ") + private Integer exceStatus; + + /** + * 婧愪粨搴揑D + */ + @ApiModelProperty(value= "婧愪粨搴揑D") + private Long orgWareId; + + /** + * 鍘熶粨搴撳悕绉� + */ + @ApiModelProperty(value= "鍘熶粨搴撳悕绉�") + private String orgWareName; + + /** + * 鐩爣浠撳簱ID + */ + @ApiModelProperty(value= "鐩爣浠撳簱ID") + private Long tarWareId; + + /** + * 鐩爣浠撳簱鍚嶇О + */ + @ApiModelProperty(value= "鐩爣浠撳簱鍚嶇О") + private String tarWareName; + + /** + * 婧愬簱鍖篒D + */ + @ApiModelProperty(value= "婧愬簱鍖篒D") + private Long orgAreaId; + + /** + * 鍘熷簱鍖哄悕绉� + */ + @ApiModelProperty(value= "鍘熷簱鍖哄悕绉�") + private String orgAreaName; + + /** + * 鐩爣搴撳尯ID + */ + @ApiModelProperty(value= "鐩爣搴撳尯ID") + private Long tarAreaId; + + /** + * 鐩爣搴撳尯鍚嶇О + */ + @ApiModelProperty(value= "鐩爣搴撳尯鍚嶇О") + private String tarAreaName; + + /** + * 鐘舵�� 1: 姝e父 0: 鍐荤粨 + */ + @ApiModelProperty(value= "鐘舵�� 1: 姝e父 0: 鍐荤粨 ") + private Integer status; + + /** + * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� + */ + @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄� 0: 鍚� ") + @TableLogic + private Integer deleted; + + /** + * 绉熸埛 + */ + @ApiModelProperty(value= "绉熸埛") + private Integer tenantId; + + /** + * 娣诲姞浜哄憳 + */ + @ApiModelProperty(value= "娣诲姞浜哄憳") + private Long createBy; + + /** + * 娣诲姞鏃堕棿 + */ + @ApiModelProperty(value= "娣诲姞鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 淇敼浜哄憳 + */ + @ApiModelProperty(value= "淇敼浜哄憳") + private Long updateBy; + + /** + * 淇敼鏃堕棿 + */ + @ApiModelProperty(value= "淇敼鏃堕棿") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 澶囨敞 + */ + @ApiModelProperty(value= "澶囨敞") + private String memo; + + public Transfer() {} + + public Transfer(String code,Integer type,Integer source,Integer exceStatus,Long orgWareId,String orgWareName,Long tarWareId,String tarWareName,Long orgAreaId,String orgAreaName,Long tarAreaId,String tarAreaName,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) { + this.code = code; + this.type = type; + this.source = source; + this.exceStatus = exceStatus; + this.orgWareId = orgWareId; + this.orgWareName = orgWareName; + this.tarWareId = tarWareId; + this.tarWareName = tarWareName; + this.orgAreaId = orgAreaId; + this.orgAreaName = orgAreaName; + this.tarAreaId = tarAreaId; + this.tarAreaName = tarAreaName; + this.status = status; + this.deleted = deleted; + this.tenantId = tenantId; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + this.memo = memo; + } + +// Transfer transfer = new Transfer( +// null, // 璋冩嫈鍗曞彿 +// null, // 璋冩嫈绫诲瀷 +// null, // 鏉ユ簮: +// null, // 鎵ц鐘舵��: +// null, // 婧愪粨搴揑D +// null, // 鍘熶粨搴撳悕绉� +// null, // 鐩爣浠撳簱ID +// null, // 鐩爣浠撳簱鍚嶇О +// null, // 婧愬簱鍖篒D +// null, // 鍘熷簱鍖哄悕绉� +// null, // 鐩爣搴撳尯ID +// null, // 鐩爣搴撳尯鍚嶇О +// null, // 鐘舵�乕闈炵┖] +// null, // 鏄惁鍒犻櫎[闈炵┖] +// null, // 绉熸埛 +// null, // 娣诲姞浜哄憳 +// null, // 娣诲姞鏃堕棿[闈炵┖] +// null, // 淇敼浜哄憳 +// null, // 淇敼鏃堕棿[闈炵┖] +// null // 澶囨敞 +// ); + + public String getSource$(){ + if (null == this.source){ return null; } + switch (this.source){ + case 1: + return "ERP绯荤粺"; + case 2: + return "WMS绯荤粺鐢熸垚"; + case 3: + return "EXCEL瀵煎叆 "; + case 4: + return "QMS绯荤粺"; + default: + return String.valueOf(this.source); + } + } + + public String getExceStatus$(){ + if (null == this.exceStatus){ return null; } + switch (this.exceStatus){ + case 0: + return "鏈墽琛�"; + case 1: + return "鎵ц涓�"; + case 2: + return "鎵ц瀹屾垚"; + default: + return String.valueOf(this.exceStatus); + } + } + + public String getStatus$(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return "姝e父"; + case 0: + return "鍐荤粨"; + default: + return String.valueOf(this.status); + } + } + + public String getCreateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.createBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getCreateTime$(){ + if (Cools.isEmpty(this.createTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); + } + + public String getUpdateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.getById(this.updateBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getNickname()); + } + return null; + } + + public String getUpdateTime$(){ + if (Cools.isEmpty(this.updateTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); + } + + + + public Boolean getStatusBool(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return true; + case 0: + return false; + default: + return null; + } + } + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderSourceType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderSourceType.java index a5bba7c..6fb3726 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderSourceType.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderSourceType.java @@ -7,7 +7,7 @@ * @version 1.0 */ public enum OrderSourceType { - + //鍗曟嵁鏉ユ簮 ORDER_SOURCE_TYPE_ERP("1", "ERP绯荤粺"), ORDER_SOURCE_TYPE_SYSTEM("2", "WMS绯荤粺鐢熸垚"), ORDER_SOURCE_TYPE_EXCEL("3", "EXCEL瀵煎叆"), diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferMapper.java new file mode 100644 index 0000000..dbe0b9d --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/TransferMapper.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.mapper; + +import com.vincent.rsf.server.manager.entity.Transfer; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface TransferMapper extends BaseMapper<Transfer> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java new file mode 100644 index 0000000..47d4f27 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java @@ -0,0 +1,8 @@ +package com.vincent.rsf.server.manager.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.vincent.rsf.server.manager.entity.Transfer; + +public interface TransferService extends IService<Transfer> { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java index 41bc10a..c536971 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java @@ -1019,8 +1019,6 @@ } } } - - }); }); List<Long> matnrIds = taskItems.stream().map(TaskItem::getMatnrId).collect(Collectors.toList()); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java new file mode 100644 index 0000000..b4b3026 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java @@ -0,0 +1,12 @@ +package com.vincent.rsf.server.manager.service.impl; + +import com.vincent.rsf.server.manager.mapper.TransferMapper; +import com.vincent.rsf.server.manager.entity.Transfer; +import com.vincent.rsf.server.manager.service.TransferService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("transferService") +public class TransferServiceImpl extends ServiceImpl<TransferMapper, Transfer> implements TransferService { + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java index 92ccf21..40e8b46 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/DictTypeCode.java @@ -87,8 +87,8 @@ public final static String SYS_CHECK_EXCE_STATUS = "sys_check_exce_status"; /**鐩樼偣宸紓鍗曟墽琛岀姸鎬�*/ public final static String SYS_CHECK_DIFF_EXCE_STATUS = "sys_check_diff_exce_status"; - + /**鐩樼偣寮傚父鍘熷洜*/ public final static String SYS_CHECK_DIFF_REASON = "sys_check_diff_reason"; - + /**鐩樼偣绫诲瀷*/ public final static String SYS_CHECK_TYPE = "sys_check_type"; } diff --git a/rsf-server/src/main/resources/mapper/manager/TransferMapper.xml b/rsf-server/src/main/resources/mapper/manager/TransferMapper.xml new file mode 100644 index 0000000..113eacc --- /dev/null +++ b/rsf-server/src/main/resources/mapper/manager/TransferMapper.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.vincent.rsf.server.manager.mapper.TransferMapper"> + +</mapper> -- Gitblit v1.9.1