From 866601517e00f9f4ecf43855f28169c66b548412 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期五, 28 三月 2025 14:19:35 +0800 Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop --- rsf-admin/src/page/asnOrder/AsnOrderList.jsx | 76 ++++++++++++-- rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx | 168 +++++++++++++++------------------ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java | 3 rsf-admin/vite.config.js | 1 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java | 1 rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/system/utils/SerialRuleUtils.java | 9 + rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java | 37 +++++++ rsf-admin/src/page/basicInfo/loc/LocList.jsx | 1 9 files changed, 189 insertions(+), 111 deletions(-) diff --git a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx index cd9fdb1..8862faa 100644 --- a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx +++ b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx @@ -15,6 +15,7 @@ useRecordContext, useTranslate, useNotify, + useRefresh, useListContext, FunctionField, TextField, @@ -47,7 +48,7 @@ import ConstructionIcon from "@mui/icons-material/Construction"; import FileDownloadIcon from '@mui/icons-material/FileDownload'; import EditIcon from '@mui/icons-material/Edit'; - +import request from '@/utils/request'; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ @@ -107,13 +108,6 @@ navigate(`/asnOrderItem?asnId=${record.id}`); }; - - const inspection = () => { }; - - const print = () => { - }; - - return ( <Box display="flex"> <List @@ -132,9 +126,6 @@ actions={( <TopToolbar> - <Button onClick={inspection} label={"toolbar.inspection"}> - <ConstructionIcon /> - </Button> <FilterButton /> <MyCreateButton onClick={() => { setCreateDialog(true); setmodalType(0) }} /> <SelectColumnsButton preferenceKey='asnOrder' /> @@ -146,7 +137,7 @@ > <StyledDatagrid preferenceKey='asnOrder' - bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} + bulkActionButtons={<> <InspectionsButton /><BulkDeleteButton mutationMode={OPERATE_MODE} /></>} rowClick={(id, resource, record) => false} expand={(e) => <AsnOrderPanel key={Math.floor(Math.random() * 100)} />} expandSingle={true} @@ -188,6 +179,7 @@ label={'ra.action.edit'} > </Button> */} + <InspectionButton /> <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> </WrapperField> </StyledDatagrid> @@ -227,3 +219,63 @@ </Button> ) } + +const InspectionButton = () => { + const record = useRecordContext(); + const notify = useNotify(); + const refresh = useRefresh(); + const inspection = () => { + requestInspect([record]) + }; + + const requestInspect = async (rows) => { + const { data: { code, data, msg } } = await request.post(`/asnOrder/inspect`, rows); + + if (code === 200) { + notify(msg); + refresh() + } else { + notify(msg); + } + } + + + return ( + <Button onClick={inspection} label={"toolbar.inspection"}> + <ConstructionIcon /> + </Button> + ) +} + +const InspectionsButton = () => { + const { selectedIds, onUnselectItems, data } = useListContext(); + const notify = useNotify(); + const refresh = useRefresh(); + const inspection = () => { + if (selectedIds.length === 0) { + notify('璇烽�夋嫨閫氱煡鍗�'); + return; + } else { + const rows = data.filter((item) => selectedIds.includes(item.id)) + requestInspect(rows) + } + }; + + const requestInspect = async (rows) => { + const { data: { code, data, msg } } = await request.post(`/asnOrder/inspect`, rows); + + if (code === 200) { + notify(msg); + refresh() + } else { + notify(msg); + } + } + + + return ( + <Button onClick={inspection} label={"toolbar.inspection"}> + <ConstructionIcon /> + </Button> + ) +} diff --git a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx index 36e5df2..5d1eeb6 100644 --- a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx +++ b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx @@ -1,5 +1,5 @@ import React, { useState, useRef, useEffect, useMemo } from "react"; -import { Box, Card, CardContent, Grid, Typography, Tooltip, Paper, TableContainer, Table, TableBody, TableCell, TableHead, TableRow } from '@mui/material'; +import { Box, Card, CardContent, Grid, Typography, Button, TextField, Tooltip, Paper, TableContainer, Table, TableBody, TableCell, TableHead, TableRow } from '@mui/material'; import { useTranslate, useRecordContext, @@ -9,20 +9,24 @@ import * as Common from '@/utils/common' import { styled } from "@mui/material/styles"; import request from '@/utils/request'; +import debounce from 'lodash/debounce'; +import { DataGrid } from '@mui/x-data-grid'; const AsnOrderPanel = () => { const record = useRecordContext(); if (!record) return null; const translate = useTranslate(); const notify = useNotify(); const [rows, setRows] = useState([]); + const [maktx, setMaktx] = useState(''); const asnId = record.id; useEffect(() => { - http(); - }, [asnId]); + debouncedHttp({ maktx }); + }, [asnId, maktx]); - const http = async () => { - const res = await request.post('/asnOrderItem/page', { asnId }); + + const http = async (parmas) => { + const res = await request.post('/asnOrderItem/page', { ...parmas, asnId }); if (res?.data?.code === 200) { setRows(res.data.data.records) } else { @@ -30,6 +34,7 @@ } } + const debouncedHttp = useMemo(() => debounce(http, 300), []); const StyledTableRow = styled(TableRow)(({ theme }) => ({ "& .MuiButtonBase-root.": { @@ -49,130 +54,113 @@ const columns = [ { - id: 'asnId', - label: 'table.field.asnOrderItem.asnId', - minWidth: 100, + field: 'asnId', + headerName: translate('table.field.asnOrderItem.asnId') }, { - id: 'asnCode', - label: 'table.field.asnOrderItem.asnCode', - minWidth: 100, + field: 'asnCode', + headerName: translate('table.field.asnOrderItem.asnCode') }, { - id: 'poDetlId', - label: 'table.field.asnOrderItem.poDetlId', - minWidth: 100, + field: 'poDetlId', + headerName: translate('table.field.asnOrderItem.poDetlId') }, { - id: 'poDetlCode', - label: 'table.field.asnOrderItem.poDetlCode', - minWidth: 100, + field: 'poDetlCode', + headerName: translate('table.field.asnOrderItem.poDetlCode') }, { - id: 'matnrId', - label: 'table.field.asnOrderItem.matnrId', - minWidth: 100, + field: 'matnrId', + headerName: translate('table.field.asnOrderItem.matnrId') }, { - id: 'maktx', - label: 'table.field.asnOrderItem.maktx', - minWidth: 100, + field: 'maktx', + headerName: translate('table.field.asnOrderItem.maktx') }, { - id: 'anfme', - label: 'table.field.asnOrderItem.anfme', - minWidth: 100, + field: 'anfme', + headerName: translate('table.field.asnOrderItem.anfme') }, { - id: 'stockUnit', - label: 'table.field.asnOrderItem.stockUnit', - minWidth: 100, + field: 'stockUnit', + headerName: translate('table.field.asnOrderItem.stockUnit') }, { - id: 'purQty', - label: 'table.field.asnOrderItem.purQty', - minWidth: 100, + field: 'purQty', + headerName: translate('table.field.asnOrderItem.purQty') }, { - id: 'purUnit', - label: 'table.field.asnOrderItem.purUnit', - minWidth: 100, + field: 'purUnit', + headerName: translate('table.field.asnOrderItem.purUnit') }, { - id: 'qty', - label: 'table.field.asnOrderItem.qty', - minWidth: 100, + field: 'qty', + headerName: translate('table.field.asnOrderItem.qty') }, { - id: 'splrCode', - label: 'table.field.asnOrderItem.splrCode', - minWidth: 100, + field: 'splrCode', + headerName: translate('table.field.asnOrderItem.splrCode') }, { - id: 'splrName', - label: 'table.field.asnOrderItem.splrName', - minWidth: 100, + field: 'splrName', + headerName: translate('table.field.asnOrderItem.splrName') }, { - id: 'qrcode', - label: 'table.field.asnOrderItem.qrcode', - minWidth: 100, + field: 'barcode', + headerName: translate('table.field.asnOrderItem.barcode') }, { - id: 'barcode', - label: 'table.field.asnOrderItem.barcode', - minWidth: 100, - }, - { - id: 'packName', - label: 'table.field.asnOrderItem.packName', - minWidth: 100, + field: 'packName', + headerName: translate('table.field.asnOrderItem.packName') }] + + const [selectedRows, setSelectedRows] = useState([]); + + const handleSelectionChange = (ids) => { + setSelectedRows(ids) + + }; + const maktxChange = (value) => { + setMaktx(value) + } + + const wakbarcode = () => { + + } + + const wakprint = () => { + + } return ( - <Box sx={{ position: 'relative', padding: '5px 10px' }}> - <TableContainer component={Paper} > - <Table size="small" > - <TableHead> - <StyledTableRow key={'head'}> - {columns.map((column, idx) => { - const value = column.label; - return ( - <> - <StyledTableCell - key={column.id} - align={column.align || "left"} - // style={{ paddingLeft: idx === 0 && (depth * 16 + 16) }} - > - {column.format ? column.format(value) : translate(value)} - </StyledTableCell> - </> - ); - })} - </StyledTableRow> - </TableHead> + <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', alignItems: 'center' }}> + <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} /> - <TableBody> - {rows.map((row) => ( - <StyledTableRow key={row.id + Math.random()}> - {columns.map((column) => ( - <StyledTableCell key={column.id} > - {row[column.id]} - </StyledTableCell> - ))} - </StyledTableRow> - ))} + <div style={{ display: 'flex', gap: '10px' }}> + <Button variant="contained" onClick={wakbarcode}>鐢熸垚鏉$爜</Button> + <Button variant="contained" onClick={wakprint}>鎵撳嵃</Button> + </div> + </div> - </TableBody> - </Table> - </TableContainer> - </Box> + + <DataGrid + size="small" + rows={rows} + columns={columns} + checkboxSelection + onRowSelectionModelChange={handleSelectionChange} + selectionModel={selectedRows} + disableColumnMenu={true} + disableColumnSorting + disableMultipleColumnsSorting + /> + </Box > ); }; diff --git a/rsf-admin/src/page/basicInfo/loc/LocList.jsx b/rsf-admin/src/page/basicInfo/loc/LocList.jsx index b425f38..c6a9228 100644 --- a/rsf-admin/src/page/basicInfo/loc/LocList.jsx +++ b/rsf-admin/src/page/basicInfo/loc/LocList.jsx @@ -311,7 +311,6 @@ const notify = useNotify(); const refresh = useRefresh(); - const [createDialog, setCreateDialog] = useState(false); return ( diff --git a/rsf-admin/vite.config.js b/rsf-admin/vite.config.js index ced449c..76153c8 100644 --- a/rsf-admin/vite.config.js +++ b/rsf-admin/vite.config.js @@ -15,6 +15,7 @@ server: { port: 8122, host: '0.0.0.0', + open: true, // available in run dev proxy: { '/rsf-server': { diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java index 991e021..a44caf1 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java @@ -9,6 +9,7 @@ import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -98,7 +99,10 @@ if (Objects.isNull(matnr)) { throw new CoolException("鏁版嵁閿欒锛氬綋鍓嶇墿鏂欎笉瀛樺湪!!"); } -// //TODO barcode鐢熸垚绛栫暐 + String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, item); + if (StringUtils.isBlank(trackCode)) { + throw new CoolException("鍗曟嵁璺熻釜鐮佺敓鎴愬け璐ワ細璇锋鏌ャ�宻ys_asn_mantr_label銆嶆槸鍚﹂厤缃畬鎴愶紒锛�"); + } // String barcode = code + matnr.getCode(); orderItem.setAnfme(item.getAnfme()) .setAsnId(order.getId()) @@ -108,10 +112,11 @@ .setSplrCode(item.getSplrCode()) .setPoDetlId(item.getId()) .setPlatItemId(item.getPlatItemId()) -// .setBarcode(barcode) + .setTrackCode(trackCode) .setPoCode(purchase.getCode()) .setPurQty(item.getAnfme()) .setPurUnit(item.getUnit()) + .setMatnrCode(matnr.getCode()) .setMaktx(matnr.getName()) .setMatnrId(matnr.getId() + ""); orderItems.add(orderItem); @@ -130,4 +135,32 @@ }); } + + /** + * 鐢熸垚鐗╂枡鏍囩 + */ + @Scheduled(cron = "0 0/05 * * * ? ") + @Transactional(rollbackFor = Exception.class) + public void generateMatnrLabel() { + List<AsnOrderItem> list = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>() + .isNull(AsnOrderItem::getTrackCode) + .select(AsnOrderItem::getId)); + if (Objects.isNull(list) || list.isEmpty()) { + return; + } + List<AsnOrderItem> items = new ArrayList<>(); + list.forEach(item -> { + String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, item); + if (StringUtils.isBlank(trackCode)) { + throw new CoolException("鍗曟嵁璺熻釜鐮佺敓鎴愬け璐ワ細璇锋鏌ャ�宻ys_asn_mantr_label銆嶆槸鍚﹂厤缃畬鎴愶紒锛�"); + } + item.setTrackCode(trackCode); + items.add(item); + }); + + if (!asnOrderItemService.updateBatchById(items)) { + throw new CoolException("鐢熸垚缂栫爜澶辫触锛侊紒"); + } + } + } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java index 99cb110..917d504 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java @@ -106,6 +106,9 @@ //淇濆瓨鎵╁睍瀛楁 ExtendFieldsUtils.saveFields(params); AsnOrderItem asnOrderItem = JSONObject.parseObject(JSONObject.toJSONString(params), AsnOrderItem.class); + if (StringUtils.isBlank(asnOrderItem.getTrackCode())) { + SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, params); + } if (!this.saveOrUpdate(asnOrderItem)) { throw new CoolException("鏀惰揣閫氱煡鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�"); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java index 27e33ef..ca6d9a9 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java @@ -108,7 +108,6 @@ item.put("asnId", orders.getId()); item.put("asnCode", orders.getCode()); item.put("poCode", orders.getPoCode()); - if (!asnOrderItemService.fieldsSave(item)) { throw new CoolException("鏄庣粏淇濆瓨澶辫触锛侊紒"); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java index d5578a6..5c8fb89 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java @@ -25,9 +25,9 @@ public final static String SYS_RECEIPT_BATCH = "sys_receipt_batch"; /** - * ASN鏍囩鐢熸垚瑙勫垯 + * ASN鐗╂枡鏍囩鐢熸垚瑙勫垯 */ - public final static String SYS_LABEL_CODE = "sys_label_code"; + public final static String SYS_LABEL_CODE = "sys_asn_mantr_label"; /** * 璐ㄦ鍗曚笟鍔$被鍨� diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/SerialRuleUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/SerialRuleUtils.java index 4f37cc8..9e977d0 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/SerialRuleUtils.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/utils/SerialRuleUtils.java @@ -50,7 +50,7 @@ .list(new LambdaQueryWrapper<SerialRuleItem>() .eq(SerialRuleItem::getRuleId, serialRule.getId()) .orderByAsc(SerialRuleItem::getSort)); - if (Objects.isNull(ruleItems)) { + if (Objects.isNull(ruleItems) || ruleItems.isEmpty()) { throw new CoolException("缂栫爜瑙勫垯鏄庣粏涓虹┖锛侊紒"); } @@ -83,8 +83,11 @@ //鍒ゆ柇鏄惁璁剧疆鎴彇闀垮害鍜岃捣濮嬫埅鍙栦綅缃� buffer.append(subStr(format, rule.getLenStr(), rule.getLen())); } else if (rule.getWkType().equals(SerialRuleType.WK_FEILD.wkType)) { - String subStr = subStr(objectToMap(obj).get(rule.getFeildValue()).toString(), rule.getLenStr(), rule.getLen()); - buffer.append(subStr); + String subStr; + if (!Objects.isNull(objectToMap(obj).get(rule.getFeildValue()))) { + subStr = subStr(objectToMap(obj).get(rule.getFeildValue()).toString(), rule.getLenStr(), rule.getLen()); + buffer.append(subStr); + } } }); -- Gitblit v1.9.1