空托出库调整,记录状态,不可以继续呼叫

main
judy 1 year ago
parent a494b2cc7f
commit 54991fe8fe
  1. 116
      shkj-wms/src/main/java/com/shkj/wcs/plc/PlcEventTask.java
  2. 14
      shkj-wms/src/main/java/com/shkj/wcs/plc/PlcInit.java
  3. 34
      shkj-wms/src/main/java/com/shkj/wms/service/impl/BusinOutInPlanServiceImpl.java
  4. 2
      shkj-wms/src/main/java/com/shkj/wms/service/impl/SysThirdExceptionRequestServiceImpl.java
  5. 3
      shkj-wms/src/main/resources/mapper/wms/BaseContainerMapper.xml

@ -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){

@ -32,7 +32,7 @@ public class PlcInit {
RedisTemplate redisTemplate;
private ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
// @PostConstruct
@PostConstruct
public void init(){
log.info("初始化连接对象");
executorService.scheduleWithFixedDelay(
@ -50,7 +50,7 @@ public class PlcInit {
for (WcsPlcConnectVo conn : plcList) {
redisTemplate.opsForValue().set(RedisConstant.redisPlcConnect+conn.getDevCode(),conn);
PlcHelper plc = new PlcHelper(conn.getPlcType(), conn.getPlcIp(), conn.getPlcFactory(), conn.getPort());
if (conn.getPlcIp().contains("1.20")){
if (conn.getPlcIp().contains("155.180")){
plcOperate_stk = plc.getAutomation();
OperateResult connect = plcOperate_stk.connect();
if (connect.IsSuccess){
@ -60,7 +60,7 @@ public class PlcInit {
}
}
if (conn.getPlcIp().contains("1.10")){
if (conn.getPlcIp().contains("155.170")){
plcOperate_dps = plc.getAutomation();
OperateResult connect = plcOperate_dps.connect();
if (connect.IsSuccess){
@ -73,10 +73,10 @@ public class PlcInit {
}
private void reconnect(){
if (!plcOperate_dps.isConnectd()){
// connect();
//connect();
}
if (!plcOperate_stk.isConnectd()){
// connect();
//connect();
}
}
@ -90,10 +90,10 @@ public class PlcInit {
public PlcOperate getPlcOperateByIp(String plcIp){
if (plcIp.contains("1.20")){
if (plcIp.contains("155.180")){
return plcOperate_stk;
}
if (plcIp.contains("1.10")){
if (plcIp.contains("155.170")){
return plcOperate_dps;
}
return null;

@ -1,5 +1,6 @@
package com.shkj.wms.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
@ -12,6 +13,7 @@ import com.shkj.common.core.redis.RedisCache;
import com.shkj.common.utils.DateUtils;
import com.shkj.common.utils.SecurityUtils;
import com.shkj.common.utils.StringUtils;
import com.shkj.common.utils.bean.BeanUtils;
import com.shkj.system.service.ISysParameterService;
import com.shkj.wms.bo.*;
import com.shkj.wms.constants.ParameterConstants;
@ -68,12 +70,6 @@ public class BusinOutInPlanServiceImpl extends ServiceImpl<BusinOutInPlanMapper,
@Autowired
private WmsCallWcsUtil wmsCallWcsUtil;
@Autowired
private IBaseMoldBarcodeService baseMoldBarcodeService;
@Autowired
private IBasRuleService basRuleService;
@Autowired
private IBusinStockInvService iBusinStockInvService;
@ -145,22 +141,19 @@ public class BusinOutInPlanServiceImpl extends ServiceImpl<BusinOutInPlanMapper,
String containerType = container.getContainerType();
String moldType = bo.getMoldType();
/* if (!containerType.equals(moldType)){
return Result.err().msg("模具类型同托盘类型不匹配");
}*/
if (!containerType.equals(moldType)){
return Result.err().msg("模具类型同托盘类型不匹配");
}
//模具类型是高模具,不能放到托盘类型是低托盘类型的托盘上
if (moldType.equals("3") && containerType.equals("6")){
/*if (moldType.equals("3") && containerType.equals("6")){
return Result.err().msg("高模具不能放入低模具托盘");
}
}*/
List<String> moldBarcodeList = bo.getMoldBarcodeList();
if (moldBarcodeList.size() != moldBarcodeList.stream().distinct().collect(Collectors.toList()).size()) {
return Result.err().msg("模具存在重复");
}
List<BaseMold> baseMoldBarcodeList = baseMoldService.queryByMoldBarcodeList(moldBarcodeList);
if (CollectionUtils.isEmpty(baseMoldBarcodeList)) {
return Result.err().msg("条码不存在,请重新扫描");
@ -357,8 +350,20 @@ public class BusinOutInPlanServiceImpl extends ServiceImpl<BusinOutInPlanMapper,
return Result.err().msg("没有可容纳所需数量的托盘:"+bo.getModlQty());
}
String containerCode = vo.getContainerCode();
Long containerId = vo.getContainerId();
//更新货位库存状态为预占
List<SysStockDetail> sysStockDetails = sysStockDetailService.getByContainerId(containerId);
if (sysStockDetails !=null && sysStockDetails.size()>0){
for (SysStockDetail sysStockDetail : sysStockDetails) {
sysStockDetail.setOutQty(new BigDecimal("-1"));
sysStockDetailService.updateById(sysStockDetail);
}
}
sysStockDetailService.updateBatchById(sysStockDetails);
Long orderNo = IntIdUtil.generateIntId();
//新增呼叫空托盘单据,BusinOutInPlan
BusinOutInPlan businOutInPlan = initCallPlan(containerId, containerCode, orderNo,bo.getModlQty());
@ -386,7 +391,6 @@ public class BusinOutInPlanServiceImpl extends ServiceImpl<BusinOutInPlanMapper,
BaseContainer baseContainer = baseContainerService.getById(containerId);
baseContainer.setStatus(ContainerStausEnum.CALL.getValue());
return baseContainerService.updateById(baseContainer)?Result.ok():Result.err();
}

@ -193,7 +193,7 @@ public class SysThirdExceptionRequestServiceImpl extends ServiceImpl<SysThirdExc
* 做任务 定时任务
*/
@Override
// @Scheduled(fixedDelay = 10000)
@Scheduled(fixedDelay = 10000)
public void doTask() {
LambdaQueryWrapper<SysThirdExceptionRequest> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(SysThirdExceptionRequest::getStatus, ThirdApiStatusEnum.fail.getValue());

@ -135,7 +135,8 @@
<select id="getContainerNoInv" resultType="com.shkj.wms.vo.BaseContainerVo">
select distinct
a.container_code,b.container_name from sys_stock_detail a
inner join base_container b on a.container_code=b.container_code where ifnull(mold_no,'')=''
inner join base_container b on a.container_code=b.container_code
where ifnull(mold_no,'')='' and out_qty=0
</select>

Loading…
Cancel
Save