增加任务查询和重新下发

main
Comair 9 months ago
parent da24e39974
commit 379cf50bff
  1. 2
      shkj-admin/src/main/java/com/shkj/ShkjApplication.java
  2. 6
      shkj-admin/src/main/resources/application-pro.yml
  3. 2
      shkj-admin/src/main/resources/application.yml
  4. 3
      shkj-common/src/main/java/com/shkj/common/constant/RedisConstant.java
  5. 2
      shkj-common/src/main/java/com/shkj/common/utils/MessageUtils.java
  6. 4
      shkj-framework/src/main/java/com/shkj/framework/config/SecurityConfig.java
  7. 5
      shkj-system/src/main/java/com/shkj/system/service/impl/SysDictTypeServiceImpl.java
  8. 2
      shkj-system/src/main/resources/mapper/system/SysDictDataMapper.xml
  9. 34
      shkj-wms/src/main/java/com/shkj/wcs/bo/AGVFeedbackDepBo.java
  10. 48
      shkj-wms/src/main/java/com/shkj/wcs/bo/AGVTaskBo.java
  11. 15
      shkj-wms/src/main/java/com/shkj/wcs/controller/busin/AgvTaskContorller.java
  12. 53
      shkj-wms/src/main/java/com/shkj/wcs/controller/busin/BusinTaskController.java
  13. 18
      shkj-wms/src/main/java/com/shkj/wcs/controller/busin/WcsTaskController.java
  14. 107
      shkj-wms/src/main/java/com/shkj/wcs/domain/BusinTask.java
  15. 14
      shkj-wms/src/main/java/com/shkj/wcs/mapper/BusinTaskMapper.java
  16. 400
      shkj-wms/src/main/java/com/shkj/wcs/plc/PlcEventTask.java
  17. 23
      shkj-wms/src/main/java/com/shkj/wcs/service/IBusinDataTaskService.java
  18. 36
      shkj-wms/src/main/java/com/shkj/wcs/service/IBusinTaskService.java
  19. 299
      shkj-wms/src/main/java/com/shkj/wcs/service/impl/BusinDataTaskServiceImpl.java
  20. 117
      shkj-wms/src/main/java/com/shkj/wcs/service/impl/BusinTaskServiceImpl.java
  21. 38
      shkj-wms/src/main/java/com/shkj/wcs/third/workbinWcs/WCSUtil.java
  22. 18
      shkj-wms/src/main/java/com/shkj/wcs/vo/BusinTaskVo.java
  23. 14
      shkj-wms/src/main/java/com/shkj/wms/bo/BusinTaskQueryBo.java
  24. 6
      shkj-wms/src/main/java/com/shkj/wms/enums/TaskStatusEnum.java
  25. 38
      shkj-wms/src/main/java/com/shkj/wms/enums/WayEnum.java

@ -12,7 +12,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
*
* @author lch
*/
@SpringBootApplication(exclude = { SecurityAutoConfiguration.class,DataSourceAutoConfiguration.class, MongoAutoConfiguration.class},scanBasePackages = {"org.jeecg.modules.jmreport", "com.shkj"})
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, MongoAutoConfiguration.class},scanBasePackages = {"org.jeecg.modules.jmreport", "com.shkj"})
//@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, MongoAutoConfiguration.class},scanBasePackages = {"org.jeecg.modules.jmreport", "com.shkj"})
@EnableAsync
public class ShkjApplication {

@ -12,9 +12,9 @@ spring:
druid:
# 主库数据源
master:
url: jdbc:mysql://127.0.0.1:3306/sc_wcs?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B7
url: jdbc:mysql://10.0.152.244:3306/sc_wcs?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B7
username: root
password: root
password: sc@2025
# 从库数据源
slave:
# 从数据源开关/默认关闭
@ -64,7 +64,7 @@ spring:
# redis 配置
redis:
# 地址
host: 127.0.0.1
host: 10.0.152.244
# 端口,默认为6379
port: 6379
# 数据库索引

@ -45,7 +45,7 @@ spring:
# 国际化资源文件路径
basename: i18n/messages
profiles:
active: dev
active: pro
# 文件上传
servlet:
multipart:

@ -6,6 +6,9 @@ public class RedisConstant {
public static String redisGoods ="Goods:";
public static String redisVin ="Vin:";
//agv
public static String redisAgvAreaStatus = "AgvAreaStatus";
//PLC连接点位
public static String redisPlcListConnect ="PlcList:";

@ -26,7 +26,7 @@ public class MessageUtils {
MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
} catch (Exception e) {
// log.error("国际化出错了 = {}", e.getMessage());
log.error("国际化出错了 = {}", e.getMessage());
}
return code;
}

@ -113,10 +113,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/jmreport/**").anonymous()
.antMatchers("/**/common/**").permitAll()
/*第三方回调接口 这里修改为permitAll 目的是不管请求的时候头部是否带了token都可以请求 不然的话anonymous时如果有token但是不对会报403*/
.antMatchers("/**/third/**").permitAll()
.antMatchers("/api/**/**").permitAll()
// .antMatchers("/**/wms/**").permitAll()
.antMatchers("/wcs/**").permitAll()
.antMatchers("/agvapi/**").permitAll()
.antMatchers("/**/largeScreen/**").permitAll()
// .antMatchers("/**/system/**").permitAll()

@ -80,9 +80,6 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
List<SysDictData> dictDatas = DictUtils.getDictCache(dictType);
if (StringUtils.isNotEmpty(dictDatas)) {
for (SysDictData dictData : dictDatas) {
dictData.setDictLabel(MessageUtils.message(dictData.getDictLabel()));
}
return dictDatas;
}
dictDatas = dictDataMapper.selectDictDataByType(dictType, SecurityUtils.getCurrentBranchId());
@ -90,7 +87,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService {
if (StringUtils.isNotEmpty(dictDatas)) {
DictUtils.setDictCache(dictType, dictDatas);
for (SysDictData dictData : dictDatas) {
dictData.setDictLabel(MessageUtils.message(dictData.getDictLabel()));
dictData.setDictLabel(dictData.getDictLabel());
}
return dictDatas;
}

@ -47,7 +47,7 @@
<select id="selectDictDataByType" parameterType="SysDictData" resultMap="SysDictDataResult">
<include refid="selectDictDataVo"/>
where status = '0' and dict_type = #{dictType} and branch_id = #{branchId} order by dict_sort asc
where status = '0' and dict_type = #{dictType} order by dict_sort asc
</select>
<select id="selectDictLabel" resultType="String">

@ -0,0 +1,34 @@
package com.shkj.wcs.bo;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* agv同dps握手信息 修改
*
* @author zjx
* @date 2022-05-01
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class AGVFeedbackDepBo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 坐标
*/
private String areaInLocation;
/**
* 状态 0-无车 1-有车
*/
private int status;
}

@ -1,48 +0,0 @@
package com.shkj.wcs.bo;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* agv同dps握手信息 修改
*
* @author zjx
* @date 2022-05-01
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class AGVTaskBo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 起始点位
*/
private String tempLocation;
/**
* 起始点位
*/
private String fromLocation;
/**
* 目标点位
*/
private String toLocation;
/**
* 任务类型
*/
private int taskType;
/**
* 任务编号
*/
private Long taskId;
}

@ -2,12 +2,15 @@ package com.shkj.wcs.controller.busin;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.shkj.common.annotation.Log;
import com.shkj.common.annotation.RepeatSubmit;
import com.shkj.common.constant.RedisConstant;
import com.shkj.common.core.domain.Result;
import com.shkj.common.enums.BusinessType;
import com.shkj.common.utils.DateUtils;
import com.shkj.wcs.bo.AGVFeedbackBo;
import com.shkj.wcs.bo.AGVFeedbackDepBo;
import com.shkj.wcs.bo.ExtraData;
import com.shkj.wcs.bo.WcsRequestBo;
import com.shkj.wcs.domain.BusinDataTask;
@ -40,6 +43,7 @@ import java.util.List;
@RequiredArgsConstructor(onConstructor_ =@Autowired)
@RestController
@RequestMapping("/agvapi")
public class AgvTaskContorller {
@Autowired
@ -85,4 +89,15 @@ public class AgvTaskContorller {
return iBusinDataTaskService.rcsFeedbackTask(bo);
}
/**
* 入库存放点反馈
*/
@Log(title = "任务执行过程回馈接口",businessType = BusinessType.UPDATE)
@PostMapping("/toKjWcs/rcsFeedBackDep")
@RepeatSubmit
public RcsResponseVo rcsFeedBackDep(@RequestBody AGVFeedbackBo bo) throws JsonProcessingException {
log.info("agv入库存放点反馈数据:"+bo);
return iBusinDataTaskService.rcsFeedBackDep(bo);
}
}

