package com.vincent.rsf.server.manager.utils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.SpringUtils; 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 javax.swing.*; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; public class LocManageUtil { /** * @author Ryan * @description 获取目标库位, 包含库位获取策略 * @param * @return * @time 2025/3/31 08:50 */ public static String getTargetLoc(Long areaId) { //TODO 库位策略后续排期 LocService locService = SpringUtils.getBean(LocService.class); Loc loc = locService.getOne(new LambdaQueryWrapper() .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; } /** * @author Ryan * @description 获取目标站点 * @param * @return * @time 2025/3/31 09:49 */ public static String getTargetSite() { //TODO 站点策略后续排期 DeviceSiteService deviceSite = SpringUtils.getBean(DeviceSiteService.class); DeviceSite loc = deviceSite.getOne(new LambdaQueryWrapper().eq(DeviceSite::getStatus, 1), false); return !Objects.isNull(loc) ? loc.getSite() : null; } /** * 出库策略:--〈效率优化〉 * @param matnrCode * @param splrBatch * @param anfme * @return */ public static List getEfficiencyFirstItemList(String matnrCode, String splrBatch, Double anfme) { LambdaQueryWrapper 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 locItems = locItemService.list(locItemQueryWrapper); locItems.sort(Comparator.comparing((LocItem item) -> !LocUtils.isShallowLoc(item.getLocCode()))); List 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 getFirstInFirstOutItemList(String matnrCode, String splrBatch, Double anfme) { LambdaQueryWrapper 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 locItems = locItemService.list(locItemQueryWrapper); return locItems; } /** * 获取出库库位信息 * @param params * @param waveRule * @return */ public static List getOutOrderList(List params, WaveRule waveRule) { LocService locService = SpringUtils.getBean(LocService.class); LocItemService locItemService = SpringUtils.getBean(LocItemService.class); DeviceSiteService deviceSiteService = SpringUtils.getBean(DeviceSiteService.class); List list = new ArrayList<>(); Set 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 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 itemList = locItemService.list(new LambdaQueryWrapper().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 deviceSites = deviceSiteService.list(new LambdaQueryWrapper() .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 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; } }