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(int type) {
|
// 目标库位
|
AgvLocMast locMast = null;
|
// if(Cools.isEmpty(agvWaitPakinList)){
|
// return getLocNoRule(type); // 1. 随机库位
|
// }
|
|
// //库位规则
|
// locMast = getLocByLocRule(agvWaitPakinList.get(0),floor); // 2. 按库位规则搜索
|
// 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(type);
|
if (locMast != null) {
|
return locMast;
|
}
|
|
//找不到库位,抛出异常
|
throw new CoolException("该楼层没有空库位");
|
}
|
|
/*
|
库位规则查找
|
*/
|
private AgvLocMast getLocByLocRule(AgvWaitPakin agvWaitPakin, int floor) {
|
List<AgvLocRule> agvLocRules = null;
|
agvLocRules = agvLocRuleService.selectList(new EntityWrapper<AgvLocRule>()
|
.eq("matnr", agvWaitPakin.getMatnr())
|
.eq("batch", agvWaitPakin.getModel())
|
.eq("floor", floor));
|
if(Cools.isEmpty(agvLocRules)){
|
agvLocRules = agvLocRuleService.selectList(new EntityWrapper<AgvLocRule>()
|
.eq("matnr", agvWaitPakin.getMatnr())
|
.eq("floor", floor));
|
}
|
if(Cools.isEmpty(agvLocRules)){
|
return null;
|
}
|
|
for (AgvLocRule agvLocRule : agvLocRules) {
|
EntityWrapper<AgvLocMast> 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<LocRule> locRules = locRuleService.findCode(agvWaitPakin.getMatnr(), other);
|
if(Cools.isEmpty(locRules)){
|
return null;
|
}
|
|
for (LocRule agvLocRule : locRules) {
|
EntityWrapper<AgvLocMast> 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<AgvLocMast>()
|
.eq("floor",floor)
|
.eq("loc_sts","O")
|
.orderBy("bay1",false));
|
}else{
|
return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
|
.eq("floor",floor)
|
.eq("loc_sts","O")
|
.orderBy("bay1"));
|
}
|
}
|
if(floor == 3){
|
if(fre == 1){
|
return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
|
.eq("floor",floor)
|
.eq("loc_sts","O")
|
.orderBy("row1",false));
|
}else{
|
return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
|
.eq("floor",floor)
|
.eq("loc_sts","O")
|
.orderBy("row1"));
|
}
|
}
|
|
throw new CoolException("搜索库位时,楼层出错。");
|
}
|
|
//随机取一个货位
|
private AgvLocMast getLocNoRule(int type){
|
return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>()
|
.eq("loc_sts","O")
|
.eq("loc_type1",type));
|
}
|
|
|
}
|