You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
9.5 KiB
200 lines
9.5 KiB
package com.shkj.wms.outbound;
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.shkj.common.constant.RedisConstant;
|
|
import com.shkj.common.utils.SecurityUtils;
|
|
import com.shkj.system.service.ISysParameterService;
|
|
import com.shkj.wms.bo.BaseBarcodesOutAddBo;
|
|
import com.shkj.wms.bo.BaseBarcodesOutQueryBo;
|
|
import com.shkj.wms.bo.BaseDeriveQueryBo;
|
|
import com.shkj.wms.constants.ParameterConstants;
|
|
import com.shkj.wms.domain.BaseBarcodesOut;
|
|
import com.shkj.wms.domain.BaseDerive;
|
|
import com.shkj.wms.service.*;
|
|
import com.shkj.wms.service.impl.BaseLocationServiceImpl;
|
|
import com.shkj.wms.service.impl.SysStockDetailServiceImpl;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import javax.annotation.Resource;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* @author zjx
|
|
*/
|
|
@Component
|
|
@Slf4j
|
|
public class SchedulingOutboundInfo {
|
|
|
|
|
|
@Autowired
|
|
IBusinBillheadService iBusinBillheadService;
|
|
@Resource
|
|
RedisTemplate redisTemplate;
|
|
@Resource
|
|
IBaseDeriveService iBaseDeriveService;
|
|
@Resource
|
|
IBaseBarcodesOutService iBaseBarcodesOutService;
|
|
@Resource
|
|
SysStockDetailServiceImpl sysStockDetailServiceimpl;
|
|
|
|
@Autowired
|
|
BaseLocationServiceImpl baseLocationService;
|
|
|
|
@Resource
|
|
IBusinDataTaskService businDataTaskService;
|
|
|
|
@Resource
|
|
ISysParameterService isysParameterService;
|
|
|
|
/**
|
|
* 每10分钟执行一次出库任务,具体根据业务定;可以配置在任务管理中
|
|
* 已停用
|
|
* @return
|
|
*/
|
|
// @Scheduled(fixedDelay = 1*10000)
|
|
public void outboundInfoTask(){
|
|
//查询待生成出库单任务的车辆队列
|
|
BaseBarcodesOutQueryBo bo = new BaseBarcodesOutQueryBo();
|
|
String taskMinutes = isysParameterService.selectConfigByKey(SecurityUtils.getCurrentBranchId(), ParameterConstants.ParameterSystem.taskMinutes);
|
|
bo.setTaskMinutes(taskMinutes);
|
|
List<BaseBarcodesOutAddBo> barcodesOutList = iBaseBarcodesOutService.selectVinOutboundList(bo);
|
|
if (ObjectUtils.isNotEmpty(barcodesOutList)) {
|
|
businDataTaskService.insertBusinTask(barcodesOutList);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 手动下发任务
|
|
* @author Comair
|
|
* @date 2023/7/27 10:08
|
|
*/
|
|
@Scheduled(fixedDelay = 1*10000)
|
|
public void outboundInfoTaskByVin(){
|
|
// 判断从 redis 中获取的手动下发任务的开始任务是否有值
|
|
// 有值的话就进行逻辑处理;如果没有就直接跳过
|
|
if(ObjectUtils.isEmpty(redisTemplate.opsForValue().get(RedisConstant.startTaskVin)) && ObjectUtils.isEmpty(redisTemplate.opsForValue().get(RedisConstant.endTaskVin))){
|
|
// log.info("暂未设置生成任务的开始任务");
|
|
return;
|
|
}
|
|
// 将redis 中的值转成字符串
|
|
String startVin = redisTemplate.opsForValue().get(RedisConstant.startTaskVin).toString();
|
|
String endVin = redisTemplate.opsForValue().get(RedisConstant.endTaskVin).toString();
|
|
log.info("出库VIN号:"+startVin+" "+endVin);
|
|
// 初始化生产任务集合
|
|
List<BaseBarcodesOutAddBo> barcodesOutList = new ArrayList<>();
|
|
// 根据vin获取对应的出库任务数据——主要是过点时间
|
|
|
|
BaseBarcodesOut startBarcodesOut = iBaseBarcodesOutService.getOne(
|
|
new LambdaQueryWrapper<BaseBarcodesOut>().eq(BaseBarcodesOut::getVin,startVin)
|
|
.isNull(BaseBarcodesOut::getIs_cancel).last("limit 1"))
|
|
;
|
|
|
|
BaseBarcodesOut endBarcodesOut = iBaseBarcodesOutService.getOne(
|
|
new LambdaQueryWrapper<BaseBarcodesOut>().eq(BaseBarcodesOut::getVin,endVin)
|
|
.isNull(BaseBarcodesOut::getIs_cancel).last("limit 1"))
|
|
;
|
|
|
|
|
|
// 通过两个vin过点时间之间的数据, 只获取手动已下发的数据
|
|
BaseBarcodesOutQueryBo baseBarcodesOutQueryBo = new BaseBarcodesOutQueryBo();
|
|
baseBarcodesOutQueryBo.setTraverseDate(startBarcodesOut.getTraverseDate());
|
|
baseBarcodesOutQueryBo.setEndTraverseDate(endBarcodesOut.getTraverseDate());
|
|
// baseBarcodesOutQueryBo.setColor(startBarcodesOut.getColor());
|
|
// baseBarcodesOutQueryBo.setBumperType(startBarcodesOut.getBumperType());
|
|
// baseBarcodesOutQueryBo.setVehicleCode(startBarcodesOut.getVehicleCode());
|
|
BaseBarcodesOutAddBo barcodesOut = iBaseBarcodesOutService.selectVinOutboundListOne(baseBarcodesOutQueryBo);
|
|
// 判断是否有任务,如果没有任务则返回
|
|
barcodesOutList.add(barcodesOut);
|
|
if (ObjectUtils.isEmpty(barcodesOut)) {
|
|
log.info("暂无任务");
|
|
redisTemplate.delete(RedisConstant.startTaskVin);
|
|
redisTemplate.delete(RedisConstant.endTaskVin);
|
|
return;
|
|
}
|
|
// 获取小组装任务最大等待数
|
|
String temp = isysParameterService.selectConfigByKey(SecurityUtils.getCurrentBranchId(), ParameterConstants.ParameterSystem.waitTaskNumber);
|
|
|
|
int waitTaskNumber = Integer.parseInt(temp);
|
|
// 获取小组装前后杠目前有多少等待数
|
|
|
|
int assemblePointTypeBefore =
|
|
ObjectUtils.isNotEmpty(redisTemplate.opsForValue().get(RedisConstant.assemblePointBeforeTaskCount))
|
|
? Integer.parseInt(redisTemplate.opsForValue().get(RedisConstant.assemblePointBeforeTaskCount).toString()) : 0;
|
|
log.info("获取小组装任务最大等待数:"+waitTaskNumber+" 获取小组装前后杠目前有多少等待数:"+assemblePointTypeBefore);
|
|
//小组装点位为一个
|
|
int assemblePointTypeAfter =
|
|
ObjectUtils.isNotEmpty(redisTemplate.opsForValue().get(RedisConstant.assemblePointAfterTaskCount))
|
|
? Integer.parseInt(redisTemplate.opsForValue().get(RedisConstant.assemblePointAfterTaskCount).toString()) : 0;
|
|
// 判断是否小于最大等待数,如果小于则生成任务,如果不小于就直接返回
|
|
if(assemblePointTypeBefore < waitTaskNumber && assemblePointTypeAfter < waitTaskNumber){
|
|
// if(assemblePointTypeBefore < waitTaskNumber){
|
|
// 判断是否已经设置停止任务的vin;
|
|
// 如果有则判断是否已经执行到该任务;如果执行到该任务就直接删除开始任务vin和停止任务vin,意思就是不在执行生成任务;
|
|
// 如果没执行到该停止任务,这不需要理会
|
|
if(ObjectUtils.isNotEmpty(redisTemplate.opsForValue().get(RedisConstant.endTaskVin))){
|
|
String endTaskVin = redisTemplate.opsForValue().get(RedisConstant.endTaskVin).toString();
|
|
if(ObjectUtils.isNotEmpty(barcodesOut.getVin()) && endTaskVin.equals(barcodesOut.getVin())){
|
|
redisTemplate.delete(RedisConstant.startTaskVin);
|
|
redisTemplate.delete(RedisConstant.endTaskVin);
|
|
}
|
|
}
|
|
businDataTaskService.insertBusinTask(barcodesOutList);
|
|
}else{
|
|
log.info("已经到达组装线最大等待任务数 "+waitTaskNumber);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 出库任务
|
|
*/
|
|
/*
|
|
public void outboundInfo(){
|
|
//获取出库表中待出库的信息
|
|
List<BaseBarcodesOutVo> baseBarcodesOutVoList = iBaseBarcodesOutService.getBarcodesnoOutData();
|
|
//将所有的产品编码聚合
|
|
List<String> goodsno = baseBarcodesOutVoList.stream().map(e -> e.getGoodsNo()).collect(Collectors.toList());
|
|
//拿到所有的货位信息
|
|
List<SysStockDetailVo> SysStockDetailVoList = sysStockDetailServiceimpl.getLocation(goodsno);
|
|
//拿到分体可以在同一任务出库的产品编码和货位信息
|
|
Map<String, List<String>> locationneaten = sysStockDetailServiceimpl.getLocationneaten(SysStockDetailVoList);
|
|
//将所有的货位信息进行聚合
|
|
// List<Long> locationList = SysStockDetailVoList.stream().map(e -> e.getLocationId()).collect(Collectors.toList());
|
|
|
|
for (BaseBarcodesOutVo outVo: baseBarcodesOutVoList) {
|
|
//通过货位拿到巷道信息
|
|
List<BaseLocationVo> tunnelVo = baseLocationService.getTunnel(outVo.getGoodsNo());
|
|
List<String> tunnelall = tunnelVo.stream().map(e -> e.getTunnel()).collect(Collectors.toList());
|
|
//拿到任务数最少的巷道
|
|
String tunnelone=this.quickSort(tunnelall);
|
|
List<BaseLocationVo> tunnelLocation = tunnelVo.stream().filter(e -> e.getTunnel().equals(tunnelone)).collect(Collectors.toList());
|
|
//根据巷道分配货位
|
|
BaseLocationVo baseLocationVo = tunnelLocation.get(0);
|
|
|
|
//修改出库表状态为进行中并添加任务
|
|
BusinDataTask businDataTask = new BusinDataTask();
|
|
//回填任务相关数据
|
|
businDataTask.setBatch(outVo.getBatch());
|
|
businDataTask.setToColumn(String.valueOf(baseLocationVo.getHeight()));
|
|
businDataTask.setToLayer(baseLocationVo.getLocationColumn());
|
|
businDataTask.setToRow(baseLocationVo.getLocationRow());
|
|
//添加巷道任务数和总任务数
|
|
TunnelTaskUtil.getInstance().addOutboundTaskNum(baseLocationVo.getTunnel());
|
|
TunnelTaskUtil.getInstance().getOutboundTaskNum(baseLocationVo.getTunnel());
|
|
iBusinDataTaskService.save(businDataTask);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}*/
|
|
|
|
|
|
}
|
|
|