From d727cdfbd0315850f3c7572149e77f5421db5682 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期三, 18 六月 2025 15:52:12 +0800 Subject: [PATCH] 生成波次功能优化 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java | 14 +- rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java | 73 +++++++++-------- rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java | 6 + rsf-admin/src/page/orders/wave/WaveItemList.jsx | 3 rsf-admin/src/page/orders/wave/WaveList.jsx | 15 ++- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java | 9 - rsf-admin/src/page/orders/outStock/OutStockWaveDialog.jsx | 65 ++++++++++++++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java | 4 rsf-admin/src/i18n/zh.js | 3 rsf-admin/src/page/orders/outStock/OutOrderList.jsx | 5 - rsf-admin/src/i18n/en.js | 1 11 files changed, 135 insertions(+), 63 deletions(-) diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index b36ae34..5b6ff99 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -848,6 +848,7 @@ matnrName: "matnrName", matnrCode: "matnrCode", batch: "batch", + exceStatus: 'Exce Status', splrBatch: "splrBatch", orderCode: "orderCode", orderItemId: "orderItemId", diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index f3070a7..9c8251e 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -882,6 +882,7 @@ orderCode: "婧愬崟鍙�", orderItemId: "婧愬崟鏄庣粏ID", unit: "鍗曚綅", + exceStatus: '鎵ц鐘舵��', trackCode: "璺熻釜鐮�", fieldsIndex: "鍔ㄦ�佹墿灞�", anfme: "鏁伴噺", @@ -1141,7 +1142,7 @@ continue: '缁х画鏀惰揣', batch: '鎵归噺鎿嶄綔', confirm: '纭', - start: '寮�濮嬩笅鍙�', + start: '鑷姩涓嬪彂', pause: '鏆傚仠', pick: '鎷f枡', check: '鐩樼偣', diff --git a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx index bf9b7dc..662f9b9 100644 --- a/rsf-admin/src/page/orders/outStock/OutOrderList.jsx +++ b/rsf-admin/src/page/orders/outStock/OutOrderList.jsx @@ -130,16 +130,13 @@ //鑾峰彇娉㈡瑙勫垯 const closeDialog = async (value) => { setWaveRule(false) - refresh() - console.log('=====>'); - console.log(value); - console.log(selectIds); const res = await request.post(`/outStock/generate/wave`, { ids: selectIds, waveRuleId: value.id }); if (res?.data?.code === 200) { notify(res.data.msg); } else { notify(res.data.msg); } + refresh() } return ( diff --git a/rsf-admin/src/page/orders/outStock/OutStockWaveDialog.jsx b/rsf-admin/src/page/orders/outStock/OutStockWaveDialog.jsx new file mode 100644 index 0000000..cdead23 --- /dev/null +++ b/rsf-admin/src/page/orders/outStock/OutStockWaveDialog.jsx @@ -0,0 +1,65 @@ +import { Box, Card, Grid, List, LinearProgress, Select, MenuItem, ListItemText, ListItemAvatar, Avatar, ListItemButton, Dialog, DialogTitle, ListItem, DialogContent, DialogActions, Button } from "@mui/material"; +import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_TYPE } from '@/config/setting'; +import { SimpleForm, TextInput, ReferenceInput, useTranslate, AutocompleteInput } from "react-admin"; +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { Delete, Edit, Add } from '@mui/icons-material'; +import SaveIcon from '@mui/icons-material/Save'; +import request from '@/utils/request'; + +const OutStockWaveDialog = (props) => { + const translate = useTranslate(); + const { onClose, selectedValue, open, setOpen } = props; + const [siteNos, setSiteNos] = useState([]); + const [formData, setFormData] = useState({ + id: DEFAULT_TYPE + }); + + const handleClose = () => { + onClose(null); + } + + const handleSelect = () => { + onClose(formData); + + } + + const handleListItemClick = (value) => { + onClose(value); + } + + const handleChange = (event) => { + console.log(event); + + setFormData({ id: event }) + }; + + return ( + <Dialog + onClose={handleClose} + open={open} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + <DialogTitle id="alert-dialog-title">{translate("toolbar.selectWave")}</DialogTitle> + <DialogContent sx={{ width: 600 }}> + <SimpleForm toolbar={false} defaultValue={formData}> + <ReferenceInput source="id" reference="waveRule" > + <AutocompleteInput + label={'toolbar.selectWave'} + defaultValue={DEFAULT_TYPE} + onChange={handleChange} + /> + </ReferenceInput> + </SimpleForm> + </DialogContent> + <DialogActions> + <Button onClick={handleClose} variant="outlined">{translate('toolbar.cancel')}</Button> + <Button onClick={handleSelect} autoFocus startIcon={<SaveIcon />} variant="contained"> + {translate('toolbar.confirm')} + </Button> + </DialogActions> + </Dialog> + ); +} + +export default OutStockWaveDialog; \ No newline at end of file diff --git a/rsf-admin/src/page/orders/wave/WaveItemList.jsx b/rsf-admin/src/page/orders/wave/WaveItemList.jsx index 5f675d1..99ee024 100644 --- a/rsf-admin/src/page/orders/wave/WaveItemList.jsx +++ b/rsf-admin/src/page/orders/wave/WaveItemList.jsx @@ -123,7 +123,7 @@ > <StyledDatagrid preferenceKey='waveItem' - bulkActionButtons= { + bulkActionButtons={ <> <BulkStartButton /> <BulkPauseButton /> @@ -146,6 +146,7 @@ <TextField source="fieldsIndex" label="table.field.waveItem.fieldsIndex" /> <NumberField source="workQty" label="table.field.waveItem.workQty" /> <TextField source="unit" label="table.field.waveItem.unit" /> + <TextField source="exceStatus" label="table.field.waveItem.exceStatus" /> <TextField source="updateBy$" label="common.field.updateBy" /> <DateField source="updateTime" label="common.field.updateTime" showTime /> <TextField source="createBy$" label="common.field.createBy" /> diff --git a/rsf-admin/src/page/orders/wave/WaveList.jsx b/rsf-admin/src/page/orders/wave/WaveList.jsx index 3407d5c..2bee24e 100644 --- a/rsf-admin/src/page/orders/wave/WaveList.jsx +++ b/rsf-admin/src/page/orders/wave/WaveList.jsx @@ -89,6 +89,7 @@ const WaveList = () => { const translate = useTranslate(); const [createDialog, setCreateDialog] = useState(false); + const [autoExce, setAutoExce] = useState(false); const [detailDialog, setDetailDialog] = useState(false); const [select, setSelectIds] = useState({}); const [drawerVal, setDrawerVal] = useState(false); @@ -110,8 +111,8 @@ sort={{ field: "create_time", order: "desc" }} actions={( <TopToolbar> - <BulkStartButton /> - <BulkPauseButton /> + <BulkStartButton autoExce={autoExce} setAutoExce={setAutoExce} /> + <BulkPauseButton autoExce={autoExce} setAutoExce={setAutoExce} /> <FilterButton /> <SelectColumnsButton preferenceKey='wave' /> </TopToolbar> @@ -182,24 +183,26 @@ ); } -const BulkStartButton = () => { +const BulkStartButton = ({ autoExce, setAutoExce }) => { const { data, selectedIds, onUnselectItems } = useListContext(); const startClick = () => { onUnselectItems() + setAutoExce(true) } return ( - <Button label="toolbar.start" onClick={startClick} startIcon={<PlayArrowOutlinedIcon />} /> + !autoExce ? <Button label="toolbar.start" onClick={startClick} startIcon={<PlayArrowOutlinedIcon />} /> : <></> ) } -const BulkPauseButton = () => { +const BulkPauseButton = ({ autoExce, setAutoExce }) => { const { data, selectedIds, onUnselectItems } = useListContext(); const pauseClick = () => { onUnselectItems() + setAutoExce(false) } return ( - <Button label="toolbar.pause" onClick={pauseClick} startIcon={<PauseCircleOutlineIcon />} /> + autoExce ? <Button label="toolbar.pause" onClick={pauseClick} startIcon={<PauseCircleOutlineIcon />} /> : <></> ) } \ No newline at end of file diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java index c65ac30..c2f1713 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/FieldsUtils.java @@ -30,10 +30,10 @@ public class FieldsUtils { /** - * @author Ryan - * @description 閫氳繃瀛楁鍞竴鏍囪瘑鑾峰彇鍔ㄦ�佸瓧娈靛璞ey-value * @param * @return 鎵╁睍瀛楁瀵硅薄 + * @author Ryan + * @description 閫氳繃瀛楁鍞竴鏍囪瘑鑾峰彇鍔ㄦ�佸瓧娈靛璞ey-value * @time 2025/3/12 12:50 */ public static Map<String, String> getFields(String uuid) { @@ -45,7 +45,7 @@ } FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class); List<FieldsItem> fieldsItems = fieldsItemService.list(new LambdaQueryWrapper<FieldsItem>().eq(FieldsItem::getUuid, uuid)); - for (Fields field : fields ) { + for (Fields field : fields) { if (fieldsItems.isEmpty()) { fieldsMap.put(field.getFields(), null); continue; @@ -57,14 +57,14 @@ }); } - return fieldsMap; + return fieldsMap; } /** + * @param + * @return 鍖呭惈鎵╁睍瀛楁鐨勯泦鍚堝璞� * @author Ryan * @description 鑾峰彇闆嗗悎鎵╁睍瀛楁key-value鍊� - * @param - * @return 鍖呭惈鎵╁睍瀛楁鐨勯泦鍚堝璞� * @time 2025/3/15 15:05 */ public static List<Map<String, Object>> getExtendFields(List<Map<String, Object>> params) { @@ -104,7 +104,7 @@ * @time 2025/3/18 15:00 */ @Transactional(rollbackFor = Exception.class) - public static boolean saveFields(Map<String, ?> template, String uuid) throws Exception{ + public static boolean saveFields(Map<String, ?> template, String uuid) throws Exception { List<Fields> fields = getFieldsSta(); FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class); List<FieldsItem> fieldsItems = new ArrayList<>(); @@ -132,6 +132,7 @@ /** * 鑾峰彇鎵�鏈夊紑鍚姩鎬佹墿灞曞瓧娈� + * * @return */ public static List<Fields> getFieldsSta() { @@ -140,43 +141,45 @@ } /** - * @author Ryan - * @description 鍔ㄦ�佸瓧娈典慨鏀� * @param * @return + * @author Ryan + * @description 鍔ㄦ�佸瓧娈典慨鏀� * @time 2025/4/7 15:28 */ @Synchronized @Transactional(rollbackFor = Exception.class) public static void updateFieldsValue(Map<String, Object> params) throws Exception { List<Fields> fields = getFieldsSta(); - if (fields.isEmpty()) { return; } + if (fields.isEmpty()) { + return; + } Object fieldsIndex = params.get("fieldsIndex"); if (!Objects.isNull(fieldsIndex) && StringUtils.isNotBlank(fieldsIndex.toString())) { String index = fieldsIndex.toString(); FieldsItemService fieldsItemService = SpringUtils.getBean(FieldsItemService.class); for (Fields field : fields) { - if (!Objects.isNull(params.get(field.getFields()))) { - FieldsItem indexItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>() - .eq(FieldsItem::getUuid, index) - .eq(FieldsItem::getFieldsId, field.getId())); - //濡傛灉瀛愯〃涓虹┖锛屾墽琛屾彃鍏ユ搷浣滐紝鍚﹀垯灏辨墽琛屼慨鏀规搷浣� - if (Objects.isNull(indexItem)) { - FieldsItem item = new FieldsItem(); - item.setUuid(index) - .setFieldsId(field.getId()) - .setMatnrId(!Objects.isNull(params.get("matnrId")) ? Long.parseLong(params.get("matnrId").toString()) : null) - .setValue(params.get(field.getFields()).toString()); - if (!fieldsItemService.save(item)) { - throw new CoolException("鎵╁睍瀛楁淇敼澶辫触锛侊紒"); - } - } else { - indexItem.setValue(params.get(field.getFields()).toString()); - if (!fieldsItemService.updateById(indexItem)) { - throw new CoolException("鎵╁睍瀛楁淇敼澶辫触锛侊紒"); - } + if (!Objects.isNull(params.get(field.getFields()))) { + FieldsItem indexItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>() + .eq(FieldsItem::getUuid, index) + .eq(FieldsItem::getFieldsId, field.getId())); + //濡傛灉瀛愯〃涓虹┖锛屾墽琛屾彃鍏ユ搷浣滐紝鍚﹀垯灏辨墽琛屼慨鏀规搷浣� + if (Objects.isNull(indexItem)) { + FieldsItem item = new FieldsItem(); + item.setUuid(index) + .setFieldsId(field.getId()) + .setMatnrId(!Objects.isNull(params.get("matnrId")) ? Long.parseLong(params.get("matnrId").toString()) : null) + .setValue(params.get(field.getFields()).toString()); + if (!fieldsItemService.save(item)) { + throw new CoolException("鎵╁睍瀛楁淇敼澶辫触锛侊紒"); + } + } else { + indexItem.setValue(params.get(field.getFields()).toString()); + if (!fieldsItemService.updateById(indexItem)) { + throw new CoolException("鎵╁睍瀛楁淇敼澶辫触锛侊紒"); } } + } } } else { saveFields(params, params.get("index").toString()); @@ -196,12 +199,12 @@ Fields fields = fieldsService.getOne(new LambdaQueryWrapper<Fields>().eq(Fields::getFields, key)); if (!Cools.isEmpty(fields)) { String applySql = String.format( - "EXISTS (SELECT 1 FROM sys_fields_item fie " + - "WHERE %s.fields_index IS NOT NULL " + - "AND fie.uuid = %s.fields_index " + - "AND fie.fields_id = '%s' " + - "AND fie.value = '%s')", - tableName, tableName, fields.getId(), val + "EXISTS (SELECT 1 FROM sys_fields_item fie " + + "WHERE %s.fields_index IS NOT NULL " + + "AND fie.uuid = %s.fields_index " + + "AND fie.fields_id = '%s' " + + "AND fie.value = '%s')", + tableName, tableName, fields.getId(), val ); queryWrapper.apply(applySql); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java index a8abbc7..d0194e9 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java @@ -139,6 +139,12 @@ private Integer status; /** + * 鎵ц鐘舵�� 0锛氭湭鎵ц 1锛氬緟鎵ц 2锛氭墽琛屼腑 3锛氬凡鍙栨秷 + */ + @ApiModelProperty("鎵ц鐘舵��") + private Short exceStatus; + + /** * 鏄惁鍒犻櫎 1: 鏄� 0: 鍚� */ @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄� 0: 鍚� ") diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java index be17fde..b861b6d 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java @@ -71,12 +71,12 @@ * @return * @time 2025/6/16 08:35 */ - @Scheduled(cron = "0/30 * * * * ? ") +// @Scheduled(cron = "0/30 * * * * ? ") @Transactional(rollbackFor = Exception.class) public void outStockComplete() { List<AsnOrder> asnOrders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>() .eq(AsnOrder::getType, OrderType.ORDER_OUT.type) - .apply("anfme=work_qty") + .apply("anfme = work_qty") ); if (asnOrders.isEmpty()) { return; 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 7c10eda..d6660b4 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 @@ -31,6 +31,7 @@ import com.vincent.rsf.server.manager.service.CompanysService; import com.vincent.rsf.server.manager.service.MatnrService; import com.vincent.rsf.server.system.constant.SerialRuleCode; +import com.vincent.rsf.server.system.entity.Fields; import com.vincent.rsf.server.system.service.DictDataService; import com.vincent.rsf.server.system.service.FieldsItemService; import com.vincent.rsf.server.system.service.FieldsService; @@ -243,13 +244,7 @@ try { StringBuffer sb = new StringBuffer(); if (Objects.isNull(asnOrderItem.getFieldsIndex()) || StringUtils.isBlank(asnOrderItem.getFieldsIndex())) { - if (!Objects.isNull(asnOrderItem.getExtendFields()) && !asnOrderItem.getExtendFields().isEmpty()) { - Map<String, String> fields = asnOrderItem.getExtendFields(); - asnOrderItem.getExtendFields().keySet().forEach(key -> { - sb.append(fields.get(key)); - }); - } - sb.append(asnOrderItem.getAsnCode() + asnOrderItem.getMatnrId() + asnOrderItem.getSplrBatch() + asnOrderItem.getIsptResult$()); + sb.append(asnOrderItem.getMatnrId() + asnOrderItem.getSplrBatch() ); //鑾峰彇16浣島uid String uuid16 = Cools.md5Chinese(sb.toString()); asnOrderItem.setFieldsIndex(uuid16); 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 0ed6f59..2ee4ce6 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 @@ -295,10 +295,13 @@ if (!waveService.save(wave)) { throw new CoolException("娉㈡淇濆瓨澶辫触锛侊紒"); } + + + List<Long> list = orders.stream().map(AsnOrder::getId).collect(Collectors.toList()); List<AsnOrderItem> orderItems = asnOrderItemService .list(new LambdaQueryWrapper<AsnOrderItem>() - .in(AsnOrderItem::getAsnId, list)); + .in(AsnOrderItem::getAsnId, list).apply("anfme > work_qty")); if (orderItems.isEmpty()) { throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�"); } @@ -324,7 +327,7 @@ .set(AsnOrder::getWaveId, wave.getId()) .set(AsnOrder::getWorkQty, wkQty) .set(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WAVE.val) - .in(AsnOrder::getId, params.getIds()))) { + .eq(AsnOrder::getId, order.getId()))) { throw new CoolException("鎵ц鐘舵�佷慨鏀逛慨鏀瑰け璐ワ紒锛�"); } } @@ -346,15 +349,12 @@ throw new CoolException("涓诲崟淇℃伅涓嶈兘涓虹┖"); } AsnOrder orders = params.getOrders(); - if (Objects.isNull(orders)) { - throw new CoolException("鍗曟嵁涓嶈兘涓虹┖锛侊紒"); - } if (StringUtils.isBlank(orders.getWkType())) { throw new CoolException("涓氬姟绫诲瀷涓嶈兘涓虹┖锛侊紒"); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, orders); - if (Objects.isNull(ruleCode) || StringUtils.isBlank(ruleCode)) { + if (StringUtils.isBlank(ruleCode)) { throw new CoolException("缂栫爜瑙勫垯閿欒锛氳妫�鏌ャ�孲YS_OUT_STOCK_CODE銆嶆槸鍚﹁缃纭紒锛�"); } orders.setCode(ruleCode) @@ -732,7 +732,7 @@ p1.getUpdateBy(), p1.getMemo() ), - WaveItem::getSplrBatch, WaveItem::getMatnrId, WaveItem::getFieldsIndex + WaveItem::getSplrBatch, WaveItem::getMatnrCode, WaveItem::getFieldsIndex ); return waveItems; -- Gitblit v1.9.1