From cd8e369a7b3b751527090147798c5b81c30bf2d0 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期四, 26 六月 2025 09:06:55 +0800 Subject: [PATCH] 生成任务工作档优化 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java | 182 ++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 170 insertions(+), 12 deletions(-) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java index 4312407..7e69732 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java @@ -2,15 +2,20 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.SpringUtils; -import com.vincent.rsf.framework.exception.CoolException; -import com.vincent.rsf.server.manager.entity.DeviceSite; -import com.vincent.rsf.server.manager.entity.Loc; -import com.vincent.rsf.server.manager.service.DeviceSiteService; -import com.vincent.rsf.server.manager.service.LocService; -import com.vincent.rsf.server.system.enums.LocStsType; -import org.apache.commons.lang3.StringUtils; +import com.vincent.rsf.server.api.utils.LocUtils; +import com.vincent.rsf.server.manager.controller.dto.ExistDto; +import com.vincent.rsf.server.manager.controller.dto.OrderOutItemDto; +import com.vincent.rsf.server.manager.controller.params.WaveToLocParams; +import com.vincent.rsf.server.manager.entity.*; +import com.vincent.rsf.server.manager.enums.TaskType; +import com.vincent.rsf.server.manager.enums.WaveRuleType; +import com.vincent.rsf.server.manager.service.*; +import com.vincent.rsf.server.manager.enums.LocStsType; -import java.util.Objects; +import javax.swing.*; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; public class LocManageUtil { @@ -21,13 +26,19 @@ * @return * @time 2025/3/31 08:50 */ - public static String getTargetLoc() { + public static String getTargetLoc(Long areaId) { //TODO 搴撲綅绛栫暐鍚庣画鎺掓湡 LocService locService = SpringUtils.getBean(LocService.class); - Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type), false); + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>() + .eq(Loc::getAreaId, areaId) + .orderByAsc(Loc::getLev) + .orderByAsc(Loc::getCol) + .orderByAsc(Loc::getRow) + .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type), false + ); - return Objects.isNull(loc) ? loc.getCode() : null; + return !Objects.isNull(loc) ? loc.getCode() : null; } @@ -42,6 +53,153 @@ //TODO 绔欑偣绛栫暐鍚庣画鎺掓湡 DeviceSiteService deviceSite = SpringUtils.getBean(DeviceSiteService.class); DeviceSite loc = deviceSite.getOne(new LambdaQueryWrapper<DeviceSite>().eq(DeviceSite::getStatus, 1), false); - return Objects.isNull(loc) ? loc.getSite() : null; + return !Objects.isNull(loc) ? loc.getSite() : null; } + + /** + * 鍑哄簱绛栫暐锛�--銆堟晥鐜囦紭鍖栥�� + * @param matnrCode + * @param splrBatch + * @param anfme + * @return + */ + public static List<LocItem> getEfficiencyFirstItemList(String matnrCode, String splrBatch, Double anfme) { + LambdaQueryWrapper<LocItem> locItemQueryWrapper = new LambdaQueryWrapper<>(); + locItemQueryWrapper.eq(LocItem::getMatnrCode, matnrCode); + locItemQueryWrapper.eq(LocItem::getBatch, splrBatch); + String applySql = String.format( + "EXISTS (SELECT 1 FROM man_loc ml " + + "WHERE ml.use_status = '%s'" + + "AND ml.id = man_loc_item.loc_id " + + ")", + LocStsType.LOC_STS_TYPE_F.type + ); + locItemQueryWrapper.apply(applySql); + LocItemService locItemService = SpringUtils.getBean(LocItemService.class); + List<LocItem> locItems = locItemService.list(locItemQueryWrapper); + locItems.sort(Comparator.comparing((LocItem item) -> !LocUtils.isShallowLoc(item.getLocCode()))); + List<LocItem> locsSet = locItems.stream().filter(locItem -> locItem.getAnfme().compareTo(anfme) == 0.0).collect(Collectors.toList()); + if (!locsSet.isEmpty()) { + return locsSet; + } + return locItems; + } + + + /** + * 鍑哄簱绛栫暐锛�--<鍏堣繘鍏堝嚭> + * @param matnrCode + * @param splrBatch + * @param anfme + * @return + */ + public static List<LocItem> getFirstInFirstOutItemList(String matnrCode, String splrBatch, Double anfme) { + LambdaQueryWrapper<LocItem> locItemQueryWrapper = new LambdaQueryWrapper<>(); + locItemQueryWrapper.eq(LocItem::getMatnrCode, matnrCode); + locItemQueryWrapper.eq(LocItem::getBatch, splrBatch); + locItemQueryWrapper.orderByAsc(LocItem::getCreateTime); + String applySql = String.format( + "EXISTS (SELECT 1 FROM man_loc ml " + + "WHERE ml.use_status = '%s'" + + "AND ml.id = man_loc_item.loc_id " + + ")", + LocStsType.LOC_STS_TYPE_F.type + ); + locItemQueryWrapper.apply(applySql); + LocItemService locItemService = SpringUtils.getBean(LocItemService.class); + List<LocItem> locItems = locItemService.list(locItemQueryWrapper); + return locItems; + } + + /** + * 鑾峰彇鍑哄簱搴撲綅淇℃伅 + * @param params + * @param waveRule + * @return + */ + public static List<OrderOutItemDto> getOutOrderList(List<WaveToLocParams> params, WaveRule waveRule) { + LocService locService = SpringUtils.getBean(LocService.class); + LocItemService locItemService = SpringUtils.getBean(LocItemService.class); + DeviceSiteService deviceSiteService = SpringUtils.getBean(DeviceSiteService.class); + + List<OrderOutItemDto> list = new ArrayList<>(); + Set<ExistDto> existDtos = new HashSet<>(); + for (WaveToLocParams item : params) { + BigDecimal issued = new BigDecimal(item.getAnfme().toString()) + .subtract(new BigDecimal(item.getWorkQty().toString())); + if (issued.doubleValue() <= 0) { + continue; + } + List<LocItem> locItems; + if (Objects.isNull(waveRule)) { + locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme()); + } else { + if (WaveRuleType.Efficiency_First.type.equals(waveRule.getType())) { + locItems = LocManageUtil.getEfficiencyFirstItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme()); + } else if (WaveRuleType.First_In_First_Out.type.equals(waveRule.getType())) { + locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme()); + } else { + locItems = LocManageUtil.getFirstInFirstOutItemList(item.getMatnrCode(), item.getBatch(), item.getAnfme()); + } + } + + for (LocItem locItem : locItems) { + Loc loc = locService.getById(locItem.getLocId()); + List<LocItem> itemList = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocCode, locItem.getLocCode())); + if (issued.doubleValue() > 0) { + ExistDto existDto = new ExistDto().setBatch(locItem.getBatch()).setMatnr(locItem.getMatnrCode()).setLocNo(locItem.getLocCode()); + if (existDtos.add(existDto)) { + locItem.setOutQty(issued.doubleValue() >= locItem.getAnfme() ? locItem.getAnfme() : issued.doubleValue()); + locItem.setBarcode(loc.getBarcode()) + .setSourceId(item.getWaveId()) + .setSource(item.getItemId()); + OrderOutItemDto orderOutItemDto = new OrderOutItemDto(); + orderOutItemDto.setLocItem(locItem); + + List<DeviceSite> deviceSites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>() + .eq(DeviceSite::getChannel, loc.getChannel()) + .eq(DeviceSite::getType, issued.doubleValue() >= locItem.getAnfme() && itemList.size() == 1 ? TaskType.TASK_TYPE_OUT.type : TaskType.TASK_TYPE_PICK_AGAIN_OUT.type) + ); + + if (!deviceSites.isEmpty()) { + List<OrderOutItemDto.staListDto> maps = new ArrayList<>(); + for (DeviceSite sta : deviceSites) { + OrderOutItemDto.staListDto staListDto = new OrderOutItemDto.staListDto(); + staListDto.setStaNo(sta.getSite()); + staListDto.setStaName(sta.getSite()); + maps.add(staListDto); + } + orderOutItemDto.setStaNos(maps); + //榛樿鑾峰彇绗竴绔欑偣 + DeviceSite deviceSite = deviceSites.stream().findFirst().get(); + orderOutItemDto.setSiteNo(deviceSite.getSite()); + } + + orderOutItemDto.setSource(item.getItemId()).setSourceId(item.getWaveId()); + + list.add(orderOutItemDto); + + issued = issued.subtract(new BigDecimal(locItem.getAnfme().toString())); + } + } + } +// if (issued.doubleValue() > 0) { +// LocItem locItem = new LocItem() +// .setId(new Random().nextLong()) +// .setMatnrCode(item.getMatnrCode()) +// .setMaktx(item.getMaktx()) +// .setAnfme(0.00) +// .setWorkQty(issued.doubleValue()) +// .setOutQty(issued.doubleValue()) +// .setUnit(item.getUnit()) +// .setBatch(item.getBatch()); +// OrderOutItemDto orderOutItemDto = new OrderOutItemDto(); +// orderOutItemDto.setLocItem(locItem); +// list.add(orderOutItemDto); +// } + } + + return list; + } + } -- Gitblit v1.9.1