@ -0,0 +1,53 @@
package com.shkj.wcs.controller.busin;
import com.shkj.common.core.controller.BaseController;
import com.shkj.common.core.domain.Result;
import com.shkj.common.core.page.TableDataInfo;
import com.shkj.wcs.service.IBusinTaskService;
import com.shkj.wcs.vo.BusinTaskVo;
import com.shkj.wms.bo.BusinTaskQueryBo;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 作业任务Controller
*
* @menu 作业任务管理
* @author lch
* @date 2023-02-27
*/
@RequiredArgsConstructor(onConstructor_ = @Autowired)
@RestController
@RequestMapping("/wms/task")
public class BusinTaskController extends BaseController {
private final IBusinTaskService iBusinTaskService;
/**
* 查询作业任务列表
*/
@GetMapping("/list")
public TableDataInfo<BusinTaskVo> list(BusinTaskQueryBo bo) {
startPage();
List<BusinTaskVo> list = iBusinTaskService.queryList(bo);
return getDataTable(list);
}
/**
* 重新下发
*
* @param taskCode
* @return {@code Result<Boolean>}
* @throws Exception 异常
*/
@PostMapping("/redistribution/{taskCode}")
public Result<Boolean> redistribution(@PathVariable("taskCode") String taskCode){
return iBusinTaskService.redistribution(taskCode);
}
}

