From 15ed897e0bd9ec3ac56f260e326b21ffd4bafae9 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期五, 13 六月 2025 08:04:25 +0800 Subject: [PATCH] 新增自定义编辑列 新增自定义出库路由 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java | 9 -- rsf-admin/src/page/orders/outStock/OutOrderModal.jsx | 18 ++++- rsf-admin/src/page/orders/outStock/OutStockPublic.jsx | 72 ++++++++++++++++++------ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java | 11 +++ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java | 29 +++++++++ rsf-server/src/main/resources/application.yml | 2 rsf-admin/src/i18n/zh.js | 2 rsf-admin/src/page/orders/outStock/OutOrderList.jsx | 9 ++ rsf-admin/src/i18n/en.js | 2 10 files changed, 120 insertions(+), 36 deletions(-) diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index 1365548..1d4627b 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -79,6 +79,8 @@ result: 'Contacts import complete. Imported %{success} success, with %{error} errors', }, loadMore: 'Load More Data', + updateSucc: 'Update Success', + updateFaild: 'Update Failed', complete: 'Complete', deprecate: 'Deprecate', stockError: 'Empty', diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index 119968f..a52e088 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -81,6 +81,8 @@ result: '瀵煎叆瀹屾垚銆傚凡瀵煎叆 %{success} 鎴愬姛, 鍜� %{error} 澶辫触', }, loadMore: '鍔犺浇鏇村', + updateSucc: '鏇存柊鎴愬姛', + updateFaild: '鏇存柊澶辫触', complete: '瀹屾垚', deprecate: '搴熷純', stockError: '娌℃湁搴撳瓨', diff --git a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx index a13d58c..955b074 100644 --- a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx +++ b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx @@ -37,6 +37,7 @@ Button, useRedirect, useUnselectAll, + useRecordSelection, } from 'react-admin'; import { Box, Typography, Card, Stack, Drawer } from '@mui/material'; import { styled } from '@mui/material/styles'; @@ -57,6 +58,7 @@ import AddTaskIcon from '@mui/icons-material/AddTask'; import PageEditDrawer from "../../components/PageEditDrawer"; import OutStockPublic from "./OutStockPublic"; +import OutOrderPreview from "./OutOrderPreview"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -114,6 +116,7 @@ const translate = useTranslate(); const [createDialog, setCreateDialog] = useState(false); const [manualDialog, setManualDialog] = useState(false); + const [preview, setPreview] = useState(false); const [drawerVal, setDrawerVal] = useState(false); const [modalType, setmodalType] = useState(0); const [select, setSelect] = useState(0); @@ -191,13 +194,16 @@ <OutOrderModal open={createDialog} setOpen={setCreateDialog} + preview={preview} + setPreview={setPreview} /> + <OutOrderPreview open={preview} setOpen={setPreview} /> <PageEditDrawer title={"toolbar.publicWorking"} drawerVal={drawerVal} setDrawerVal={setDrawerVal} > - <OutStockPublic record={select} open={drawerVal} setOpen={setDrawerVal}/> + <OutStockPublic record={select} open={drawerVal} setOpen={setDrawerVal} /> </PageEditDrawer> </Box > ) @@ -257,7 +263,6 @@ const record = useRecordContext(); const notify = useNotify(); const refresh = useRefresh(); - const createByOrder = async (event) => { event.stopPropagation(); setCreateDialog(true); diff --git a/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx index b8222e7..229b284 100644 --- a/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx +++ b/rsf-admin/src/page/orders/outStock/OutOrderModal.jsx @@ -46,6 +46,8 @@ import request from '@/utils/request'; import SaveIcon from '@mui/icons-material/Save'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; +import EditableTextField from "../../components/EditableTextField"; +import OutOrderPreview from "./OutOrderPreview"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -90,9 +92,11 @@ ] const OutOrderModal = (props) => { - const { open, setOpen, record } = props; + const { open, setOpen, preview, setPreview, record } = props; const translate = useTranslate(); const [params, setParams] = useState({}); + const [select, setSelect] = useState([]); + const [drawerVal, setDrawerVal] = useState(false); const refresh = useRefresh(); @@ -221,7 +225,7 @@ /> <StyledDatagrid preferenceKey='deliveryItem' - bulkActionButtons={<AddOutStockButton setOpen={setOpen} />} + bulkActionButtons={<AddOutStockButton setOpen={setOpen} setPreview={setPreview} setSelect={setSelect}/>} rowClick={(id, resource, record) => false} expand={false} expandSingle={true} @@ -247,6 +251,9 @@ </Grid> </DialogContent> </Grid> + <Grid> + <OutOrderPreview open={preview} setOpen={setPreview} selectedIds={select} /> + </Grid> </Dialog > ) } @@ -254,7 +261,7 @@ export default OutOrderModal; const AddOutStockButton = (props) => { - const { setOpen } = props; + const { setOpen, setPreview, setSelect } = props; const { selectedIds, onUnselectItems } = useListContext(); const notify = useNotify(); const refresh = useRefresh(); @@ -265,9 +272,10 @@ } else { notify(res.data.msg); } - refresh(); + setPreview(true) + setSelect(selectedIds); onUnselectItems(); - setOpen(false); + // refresh(); } return ( diff --git a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx index e63b5a2..b5748f6 100644 --- a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx +++ b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx @@ -69,14 +69,39 @@ const notify = useNotify(); const gridRef = useGridApiRef(); const [rows, setRows] = useState([]); + const [fetchRows, setFetchRows] = useState([]); const translate = useTranslate(); + const [rowSelectedIds, setRowSelectedIds] = useState([]); + const [selectedMatnr, setSelectedMatnr] = useState([]); const [selectedIds, setSelectedIds] = useState([]); - const [formData, setFormData] = useState({ - orderId: record?.id, - waveId: DEFAULT_TYPE - }); + const [formData, setFormData] = useState({ orderId: record?.id, waveId: DEFAULT_TYPE }); const [dialog, setDialog] = useState(false); const [selectedValue, setSelectedValue] = useState({}); + + useEffect(() => { + if (selectedMatnr.length < 1) { + setRows(fetchRows) + } else { + const mas = fetchRows.filter(item => selectedMatnr.includes(item.matnrCode)); + setRows(mas) + } + }, [selectedMatnr]) + + + const handleRowClick = (id, resource, record) => { + setRowSelectedIds(prev => + prev.includes(id) + ? prev.filter(item => item !== id) // 鍙栨秷閫夋嫨 + : [...prev, id] // 娣诲姞閫夋嫨 + ); + + //璁剧疆搴撲綅淇℃伅绛涢�夋潯浠� + setSelectedMatnr(prev => + prev.includes(record?.matnrCode) + ? prev.filter(item => item !== record?.matnrCode) // 鍙栨秷閫夋嫨 + : [...prev, record?.matnrCode] // 娣诲姞閫夋嫨 + ); + }; const handleClickOpen = () => { setDialog(true); @@ -85,13 +110,23 @@ const handleClose = (value) => { setDialog(false); setSelectedValue(value); - const newRows = rows.map(item => { - return selectedIds.includes(item?.id) ? { - ...item, - siteNo: value?.site - } : item - }) - setRows(newRows); + if (selectedIds.length == 0) { + const newRows = rows.map(item => { + return { + ...item, + siteNo: value?.site + } + }) + setRows(newRows); + } else { + const newRows = rows.map(item => { + return selectedIds.includes(item?.id) ? { + ...item, + siteNo: value?.site + } : item + }) + setRows(newRows); + } }; useEffect(() => { @@ -107,6 +142,7 @@ const { data: { code, data, msg } } = await request.post('/outStock/order/getOutTaskItems', { ...formData }); if (code === 200) { setRows(data) + setFetchRows(data) } else { notify(msg); } @@ -161,9 +197,11 @@ sx={{ height: "2px", position: 'absolute', top: 0, left: 0, right: 0, }} /> <StyledDatagrid + storeKey={"outStockPublic"} preferenceKey='outStockItem' bulkActionButtons={<></>} - rowClick={false} + rowClick={handleRowClick} + selectedIds={rowSelectedIds} omit={['id', 'splrName', 'qty', 'poCode', 'workQty']} > <NumberField source="id" /> @@ -181,8 +219,8 @@ </Card> </Grid> <Grid item xl={6.3} gap={2}> - <Card> - <Box sx={{ height: 500, width: '100%' }}> + <Card sx={{ minHeight: 1050, height: 'calc(100% - 10px)', width: '100%' }}> + <Box> <PreviewTable rows={rows} gridRef={gridRef} @@ -223,7 +261,6 @@ } }, [selectedIds]) - const baseColumns = [ // { field: 'id', headerName: 'ID', width: 40 }, { field: 'locCode', headerName: '搴撲綅', width: 110 }, @@ -232,8 +269,7 @@ { field: 'batch', headerName: '鎵规', width: 90 }, { field: 'unit', headerName: '鍗曚綅', width: 60 }, { field: 'outQty', headerName: '鍑哄簱鏁伴噺', width: 110, }, - { - field: 'anfme', headerName: '搴撳瓨鏁伴噺', width: 110, + { field: 'anfme', headerName: '搴撳瓨鏁伴噺', width: 110, renderCell: (params) => ( <OutStockAnfme value={params.value} /> ) @@ -379,6 +415,7 @@ return ( <DataGrid + storeKey={"locItemPreview"} rows={rows} columns={columns} slots={{ toolbar: CustomToolBar }} @@ -393,7 +430,6 @@ /> ) } - //鎻愪氦鎸夐挳 diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java index 1ee268e..e140809 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java @@ -63,6 +63,17 @@ } @PreAuthorize("hasAuthority('manager:outStock:list')") + @PostMapping("/outStock/dialog/page") + public R dialogPage(@RequestBody Map<String, Object> map) { + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<AsnOrder, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrder.class); + QueryWrapper<AsnOrder> queryWrapper = pageParam.buildWrapper(true); + List<String> list = Arrays.asList(OrderType.ORDER_OUT.type); + queryWrapper.in("type", list); + return R.ok().add(outStockService.page(pageParam, queryWrapper)); + } + + @PreAuthorize("hasAuthority('manager:outStock:list')") @PostMapping("/outStock/list") public R list(@RequestBody Map<String, Object> map) { return R.ok().add(outStockService.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getType, OrderType.ORDER_OUT.type))); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java index 0e11b1c..1ad99ee 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; @@ -48,7 +49,32 @@ public R page(@RequestBody Map<String, Object> map) { BaseParam baseParam = buildParam(map, BaseParam.class); PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class); - return R.ok().add(outStockItemService.listByAsnId(pageParam, pageParam.buildWrapper(true))); + QueryWrapper<AsnOrderItem> queryWrapper = pageParam.buildWrapper(true); + if (!Objects.isNull(map.get("poDetlId"))) { + queryWrapper.in("po_detl_id", JSONArray.parseArray(JSONArray.toJSONString(map.get("poDetlId")), Long.class)); + } + return R.ok().add(outStockItemService.listByAsnId(pageParam, queryWrapper)); + } + + + @PreAuthorize("hasAuthority('manager:outStockItem:list')") + @ApiOperation("鍒嗛〉鑾峰彇鍒楄〃") + @PostMapping("/outStockItem/edit/page") + public R byPoIdspage(@RequestBody Map<String, Object> map) { + List<Long> poDetlIds = new ArrayList<>(); + if (!Objects.isNull(map.get("poDetlId"))) { + poDetlIds = JSONArray.parseArray(JSONArray.toJSONString(map.get("poDetlId")), Long.class); + map.remove("poDetlId"); + } + BaseParam baseParam = buildParam(map, BaseParam.class); + PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class); + QueryWrapper<AsnOrderItem> queryWrapper = pageParam.buildWrapper(true); + if (!poDetlIds.isEmpty()) { + queryWrapper.in("po_detl_id", poDetlIds); + } else { + return R.ok(); + } + return R.ok().add(outStockItemService.listByAsnId(pageParam, queryWrapper)); } @PreAuthorize("hasAuthority('manager:outStockItem:list')") @@ -106,6 +132,7 @@ return R.ok("Update Success").add(asnOrderItem); } + @PreAuthorize("hasAuthority('manager:outStockItem:remove')") @OperationLog("Delete 鍑哄簱鍗曟槑缁�") @PostMapping("/outStockItem/remove/{ids}") diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java index 3165298..c1b7c48 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java @@ -115,18 +115,11 @@ } Double orgQty = locItems.stream().mapToDouble(LocItem::getAnfme).sum(); - Double workQty = locItems.stream().mapToDouble(LocItem::getWorkQty).sum(); List<LocItem> locItemList = listMap.get(key); Double outQty = locItemList.stream().mapToDouble(LocItem::getOutQty).sum(); -// Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, loc.getBarcode())); -// if (!Objects.isNull(serviceOne)) { -// throw new CoolException("鎵樼洏浠诲姟鎵ц涓紝涓嶈兘閲嶅鍒涘缓锛�"); -// } - if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK) || map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK)) { - Double useQty = Math.round((outQty + workQty) * 10000) / 10000.0; - if (orgQty.compareTo(useQty) > 0) { + if (orgQty.compareTo(outQty) > 0) { //鎷f枡鍑哄簱 DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>() .eq(DeviceSite::getSite, siteNo) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java index 7948911..01a31d2 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java @@ -446,7 +446,7 @@ if (Objects.isNull(param)) { continue; } - Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, param.getBarcode())); + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, param.getLocCode()).eq(Loc::getBarcode, param.getBarcode())); if (!Objects.isNull(loc)) { List<LocItem> locItems = new ArrayList<>(); LocItem locItem = locItemService.getById(param.getId()); diff --git a/rsf-server/src/main/resources/application.yml b/rsf-server/src/main/resources/application.yml index ac31a5b..db51329 100644 --- a/rsf-server/src/main/resources/application.yml +++ b/rsf-server/src/main/resources/application.yml @@ -25,7 +25,7 @@ # global-config: # field-strategy: 0 configuration: -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true cache-enabled: true call-setters-on-nulls: true -- Gitblit v1.9.1