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 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 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 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 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); } } }