@ -2,6 +2,7 @@ package com.shkj.wcs.controller.busin;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.shkj.common.annotation.Log;
import com.shkj.common.annotation.RepeatSubmit;
import com.shkj.common.enums.BusinessType;
@ -65,22 +66,11 @@ public class WcsTaskController {
}
@Log(title = "查询每个库区状态测试接口", businessType = BusinessType.UPDATE)
@Log(title = "查询每个库区状态测试接口")
@PostMapping("/toKjWcs/queryAreaStatus")
@RepeatSubmit
public WcsResponseVo queryAreaStatus(@RequestBody WCSQueryAreaStatusDto dto) {
//测试使用
List<WCSQueryAreaStatusBody> areaStatusBodyList = new ArrayList<>();
String[] areaCodes = {"SC-A2", "SC-B2", "SC-C2", "SC-D2"};
int[] statusValues = {0, 1, 1, 1};
for (int i = 0; i < 4; i++) {
WCSQueryAreaStatusBody queryAreaStatusBody = new WCSQueryAreaStatusBody();
queryAreaStatusBody.setAreaInLocation(areaCodes[i]);
queryAreaStatusBody.setStatus(statusValues[i]);
areaStatusBodyList.add(queryAreaStatusBody);
}
log.info("查询结果及返回结果:"+ JSONObject.toJSONString(areaStatusBodyList));
return WcsResponseVo.success(areaStatusBodyList);
public WcsResponseVo queryAreaStatus(@RequestBody WCSQueryAreaStatusDto dto) throws JsonProcessingException {
return iBusinDataTaskService.queryAreaStatus(dto);
}

@ -0,0 +1,107 @@
package com.shkj.wcs.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.shkj.common.annotation.Excel;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 作业任务对象 busin_task
*
* @author lch
* @date 2023-02-27
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
@TableName("busin_task")
public class BusinTask implements Serializable {
private static final long serialVersionUID = 1L;
/**
* $column.columnComment
*/
@TableId(value = "id", type = IdType.AUTO)
@Excel(name = "${comment}", width = 15)
private Long id;
/**
* 任务编号
*/
@Excel(name = "任务编号", width = 20)
private String taskCode;
/**
* 状态 未下发=0 执行中=1 下发成功=2 下发失败=-1
*/
@Excel(name = "状态 未下发 执行中 下发成功 下发失败", width = 20)
private String status;
/**
* 类型 入库=in 出库=out 搬运=move
*/
@Excel(name = "类型 入库 出库 搬运", width = 20)
private String type;
/**
*
*/
@Excel(name = "下发类型", width = 50)
private String way;
/**
* 异常信息
*/
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String errMsg;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Excel(name = "创建人", width = 20)
private String createBy;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Excel(name = "修改人", width = 20)
private String updateBy;
}

@ -0,0 +1,14 @@
package com.shkj.wcs.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.shkj.wcs.domain.BusinTask;
/**
* 作业任务Mapper接口
*
* @author lch
* @date 2023-02-27
*/
public interface BusinTaskMapper extends BaseMapper<BusinTask> {
}

@ -10,6 +10,7 @@ import com.shkj.common.enums.BusinessType;
import com.shkj.common.utils.DateUtils;
import com.shkj.plc.sdk.device.PlcOperate;
import com.shkj.system.service.ISysParameterService;
import com.shkj.wcs.bo.AGVFeedbackDepBo;
import com.shkj.wcs.bo.WcsPlcConnectQueryBo;
import com.shkj.wcs.domain.BusinDataTask;
import com.shkj.wcs.domain.WcsPlcConnect;
@ -104,7 +105,7 @@ public class PlcEventTask {
//输送线心跳
@Scheduled(fixedDelay = 2000)
@Scheduled(fixedDelay = 5000)
public void writePlcheartbeatDps() {
PlcOperate plcOperate = plcInit.getPlcOperate_dps();
if (plcOperate != null) {
@ -135,7 +136,7 @@ public class PlcEventTask {
}
//叠盘机心跳
@Scheduled(fixedDelay = 2000)
@Scheduled(fixedDelay = 5000)
public void writePlcheartbeatStk() {
//根据连接的plcId获取属性
PlcOperate plcOperate = plcInit.getPlcOperate_dpj();
@ -402,10 +403,6 @@ public class PlcEventTask {
Map<String, Integer> seriaMap = new HashMap<>(1);
seriaMap.put(reqInCfmSeriaVt, bCR01SeriaV);
allMap.put(reqInCfmSeria, seriaMap);
// Map<String, String> barcodMap = new HashMap<>(1);
// barcodMap.put(reqInCfmBarcod00000Vt, s1);
// allMap.put(reqInCfmBarcod, barcodMap);
//成功直行 失败回退
if (Result.isOk(vo.getHeader().getMsgCode())) {
Map<String, Integer> destMap = new HashMap<>(1);
@ -429,25 +426,26 @@ public class PlcEventTask {
body.setBussinessType(BusinTaskTypeEnum.stockOut.getValue());
body.setCreateDt(getNowDate());
//调用agv接口查询库区状态
Map<String, Object> map1 = new HashMap<>();
map1.put("areaInLocation", "SC-A2");
map1.put("status", 0);
Map<String, Object> map2 = new HashMap<>();
map2.put("areaInLocation", "SC-B2");
map2.put("status", 1);
Map<String, Object> map3 = new HashMap<>();
map3.put("areaInLocation", "SC-C2");
map3.put("status", 1);
Map<String, Object> map4 = new HashMap<>();
map4.put("areaInLocation", "SC-D2");
map4.put("status", 1);
Object[] areaStatus = new Object[]{map1, map2, map3, map4};
log.info("每个库区的状态:" + Arrays.toString(areaStatus));
body.setAreaStatus(areaStatus);
// Map<String, Object> map1 = new HashMap<>();
// map1.put("areaInLocation", "SC-A2");
// map1.put("status", 0);
//
// Map<String, Object> map2 = new HashMap<>();
// map2.put("areaInLocation", "SC-B2");
// map2.put("status", 1);
//
// Map<String, Object> map3 = new HashMap<>();
// map3.put("areaInLocation", "SC-C2");
// map3.put("status", 1);
//
// Map<String, Object> map4 = new HashMap<>();
// map4.put("areaInLocation", "SC-D2");
// map4.put("status", 1);
//
// Object[] areaStatus = new Object[]{map1, map2, map3, map4};
// log.info("每个库区的状态:" + Arrays.toString(areaStatus));
// body.setAreaStatus(areaStatus);
log.info("空托申请wz-wcs参数:"+JSONObject.toJSONString(body));
WcsResponseVo vo = wcsUtil.wcsIncomingTaskRequest(body);
log.info("空托申请wz-wcs返回:" + vo.getHeader());
Map<String, Object> allMap = new HashMap<>(1);
@ -485,27 +483,12 @@ public class PlcEventTask {
body.setTrayCode(s);
body.setCreateDt(getNowDate());
//调用agv接口查询库区状态
Map<String, Object> map1 = new HashMap<>();
map1.put("areaInLocation", "SC-A2");
map1.put("status", 0);
Map<String, Object> map2 = new HashMap<>();
map2.put("areaInLocation", "SC-B2");
map2.put("status", 1);
Map<String, Object> map3 = new HashMap<>();
map3.put("areaInLocation", "SC-C2");
map3.put("status", 1);
Map<String, Object> map4 = new HashMap<>();
map4.put("areaInLocation", "SC-D2");
map4.put("status", 1);
Object[] areaStatus = new Object[]{map1, map2, map3, map4};
log.info("每个库区的状态:" + Arrays.toString(areaStatus));
body.setAreaStatus(areaStatus);
List<AGVFeedbackDepBo> orInitializeAreaStatus = iBusinDataTaskService.getOrInitializeAreaStatus();
log.info("每个库区的状态:" + Arrays.toString(orInitializeAreaStatus.toArray()));
body.setAreaStatus(orInitializeAreaStatus.toArray());
log.info("上层实盘出口入库请求wz-wcs参数:"+JSONObject.toJSONString(body));
WcsResponseVo vo = wcsUtil.wcsIncomingTaskRequest(body);
log.info("实盘出口上报wz-wcs返回:" + vo.getHeader());
log.info("上层实盘出口入库请求wz-wcs返回:" + vo.getHeader());
Map<String, Object> allMap = new HashMap<>(1);
Map<String, Integer> seriaMap = new HashMap<>(1);
seriaMap.put(rptOutCfmSeriaVt, outSeria);
@ -523,9 +506,9 @@ public class PlcEventTask {
}
allMap.put(retOut, reqMap);
String allMapJson = JsonUtil.toJSONString(allMap);
log.info("出口上报时,给输送线写命令数据:{}", allMapJson);
log.info("上层出口上报时,给输送线写命令数据:{}", allMapJson);
Boolean rptOutBoolean = plcReadAndWrite.execWrite(plcOperate, allMapJson);
log.info("出口上报时,写入的命令返回结果:" + rptOutBoolean.toString());
log.info("上层出口上报时,写入的命令返回结果:" + rptOutBoolean.toString());
}
//实盘出口上报
@ -540,7 +523,7 @@ public class PlcEventTask {
String barcodeValueOne = Objects.toString(pointMap.get(rptOutBarcod1), "");
String s = barcodeValueOne.replaceAll("[^A-Za-z0-9]", "");
log.info("实盘出口上报时,读取的条码内容:" + s);
log.info("下层实盘出口上报时,读取的条码内容:" + s);
//调用wz-wcs接口
WcsIncomingTaskRequestBody body = new WcsIncomingTaskRequestBody();
body.setStation(MapEnum.twoUpIn.getValue());
@ -549,27 +532,12 @@ public class PlcEventTask {
body.setTrayCode(s);
body.setCreateDt(getNowDate());
//调用agv接口查询库区状态
Map<String, Object> map1 = new HashMap<>();
map1.put("areaInLocation", "SC-A2");
map1.put("status", 0);
Map<String, Object> map2 = new HashMap<>();
map2.put("areaInLocation", "SC-B2");
map2.put("status", 1);
Map<String, Object> map3 = new HashMap<>();
map3.put("areaInLocation", "SC-C2");
map3.put("status", 1);
Map<String, Object> map4 = new HashMap<>();
map4.put("areaInLocation", "SC-D2");
map4.put("status", 1);
Object[] areaStatus = new Object[]{map1, map2, map3, map4};
log.info("每个库区的状态:" + Arrays.toString(areaStatus));
body.setAreaStatus(areaStatus);
List<AGVFeedbackDepBo> orInitializeAreaStatus = iBusinDataTaskService.getOrInitializeAreaStatus();
log.info("每个库区的状态:" + Arrays.toString(orInitializeAreaStatus.toArray()));
body.setAreaStatus(orInitializeAreaStatus.toArray());
log.info("下层实盘出口入库请求wz-wcs参数:"+JSONObject.toJSONString(body));
WcsResponseVo vo = wcsUtil.wcsIncomingTaskRequest(body);
log.info("agv扫码处申请wz-wcs返回:" + vo.getHeader());
log.info("下层实盘出口入库请求wz-wcs返回:" + vo.getHeader());
Map<String, Object> allMap = new HashMap<>(1);
Map<String, Integer> seriaMap = new HashMap<>(1);
seriaMap.put(rptOutCfmSeriaVt1, outSeria);
@ -583,9 +551,9 @@ public class PlcEventTask {
}
allMap.put(retOut1, reqMap);
String allMapJson = JsonUtil.toJSONString(allMap);
log.info("出口上报时,给输送线写命令数据:{}", allMapJson);
log.info("下层出口上报时,给输送线写命令数据:{}", allMapJson);
Boolean rptOutBoolean = plcReadAndWrite.execWrite(plcOperate, allMapJson);
log.info("出口上报时,写入的命令返回结果:" + rptOutBoolean.toString());
log.info("下层出口上报时,写入的命令返回结果:" + rptOutBoolean.toString());
}
@ -806,25 +774,10 @@ public class PlcEventTask {
body.setBussinessType(BusinTaskTypeEnum.stockIn.getValue());
body.setCreateDt(getNowDate());
//调用agv接口查询库区状态
Map<String, Object> map1 = new HashMap<>();
map1.put("areaInLocation", "SC-A2");
map1.put("status", 0);
Map<String, Object> map2 = new HashMap<>();
map2.put("areaInLocation", "SC-B2");
map2.put("status", 1);
Map<String, Object> map3 = new HashMap<>();
map3.put("areaInLocation", "SC-C2");
map3.put("status", 1);
Map<String, Object> map4 = new HashMap<>();
map4.put("areaInLocation", "SC-D2");
map4.put("status", 1);
Object[] areaStatus = new Object[]{map1, map2, map3, map4};
log.info("每个库区的状态:" + Arrays.toString(areaStatus));
body.setAreaStatus(areaStatus);
List<AGVFeedbackDepBo> orInitializeAreaStatus = iBusinDataTaskService.getOrInitializeAreaStatus();
log.info("每个库区的状态:" + Arrays.toString(orInitializeAreaStatus.toArray()));
body.setAreaStatus(orInitializeAreaStatus.toArray());
log.info("叠盘机满入库任务申请WZ-WCS参数:" + body);
WcsResponseVo vo = wcsUtil.wcsIncomingTaskRequest(body);
log.info("叠盘机满入库任务申请WZ-WCS返回:" + vo.getHeader());
Map<String, Object> allMap = new HashMap<>(1);
@ -850,155 +803,105 @@ public class PlcEventTask {
//叠盘机搬运1
if (pointMap.containsKey(dpjGw1) && !pointMap.get(dpjGw1).equals("0")) {
BusinDataTask businDataTask;
boolean save = true;
Map<String, Object> allMap = new HashMap<>(1);
Map<String, Integer> reqMap = new HashMap<>(1);
LambdaQueryWrapper<BusinDataTask> lqwTask = new LambdaQueryWrapper<BusinDataTask>()
.eq(BusinDataTask::getFromSide,MapEnum.dpjGw1.getValue())
.eq(BusinDataTask::getTaskStatus,TaskStatusEnum.wait_put);
businDataTask = iBusinDataTaskService.getOne(lqwTask);
if(businDataTask != null){
log.info("还未下发的任务:"+businDataTask.getTaskCode());
}else{
String taskCode = IntIdUtil.generateIntId().toString();
businDataTask.setTaskCode(taskCode);
businDataTask.setTaskStatus(TaskStatusEnum.wait_put.getValue());
businDataTask.setTaskType(TaskTypeEnum.Carry.getValue());
businDataTask.setTaskPath(MapEnum.dpj.getValue());
businDataTask.setPriority("1");
businDataTask.setFromSide(MapEnum.dpjGw1.getValue());
businDataTask.setToSide(MapEnum.dpj.getValue());
businDataTask.setCreateTime(DateUtils.getNowDate());
businDataTask.setAgvType("B113");
save = iBusinDataTaskService.save(businDataTask);
}
if (!save) {
log.info("叠盘工位1,任务存储失败!");
reqMap.put(retDpjGw1Vt, 2);
allMap.put(retDpjGw1, reqMap);
}else{
log.info("叠盘机工位1搬运流程开始");
try {
// 检查是否有未完成的任务
BusinDataTask businDataTask = checkExistingTask(MapEnum.dpjGw1.getValue());
// 如果没有现有任务,创建新任务
if (businDataTask == null) {
businDataTask = createNewTask(MapEnum.dpjGw1.getValue());
boolean saveSuccess = iBusinDataTaskService.save(businDataTask);
if (!saveSuccess) {
handleFailure(retDpjGw1Vt, retDpjGw1, "叠盘工位1,任务存储失败!",plcReadAndWrite, plcOperate);
return;
}
}
// 下发任务到RCS
Result result = iBusinDataTaskService.rcsTaskIssued(businDataTask);
if (!Result.isOk(result)) {
log.info("叠盘工位1,给rcs下发任务失败!");
reqMap.put(retDpjGw1Vt, 2);
allMap.put(retDpjGw1, reqMap);
}else{
log.info("叠盘工位1,给rcs下发任务成功!");
reqMap.put(retDpjGw1Vt, 1);
allMap.put(retDpjGw1, reqMap);
businDataTask.setTaskStatus(TaskStatusEnum.wait_callback.getValue());
businDataTask.setTaskStarttime(DateUtils.getNowDate());
businDataTask.setUpdateTime(DateUtils.getNowDate());
iBusinDataTaskService.updateById(businDataTask);
handleFailure(retDpjGw1Vt, retDpjGw1, "叠盘工位1,给rcs下发任务失败!",plcReadAndWrite, plcOperate);
return;
}
// 任务下发成功后的处理
handleSuccess(businDataTask, retDpjGw1Vt, retDpjGw1,plcReadAndWrite, plcOperate);
} catch (Exception e) {
log.error("叠盘工位1处理过程中发生异常", e);
handleFailure(retDpjGw1Vt, retDpjGw1, "叠盘工位1,处理过程中发生异常!",plcReadAndWrite, plcOperate);
}
String allMapJson = JsonUtil.toJSONString(allMap);
log.info("叠盘工位1叠盘请求时,给输送线写命令数据:{}", allMapJson);
Boolean bCR01Boolean = plcReadAndWrite.execWrite(plcOperate, allMapJson);
log.info("叠盘工位1叠盘请求时,写入的命令返回结果:" + bCR01Boolean.toString());
}
//叠盘机搬运2
if (pointMap.containsKey(dpjGw2) && !pointMap.get(dpjGw2).equals("0")) {
BusinDataTask businDataTask;
boolean save = true;
Map<String, Object> allMap = new HashMap<>(1);
Map<String, Integer> reqMap = new HashMap<>(1);
LambdaQueryWrapper<BusinDataTask> lqwTask = new LambdaQueryWrapper<BusinDataTask>()
.eq(BusinDataTask::getFromSide,MapEnum.dpjGw2.getValue())
.eq(BusinDataTask::getTaskStatus,TaskStatusEnum.wait_put);
businDataTask = iBusinDataTaskService.getOne(lqwTask);
if(businDataTask != null){
log.info("还未下发的任务:"+businDataTask.getTaskCode());
}else{
String taskCode = IntIdUtil.generateIntId().toString();
businDataTask.setTaskCode(taskCode);
businDataTask.setTaskStatus(TaskStatusEnum.wait_put.getValue());
businDataTask.setTaskType(TaskTypeEnum.Carry.getValue());
businDataTask.setTaskPath(MapEnum.dpj.getValue());
businDataTask.setPriority("1");
businDataTask.setFromSide(MapEnum.dpjGw2.getValue());
businDataTask.setToSide(MapEnum.dpj.getValue());
businDataTask.setCreateTime(DateUtils.getNowDate());
businDataTask.setAgvType("B113");
save = iBusinDataTaskService.save(businDataTask);
}
if (!save) {
log.info("叠盘工位2,任务存储失败!");
reqMap.put(retDpjGw2Vt, 2);
allMap.put(retDpjGw2, reqMap);
}else{
log.info("叠盘机工位2搬运流程开始");
try {
// 检查是否有未完成的任务
BusinDataTask businDataTask = checkExistingTask(MapEnum.dpjGw2.getValue());
// 如果没有现有任务,创建新任务
if (businDataTask == null) {
businDataTask = createNewTask(MapEnum.dpjGw2.getValue());
boolean saveSuccess = iBusinDataTaskService.save(businDataTask);
if (!saveSuccess) {
handleFailure(retDpjGw2Vt, retDpjGw2, "叠盘工位2,任务存储失败!",plcReadAndWrite, plcOperate);
return;
}
}
// 下发任务到RCS
Result result = iBusinDataTaskService.rcsTaskIssued(businDataTask);
if (!Result.isOk(result)) {
log.info("叠盘工位2,给rcs下发任务失败!");
reqMap.put(retDpjGw2Vt, 2);
allMap.put(retDpjGw2, reqMap);
}else{
log.info("叠盘工位2,给rcs下发任务成功!");
reqMap.put(retDpjGw2Vt, 1);
allMap.put(retDpjGw2, reqMap);
businDataTask.setTaskStatus(TaskStatusEnum.wait_callback.getValue());
businDataTask.setTaskStarttime(DateUtils.getNowDate());
businDataTask.setUpdateTime(DateUtils.getNowDate());
iBusinDataTaskService.updateById(businDataTask);
handleFailure(retDpjGw2Vt, retDpjGw2, "叠盘工位2,给rcs下发任务失败!",plcReadAndWrite, plcOperate);
return;
}
// 任务下发成功后的处理
handleSuccess(businDataTask, retDpjGw2Vt, retDpjGw2,plcReadAndWrite, plcOperate);
} catch (Exception e) {
log.error("叠盘工位2处理过程中发生异常", e);
handleFailure(retDpjGw2Vt, retDpjGw2, "叠盘工位2,处理过程中发生异常!",plcReadAndWrite, plcOperate);
}
String allMapJson = JsonUtil.toJSONString(allMap);
log.info("叠盘工位2叠盘请求时,给输送线写命令数据:{}", allMapJson);
Boolean bCR01Boolean = plcReadAndWrite.execWrite(plcOperate, allMapJson);
log.info("叠盘工位2叠盘请求时,写入的命令返回结果:" + bCR01Boolean.toString());
}
//叠盘机搬运3
if (pointMap.containsKey(dpjGw3) && !pointMap.get(dpjGw3).equals("0")) {
BusinDataTask businDataTask;
boolean save = true;
Map<String, Object> allMap = new HashMap<>(1);
Map<String, Integer> reqMap = new HashMap<>(1);
LambdaQueryWrapper<BusinDataTask> lqwTask = new LambdaQueryWrapper<BusinDataTask>()
.eq(BusinDataTask::getFromSide,MapEnum.dpjGw3.getValue())
.eq(BusinDataTask::getTaskStatus,TaskStatusEnum.wait_put);
businDataTask = iBusinDataTaskService.getOne(lqwTask);
if(businDataTask != null){
log.info("还未下发的任务:"+businDataTask.getTaskCode());
}else{
String taskCode = IntIdUtil.generateIntId().toString();
businDataTask.setTaskCode(taskCode);
businDataTask.setTaskStatus(TaskStatusEnum.wait_put.getValue());
businDataTask.setTaskType(TaskTypeEnum.Carry.getValue());
businDataTask.setTaskPath(MapEnum.dpj.getValue());
businDataTask.setPriority("1");
businDataTask.setFromSide(MapEnum.dpjGw3.getValue());
businDataTask.setToSide(MapEnum.dpj.getValue());
businDataTask.setCreateTime(DateUtils.getNowDate());
businDataTask.setAgvType("B113");
save = iBusinDataTaskService.save(businDataTask);
}
if (!save) {
log.info("叠盘工位3,任务存储失败!");
reqMap.put(retDpjGw3Vt, 2);
allMap.put(retDpjGw3, reqMap);
}else{
log.info("叠盘机工位3搬运流程开始");
try {
// 检查是否有未完成的任务
BusinDataTask businDataTask = checkExistingTask(MapEnum.dpjGw3.getValue());
// 如果没有现有任务,创建新任务
if (businDataTask == null) {
businDataTask = createNewTask(MapEnum.dpjGw3.getValue());
boolean saveSuccess = iBusinDataTaskService.save(businDataTask);
if (!saveSuccess) {
handleFailure(retDpjGw3Vt, retDpjGw3, "叠盘工位2,任务存储失败!",plcReadAndWrite, plcOperate);
return;
}
}
// 下发任务到RCS
Result result = iBusinDataTaskService.rcsTaskIssued(businDataTask);
if (!Result.isOk(result)) {
log.info("叠盘工位3,给rcs下发任务失败!");
reqMap.put(retDpjGw3Vt, 2);
allMap.put(retDpjGw3, reqMap);
}else{
log.info("叠盘工位3,给rcs下发任务成功!");
reqMap.put(retDpjGw3Vt, 1);
allMap.put(retDpjGw3, reqMap);
businDataTask.setTaskStatus(TaskStatusEnum.wait_callback.getValue());
businDataTask.setTaskStarttime(DateUtils.getNowDate());
businDataTask.setUpdateTime(DateUtils.getNowDate());
iBusinDataTaskService.updateById(businDataTask);
handleFailure(retDpjGw3Vt, retDpjGw3, "叠盘工位3,给rcs下发任务失败!",plcReadAndWrite, plcOperate);
return;
}
// 任务下发成功后的处理
handleSuccess(businDataTask, retDpjGw3Vt, retDpjGw3,plcReadAndWrite, plcOperate);
} catch (Exception e) {
log.error("叠盘工位3处理过程中发生异常", e);
handleFailure(retDpjGw3Vt, retDpjGw3, "叠盘工位3,处理过程中发生异常!",plcReadAndWrite, plcOperate);
}
String allMapJson = JsonUtil.toJSONString(allMap);
log.info("叠盘工位3叠盘请求时,给输送线写命令数据:{}", allMapJson);
Boolean bCR01Boolean = plcReadAndWrite.execWrite(plcOperate, allMapJson);
log.info("叠盘工位3叠盘请求时,写入的命令返回结果:" + bCR01Boolean.toString());
}
@ -1009,6 +912,67 @@ public class PlcEventTask {
}
private BusinDataTask checkExistingTask(String fromSide) {
LambdaQueryWrapper<BusinDataTask> lqwTask = new LambdaQueryWrapper<BusinDataTask>()
.eq(BusinDataTask::getFromSide, fromSide)
.eq(BusinDataTask::getTaskStatus, TaskStatusEnum.wait_put.getValue());
BusinDataTask task = iBusinDataTaskService.getOne(lqwTask);
if (task != null) {
log.info("发现未下发的任务,任务编码:{}", task.getTaskCode());
}
return task;
}
private void handleSuccess(BusinDataTask task, String retVt, String ret,PLCReadAndWrite plcReadAndWrite, PlcOperate plcOperate) {
// 更新任务状态
task.setTaskStatus(TaskStatusEnum.wait_callback.getValue());
task.setTaskStarttime(DateUtils.getNowDate());
task.setUpdateTime(DateUtils.getNowDate());
iBusinDataTaskService.updateById(task);
// 准备成功响应
Map<String, Object> allMap = new HashMap<>();
Map<String, Integer> reqMap = new HashMap<>();
reqMap.put(retVt, 1);
allMap.put(ret, reqMap);
sendToPLC(allMap, "叠盘工位1,给rcs下发任务成功!",plcReadAndWrite,plcOperate);
}
private void sendToPLC(Map<String, Object> allMap, String logMsg,PLCReadAndWrite plcReadAndWrite, PlcOperate plcOperate) {
String allMapJson = JsonUtil.toJSONString(allMap);
log.info("{} 给输送线写命令数据:{}", logMsg, allMapJson);
Boolean writeResult = plcReadAndWrite.execWrite(plcOperate, allMapJson);
log.info("写入命令返回结果:{}", writeResult);
}
private BusinDataTask createNewTask(String fromSide) {
BusinDataTask task = new BusinDataTask();
String taskCode = IntIdUtil.generateIntId().toString();
task.setTaskCode(taskCode);
task.setTaskStatus(TaskStatusEnum.wait_put.getValue());
task.setTaskType(TaskTypeEnum.Carry.getValue());
task.setTaskPath(MapEnum.dpj.getValue());
task.setPriority("1");
task.setFromSide(fromSide);
task.setToSide(MapEnum.dpj.getValue());
task.setCreateTime(DateUtils.getNowDate());
task.setAgvType("B113");
log.info("创建新任务,任务编码:{}", taskCode);
return task;
}
private void handleFailure(String retVt, String ret, String errorMsg,PLCReadAndWrite plcReadAndWrite, PlcOperate plcOperate) {
log.warn(errorMsg);
Map<String, Object> allMap = new HashMap<>();
Map<String, Integer> reqMap = new HashMap<>();
reqMap.put(retVt, 2);
allMap.put(ret, reqMap);
sendToPLC(allMap, errorMsg,plcReadAndWrite,plcOperate);
}

@ -1,13 +1,18 @@
package com.shkj.wcs.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.shkj.common.core.domain.Result;
import com.shkj.wcs.bo.AGVFeedbackBo;
import com.shkj.wcs.bo.AGVFeedbackDepBo;
import com.shkj.wcs.domain.BusinDataTask;
import com.shkj.wcs.third.rcs.vo.RcsResponseVo;
import com.shkj.wcs.third.workbinWcs.dto.WCSQueryAreaStatusDto;
import com.shkj.wcs.third.workbinWcs.dto.WcsCreateTaskDto;
import com.shkj.wcs.vo.WcsResponseVo;
import java.util.List;
/**
* @author Comair
* @date 2025年04月18日 9:11
@ -26,6 +31,16 @@ public interface IBusinDataTaskService extends IService<BusinDataTask> {
*/
RcsResponseVo rcsFeedbackTask(AGVFeedbackBo bo);
/**
* agv存放点位反馈
* @param bo
* @return
*/
RcsResponseVo rcsFeedBackDep(AGVFeedbackBo bo) throws JsonProcessingException;
WcsResponseVo queryAreaStatus(WCSQueryAreaStatusDto dto) throws JsonProcessingException;
List<AGVFeedbackDepBo> getOrInitializeAreaStatus() throws JsonProcessingException;
/**
* agv任务下发
* @param businDataTask
@ -34,5 +49,13 @@ public interface IBusinDataTaskService extends IService<BusinDataTask> {
Result rcsTaskIssued(BusinDataTask businDataTask);
/**
* wcs任务反馈
* @param businDataTask
* @return
*/
RcsResponseVo wcsFeedbackTask(BusinDataTask businDataTask);
}

@ -0,0 +1,36 @@
package com.shkj.wcs.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.shkj.common.core.domain.Result;
import com.shkj.wcs.domain.BusinTask;
import com.shkj.wcs.vo.BusinTaskVo;
import com.shkj.wms.bo.BusinTaskQueryBo;
import java.util.List;
/**
* 作业任务Service接口
*
* @author lch
* @date 2023-02-27
*/
public interface IBusinTaskService extends IService<BusinTask> {
/**
* 查询列表
*
* @param bo
* @return
*/
List<BusinTaskVo> queryList(BusinTaskQueryBo bo);
/**
* 重新下发
* @param taskCode
* @return
*/
Result<Boolean> redistribution(String taskCode);
}

@ -3,9 +3,14 @@ package com.shkj.wcs.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.shkj.common.constant.RedisConstant;
import com.shkj.common.core.domain.Result;
import com.shkj.common.utils.DateUtils;
import com.shkj.wcs.bo.AGVFeedbackBo;
import com.shkj.wcs.bo.AGVFeedbackDepBo;
import com.shkj.wcs.bo.ExtraData;
import com.shkj.wcs.bo.WcsPlcPropertyQueryBo;
import com.shkj.wcs.domain.BusinDataTask;
@ -14,6 +19,7 @@ import com.shkj.wcs.mapper.BusinDataTaskMapper;
import com.shkj.wcs.mapper.WcsPlcPropertyMapper;
import com.shkj.wcs.plc.PlcEventTask;
import com.shkj.wcs.service.IBusinDataTaskService;
import com.shkj.wcs.service.IBusinTaskService;
import com.shkj.wcs.service.IWcsPlcPropertyService;
import com.shkj.wcs.third.rcs.CounterService;
import com.shkj.wcs.third.rcs.RCSUtil;
@ -26,10 +32,12 @@ import com.shkj.wcs.third.rcs.enums.RCSTaskTypeEnum;
import com.shkj.wcs.third.rcs.vo.RcsResponseVo;
import com.shkj.wcs.third.workbinWcs.WCSUtil;
import com.shkj.wcs.third.workbinWcs.dto.*;
import com.shkj.wcs.vo.WcsPlcConnectVo;
import com.shkj.wcs.vo.WcsResponseVo;
import com.shkj.wms.enums.MapEnum;
import com.shkj.wms.enums.TaskStatusEnum;
import com.shkj.wms.enums.TaskTypeEnum;
import com.shkj.wms.enums.WayEnum;
import com.shkj.wms.utils.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.exceptions.TooManyResultsException;
@ -38,7 +46,9 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* PLC连接属性Service业务层处理
@ -62,6 +72,13 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
@Autowired
private PlcEventTask plcEventTask;
@Resource
RedisTemplate redisTemplate;
@Autowired
IBusinTaskService iBusinTaskService;
@Override
public WcsResponseVo doTaskGeneratePickTask(WcsCreateTaskDto bo) {
if (bo != null) {
@ -81,11 +98,20 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
.eq(BusinDataTask::getContainerCode, trayCode)
.in(BusinDataTask::getTaskStatus, TaskStatusEnum.wait_put.getValue(), TaskStatusEnum.wait_callback.getValue());
BusinDataTask one = this.getOne(lqwDataTask);
LambdaQueryWrapper<BusinDataTask> lqwDataTask1 = new LambdaQueryWrapper<BusinDataTask>()
.eq(BusinDataTask::getTaskCode, taskId)
.in(BusinDataTask::getTaskStatus, TaskStatusEnum.wait_put.getValue(), TaskStatusEnum.wait_callback.getValue());
BusinDataTask one1 = this.getOne(lqwDataTask1);
if (dataChange.equals("1")) {
if (one != null) {
log.info("该托盘" + trayCode + "存在未完成的任务");
return WcsResponseVo.error(500, "该托盘" + trayCode + "存在未完成的任务");
}
if (one1 != null) {
log.info("该任务id" + taskId + "存在未完成的任务");
return WcsResponseVo.error(500, "该任务id" + taskId + "存在未完成的任务");
}
BusinDataTask businDataTask = new BusinDataTask();
businDataTask.setTaskCode(taskId);
businDataTask.setTaskType(taskType);
@ -105,6 +131,8 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
log.info("任务储存成功!");
Result result = rcsTaskIssued(businDataTask);
if (!Result.isOk(result)) {
businDataTask.setExceptionMsg(WayEnum.agv_task_put.getValue());
iBusinDataTaskService.updateById(businDataTask);
return WcsResponseVo.error(200, "接受成功但给rcs下发任务失败");
}
businDataTask.setTaskStatus(TaskStatusEnum.wait_callback.getValue());
@ -116,9 +144,9 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
return WcsResponseVo.error(200, "接受成功但给plc回传任务失败");
}
}
}else{
return WcsResponseVo.error(500, "任务存储失败");
}
return WcsResponseVo.error(500, "任务存储失败");
//任务取消
} else if (dataChange.equals("2")) {
if (one == null) {
@ -126,21 +154,17 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
}
//推送给下游
RcsCancelTaskDto rcsCancelTaskDto = new RcsCancelTaskDto();
rcsCancelTaskDto.setRobotTaskCode(taskId);
// if (one.getTaskStatus().equals(TaskStatusEnum.wait_put.getValue())) {
// //软取消
// rcsCancelTaskDto.setCancelType("CANCEL");
// } else {
//硬取消(人工介入)
if(one.getTaskStatus().equals(TaskStatusEnum.wait_callback.getValue())){
RcsCancelTaskDto rcsCancelTaskDto = new RcsCancelTaskDto();
rcsCancelTaskDto.setRobotTaskCode(taskId);
rcsCancelTaskDto.setCancelType("DROP");
// }
Result result = rcsUtil.rcsTaskCancel(rcsCancelTaskDto);
if (!Result.isOk(result)) {
return WcsResponseVo.error(500, "给rcs取消任务失败");
Result result = rcsUtil.rcsTaskCancel(rcsCancelTaskDto);
if (!Result.isOk(result)) {
one.setExceptionMsg(WayEnum.agv_task_cancel.getValue());
return WcsResponseVo.error(500, "给rcs取消任务失败");
}
}
one.setTaskStatus("3");
one.setTaskStatus(TaskStatusEnum.clean.getValue());
this.updateById(one);
}
return WcsResponseVo.success();
@ -160,6 +184,9 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
String carrierCode = values.getCarrierCode();
String method = values.getMethod();
String slotName = values.getSlotName();
if (slotName.equals("0187000XY0234215")) {
slotName = "SC-G2-00-00-43022";
}
LambdaQueryWrapper<BusinDataTask> queryWrapper = new LambdaQueryWrapper<BusinDataTask>()
.eq(BusinDataTask::getTaskCode, robotTaskCode);
// .eq(BusinDataTask::getContainerCode, carrierCode);
@ -184,72 +211,36 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
return RcsResponseVo.error("任务状态更新失败");
}
log.info("agv任务状态更新成功,任务号:{}", robotTaskCode);
if(!businDataTask.getTaskType().equals(TaskTypeEnum.Out.getValue())){
switch (method) {
case "start":
businDataTask.setTaskStarttime(new Date());
businDataTask.setTaskStatus(TaskStatusEnum.wait_callback.getValue());
break;
case "outbin":
businDataTask.setTaskStatus(TaskStatusEnum.wait_callback.getValue());
break;
case "end":
businDataTask.setTaskStatus(TaskStatusEnum.finished.getValue());
businDataTask.setDestination(slotName);
businDataTask.setTaskEntime(new Date());
break;
case "cancel":
businDataTask.setTaskStatus(TaskStatusEnum.clean.getValue());
businDataTask.setDestination(slotName);
break;
default:
return RcsResponseVo.error("任务状态未知!");
}
boolean bool = iBusinDataTaskService.updateById(businDataTask);
if (!bool) {
log.error("总任务状态更新失败,任务号:{}", robotTaskCode);
return RcsResponseVo.error("总任务状态更新失败");
}
log.info("总任务状态更新成功,任务号:{}", robotTaskCode);
UploadWCSTaskStatusDto uploadWCSTaskStatusDto = new UploadWCSTaskStatusDto();
WcsCreateTaskHeader header = new WcsCreateTaskHeader();
String taskType = businDataTask.getTaskType();
switch (taskType) {
case "1":
header.setBusinessType("stockOutReturn");
if (!businDataTask.getToSide().equals(MapEnum.oneOut.getValue())) {
switch (method) {
case "start":
businDataTask.setTaskStarttime(new Date());
businDataTask.setTaskStatus(TaskStatusEnum.wait_callback.getValue());
break;
case "2":
header.setBusinessType("stockInReturn");
case "outbin":
businDataTask.setTaskStatus(TaskStatusEnum.wait_callback.getValue());
break;
case "3":
header.setBusinessType("transferReturn");
case "end":
businDataTask.setTaskStatus(TaskStatusEnum.finished.getValue());
businDataTask.setDestination(slotName);
businDataTask.setTaskEntime(new Date());
break;
case "cancel":
businDataTask.setTaskStatus(TaskStatusEnum.clean.getValue());
businDataTask.setDestination(slotName);
break;
default:
return RcsResponseVo.error("未知任务类型!");
return RcsResponseVo.error("任务状态未知!");
}
uploadWCSTaskStatusDto.setHeader(header);
UploadWCSTaskStatusBody body = new UploadWCSTaskStatusBody();
List<UploadWCSTaskStatusBody> bodyList = new ArrayList<>();
body.setTaskId(businDataTask.getTaskCode());
body.setTrayCode(carrierCode);
body.setTaskType(taskType);
body.setStatus(businDataTask.getTaskStatus());
// if (businDataTask.getTaskStatus().equals(TaskStatusEnum.finished.getValue())) {
if(slotName.equals("0187000XY0234215")){
slotName = "SC-G2-00-00-43022";
boolean bool = iBusinDataTaskService.updateById(businDataTask);
if (!bool) {
log.error("总任务状态更新失败,任务号:{}", robotTaskCode);
return RcsResponseVo.error("总任务状态更新失败");
}
body.setDestination(slotName);
// }
body.setMsgCode("200");
bodyList.add(body);
uploadWCSTaskStatusDto.setBody(bodyList);
log.info("请求zk-wcs参数{}", JSONObject.toJSONString(uploadWCSTaskStatusDto));
try {
WcsResponseVo vo = wcsUtil.uploadWCSTaskStatus(uploadWCSTaskStatusDto);
log.info("WZ-WCS状态上报反馈:"+ JSONObject.toJSONString(vo));
} catch (TooManyResultsException e) {
log.error("WZ-WCS状态上报异常,任务号:{}", robotTaskCode, e);
return RcsResponseVo.error("KJ-WCS状态上报异常");
log.info("总任务状态更新成功,任务号:{}", robotTaskCode);
if(!method.equals("start")){
RcsResponseVo rcsResponseVo = wcsFeedbackTask(businDataTask);
return rcsResponseVo;
}
}
@ -257,6 +248,105 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
return RcsResponseVo.success(new JSONObject().fluentPut("data", robotTaskCode));
}
@Override
public RcsResponseVo rcsFeedBackDep(AGVFeedbackBo bo) {
try {
// 从Redis获取数据并转换
List<AGVFeedbackDepBo> agvAreaStatus = getOrInitializeAreaStatus();
// 记录当前状态
logCurrentStatus(agvAreaStatus);
// 处理本次修改状态
processFeedback(bo, agvAreaStatus);
// 更新Redis数据
updateRedisStatus(agvAreaStatus);
return RcsResponseVo.success();
} catch (JsonProcessingException e) {
log.error("JSON处理异常", e);
return RcsResponseVo.error("数据处理失败");
} catch (Exception e) {
log.error("处理AGV反馈异常", e);
return RcsResponseVo.error("系统异常");
}
}
@Override
public WcsResponseVo queryAreaStatus(WCSQueryAreaStatusDto dto) throws JsonProcessingException {
List<AGVFeedbackDepBo> orInitializeAreaStatus = getOrInitializeAreaStatus();
return WcsResponseVo.success(orInitializeAreaStatus);
}
@Override
public List<AGVFeedbackDepBo> getOrInitializeAreaStatus() throws JsonProcessingException {
Object redisData = redisTemplate.opsForValue().get(RedisConstant.redisAgvAreaStatus);
if (redisData instanceof String) {
// 处理JSON字符串
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue((String) redisData, new TypeReference<List<AGVFeedbackDepBo>>() {});
} else if (redisData instanceof List && !((List<?>) redisData).isEmpty()) {
// 处理直接存储List
return ((List<?>) redisData).stream()
.filter(AGVFeedbackDepBo.class::isInstance)
.map(AGVFeedbackDepBo.class::cast)
.collect(Collectors.toList());
}
// 初始化默认状态
return initializeDefaultAreaStatus();
}
private List<AGVFeedbackDepBo> initializeDefaultAreaStatus() {
List<AGVFeedbackDepBo> defaultStatus = new ArrayList<>();
String[] locations = {"SC-A2", "SC-B2", "SC-C2", "SC-D2"};
for (String location : locations) {
AGVFeedbackDepBo status = new AGVFeedbackDepBo();
status.setAreaInLocation(location);
status.setStatus(0);
defaultStatus.add(status);
}
return defaultStatus;
}
private void logCurrentStatus(List<AGVFeedbackDepBo> agvAreaStatus) {
if (log.isInfoEnabled()) {
log.info("当前AGV入库储存点位状态:{}", agvAreaStatus.stream()
.map(s -> s.getAreaInLocation() + "=" + s.getStatus())
.collect(Collectors.joining(", ")));
}
}
private void processFeedback(AGVFeedbackBo bo, List<AGVFeedbackDepBo> agvAreaStatus) {
String slotName = bo.getExtra().getValues().getSlotName();
String method = bo.getExtra().getValues().getMethod();
int status = "inbin".equals(method) ? 1 : 0;
agvAreaStatus.stream()
.filter(s -> s.getAreaInLocation().equals(slotName))
.findFirst()
.ifPresent(s -> {
s.setStatus(status);
log.info("更新存放点位:{} 状态为:{}", slotName, status);
});
}
private void updateRedisStatus(List<AGVFeedbackDepBo> agvAreaStatus) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(agvAreaStatus);
redisTemplate.opsForValue().set(RedisConstant.redisAgvAreaStatus, json);
if (log.isInfoEnabled()) {
log.info("更新后的点位状态:{}", json);
}
}
@Override
public Result rcsTaskIssued(BusinDataTask businDataTask) {
String toSide = businDataTask.getToSide();
@ -277,7 +367,7 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
rcsIdList.setOperation(RCSOperation.OT_COLLECT.getValue());
} else {
rcsIdList.setSeq(1);
if(toSide.equals(MapEnum.oneOut.getValue())){
if (toSide.equals(MapEnum.oneOut.getValue())) {
toSide = MapEnum.twoDownIn.getValue();
}
rcsIdList.setCode(toSide);
@ -291,8 +381,10 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
String substring = toSide.substring(4, 5);
int number = Integer.parseInt(substring);
int carrierCode = 0;
if(number ==2){
if (number == 2) {
carrierCode = CounterService.incrementAndGet(2);
} else if (number == 3) {
carrierCode = CounterService.incrementAndGet(3);
}
carrierInfoList.setCarrierCode(String.valueOf(carrierCode));
@ -303,7 +395,58 @@ public class BusinDataTaskServiceImpl extends ServiceImpl<BusinDataTaskMapper, B
Map<String, Object> extra = new HashMap<>();
extra.put("carrierInfo", carrierInfoLists);
rcsCreateTaskDto.setExtra(extra);
return rcsUtil.rcsCreateTask(rcsCreateTaskDto);
return rcsUtil.rcsCreateTask(rcsCreateTaskDto);
}
@Override
public RcsResponseVo wcsFeedbackTask(BusinDataTask businDataTask) {
UploadWCSTaskStatusDto uploadWCSTaskStatusDto = new UploadWCSTaskStatusDto();
WcsCreateTaskHeader header = new WcsCreateTaskHeader();
String taskType = businDataTask.getTaskType();
switch (taskType) {
case "1":
header.setBusinessType("stockOutReturn");
break;
case "2":
header.setBusinessType("stockInReturn");
break;
case "3":
header.setBusinessType("transferReturn");
break;
default:
return RcsResponseVo.error("未知任务类型!");
}
uploadWCSTaskStatusDto.setHeader(header);
UploadWCSTaskStatusBody body = new UploadWCSTaskStatusBody();
List<UploadWCSTaskStatusBody> bodyList = new ArrayList<>();
body.setTaskId(businDataTask.getTaskCode());
body.setTrayCode(businDataTask.getContainerCode());
body.setTaskType(taskType);
body.setStatus(businDataTask.getTaskStatus());
// if (businDataTask.getTaskStatus().equals(TaskStatusEnum.finished.getValue())) {
body.setDestination(businDataTask.getDestination());
// }
body.setMsgCode(String.valueOf(Result.ok().getCode()));
bodyList.add(body);
uploadWCSTaskStatusDto.setBody(bodyList);
log.info("请求zk-wcs参数{}", JSONObject.toJSONString(uploadWCSTaskStatusDto));
String message = "";
try {
WcsResponseVo vo = wcsUtil.uploadWCSTaskStatus(uploadWCSTaskStatusDto);
log.info("WZ-WCS状态上报反馈:" + JSONObject.toJSONString(vo));
message = vo.getHeader().getMessage();
if(!vo.getHeader().getMsgCode().equals(Result.ok().getCode())){
businDataTask.setExceptionMsg(WayEnum.wcs_feedback.getValue());
iBusinDataTaskService.updateById(businDataTask);
return RcsResponseVo.error("KJ-WCS状态上报异常");
}
} catch (TooManyResultsException e) {
businDataTask.setExceptionMsg(WayEnum.wcs_feedback.getValue());
iBusinDataTaskService.updateById(businDataTask);
return RcsResponseVo.error("KJ-WCS状态上报异常");
}
return RcsResponseVo.success();
}

@ -0,0 +1,117 @@
package com.shkj.wcs.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.shkj.common.core.domain.Result;
import com.shkj.common.utils.DateUtils;
import com.shkj.wcs.domain.BusinDataTask;
import com.shkj.wcs.domain.BusinTask;
import com.shkj.wcs.mapper.BusinTaskMapper;
import com.shkj.wcs.service.IBusinDataTaskService;
import com.shkj.wcs.service.IBusinTaskService;
import com.shkj.wcs.third.rcs.vo.RcsResponseVo;
import com.shkj.wcs.vo.BusinTaskVo;
import com.shkj.wms.bo.BusinTaskQueryBo;
import com.shkj.wms.enums.TaskStatusEnum;
import com.shkj.wms.enums.WayEnum;
import com.shkj.wms.service.ISysThirdExceptionRequestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
/**
* 作业任务Service业务层处理
*
* @author lch
* @date 2023-02-27
*/
@Slf4j
@Service
public class BusinTaskServiceImpl extends ServiceImpl<BusinTaskMapper, BusinTask> implements IBusinTaskService {
@Autowired
private IBusinDataTaskService iBusinDataTaskService;
@Override
public List<BusinTaskVo> queryList(BusinTaskQueryBo bo) {
LambdaQueryWrapper<BusinDataTask> lqw = Wrappers.lambdaQuery();
lqw.eq(StrUtil.isNotBlank(bo.getTaskCode()), BusinDataTask::getTaskCode, bo.getTaskCode());
lqw.eq(StrUtil.isNotBlank(bo.getTaskStatus()), BusinDataTask::getTaskStatus, bo.getTaskStatus());
lqw.eq(StrUtil.isNotBlank(bo.getTaskType()), BusinDataTask::getTaskType, bo.getTaskType());
lqw.eq(StrUtil.isNotBlank(bo.getContainerCode()), BusinDataTask::getContainerCode, bo.getContainerCode());
lqw.ge(bo.getBeginDate() != null, BusinDataTask::getCreateTime, bo.getBeginDate());
lqw.orderByDesc(BusinDataTask::getCreateTime);
List<BusinTaskVo> voList = entity2Vo(iBusinDataTaskService.list(lqw));
return voList;
}
@Override
public Result<Boolean> redistribution(String taskCode) {
LambdaQueryWrapper<BusinDataTask> eq = new LambdaQueryWrapper<BusinDataTask>()
.eq(BusinDataTask::getTaskCode, taskCode);
BusinDataTask dataTask = iBusinDataTaskService.getOne(eq);
if (dataTask == null) {
return Result.err().msg("未查询到该任务信息");
}
if (dataTask.getExceptionMsg().isEmpty() || dataTask.getExceptionMsg().equals("5")) {
return Result.err().msg("只有任务异常才能重复推送");
}
if(dataTask.getExceptionMsg().equals(WayEnum.agv_task_put.getValue())){
Result result = iBusinDataTaskService.rcsTaskIssued(dataTask);
if (Result.isOk(result)){
dataTask.setExceptionMsg(WayEnum.re_push.getValue());
iBusinDataTaskService.updateById(dataTask);
}
return result;
}else if(dataTask.getExceptionMsg().equals(WayEnum.wcs_feedback.getValue())){
RcsResponseVo rcsResponseVo = iBusinDataTaskService.wcsFeedbackTask(dataTask);
if(rcsResponseVo.getCode().equals("SUCCESS")){
dataTask.setExceptionMsg(WayEnum.re_push.getValue());
iBusinDataTaskService.updateById(dataTask);
}else{
return Result.err().msg(rcsResponseVo.getMessage());
}
}
return Result.ok();
}
/**
* 实体类转化成视图对象
*
* @param collection 实体类集合
* @return
*/
private List<BusinTaskVo> entity2Vo(Collection<BusinDataTask> collection) {
List<BusinTaskVo> voList = collection.stream()
.map(any -> BeanUtil.toBean(any, BusinTaskVo.class))
.collect(Collectors.toList());
if (collection instanceof Page) {
Page<BusinDataTask> page = (Page<BusinDataTask>) collection;
Page<BusinTaskVo> pageVo = new Page<>();
BeanUtil.copyProperties(page, pageVo);
pageVo.addAll(voList);
voList = pageVo;
}
return voList;
}
}

@ -2,36 +2,16 @@ package com.shkj.wcs.third.workbinWcs;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import com.shkj.common.constant.RedisConstant;
import com.shkj.common.core.domain.Result;
import com.shkj.system.service.ISysParameterService;
import com.shkj.wcs.bo.AGVStatesBo;
import com.shkj.wcs.bo.AGVUploadStatusBo;
import com.shkj.wcs.domain.WcsPlcConnect;
import com.shkj.wcs.domain.WcsPlcProperty;
import com.shkj.wcs.mapper.BusinDataTaskMapper;
import com.shkj.wcs.plc.PlcInit;
import com.shkj.wcs.service.IWcsPlcConnectService;
import com.shkj.wcs.service.IWcsPlcPropertyService;
import com.shkj.wcs.third.rcs.dto.RcsCancelTaskDto;
import com.shkj.wcs.third.rcs.dto.RcsCreateTaskDto;
import com.shkj.wcs.third.rcs.dto.RcsIdList;
import com.shkj.wcs.third.rcs.dto.RcsThirdResult;
import com.shkj.wcs.third.workbinWcs.dto.*;
import com.shkj.wcs.vo.WcsResponseVo;
import com.shkj.wms.bo.AGVMoveBo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* AGV 接口文档
@ -129,23 +109,27 @@ public class WCSUtil {
public WcsResponseVo wcsIncomingTaskRequest(WcsIncomingTaskRequestBody body) {
JSONObject jsonObject = new JSONObject();
JSONObject header = new JSONObject();
header.put("businessType",body.getBussinessType());
String bussinessType = body.getBussinessType();
header.put("businessType",bussinessType);
jsonObject.put("header",header);
List<WcsIncomingTaskRequestBody> incomingTaskRequestBodies = new ArrayList<>();
incomingTaskRequestBodies.add(body);
jsonObject.put("body",incomingTaskRequestBodies);
String json = JSONObject.toJSONString(jsonObject);
log.info("KJ向WZ入库申请参数"+json);
String type = "入库";
if(bussinessType.equals("stockOut")){
type= "呼叫空托";
}
log.info("KJ向WZ{}申请参数{}",type,json);
try {
String res = HttpRequest.post(wcsIncomingTaskRequestUrl)
.body(json)
.execute().body();
log.info("KJ向WZ入库申请返回:" + res);
log.info("KJ向WZ{}申请返回:{}",type,res);
return parseThirdRcsResult(res);
} catch (Exception e) {
e.printStackTrace();
log.error("KJ向WZ入库申请 方法出错了 = {}", e.getMessage());
log.error("KJ向WZ{}申请 方法出错了 = {}",type, e.getMessage());
return WcsResponseVo.error(500,e.getMessage());
}
}

@ -0,0 +1,18 @@
package com.shkj.wcs.vo;
import com.shkj.wcs.domain.BusinDataTask;
import com.shkj.wcs.domain.BusinTask;
import lombok.Data;
/**
* 作业任务视图对象
*
* @author lch
* @date 2023-02-27
*/
@Data
public class BusinTaskVo extends BusinDataTask {
private static final long serialVersionUID = 1L;
}

@ -28,12 +28,22 @@ public class BusinTaskQueryBo implements Serializable {
private String isAsc;
/** 开始时间 */
private String taskSDate;
/**
* 开始日期 格式 YY-MM-dd
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private Date beginDate;
/** 结束时间 */
private String taskEDate;
/** 托盘编号*/
private String containerCode;
private String taskCode;
private String taskStatus;
private String taskType;
}

@ -24,12 +24,8 @@ public enum TaskStatusEnum {
* 完成
*/
finished("3", "完成"),
/**
* 异常
*/
err("-1", "AGV下发异常"),
clean("6","已取消"),
clean("4","已取消"),
;
private String value;

@ -0,0 +1,38 @@
package com.shkj.wms.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author lch
*/
@Getter
@AllArgsConstructor
public enum WayEnum {
/**
* agv任务未下发
*/
agv_task_put("1", "agv任务下发失败"),
/**
* wcs反馈失败
*/
wcs_feedback("2", "wcs反馈失败"),
/**
* agv任务取消失败
*/
agv_task_cancel("3", "agv任务取消失败"),
/**
* 已重新推送
*/
re_push("5", "已重新推送"),
;
private String value;
private String desc;
}
Loading…
Cancel
Save