|
|
|
|
@ -97,7 +97,7 @@ public class PlcEventTask { |
|
|
|
|
@Autowired |
|
|
|
|
PlcInit plcInit; |
|
|
|
|
|
|
|
|
|
// @Scheduled(fixedDelay = 8000)
|
|
|
|
|
@Scheduled(fixedDelay = 8000) |
|
|
|
|
public void init() { |
|
|
|
|
//查询需要连接的PLC,初始化连接对象
|
|
|
|
|
List<WcsPlcConnectVo> plcList = iWcsPlcConnectService.selectWcsPlcConnectList(new WcsPlcConnect().setIsActive("1")); |
|
|
|
|
@ -107,11 +107,11 @@ public class PlcEventTask { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (WcsPlcConnectVo conn : plcList) { |
|
|
|
|
if (conn.getPlcIp().contains("1.20")){ |
|
|
|
|
if (conn.getPlcIp().contains("155.180")){ |
|
|
|
|
plcTask(plcInit.getPlcOperate_stk(), conn, conn.getPointTables()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (conn.getPlcIp().contains("1.10")){ |
|
|
|
|
if (conn.getPlcIp().contains("155.170")){ |
|
|
|
|
plcTask(plcInit.getPlcOperate_dps(), conn, conn.getPointTables()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -119,7 +119,7 @@ public class PlcEventTask { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//输送线心跳
|
|
|
|
|
// @Scheduled(fixedDelay = 4000)
|
|
|
|
|
@Scheduled(fixedDelay = 4000) |
|
|
|
|
public void writePlcheartbeatDps(){ |
|
|
|
|
//根据连接的plcId获取属性
|
|
|
|
|
PlcOperate plcOperate = plcInit.getPlcOperate_dps(); |
|
|
|
|
@ -147,7 +147,7 @@ public class PlcEventTask { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//堆垛机心跳
|
|
|
|
|
// @Scheduled(fixedDelay = 4000)
|
|
|
|
|
@Scheduled(fixedDelay = 4000) |
|
|
|
|
public void writePlcheartbeatStk(){ |
|
|
|
|
//根据连接的plcId获取属性
|
|
|
|
|
PlcOperate plcOperate = plcInit.getPlcOperate_stk(); |
|
|
|
|
@ -332,7 +332,7 @@ public class PlcEventTask { |
|
|
|
|
String twoAllotAddress = "", twoAllotTaskId = "", twoAllotTaskIdVt = ""; |
|
|
|
|
|
|
|
|
|
String autoAddress = ""; |
|
|
|
|
Long taskId = 0L; |
|
|
|
|
|
|
|
|
|
//货物高度wms的值
|
|
|
|
|
String cargoHeight =""; |
|
|
|
|
//托盘条码地址
|
|
|
|
|
@ -420,6 +420,7 @@ public class PlcEventTask { |
|
|
|
|
|
|
|
|
|
// 电柜状态是否是自动,如果是自动则继续流程
|
|
|
|
|
if (pointMap.containsKey(autoAddress) && Boolean.valueOf(pointMap.get(autoAddress).toString())) { |
|
|
|
|
Long taskIdOne = 0L; |
|
|
|
|
//1楼是否请求分配
|
|
|
|
|
if (pointMap.containsKey(oneAllotAddress) && Boolean.valueOf(pointMap.get(oneAllotAddress).toString())) { |
|
|
|
|
//请求入库分配时,判断是否有正在执行的出库任务,如果有则返回
|
|
|
|
|
@ -430,18 +431,19 @@ public class PlcEventTask { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//读取托盘条码内容
|
|
|
|
|
String barcodeValue = pointMap.get(onePalletAddress).toString(); |
|
|
|
|
String barcodeValueOne = pointMap.get(onePalletAddress).toString(); |
|
|
|
|
log.info("1楼请求入库时,读取的条码内容:"+barcodeValueOne); |
|
|
|
|
//根据托盘条码返回正在执行的任务号
|
|
|
|
|
Result<PlanOrderLocationVo> orderResult = iBusinOutInPlanService.getOrderNoByContainerCode(barcodeValue, "in"); |
|
|
|
|
log.info("根据条码获取的任务信息:"+orderResult.getData()); |
|
|
|
|
Result<PlanOrderLocationVo> orderResult = iBusinOutInPlanService.getOrderNoByContainerCode(barcodeValueOne, "in"); |
|
|
|
|
log.info("1根据条码获取的任务信息:"+orderResult.getData()); |
|
|
|
|
if (Result.isOk(orderResult)) { |
|
|
|
|
PlanOrderLocationVo data = orderResult.getData(); |
|
|
|
|
taskId = data.getOrderNo(); |
|
|
|
|
taskIdOne = data.getOrderNo(); |
|
|
|
|
cargoHeight = data.getType();//获取托盘或模具类型
|
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisPutInExeMsg+orderResult.getMsg(),orderResult.getMsg()); |
|
|
|
|
log.info("获取任务信息失败:"+orderResult.getMsg()+"托盘条码:"+barcodeValue); |
|
|
|
|
log.info("获取任务信息失败:"+orderResult.getMsg()+"托盘条码:"+barcodeValueOne); |
|
|
|
|
//回填任务号
|
|
|
|
|
Map<String, Integer> writeMap = new HashMap<>(1); |
|
|
|
|
writeMap.put(oneWcsErrExitVT, 1); |
|
|
|
|
@ -454,15 +456,15 @@ public class PlcEventTask { |
|
|
|
|
log.info("1楼获取单号入库失败,写入点位失败{}",allMap); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
log.info("1楼入库分配任务ID:"+taskId + "条码号:"+ barcodeValue); |
|
|
|
|
log.info("1楼入库分配任务ID:"+taskIdOne + "条码号:"+ barcodeValueOne); |
|
|
|
|
log.info("1楼入库分配货位类型:"+cargoHeight); |
|
|
|
|
String redisBarcode = String.valueOf(redisTemplate.opsForValue().get(RedisConstant.redisContainer+taskId)); |
|
|
|
|
String redisBarcodeOne = String.valueOf(redisTemplate.opsForValue().get(RedisConstant.redisContainer+taskIdOne)); |
|
|
|
|
|
|
|
|
|
//根据扫码的托盘,判断是否已经下任务了
|
|
|
|
|
if (taskId != 0L && !redisBarcode.equals(barcodeValue)) { |
|
|
|
|
if (taskIdOne != 0L && redisBarcodeOne !=null && !redisBarcodeOne.equals(barcodeValueOne)) { |
|
|
|
|
//回填任务号
|
|
|
|
|
Map<String, Long> writeMap = new HashMap<>(1); |
|
|
|
|
writeMap.put(oneAllotTaskIdVt, taskId); |
|
|
|
|
writeMap.put(oneAllotTaskIdVt, taskIdOne); |
|
|
|
|
Map<String, Object> allMap = new HashMap<>(1); |
|
|
|
|
allMap.put(oneAllotTaskId, writeMap); |
|
|
|
|
|
|
|
|
|
@ -478,17 +480,17 @@ public class PlcEventTask { |
|
|
|
|
Boolean taskBoolean = plcReadAndWrite.execWrite(plcOperate, JsonUtil.toJSONString(allMap)); |
|
|
|
|
if (taskBoolean) { |
|
|
|
|
//分配任务成功时,记录已下发入库任务,不可在下发出库或入库任务
|
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisTaskIn,taskId); |
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisTaskIn,taskIdOne); |
|
|
|
|
//更改入库计划为1
|
|
|
|
|
iBusinOutInPlanService.updPlanStatus(taskId, PlanStatusEnum.DOING.getValue()); |
|
|
|
|
iBusinOutInPlanService.updPlanStatus(taskIdOne, PlanStatusEnum.DOING.getValue()); |
|
|
|
|
} |
|
|
|
|
//改为入库ID
|
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisContainer, taskId, 10, TimeUnit.SECONDS); |
|
|
|
|
|
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisContainer, taskIdOne, 10, TimeUnit.SECONDS); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//2楼是否请求分配
|
|
|
|
|
if (pointMap.containsKey(twoAllotAddress) && Boolean.valueOf(pointMap.get(twoAllotAddress).toString())) { |
|
|
|
|
Long taskIdTwo=0L; |
|
|
|
|
//请求入库分配时,判断是否有正在执行的出库任务,如果有则返回
|
|
|
|
|
Object taskOutId = redisTemplate.opsForValue().get(RedisConstant.redisTaskOut); |
|
|
|
|
if (taskOutId !=null){ |
|
|
|
|
@ -496,17 +498,18 @@ public class PlcEventTask { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//读取托盘条码内容
|
|
|
|
|
String barcodeValue = pointMap.get(twoPalletAddress).toString(); |
|
|
|
|
String barcodeValueTwo = pointMap.get(twoPalletAddress).toString(); |
|
|
|
|
log.info("1楼请求入库时,读取的条码内容:"+barcodeValueTwo); |
|
|
|
|
//根据托盘条码返回正在执行的任务号
|
|
|
|
|
Result<PlanOrderLocationVo> orderResult = iBusinOutInPlanService.getOrderNoByContainerCode(barcodeValue, "in"); |
|
|
|
|
Result<PlanOrderLocationVo> orderResult = iBusinOutInPlanService.getOrderNoByContainerCode(barcodeValueTwo, "in"); |
|
|
|
|
log.info("2楼根据条码获取的任务信息:"+orderResult.getData()); |
|
|
|
|
if (Result.isOk(orderResult)) { |
|
|
|
|
PlanOrderLocationVo data = orderResult.getData(); |
|
|
|
|
taskId = data.getOrderNo(); |
|
|
|
|
taskIdTwo = data.getOrderNo(); |
|
|
|
|
cargoHeight = data.getType();//获取托盘或模具类型
|
|
|
|
|
}else { |
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisPutInExeMsg+orderResult.getMsg(),orderResult.getMsg()); |
|
|
|
|
log.info("2楼获取任务信息失败:"+orderResult.getMsg()+"托盘条码:"+barcodeValue); |
|
|
|
|
log.info("2楼获取任务信息失败:"+orderResult.getMsg()+"托盘条码:"+barcodeValueTwo); |
|
|
|
|
//回填任务号
|
|
|
|
|
Map<String, Integer> writeMap = new HashMap<>(1); |
|
|
|
|
writeMap.put(twoWcsErrExitVT, 1); |
|
|
|
|
@ -519,15 +522,15 @@ public class PlcEventTask { |
|
|
|
|
log.info("2楼获取单号入库失败,写入点位失败{}",allMap); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
log.info("2楼入库分配任务ID:"+taskId + "条码号:"+ barcodeValue); |
|
|
|
|
log.info("2楼入库分配任务ID:"+taskIdTwo + "条码号:"+ barcodeValueTwo); |
|
|
|
|
log.info("2楼入库分配货位类型:"+cargoHeight); |
|
|
|
|
String redisBarcode = String.valueOf(redisTemplate.opsForValue().get(RedisConstant.redisContainer+taskId)); |
|
|
|
|
String redisBarcodeTwo = String.valueOf(redisTemplate.opsForValue().get(RedisConstant.redisContainer+taskIdTwo)); |
|
|
|
|
|
|
|
|
|
//根据扫码的托盘,判断是否已经下任务了
|
|
|
|
|
if (taskId != 0L && !redisBarcode.equals(barcodeValue)) { |
|
|
|
|
if (taskIdTwo != 0L && redisBarcodeTwo!=null && !redisBarcodeTwo.equals(barcodeValueTwo)) { |
|
|
|
|
//回填任务号
|
|
|
|
|
Map<String, Long> writeMap = new HashMap<>(1); |
|
|
|
|
writeMap.put(twoAllotTaskIdVt, taskId); |
|
|
|
|
writeMap.put(twoAllotTaskIdVt, taskIdTwo); |
|
|
|
|
Map<String, Object> allMap = new HashMap<>(1); |
|
|
|
|
allMap.put(twoAllotTaskId, writeMap); |
|
|
|
|
|
|
|
|
|
@ -544,13 +547,12 @@ public class PlcEventTask { |
|
|
|
|
Boolean taskBoolean = plcReadAndWrite.execWrite(plcOperate, JsonUtil.toJSONString(allMap)); |
|
|
|
|
if (taskBoolean) { |
|
|
|
|
//分配任务成功时,记录已下发入库任务,不可在下发出库任务
|
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisTaskIn,taskId); |
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisTaskIn,taskIdTwo); |
|
|
|
|
//更改入库计划为1
|
|
|
|
|
iBusinOutInPlanService.updPlanStatus(taskId, PlanStatusEnum.DOING.getValue()); |
|
|
|
|
iBusinOutInPlanService.updPlanStatus(taskIdTwo, PlanStatusEnum.DOING.getValue()); |
|
|
|
|
} |
|
|
|
|
//改为入库ID
|
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisContainer, taskId, 10, TimeUnit.SECONDS); |
|
|
|
|
|
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisContainer, taskIdTwo, 10, TimeUnit.SECONDS); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//获取1楼入库失败的内容
|
|
|
|
|
@ -586,25 +588,25 @@ public class PlcEventTask { |
|
|
|
|
} |
|
|
|
|
log.info("1楼入库失败原因:"+failedReasonValue); |
|
|
|
|
//读取失败任务号
|
|
|
|
|
Long failedTaskIdValue = Long.valueOf(pointMap.get(oneAllotTaskId).toString()); |
|
|
|
|
Long failedTaskIdValueOne = Long.valueOf(pointMap.get(oneAllotTaskId).toString()); |
|
|
|
|
|
|
|
|
|
//根据回填入库失败原因
|
|
|
|
|
UpdPlanErrorBo updPlanErrorBo = new UpdPlanErrorBo(); |
|
|
|
|
updPlanErrorBo.setErrorMsg(failedReasonValue); |
|
|
|
|
updPlanErrorBo.setOrderNo(failedTaskIdValue); |
|
|
|
|
updPlanErrorBo.setOrderNo(failedTaskIdValueOne); |
|
|
|
|
iBusinOutInPlanService.updErrMsg(updPlanErrorBo); |
|
|
|
|
|
|
|
|
|
String redisFailedTaskIdValue = String.valueOf(redisTemplate.opsForValue().get(RedisConstant.redisDPSFailedTaskIdOne)); |
|
|
|
|
String redisFailedTaskIdValueOne = String.valueOf(redisTemplate.opsForValue().get(RedisConstant.redisDPSFailedTaskIdOne)); |
|
|
|
|
|
|
|
|
|
log.info("1楼入库失败redis任务ID:"+redisFailedTaskIdValue); |
|
|
|
|
log.info("1楼入库失败PLC任务ID:"+failedTaskIdValue); |
|
|
|
|
log.info("1楼入库失败redis任务ID:"+redisFailedTaskIdValueOne); |
|
|
|
|
log.info("1楼入库失败PLC任务ID:"+failedTaskIdValueOne); |
|
|
|
|
//入库失败,更改入库状态为0
|
|
|
|
|
if (failedTaskIdValue != 0L && !redisFailedTaskIdValue.equals(failedTaskIdValue)) { |
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisDPSFailedTaskIdOne, failedTaskIdValue); |
|
|
|
|
if (failedTaskIdValueOne != 0L && !redisFailedTaskIdValueOne.equals(failedTaskIdValueOne)) { |
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisDPSFailedTaskIdOne, failedTaskIdValueOne); |
|
|
|
|
//更改入库计划3,取消
|
|
|
|
|
iBusinOutInPlanService.updPlanStatus(failedTaskIdValue, PlanStatusEnum.CANCEL.getValue()); |
|
|
|
|
iBusinOutInPlanService.updPlanStatus(failedTaskIdValueOne, PlanStatusEnum.CANCEL.getValue()); |
|
|
|
|
//清理预占库存
|
|
|
|
|
iBusinOutInPlanService.updateSysStockByPlanOrderNo(failedTaskIdValue.toString()); |
|
|
|
|
iBusinOutInPlanService.updateSysStockByPlanOrderNo(failedTaskIdValueOne.toString()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -642,51 +644,51 @@ public class PlcEventTask { |
|
|
|
|
} |
|
|
|
|
log.info("2楼入库失败原因:"+failedReasonValue); |
|
|
|
|
//读取失败任务号
|
|
|
|
|
Long failedTaskIdValue = Long.valueOf(pointMap.get(twoAllotTaskId).toString()); |
|
|
|
|
Long failedTaskIdValueTwo = Long.valueOf(pointMap.get(twoAllotTaskId).toString()); |
|
|
|
|
|
|
|
|
|
//根据回填入库失败原因
|
|
|
|
|
UpdPlanErrorBo updPlanErrorBo = new UpdPlanErrorBo(); |
|
|
|
|
updPlanErrorBo.setErrorMsg(failedReasonValue); |
|
|
|
|
updPlanErrorBo.setOrderNo(failedTaskIdValue); |
|
|
|
|
updPlanErrorBo.setOrderNo(failedTaskIdValueTwo); |
|
|
|
|
iBusinOutInPlanService.updErrMsg(updPlanErrorBo); |
|
|
|
|
|
|
|
|
|
String redisFailedTaskIdValue = String.valueOf(redisTemplate.opsForValue().get(RedisConstant.redisDPSFailedTaskIdTwo)); |
|
|
|
|
String redisFailedTaskIdValueTwo = String.valueOf(redisTemplate.opsForValue().get(RedisConstant.redisDPSFailedTaskIdTwo)); |
|
|
|
|
|
|
|
|
|
log.info("2楼入库失败redis任务ID:"+redisFailedTaskIdValue); |
|
|
|
|
log.info("2楼入库失败PLC任务ID:"+failedTaskIdValue); |
|
|
|
|
log.info("2楼入库失败redis任务ID:"+redisFailedTaskIdValueTwo); |
|
|
|
|
log.info("2楼入库失败PLC任务ID:"+failedTaskIdValueTwo); |
|
|
|
|
//入库失败,更改入库状态为0
|
|
|
|
|
if (failedTaskIdValue != 0L && !redisFailedTaskIdValue.equals(failedTaskIdValue)) { |
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisDPSFailedTaskIdTwo, failedTaskIdValue); |
|
|
|
|
if (failedTaskIdValueTwo != 0L && !redisFailedTaskIdValueTwo.equals(failedTaskIdValueTwo)) { |
|
|
|
|
redisTemplate.opsForValue().set(RedisConstant.redisDPSFailedTaskIdTwo, failedTaskIdValueTwo); |
|
|
|
|
//更改入库计划3,取消
|
|
|
|
|
iBusinOutInPlanService.updPlanStatus(failedTaskIdValue, PlanStatusEnum.CANCEL.getValue()); |
|
|
|
|
iBusinOutInPlanService.updPlanStatus(failedTaskIdValueTwo, PlanStatusEnum.CANCEL.getValue()); |
|
|
|
|
//清理预占库存
|
|
|
|
|
iBusinOutInPlanService.updateSysStockByPlanOrderNo(failedTaskIdValue.toString()); |
|
|
|
|
iBusinOutInPlanService.updateSysStockByPlanOrderNo(failedTaskIdValueTwo.toString()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//1楼是否请求入库:
|
|
|
|
|
if (pointMap.containsKey(oneReqPutin) && Boolean.valueOf(pointMap.get(oneReqPutin).toString())) { |
|
|
|
|
//请求入库,给堆垛机下发命令
|
|
|
|
|
taskId = Long.valueOf((String) pointMap.get(oneReqPutInTaskId)); |
|
|
|
|
Long oneTaskId= Long.valueOf((String) pointMap.get(oneReqPutInTaskId)); |
|
|
|
|
//从redis中验证是否已经下发任务
|
|
|
|
|
Long redisTaskId = (Long) redisTemplate.opsForValue().get(RedisConstant.redisReqWare + taskId); |
|
|
|
|
if (taskId.equals(redisTaskId)) { |
|
|
|
|
Long redisTaskId = (Long) redisTemplate.opsForValue().get(RedisConstant.redisReqWare + oneTaskId); |
|
|
|
|
if (oneTaskId.equals(redisTaskId)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//执行dps任务,给堆垛机下发命令
|
|
|
|
|
dpsTask(taskId,1) ; |
|
|
|
|
dpsTask(oneTaskId,1) ; |
|
|
|
|
} |
|
|
|
|
//2楼是否请求入库
|
|
|
|
|
if (pointMap.containsKey(twoReqPutin) && Boolean.valueOf(pointMap.get(twoReqPutin).toString())) { |
|
|
|
|
//请求入库,给堆垛机下发命令
|
|
|
|
|
taskId = Long.valueOf((String) pointMap.get(twoReqPutInTaskId)); |
|
|
|
|
Long twotaskId = Long.valueOf((String) pointMap.get(twoReqPutInTaskId)); |
|
|
|
|
//从redis中验证是否已经下发任务
|
|
|
|
|
Long redisTaskId = (Long) redisTemplate.opsForValue().get(RedisConstant.redisReqWare + taskId); |
|
|
|
|
if (taskId.equals(redisTaskId)) { |
|
|
|
|
Long redisTaskId = (Long) redisTemplate.opsForValue().get(RedisConstant.redisReqWare + twotaskId); |
|
|
|
|
if (twotaskId.equals(redisTaskId)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//执行dps任务,给堆垛机下发命令
|
|
|
|
|
dpsTask(taskId,2) ; |
|
|
|
|
dpsTask(twotaskId,2) ; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}catch (Exception e){ |
|
|
|
|
|