package com.zy.asrs.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.core.common.Cools;
|
import com.core.common.R;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.domain.enums.TaskStatusType;
|
import com.zy.asrs.domain.enums.WorkNoType;
|
import com.zy.asrs.entity.LocMast;
|
import com.zy.asrs.entity.StaDesc;
|
import com.zy.asrs.mapper.TaskWrkMapper;
|
import com.zy.asrs.entity.TaskWrk;
|
import com.zy.asrs.service.ApiLogService;
|
import com.zy.asrs.service.LocMastService;
|
import com.zy.asrs.service.StaDescService;
|
import com.zy.asrs.service.TaskWrkService;
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
import com.zy.asrs.utils.CommandUtils;
|
import com.zy.asrs.utils.Utils;
|
import com.zy.common.service.CommonService;
|
import com.zy.common.utils.HttpHandler;
|
import com.zy.core.DevpThread;
|
import com.zy.core.cache.SlaveConnection;
|
import com.zy.core.enums.CrnTaskModeType;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.CrnSlave;
|
import com.zy.core.model.Task;
|
import com.zy.core.model.command.CrnCommand;
|
import com.zy.core.model.protocol.StaProtocol;
|
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.Propagation;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
|
@Slf4j
|
@Service("taskWrkService")
|
public class TaskWrkServiceImpl extends ServiceImpl<TaskWrkMapper, TaskWrk> implements TaskWrkService {
|
|
@Autowired
|
private CommonService commonService;
|
@Autowired
|
private StaDescService staDescService;
|
@Value("${wms.url}")
|
private String wmsUrl;
|
@Value("${wms.taskStatusFeedbackPath}")
|
private String taskStatusFeedbackPath;
|
@Autowired
|
private ApiLogService apiLogService;
|
@Autowired
|
private LocMastService locMastService;
|
@Autowired
|
private TaskWrkService taskWrkService;
|
|
@Override
|
public TaskWrk selectByTaskNo(String taskNo) {
|
return this.baseMapper.selectByTaskNo(taskNo);
|
}
|
|
@Override
|
public TaskWrk selectByStartPoint(String taskNo) {
|
return this.baseMapper.selectByStartPoint(taskNo);
|
}
|
|
@Override
|
public TaskWrk selectByWrkNo(Integer wrkNo) {
|
return this.baseMapper.selectByWrkNo(wrkNo);
|
}
|
|
@Override
|
public List<TaskWrk> selectReceive() {
|
return this.baseMapper.selectReceive();
|
}
|
|
@Override
|
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
public void distribute(String taskNo, Long userId) {
|
|
}
|
|
@Override
|
public void startup(TaskWrk taskWrk, Long userId) {
|
|
//入库任务派发
|
StaDesc staDesc = staDescService.queryCrn(taskWrk.getIoType(), Integer.parseInt(taskWrk.getStartPoint()), taskWrk.getCrnNo());
|
if (staDesc == null) {
|
throw new CoolException("入库路径不存在");
|
}
|
int workNo = commonService.getWorkNo(WorkNoType.PAKIN.type);//获取入库工作号
|
taskWrk.setWrkNo(workNo);//工作号
|
taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态
|
taskWrk.setAssignTime(new Date());//派发时间
|
taskWrk.setWrkSts(3);//工作状态 2.吊车入库
|
taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号
|
taskWrk.setModiTime(new Date());
|
taskWrk.setModiUser(userId);
|
updateById(taskWrk);
|
|
CrnSlave.CrnStn crnStn = Utils.getCrnStnByStaNo(staDesc.getCrnStn(), true);
|
if (crnStn == null) {
|
throw new CoolException("堆垛机入库站不存在");
|
}
|
// 命令下发区 --------------------------------------------------------------------------
|
CrnCommand crnCommand = new CrnCommand();
|
crnCommand.setCrnNo(staDesc.getCrnNo()); // 堆垛机编号
|
crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
|
crnCommand.setAckFinish((short) 0); // 任务完成确认位
|
crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转
|
crnCommand.setSourcePosX(crnStn.getRow().shortValue()); // 源库位列
|
crnCommand.setSourcePosY(crnStn.getBay().shortValue()); // 源库位层
|
crnCommand.setSourcePosZ(crnStn.getLev().shortValue()); // 源库位排
|
crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位列
|
crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位层
|
crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位排
|
crnCommand.setCommand((short)1);
|
if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(5, crnCommand),false)) {
|
log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
|
throw new CoolException("堆垛机命令生成失败");
|
}else{
|
try{
|
HashMap<String, Object> headParam = new HashMap<>();
|
headParam.put("taskNo",taskWrk.getTaskNo());
|
headParam.put("status",taskWrk.getStatus());
|
headParam.put("ioType",taskWrk.getIoType());
|
headParam.put("barcode",taskWrk.getBarcode());
|
// headParam.put("reportTime",new Date());
|
String response;
|
response = new HttpHandler.Builder()
|
// .setHeaders(headParam)
|
.setUri(wmsUrl)
|
.setPath(taskStatusFeedbackPath)
|
.setJson(JSON.toJSONString(headParam))
|
.build()
|
.doPost();
|
|
JSONObject jsonObject = JSON.parseObject(response);
|
apiLogService.save("wcs派发入库任务上报wms"
|
,wmsUrl+taskStatusFeedbackPath
|
,null
|
,"127.0.0.1"
|
,JSON.toJSONString(headParam)
|
,response
|
,true
|
);
|
}catch (Exception e){
|
log.error("wcs派发入库任务上报wms失败", taskWrk);
|
// throw new CoolException("wcs派发入库任务上报wms失败");
|
}
|
|
}
|
}
|
|
@Override
|
public void stockOut(TaskWrk taskWrk, Long userId) {
|
//出库任务派发
|
StaDesc staDesc = staDescService.queryCrn(taskWrk.getIoType(), Integer.parseInt(taskWrk.getTargetPoint()), taskWrk.getCrnNo());
|
if (staDesc == null) {
|
return;//不存在路径
|
}
|
int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);//获取出库工作号
|
taskWrk.setWrkNo(workNo);//工作号
|
taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态
|
taskWrk.setAssignTime(new Date());//派发时间
|
taskWrk.setWrkSts(12);//工作状态 12.吊车入库中
|
taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号
|
taskWrk.setModiTime(new Date());
|
taskWrk.setModiUser(userId);
|
updateById(taskWrk);
|
|
CrnSlave.CrnStn crnStn = Utils.getCrnStnByStaNo(staDesc.getCrnStn(), false);
|
if (crnStn == null) {
|
throw new CoolException("堆垛机出库站不存在");
|
}
|
//生成堆垛机出库命令
|
CrnCommand crnCommand = new CrnCommand();
|
crnCommand.setCrnNo(taskWrk.getCrnNo()); // 堆垛机编号
|
crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
|
crnCommand.setAckFinish((short) 0); // 任务完成确认位
|
crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转
|
crnCommand.setSourcePosX(Utils.getBayShort(taskWrk.getStartPoint())); // 源库位排
|
crnCommand.setSourcePosY(Utils.getLevShort(taskWrk.getStartPoint())); // 源库位列
|
crnCommand.setSourcePosZ(Utils.getRowShort(taskWrk.getStartPoint())); // 源库位层
|
crnCommand.setDestinationPosX(crnStn.getBay().shortValue()); // 目标库位排
|
crnCommand.setDestinationPosY(crnStn.getLev().shortValue()); // 目标库位列
|
crnCommand.setDestinationPosZ(crnStn.getRow().shortValue()); // 目标库位层
|
crnCommand.setCommand((short)1);
|
if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(5, crnCommand))) {
|
log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
|
throw new CoolException("堆垛机命令生成失败");
|
}
|
|
//生成输送线命令
|
DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
|
StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone();
|
staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
|
staProtocol.setStaNo((short) Integer.parseInt(taskWrk.getTargetPoint()));
|
if (!CommandUtils.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(3, staProtocol))) {
|
log.error("输送线命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
|
throw new CoolException("输送线命令生成失败");
|
}
|
}
|
|
@Override
|
public void locMove(TaskWrk taskWrk, Long userId) {
|
//库格移载任务派发
|
if (Cools.isEmpty(taskWrk.getTargetPoint())){
|
return;
|
}
|
int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);//获取工作号
|
taskWrk.setWrkNo(workNo);//工作号
|
taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态
|
taskWrk.setAssignTime(new Date());//派发时间
|
taskWrk.setWrkSts(11);//工作状态 11.生成出库ID
|
//taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号
|
taskWrk.setModiTime(new Date());
|
taskWrk.setModiUser(userId);
|
updateById(taskWrk);
|
}
|
|
@Override
|
public List<TaskWrk> selectToBeHistoryData() {
|
return this.baseMapper.selectToBeHistoryData();
|
}
|
|
@Override
|
public int saveToHistory(String taskNo) {
|
return this.baseMapper.saveToHistory(taskNo);
|
}
|
|
@Override
|
public R taskComplete(TaskWrk taskWrk) {
|
LocMast locMast = new LocMast();
|
switch (taskWrk.getIoType()) {
|
//入库
|
case 1:
|
taskWrk.setModiTime(new Date());
|
taskWrk.setWrkSts(6);//入库完成--准备上报wms
|
locMast = locMastService.selectByLocNo(taskWrk.getOriginTargetPoint());
|
if (locMast == null) {
|
return R.error("没有找到该库位="+taskWrk.getOriginTargetPoint());
|
}
|
locMast.setLocSts("F");
|
locMastService.updateById(locMast);
|
break;
|
//出库
|
case 2:
|
if(taskWrk.getWrkSts()>=15){
|
return R.ok();
|
}
|
taskWrk.setModiTime(new Date());
|
taskWrk.setWrkSts(15);//RCS出库完成--》写入输送线工作号
|
locMast = locMastService.selectByLocNo(taskWrk.getOriginStartPoint());
|
if (locMast == null) {
|
return R.error("没有找到该库位="+taskWrk.getOriginStartPoint());
|
}
|
locMast.setLocSts("O");
|
locMastService.updateById(locMast);
|
log.info("RCS出库任务完成更新WCS任务状态={}",taskWrk);
|
break;
|
//移库
|
// case 3:
|
// taskWrk.setModiTime(new Date());
|
// taskWrk.setWrkSts(6);//入库完成--准备上报wms
|
// //源库位
|
// locMast = locMastService.selectByLocNo(taskWrk.getOriginTargetPoint());
|
// if (locMast == null) {
|
// return R.error("没有找到该库位="+taskWrk.getOriginTargetPoint());
|
// }
|
// locMast.setLocSts("F");
|
// locMastService.updateById(locMast);
|
// //目标库位
|
// locMast = locMastService.selectByLocNo(taskWrk.getOriginStartPoint());
|
// if (locMast == null) {
|
// return R.error("没有找到该库位="+taskWrk.getOriginStartPoint());
|
// }
|
// locMast.setLocSts("0");
|
// locMastService.updateById(locMast);
|
// return R.ok();
|
//
|
}
|
if(taskWrkService.updateById(taskWrk)){
|
return R.ok();
|
}else {
|
return R.error("RCS任务上报完成更新WCS任务状态失败"+taskWrk);
|
}
|
|
}
|
}
|