package com.zy.asrs.task.handler;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
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 com.zy.asrs.utils.Utils;
|
import com.zy.common.model.StartupDto;
|
import com.zy.common.service.CommonService;
|
import com.zy.common.utils.HttpHandler;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.concurrent.ThreadLocalRandom;
|
|
@Component
|
@Slf4j
|
public class CreateOutTask {
|
@Value("${wcs.address.URL}")
|
private String addrs;
|
@Value("${wcs.address.createOutTask}")
|
private String outTask;
|
@Value("${wcs.address.createLocMoveTask}")
|
private String locMoveTask;
|
@Value("${wcs.address.devicesStatus}")
|
private String devicesStatus;
|
@Autowired
|
private LocMastService locMastService;
|
@Autowired
|
private LocDetlService locDetlService;
|
@Autowired
|
private WrkMastService wrkMastService;
|
@Autowired
|
private CommonService commonService;
|
@Autowired
|
private WrkDetlService wrkDetlService;
|
|
@Scheduled(cron = "0/10 * * * * ? ")
|
@Transactional
|
public void outTask(){
|
//调用wcs接口获取设备状态
|
String statusResponse = "";
|
try {
|
statusResponse = new HttpHandler.Builder()
|
.setUri(addrs)
|
.setPath(devicesStatus)
|
.build()
|
.doPost();
|
JSONObject jsonObject = JSON.parseObject(statusResponse);
|
if (jsonObject.get("code").equals(200)){
|
log.info("设备正常");
|
}
|
}catch (Exception e){
|
log.error("设备异常");
|
}
|
log.info("开始调用WCS接口,派发出库/移库任务");
|
Date now = new Date();
|
boolean flag= false;
|
List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "F"));
|
List<Integer> outSitelist = new ArrayList<>();
|
outSitelist.add(1152);
|
outSitelist.add(1169);
|
outSitelist.add(1177);
|
LocMast shallowLocMast = new LocMast();
|
for (LocMast locMast : locMasts) {
|
//判断库位是否有出库任务
|
if (!Cools.isEmpty(wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("source_loc_no",locMast.getLocNo())))){
|
continue;
|
}
|
//判断是否是深库位 触发移库任务
|
if (Utils.isDeepLoc(locMast.getLocNo())) {
|
String deepLoc = locMast.getLocNo();
|
String shallowLocNo = Utils.getShallowLocNo(deepLoc);
|
shallowLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", shallowLocNo));
|
if (shallowLocMast.getLocSts().equals("F") || shallowLocMast.getLocSts().equals("D")) {
|
flag = true;
|
}
|
}
|
int outSite = ThreadLocalRandom.current().nextInt(0, outSitelist.size());
|
List<LocDetl> locDetlList = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
|
// 目标站点状态检测
|
int workNo = commonService.getWorkNo(2);
|
//生成工作档
|
WrkMast wrkMast = new WrkMast();
|
wrkMast.setWrkNo(workNo);
|
wrkMast.setIoTime(now);
|
wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
|
wrkMast.setIoType(flag ? 11 : 101); // 入出库状态
|
wrkMast.setIoPri(flag ? 20D : 15D); // 优先级
|
wrkMast.setCrnNo(locMast.getCrnNo());
|
wrkMast.setStaNo(outSitelist.get(outSite)); // 目标站
|
wrkMast.setSourceLocNo(flag ? shallowLocMast.getLocNo() : locMast.getLocNo()); // 源库位
|
wrkMast.setLocNo(flag ? getMoveLocNo(locMast.getLocNo()) : ""); //目标库位
|
wrkMast.setFullPlt("Y"); // 满板:Y
|
wrkMast.setPicking("N"); // 拣料
|
wrkMast.setExitMk("N"); // 退出
|
wrkMast.setEmptyMk("N"); // 空板
|
wrkMast.setLinkMis("N");
|
wrkMast.setBarcode(locMast.getBarcode());
|
wrkMast.setAppeUser(9527L); // 操作人员数据
|
wrkMast.setAppeTime(now);
|
wrkMast.setModiUser(9527l);
|
wrkMast.setModiTime(now);
|
if (!wrkMastService.insert(wrkMast)) {
|
throw new CoolException("保存工作档失败,出库库位号:" + locMast.getLocNo());
|
}
|
// 生成工作档明细
|
for (LocDetl locDetl : locDetlList) {
|
if (locDetl.getAnfme() == null || locDetl.getAnfme() <= 0.0D) {
|
continue;
|
}
|
WrkDetl wrkDetl = new WrkDetl();
|
wrkDetl.sync(locDetl);
|
wrkDetl.setOrderNo(""); // 手动出库不需要带出库存中的单据编号
|
wrkDetl.setWrkNo(workNo);
|
wrkDetl.setIoTime(now);
|
Double anfme = locDetl.getAnfme();
|
wrkDetl.setAnfme(anfme); // 数量
|
wrkDetl.setAppeTime(now);
|
wrkDetl.setAppeUser(9527L);
|
wrkDetl.setModiTime(now);
|
wrkDetl.setModiUser(9527L);
|
if (!wrkDetlService.insert(wrkDetl)) {
|
throw new CoolException("保存工作档明细失败");
|
}
|
}
|
String response = "";
|
StartupDto startupDto = new StartupDto();
|
startupDto.setTaskNo(wrkMast.getWrkNo());
|
startupDto.setStaNo(wrkMast.getStaNo());
|
startupDto.setLocNo(Utils.locToLocNo(wrkMast.getSourceLocNo()));
|
startupDto.setTaskPri(wrkMast.getIoPri());
|
flag = false;
|
try {
|
response = new HttpHandler.Builder()
|
.setUri(addrs)
|
.setPath(flag ? locMoveTask : outTask)
|
.setJson(JSON.toJSONString(startupDto))
|
.build()
|
.doPost();
|
JSONObject jsonObject = JSON.parseObject(response);
|
if (jsonObject.get("code").equals(200)) {
|
wrkMast.setWrkSts(12L);
|
if (!wrkMastService.updateById(wrkMast)) {
|
throw new CoolException("工作档状态修改失败,工作号:{}" + wrkMast.getWrkNo());
|
}
|
// 修改库位状态: F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
|
locMast = locMastService.selectById(flag?shallowLocMast.getLocNo():locMast.getLocNo());
|
if (locMast.getLocSts().equals("F")) {
|
locMast.setLocSts("R");
|
locMast.setModiUser(9527L);
|
locMast.setModiTime(now);
|
if (!locMastService.updateById(locMast)) {
|
throw new CoolException("预约库位状态失败,库位号:" + locMast.getLocNo());
|
}
|
} else {
|
throw new CoolException(locMast.getLocNo() + "库位不是在库状态");
|
}
|
log.info("出库/移库任务派发成功");
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
}
|
}
|
}
|
|
//移库任务找空库位 深库位
|
public String getMoveLocNo(String locNo){
|
LocMast targetLocMast = new LocMast();
|
int deepRow = Utils.getRow(locNo);
|
//先找深库位这一排还有没有空位库
|
targetLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("row1", deepRow));
|
if (targetLocMast == null){
|
targetLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("row1", deepRow + 3));
|
|
}
|
if (targetLocMast == null){
|
targetLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("row1", deepRow + 1));
|
|
}
|
if (targetLocMast == null){
|
targetLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("row1", deepRow + 2));
|
|
}
|
return targetLocMast.getLocNo();
|
}
|
}
|