package com.zy.common.service; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 货架核心功能 * Created by vincent on 2020/6/11 */ @Slf4j @Service public class AgvCommonService { @Autowired private AgvWrkMastService agvWrkMastService; @Autowired private AgvWrkLastnoService agvWrkLastnoService; @Autowired private AgvLocRuleService agvLocRuleService; @Autowired private AgvLocMastService agvLocMastService; @Autowired private MatService matService; @Autowired private LocRuleService locRuleService; public int getWorkNo(Integer wrkMk) { AgvWrkLastno wrkLastno = agvWrkLastnoService.selectById(wrkMk); if (Cools.isEmpty(wrkLastno)) { throw new CoolException("数据异常,请联系管理员"); } int workNo = 0; // 入出库类型 workNo = wrkLastno.getWrkNo(); int sNo = wrkLastno.getSNo(); int eNo = wrkLastno.getENo(); workNo = workNo>=eNo ? sNo : workNo+1; while (true) { AgvWrkMast wrkMast = agvWrkMastService.selectById(workNo); if (null != wrkMast) { workNo = workNo>=eNo ? sNo : workNo+1; } else { break; } } if (workNo > 0){ wrkLastno.setWrkNo(workNo); agvWrkLastnoService.updateById(wrkLastno); } if (workNo == 0) { throw new CoolException("生成工作号失败,请联系管理员"); } else { if (agvWrkMastService.selectById(workNo)!=null) { throw new CoolException("生成工作号" + workNo + "在工作档中已存在"); } } return workNo; } /** * 检索库位号 * @return locNo 检索到的库位号 */ public AgvLocMast getLocNo(List agvWaitPakinList, int floor) { // 目标库位 AgvLocMast locMast = null; if(Cools.isEmpty(agvWaitPakinList)){ return getLocNoRule(floor); } //库位规则 locMast = getLocByLocRule(agvWaitPakinList.get(0),floor); if(!Cools.isEmpty(locMast)){ return locMast; } //库位编码规则 locMast = getLocByLocCodeRule(agvWaitPakinList.get(0),floor); if(!Cools.isEmpty(locMast)){ return locMast; } // 靠近摆放规则 --- 相同订单号, 同天同规格物料 locMast = getLocByProximityRule(); if (locMast != null) { //找到库位,返回dto //return getLocNoStep6(staDescId, sourceStaNo, locMast);//返回dto } //根据物料频率搜索库位,频率高则搜索离缓存货架最近库位,频率低则搜索最远库位 Mat mat = matService.selectByMatnr(agvWaitPakinList.get(0).getMatnr()); if(Cools.isEmpty(mat.getBeBatch())){ mat.setBeBatch(0); } locMast = getLocByFre(mat.getBeBatch(), floor); if (locMast != null) { return locMast; } // 开始查找库位 ==============================>> locMast = getLocNoRule(floor); if (locMast != null) { return locMast; } //找不到库位,抛出异常 throw new CoolException("该楼层没有空库位"); } /* 库位规则查找 */ private AgvLocMast getLocByLocRule(AgvWaitPakin agvWaitPakin, int floor) { List agvLocRules = null; agvLocRules = agvLocRuleService.selectList(new EntityWrapper() .eq("matnr", agvWaitPakin.getMatnr()) .eq("batch", agvWaitPakin.getModel()) .eq("floor", floor)); if(Cools.isEmpty(agvLocRules)){ agvLocRules = agvLocRuleService.selectList(new EntityWrapper() .eq("matnr", agvWaitPakin.getMatnr()) .eq("floor", floor)); } if(Cools.isEmpty(agvLocRules)){ return null; } for (AgvLocRule agvLocRule : agvLocRules) { EntityWrapper wrapper = new EntityWrapper<>(); wrapper.between("row1",agvLocRule.getRowBeg(),agvLocRule.getRowEnd()) .between("bay1",agvLocRule.getBayBeg(),agvLocRule.getBayEnd()) .between("lev1",agvLocRule.getLevBeg(),agvLocRule.getLevEnd()) .eq("floor",floor) .eq("loc_sts","O"); AgvLocMast agvLocMast = agvLocMastService.selectOne(wrapper); if(!Cools.isEmpty(agvLocMast)){ return agvLocMast; } } return null; } /* 库位规则查找 */ private AgvLocMast getLocByLocCodeRule(AgvWaitPakin agvWaitPakin, int floor) { if(Cools.isEmpty(agvWaitPakin.getBrand())){ return null; } //库区 String other = "agv-" + floor; List locRules = locRuleService.findCode(agvWaitPakin.getMatnr(), other); if(Cools.isEmpty(locRules)){ return null; } for (LocRule agvLocRule : locRules) { EntityWrapper wrapper = new EntityWrapper<>(); wrapper.between("row1",agvLocRule.getRowBeg(),agvLocRule.getRowEnd()) .between("bay1",agvLocRule.getBayBeg(),agvLocRule.getBayEnd()) .between("lev1",agvLocRule.getLevBeg(),agvLocRule.getLevEnd()) .eq("floor",floor) .eq("loc_sts","O"); AgvLocMast agvLocMast = agvLocMastService.selectOne(wrapper); if(!Cools.isEmpty(agvLocMast)){ return agvLocMast; } } return null; } /* 靠近摆放规则 */ private AgvLocMast getLocByProximityRule(){ //to do return null; } /* 根据物料频率查找 */ private AgvLocMast getLocByFre(int fre, int floor){ if(floor == 1){ if(fre == 1){ return agvLocMastService.selectOne(new EntityWrapper() .eq("floor",floor) .eq("loc_sts","O") .orderBy("bay1",false)); }else{ return agvLocMastService.selectOne(new EntityWrapper() .eq("floor",floor) .eq("loc_sts","O") .orderBy("bay1")); } } if(floor == 3){ if(fre == 1){ return agvLocMastService.selectOne(new EntityWrapper() .eq("floor",floor) .eq("loc_sts","O") .orderBy("row1",false)); }else{ return agvLocMastService.selectOne(new EntityWrapper() .eq("floor",floor) .eq("loc_sts","O") .orderBy("row1")); } } throw new CoolException("搜索库位时,楼层出错。"); } //随机取一个货位 private AgvLocMast getLocNoRule(int floor){ return agvLocMastService.selectOne(new EntityWrapper() .eq("floor",floor) .eq("loc_sts","O") .eq(false,"loc_type2",1)); } }