package com.zy.asrs.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.core.common.DateUtils;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.domain.param.OpenBusSubmitParam;
|
import com.zy.asrs.domain.param.TaskDto;
|
import com.zy.asrs.mapper.WrkMastMapper;
|
import com.zy.asrs.service.LocMastService;
|
import com.zy.asrs.service.WrkMastService;
|
import com.zy.common.utils.HttpHandler;
|
import com.zy.common.utils.News;
|
import com.zy.core.cache.MessageQueue;
|
import com.zy.core.cache.SlaveConnection;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.DevpSlave;
|
import com.zy.core.model.Task;
|
import com.zy.core.model.protocol.StaProtocol;
|
import com.zy.core.properties.SlaveProperties;
|
import com.zy.core.thread.SiemensDevpThread;
|
import lombok.Data;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.*;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* 立体仓库WCS系统主流程业务
|
* Created by vincent on 2020/8/6
|
*/
|
@Slf4j
|
@Service("ctuMainService")
|
@Transactional
|
@Data
|
public class CtuMainServiceImpl {
|
|
public static final long COMMAND_TIMEOUT = 5 * 1000;
|
|
@Value("${ctu.url}")
|
private String ctuUrl;
|
|
@Value("${ctu.sendTask}")
|
private String sendTask;
|
|
@Value("${ctu.getLoc}")
|
private String getLoc;
|
|
@Value("${ctu.update}")
|
private String updateSta;
|
|
@Autowired
|
private SlaveProperties slaveProperties;
|
|
@Autowired
|
private WrkMastMapper wrkMastMapper;
|
|
@Autowired
|
private LocMastService locMastService;
|
|
@Autowired
|
private WrkMastService wrkMastService;
|
|
private boolean flag1001 = false;
|
|
private boolean flag1007 = false;
|
|
|
/**
|
* 入库,从拣料站到入库站(CTU取货站)
|
*/
|
public synchronized void generateStoreWrkFile(Integer mark) {
|
// 根据输送线plc遍历
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
|
StaProtocol staProtocol = devpThread.getStation().get(1004);
|
if (staProtocol == null) {
|
return;
|
} else {
|
staProtocol = staProtocol.clone();
|
}
|
// 判断是否满足条件
|
// if (!staProtocol.isLoading()) {
|
// return;
|
// }
|
// && staProtocol.isInEnable()
|
if (staProtocol.getWorkNo() > 0 && staProtocol.isAutoing() && !staProtocol.isEmptyMk() && staProtocol.isPakMk()) {
|
if (staProtocol.getStaNo() == 1004) {
|
try {
|
Thread.sleep(8000L);
|
} catch (InterruptedException e) {
|
throw new RuntimeException(e);
|
}
|
staProtocol.setStaNo((short) 1007);
|
boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
|
log.info("入库输送线下发:{},{}", staProtocol.getWorkNo(), 1007);
|
|
}
|
// WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo());
|
// if (wrkMast != null) {
|
// //下发移动任务,并生成入库工作档
|
// WrkMast in = new WrkMast();
|
// wrkMast.setWrkSts(223L);
|
// wrkMast.setModiTime(new Date());
|
// wrkMastService.updateById(wrkMast);
|
// in.setSourceLocNo("1007");
|
// in.setLocNo(wrkMast.getSourceLocNo());
|
// in.setIoType(10);
|
// in.setIoTime(new Date());
|
// in.setWrkSts(1L); // 工作状态:11.生成出库ID
|
// in.setIoPri(13D); // 优先级:13
|
// in.setFullPlt("Y"); // 满板:Y
|
// in.setPicking("N"); // 拣料
|
// in.setExitMk("N"); // 退出
|
// in.setEmptyMk("Y"); // 空板
|
// in.setLinkMis("N");
|
// in.setAppeTime(new Date());
|
// in.setModiTime(new Date());
|
// in.setBarcode(wrkMast.getBarcode());
|
// in.setPlcWrkNo(wrkMast.getPlcWrkNo());
|
// wrkMastService.insert(in);
|
// LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
|
// locMast.setLocSts("S");
|
// locMast.setModiTime(new Date());
|
// locMastService.updateById(locMast);
|
// }
|
|
}
|
}
|
|
|
public synchronized void outToPlc(Integer mark) {
|
// 根据输送线plc遍历
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
|
StaProtocol staProtocol = devpThread.getStation().get(1007);
|
if (staProtocol == null) {
|
return;
|
} else {
|
staProtocol = staProtocol.clone();
|
}
|
// 判断是否满足条件
|
if (!staProtocol.isLoading()) {
|
return;
|
}
|
if (flag1007 && staProtocol.getWorkNo() > 0 && staProtocol.isAutoing() && !staProtocol.isEmptyMk() && staProtocol.isPakMk()) {
|
staProtocol.setWorkNo(0);
|
staProtocol.setStaNo((short) 0);
|
boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(3, staProtocol));
|
log.info("取走写入确认位:{},{}", staProtocol.getWorkNo(), 1007);
|
}
|
}
|
|
/**
|
* 出库
|
*/
|
public synchronized void out(Integer mark) {
|
// 根据输送线plc遍历
|
for (DevpSlave devp : slaveProperties.getDevp()) {
|
// 遍历入库口
|
for (DevpSlave.Sta inSta : devp.getOutSta()) {
|
// 获取入库站信息
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
|
StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
|
if (staProtocol == null) {
|
continue;
|
} else {
|
staProtocol = staProtocol.clone();
|
}
|
// 判断是否满足条件
|
if (!staProtocol.isLoading()) {
|
continue;
|
}
|
//&& staProtocol.isOutEnable()
|
if (flag1001 && staProtocol.isAutoing() && !staProtocol.isEmptyMk() && (staProtocol.getWorkNo() == 0 || staProtocol.getWorkNo() == 9999) && staProtocol.isPakMk()) {
|
News.warnNoLog("" + mark + " - 0" + " - 开始执行");
|
// 判断重复工作档
|
// 106也算上,以后106-》107用于更新库存
|
// WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("loc_no", "1001").in("wrk_sts", 106, 107));
|
// if (wrkMast == null) {
|
// continue;
|
// }
|
|
// 命令下发区 --------------------------------------------------------------------------
|
|
// 更新站点信息 且 下发plc命令
|
staProtocol.setWorkNo((int) (Math.random() * 10000));
|
staProtocol.setStaNo((short) 1004);
|
devpThread.setPakMk(staProtocol.getSiteId(), false);
|
boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
|
log.info("输送线下发3:{},{}", staProtocol.getWorkNo(), 1004);
|
if (result) {
|
setFlag1001(false);
|
} else {
|
News.error("" + mark + " - 2" + " - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
|
}
|
} else {
|
News.errorNoLog("" + mark + " - 6" + " - 站点信息不符合入库条件!!!" + " 自动信号:" + staProtocol.isLoading() + "、可入信号:" + staProtocol.isInEnable() + "、空板信号:" + staProtocol.isEmptyMk() + "、工作号:" + staProtocol.getWorkNo() + "、锁定标记" + staProtocol.isPakMk() + "、入库印记:" + staProtocol.getStamp());
|
}
|
}
|
}
|
}
|
|
public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
|
add(1001);
|
add(1002);
|
add(1003);
|
add(1004);
|
add(1005);
|
add(1006);
|
add(1007);
|
|
}};
|
|
public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
|
|
add(101);
|
add(102);
|
add(103);
|
add(104);
|
add(105);
|
add(106);
|
add(107);
|
add(108);
|
}};
|
|
public synchronized void in(Integer mark) {
|
// 遍历入库口
|
for (Integer inSta : staNos2) {
|
// 获取入库站信息
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
|
StaProtocol staProtocol = devpThread.getStation().get(inSta);
|
if (staProtocol == null) {
|
continue;
|
} else {
|
staProtocol = staProtocol.clone();
|
}
|
// 判断是否满足条件
|
if (!staProtocol.isAutoing() && !staProtocol.isLoading()) {
|
continue;
|
}
|
// && staProtocol.isInEnable()
|
if (staProtocol.isInEnable()) {
|
OpenBusSubmitParam openBusSubmitParam = new OpenBusSubmitParam();
|
openBusSubmitParam.setBatch(DateUtils.convert(new Date()));
|
List<TaskDto> taskList = new ArrayList<>();
|
TaskDto taskDto = new TaskDto();
|
Random rand = new Random();
|
taskDto.setSeqNum(rand.nextInt(10000) + "");
|
taskDto.setDestLoc(getFLoc(staProtocol.getSiteId() + "-2", "15"));
|
taskDto.setOriSta(staProtocol.getSiteId() + "-2");
|
taskDto.setPriority(123);
|
taskList.add(taskDto);
|
openBusSubmitParam.setTaskList(taskList);
|
sendTask(openBusSubmitParam, staProtocol);
|
}
|
if (staProtocol.isOutEnable()) {
|
OpenBusSubmitParam openBusSubmitParam = new OpenBusSubmitParam();
|
openBusSubmitParam.setBatch(DateUtils.convert(new Date()));
|
List<TaskDto> taskList = new ArrayList<>();
|
TaskDto taskDto = new TaskDto();
|
Random rand = new Random();
|
taskDto.setSeqNum(rand.nextInt(10000) + "");
|
taskDto.setDestLoc(getFLoc(staProtocol.getSiteId() + "-3", "15"));
|
taskDto.setOriSta(staProtocol.getSiteId() + "-3");
|
taskDto.setPriority(123);
|
taskList.add(taskDto);
|
openBusSubmitParam.setTaskList(taskList);
|
sendTask(openBusSubmitParam, staProtocol);
|
}
|
}
|
}
|
|
public synchronized void autoOut(Integer mark) {
|
int i = 0;
|
for (Integer staNo : staNos1) {
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
|
StaProtocol staProtocol = devpThread.getStation().get(staNo);
|
if (staProtocol == null) {
|
continue;
|
} else {
|
staProtocol = staProtocol.clone();
|
}
|
// 判断是否满足条件
|
if (!staProtocol.isAutoing()) {
|
continue;
|
}
|
if (staProtocol.isLoading()) {
|
continue;
|
}
|
if (staProtocol.getStaNo() != 0) {
|
continue;
|
}
|
i++;
|
}
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
|
StaProtocol staProtocol = devpThread.getStation().get(1001);
|
if (i >= 7) {
|
OpenBusSubmitParam openBusSubmitParam = new OpenBusSubmitParam();
|
openBusSubmitParam.setBatch(DateUtils.convert(new Date()));
|
List<TaskDto> taskList = new ArrayList<>();
|
TaskDto taskDto = new TaskDto();
|
taskDto.setSeqNum(Math.random() * 1000 + "");
|
taskDto.setOriLoc(getFLoc("1001", "16"));
|
taskDto.setDestSta("1001");
|
taskDto.setPriority(123);
|
taskList.add(taskDto);
|
openBusSubmitParam.setTaskList(taskList);
|
sendTask(openBusSubmitParam, staProtocol);
|
}
|
}
|
|
/**
|
* 1007入库
|
*
|
* @param mark
|
*/
|
public synchronized void autoIn(Integer mark) {
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
|
StaProtocol staProtocol = devpThread.getStation().get(1007);
|
if (staProtocol == null) {
|
return;
|
} else {
|
staProtocol = staProtocol.clone();
|
}
|
// 判断是否满足条件
|
if (!staProtocol.isAutoing()) {
|
return;
|
}
|
if (!staProtocol.isLoading()) {
|
return;
|
}
|
if (staProtocol.getStaNo() > 0) {
|
return;
|
}
|
OpenBusSubmitParam openBusSubmitParam = new OpenBusSubmitParam();
|
openBusSubmitParam.setBatch(DateUtils.convert(new Date()));
|
List<TaskDto> taskList = new ArrayList<>();
|
TaskDto taskDto = new TaskDto();
|
taskDto.setSeqNum(Math.random() * 1000 + "");
|
taskDto.setDestLoc(getFLoc("1007", "15"));
|
taskDto.setOriLoc("1007");
|
taskDto.setPriority(123);
|
taskList.add(taskDto);
|
openBusSubmitParam.setTaskList(taskList);
|
if (sendTask(openBusSubmitParam, staProtocol)) {
|
staProtocol.setWorkNo(0);
|
staProtocol.setStaNo((short) 0);
|
boolean result = MessageQueue.offer(SlaveType.Devp, 1, new Task(3, staProtocol));
|
log.info("下发给rcs成功:{},{}", 0, 0);
|
}
|
}
|
|
|
public void updateSta(Integer mark) {
|
SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
|
StaProtocol staProtocol1 = devpThread.getStation().get(1001);
|
StaProtocol staProtocol7 = devpThread.getStation().get(1007);
|
if (staProtocol1 == null) {
|
return;
|
}
|
if (staProtocol7 == null) {
|
return;
|
}
|
updateSta("1001", staProtocol1.isLoading() ? "16" : "15");
|
updateSta("1007", staProtocol7.isLoading() ? "16" : "15");
|
}
|
|
@Transactional
|
public boolean sendTask(OpenBusSubmitParam openBusSubmitParam, StaProtocol staProtocol) {
|
String response = "";
|
try {
|
response = new HttpHandler.Builder()
|
.setUri(ctuUrl)
|
.setPath(sendTask)
|
.setTimeout(1200, TimeUnit.SECONDS)
|
.setJson(JSON.toJSONString(openBusSubmitParam))
|
.build()
|
.doPost();
|
JSONObject jsonObject = JSON.parseObject(response);
|
if (jsonObject.getInteger("code").equals(200)) {
|
log.info("下发任务返回数据:{}", response);
|
return true;
|
} else {
|
log.error("请求接口失败!!!url:{};request:{};response:{}", ctuUrl + sendTask, JSON.toJSONString(openBusSubmitParam), response);
|
throw new CoolException("调用下发任务接口报错");
|
}
|
} catch (Exception e) {
|
log.error("fail", e);
|
}
|
return false;
|
}
|
|
@Transactional
|
public void updateSta(String staNo, String sts) {
|
Map<String, String> data = new HashMap<String, String>();
|
data.put("staNo", staNo);
|
data.put("sts", sts);
|
String response = "";
|
try {
|
response = new HttpHandler.Builder()
|
.setUri(ctuUrl)
|
.setPath(updateSta)
|
.setTimeout(1200, TimeUnit.SECONDS)
|
.setJson(JSON.toJSONString(data))
|
.build()
|
.doPost();
|
JSONObject jsonObject = JSON.parseObject(response);
|
if (jsonObject.getInteger("code").equals(200)) {
|
//log.info("下发任务返回数据:{}", response);
|
} else {
|
//log.error("请求接口失败!!!url:{};request:{};response:{}", ctuUrl + sendTask, JSON.toJSONString(data), response);
|
//throw new CoolException("调用下发任务接口报错");
|
}
|
} catch (Exception e) {
|
log.error("fail", e);
|
}
|
}
|
|
@Transactional
|
public String getFLoc(String staNo, String sts) {
|
Map<String, String> data = new HashMap<String, String>();
|
data.put("staNo", staNo);
|
data.put("sts", sts);
|
String response = "";
|
try {
|
response = new HttpHandler.Builder()
|
.setUri(ctuUrl)
|
.setPath(getLoc)
|
.setTimeout(1200, TimeUnit.SECONDS)
|
.setJson(JSON.toJSONString(data))
|
.build()
|
.doPost();
|
JSONObject jsonObject = JSON.parseObject(response);
|
if (jsonObject.getInteger("code").equals(200)) {
|
//log.info("下发任务返回数据:{}", response);
|
JSONObject loc = JSON.parseObject(jsonObject.getString("data"));
|
return loc.getString("locNo");
|
} else {
|
log.error("请求接口失败!!!url:{};request:{};response:{}", ctuUrl + sendTask, JSON.toJSONString(data), response);
|
throw new CoolException("调用下发任务接口报错");
|
}
|
} catch (Exception e) {
|
log.error("fail", e);
|
}
|
return null;
|
}
|
}
|