From b0926b3d4379d087d5c0187882b98be0ed88da83 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期一, 28 四月 2025 17:40:44 +0800 Subject: [PATCH] #新增 1. 波次生成出库任务 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java | 1 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java | 6 + rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java | 177 ++++++++++++++++++++++++----- rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java | 19 ++ rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java | 46 +++--- rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java | 3 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java | 7 rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java | 3 rsf-admin/src/i18n/zh.js | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java | 3 rsf-admin/src/i18n/en.js | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java | 28 ++-- 14 files changed, 224 insertions(+), 79 deletions(-) diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index 6207c83..37cd4e3 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -70,7 +70,7 @@ loadMore: 'Load More Data', complete: 'Complete', deprecate: 'Deprecate', - stockError: 'Insuff stock ', + stockError: 'Empty', inputPlaceholder: 'Use commas to separate', resend: 'RESEND', selected: 'selected', diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index 53d905e..8f6d2d3 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -71,7 +71,7 @@ loadMore: '鍔犺浇鏇村', complete: '瀹屾垚', deprecate: '搴熷純', - stockError: '搴撳瓨涓嶈冻', + stockError: '娌℃湁搴撳瓨', resend: '閲嶅彂', selected: '椤归�変腑', batch: '鎵归噺缂栬緫' diff --git a/rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx b/rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx index a0b4d7e..2f81a39 100644 --- a/rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx +++ b/rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx @@ -165,7 +165,7 @@ const notify = useNotify(); const redirect = useRedirect(); const generateTask = async () => { - const res = await request.post(`/wave/public/task`, { wave: dataSource }); + const res = await request.post(`/wave/public/task`, { wave: record, waveItem: dataSource }); if (res?.data?.code === 200) { notify(res.data.msg); redirect("/task") diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java index 5fc1dfc..47c79d8 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java @@ -3,13 +3,13 @@ public enum TaskStsType { //浠诲姟鐘舵�� - GENERATE_IN(1L, "鍒涘缓鍏ュ簱浠诲姟"), - WCS_EXECUTE_IN(2L, "RCS浠诲姟宸蹭笅鍙�"), - WCS_CONTAINER_RECEIVE(3L, "RCS瀹瑰櫒鍒拌揪"), - WCS_CONVEYOR_START(4L, "RCS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙�"), - WCS_TOTE_LOAD(5L, "RCS鍙栫瀹屾垚"), - WCS_TOTE_UNLOAD(6L, "RCS鏀剧瀹屾垚"), - WCS_PUTAWAY_SUCESS(7L, "RCS浠诲姟瀹屾垚"), + GENERATE_IN("1", "鍒涘缓鍏ュ簱浠诲姟"), + WCS_EXECUTE_IN("2", "RCS浠诲姟宸蹭笅鍙�"), + WCS_CONTAINER_RECEIVE("3", "RCS瀹瑰櫒鍒拌揪"), + WCS_CONVEYOR_START("4", "RCS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙�"), + WCS_TOTE_LOAD("5", "RCS鍙栫瀹屾垚"), + WCS_TOTE_UNLOAD("6", "RCS鏀剧瀹屾垚"), + WCS_PUTAWAY_SUCESS("7", "RCS浠诲姟瀹屾垚"), // WCS_PUTAWAY_FAILED(11L, "浠诲姟澶辫触"), // @@ -17,36 +17,36 @@ // // WCS_PUTAWAY_SUSPEND(13L, "鍏ュ簱浠诲姟鎸傝捣"), - COMPLETE_IN(99L, "鍏ュ簱瀹屾垚"), + COMPLETE_IN("99", "鍏ュ簱瀹屾垚"), - UPDATED_IN(100L, "搴撳瓨鏇存柊瀹屾垚"), + UPDATED_IN("100", "搴撳瓨鏇存柊瀹屾垚"), - GENERATE_OUT(101L, "鍒涘缓鍑哄簱浠诲姟"), + GENERATE_OUT("101", "鍒涘缓鍑哄簱浠诲姟"), - WCS_EXECUTE_OUT(102L, "RCS鍑哄簱浠诲姟宸蹭笅鍙�"), + WCS_EXECUTE_OUT("102", "RCS鍑哄簱浠诲姟宸蹭笅鍙�"), - WCS_EXECUTE_OUT_TOTE_LOAD(103L, "RCS鍙栫瀹屾垚"), + WCS_EXECUTE_OUT_TOTE_LOAD("103", "RCS鍙栫瀹屾垚"), - WCS_EXECUTE_OUT_TOTE_UNLOAD(104L, "RCS鏀剧瀹屾垚"), + WCS_EXECUTE_OUT_TOTE_UNLOAD("104", "RCS鏀剧瀹屾垚"), - WCS_EXECUTE_OUT_TASK_DONE(105L, "RCS浠诲姟瀹屾垚"), + WCS_EXECUTE_OUT_TASK_DONE("105", "RCS浠诲姟瀹屾垚"), - WCS_EXECUTE_OUT_ARRIVED(106L, "RCS瀹瑰櫒宸插埌杈�"), + WCS_EXECUTE_OUT_ARRIVED("106", "RCS瀹瑰櫒宸插埌杈�"), - WCS_EXECUTE_OUT_CONVEYOR(107L, "RCS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙�"), + WCS_EXECUTE_OUT_CONVEYOR("107", "RCS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙�"), - GENERATE_WAVE_SEED(197L, "绛夊緟瀹瑰櫒鍒拌揪"), - WAVE_SEED(198L, "鎾涓�"), + GENERATE_WAVE_SEED("197", "绛夊緟瀹瑰櫒鍒拌揪"), + WAVE_SEED("198", "鎾涓�"), - COMPLETE_OUT(199L, "鍑哄簱瀹屾垚"), - UPDATED_OUT(200L, "搴撳瓨鏇存柊瀹屾垚"), + COMPLETE_OUT("199", "鍑哄簱瀹屾垚"), + UPDATED_OUT("200", "搴撳瓨鏇存柊瀹屾垚"), ; - public Long id; + public Short id; public String desc; - TaskStsType(Long id, String desc) { - this.id = id; + TaskStsType(String id, String desc) { + this.id = Short.parseShort(id); this.desc = desc; } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java index 80a8ae0..c5cbfd6 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java @@ -9,23 +9,23 @@ */ public enum TaskType { - TASK_TYPE_IN(1, "鍏ュ簱"), - TASK_TYPE_EMPITY_IN(10, "绌烘澘鍏ュ簱"), - TASK_TYPE_LOC_MOVE(11, "搴撴牸绉昏浇"), - TASK_TYPE_PICK_IN(53, "鎷f枡鍐嶅叆搴�"), - TASK_TYPE_MERGE_IN(54, "骞舵澘鍐嶅叆搴�"), - TASK_TYPE_CHECK_IN(57, "鐩樼偣鍐嶅叆搴�"), - TASK_TYPE_OUT(101, "鍑哄簱"), - TASK_TYPE_PICK_AGAIN_IN(103, "鎷f枡鍏ュ簱"), - TASK_TYPE_MERGE_OUT(104, "骞舵澘鍑哄簱"), - TASK_TYPE_CHECK_OUT(107, "鐩樼偣鍑哄簱"), - TASK_TYPE_EMPITY_OUT(110, "绌烘澘鍑哄簱"), + TASK_TYPE_IN("1", "鍏ュ簱"), + TASK_TYPE_EMPITY_IN("10", "绌烘澘鍏ュ簱"), + TASK_TYPE_LOC_MOVE("11", "搴撴牸绉昏浇"), + TASK_TYPE_PICK_IN("53", "鎷f枡鍐嶅叆搴�"), + TASK_TYPE_MERGE_IN("54", "骞舵澘鍐嶅叆搴�"), + TASK_TYPE_CHECK_IN("57", "鐩樼偣鍐嶅叆搴�"), + TASK_TYPE_OUT("101", "鍑哄簱"), + TASK_TYPE_PICK_AGAIN_IN("103", "鎷f枡鍏ュ簱"), + TASK_TYPE_MERGE_OUT("104", "骞舵澘鍑哄簱"), + TASK_TYPE_CHECK_OUT("107", "鐩樼偣鍑哄簱"), + TASK_TYPE_EMPITY_OUT("110", "绌烘澘鍑哄簱"), ; - public Integer type; + public Short type; public String desc; - TaskType(Integer type, String desc) { - this.type = type; + TaskType(String type, String desc) { + this.type = Short.parseShort(type); this.desc = desc; } } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java index a14c907..d21aa52 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java @@ -118,14 +118,14 @@ if (Cools.isEmpty(map) || Cools.isEmpty(map.get("wave"))) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); } - return waveService.publicTask(map); + return waveService.publicTask(map, getLoginUserId()); } @PreAuthorize("hasAuthority('manager:wave:list')") @ApiOperation("娉㈡鍑哄簱浠诲姟棰勮") @PostMapping("/wave/locs/preview/page") public R mergeWavePreview(@RequestBody Map<String, Object> map) { - if (Cools.isEmpty(map.get("wave")) || StringUtils.isBlank(map.get("wave").toString())) { + if (Cools.isEmpty(map.get("waveId")) || StringUtils.isBlank(map.get("waveId").toString())) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); } Long waveId = Long.parseLong(map.get("waveId").toString()); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java index 1017e0e..54348e0 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java @@ -91,6 +91,9 @@ @ApiModelProperty(value= "鐗╂祦鍗曞彿") private String logisNo; + @ApiModelProperty("娉㈡ID") + private Long waveId; + /** * 棰勮鍒拌揪鏃堕棿 */ diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java index 6382e57..2a7897e 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java @@ -1,6 +1,7 @@ package com.vincent.rsf.server.manager.entity; -import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.*; + import java.text.SimpleDateFormat; import java.util.Date; @@ -9,10 +10,7 @@ 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; @@ -106,8 +104,10 @@ @ApiModelProperty(value= "鏁伴噺") private Double anfme; + @ApiModelProperty("鎵ц鏁伴噺") private Double workQty; + @ApiModelProperty("瀹屾垚鏁伴噺") private Double qty; @@ -187,6 +187,17 @@ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateTime; + @TableField(exist = false) + private Long waveId; + + @TableField(exist = false) + private Long waveItemId; + + @TableField(exist = false) + private String waveCode; + + + /** * 澶囨敞 */ diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java index 5424d53..2bb3cf0 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java @@ -77,6 +77,9 @@ */ @ApiModelProperty("鐗╂枡璺熻釜鐮�") private String trackCode; + + @ApiModelProperty("渚涘簲鍟嗘尝娆�") + private String splrBatch; /** * 鐗╂枡缂栫爜 */ diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java index 1490cc7..78f965a 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java @@ -70,6 +70,9 @@ @ApiModelProperty(value= "宸插畬鎴愭暟閲�") private Double qty; + @ApiModelProperty("鐩爣浣嶇疆") + private String targSite; + /** * 鍗曟嵁鏁伴噺 */ 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 619bc5f..a83f7e7 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 @@ -184,6 +184,12 @@ @TableField(exist = false) private Double stockQty; + + /*** + * 鏄惁鍏ㄦ嫋鍑哄簱 + */ + @TableField(exist = false) + private Short flagAll; /** * 澶囨敞 */ diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java index e6648c9..c9cc4f7 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java @@ -11,13 +11,14 @@ public interface WaveService extends IService<Wave> { /** + * @param + * @param loginUserId + * @return * @author Ryan * @description 娉㈡浠诲姟涓嬪彂 - * @param - * @return * @time 2025/4/25 16:24 */ - R publicTask(Map<String, Object> map); + R publicTask(Map<String, Object> map, Long loginUserId); /** * @author Ryan 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 b08055a..ded80e7 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 @@ -291,6 +291,7 @@ } if (!this.update(new LambdaUpdateWrapper<AsnOrder>() + .set(AsnOrder::getWaveId, wave.getId()) .set(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WAVE.val) .in(AsnOrder::getId, ids))) { throw new CoolException("鎵ц鐘舵�佷慨鏀逛慨鏀瑰け璐ワ紒锛�"); diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java index 96355b3..f070e5f 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java @@ -6,16 +6,17 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; -import com.vincent.rsf.server.manager.entity.AsnOrder; -import com.vincent.rsf.server.manager.entity.LocItem; -import com.vincent.rsf.server.manager.entity.WaveItem; +import com.vincent.rsf.server.api.entity.enums.TaskStsType; +import com.vincent.rsf.server.api.entity.enums.TaskType; +import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.enums.AsnExceStatus; import com.vincent.rsf.server.manager.enums.WaveExceStatus; import com.vincent.rsf.server.manager.mapper.WaveMapper; -import com.vincent.rsf.server.manager.entity.Wave; import com.vincent.rsf.server.manager.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.manager.utils.OptimalAlgorithmUtil; +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.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -24,7 +25,6 @@ import java.util.*; import java.util.stream.Collectors; -import java.util.stream.IntStream; @Service("waveService") public class WaveServiceImpl extends ServiceImpl<WaveMapper, Wave> implements WaveService { @@ -41,9 +41,12 @@ private TaskItemService taskItemService; @Autowired private LocItemService locItemService; + @Autowired + private LocService locService; /** * @param + * @param loginUserId * @return * @author Ryan * @description 娉㈡浠诲姟涓嬪彂 @@ -51,25 +54,24 @@ */ @Override @Transactional(rollbackFor = Exception.class) - public R publicTask(Map<String, Object> map) { - List<WaveItem> itemParams = (List<WaveItem>) map.get("wave"); + public R publicTask(Map<String, Object> map, Long loginUserId) { + List<WaveItem> itemParams = (List<WaveItem>) map.get("waveItem"); if (Objects.isNull(itemParams) || itemParams.isEmpty()) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); } - List<Long> ids = itemParams.stream().map(WaveItem::getWaveId).collect(Collectors.toList()); - List<Wave> waves = this.list(new LambdaQueryWrapper<Wave>().in(Wave::getId, ids)); - if (Objects.isNull(waves) || waves.isEmpty()) { + Wave wave = (Wave) map.get("wave"); + Wave waves = this.getById(new LambdaQueryWrapper<Wave>().in(Wave::getId, wave.getId())); + if (Objects.isNull(waves)) { throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦紒锛�"); } - List<Long> list = waves.stream().map(Wave::getId).collect(Collectors.toList()); + List<Long> list = itemParams.stream().map(WaveItem::getWaveId).collect(Collectors.toList()); List<WaveItem> waveItems = waveItemService.list(new LambdaQueryWrapper<WaveItem>().in(WaveItem::getWaveId, list)); if (waveItems.isEmpty()) { throw new CoolException("娉㈡鏄庣粏涓嶅瓨鍦紒锛�"); } - List<Long> orderIds = waveItems.stream().map(WaveItem::getOrderId).collect(Collectors.toList()); - /**鏌ヨ姣忔潯鏄庣粏鍖归厤鐨勫簱浣�*/ + /**鐢熸垚鍑哄簱浠诲姟*/ try { -// List<WaveItem> items = getLocs(waveItems); + generateOutTask(itemParams, loginUserId, wave); } catch (Exception e) { throw new CoolException("搴撲綅鑾峰彇澶辫触锛侊紒锛�"); } @@ -77,17 +79,130 @@ // 2. 鏍规嵁鐗╂枡SKU瀵绘壘绗﹀悎鐗╂枡搴撲綅 {1. 鏍规嵁鐗╂枡缂栫爜锛屾壒娆★紝鍔ㄦ�佸瓧娈� 鏌ヨ绗﹀悎鐨勫簱浣嶏紝鍐嶆牴鎹簱浣嶄腑鐗╂枡鐨勬暟閲忛�夋嫨鏈�閫傚悎鐨勫簱浣� 2. 鍒ゆ柇褰撳墠璁㈠崟鏄叏鎷栧嚭搴撹繕鏄嫞鏂欏叆搴搣 // 3. 淇敼涓诲崟銆佹尝娆℃墽琛屾暟閲� // 4. 鍒ゆ柇鍏ㄤ粨鍑哄簱鎴栨嫞鏂欏嚭搴� -// List<AsnOrder> orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, orderIds)); -// /**淇敼鍘熷嚭搴撳崟鐘舵��*/ -// if (!asnOrderService.update(new LambdaQueryWrapper<AsnOrder>() -// .eq(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WORKING.val) -// .in(AsnOrder::getId, orders))) { -// throw new CoolException("鍑哄簱鍗曟嵁鐘舵�佷慨鏀瑰け璐ワ紒锛�"); -// } -// if (!this.update(new LambdaUpdateWrapper<Wave>().set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK).in(Wave::getId, ids))) { -// throw new CoolException("娉㈡鐘舵�佷慨鏀瑰け璐ワ紒锛�"); -// } + List<Long> orderIds = waveItems.stream().map(WaveItem::getOrderId).collect(Collectors.toList()); + + List<AsnOrder> orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, orderIds)); + /**淇敼鍑哄簱鍗曠姸鎬�*/ + if (!asnOrderService.update(new LambdaQueryWrapper<AsnOrder>() + .eq(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WORKING.val) + .in(AsnOrder::getId, orders))) { + throw new CoolException("鍑哄簱鍗曟嵁鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + /**淇敼娉㈡鍗曟嵁鎵ц鐘舵��*/ + if (!this.update(new LambdaUpdateWrapper<Wave>().set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK).eq(Wave::getId, wave.getId()))) { + throw new CoolException("娉㈡鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } return R.ok(); + } + + /** + * @param + * @param loginUserId + * @param wave + * @return + * @author Ryan + * @description 鐢熸垚鍑哄簱浠诲姟 + * @time 2025/4/28 14:01 + */ + @Transactional(rollbackFor = Exception.class) + private synchronized void generateOutTask(List<WaveItem> itemParams, Long loginUserId, Wave wave) throws Exception { + List<LocItem> locItemList = new ArrayList<>(); + for (WaveItem param : itemParams) { + String locs = param.getStockLocs(); + List<LocItem> locItems = JSONArray.parseArray(locs, LocItem.class); + if (locItems.isEmpty()) { + continue; + } + List<Long> list = locItems.stream().map(LocItem::getId).collect(Collectors.toList()); + /**鏍规嵁渚涘簲鍟嗘壒娆★紝鐗╂枡鐮侊紝 鍔ㄦ�佸瓧娈垫煡璇㈡寚瀹氱殑鐗╂枡搴撳瓨淇℃伅*/ + List<LocItem> items = locItemService.list(new LambdaQueryWrapper<LocItem>() + .eq(LocItem::getSplrBatch, param.getSplrBatch()) + .in(LocItem::getLocId, list) + .eq(StringUtils.isNotBlank(param.getFieldsIndex()), LocItem::getFieldsIndex, param.getFieldsIndex()) + .eq(LocItem::getMatnrCode, param.getMatnrCode())); + if (items.isEmpty()) { + throw new CoolException("搴撳瓨淇℃伅鏈夊彉锛岃鍙栨秷褰撳墠娉㈡锛岀敓鏂扮敓鎴愭柊鐨勬尝娆★紒锛�"); + } + /***灏嗘湁璐ф湁鐨勬槑缁嗕俊鎭瓨鏀惧埌搴撲綅淇℃伅涓�*/ + for (int i = 0; i < items.size(); i++) { + items.get(i) + .setWaveId(param.getWaveId()) + .setWaveCode(param.getWaveCode()) + .setWaveItemId(param.getId()); + } + locItemList.addAll(items); + } + if (locItemList.isEmpty()) { + throw new CoolException("娌℃湁鍚堥�傚簱浣嶏紒锛�"); + } + + /**鎷嗗垎娉㈡鏄庣粏搴撲綅闆嗭紝鍚堝苟鐩稿悓搴撲綅锛屽垎瑙d换鍔℃槑缁�*/ + Map<Long, List<LocItem>> listMap = locItemList.stream().collect(Collectors.groupingBy(LocItem::getLocId)); + /**鏍规嵁搴撲綅姹囨�讳俊鎭紝鐢熸垚浠诲姟鏄庣粏**/ + listMap.keySet().forEach(key -> { + List<LocItem> locItems = listMap.get(key); + LocItem item1 = locItems.stream().findFirst().get(); + WaveItem waveItem = waveItemService.getById(item1.getWaveItemId()); + if (null == waveItem || Objects.isNull(waveItem)) { + throw new CoolException("鏁版嵁閿欒锛氭尝娆℃槑缁嗕笉瀛樺湪锛侊紒"); + } + //TODO 褰撳墠浠诲姟瀹屾垚鍚庯紝閫氳繃瀹氭椂浜嬩欢鍒ゆ柇鏄叏鐩樺嚭搴擄紝杩樻槸鎷f枡鍐嶅叆搴� + Loc loc = locService.getById(key); + Task task = new Task(); + String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null); + if (StringUtils.isBlank(ruleCode)) { + throw new CoolException("缂栫爜瑙勫垯閿欒锛氳妫�鏌ャ�孲YS_TASK_CODE銆嶆槸鍚﹁缃畬鎴愶紒锛�"); + } + if (Objects.isNull(loc)) { + throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�"); + } + task.setTaskCode(ruleCode) + .setTaskType(TaskType.TASK_TYPE_OUT.type) + .setTaskStatus(TaskStsType.GENERATE_OUT.id) + .setBarcode(loc.getBarcode()) + .setOrgLoc(loc.getCode()) + .setCreateBy(loginUserId) + .setUpdateBy(loginUserId) + .setTargSite(wave.getTargSite()); + + if (!taskService.save(task)) { + throw new CoolException("浠诲姟鐢熸垚澶辫触锛侊紒"); + } + List<TaskItem> taskItems = new ArrayList<>(); + /**鐢熸垚浠诲姟鏄庣粏淇℃伅*/ + for (LocItem item : locItems) { + TaskItem taskItem = new TaskItem(); + BeanUtils.copyProperties(item, taskItem); + taskItem.setTaskId(task.getId()) + .setId(null) + .setSource(item.getWaveItemId()); + taskItems.add(taskItem); + } + if (!taskItemService.saveBatch(taskItems)) { + throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒"); + } + + /**淇敼娉㈡鎵ц鏁伴噺*/ + taskItems.forEach(item -> { + boolean update = waveItemService.update(new LambdaUpdateWrapper<WaveItem>() + .eq(WaveItem::getWaveId, item.getSource()) + .set(WaveItem::getWorkQty, item.getAnfme())); + if (!update) { + throw new CoolException("娉㈡鎵ц鏁伴噺淇敼澶辫触锛侊紒"); + } + }); + + List<WaveItem> waveItems = waveItemService.list(new LambdaQueryWrapper<WaveItem>().eq(WaveItem::getWaveId, wave.getId())); + double sum = waveItems.stream().mapToDouble(WaveItem::getWorkQty).sum(); + /**娉㈡涓诲崟淇℃伅淇敼*/ + if (!update(new LambdaUpdateWrapper<Wave>() + .eq(Wave::getId, wave.getId()) + .set(Wave::getWorkQty, sum) + .set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK.val))) { + throw new CoolException("娉㈡涓诲崟淇℃伅淇敼澶辫触锛侊紒"); + } + + }); } /** @@ -129,7 +244,7 @@ //TODO 鏍规嵁鐗╂枡缂栫爜锛屾壒娆★紝鍔ㄦ�佸瓧娈� 鏌ヨ绗﹀悎鐨勫簱浣嶏紝鍐嶆牴鎹簱浣嶄腑鐗╂枡鐨勬暟閲忛�夋嫨鏈�閫傚悎鐨勫簱浣� waveItems.forEach(waveItem -> { List<LocItem> locItems = locItemService.list(new QueryWrapper<LocItem>() - .select("id", "loc_id", "loc_code", "order_id", "SUM(anfme) anfme", "SUM(work_qty) work_qty", "splr_batch", "fields_index", "matnr_code") + .select("id", "loc_id", "loc_code", "order_id", "SUM(anfme) anfme", "SUM(qty) qty", "SUM(work_qty) work_qty", "splr_batch", "fields_index", "matnr_code") .lambda() .eq(LocItem::getMatnrCode, waveItem.getMatnrCode()) .eq(LocItem::getSplrBatch, waveItem.getSplrBatch()) @@ -140,19 +255,21 @@ /**浣跨敤鍥炴函绠楁硶璁$畻锛岃幏鍙栫鍚堝嚭搴撻噺鐨勬渶绠�缁勫悎*/ List<Integer> result = OptimalAlgorithmUtil.findCombination(doubles, waveItem.getAnfme()); + String locs = "[]"; - if (Objects.isNull(result)) { + if (Objects.isNull(result) || result.isEmpty()) { waveItem.setStockLocs(locs).setStockQty(0.0); } else { /**杩囨护闆嗗悎涓渶绠�鐭殑缁勫悎*/ List<LocItem> locsInfo = result.stream() .filter(i -> i >= 0 && i < locItems.size()) .map(locItems::get).collect(Collectors.toList()); + locs = JSONArray.toJSONString(locsInfo); - double sumQty = locItems.stream().mapToDouble(LocItem::getAnfme).sum(); - double surQty = locItems.stream().mapToDouble(LocItem::getWorkQty).sum(); - double qty = locItems.stream().mapToDouble(LocItem::getQty).sum(); - double v = sumQty - surQty - qty; + Double sumQty = locsInfo.stream().mapToDouble(LocItem::getAnfme).sum(); + Double surQty = locsInfo.stream().mapToDouble(LocItem::getWorkQty).sum(); + Double qty = locsInfo.stream().mapToDouble(LocItem::getQty).sum(); + Double v = sumQty - surQty - qty; waveItem.setStockLocs(locs).setStockQty(v); } }); -- Gitblit v1.9.1