|  |  |  | 
|---|
|  |  |  | import com.core.common.R; | 
|---|
|  |  |  | import com.core.exception.CoolException; | 
|---|
|  |  |  | import com.zy.asrs.controller.CrnController; | 
|---|
|  |  |  | import com.zy.asrs.controller.OpenController; | 
|---|
|  |  |  | import com.zy.asrs.controller.SiteController; | 
|---|
|  |  |  | import com.zy.asrs.domain.enums.TaskStatusType; | 
|---|
|  |  |  | import com.zy.asrs.domain.enums.WorkNoType; | 
|---|
|  |  |  | 
|---|
|  |  |  | import com.zy.asrs.entity.*; | 
|---|
|  |  |  | import com.zy.asrs.entity.param.Result; | 
|---|
|  |  |  | import com.zy.asrs.entity.param.StorageEscalationParam; | 
|---|
|  |  |  | import com.zy.asrs.entity.param.TaskOverToWms; | 
|---|
|  |  |  | import com.zy.asrs.mapper.*; | 
|---|
|  |  |  | import com.zy.asrs.service.*; | 
|---|
|  |  |  | import com.zy.asrs.utils.CommandUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  | import com.zy.core.model.CrnSlave; | 
|---|
|  |  |  | import com.zy.core.model.DevpSlave; | 
|---|
|  |  |  | import com.zy.core.model.Task; | 
|---|
|  |  |  | import com.zy.core.model.command.CommandPackage; | 
|---|
|  |  |  | import com.zy.core.model.command.CrnCommand; | 
|---|
|  |  |  | import com.zy.core.model.protocol.CrnProtocol; | 
|---|
|  |  |  | import com.zy.core.model.protocol.StaProtocol; | 
|---|
|  |  |  | import com.zy.core.properties.SlaveProperties; | 
|---|
|  |  |  | import com.zy.core.thread.BarcodeThread; | 
|---|
|  |  |  | import com.zy.core.thread.SiemensDevpThread; | 
|---|
|  |  |  | import com.zy.system.entity.Config; | 
|---|
|  |  |  | import com.zy.system.service.ConfigService; | 
|---|
|  |  |  | import lombok.Synchronized; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Value; | 
|---|
|  |  |  | import org.springframework.scheduling.annotation.Async; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  | import org.springframework.transaction.interceptor.TransactionAspectSupport; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.io.IOException; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | import java.util.concurrent.CompletableFuture; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 立体仓库WCS系统主流程业务 | 
|---|
|  |  |  | 
|---|
|  |  |  | private CrnController crnController; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private SiteController siteController; | 
|---|
|  |  |  | @Synchronized | 
|---|
|  |  |  | public void shiftTargetToCyclePoint() throws IOException, InterruptedException { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | for (DevpSlave devp : slaveProperties.getDevp()) { | 
|---|
|  |  |  | for (DevpSlave.Sta outSta : devp.getOutSta()) { | 
|---|
|  |  |  | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
|---|
|  |  |  | if (devpThread == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | StaProtocol staProtocol = getClonedStation(devpThread, outSta.getStaNo()); | 
|---|
|  |  |  | if (staProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取其他相关站点 | 
|---|
|  |  |  | StaProtocol staProtocol1 = getClonedStation(devpThread, 1001); | 
|---|
|  |  |  | StaProtocol staProtocol2 = getClonedStation(devpThread, 1002); | 
|---|
|  |  |  | StaProtocol staProtocol3 = getClonedStation(devpThread, 1003); | 
|---|
|  |  |  | StaProtocol staProtocol4 = getClonedStation(devpThread, 1004); | 
|---|
|  |  |  | StaProtocol staProtocol6 = getClonedStation(devpThread, 111); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | boolean result = false; | 
|---|
|  |  |  | switch (outSta.getStaNo()) { | 
|---|
|  |  |  | case 105: | 
|---|
|  |  |  | result = (staProtocol1 != null && staProtocol1.isLoading() && staProtocol.isLoading() && staProtocol.getStaNo() == 105); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 107: | 
|---|
|  |  |  | result = (staProtocol2 != null && staProtocol2.isLoading()); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 109: | 
|---|
|  |  |  | result = (staProtocol3 != null && staProtocol3.isLoading()); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 110: | 
|---|
|  |  |  | result = ((staProtocol4 != null && staProtocol4.isLoading() && staProtocol.isLoading() && staProtocol.getStaNo() == 110) || | 
|---|
|  |  |  | (staProtocol6 != null && staProtocol6.isLoading() && staProtocol.isLoading() && staProtocol.getStaNo() == 111)); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | default: | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (result) { | 
|---|
|  |  |  | if (staProtocol.getSiteId() == 107 || staProtocol.getSiteId() == 109) { | 
|---|
|  |  |  | StaProtocol staProtocol5 = getClonedStation(devpThread, staProtocol.getSiteId() - 1); | 
|---|
|  |  |  | if (staProtocol5 != null && (staProtocol5.isLoading() && (staProtocol5.getStaNo() == 107 || staProtocol5.getStaNo() == 109))) { | 
|---|
|  |  |  | short workNo = staProtocol5.getWorkNo(); | 
|---|
|  |  |  | staProtocol5.setWorkNo(workNo); | 
|---|
|  |  |  | staProtocol5.setStaNo((short) 112); | 
|---|
|  |  |  | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(4, staProtocol5)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | if(staProtocol.isLoading() && (staProtocol.getStaNo() == 105 || staProtocol.getStaNo() == 110 ||  staProtocol.getStaNo() == 111)){ | 
|---|
|  |  |  | short workNo = staProtocol.getWorkNo(); | 
|---|
|  |  |  | staProtocol.setWorkNo(workNo); | 
|---|
|  |  |  | staProtocol.setStaNo((short) 112); | 
|---|
|  |  |  | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(4, staProtocol)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | log.error("shiftTargetToCyclePoint error", e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取站点并克隆 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private StaProtocol getClonedStation(DevpThread devpThread, int staNo) { | 
|---|
|  |  |  | StaProtocol staProtocol = devpThread.getStation().get(staNo); | 
|---|
|  |  |  | return (staProtocol != null) ? staProtocol.clone() : null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 112循环站点至出库站 | 
|---|
|  |  |  | public synchronized void shiftCyclePointToTarget() throws IOException, InterruptedException { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | for (DevpSlave devp : slaveProperties.getDevp()) { | 
|---|
|  |  |  | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
|---|
|  |  |  | if (devpThread == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | StaProtocol staProtocol = devpThread.getStation().get(112); | 
|---|
|  |  |  | if (staProtocol.getStaNo() != 112 || staProtocol.getWorkNo() == 0 || !staProtocol.isLoading() || staProtocol.getWorkNo() > 9000 || staProtocol.getWorkNo() < 6000) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 查询任务信息 | 
|---|
|  |  |  | TaskWrk taskWrk = taskWrkMapper.selectStaWorking(Integer.valueOf(staProtocol.getWorkNo())); | 
|---|
|  |  |  | if (taskWrk == null || taskWrk.getWrkNo() < 6001 || taskWrk.getWrkNo() > 9000) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | short workNo = staProtocol.getWorkNo(); | 
|---|
|  |  |  | // 再写入目标站点 | 
|---|
|  |  |  | staProtocol.setWorkNo(workNo); | 
|---|
|  |  |  | staProtocol.setStaNo(Short.valueOf(taskWrk.getTargetPoint())); | 
|---|
|  |  |  | MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(4, staProtocol)); | 
|---|
|  |  |  | Thread.sleep(200); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | log.info("Shifted from cycle station 112 to target {}, workNo: {}", taskWrk.getTargetPoint(), workNo); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | log.error("shiftCyclePointToTarget error", e); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized void generateStoreWrkFile1() throws IOException, InterruptedException { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | 
|---|
|  |  |  | //        } | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //agv取放货任务完成 | 
|---|
|  |  |  | public synchronized void autoCompleteAGV() { | 
|---|
|  |  |  | List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>()); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | Thread.sleep(500); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (BasDevp basDevp : basDevps) { | 
|---|
|  |  |  | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); | 
|---|
|  |  |  | StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo()); | 
|---|
|  |  |  | if (staProtocol == null) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | staProtocol = staProtocol.clone(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (basDevp.getWrkNo() != 0) { | 
|---|
|  |  |  | if (basDevp.getAgvTargetPick() != 0) {//取货 | 
|---|
|  |  |  | staProtocol.setAgvTypeSign((short) 0); | 
|---|
|  |  |  | staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
|---|
|  |  |  | MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | boolean sign = true; | 
|---|
|  |  |  | if (basDevp.getAgvTargetPlace() != 0) { | 
|---|
|  |  |  | sign = false; | 
|---|
|  |  |  | basDevp.setAgvTargetPlace(0); | 
|---|
|  |  |  | basDevpService.updateById(basDevp); | 
|---|
|  |  |  | staProtocol.setAgvTypeSign((short) 3);//1 | 
|---|
|  |  |  | staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
|---|
|  |  |  | MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | if (basDevp.getAgvTargetPlace() != 0) { | 
|---|
|  |  |  | if (basDevp.getLoading().equals("Y")) { | 
|---|
|  |  |  | staProtocol.setAgvTypeSign((short) 1); | 
|---|
|  |  |  | staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
|---|
|  |  |  | MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | log.error("AGV放货完成但输送线无物,复位信号 ===>> [staNo:{}] [basDevp:{}]", basDevp.getDevNo(), basDevp); | 
|---|
|  |  |  | basDevp.setAgvTargetPlace(0); | 
|---|
|  |  |  | basDevpService.updateById(basDevp); | 
|---|
|  |  |  | staProtocol.setAgvTypeSign((short) 3);//1 | 
|---|
|  |  |  | staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
|---|
|  |  |  | MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (basDevp.getAgvTargetPick() != 0) { | 
|---|
|  |  |  | basDevp.setAgvTargetPick(0); | 
|---|
|  |  |  | basDevpService.updateById(basDevp); | 
|---|
|  |  |  | staProtocol.setAgvTypeSign((short) 2);//0 | 
|---|
|  |  |  | staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
|---|
|  |  |  | MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized void autoCompleteTask() { | 
|---|
|  |  |  | List<TaskWrk> taskWrks = taskWrkMapper.selectWorkingTask(); | 
|---|
|  |  |  | for (TaskWrk taskWrk : taskWrks) { | 
|---|
|  |  |  | 
|---|
|  |  |  | locMastService.updateById(locMast); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public synchronized String CrnStartRunning(TaskWrk taskWrk) { | 
|---|
|  |  |  | String tasktype = null; | 
|---|
|  |  |  | switch (taskWrk.getIoType()) { | 
|---|
|  |  |  | case 1: | 
|---|
|  |  |  | tasktype = "RK"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 2: | 
|---|
|  |  |  | tasktype = "CK"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case 3: | 
|---|
|  |  |  | tasktype = "YK"; | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | default: | 
|---|
|  |  |  | tasktype = "未知"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Map<String, Object> map = new HashMap<>(); | 
|---|
|  |  |  | map.put("x-api-key", "7a15b5db-29b6-552c-8cff-0cfec3756da2"); | 
|---|
|  |  |  | TaskOverToWms taskOverToWms = new TaskOverToWms(); | 
|---|
|  |  |  | taskOverToWms.setFeedbackFrom("WCS"); //来源 | 
|---|
|  |  |  | taskOverToWms.setWarehouseId("1688469798893297665"); //仓库标识 | 
|---|
|  |  |  | taskOverToWms.setTaskNo(taskWrk.getTaskNo()); //任务号 | 
|---|
|  |  |  | taskOverToWms.setTaskType(tasktype); // 任务类型 | 
|---|
|  |  |  | taskOverToWms.setContainerCode(taskWrk.getBarcode()); // 容器编码 | 
|---|
|  |  |  | if (taskWrk.getIoType() == 1 || taskWrk.getIoType() == 3) { | 
|---|
|  |  |  | taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码 | 
|---|
|  |  |  | taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位 | 
|---|
|  |  |  | } else if (taskWrk.getIoType() == 2) { | 
|---|
|  |  |  | Map<Integer, String> map1 = new HashMap<>(); | 
|---|
|  |  |  | map1.put(102, "J-1101"); | 
|---|
|  |  |  | map1.put(106, "J-1103"); | 
|---|
|  |  |  | map1.put(110, "J-1105"); | 
|---|
|  |  |  | map1.put(114, "J-1107"); | 
|---|
|  |  |  | map1.put(118, "J-1109"); | 
|---|
|  |  |  | map1.put(122, "J-1111"); | 
|---|
|  |  |  | map1.put(305, "H-1101"); | 
|---|
|  |  |  | map1.put(405, "G-1101"); | 
|---|
|  |  |  | taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //设备编码 | 
|---|
|  |  |  | taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //源库位 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | taskOverToWms.setTaskStatus("executing"); //任务状态 | 
|---|
|  |  |  | String response = null; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | response = new HttpHandler.Builder() | 
|---|
|  |  |  | .setHeaders(map) | 
|---|
|  |  |  | .setUri(wmsUrl) | 
|---|
|  |  |  | .setPath("wcsManager/wcsInterface/taskStatusFeedback") | 
|---|
|  |  |  | .setJson(JSON.toJSONString(taskOverToWms)) | 
|---|
|  |  |  | .build() | 
|---|
|  |  |  | .doPost(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | log.error("堆垛机任务完成,请求wms任务完成接口失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | apiLogService.save("堆垛机开始运行" | 
|---|
|  |  |  | , wmsUrl + "wcsManager/wcsInterface/taskStatusFeedback" | 
|---|
|  |  |  | , null | 
|---|
|  |  |  | , "127.0.0.1" | 
|---|
|  |  |  | , JSON.toJSONString(taskOverToWms) | 
|---|
|  |  |  | , response | 
|---|
|  |  |  | , true | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | return response; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private TaskWrk createTask1(Result result, String barcode) { | 
|---|