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.entity.DeviceSite; import com.vincent.rsf.server.manager.entity.Loc; import com.vincent.rsf.server.manager.entity.LocItem; import com.vincent.rsf.server.manager.service.DeviceSiteService; import com.vincent.rsf.server.manager.service.LocItemService; import com.vincent.rsf.server.manager.service.LocService; import com.vincent.rsf.server.manager.enums.LocStsType; import java.util.Comparator; import java.util.List; import java.util.Objects; 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; } }