|  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
 |  |  | import com.baomidou.mybatisplus.mapper.Wrapper; | 
 |  |  | import com.core.common.Cools; | 
 |  |  | import com.core.common.DateUtils; | 
 |  |  | import com.core.common.SpringUtils; | 
 |  |  | import com.core.exception.CoolException; | 
 |  |  | import com.zy.asrs.controller.CrnController; | 
 |  |  | import com.zy.asrs.domain.enums.TaskStatusType; | 
 |  |  | import com.zy.asrs.domain.enums.WorkNoType; | 
 |  |  | import com.zy.asrs.domain.param.CrnOperatorParam; | 
 |  |  | import com.zy.asrs.entity.*; | 
 |  |  | import com.zy.asrs.mapper.BasCrnErrorMapper; | 
 |  |  | import com.zy.asrs.mapper.WaitPakinMapper; | 
 |  |  | import com.zy.asrs.mapper.WrkMastMapper; | 
 |  |  | import com.zy.asrs.mapper.*; | 
 |  |  | import com.zy.asrs.service.*; | 
 |  |  | import com.zy.asrs.utils.Utils; | 
 |  |  | import com.zy.asrs.utils.VersionUtils; | 
 |  |  | import com.zy.common.model.LocTypeDto; | 
 |  |  | import com.zy.asrs.utils.*; | 
 |  |  | import com.zy.common.model.MatDto; | 
 |  |  | import com.zy.common.model.SearchLocParam; | 
 |  |  | import com.zy.common.model.StartupDto; | 
 |  |  | import com.zy.common.service.CommonService; | 
 |  |  | import com.zy.common.utils.CollectionUtils; | 
 |  |  | import com.zy.common.utils.HttpHandler; | 
 |  |  | import com.zy.core.CrnThread; | 
 |  |  | import com.zy.core.DevpThread; | 
 |  |  | import com.zy.core.cache.MessageQueue; | 
 |  |  | import com.zy.core.cache.SlaveConnection; | 
 |  |  | import com.zy.core.cache.*; | 
 |  |  | import com.zy.core.enums.*; | 
 |  |  | import com.zy.core.model.CrnSlave; | 
 |  |  | import com.zy.core.model.DevpSlave; | 
 |  |  | import com.zy.core.model.LedSlave; | 
 |  |  | import com.zy.core.model.Task; | 
 |  |  | import com.zy.core.model.*; | 
 |  |  | import com.zy.core.model.command.CrnCommand; | 
 |  |  | import com.zy.core.model.command.LedCommand; | 
 |  |  | import com.zy.core.model.protocol.CrnProtocol; | 
 |  |  | import com.zy.core.model.protocol.StaProtocol; | 
 |  |  | import com.zy.core.model.protocol.*; | 
 |  |  | import com.zy.core.properties.SlaveProperties; | 
 |  |  | import com.zy.core.thread.BarcodeThread; | 
 |  |  | import com.zy.core.thread.LedThread; | 
 |  |  | import com.zy.core.thread.RgvThread; | 
 |  |  | import com.zy.core.thread.SiemensDevpThread; | 
 |  |  | 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.util.ArrayList; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Set; | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.concurrent.ConcurrentHashMap; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  | @Transactional | 
 |  |  | public class MainServiceImpl { | 
 |  |  |  | 
 |  |  |     public static final long COMMAND_TIMEOUT = 5 * 1000; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private CommonService commonService; | 
 |  |  |     @Autowired | 
 |  |  |     private SlaveProperties slaveProperties; | 
 |  |  |     @Autowired | 
 |  |  |     private WrkMastMapper wrkMastMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private WrkDetlService wrkDetlService; | 
 |  |  |     @Autowired | 
 |  |  |     private WaitPakinMapper waitPakinMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private LocMastService locMastService; | 
 |  |  |     @Autowired | 
 |  |  |     private StaDescService staDescService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasCrnpService basCrnpService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasDevpService basDevpService; | 
 |  |  |     @Autowired | 
 |  |  |     private LocDetlService locDetlService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasErrLogService basErrLogService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasCrnErrorMapper basCrnErrorMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private TaskWrkMapper taskWrkMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private TaskWrkService taskWrkService; | 
 |  |  |     @Autowired | 
 |  |  |     private StaDescMapper staDescMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private StaDescService staDescService; | 
 |  |  |     @Autowired | 
 |  |  |     private ApiLogService apiLogService; | 
 |  |  |     @Autowired | 
 |  |  |     private CommonService commonService; | 
 |  |  |     @Autowired | 
 |  |  |     private CrnController crnController; | 
 |  |  |     @Autowired | 
 |  |  |     private BasDevpPositionService basDevpPositionService; | 
 |  |  |  | 
 |  |  |     @Value("${wms.url}") | 
 |  |  |     private String wmsUrl; | 
 |  |  |     @Value("${wms.inboundTaskApplyPath}") | 
 |  |  |     private String inboundTaskApplyPath; | 
 |  |  |     @Value("${wms.taskStatusFeedbackPath}") | 
 |  |  |     private String taskStatusFeedbackPath; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 组托 | 
 |  |  |      * 入库站,根据条码扫描生成入库工作档,工作状态 2 | 
 |  |  |      */ | 
 |  |  |     @Value("${wms.rgvOpen}") | 
 |  |  |     private boolean rgvOpen; | 
 |  |  |  | 
 |  |  |     @Value("${constant-parameters.trackEntireLength}") | 
 |  |  |     private Long trackEntireLength; | 
 |  |  |  | 
 |  |  |     @Value("${constant-parameters.trackBenchmark}") | 
 |  |  |     private Long trackBenchmark; | 
 |  |  |  | 
 |  |  |     @Value("${constant-parameters.trackProportion}") | 
 |  |  |     private Long trackProportion; | 
 |  |  |  | 
 |  |  |     @Value("${constant-parameters.avoidDistance}") | 
 |  |  |     private Long avoidDistance; | 
 |  |  |     @Autowired | 
 |  |  |     private TaskWrkLogServiceImpl taskWrkLogService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasPlcerrorLogServiceImpl basPlcerrorLogService; | 
 |  |  |     public Long currentTimeMilliConnectCrnAuto= 0L; | 
 |  |  |  | 
 |  |  |     public void generateStoreWrkFile() { | 
 |  |  |         // 根据输送线plc遍历 | 
 |  |  |         for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |             // 遍历入库口 | 
 |  |  |             for (DevpSlave.Sta inSta : devp.getInSta()) { | 
 |  |  |                 // 获取条码扫描仪信息 | 
 |  |  |                 BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); | 
 |  |  |                 if (barcodeThread == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 String barcode = barcodeThread.getBarcode(); | 
 |  |  |                 if(!Cools.isEmpty(barcode)) { | 
 |  |  |                     log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); | 
 |  |  |                     if("NG".endsWith(barcode) || "NoRead".equals(barcode)) { | 
 |  |  |         try { | 
 |  |  |             // 根据输送线plc遍历 | 
 |  |  |             for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |                 // 遍历入库口 | 
 |  |  |                 for (DevpSlave.Sta inSta : devp.getInSta()) { | 
 |  |  |                     // 获取入库站信息 | 
 |  |  |                     DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                     StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); | 
 |  |  |                     if (staProtocol == null || !staProtocol.isLoading()) { | 
 |  |  |                         continue; | 
 |  |  |                     } else { | 
 |  |  |                         staProtocol = staProtocol.clone(); | 
 |  |  |                     } | 
 |  |  |                     Integer workNo = staProtocol.getWorkNo(); | 
 |  |  |                     if (workNo!=9998 && workNo!=9997){ | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                 } else { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                     Integer stano = staProtocol.getStaNo(); | 
 |  |  |  | 
 |  |  |                 // 获取入库站信息 | 
 |  |  |                 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 入出库模式判断 | 
 |  |  | //                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; } | 
 |  |  |                 if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) { continue; } | 
 |  |  |  | 
 |  |  |                 // 判断是否满足入库条件 | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() | 
 |  |  |                         && staProtocol.isInEnable() | 
 |  |  |                         && !staProtocol.isEmptyMk() && (staProtocol.getWorkNo() == 0 || staProtocol.getWorkNo() > 9990) | 
 |  |  |                         && staProtocol.isPakMk()){// && !Cools.isEmpty(barcode)) { | 
 |  |  |  | 
 |  |  | //                    if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode)) { | 
 |  |  | //                        log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode); | 
 |  |  | //                        //条码为空或者不符合,退库到172站点 | 
 |  |  | //                        staProtocol.setWorkNo((short)9999); | 
 |  |  | //                        staProtocol.setStaNo((short)172); | 
 |  |  | //                        devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  | //                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  | //                        if (!result) { | 
 |  |  | //                            throw new CoolException("更新plc站点信息失败"); | 
 |  |  | //                        } | 
 |  |  | //                        continue; | 
 |  |  |                     // 尺寸检测异常 | 
 |  |  |                     boolean back = false; | 
 |  |  |                     String errMsg = "-"; | 
 |  |  |                     if (staProtocol.getGrossWt()>=600){ | 
 |  |  |                         errMsg = "超重:"+staProtocol.getGrossWt()+"kg"; | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isFrontErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "前超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"前超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isBackErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "后超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"后超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isHighErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "高超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"高超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isLeftErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "左超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"左超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isRightErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "右超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"右超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  | //                    if (!back && staProtocol.isWeightErr()) { | 
 |  |  | //                        errMsg = "超重"; | 
 |  |  | //                        back = true; | 
 |  |  | //                    } | 
 |  |  |  | 
 |  |  |                     // 判断重复工作档 | 
 |  |  |                     WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode); | 
 |  |  |                     if (wrkMast != null) { | 
 |  |  |                         log.error("工作档中已存在该站状态为( 2.设备上走 )的数据,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                     if (staProtocol.isBarcodeErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "扫码失败"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"扫码失败"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     // 退回 | 
 |  |  |                     if (back) { | 
 |  |  |                         if (stano == inSta.getBackSta().shortValue()) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         if (workNo == 0 && stano == 0) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         if (!staProtocol.isPakMk()) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         System.out.println("扫码入库失败,{"+inSta.getStaNo()+"}入库站因{"+errMsg+"}异常,托盘已被退回"); | 
 |  |  | //                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); | 
 |  |  |                         staProtocol.setWorkNo(9999); | 
 |  |  |                         staProtocol.setStaNo(inSta.getBackSta()); | 
 |  |  |                         devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                         devpThread.setPakMkRun(staProtocol.getSiteId(), false); | 
 |  |  |                         devpThread.setErrorDev(staProtocol.getSiteId(), errMsg); | 
 |  |  |                         MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                         TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); | 
 |  |  |                         if (taskWrk != null) { | 
 |  |  |                             taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示 | 
 |  |  |                             taskWrk.setModiTime(new Date()); | 
 |  |  |                             taskWrkMapper.updateById(taskWrk); | 
 |  |  |                         } | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  | //                    // 获取入库通知档 | 
 |  |  | //                    List<WaitPakin> waitPakins = waitPakinMapper.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", barcode).eq("io_status", "N")); | 
 |  |  | //                    if (waitPakins.isEmpty()) { | 
 |  |  | //                        log.error("无此入库条码数据。条码号={}", barcode); | 
 |  |  | //                        continue; | 
 |  |  | //                    } | 
 |  |  |                     // 判断是否满足入库条件 | 
 |  |  |                     if (staProtocol.isAutoing() && staProtocol.isLoading() | 
 |  |  |                             && staProtocol.isInEnable() | 
 |  |  |                             && (workNo == 9998 || workNo == 9997) | 
 |  |  |                             && staProtocol.isPakMk() | 
 |  |  |                             && staProtocol.isPakMkWalk() | 
 |  |  |                     ) { | 
 |  |  |                         // 获取条码扫描仪信息 | 
 |  |  |                         BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); | 
 |  |  |                         if (barcodeThread == null) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         String barcode = barcodeThread.getBarcode(); | 
 |  |  |                         int signI = 0; | 
 |  |  |                         while (signI<6){ | 
 |  |  |                             Thread.sleep(200); | 
 |  |  |                             signI = signI +1; | 
 |  |  |                             // 获取条码扫描仪信息 | 
 |  |  |                             if (Cools.isEmpty(barcode) || barcode.equals("000000")) { | 
 |  |  |                                 devpThread.setErrorDev(staProtocol.getSiteId(), "循环次数:"+signI+";扫码值:"+barcode); | 
 |  |  |  | 
 |  |  |                     try { | 
 |  |  |                                 BarcodeThread barcodeThreadO = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); | 
 |  |  |                                 if (barcodeThreadO == null) { | 
 |  |  |                                     continue; | 
 |  |  |                                 } | 
 |  |  |                                 barcode = barcodeThreadO.getBarcode(); | 
 |  |  |                             } else { | 
 |  |  |                                 break; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         LocTypeDto locTypeDto = new LocTypeDto(staProtocol); | 
 |  |  |  | 
 |  |  |                         SearchLocParam param = new SearchLocParam(); | 
 |  |  |                         param.setBarcode(barcode); | 
 |  |  |                         param.setIoType(1); | 
 |  |  |                         param.setSourceStaNo(inSta.getStaNo()); | 
 |  |  |                         param.setLocType1(locTypeDto.getLocType1()); | 
 |  |  |                         String response = new HttpHandler.Builder() | 
 |  |  |                                 .setUri(wmsUrl) | 
 |  |  |                                 .setPath("/rpc/pakin/loc/v1") | 
 |  |  |                                 .setJson(JSON.toJSONString(param)) | 
 |  |  |                                 .build() | 
 |  |  |                                 .doPost(); | 
 |  |  |                         JSONObject jsonObject = JSON.parseObject(response); | 
 |  |  |                         if (jsonObject.getInteger("code").equals(200)) { | 
 |  |  |                             StartupDto dto = jsonObject.getObject("data", StartupDto.class); | 
 |  |  |                         if (!Cools.isEmpty(barcode) && !barcode.equals("99999999") && !barcode.equals("000000")) { | 
 |  |  |                             // 请求wms接口,获取工作号和目标库位 | 
 |  |  |                             ToWmsDTO toWmsDTO = new ToWmsDTO(staProtocol.getSiteId(),staProtocol.getGrossWt(),barcode, workNo == 9998? 0 : 1); | 
 |  |  |  | 
 |  |  |                             barcodeThread.setBarcode(""); | 
 |  |  |                             staProtocol.setWorkNo(dto.getWorkNo().shortValue()); | 
 |  |  |                             staProtocol.setStaNo(dto.getStaNo().shortValue()); | 
 |  |  |                             devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                             boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                             if (!result) { | 
 |  |  |                                 throw new CoolException("更新plc站点信息失败"); | 
 |  |  |                             TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode)); | 
 |  |  |                             if (!Cools.isEmpty(taskWrk1)) { | 
 |  |  |                                 log.info("托盘码:" + barcode + "任务档存在"); | 
 |  |  |                                 if (taskWrk1.getIoType() == 1 && taskWrk1.getStatus() < 3 && (taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString()) || taskWrk1.getStartPoint().equals(String.valueOf((staProtocol.getSiteId()+1))))) { | 
 |  |  |                                     StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() | 
 |  |  |                                             .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId())); | 
 |  |  |  | 
 |  |  |                                     if (Cools.isEmpty(staDesc)) { | 
 |  |  |                                         log.info("托盘码:" + barcode + "任务档存在"); | 
 |  |  |                                         return; | 
 |  |  |                                     } else { | 
 |  |  |                                         staProtocol.setWorkNo(taskWrk1.getWrkNo()); | 
 |  |  |                                         staProtocol.setStaNo(staProtocol.getSiteId()); | 
 |  |  |                                         devpThread.setPakMkWalk(staProtocol.getSiteId(), false); | 
 |  |  |                                         devpThread.setErrorDev(staProtocol.getSiteId(), errMsg); | 
 |  |  |                                         MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                                 return; | 
 |  |  |                             } | 
 |  |  |                             HashMap<String, Object> headParam = new HashMap<>(); | 
 |  |  |                             headParam.put("Content-Type", "application/json"); | 
 |  |  |                             String response; | 
 |  |  |                             try { | 
 |  |  |                                 response = new HttpHandler.Builder() | 
 |  |  |                                         // .setHeaders(headParam) | 
 |  |  |                                         .setUri(wmsUrl) | 
 |  |  |                                         .setPath(inboundTaskApplyPath) | 
 |  |  |                                         .setJson(JSON.toJSONString(toWmsDTO)) | 
 |  |  |                                         .build() | 
 |  |  |                                         .doPost(); | 
 |  |  |                             } catch (Exception e) { | 
 |  |  |                                 log.error("请求入库调用接口失败"); | 
 |  |  |                                 log.error("异常信息打印:" + e); | 
 |  |  |                                 try { | 
 |  |  |                                     BasDevp basDevp = basDevpService.selectById(inSta.getStaNo()); | 
 |  |  |                                     if (Cools.isEmpty(basDevp)) { | 
 |  |  |                                         log.error("站点号异常" + inSta.getStaNo()); | 
 |  |  |                                     } else if (basDevp.getStaErr() != 0) { | 
 |  |  |                                         basDevp.setStaErr(2); | 
 |  |  |                                         basDevpService.updateById(basDevp); | 
 |  |  |                                     } | 
 |  |  |                                 } catch (Exception e1) { | 
 |  |  |                                     // 退回 | 
 |  |  |                                     log.error("扫码检测程序异常" + inSta.getStaNo() + "异常信息" + e1); | 
 |  |  |                                 } | 
 |  |  |                                 staProtocol.setWorkNo(9999); | 
 |  |  |                                 staProtocol.setStaNo(inSta.getBackSta()); | 
 |  |  |                                 devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                                 devpThread.setPakMkWalk(staProtocol.getSiteId(), false); | 
 |  |  |                                 devpThread.setErrorDev(staProtocol.getSiteId(), e.getMessage()); | 
 |  |  |                                 MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |  | 
 |  |  |                             JSONObject jsonObject = JSON.parseObject(response); | 
 |  |  |                             apiLogService.save("wms请求入库货位接口" | 
 |  |  |                                     , wmsUrl + inboundTaskApplyPath | 
 |  |  |                                     , null | 
 |  |  |                                     , "127.0.0.1" | 
 |  |  |                                     , JSON.toJSONString(toWmsDTO) | 
 |  |  |                                     , response | 
 |  |  |                                     , true | 
 |  |  |                             ); | 
 |  |  |                             log.info("入库请求参数{}" + JSON.toJSONString(toWmsDTO)); | 
 |  |  |                             log.info("入库请求返回参数{}" + JSON.toJSONString(response)); | 
 |  |  |                             if (!Cools.isEmpty(jsonObject.getInteger("code")) && jsonObject.getInteger("code").equals(200)) { | 
 |  |  |                                 try { | 
 |  |  |                                     devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                                     devpThread.setErrorDev(staProtocol.getSiteId(), "上报成功等待任务"); | 
 |  |  |  | 
 |  |  |                                 } catch (Exception e) { | 
 |  |  |                                     // 退回 | 
 |  |  |                                     log.error("扫码检测程序异常" + inSta.getStaNo() + errMsg); | 
 |  |  |                                     log.error("扫码检测程序异常,异常信息" + e); | 
 |  |  |  | 
 |  |  |                                     staProtocol.setWorkNo(9999); | 
 |  |  |                                     staProtocol.setStaNo(inSta.getBackSta()); | 
 |  |  |                                     devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                                     devpThread.setErrorDev(staProtocol.getSiteId(), "上报成功锁定失败"); | 
 |  |  |  | 
 |  |  |                                     MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                                 } | 
 |  |  |  | 
 |  |  |                             } else { | 
 |  |  |                                 // 退回 | 
 |  |  |                                 staProtocol.setWorkNo(9999); | 
 |  |  |                                 staProtocol.setStaNo(inSta.getBackSta()); | 
 |  |  |                                 devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                                 devpThread.setErrorDev(staProtocol.getSiteId(), jsonObject.getString("message")); | 
 |  |  |                                 MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl+"/rpc/pakin/loc/v1", JSON.toJSONString(param), response); | 
 |  |  |                             // 退回 | 
 |  |  |                             log.error("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); | 
 |  |  |  | 
 |  |  |                             staProtocol.setWorkNo(9999); | 
 |  |  |                             staProtocol.setStaNo(inSta.getBackSta()); | 
 |  |  |                             devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                             devpThread.setErrorDev(staProtocol.getSiteId(), "扫码入库扫码失败!!!扫码值:"+barcode); | 
 |  |  |                             MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                             TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); | 
 |  |  |                             if (taskWrk != null) { | 
 |  |  |                                 taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示 | 
 |  |  |                                 taskWrk.setModiTime(new Date()); | 
 |  |  |                                 taskWrkMapper.updateById(taskWrk); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //                        // 检索库位 | 
 |  |  | //                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol); | 
 |  |  | //                        List<String> matNos = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList()); | 
 |  |  | //                        StartupDto startupDto = commonService.getLocNo(1, 1, inSta.getStaNo(), matNos, locTypeDto, 0); | 
 |  |  | //                        // 工作号 | 
 |  |  | //                        int workNo = startupDto.getWorkNo(); | 
 |  |  | //                        // 插入工作明细档 | 
 |  |  | //                        wrkDetlService.createWorkDetail(workNo, waitPakins, barcode); | 
 |  |  | // | 
 |  |  | //                        // 插入工作主档 | 
 |  |  | //                        wrkMast = new WrkMast(); | 
 |  |  | //                        wrkMast.setWrkNo(workNo); | 
 |  |  | //                        wrkMast.setIoTime(new Date()); | 
 |  |  | //                        wrkMast.setWrkSts(2L); // 工作状态:2.设备上走 | 
 |  |  | //                        wrkMast.setIoType(1); // 入出库状态:1.入库 | 
 |  |  | //                        wrkMast.setIoPri(10D); // 优先级:10 | 
 |  |  | //                        wrkMast.setCrnNo(startupDto.getCrnNo()); | 
 |  |  | //                        wrkMast.setSourceStaNo(startupDto.getSourceStaNo()); | 
 |  |  | //                        wrkMast.setStaNo(startupDto.getStaNo()); | 
 |  |  | //                        wrkMast.setLocNo(startupDto.getLocNo()); | 
 |  |  | //                        wrkMast.setBarcode(barcode); // 托盘码 | 
 |  |  | //                        wrkMast.setFullPlt("Y"); // 满板:Y | 
 |  |  | //                        wrkMast.setPicking("N"); // 拣料 | 
 |  |  | //                        wrkMast.setExitMk("N"); // 退出 | 
 |  |  | //                        wrkMast.setEmptyMk("N"); // 空板 | 
 |  |  | //                        wrkMast.setLinkMis("N"); | 
 |  |  | //                        // 操作人员数据 | 
 |  |  | //                        wrkMast.setAppeTime(new Date()); | 
 |  |  | //                        wrkMast.setModiTime(new Date()); | 
 |  |  | //                        Integer insert = wrkMastMapper.insert(wrkMast); | 
 |  |  | //                        if (insert == 0) { | 
 |  |  | //                            throw new CoolException("保存工作档失败"); | 
 |  |  | //                        } | 
 |  |  | //                        // 更新目标库位状态 | 
 |  |  | //                        LocMast locMast = locMastService.selectById(startupDto.getLocNo()); | 
 |  |  | //                        locMast.setLocSts("S"); // S.入库预约 | 
 |  |  | //                        locMast.setModiTime(new Date()); | 
 |  |  | //                        if (!locMastService.updateById(locMast)){ | 
 |  |  | //                            throw new CoolException("改变库位状态失败"); | 
 |  |  | //                        } | 
 |  |  | //                        // 将入库通知档修改为已启动 | 
 |  |  | //                        if (wrkMastMapper.updateWaitPakInStep1(barcode) == 0) { | 
 |  |  | //                            throw new CoolException("修改入库通知档状态为已启动失败"); | 
 |  |  | //                        } | 
 |  |  | // | 
 |  |  | //                        // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  | // | 
 |  |  | //                        // 更新站点信息 且 下发plc命令 | 
 |  |  | //                        barcodeThread.setBarcode(""); | 
 |  |  | //                        staProtocol.setWorkNo((short) workNo); | 
 |  |  | //                        staProtocol.setStaNo(startupDto.getStaNo().shortValue()); | 
 |  |  | //                        devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  | //                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  | //                        if (!result) { | 
 |  |  | //                            throw new CoolException("更新plc站点信息失败"); | 
 |  |  | //                        } | 
 |  |  |  | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                         e.printStackTrace(); | 
 |  |  |                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("generateStoreWrkFile e", e); | 
 |  |  |             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * wms入库 | 
 |  |  |      * 入库站,根据条码扫描生成入库工作档,工作状态 1 ==>> 2 | 
 |  |  |      */ | 
 |  |  |     public void generateStoreWrkFile0() { | 
 |  |  |         // 根据输送线plc遍历 | 
 |  |  |         for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |             // 遍历入库口 | 
 |  |  |             for (DevpSlave.Sta inSta : devp.getInSta()) { | 
 |  |  |                 // 获取入库站信息 | 
 |  |  |                 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  | //                // 入出库模式判断 | 
 |  |  |                 if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; } | 
 |  |  |  | 
 |  |  |                 // 判断是否满足入库条件 | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() | 
 |  |  |                         && !staProtocol.isEmptyMk() && (staProtocol.getWorkNo() == 0 || staProtocol.getWorkNo() == 9999) | 
 |  |  |                         && staProtocol.isPakMk()) { | 
 |  |  |                     // 判断重复工作档 | 
 |  |  |                     WrkMast wrkMast = wrkMastMapper.selectPakInStep11(inSta.getStaNo()); | 
 |  |  |                     if (wrkMast == null) { continue; } | 
 |  |  |  | 
 |  |  |                     // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |  | 
 |  |  |                     // 更新站点信息 且 下发plc命令 | 
 |  |  |                     staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
 |  |  |                     staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
 |  |  |                     devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                     boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                     if (result) { | 
 |  |  |                         // 更新工作主档 | 
 |  |  |                         wrkMast.setWrkSts(2L); // 工作状态:2.设备上走 | 
 |  |  |                         wrkMast.setModiTime(new Date()); | 
 |  |  |                         if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                             log.error("更新工作档失败!!! [工作号:{}]", wrkMast.getWrkNo()); | 
 |  |  |                         } | 
 |  |  |     public void generateStoreWrkFileIsEmptyMk() { | 
 |  |  |         try { | 
 |  |  |             // 根据输送线plc遍历 | 
 |  |  |             for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |                 // 遍历入库口 | 
 |  |  |                 for (DevpSlave.Sta inSta : devp.getInSta()) { | 
 |  |  |                     // 获取入库站信息 | 
 |  |  |                     DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                     StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); | 
 |  |  |                     if (staProtocol == null || !staProtocol.isLoading()) { | 
 |  |  |                         continue; | 
 |  |  |                     } else { | 
 |  |  |                         log.error("发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId()); | 
 |  |  |                         staProtocol = staProtocol.clone(); | 
 |  |  |                     } | 
 |  |  |                     Integer workNo = staProtocol.getWorkNo(); | 
 |  |  |                     if (workNo!=9997){ | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     Integer stano = staProtocol.getStaNo(); | 
 |  |  |  | 
 |  |  |                     // 尺寸检测异常 | 
 |  |  |                     boolean back = false; | 
 |  |  |                     String errMsg = ""; | 
 |  |  |                     if (staProtocol.isFrontErr()) { | 
 |  |  |                         errMsg = "前超限"; | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (!back && staProtocol.isBackErr()) { | 
 |  |  |                         errMsg = "后超限"; | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (!back && staProtocol.isHighErr()) { | 
 |  |  |                         errMsg = "高超限"; | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (!back && staProtocol.isLeftErr()) { | 
 |  |  |                         errMsg = "左超限"; | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (!back && staProtocol.isRightErr()) { | 
 |  |  |                         errMsg = "右超限"; | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  | //                    if (!back && staProtocol.isWeightErr()) { | 
 |  |  | //                        errMsg = "超重"; | 
 |  |  | //                        back = true; | 
 |  |  | //                    } | 
 |  |  |                     // 退回 | 
 |  |  |                     if (back) { | 
 |  |  |                         if (stano == inSta.getBackSta().shortValue()) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         if (workNo == 0 && stano == 0) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         if (!staProtocol.isPakMk()) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         System.out.println("扫码入库失败,{"+inSta.getStaNo()+"}入库站因{"+errMsg+"}异常,托盘已被退回"); | 
 |  |  | //                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); | 
 |  |  |                         staProtocol.setWorkNo(9999); | 
 |  |  |                         staProtocol.setStaNo(inSta.getStaNo()); | 
 |  |  |                         devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                         MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                         TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); | 
 |  |  |                         if (taskWrk != null) { | 
 |  |  |                             taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示 | 
 |  |  |                             taskWrk.setModiTime(new Date()); | 
 |  |  |                             taskWrkMapper.updateById(taskWrk); | 
 |  |  |                         } | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 判断是否满足入库条件 | 
 |  |  |                     if (staProtocol.isAutoing() && staProtocol.isLoading() | 
 |  |  |                             && staProtocol.isInEnable() | 
 |  |  |                             && (workNo == 9997) | 
 |  |  |                             && staProtocol.isPakMk() | 
 |  |  |                             && staProtocol.isPakMkWalk() | 
 |  |  |                     ) { | 
 |  |  |                         // 获取条码扫描仪信息 | 
 |  |  |                         BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); | 
 |  |  |                         if (barcodeThread == null) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         String barcode = barcodeThread.getBarcode(); | 
 |  |  |                         if (Cools.isEmpty(barcode) || barcode.equals("0")  || barcode.equals("000000")) { | 
 |  |  |                             staProtocol.setWorkNo(9999); | 
 |  |  |                             staProtocol.setStaNo(inSta.getBackSta()); | 
 |  |  |                             devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                             MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         // 请求wms接口,获取工作号和目标库位 | 
 |  |  |                         ToWmsDTO toWmsDTO = new ToWmsDTO(staProtocol.getSiteId(),staProtocol.getGrossWt(),barcode, 1); | 
 |  |  |                         HashMap<String, Object> headParam = new HashMap<>(); | 
 |  |  |                         headParam.put("Content-Type", "application/json"); | 
 |  |  |                         String response; | 
 |  |  |                         try { | 
 |  |  |                             response = new HttpHandler.Builder() | 
 |  |  |                                     // .setHeaders(headParam) | 
 |  |  |                                     .setUri(wmsUrl) | 
 |  |  |                                     .setPath(inboundTaskApplyPath) | 
 |  |  |                                     .setJson(JSON.toJSONString(toWmsDTO)) | 
 |  |  |                                     .build() | 
 |  |  |                                     .doPost(); | 
 |  |  |                         } catch (Exception e) { | 
 |  |  |                             log.error("请求入库调用接口失败"); | 
 |  |  |                             log.error("异常信息打印:" + e); | 
 |  |  |                             try { | 
 |  |  |                                 BasDevp basDevp = basDevpService.selectById(inSta.getStaNo()); | 
 |  |  |                                 if (Cools.isEmpty(basDevp)) { | 
 |  |  |                                     log.error("站点号异常" + inSta.getStaNo()); | 
 |  |  |                                 } else if (basDevp.getStaErr() != 0) { | 
 |  |  |                                     basDevp.setStaErr(2); | 
 |  |  |                                     basDevpService.updateById(basDevp); | 
 |  |  |                                 } | 
 |  |  |                             } catch (Exception e1) { | 
 |  |  |                                 // 退回 | 
 |  |  |                                 log.error("扫码检测程序异常" + inSta.getStaNo() + "异常信息" + e1); | 
 |  |  |                             } | 
 |  |  |                             staProtocol.setWorkNo(9999); | 
 |  |  |                             staProtocol.setStaNo(inSta.getBackSta()); | 
 |  |  |                             devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                             MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         JSONObject jsonObject = JSON.parseObject(response); | 
 |  |  |                         apiLogService.save("wms请求入库货位接口" | 
 |  |  |                                 , wmsUrl + inboundTaskApplyPath | 
 |  |  |                                 , null | 
 |  |  |                                 , "127.0.0.1" | 
 |  |  |                                 , JSON.toJSONString(toWmsDTO) | 
 |  |  |                                 , response | 
 |  |  |                                 , true | 
 |  |  |                         ); | 
 |  |  |                         log.info("入库请求参数{}" + JSON.toJSONString(toWmsDTO)); | 
 |  |  |                         log.info("入库请求返回参数{}" + JSON.toJSONString(response)); | 
 |  |  |                         if (!Cools.isEmpty(jsonObject.getInteger("code")) && jsonObject.getInteger("code").equals(200)) { | 
 |  |  |                             try { | 
 |  |  |                                 devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                             } catch (Exception e) { | 
 |  |  | //                                    log.error("扫码检测程序异常"+inSta.getStaNo()+"异常信息"+e); | 
 |  |  |                                 // 退回 | 
 |  |  |                                 log.error("扫码检测程序异常" + inSta.getStaNo() + errMsg); | 
 |  |  |                                 log.error("扫码检测程序异常,异常信息" + e); | 
 |  |  |  | 
 |  |  |                                 staProtocol.setWorkNo(9999); | 
 |  |  |                                 staProtocol.setStaNo(inSta.getBackSta()); | 
 |  |  |                                 devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                                 MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("generateStoreWrkFile e", e); | 
 |  |  |             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 拣料、并板、盘点再入库 | 
 |  |  |      */ | 
 |  |  |     public synchronized void stnToCrnStnPick(){ | 
 |  |  |         for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |             // 遍历拣料入库口 | 
 |  |  |             for (DevpSlave.Sta pickSta : devp.getPickSta()) { | 
 |  |  | //                // 获取条码扫描仪信息 | 
 |  |  | //                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, pickSta.getBarcode()); | 
 |  |  | //                if (barcodeThread == null) { | 
 |  |  | //                    continue; | 
 |  |  | //                } | 
 |  |  | //                String barcode = barcodeThread.getBarcode(); | 
 |  |  | //                if(!Cools.isEmpty(barcode)) { | 
 |  |  | //                    log.info("{}号条码扫描器检测条码信息:{}", pickSta.getBarcode(), barcode); | 
 |  |  | //                    if("NG".endsWith(barcode) || "NoRead".equals(barcode)) { | 
 |  |  | //                        continue; | 
 |  |  | //                    } | 
 |  |  | //                } else { | 
 |  |  | //                    continue; | 
 |  |  | //                } | 
 |  |  |  | 
 |  |  |                 // 获取拣料入库站信息 | 
 |  |  |                 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  | //                // 入出库模式判断 | 
 |  |  | //                if (devpThread.ioMode != IoModeType.PAKIN_MODE) { continue; } | 
 |  |  |  | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()){ | 
 |  |  | //                    WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode); | 
 |  |  |                     WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo().intValue()); | 
 |  |  |                     if (wrkMast == null) { | 
 |  |  |                         // 无拣料数据 | 
 |  |  |     public void generateStoreWrkFileWalk() { | 
 |  |  |         try { | 
 |  |  |             // 根据输送线plc遍历 | 
 |  |  |             for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |                 // 遍历入库口 | 
 |  |  |                 for (DevpSlave.Sta inSta : devp.getInWalkSta()) { | 
 |  |  |                     // 获取入库站信息 | 
 |  |  |                     DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                     StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); | 
 |  |  |                     if (staProtocol == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } else { | 
 |  |  |                         staProtocol = staProtocol.clone(); | 
 |  |  |                     } | 
 |  |  |                     if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107) | 
 |  |  |                         || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo()) ) { | 
 |  |  |                         continue; | 
 |  |  |                     Integer workNo = staProtocol.getWorkNo(); | 
 |  |  |  | 
 |  |  |                     // 判断是否满足入库条件 | 
 |  |  |                     if (staProtocol.isAutoing() && staProtocol.isLoading() | 
 |  |  | //                            && staProtocol.isInEnable() | 
 |  |  | //                            && (workNo == 0 || (workNo>9000 && workNo<10000)) | 
 |  |  |                             && staProtocol.isPakMkWalk() | 
 |  |  |                     ) { | 
 |  |  |                         if (inSta.isBarcodeSign()){ | 
 |  |  |                             // 获取条码扫描仪信息 | 
 |  |  |                             BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); | 
 |  |  |                             if (barcodeThread == null) { | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |                             String barcode = barcodeThread.getBarcode(); | 
 |  |  |                             if (!Cools.isEmpty(barcode) && !barcode.equals("99999999")) { | 
 |  |  |                                 // 请求wms接口,获取工作号和目标库位 | 
 |  |  |                                 ToWmsDTO toWmsDTO = new ToWmsDTO(barcode, staProtocol.getSiteId(), 0); | 
 |  |  |                                 TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode)); | 
 |  |  |  | 
 |  |  |                                 if (!Cools.isEmpty(taskWrk1)) { | 
 |  |  |                                     log.info("托盘码:" + barcode + "任务档存在"); | 
 |  |  |                                     if (taskWrk1.getIoType() == 1 && taskWrk1.getStatus() < 3 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) { | 
 |  |  |                                         StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() | 
 |  |  |                                                 .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId())); | 
 |  |  |  | 
 |  |  |                                         if (Cools.isEmpty(staDesc)) { | 
 |  |  |                                             log.info("托盘码:" + barcode + "任务档存在"); | 
 |  |  |                                             return; | 
 |  |  |                                         } else { | 
 |  |  |                                             staProtocol.setWorkNo(taskWrk1.getWrkNo()); | 
 |  |  |                                             staProtocol.setStaNo(staDesc.getCrnStn()); | 
 |  |  |                                             MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                                         } | 
 |  |  |                                     } | 
 |  |  |                                     return; | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>()); | 
 |  |  |  | 
 |  |  |                                 if (!Cools.isEmpty(taskWrk1)) { | 
 |  |  |                                     if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) { | 
 |  |  |                                         StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() | 
 |  |  |                                                 .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId())); | 
 |  |  |  | 
 |  |  |                                         if (Cools.isEmpty(staDesc)) { | 
 |  |  |                                             return; | 
 |  |  |                                         } else { | 
 |  |  |                                             staProtocol.setWorkNo(taskWrk1.getWrkNo()); | 
 |  |  |                                             staProtocol.setStaNo(staDesc.getCrnStn()); | 
 |  |  |                                             devpThread.setPakMkWalk(staProtocol.getSiteId(), false); | 
 |  |  |                                             MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                                         } | 
 |  |  |                                     } | 
 |  |  |                                     return; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("IO_TYPE",1).eq("WRK_STS",1).eq("START_POINT",staProtocol.getSiteId().toString())); | 
 |  |  |  | 
 |  |  |                             if (!Cools.isEmpty(taskWrk1)) { | 
 |  |  |                                 if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) { | 
 |  |  |                                     StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() | 
 |  |  |                                             .eq("CRN_NO", taskWrk1.getCrnNo()).eq("TYPE_NO", 1).eq("STN_NO", staProtocol.getSiteId())); | 
 |  |  |  | 
 |  |  |                                     if (Cools.isEmpty(staDesc)) { | 
 |  |  |                                         return; | 
 |  |  |                                     } else { | 
 |  |  |                                         staProtocol.setWorkNo(taskWrk1.getWrkNo()); | 
 |  |  |                                         staProtocol.setStaNo(BarcodeUtils.getStaNo(staProtocol.getSiteId())); | 
 |  |  |                                         devpThread.setPakMkWalk(staProtocol.getSiteId(), false); | 
 |  |  |                                         devpThread.setErrorDev(staProtocol.getSiteId(), "-"); | 
 |  |  |                                         MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |  | 
 |  |  |                                         Date now = new Date(); | 
 |  |  | //                                        taskWrk1.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态 | 
 |  |  | //                taskWrk.setAssignTime(now);//派发时间 | 
 |  |  |                                         taskWrk1.setExecuteTime(now); | 
 |  |  |                                         taskWrk1.setWrkSts(2);//工作状态 3.吊车入库 | 
 |  |  |                                         taskWrk1.setCrnNo(staDesc.getCrnNo());//堆垛机号 | 
 |  |  |                                         taskWrk1.setModiTime(now); | 
 |  |  |                                         taskWrk1.setModiUser(9988L); | 
 |  |  |                                         taskWrkService.updateById(taskWrk1); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                                 return; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 拣、盘、并 作业站转换 | 
 |  |  | //                    int stnNo = 0; | 
 |  |  | //                    if (wrkMast.getStaNo() == 109) { | 
 |  |  | //                        stnNo = 127; | 
 |  |  | //                    } else if (wrkMast.getStaNo() == 113) { | 
 |  |  | //                        stnNo = 128; | 
 |  |  | //                    } else { | 
 |  |  | //                        log.error("{}号任务数据异常!", wrkMast.getWrkNo()); | 
 |  |  | //                    } | 
 |  |  |                     // 获取目标站 | 
 |  |  |                     Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() | 
 |  |  |                             .eq("type_no", wrkMast.getIoType() - 50) | 
 |  |  |                             .eq("stn_no", pickSta.getStaNo()) // 作业站点 = 拣料出库的目标站 | 
 |  |  |                             .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号 | 
 |  |  |                     StaDesc staDesc = staDescService.selectOne(wrapper); | 
 |  |  |                     if (Cools.isEmpty(staDesc)) { | 
 |  |  |                         log.error("入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo()); | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     try { | 
 |  |  |                         // 保存工作明细档历史档 | 
 |  |  |                         if (wrkMastMapper.saveWrkDetlLog(wrkMast.getWrkNo()) == 0) { | 
 |  |  |                             throw new CoolException("保存工作明细档历史档失败"); | 
 |  |  |                         } | 
 |  |  |                         // 保存工作主档历史档 | 
 |  |  |                         if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) { | 
 |  |  |                             throw new CoolException("保存工作主档历史档失败"); | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         Date now = new Date(); | 
 |  |  |                         // 堆垛机站点(目标站) | 
 |  |  |                         Integer staNo = staDesc.getCrnStn(); | 
 |  |  |                         // 更新工作档数据状态 | 
 |  |  |                         wrkMast.setIoTime(now); | 
 |  |  |                         wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57 | 
 |  |  |                         wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走 | 
 |  |  |                         wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站 | 
 |  |  |                         wrkMast.setStaNo(staNo); // 目标站 | 
 |  |  |                         wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位 | 
 |  |  |                         wrkMast.setSourceLocNo(""); // 源库位清空 | 
 |  |  |                         wrkMast.setModiTime(now); | 
 |  |  |                         if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                             throw new CoolException("更新工作档数据状态失败"); | 
 |  |  |                         } | 
 |  |  |                         // 更新明细档io_time (历史档关联使用) | 
 |  |  |                         wrkDetlService.updateIoTime(wrkMast.getWrkNo(), now); | 
 |  |  |                         // 修改库位状态 Q.拣料/盘点/并板再入库 | 
 |  |  |                         LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); | 
 |  |  |                         locMast.setLocSts("Q"); | 
 |  |  |                         locMast.setModiTime(new Date()); | 
 |  |  |                         if (!locMastService.updateById(locMast)) { | 
 |  |  |                             throw new CoolException("修改库位状态失败"); | 
 |  |  |                         } | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                         e.printStackTrace(); | 
 |  |  |                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 更新站点信息 且 下发plc命令 | 
 |  |  |                     staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
 |  |  |                     staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
 |  |  |                     devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                     boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                     if (!result) { | 
 |  |  |                         log.error("发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId()); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("generateStoreWrkFile e", e); | 
 |  |  |             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 堆垛机站出库到出库站 | 
 |  |  |      */ | 
 |  |  |     @Async | 
 |  |  |     public void crnStnToOutStn() { | 
 |  |  |         for (CrnSlave crnSlave : slaveProperties.getCrn()) { | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |  | 
 |  |  |             // 获取堆垛机信息 | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |             if (crnProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); | 
 |  |  |             if (basCrnp == null) { | 
 |  |  |                 log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             CrnSlave crnSlave = new CrnSlave(crn); | 
 |  |  |             if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){ | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (!crn.getId().equals(crnProtocol.getLaneNo())) { | 
 |  |  |                 for (CrnSlave crnOther : slaveProperties.getCrn()) { | 
 |  |  |                     if (crnOther.getId().equals(crnProtocol.getLaneNo())) { | 
 |  |  |                         crnSlave.updateCrnInStn(crnOther); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             // 遍历堆垛机出库站 | 
 |  |  |             for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) { | 
 |  |  |                 // 获取堆垛机出库站信息 | 
 |  |  |                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |  | 
 |  |  |                 List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo())); | 
 |  |  |                 for (StaDesc staDesc : staDescs) { | 
 |  |  |                     try { | 
 |  |  |                         // 获取堆垛机出库站信息 | 
 |  |  |                         DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |                         StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |                         if (staProtocol == null) { | 
 |  |  |                             continue; | 
 |  |  |                         } else { | 
 |  |  |                             staProtocol = staProtocol.clone(); | 
 |  |  |                         } | 
 |  |  |                         if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) { | 
 |  |  |                             // 查询工作档 | 
 |  |  |                             TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnProtocol.getLaneNo(), staDesc.getStnNo().toString()); | 
 |  |  |                             if (taskWrk == null) { | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |                             log.info("下发输送线任务:taskWrk:" + JSON.toJSONString(taskWrk)); | 
 |  |  | //                            R r = siteController.siteDetlUpdate(Integer.valueOf(taskWrk.getTargetPoint()), taskWrk.getWrkNo().shortValue(), (short) 0, "Y", false, false); | 
 |  |  |                             staProtocol.setWorkNo(taskWrk.getWrkNo()); | 
 |  |  |                             staProtocol.setStaNo(BarcodeUtils.getStaNo(staProtocol.getSiteId())); | 
 |  |  |                             boolean offer = false; | 
 |  |  |                             try { | 
 |  |  |                                 offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol)); | 
 |  |  |                             } catch (Exception e) { | 
 |  |  |                                 log.error("下发输送线任务失败:异常:" + e); | 
 |  |  |                                 log.error("下发输送线任务失败:异常:offer:" + offer); | 
 |  |  |                             } | 
 |  |  | //                            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(r)); | 
 |  |  |                             if (offer) { | 
 |  |  |                                 log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(taskWrk)); | 
 |  |  |                                 Date now = new Date(); | 
 |  |  |                                 taskWrk.setStatus(TaskStatusType.OVER3.id); | 
 |  |  |                                 taskWrk.setWrkSts(14); | 
 |  |  |                                 taskWrk.setModiTime(now); | 
 |  |  |                                 taskWrk.setCompleteTime(now); | 
 |  |  |                                 taskWrkService.updateById(taskWrk); | 
 |  |  |                             } else { | 
 |  |  |                                 log.error("下发输送线任务失败:taskWrk:" + JSON.toJSONString(taskWrk)); | 
 |  |  | //                                log.error("下发输送线任务失败:异常信息:"+JSON.toJSONString(r)); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                         log.error("出库到出库站异常:异常信息:" + e); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) { | 
 |  |  |                     // 查询工作档 | 
 |  |  |                     WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(staProtocol.getSiteId()); | 
 |  |  |                     if (wrkMast == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 判断工作档条件 | 
 |  |  |                     if (wrkMast.getIoType() < 100 || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 判断吊车是否实际已完成,且电脑状态在move中,以备电脑进行更新工作档 | 
 |  |  |                     CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo()); | 
 |  |  |                     CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |                     if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) { | 
 |  |  |                         // 移动中 | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     //  判断堆垛机状态等待确认 | 
 |  |  |                     if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue()) | 
 |  |  |                             && crnProtocol.statusType == CrnStatusType.WAITING | 
 |  |  |                             && crnProtocol.forkPosType == CrnForkPosType.HOME) { | 
 |  |  |  | 
 |  |  |                         // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |                         // 下发站点信息 | 
 |  |  |                         staProtocol.setWorkNo(wrkMast.getWrkNo().shortValue()); | 
 |  |  |                         staProtocol.setStaNo(wrkMast.getStaNo().shortValue()); | 
 |  |  |                         if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) { | 
 |  |  |     /** | 
 |  |  |      * 堆垛机5分钟无任务则回到源点 | 
 |  |  |      */ | 
 |  |  |     public void crnStnToOutStnSou() { | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |             try{ | 
 |  |  |                 // 获取堆垛机信息 | 
 |  |  |                 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |                 CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |                 if (crnProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); | 
 |  |  |                 if (basCrnp == null) { | 
 |  |  |                     log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 if (System.currentTimeMillis()-currentTimeMilliConnectCrnAuto<1000*60*10){ | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.statusType == CrnStatusType.IDLE && crnProtocol.getLoaded().equals((short)0) && crnProtocol.getLaneNo()!=0 && crnProtocol.getTaskNo() == 0 ) { | 
 |  |  |                     if (crnProtocol.getBay()!=1 || crnProtocol.getLevel()!=1){ | 
 |  |  |                         //获取工作档 | 
 |  |  |                         List<TaskWrk> taskWrks = taskWrkMapper.selectByLaneNo(crnProtocol.getLaneNo()); | 
 |  |  |                         if (!taskWrks.isEmpty()) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         // 更新工作档状态为14失败 | 
 |  |  |                         wrkMast.setWrkSts(14L); | 
 |  |  |                         wrkMast.setCrnEndTime(new Date()); | 
 |  |  |                         if (wrkMastMapper.updateById(wrkMast) != 0) { | 
 |  |  |                             // 复位堆垛机 | 
 |  |  |                             crnThread.setResetFlag(true); | 
 |  |  |                         } else { | 
 |  |  |                             log.error("更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo()); | 
 |  |  |                         List<TaskWrkLog> taskWrkLogs = taskWrkLogService.selectList(new EntityWrapper<TaskWrkLog>().eq("CRN_NO",crnProtocol.getLaneNo()).orderBy("COMPLETE_TIME",false)); | 
 |  |  |                         if (!taskWrkLogs.isEmpty()) { | 
 |  |  |                             boolean signT = false; | 
 |  |  |                             for (TaskWrkLog taskWrkLog : taskWrkLogs){ | 
 |  |  |                                 Date completeTime = taskWrkLog.getCompleteTime(); | 
 |  |  |                                 if (completeTime==null){ | 
 |  |  |                                     continue; | 
 |  |  |                                 } | 
 |  |  |                                 long differenceInSeconds = TimeCalculatorUtils.differenceInMilliseconds(completeTime, new Date()); | 
 |  |  |                                 if (differenceInSeconds <= 60*2*1000) { | 
 |  |  |                                     signT = true; | 
 |  |  |                                     break; | 
 |  |  |                                 } else { | 
 |  |  |                                     signT = false; | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                             if (signT){ | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                         // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                         CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                         crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
 |  |  |                         crnCommand.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机巷道编号 | 
 |  |  |                         crnCommand.setTaskNo((short)999); // 工作号 | 
 |  |  |                         crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                         crnCommand.setTaskMode(CrnTaskModeType.SITE_MOVE); // 任务模式:  站位移转4 | 
 |  |  |                         int row = crnProtocol.getLaneNo() * 2; | 
 |  |  |                         crnCommand.setSourcePosX((short) row);     // 源库位排 | 
 |  |  |                         crnCommand.setSourcePosY((short) 1);     // 源库位列 | 
 |  |  |                         crnCommand.setSourcePosZ((short) 1);   // 源库位层 | 
 |  |  |                         crnCommand.setDestinationPosX((short) row);     // 目标库位排 | 
 |  |  |                         crnCommand.setDestinationPosY((short) 1);     // 目标库位层 | 
 |  |  |                         crnCommand.setDestinationPosZ((short) 1);     // 目标库位列 | 
 |  |  |                         if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                             log.error("堆垛机自动回源点失败,堆垛机号={}", crnProtocol.getCrnNo()); | 
 |  |  |  | 
 |  |  |                             if (System.currentTimeMillis()-currentTimeMilliConnectCrnAuto>1000*60*10){ | 
 |  |  |                                 try{ | 
 |  |  |                                     DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
 |  |  |                                     deviceErrorService.addDeviceError("CrnErr", crnProtocol.getCrnNo(), "堆垛机自动回源点失败"); | 
 |  |  |                                 } catch (Exception e2){ | 
 |  |  |                                 } | 
 |  |  |                                 if (currentTimeMilliConnectCrnAuto == 0){ | 
 |  |  |                                     currentTimeMilliConnectCrnAuto = System.currentTimeMillis()-1000*60*10-1; | 
 |  |  |                                 } else { | 
 |  |  |                                     currentTimeMilliConnectCrnAuto = System.currentTimeMillis(); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e){ | 
 |  |  |                 log.error("堆垛机10分钟无任务则回到源点失败"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 入出库  ===>>  堆垛机入出库作业下发 | 
 |  |  |      */ | 
 |  |  |     public synchronized void crnIoExecute(){ | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |     public synchronized void crnIoExecute() throws IOException { | 
 |  |  |         for (CrnSlave crnSlave : slaveProperties.getCrn()) { | 
 |  |  |             // 获取堆垛机信息 | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); | 
 |  |  |             CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |             if (crnProtocol == null) { continue; } | 
 |  |  |             BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); | 
 |  |  |             if (crnProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             BasCrnp basCrnp = basCrnpService.selectById(crnSlave.getId()); | 
 |  |  |             if (basCrnp == null) { | 
 |  |  |                 log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); | 
 |  |  |                 log.error("{}号堆垛机尚未在数据库进行维护!", crnSlave.getId()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  | //            //堆垛机回原点任务中 | 
 |  |  | //            if(crnThread.isBackHpFlag()){ | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  |             CrnSlave crn = new CrnSlave(crnSlave); | 
 |  |  |             if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){ | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (!crnSlave.getId().equals(crnProtocol.getLaneNo())) { | 
 |  |  |                 for (CrnSlave crnOther : slaveProperties.getCrn()) { | 
 |  |  |                     if (crnOther.getId().equals(crnProtocol.getLaneNo())) { | 
 |  |  |                         crn.updateCrnInStn(crnOther); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             try{ | 
 |  |  |                 // 库位移转 | 
 |  |  |                 this.locToLoc(crn, crnProtocol); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("库位移转失败"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 只有当堆垛机空闲 并且 无任务时才继续执行 | 
 |  |  |             if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO | 
 |  |  | 
 |  |  |                         crnProtocol.setLastIo("O"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             }  else { | 
 |  |  |                 if (crnProtocol.getModeType() == CrnModeType.AUTO && crnProtocol.getStatusType() == CrnStatusType.IDLE){ | 
 |  |  |                     if (crnProtocol.getTaskNo() != 0){ | 
 |  |  |                         CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "工作号不为0"); | 
 |  |  |                     } | 
 |  |  |                     if (crnProtocol.getLoaded() != 0){ | 
 |  |  |                         CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "载货台有物"); | 
 |  |  |                     } | 
 |  |  |                     if (crnProtocol.getForkPos() != 0){ | 
 |  |  |                         CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "货叉位置不在中位"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             // 库位移转 | 
 |  |  |             this.locToLoc(crn, crnProtocol); | 
 |  |  | //            this.crnRebackHp(crnProtocol, crnThread); | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 回原点,堆垛机没有执行中任务,设备存在入库任务时叫回原点 | 
 |  |  |      */ | 
 |  |  |     public synchronized void crnRebackHp(CrnProtocol crnProtocol, CrnThread crnThread){ | 
 |  |  | //        for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  | //            // 获取堆垛机信息 | 
 |  |  | //            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  | //            CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  | //            if (crnProtocol == null) { | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  | //            BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); | 
 |  |  | //            if (basCrnp == null) { | 
 |  |  | //                log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  |             if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { | 
 |  |  |                 if(crnProtocol.getBay() ==1 && crnProtocol.getLevel()==1){ | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 已经存在吊车执行任务时,则过滤3,12 | 
 |  |  |                 if (wrkMastMapper.selectWorking(crnProtocol.getCrnNo()) != null) { | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //堆垛机有执行中任务,过滤3,4,11,12 | 
 |  |  |                 if (wrkMastMapper.selectCrnWorking(crnProtocol.getCrnNo()) != null) { | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //输送线没有入库任务,过滤2 | 
 |  |  |                 if (wrkMastMapper.selectDevWorking(crnProtocol.getCrnNo()) == null) { | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |                 log.info("堆垛机召回原点==>>" + crnProtocol.getCrnNo() + "号堆垛机有入库任务,召回原点"); | 
 |  |  |                 // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                 CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                 crnCommand.setCrnNo(crnProtocol.getCrnNo()); // 堆垛机编号 | 
 |  |  |                 crnCommand.setTaskNo((short) 9999); // 工作号 | 
 |  |  |                 crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                 crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式:  回原点 | 
 |  |  |                 crnCommand.setSourcePosX((short) 0);     // 源库位排 | 
 |  |  |                 crnCommand.setSourcePosY((short) 0);     // 源库位列 | 
 |  |  |                 crnCommand.setSourcePosZ((short) 0);     // 源库位层 | 
 |  |  |                 crnCommand.setDestinationPosX((short) 0);     // 目标库位排 | 
 |  |  |                 crnCommand.setDestinationPosY((short) 0);     // 目标库位列 | 
 |  |  |                 crnCommand.setDestinationPosZ((short) 0);     // 目标库位层 | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Crn, crnProtocol.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                     log.error("堆垛机回原点命令下发失败,堆垛机号={},任务数据={}", crnProtocol.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                 } | 
 |  |  |                 crnThread.setBackHpFlag(true); | 
 |  |  |             } | 
 |  |  | //        } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入库  ===>>  堆垛机站到库位 | 
 |  |  |      */ | 
 |  |  |     public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol){ | 
 |  |  |     public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException { | 
 |  |  |         for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) { | 
 |  |  |             boolean flag = false; | 
 |  |  |             // 获取堆垛机入库站信息 | 
 |  |  |             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |             StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |             if (staProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } else { | 
 |  |  |                 staProtocol = staProtocol.clone(); | 
 |  |  |             } | 
 |  |  |             // 查询站点详细信息 | 
 |  |  |             BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  |             if (staDetl == null) { | 
 |  |  |                 log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable() | 
 |  |  |                     && staDetl.getCanining()!=null && staDetl.getCanining().equals("Y")) { | 
 |  |  |                 flag = true; | 
 |  |  |             } | 
 |  |  |             if (!flag) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             // 获取工作状态为2(设备上走)的入库工作档 | 
 |  |  |             WrkMast wrkMast = wrkMastMapper.selectPakInStep2(slave.getId(), staProtocol.getWorkNo().intValue(), crnStn.getStaNo()); | 
 |  |  |             if(null == wrkMast) { | 
 |  |  | //                log.error("查询无待入库数据--wrk_sts=2, 工作号={}", staProtocol.getWorkNo()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             // 获取库位信息 | 
 |  |  |             LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); | 
 |  |  |             if (locMast == null) { | 
 |  |  |                 log.error("查询库存无数据--库位号{}", wrkMast.getLocNo()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             if (!locMast.getLocSts().equals("S") && !locMast.getLocSts().equals("Q")) { | 
 |  |  |                 log.error("入库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), locMast.getLocSts()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo())); | 
 |  |  |  | 
 |  |  |             // 堆垛机控制过滤 | 
 |  |  |             if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 已经存在吊车执行任务时,则过滤 | 
 |  |  |             if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 双深库位且浅库位有货,则需先对浅库位进行库位移转 | 
 |  |  |             if (Utils.isDeepLoc(slaveProperties, wrkMast.getLocNo())) { | 
 |  |  |                 String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo()); | 
 |  |  |                 LocMast shallowLoc = locMastService.selectById(shallowLocNo); | 
 |  |  |                 // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! | 
 |  |  |                 if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { | 
 |  |  |                     WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                     if (null == waitWrkMast) { | 
 |  |  |                         log.error("{}库位异常,未检索到相应工作档!", shallowLocNo); | 
 |  |  |                     } else { | 
 |  |  |                         waitWrkMast.setIoPri(15D); | 
 |  |  |                         waitWrkMast.setModiTime(new Date()); | 
 |  |  |                         if (wrkMastMapper.updateById(waitWrkMast) == 0) { | 
 |  |  |                             log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); | 
 |  |  |                         } | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { | 
 |  |  |                     // 此标记避免多次执行移库任务 | 
 |  |  |                     if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) { | 
 |  |  |                         wrkMast.setUpdMk("Y"); | 
 |  |  |                         wrkMast.setIoPri(14D); | 
 |  |  |                         wrkMastMapper.updateById(wrkMast); | 
 |  |  |                         // 生成工作档,将浅库位移转到新的库位中 | 
 |  |  |                         moveLocForDeepLoc(slave, shallowLoc); | 
 |  |  |                         // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行) | 
 |  |  | //                        moveLocForDeepLocPakin(slave, shallowLoc, wrkMast); | 
 |  |  |                     } | 
 |  |  |             for (StaDesc staDesc : staDescs) { | 
 |  |  |                 boolean flag = false; | 
 |  |  |                 // 获取堆垛机入库站信息 | 
 |  |  |                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } else if (shallowLoc.getLocSts().equals("Q")){ | 
 |  |  |                     WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                     if (null != waitWrkMast && waitWrkMast.getWrkSts()==4) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |                 // 查询站点详细信息 | 
 |  |  |                 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  |                 if (staDetl == null) { | 
 |  |  |                     log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 | 
 |  |  | //                        && staProtocol.isInEnable() | 
 |  |  |                         && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) { | 
 |  |  |                     flag = true; | 
 |  |  |                 } | 
 |  |  |                 if (!flag) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |             CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |             crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |             crnCommand.setTaskNo(wrkMast.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(locMast.getRow1().shortValue());     // 目标库位排 | 
 |  |  |             crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列 | 
 |  |  |             crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层 | 
 |  |  |             if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                 log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |             } else { | 
 |  |  |                 // 获取工作状态为2(设备上走)的入库工作档 | 
 |  |  |                 TaskWrk taskWrk = taskWrkMapper.selectPakIn(crnProtocol.getLaneNo(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString()); | 
 |  |  |                 if (null == taskWrk) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  | //                long startTime = System.currentTimeMillis(); | 
 |  |  | //                while ((System.currentTimeMillis() - startTime) < COMMAND_TIMEOUT) { | 
 |  |  |                 // 堆垛机控制过滤 | 
 |  |  |                 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE)) { | 
 |  |  |                     devpThread.setErrorDev(staProtocol.getSiteId(), "堆垛机非空闲"); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 if (crnProtocol.getTaskNo() != 0) { | 
 |  |  |                     devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机工作号不为0"); | 
 |  |  |                     CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "工作号不为0"); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                 if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { | 
 |  |  |                     devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机存在吊车任务"); | 
 |  |  |                     CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机存在执行中吊车任务"); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  | //                int workNo = commonService.getWorkNo(WorkNoType.PAKIN.type);//获取入库工作号 | 
 |  |  | //                taskWrk.setWrkNo(workNo);//工作号 | 
 |  |  |                 Date now = new Date(); | 
 |  |  |                 taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态 | 
 |  |  | //                taskWrk.setAssignTime(now);//派发时间 | 
 |  |  |                 taskWrk.setExecuteTime(now); | 
 |  |  |                 taskWrk.setWrkSts(3);//工作状态 3.吊车入库 | 
 |  |  |                 taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号 | 
 |  |  |                 taskWrk.setModiTime(now); | 
 |  |  |                 taskWrk.setModiUser(9988L); | 
 |  |  |  | 
 |  |  | //                //取出命令 | 
 |  |  | //                List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); | 
 |  |  | //                Integer commandStep = taskWrk.getCommandStep(); | 
 |  |  | //                if (commandInfos.isEmpty()) { | 
 |  |  | //                    continue;//命令空 | 
 |  |  | //                } | 
 |  |  | //                CommandInfo commandInfo = commandInfos.get(commandStep); | 
 |  |  | //                CommandPackage commandPackage = JSON.parseObject(commandInfo.getCommand(), CommandPackage.class);//取出命令报文 | 
 |  |  | //                CrnCommand crnCommand = JSON.parseObject(commandPackage.getCommand().toString(), CrnCommand.class); | 
 |  |  | // | 
 |  |  | //                    if (true) { | 
 |  |  | //                        break; | 
 |  |  | //                if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  | //                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  | //                } else { | 
 |  |  | //                    // 修改工作档状态 2.设备上走 => 3.吊车入库中 | 
 |  |  | //                    Date now = new Date(); | 
 |  |  | //                    taskWrk.setWrkSts(3); | 
 |  |  | //                    taskWrk.setModiTime(now); | 
 |  |  | //                    if (taskWrkMapper.updateById(taskWrk) == 0) { | 
 |  |  | //                        log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  | //                    } | 
 |  |  | //                    //开始运行 | 
 |  |  | //                    String response = CrnStartRunning(taskWrk); | 
 |  |  | //                    JSONObject jsonObject = JSON.parseObject(response); | 
 |  |  | //                    if (!Cools.isEmpty(jsonObject.getInteger("code")) && jsonObject.getInteger("code").equals(200)) { | 
 |  |  | // | 
 |  |  | //                    try{ | 
 |  |  | //                        Thread.sleep(500); | 
 |  |  | //                    }catch(Exception ignore){} | 
 |  |  | //                    }else { | 
 |  |  | //                        log.error("入库开始运行通讯失败,"+jsonObject.get("msg")); | 
 |  |  | // | 
 |  |  | //                    } | 
 |  |  | //                } | 
 |  |  |  | 
 |  |  |                 // 修改工作档状态 2.设备上走 => 3.吊车入库中 | 
 |  |  |                 Date now = new Date(); | 
 |  |  |                 wrkMast.setWrkSts(3L); | 
 |  |  |                 wrkMast.setCrnStrTime(now); | 
 |  |  |                 wrkMast.setModiTime(now); | 
 |  |  |                 if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                     log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                 // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                 CrnCommand crnCommand1 = new CrnCommand(); | 
 |  |  |                 crnCommand1.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |                 crnCommand1.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机巷道编号 | 
 |  |  |                 crnCommand1.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                 crnCommand1.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                 crnCommand1.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                 crnCommand1.setSourcePosX(crnStn.getRow().shortValue());     // 源库位排 | 
 |  |  |                 crnCommand1.setSourcePosY(crnStn.getBay().shortValue());     // 源库位列 | 
 |  |  |                 crnCommand1.setSourcePosZ(crnStn.getLev().shortValue());   // 源库位层 | 
 |  |  |                 crnCommand1.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint()));     // 目标库位列 | 
 |  |  |                 int bay1 = Utils.getBayShort(taskWrk.getTargetPoint()) + 1; | 
 |  |  |                 crnCommand1.setDestinationPosY((short)bay1);     // 目标库位层 | 
 |  |  |                 crnCommand1.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位排 | 
 |  |  | //                crnCommand.setCommand((short) 1); | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand1))) { | 
 |  |  |                     log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand1)); | 
 |  |  |                     devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机命令生成失败"); | 
 |  |  |                     CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "运行命令下发失败"); | 
 |  |  |  | 
 |  |  |                     throw new CoolException("堆垛机命令生成失败"); | 
 |  |  |                 } else { | 
 |  |  |                     try { | 
 |  |  |                         devpThread.setErrorDev(staProtocol.getSiteId(), "-"); | 
 |  |  |                         CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "-"); | 
 |  |  |  | 
 |  |  |                         taskWrkService.updateById(taskWrk); | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                         log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                         log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,异常:" + e); | 
 |  |  |                     } | 
 |  |  |                     try { | 
 |  |  |                         HashMap<String, Object> headParam = new HashMap<>(); | 
 |  |  |                         headParam.put("taskNo",taskWrk.getTaskNo()); | 
 |  |  |                         headParam.put("taskStatus",taskWrk.getStatusWms()); | 
 |  |  |                         headParam.put("ioType",taskWrk.getIoTypeWms()); | 
 |  |  |                         headParam.put("barCode",taskWrk.getBarcode()); | 
 |  |  |                         headParam.put("reportTime", LocalDateTime.now()); | 
 |  |  |                         headParam.put("weight",taskWrk.getScWeight().doubleValue()); | 
 |  |  |  | 
 |  |  |                         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失败", JSON.toJSONString(taskWrk)); | 
 |  |  | //                        throw new CoolException("wcs派发入库任务上报wms失败"); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // return; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |      * 出库  ===>>  库位到堆垛机站 | 
 |  |  |      * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库 | 
 |  |  |      */ | 
 |  |  |     public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){ | 
 |  |  |     public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |         List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(), null); | 
 |  |  |         if (taskWrksInitial.size() == 0) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { | 
 |  |  |             // 获取工作状态为11(生成出库ID)的出库工作档 | 
 |  |  | //            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo()); | 
 |  |  |             List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo()); | 
 |  |  |             for (WrkMast wrkMast : wrkMasts){ | 
 |  |  |                 if (wrkMast == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 // 工作档状态判断 | 
 |  |  |                 if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null){ | 
 |  |  |                     log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 // 获取源库位信息 | 
 |  |  |                 LocMast sourceSta = locMastService.selectById(wrkMast.getSourceLocNo()); | 
 |  |  |                 if (!sourceSta.getLocSts().equals("R") &&!sourceSta.getLocSts().equals("P")) { | 
 |  |  |                     log.error("出库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), sourceSta.getLocSts()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 // 获取堆垛机出库站信息 | 
 |  |  |                 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     break; | 
 |  |  | //                    continue; | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  | //            // 入出库模式判断 | 
 |  |  | //            if (devpThread.ioMode != IoModeType.PAKOUT_MODE) { continue; } | 
 |  |  |                 if (wrkMast.getStaNo() == 204 && devpThread.ioModeOf2F != IoModeType.PAKOUT_MODE) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 查询站点详细信息 | 
 |  |  |                 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  |                 if (staDetl == null) { | 
 |  |  |                     log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  |                     break; | 
 |  |  | //                    continue; | 
 |  |  |                 } | 
 |  |  |                 // 判断堆垛机出库站状态 | 
 |  |  |                 if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y") | 
 |  |  |                         && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { | 
 |  |  |                     // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |  | 
 |  |  |                     // 堆垛机控制过滤 | 
 |  |  |                     if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  | //                        continue; | 
 |  |  |             List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo())); | 
 |  |  |             for (StaDesc staDesc : staDescs) { | 
 |  |  |                 // 获取工作状态为11(生成出库ID)的出库工作档 | 
 |  |  |                 List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(), staDesc.getStnNo().toString()); | 
 |  |  |                 for (TaskWrk taskWrk : taskWrks) { | 
 |  |  |                     if (taskWrk == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 工作档状态判断 | 
 |  |  |                     if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null || taskWrk.getStartPoint() == null) { | 
 |  |  |                         log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getStartPoint(), taskWrk.getIoType()); | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 获取堆垛机出库站信息 | 
 |  |  |                     SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |                     StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |                     if (staProtocol == null) { | 
 |  |  |                         break; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 双深库位且浅库位有货,则需先对浅库位进行库位移转 | 
 |  |  |                     if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) { | 
 |  |  |                         String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo()); | 
 |  |  |                         LocMast shallowLoc = locMastService.selectById(shallowLocNo); | 
 |  |  |                         // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! | 
 |  |  |                         if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { | 
 |  |  |                             WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                             if (null == waitWrkMast) { | 
 |  |  |                                 log.error("{}库位异常,未检索到相应工作档!", shallowLocNo); | 
 |  |  |                             } else { | 
 |  |  |                                 if(waitWrkMast.getWrkSts() == 11) { | 
 |  |  |                                     waitWrkMast.setIoPri(15D); | 
 |  |  |                                     waitWrkMast.setModiTime(new Date()); | 
 |  |  |                                     if (wrkMastMapper.updateById(waitWrkMast) == 0) { | 
 |  |  |                                         log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); | 
 |  |  |                                     } | 
 |  |  |                                     continue; | 
 |  |  |                                 } else { | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { | 
 |  |  | //                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                             //2022-08-16 modify,不根据updmk标记移库任务(容易被取消导致堵塞),查询工作档是否存在任务 | 
 |  |  |                             WrkMast waitWrkMast = wrkMastMapper.selectByLocNo1(shallowLocNo); | 
 |  |  |                             // 此标记避免多次执行移库任务 | 
 |  |  | //                            if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk()) | 
 |  |  | //                                || Cools.isEmpty(waitWrkMast)) { | 
 |  |  |                             if (Cools.isEmpty(waitWrkMast)) { | 
 |  |  |                                 wrkMast.setUpdMk("Y"); | 
 |  |  |                                 wrkMastMapper.updateById(wrkMast); | 
 |  |  |                                 // 生成工作档,将浅库位移转到新的库位中 | 
 |  |  |                                 moveLocForDeepLoc(slave, shallowLoc); | 
 |  |  |                             } | 
 |  |  |                             log.error("{}任务出库失败,浅库位堵塞!浅库位号:{}", wrkMast.getWrkNo(),shallowLocNo); | 
 |  |  |                             continue; | 
 |  |  |                         } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")){ | 
 |  |  |                             WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  |                             if (null != waitWrkMast && waitWrkMast.getWrkSts()==4) { | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                     if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
 |  |  |                         break; | 
 |  |  | //                        return; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 1.堆垛机开始移动 | 
 |  |  |                     CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                     crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |                     crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                     crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                     crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                     crnCommand.setSourcePosX(sourceSta.getRow1().shortValue());     // 源库位排 | 
 |  |  |                     crnCommand.setSourcePosY(sourceSta.getBay1().shortValue());     // 源库位列 | 
 |  |  |                     crnCommand.setSourcePosZ(sourceSta.getLev1().shortValue());     // 源库位层 | 
 |  |  |                     crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排 | 
 |  |  |                     crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列 | 
 |  |  |                     crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层 | 
 |  |  |                     if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                         log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                     } else { | 
 |  |  |                         // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                         Date now = new Date(); | 
 |  |  |                         wrkMast.setWrkSts(12L); | 
 |  |  |                         wrkMast.setCrnStrTime(now); | 
 |  |  |                         wrkMast.setModiTime(now); | 
 |  |  |                         if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                             log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                         } | 
 |  |  |                         staProtocol = staProtocol.clone(); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 查询站点详细信息 | 
 |  |  |                     BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  |                     if (staDetl == null) { | 
 |  |  |                         log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  |                         break; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 判断堆垛机出库站状态 | 
 |  |  | //                    if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) { | 
 |  |  |  | 
 |  |  | //                    // 判断堆垛机出库站状态 | 
 |  |  |                     if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") | 
 |  |  |                             && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { | 
 |  |  |                         // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |  | 
 |  |  |                         // 堆垛机控制过滤 | 
 |  |  |                         if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE)) { | 
 |  |  |                             devpThread.setErrorDev(staProtocol.getSiteId(), "堆垛机非空闲"); | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         if (crnProtocol.getTaskNo() != 0) { | 
 |  |  |                             devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机工作号不为0"); | 
 |  |  |                             CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "工作号不为0"); | 
 |  |  |  | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                         if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { | 
 |  |  |                             devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机存在吊车任务"); | 
 |  |  |                             CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机存在执行中吊车任务"); | 
 |  |  |                             break; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         CrnCommand command = new CrnCommand(); | 
 |  |  |                         command.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |                         command.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机编号 | 
 |  |  |                         command.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                         command.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                         command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式 | 
 |  |  |                         command.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint()));     // 源库位排 | 
 |  |  |                         int bayS = Utils.getBayShort(taskWrk.getStartPoint()) + 1; | 
 |  |  |                         command.setSourcePosY((short)bayS);     // 源库位列 | 
 |  |  |                         command.setSourcePosZ(Utils.getLevShort(taskWrk.getStartPoint()));     // 源库位层 | 
 |  |  |                         command.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排 | 
 |  |  |                         command.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列 | 
 |  |  |                         command.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层 | 
 |  |  | //                        command.setCommand((short) 1); | 
 |  |  |                         if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command))) { | 
 |  |  |                             log.error("堆垛机命令生成失败,堆垛机号={},巷道={},任务数据={}", slave.getId(), taskWrk.getCrnNo(), JSON.toJSON(command)); | 
 |  |  |                             devpThread.setErrorDev(staProtocol.getSiteId(), crnProtocol.getLaneNo()+"巷道堆垛机命令生成失败"); | 
 |  |  |                             CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "运行命令下发失败"); | 
 |  |  |                             throw new CoolException("堆垛机命令生成失败"); | 
 |  |  |                         } else { | 
 |  |  |                             try { | 
 |  |  |                                 // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                                 Date now = new Date(); | 
 |  |  |                                 taskWrk.setWrkSts(12); | 
 |  |  |                                 taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id); | 
 |  |  |                                 taskWrk.setModiTime(now); | 
 |  |  |                                 taskWrk.setExecuteTime(now); | 
 |  |  |                                 devpThread.setErrorDev(staProtocol.getSiteId(), "-"); | 
 |  |  |                                 CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "-"); | 
 |  |  |  | 
 |  |  |                                 if (taskWrkMapper.updateById(taskWrk) == 0) { | 
 |  |  |                                     log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                                 } | 
 |  |  |                             } catch (Exception e) { | 
 |  |  |                                 log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                                 log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,异常:" + e); | 
 |  |  |                             } | 
 |  |  |                             try { | 
 |  |  |                                 HashMap<String, Object> headParam = new HashMap<>(); | 
 |  |  |                                 headParam.put("taskNo",taskWrk.getTaskNo()); | 
 |  |  |                                 headParam.put("taskStatus",taskWrk.getStatusWms()); | 
 |  |  |                                 headParam.put("ioType",taskWrk.getIoTypeWms()); | 
 |  |  |                                 headParam.put("barCode",taskWrk.getBarcode()); | 
 |  |  |                                 headParam.put("reportTime", LocalDateTime.now()); | 
 |  |  |                                 headParam.put("weight",taskWrk.getScWeight().doubleValue()); | 
 |  |  |  | 
 |  |  |                                 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失败", JSON.toJSONString(taskWrk)); | 
 |  |  | //                                throw new CoolException("wcs派发入库任务上报wms失败"); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "-"); | 
 |  |  |                         if (staProtocol.isAutoing()){ | 
 |  |  |                             if (staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")){ | 
 |  |  |                                 CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "能出:未打开"); | 
 |  |  |                             } | 
 |  |  |                             if (staProtocol.getWorkNo() == 0){ | 
 |  |  |                                 CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "工作号不为0"); | 
 |  |  |                             } | 
 |  |  |                             if (staProtocol.isOutEnable()){ | 
 |  |  |                                 CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "没有可出"); | 
 |  |  |                             } | 
 |  |  |                             if (staProtocol.isLoading()){ | 
 |  |  |                                 CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "出库站有物"); | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "出库站点:非自动"); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | //    /** | 
 |  |  | //     * 出库  ===>>  库位到堆垛机站 | 
 |  |  | //     */ | 
 |  |  | //    public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){ | 
 |  |  | //        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { | 
 |  |  | //            // 获取工作状态为11(生成出库ID)的出库工作档 | 
 |  |  | //            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo()); | 
 |  |  | //            if (wrkMast == null) { | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  | //            // 工作档状态判断 | 
 |  |  | //            if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null){ | 
 |  |  | //                log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType()); | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  | //            // 获取源库位信息 | 
 |  |  | //            LocMast sourceSta = locMastService.selectById(wrkMast.getSourceLocNo()); | 
 |  |  | //            if (!sourceSta.getLocSts().equals("R") &&!sourceSta.getLocSts().equals("P")) { | 
 |  |  | //                log.error("出库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), sourceSta.getLocSts()); | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  | //            // 获取堆垛机出库站信息 | 
 |  |  | //            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  | //            StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  | //            if (staProtocol == null) { | 
 |  |  | //                continue; | 
 |  |  | //            } else { | 
 |  |  | //                staProtocol = staProtocol.clone(); | 
 |  |  | //            } | 
 |  |  | // | 
 |  |  | ////            // 入出库模式判断 | 
 |  |  | ////            if (devpThread.ioMode != IoModeType.PAKOUT_MODE) { continue; } | 
 |  |  | // | 
 |  |  | // | 
 |  |  | //            // 查询站点详细信息 | 
 |  |  | //            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  | //            if (staDetl == null) { | 
 |  |  | //                log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  | //                continue; | 
 |  |  | //            } | 
 |  |  | //            // 判断堆垛机出库站状态 | 
 |  |  | //            if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y") | 
 |  |  | //                    && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { | 
 |  |  | //                // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  | // | 
 |  |  | //                // 堆垛机控制过滤 | 
 |  |  | //                if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  | //                    continue; | 
 |  |  | //                } | 
 |  |  | // | 
 |  |  | //                // 双深库位且浅库位有货,则需先对浅库位进行库位移转 | 
 |  |  | //                if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) { | 
 |  |  | //                    String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo()); | 
 |  |  | //                    LocMast shallowLoc = locMastService.selectById(shallowLocNo); | 
 |  |  | //                    // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬! | 
 |  |  | //                    if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) { | 
 |  |  | //                        WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo); | 
 |  |  | //                        if (null == waitWrkMast) { | 
 |  |  | //                            log.error("{}库位异常,未检索到相应工作档!", shallowLocNo); | 
 |  |  | //                        } else { | 
 |  |  | //                            if(waitWrkMast.getWrkSts() == 11) { | 
 |  |  | //                                waitWrkMast.setIoPri(15D); | 
 |  |  | //                                waitWrkMast.setModiTime(new Date()); | 
 |  |  | //                                if (wrkMastMapper.updateById(waitWrkMast) == 0) { | 
 |  |  | //                                    log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo()); | 
 |  |  | //                                } | 
 |  |  | //                                continue; | 
 |  |  | //                            } else { | 
 |  |  | // | 
 |  |  | //                            } | 
 |  |  | //                        } | 
 |  |  | //                    } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) { | 
 |  |  | //                        // 此标记避免多次执行移库任务 | 
 |  |  | //                        if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) { | 
 |  |  | //                            wrkMast.setUpdMk("Y"); | 
 |  |  | //                            wrkMastMapper.updateById(wrkMast); | 
 |  |  | //                            // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行) | 
 |  |  | //                            moveLocForDeepLoc(slave, shallowLoc); | 
 |  |  | //                        } | 
 |  |  | //                        log.error("{}任务出库失败,浅库位堵塞!", wrkMast.getWrkNo()); | 
 |  |  | //                        continue; | 
 |  |  | //                    } | 
 |  |  | //                } | 
 |  |  | // | 
 |  |  | //                // 已经存在吊车执行任务时,则过滤 | 
 |  |  | //                if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
 |  |  | //                    return; | 
 |  |  | //                } | 
 |  |  | // | 
 |  |  | //                // 1.堆垛机开始移动 | 
 |  |  | //                CrnCommand crnCommand = new CrnCommand(); | 
 |  |  | //                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  | //                crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
 |  |  | //                crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  | //                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  | //                crnCommand.setSourcePosX(sourceSta.getRow1().shortValue());     // 源库位排 | 
 |  |  | //                crnCommand.setSourcePosY(sourceSta.getBay1().shortValue());     // 源库位列 | 
 |  |  | //                crnCommand.setSourcePosZ(sourceSta.getLev1().shortValue());     // 源库位层 | 
 |  |  | //                crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排 | 
 |  |  | //                crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列 | 
 |  |  | //                crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层 | 
 |  |  | //                if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  | //                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  | //                } else { | 
 |  |  | //                    // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  | //                    Date now = new Date(); | 
 |  |  | //                    wrkMast.setWrkSts(12L); | 
 |  |  | //                    wrkMast.setCrnStrTime(now); | 
 |  |  | //                    wrkMast.setModiTime(now); | 
 |  |  | //                    if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  | //                        log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  | //                    } | 
 |  |  | //                } | 
 |  |  | //            } | 
 |  |  | //        } | 
 |  |  | //    } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 库位移转 | 
 |  |  |      */ | 
 |  |  |     public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol){ | 
 |  |  |         // 获取工作档信息 | 
 |  |  |         WrkMast wrkMast = wrkMastMapper.selectLocMove(slave.getId()); | 
 |  |  |         if (null == wrkMast) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         // 获取源库位信息 | 
 |  |  |         LocMast sourceSta = locMastService.selectById(wrkMast.getSourceLocNo()); | 
 |  |  |         if (null == sourceSta) { | 
 |  |  |             log.error("工作档库位移转失败,原因:检索源库位失败!工作号={},源库位={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo()); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         // 源库位  库位状态判断 | 
 |  |  |         if (!sourceSta.getLocSts().equals("R") && !sourceSta.getLocSts().equals("S")) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         // 获取目标库位信息 | 
 |  |  |         LocMast sta = locMastService.selectById(wrkMast.getLocNo()); | 
 |  |  |         if (null == sta) { | 
 |  |  |             log.error("工作档库位移转失败,原因:检索目标库位失败!工作号={},源库位={}", wrkMast.getWrkNo(), wrkMast.getLocNo()); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         // 获取堆垛机信息 并 判断是否可入出 | 
 |  |  |         BasCrnp basCrnp = basCrnpService.selectById(slave.getId()); | 
 |  |  |         if (!basCrnp.getInEnable().equals("Y") && !basCrnp.getOutEnable().equals("Y")) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |     public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |         for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { | 
 |  |  |             // 获取工作状态为11(生成出库ID)的移库工作档 | 
 |  |  |             List<TaskWrk> taskWrks = taskWrkMapper.selectList( | 
 |  |  |                     new EntityWrapper<TaskWrk>() | 
 |  |  |                             .eq("CRN_NO", crnProtocol.getLaneNo()) | 
 |  |  |                             .eq("WRK_STS", 11) | 
 |  |  |                             .eq("IO_TYPE", 3) | 
 |  |  |                             .orderBy("IO_PRI", false)); | 
 |  |  |             for (TaskWrk taskWrk : taskWrks) { | 
 |  |  |  | 
 |  |  |         // 堆垛机控制过滤 | 
 |  |  |         if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |                 // 双深库位且浅库位有货,则需先对浅库位进行库位移转 | 
 |  |  | //                if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) { | 
 |  |  | //                    String shallowLocNo = Utils.getShallowLoc(slaveProperties, taskWrk.getStartPoint()); | 
 |  |  | //                    TaskWrk hallowLocNoTask = taskWrkMapper.selectByStartPoint(shallowLocNo); | 
 |  |  | //                    if (!Cools.isEmpty(hallowLocNoTask)){ | 
 |  |  | //                        continue; | 
 |  |  | //                    } | 
 |  |  | //                } | 
 |  |  |                 // 堆垛机控制过滤 | 
 |  |  |                 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |         // 已经存在吊车执行任务时,则过滤 | 
 |  |  |         if (wrkMastMapper.selectWorking(slave.getId()) != null) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |                 // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                 if (taskWrkMapper.selectCrnWorking(crnProtocol.getLaneNo()) != null) { | 
 |  |  |                     CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "堆垛机存在执行中吊车任务"); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |         // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |         CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |         crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |         crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号 | 
 |  |  |         crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |         crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |         crnCommand.setSourcePosX(sourceSta.getRow1().shortValue());     // 源库位排 | 
 |  |  |         crnCommand.setSourcePosY(sourceSta.getBay1().shortValue());     // 源库位列 | 
 |  |  |         crnCommand.setSourcePosZ(sourceSta.getLev1().shortValue());     // 源库位层 | 
 |  |  |         crnCommand.setDestinationPosX(sta.getRow1().shortValue());     // 目标库位排 | 
 |  |  |         crnCommand.setDestinationPosY(sta.getBay1().shortValue());     // 目标库位列 | 
 |  |  |         crnCommand.setDestinationPosZ(sta.getLev1().shortValue());     // 目标库位层 | 
 |  |  |         if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |             log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |         } else { | 
 |  |  |             // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |             Date now = new Date(); | 
 |  |  |             wrkMast.setWrkSts(12L); | 
 |  |  |             wrkMast.setCrnStrTime(now); | 
 |  |  |             wrkMast.setModiTime(now); | 
 |  |  |             if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                 log.error("【库位移转】 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                 if (taskWrk == null || Cools.isEmpty(taskWrk.getTargetPoint()) || taskWrk.getTargetPoint().equals("") || taskWrk.getWrkNo() == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 // 工作档状态判断 | 
 |  |  |                 if (taskWrk.getIoType() != 3 || taskWrk.getTargetPoint() == null) { | 
 |  |  |                     log.error("查询工作档数据不符合条件--入出类型/目标库位号, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getTargetPoint(), taskWrk.getIoType()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 // 1.堆垛机开始移动 | 
 |  |  |                 CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                 crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 | 
 |  |  |                 crnCommand.setLaneNo(crnProtocol.getLaneNo()); // 堆垛机编号 | 
 |  |  |                 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                 crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                 crnCommand.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint()));     // 源库位排 | 
 |  |  |                 int bayS = Utils.getBayShort(taskWrk.getStartPoint()) + 1; | 
 |  |  |                 crnCommand.setSourcePosY((short)bayS);     // 源库位列 | 
 |  |  |                 crnCommand.setSourcePosZ(Utils.getLevShort(taskWrk.getStartPoint()));     // 源库位层 | 
 |  |  |                 crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint()));     // 目标库位排 | 
 |  |  |                 int bayE = Utils.getBayShort(taskWrk.getTargetPoint()) + 1; | 
 |  |  |                 crnCommand.setDestinationPosY((short)bayE);     // 目标库位列 | 
 |  |  |                 crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位层 | 
 |  |  | //                crnCommand.setCommand((short) 1); | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand))) { | 
 |  |  |                     log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                 } else { | 
 |  |  |                     // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                     Date now = new Date(); | 
 |  |  |                     taskWrk.setWrkSts(12); | 
 |  |  |                     taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id); | 
 |  |  |                     taskWrk.setModiTime(now); | 
 |  |  |                     taskWrk.setExecuteTime(now); | 
 |  |  |                     if (taskWrkMapper.updateById(taskWrk) == 0) { | 
 |  |  |                         log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                     try { | 
 |  |  |                         HashMap<String, Object> headParam = new HashMap<>(); | 
 |  |  |                         headParam.put("taskNo",taskWrk.getTaskNo()); | 
 |  |  |                         headParam.put("taskStatus",taskWrk.getStatusWms()); | 
 |  |  |                         headParam.put("ioType",taskWrk.getIoTypeWms()); | 
 |  |  |                         headParam.put("barCode",taskWrk.getBarcode()); | 
 |  |  |                         headParam.put("reportTime", LocalDateTime.now()); | 
 |  |  |                         headParam.put("weight",taskWrk.getScWeight().doubleValue()); | 
 |  |  |  | 
 |  |  |                         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失败"); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 执行对工作档的完成操作 | 
 |  |  |      */ | 
 |  |  |     @Async | 
 |  |  |     public void storeFinished() { | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |             // 获取堆垛机信息 | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |             if (crnProtocol == null) { continue; } | 
 |  |  |             //  状态:等待确认 并且  任务完成位 = 1 | 
 |  |  |             if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { | 
 |  |  |                 if(crnProtocol.getTaskNo()==9999){ | 
 |  |  |                     // 堆垛机复位 | 
 |  |  |                     crnThread.setResetFlag(true); | 
 |  |  |                 }else { | 
 |  |  |                     // 获取入库待确认工作档 | 
 |  |  |                     WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue()); | 
 |  |  |                     if (wrkMast == null) { | 
 |  |  |                         log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 入库 + 库位转移  ==> 4.入库完成 | 
 |  |  |                     if (wrkMast.getWrkSts() == 3 || (wrkMast.getWrkSts() == 12 && wrkMast.getIoType() == 11)) { | 
 |  |  |                         wrkMast.setWrkSts(4L); | 
 |  |  |                     } else { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     Date now = new Date(); | 
 |  |  |                     wrkMast.setCrnEndTime(now); | 
 |  |  |                     wrkMast.setModiTime(now); | 
 |  |  |                     // 修改成功后复位堆垛机 | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) > 0) { | 
 |  |  |                         // 堆垛机复位 | 
 |  |  |                         crnThread.setResetFlag(true); | 
 |  |  |     public void storeFinished() throws InterruptedException { | 
 |  |  |         for (CrnSlave crnSlave : slaveProperties.getCrn()) { | 
 |  |  |             try{ | 
 |  |  |                 // 获取堆垛机信息 | 
 |  |  |                 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crnSlave.getId()); | 
 |  |  |                 CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |                 if (crnProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 CrnSlave crn = new CrnSlave(crnSlave); | 
 |  |  |                 if (Cools.isEmpty(crnProtocol.getLaneNo()) || crnProtocol.getLaneNo()==0){ | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (!crnSlave.getId().equals(crnProtocol.getLaneNo())) { | 
 |  |  |                     for (CrnSlave crnOther : slaveProperties.getCrn()) { | 
 |  |  |                         if (crnOther.getId().equals(crnProtocol.getLaneNo())) { | 
 |  |  |                             crn.updateCrnInStn(crnOther); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //  状态:等待确认 并且  任务完成位 = 1 | 
 |  |  |                 if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) { | 
 |  |  |                     //获取入库待确认工作档 | 
 |  |  |                     TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crnProtocol.getLaneNo(), crnProtocol.getTaskNo().intValue()); | 
 |  |  |                     if (Cools.isEmpty(taskWrk) && crnProtocol.getTaskNo() != 999) { | 
 |  |  |                         log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},巷道号={},工作号={}", crn.getId(), crnProtocol.getLaneNo(), crnProtocol.getTaskNo()); | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  | //                Thread.sleep(300); | 
 |  |  |                     //确认完成信号 | 
 |  |  | //                    CrnOperatorParam crnOperatorParam = new CrnOperatorParam(); | 
 |  |  | //                    crnOperatorParam.setCrnNo(crn.getId()); | 
 |  |  |                     Date now = new Date(); | 
 |  |  |  | 
 |  |  | //                    crnController.crnTaskComplete(crnOperatorParam); | 
 |  |  | //                    MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, command)) | 
 |  |  |                     crnThread.setResetFlag(true); | 
 |  |  |  | 
 |  |  |                     if (!Cools.isEmpty(taskWrk)) { | 
 |  |  |                         if (taskWrk.getIoType() == 1 && taskWrk.getWrkSts() == 3) { | 
 |  |  |                             taskWrk.setWrkSts(4);//入库完成 | 
 |  |  |                             taskWrk.setStatus(TaskStatusType.OVER.id);//完结 | 
 |  |  |                             //更新库位状态 | 
 |  |  |                             LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); | 
 |  |  |                             locMast.setLocSts("F");//F.在库 | 
 |  |  |                             locMast.setBarcode(taskWrk.getBarcode());//托盘码 | 
 |  |  |                             locMast.setModiTime(now); | 
 |  |  |                             locMast.setModiUser(9999L); | 
 |  |  |                             locMastService.updateById(locMast); | 
 |  |  |                         } else if (taskWrk.getIoType() == 2 && taskWrk.getWrkSts() == 12) { | 
 |  |  |                             taskWrk.setWrkSts(13);//出库完成 | 
 |  |  |                             taskWrk.setStatus(TaskStatusType.OVER.id);//完结 | 
 |  |  |                             //更新库位状态 | 
 |  |  |                             LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint()); | 
 |  |  |                             locMast.setLocSts("O");//O.空库位 | 
 |  |  |                             locMast.setBarcode("");//托盘码 | 
 |  |  |                             locMast.setModiTime(now); | 
 |  |  |                             locMast.setModiUser(9999L); | 
 |  |  |                             locMastService.updateById(locMast); | 
 |  |  |                         } else if (taskWrk.getIoType() == 3 && taskWrk.getWrkSts() == 12) { | 
 |  |  |                             taskWrk.setWrkSts(4);//入库完成 | 
 |  |  |                             taskWrk.setStatus(TaskStatusType.OVER.id);//完结 | 
 |  |  |                             //更新库位状态 | 
 |  |  |                             LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); | 
 |  |  |                             locMast.setLocSts("F");//F.在库 | 
 |  |  |                             locMast.setBarcode(taskWrk.getBarcode());//托盘码 | 
 |  |  |                             locMast.setModiTime(now); | 
 |  |  |                             locMast.setModiUser(9999L); | 
 |  |  |                             locMastService.updateById(locMast); | 
 |  |  |  | 
 |  |  |                             LocMast locMast1 = locMastService.selectByLocNo(taskWrk.getStartPoint()); | 
 |  |  |                             locMast1.setLocSts("O");//O.空库位 | 
 |  |  |                             locMast1.setBarcode("");//托盘码 | 
 |  |  |                             locMast1.setModiTime(now); | 
 |  |  |                             locMast1.setModiUser(9999L); | 
 |  |  |                             locMastService.updateById(locMast1); | 
 |  |  |                         } | 
 |  |  |                         taskWrk.setModiTime(now); | 
 |  |  |                         taskWrk.setCompleteTime(now); | 
 |  |  |                         taskWrkService.updateById(taskWrk); | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //                    try { | 
 |  |  | //                        HashMap<String, Object> headParam = new HashMap<>(); | 
 |  |  | //                        headParam.put("taskNo",taskWrk.getTaskNo()); | 
 |  |  | //                        headParam.put("taskStatus",taskWrk.getStatusWms()); | 
 |  |  | //                        headParam.put("ioType",taskWrk.getIoTypeWms()); | 
 |  |  | //                        headParam.put("barCode",taskWrk.getBarcode()); | 
 |  |  | //                        headParam.put("reportTime", LocalDateTime.now()); | 
 |  |  | //                        headParam.put("weight",taskWrk.getScWeight().doubleValue()); | 
 |  |  | // | 
 |  |  | //                        String response; | 
 |  |  | //                        log.error("wcs完结任务上报wms==》", headParam); | 
 |  |  | // | 
 |  |  | //                        response = new HttpHandler.Builder() | 
 |  |  | //                                // .setHeaders(headParam) | 
 |  |  | //                                .setUri(wmsUrl) | 
 |  |  | //                                .setPath(taskStatusFeedbackPath) | 
 |  |  | //                                .setJson(JSON.toJSONString(headParam)) | 
 |  |  | //                                .build() | 
 |  |  | //                                .doPost(); | 
 |  |  | //                        log.error("wcs完结任务上报wms==》", response); | 
 |  |  | // | 
 |  |  | ////                        JSONObject jsonObject = JSON.parseObject(response); | 
 |  |  | ////                        log.error("wcs完结任务上报wms==》", jsonObject); | 
 |  |  | // | 
 |  |  | //                        apiLogService.save("wcs派发入库任务上报wms" | 
 |  |  | //                                , wmsUrl + taskStatusFeedbackPath | 
 |  |  | //                                , null | 
 |  |  | //                                , "127.0.0.1" | 
 |  |  | //                                , JSON.toJSONString(headParam) | 
 |  |  | //                                , response | 
 |  |  | //                                , true | 
 |  |  | //                        ); | 
 |  |  | //                    } catch (Exception e) { | 
 |  |  | //                        log.error("wcs完结任务上报wms失败", taskWrk); | 
 |  |  | //                        log.error("wcs完结任务上报wms失败,报错信息:", e); | 
 |  |  | ////                        throw new CoolException("wcs派发入库任务上报wms失败"); | 
 |  |  | //                    } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e){ | 
 |  |  |                 log.error("堆垛机执行对工作档的完成操作失败 ===>> [id:{}] [error:{}]", crnSlave.getId(), e.getMessage()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 堆垛机异常信息记录 | 
 |  |  |      */ | 
 |  |  |     @Async | 
 |  |  |     public void recCrnErr(){ | 
 |  |  |     public void recCrnErr() { | 
 |  |  |         Date now = new Date(); | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |             // 获取堆垛机信息 | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |             if (crnProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             if (true) { | 
 |  |  | //            if (crnProtocol.getModeType() != CrnModeType.STOP) { | 
 |  |  |                 // 有任务 | 
 |  |  |                 if (crnProtocol.getTaskNo() != 0) { | 
 |  |  |                     BasErrLog latest = basErrLogService.findLatestByTaskNo(crn.getId(), crnProtocol.getTaskNo().intValue()); | 
 |  |  |                     // 有异常 | 
 |  |  |                     if (latest == null) { | 
 |  |  |             try{ | 
 |  |  |                 // 获取堆垛机信息 | 
 |  |  |                 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |                 CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |                 if (crnProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 if (crnProtocol.getModeType() != CrnModeType.STOP) { | 
 |  |  |                     // 有任务 | 
 |  |  |                     if (crnProtocol.getTaskNo() != 0) { | 
 |  |  |                         BasErrLog latest = basErrLogService.findLatestByTaskNo(crn.getId(), crnProtocol.getTaskNo().intValue()); | 
 |  |  |                         // 有异常 | 
 |  |  |                         if (latest == null) { | 
 |  |  |                             if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { | 
 |  |  |                                 TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(crnProtocol.getTaskNo())); | 
 |  |  |                                 if (taskWrk == null) { | 
 |  |  |                                     continue; | 
 |  |  |                                 } | 
 |  |  |                                 BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm().intValue()); | 
 |  |  |                                 String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName(); | 
 |  |  |                                 BasErrLog basErrLog = new BasErrLog( | 
 |  |  |                                         null,    // 编号 | 
 |  |  |                                         taskWrk.getWrkNo(),    // 工作号 | 
 |  |  |                                         now,    // 发生时间 | 
 |  |  |                                         null,    // 结束时间 | 
 |  |  |                                         taskWrk.getWrkSts().longValue(),    // 工作状态 | 
 |  |  |                                         taskWrk.getIoType(),    // 入出库类型 | 
 |  |  |                                         taskWrk.getCrnNo(),    // 巷道号 | 
 |  |  |                                         crn.getId(),    // 堆垛机号 | 
 |  |  |                                         taskWrk.getTargetPoint(),    // 目标库位 | 
 |  |  |                                         0,    // 目标站 | 
 |  |  |                                         0,    // 源站 | 
 |  |  |                                         taskWrk.getStartPoint(),    // 源库位 | 
 |  |  |                                         taskWrk.getBarcode(),    // 条码 | 
 |  |  |                                         (int) crnProtocol.getAlarm(),    // 异常码 | 
 |  |  |                                         errName,    // 异常 | 
 |  |  |                                         1,    // 异常情况 | 
 |  |  |                                         taskWrk.getCreateTime(),    // 任务时间(接收时间) | 
 |  |  |                                         null,    // 添加人员 | 
 |  |  |                                         now,    // 修改时间 | 
 |  |  |                                         null,    // 修改人员 | 
 |  |  |                                         "任务中异常"    // 备注 | 
 |  |  |                                 ); | 
 |  |  |                                 if (!basErrLogService.insert(basErrLog)) { | 
 |  |  |                                     log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             // 异常修复 | 
 |  |  |                             if (crnProtocol.getAlarm() == null || crnProtocol.getAlarm() == 0) { | 
 |  |  |                                 latest.setEndTime(now); | 
 |  |  |                                 latest.setUpdateTime(now); | 
 |  |  |                                 latest.setStatus(2); | 
 |  |  |                                 if (!basErrLogService.updateById(latest)) { | 
 |  |  |                                     log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                         // 无任务 | 
 |  |  |                     } else { | 
 |  |  |                         BasErrLog latest = basErrLogService.findLatest(crn.getId()); | 
 |  |  |                         // 有异常 | 
 |  |  |                         if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { | 
 |  |  |                             WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo()); | 
 |  |  |                             if (wrkMast == null) { | 
 |  |  |                                 continue; | 
 |  |  |                             // 记录新异常 | 
 |  |  |                             if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) { | 
 |  |  |                                 BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); | 
 |  |  |                                 String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName(); | 
 |  |  |                                 BasErrLog basErrLog = new BasErrLog( | 
 |  |  |                                         null,    // 编号 | 
 |  |  |                                         null,    // 工作号 | 
 |  |  |                                         now,    // 发生时间 | 
 |  |  |                                         null,    // 结束时间 | 
 |  |  |                                         null,    // 工作状态 | 
 |  |  |                                         null,    // 入出库类型 | 
 |  |  |                                         crnProtocol.getLaneNo(),    // 堆垛机 | 
 |  |  |                                         crn.getId(),    // plc | 
 |  |  |                                         null,    // 目标库位 | 
 |  |  |                                         null,    // 目标站 | 
 |  |  |                                         null,    // 源站 | 
 |  |  |                                         null,    // 源库位 | 
 |  |  |                                         null,    // 条码 | 
 |  |  |                                         (int) crnProtocol.getAlarm(),    // 异常码 | 
 |  |  |                                         errName,    // 异常 | 
 |  |  |                                         1,    // 异常情况 | 
 |  |  |                                         now,    // 添加时间 | 
 |  |  |                                         null,    // 添加人员 | 
 |  |  |                                         now,    // 修改时间 | 
 |  |  |                                         null,    // 修改人员 | 
 |  |  |                                         "无任务异常"    // 备注 | 
 |  |  |                                 ); | 
 |  |  |                                 if (!basErrLogService.insert(basErrLog)) { | 
 |  |  |                                     log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                             BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); | 
 |  |  |                             String errName = crnError==null? String.valueOf(crnProtocol.getAlarm()):crnError.getErrName(); | 
 |  |  |                             BasErrLog basErrLog = new BasErrLog( | 
 |  |  |                                     null,    // 编号 | 
 |  |  |                                     wrkMast.getWrkNo(),    // 工作号 | 
 |  |  |                                     now,    // 发生时间 | 
 |  |  |                                     null,    // 结束时间 | 
 |  |  |                                     wrkMast.getWrkSts(),    // 工作状态 | 
 |  |  |                                     wrkMast.getIoType(),    // 入出库类型 | 
 |  |  |                                     crn.getId(),    // 堆垛机 | 
 |  |  |                                     null,    // plc | 
 |  |  |                                     wrkMast.getLocNo(),    // 目标库位 | 
 |  |  |                                     wrkMast.getStaNo(),    // 目标站 | 
 |  |  |                                     wrkMast.getSourceStaNo(),    // 源站 | 
 |  |  |                                     wrkMast.getSourceLocNo(),    // 源库位 | 
 |  |  |                                     wrkMast.getBarcode(),    // 条码 | 
 |  |  |                                     (int) crnProtocol.getAlarm(),    // 异常码 | 
 |  |  |                                     errName,    // 异常 | 
 |  |  |                                     1,    // 异常情况 | 
 |  |  |                                     now,    // 添加时间 | 
 |  |  |                                     null,    // 添加人员 | 
 |  |  |                                     now,    // 修改时间 | 
 |  |  |                                     null,    // 修改人员 | 
 |  |  |                                     "任务中异常"    // 备注 | 
 |  |  |                             ); | 
 |  |  |                             if (!basErrLogService.insert(basErrLog)) { | 
 |  |  |                                 log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         // 异常修复 | 
 |  |  |                         if (crnProtocol.getAlarm() == null || crnProtocol.getAlarm() == 0) { | 
 |  |  |                             latest.setEndTime(now); | 
 |  |  |                             latest.setUpdateTime(now); | 
 |  |  |                             latest.setStatus(2); | 
 |  |  |                             if (!basErrLogService.updateById(latest)) { | 
 |  |  |                                 log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 // 无任务 | 
 |  |  |                 } else { | 
 |  |  |                     BasErrLog latest = basErrLogService.findLatest(crn.getId()); | 
 |  |  |                     // 有异常 | 
 |  |  |                     if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { | 
 |  |  |                         // 记录新异常 | 
 |  |  |                         if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) { | 
 |  |  |                             BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); | 
 |  |  |                             String errName = crnError==null? String.valueOf(crnProtocol.getAlarm()):crnError.getErrName(); | 
 |  |  |                             BasErrLog basErrLog = new BasErrLog( | 
 |  |  |                                     null,    // 编号 | 
 |  |  |                                     null,    // 工作号 | 
 |  |  |                                     now,    // 发生时间 | 
 |  |  |                                     null,    // 结束时间 | 
 |  |  |                                     null,    // 工作状态 | 
 |  |  |                                     null,    // 入出库类型 | 
 |  |  |                                     crn.getId(),    // 堆垛机 | 
 |  |  |                                     null,    // plc | 
 |  |  |                                     null,    // 目标库位 | 
 |  |  |                                     null,    // 目标站 | 
 |  |  |                                     null,    // 源站 | 
 |  |  |                                     null,    // 源库位 | 
 |  |  |                                     null,    // 条码 | 
 |  |  |                                     (int)crnProtocol.getAlarm(),    // 异常码 | 
 |  |  |                                     errName,    // 异常 | 
 |  |  |                                     1,    // 异常情况 | 
 |  |  |                                     now,    // 添加时间 | 
 |  |  |                                     null,    // 添加人员 | 
 |  |  |                                     now,    // 修改时间 | 
 |  |  |                                     null,    // 修改人员 | 
 |  |  |                                     "无任务异常"    // 备注 | 
 |  |  |                             ); | 
 |  |  |                             if (!basErrLogService.insert(basErrLog)) { | 
 |  |  |                                 log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     // 无异常 | 
 |  |  |                     } else { | 
 |  |  |                         // 异常修复 | 
 |  |  |                         if (latest != null && latest.getStatus() == 1) { | 
 |  |  |                             latest.setEndTime(now); | 
 |  |  |                             latest.setUpdateTime(now); | 
 |  |  |                             latest.setStatus(2); | 
 |  |  |                             if (!basErrLogService.updateById(latest)) { | 
 |  |  |                                 log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); | 
 |  |  |                             // 无异常 | 
 |  |  |                         } else { | 
 |  |  |                             // 异常修复 | 
 |  |  |                             if (latest != null && latest.getStatus() == 1) { | 
 |  |  |                                 latest.setEndTime(now); | 
 |  |  |                                 latest.setUpdateTime(now); | 
 |  |  |                                 latest.setStatus(2); | 
 |  |  |                                 if (!basErrLogService.updateById(latest)) { | 
 |  |  |                                     log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e){ | 
 |  |  |                 log.error("堆垛机异常信息记录失败 ===>> [id:{}] [error:{}]", crn.getId(), e.getMessage()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     // ------------------------------------------------------------------------------- | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 空栈板初始化入库,叉车入库站放货 | 
 |  |  |      * 堆垛机异常信息记录 | 
 |  |  |      */ | 
 |  |  |     @Async | 
 |  |  |     public void storeEmptyPlt(){ | 
 |  |  |         for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |             // 遍历空板入库口 | 
 |  |  |             for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) { | 
 |  |  |                 // 获取空板入库站信息 | 
 |  |  |                 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(emptyInSta.getStaNo()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  | //                // 入出库模式判断 | 
 |  |  | //                if ( emptyInSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; } | 
 |  |  |                 if ( emptyInSta.getStaNo()==203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) { continue; } | 
 |  |  |  | 
 |  |  |                 // 站点条件判断 | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() | 
 |  |  |                         && staProtocol.isEmptyMk() && (staProtocol.getWorkNo() > 9990 && staProtocol.getWorkNo() <= 9999) && staProtocol.isPakMk()) { | 
 |  |  |  | 
 |  |  |                     try { | 
 |  |  |                         LocTypeDto locTypeDto = new LocTypeDto(staProtocol); | 
 |  |  |  | 
 |  |  |                         SearchLocParam param = new SearchLocParam(); | 
 |  |  |                         param.setIoType(10); | 
 |  |  |                         param.setSourceStaNo(emptyInSta.getStaNo()); | 
 |  |  |                         param.setLocType1(locTypeDto.getLocType1()); | 
 |  |  |                         String response = new HttpHandler.Builder() | 
 |  |  |                                 .setUri(wmsUrl) | 
 |  |  |                                 .setPath("/rpc/pakin/loc/v1") | 
 |  |  |                                 .setJson(JSON.toJSONString(param)) | 
 |  |  |                                 .build() | 
 |  |  |                                 .doPost(); | 
 |  |  |                         JSONObject jsonObject = JSON.parseObject(response); | 
 |  |  |                         if (jsonObject.getInteger("code").equals(200)) { | 
 |  |  |                             StartupDto dto = jsonObject.getObject("data", StartupDto.class); | 
 |  |  |  | 
 |  |  |                             // 更新站点信息 且 下发plc命令 | 
 |  |  |                             staProtocol.setWorkNo(dto.getWorkNo().shortValue()); | 
 |  |  |                             staProtocol.setStaNo(dto.getStaNo().shortValue()); | 
 |  |  |                             devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                             boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                             if (!result) { | 
 |  |  |                                 throw new CoolException("更新plc站点信息失败"); | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl+"/rpc/pakin/loc/v1", JSON.toJSONString(param), response); | 
 |  |  |     public void recDevErr() { | 
 |  |  |         Date now = new Date(); | 
 |  |  |         for (DevpSlave devpSlave : slaveProperties.getDevp()) { | 
 |  |  |             try{ | 
 |  |  |                 // 获取堆垛机信息 | 
 |  |  |                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpSlave.getId()); | 
 |  |  |                 Map<Integer, StaProtocol> station = devpThread.getStation(); | 
 |  |  |                 for (StaProtocol staProtocol : station.values()){ | 
 |  |  |                     try{ | 
 |  |  |                         if (staProtocol == null) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                         e.printStackTrace(); | 
 |  |  |                         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  | //                        if (staProtocol.isAutoing()) { | 
 |  |  | //                            // 有任务 | 
 |  |  | //                            if (staProtocol.getWorkNo() != 0) { | 
 |  |  | ////                                BasErrLog latest = basPlcerrorLogService.se(crn.getId(), crnProtocol.getTaskNo().intValue()); | 
 |  |  | //                                // 有异常 | 
 |  |  | //                                if (latest == null) { | 
 |  |  | //                                    if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { | 
 |  |  | //                                        TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(crnProtocol.getTaskNo())); | 
 |  |  | //                                        if (taskWrk == null) { | 
 |  |  | //                                            continue; | 
 |  |  | //                                        } | 
 |  |  | //                                        BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm().intValue()); | 
 |  |  | //                                        String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName(); | 
 |  |  | //                                        BasErrLog basErrLog = new BasErrLog( | 
 |  |  | //                                                null,    // 编号 | 
 |  |  | //                                                taskWrk.getWrkNo(),    // 工作号 | 
 |  |  | //                                                now,    // 发生时间 | 
 |  |  | //                                                null,    // 结束时间 | 
 |  |  | //                                                taskWrk.getWrkSts().longValue(),    // 工作状态 | 
 |  |  | //                                                taskWrk.getIoType(),    // 入出库类型 | 
 |  |  | //                                                crn.getId(),    // 堆垛机 | 
 |  |  | //                                                null,    // plc | 
 |  |  | //                                                taskWrk.getTargetPoint(),    // 目标库位 | 
 |  |  | //                                                0,    // 目标站 | 
 |  |  | //                                                0,    // 源站 | 
 |  |  | //                                                taskWrk.getStartPoint(),    // 源库位 | 
 |  |  | //                                                taskWrk.getBarcode(),    // 条码 | 
 |  |  | //                                                (int) crnProtocol.getAlarm(),    // 异常码 | 
 |  |  | //                                                errName,    // 异常 | 
 |  |  | //                                                1,    // 异常情况 | 
 |  |  | //                                                taskWrk.getCreateTime(),    // 任务时间(接收时间) | 
 |  |  | //                                                null,    // 添加人员 | 
 |  |  | //                                                now,    // 修改时间 | 
 |  |  | //                                                null,    // 修改人员 | 
 |  |  | //                                                "任务中异常"    // 备注 | 
 |  |  | //                                        ); | 
 |  |  | //                                        if (!basErrLogService.insert(basErrLog)) { | 
 |  |  | //                                            log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); | 
 |  |  | //                                        } | 
 |  |  | //                                    } | 
 |  |  | //                                } else { | 
 |  |  | //                                    // 异常修复 | 
 |  |  | //                                    if (crnProtocol.getAlarm() == null || crnProtocol.getAlarm() == 0) { | 
 |  |  | //                                        latest.setEndTime(now); | 
 |  |  | //                                        latest.setUpdateTime(now); | 
 |  |  | //                                        latest.setStatus(2); | 
 |  |  | //                                        if (!basErrLogService.updateById(latest)) { | 
 |  |  | //                                            log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); | 
 |  |  | //                                        } | 
 |  |  | //                                    } | 
 |  |  | //                                } | 
 |  |  | //                                // 无任务 | 
 |  |  | //                            } else { | 
 |  |  | //                                BasErrLog latest = basErrLogService.findLatest(crn.getId()); | 
 |  |  | //                                // 有异常 | 
 |  |  | //                                if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { | 
 |  |  | //                                    // 记录新异常 | 
 |  |  | //                                    if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) { | 
 |  |  | //                                        BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); | 
 |  |  | //                                        String errName = crnError == null ? String.valueOf(crnProtocol.getAlarm()) : crnError.getErrName(); | 
 |  |  | //                                        BasErrLog basErrLog = new BasErrLog( | 
 |  |  | //                                                null,    // 编号 | 
 |  |  | //                                                null,    // 工作号 | 
 |  |  | //                                                now,    // 发生时间 | 
 |  |  | //                                                null,    // 结束时间 | 
 |  |  | //                                                null,    // 工作状态 | 
 |  |  | //                                                null,    // 入出库类型 | 
 |  |  | //                                                crn.getId(),    // 堆垛机 | 
 |  |  | //                                                null,    // plc | 
 |  |  | //                                                null,    // 目标库位 | 
 |  |  | //                                                null,    // 目标站 | 
 |  |  | //                                                null,    // 源站 | 
 |  |  | //                                                null,    // 源库位 | 
 |  |  | //                                                null,    // 条码 | 
 |  |  | //                                                (int) crnProtocol.getAlarm(),    // 异常码 | 
 |  |  | //                                                errName,    // 异常 | 
 |  |  | //                                                1,    // 异常情况 | 
 |  |  | //                                                now,    // 添加时间 | 
 |  |  | //                                                null,    // 添加人员 | 
 |  |  | //                                                now,    // 修改时间 | 
 |  |  | //                                                null,    // 修改人员 | 
 |  |  | //                                                "无任务异常"    // 备注 | 
 |  |  | //                                        ); | 
 |  |  | //                                        if (!basErrLogService.insert(basErrLog)) { | 
 |  |  | //                                            log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); | 
 |  |  | //                                        } | 
 |  |  | //                                    } | 
 |  |  | //                                    // 无异常 | 
 |  |  | //                                } else { | 
 |  |  | //                                    // 异常修复 | 
 |  |  | //                                    if (latest != null && latest.getStatus() == 1) { | 
 |  |  | //                                        latest.setEndTime(now); | 
 |  |  | //                                        latest.setUpdateTime(now); | 
 |  |  | //                                        latest.setStatus(2); | 
 |  |  | //                                        if (!basErrLogService.updateById(latest)) { | 
 |  |  | //                                            log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); | 
 |  |  | //                                        } | 
 |  |  | //                                    } | 
 |  |  | //                                } | 
 |  |  | //                            } | 
 |  |  | //                        } | 
 |  |  |                     } catch (Exception devErr){ | 
 |  |  |                         log.error("输送线站点异常信息记录失败 ===>> [id:{}] [error:{}]", staProtocol.getStaNo(), devErr.getMessage()); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //                    // 检索库位 | 
 |  |  | //                    LocTypeDto locTypeDto = new LocTypeDto(staProtocol); | 
 |  |  | //                    StartupDto startupDto = commonService.getLocNo(1, 10, emptyInSta.getStaNo(), null, locTypeDto, 0); | 
 |  |  | //                    // 工作号 | 
 |  |  | //                    int workNo = startupDto.getWorkNo(); | 
 |  |  | // | 
 |  |  | //                    try { | 
 |  |  | //                        // 插入工作主档 | 
 |  |  | //                        WrkMast wrkMast = new WrkMast(); | 
 |  |  | //                        wrkMast.setWrkNo(workNo); | 
 |  |  | //                        wrkMast.setIoTime(new Date()); | 
 |  |  | //                        wrkMast.setWrkSts(2L); // 工作状态:2.设备上走 | 
 |  |  | //                        wrkMast.setIoType(10); // 入出库状态:10.空板入库 | 
 |  |  | //                        wrkMast.setIoPri(10D); // 优先级:10 | 
 |  |  | //                        wrkMast.setCrnNo(startupDto.getCrnNo()); | 
 |  |  | //                        wrkMast.setSourceStaNo(startupDto.getSourceStaNo()); | 
 |  |  | //                        wrkMast.setStaNo(startupDto.getStaNo()); | 
 |  |  | //                        wrkMast.setLocNo(startupDto.getLocNo()); | 
 |  |  | //                        wrkMast.setFullPlt("N"); // 满板 | 
 |  |  | //                        wrkMast.setPicking("N"); // 拣料 | 
 |  |  | //                        wrkMast.setExitMk("N"); // 退出 | 
 |  |  | //                        wrkMast.setEmptyMk("Y"); // 空板 | 
 |  |  | //                        wrkMast.setLinkMis("N"); | 
 |  |  | ////                    wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 | 
 |  |  | //                        // 操作人员数据 | 
 |  |  | //                        wrkMast.setAppeTime(new Date()); | 
 |  |  | //                        wrkMast.setModiTime(new Date()); | 
 |  |  | //                        Integer insert = wrkMastMapper.insert(wrkMast); | 
 |  |  | //                        if (insert == 0) { | 
 |  |  | //                            throw new CoolException("保存工作档失败"); | 
 |  |  | //                        } | 
 |  |  | //                        // 更新目标库位状态 | 
 |  |  | //                        LocMast locMast = locMastService.selectById(startupDto.getLocNo()); | 
 |  |  | //                        locMast.setLocSts("S"); // S.入库预约 | 
 |  |  | //                        locMast.setModiTime(new Date()); | 
 |  |  | //                        if (!locMastService.updateById(locMast)){ | 
 |  |  | //                            throw new CoolException("改变库位状态失败"); | 
 |  |  | //                        } | 
 |  |  | //                        // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  | // | 
 |  |  | //                        // 更新站点信息 且 下发plc命令 | 
 |  |  | //                        staProtocol.setWorkNo((short) workNo); | 
 |  |  | //                        staProtocol.setStaNo(startupDto.getStaNo().shortValue()); | 
 |  |  | //                        devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  | //                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  | //                        if (!result) { | 
 |  |  | //                            throw new CoolException("更新plc站点信息失败"); | 
 |  |  | //                        } | 
 |  |  | //                    } catch (Exception e) { | 
 |  |  | //                        e.printStackTrace(); | 
 |  |  | //                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  | //                    } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             } catch (Exception e){ | 
 |  |  |                 log.error("输送线异常信息记录失败 ===>> [id:{}] [error:{}]", devpSlave.getId(), e.getMessage()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private TaskWrk createTask(GetWmsDto dto, String barcode) { | 
 |  |  |         String wcsLocNo = dto.getLocNo(); | 
 |  |  |         if (Cools.isEmpty(wcsLocNo)) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         Date now = new Date(); | 
 |  |  |         TaskWrk taskWrk = new TaskWrk(); | 
 |  |  |         int workNo1 = commonService.getWorkNo(WorkNoType.PAKIN.type);//获取入库工作号 | 
 |  |  |         taskWrk.setTaskNo(dto.getWrkNo());//任务号 | 
 |  |  |         taskWrk.setWrkNo(workNo1); | 
 |  |  |         taskWrk.setStatus(TaskStatusType.RECEIVE.id);//任务状态:接收 | 
 |  |  |         taskWrk.setCreateTime(now); | 
 |  |  |         taskWrk.setAssignTime(now); | 
 |  |  |         taskWrk.setModiTime(now); | 
 |  |  |         taskWrk.setModiUser(5555L); | 
 |  |  |         taskWrk.setIoType(1);//任务类型 | 
 |  |  |         taskWrk.setIoPri(Cools.isEmpty(dto.getTaskPriority()) ? 300 : Integer.parseInt(dto.getTaskPriority()));//优先级 | 
 |  |  |         taskWrk.setBarcode(barcode);//条码 | 
 |  |  |         LocMast locMast = locMastService.selectByLocNo(wcsLocNo); | 
 |  |  |         taskWrk.setCrnNo(locMast.getCrnNo()); | 
 |  |  |         taskWrk.setTargetPoint(wcsLocNo); | 
 |  |  |         taskWrk.setStartPoint(dto.getStaNo().toString()); | 
 |  |  |         if (taskWrk.getIoType() == 1) { | 
 |  |  |             taskWrk.setWrkSts(2); | 
 |  |  |             if (!Cools.isEmpty(taskWrk.getTargetPoint())) { | 
 |  |  |                 taskWrk.setOriginTargetPoint(taskWrk.getTargetPoint()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return taskWrk; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String rgvOtherTaskWrk(RgvSlave slave) { | 
 |  |  |  | 
 |  |  |         RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getOtherId()); | 
 |  |  |         TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache(); | 
 |  |  |         ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol(); | 
 |  |  |         if (!allTaskProtocol.isEmpty()) { | 
 |  |  |             for (TaskProtocol taskProtocol : allTaskProtocol.values()) { | 
 |  |  |                 if (taskProtocol.getTaskNo() != 0) { | 
 |  |  |                     return taskProtocol.getTaskNo().toString(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return "无"; | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public boolean rgvDetection(RgvSlave slave) { | 
 |  |  |         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); | 
 |  |  |         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); | 
 |  |  |  | 
 |  |  |         if (rgvProtocol == null || rgvTaskProtocol == null) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 | 
 |  |  |                 || ((!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) || (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100)) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM))) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         if (rgvProtocol.getLoaded()==1){ | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); | 
 |  |  |         RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId()); | 
 |  |  |  | 
 |  |  |         if (rgvProtocolOther == null) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         if (rgvProtocolOther.statusEnable) { | 
 |  |  |             if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1 || rgvProtocolOther.getRgvPosDestination() == 0L) { | 
 |  |  |                 return false; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |     public boolean rgvOtherIDLEOther(RgvSlave slave) { | 
 |  |  |         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getOtherId()); | 
 |  |  |         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getOtherId()); | 
 |  |  |  | 
 |  |  |         if (rgvProtocol == null || rgvTaskProtocol == null) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 | 
 |  |  |                 || ((!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) || (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100)) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM))) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (rgvProtocol.getLoaded()!=0) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |     public boolean rgvOtherIDLEOther2(RgvSlave slave) { | 
 |  |  |         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getOtherId()); | 
 |  |  |         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getOtherId()); | 
 |  |  |  | 
 |  |  |         if (rgvProtocol == null || rgvTaskProtocol == null) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) | 
 |  |  |                 || rgvProtocol.getRgvPos().equals(0L) | 
 |  |  |                 || rgvTaskProtocol.getAvoid() == -1) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (rgvProtocol.getLoaded()!=0) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |     public boolean rgvOtherIDLE(RgvSlave slave,Integer staNo) { | 
 |  |  |         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); | 
 |  |  |         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); | 
 |  |  |  | 
 |  |  |         if (rgvProtocol == null || rgvTaskProtocol == null) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 | 
 |  |  |                 || ((!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) || (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100)) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM))) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); | 
 |  |  |  | 
 |  |  |         if (rgvProtocolOther == null) { | 
 |  |  |             return true; | 
 |  |  |         } | 
 |  |  |         if (rgvProtocolOther.statusEnable) { | 
 |  |  |             BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", staNo)); | 
 |  |  |             long abs = Math.abs(Math.abs(basDevpPosition.getPlcPosition() - rgvProtocol.getRgvPos()) | 
 |  |  |                     - | 
 |  |  |                     Math.abs(basDevpPosition.getPlcPosition() - rgvProtocolOther.getRgvPos())); | 
 |  |  |             if (abs<100){ | 
 |  |  |                 return true; | 
 |  |  |             } | 
 |  |  |             if (Math.abs(basDevpPosition.getPlcPosition() - rgvProtocol.getRgvPos()) | 
 |  |  |                     >= | 
 |  |  |                     Math.abs(basDevpPosition.getPlcPosition() - rgvProtocolOther.getRgvPos())){ | 
 |  |  |                 return false; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |     public boolean rgvOtherIDLE2(RgvSlave slave,Integer staNo) { | 
 |  |  |         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId()); | 
 |  |  |         RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId()); | 
 |  |  |  | 
 |  |  |         if (rgvProtocol == null || rgvTaskProtocol == null) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 | 
 |  |  |                 || ((!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) || (Math.abs(rgvProtocol.getRgvPos() - rgvProtocol.getRgvPosDestination())>100)) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM))) { | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); | 
 |  |  |  | 
 |  |  |         if (rgvProtocolOther == null) { | 
 |  |  |             return true; | 
 |  |  |         } | 
 |  |  |         if (rgvProtocolOther.statusEnable) { | 
 |  |  |             BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", staNo)); | 
 |  |  |             long abs = Math.abs(Math.abs(basDevpPosition.getPlcPosition() - rgvProtocol.getRgvPos()) | 
 |  |  |                     - | 
 |  |  |                     Math.abs(basDevpPosition.getPlcPosition() - rgvProtocolOther.getRgvPos())); | 
 |  |  |             if (abs<100){ | 
 |  |  |                 return true; | 
 |  |  |             } | 
 |  |  |             if (Math.abs(basDevpPosition.getPlcPosition()-rgvProtocol.getRgvPos()) | 
 |  |  |                     >= | 
 |  |  |                     Math.abs(basDevpPosition.getPlcPosition()-rgvProtocolOther.getRgvPos())){ | 
 |  |  |                 return false; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public TaskWrk deviceDetection(RgvSlave.RgvStn inSta) { | 
 |  |  |  | 
 |  |  |         DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, inSta.getDevpPlcId()); | 
 |  |  |         StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); | 
 |  |  |         if (staProtocol == null) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         // 判断是否满足取货条件 | 
 |  |  |         if (!staProtocol.isPakMkTask()) { | 
 |  |  |             devpThread.setErrorDev(staProtocol.getSiteId(), "任务已下发等待小车取"); | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         // 判断是否满足取货条件 | 
 |  |  |         if (staProtocol.isAutoing() | 
 |  |  | //                && staProtocol.isLoading() | 
 |  |  | //                && staProtocol.isStaOk() | 
 |  |  |                 && staProtocol.getWorkNo() != 0) { | 
 |  |  |             TaskWrk taskWrk = taskWrkService.selectByWrkNo(staProtocol.getWorkNo()); | 
 |  |  |             if (taskWrk != null) { | 
 |  |  |                 Integer stano = staProtocol.getStaNo(); | 
 |  |  |                 if (staProtocol.getSiteId() == 1004 || staProtocol.getSiteId()==1020){ | 
 |  |  |                     if (!staProtocol.isPakMkRun()) { | 
 |  |  |                         devpThread.setErrorDev(staProtocol.getSiteId(), "异常回退标记,需要回退"); | 
 |  |  |                         return null; | 
 |  |  |                     } | 
 |  |  |                     if (!staProtocol.isLoading()) { | 
 |  |  |                         devpThread.setErrorDev(staProtocol.getSiteId(), "无物"); | 
 |  |  |                         return null; | 
 |  |  |                     } | 
 |  |  |                     if (!staProtocol.isInEnable()) { | 
 |  |  |                         devpThread.setErrorDev(staProtocol.getSiteId(), "等待可入信号"); | 
 |  |  |                         return null; | 
 |  |  |                     } | 
 |  |  |                     if (!staProtocol.isStaOk()) { | 
 |  |  |                         devpThread.setErrorDev(staProtocol.getSiteId(), "等待链条就绪"); | 
 |  |  |                         return null; | 
 |  |  |                     } | 
 |  |  |                     // 尺寸检测异常 | 
 |  |  |                     boolean back = false; | 
 |  |  |                     String errMsg = "-"; | 
 |  |  |                     if (staProtocol.getGrossWt()>=600){ | 
 |  |  |                         errMsg = "超重:"+staProtocol.getGrossWt()+"kg"; | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isFrontErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "前超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"前超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isBackErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "后超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"后超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isHighErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "高超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"高超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isLeftErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "左超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"左超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     if (staProtocol.isRightErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "右超限"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"右超限"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  | //                    if (!back && staProtocol.isWeightErr()) { | 
 |  |  | //                        errMsg = "超重"; | 
 |  |  | //                        back = true; | 
 |  |  | //                    } | 
 |  |  |                     if (staProtocol.isBarcodeErr()) { | 
 |  |  |                         if (!back){ | 
 |  |  |                             errMsg = "扫码失败"; | 
 |  |  |                         } else { | 
 |  |  |                             errMsg = errMsg+"---"+"扫码失败"; | 
 |  |  |                         } | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     // 退回 | 
 |  |  |                     if (back) { | 
 |  |  |                         if (stano.equals(staProtocol.getStaNo() + 1)) { | 
 |  |  |                             return null; | 
 |  |  |                         } | 
 |  |  |                         if (!staProtocol.isPakMk()) { | 
 |  |  |                             return null; | 
 |  |  |                         } | 
 |  |  |                         System.out.println("扫码入库失败,{"+inSta.getStaNo()+"}入库站因{"+errMsg+"}异常,托盘已被退回"); | 
 |  |  | //                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); | 
 |  |  |                         staProtocol.setWorkNo(9999); | 
 |  |  |                         staProtocol.setStaNo(staProtocol.getStaNo()+1); | 
 |  |  |                         devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                         devpThread.setPakMkRun(staProtocol.getSiteId(), false); | 
 |  |  |                         devpThread.setPakMkTask(staProtocol.getSiteId(), false); | 
 |  |  |                         devpThread.setErrorDev(staProtocol.getSiteId(), errMsg); | 
 |  |  |                         MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol)); | 
 |  |  |                         try{ | 
 |  |  |                             taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示 | 
 |  |  |                             taskWrk.setModiTime(new Date()); | 
 |  |  |                             taskWrkMapper.updateById(taskWrk); | 
 |  |  |                         } catch (Exception e){ | 
 |  |  |                             devpThread.setErrorDev(staProtocol.getSiteId(), errMsg+"异常信息保存工作档案失败!"); | 
 |  |  |                         } | 
 |  |  |                         return null; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 return taskWrk; | 
 |  |  |             } | 
 |  |  |         } else if (staProtocol.isAutoing() && staProtocol.getWorkNo() == 0 && !staProtocol.isLoading()){ | 
 |  |  |             if (inSta.isDirectionOther()){ | 
 |  |  |                 StaProtocol staProtocolOther = devpThread.getStation().get(inSta.getStaNoOther()); | 
 |  |  |                 if (staProtocolOther == null) { | 
 |  |  |                     return null; | 
 |  |  |                 } | 
 |  |  |                 // 判断是否满足取货条件 | 
 |  |  |                 if (staProtocolOther.isAutoing() | 
 |  |  |                         && staProtocolOther.getWorkNo() != 0) { | 
 |  |  |                     TaskWrk taskWrkOther = taskWrkService.selectByWrkNo(staProtocolOther.getWorkNo()); | 
 |  |  |                     if (taskWrkOther != null) { | 
 |  |  |                         return taskWrkOther; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |     public boolean deviceDetection(RgvSlave.RgvStn inSta,Integer rgvNo) { | 
 |  |  |         ArrayList<Integer> arrayList = new ArrayList<Integer>() {{ | 
 |  |  |             add(1009); | 
 |  |  |             add(1011); | 
 |  |  |             add(1012); | 
 |  |  |             add(1014); | 
 |  |  |             add(1016); | 
 |  |  |         }}; | 
 |  |  |         try{ | 
 |  |  |  | 
 |  |  |             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, inSta.getDevpPlcId()); | 
 |  |  |             ArrayList<Integer> listW = new ArrayList<Integer>(); | 
 |  |  |             ArrayList<Integer> listL = new ArrayList<Integer>(); | 
 |  |  |             for (Integer staNo : arrayList){ | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(staNo); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     RgvErrCache.updateRgvErr(rgvNo,staNo+"站点数据丢失"); | 
 |  |  |                     return false; | 
 |  |  |                 } | 
 |  |  |                 // 判断是否满足取货条件 | 
 |  |  |                 if (staProtocol.getWorkNo() != 0) { | 
 |  |  |                     if (!listW.contains(staProtocol.getWorkNo())) { | 
 |  |  |                         listW.add(staProtocol.getWorkNo()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 // 判断是否满足取货条件 | 
 |  |  |                 if (staProtocol.isLoading()) { | 
 |  |  |                     if (!listL.contains(staProtocol.getStaNo())) { | 
 |  |  |                         listL.add(staProtocol.getStaNo()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if (listW.size()>=3){ | 
 |  |  |                 RgvErrCache.updateRgvErr(rgvNo,"等待1012拣选,防止堵塞"); | 
 |  |  |                 return false; | 
 |  |  |             } | 
 |  |  |             if (listL.size()>=3){ | 
 |  |  |                 RgvErrCache.updateRgvErr(rgvNo,"等待1012拣选,防止堵塞"); | 
 |  |  |                 return false; | 
 |  |  |             } | 
 |  |  |         } catch (Exception e){ | 
 |  |  |             RgvErrCache.updateRgvErr(rgvNo,"1012检测异常:"+e.getMessage()); | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public boolean rgvOtherStatusEnable(RgvSlave slave) { | 
 |  |  |         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId()); | 
 |  |  |         if (rgvProtocolOther == null) { | 
 |  |  |             return true; | 
 |  |  |         } | 
 |  |  |         if (rgvProtocolOther.statusEnable) { | 
 |  |  | //            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) { | 
 |  |  |             return true; | 
 |  |  | //            } | 
 |  |  |         } | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public synchronized void taskStart() { | 
 |  |  |         for (RgvSlave rgvSlave : slaveProperties.getRgv()) { | 
 |  |  |             try { | 
 |  |  |                 if (rgvDetection(rgvSlave)) { | 
 |  |  |                     String taskNoNow = rgvOtherTaskWrk(rgvSlave); | 
 |  |  |                     List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("PLC_POSITION", true)); | 
 |  |  |                     boolean itSmall = new TrackRangeUtils().IsItSmall(rgvSlave); | 
 |  |  |                     if (basDevpPositions.isEmpty()) { | 
 |  |  |                         log.error("获取所有站点信息异常"); | 
 |  |  |                         try{ | 
 |  |  |                             DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
 |  |  |                             deviceErrorService.addDeviceError("rgvErr", rgvSlave.getId(), "指令生成:获取所有站点信息异常"); | 
 |  |  |                         } catch (Exception e2){ | 
 |  |  |                         } | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     List<TaskWrk> taskWrkList = new ArrayList<>(); | 
 |  |  |                     List<Integer> staList = new ArrayList<>(); | 
 |  |  |                     for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSta()) { | 
 |  |  |                         TaskWrk taskWrk = deviceDetection(inSta); | 
 |  |  |                         if (taskWrk != null) { | 
 |  |  |                             if (taskWrk.getWrkNo().toString().equals(taskNoNow)) continue; | 
 |  |  |                             taskWrkList.add(taskWrk); | 
 |  |  |                             staList.add(inSta.getStaNo()); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     if (taskWrkList.isEmpty() || staList.isEmpty()) continue; | 
 |  |  |  | 
 |  |  |                     boolean sign = false; | 
 |  |  |  | 
 |  |  |                     if (rgvOtherStatusEnable(rgvSlave)) { | 
 |  |  |                         //分成上下两部分任务 | 
 |  |  |                         List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions, itSmall); | 
 |  |  |                         List<Integer> rangeListSou = avoidRange[itSmall ? 0 : 1]; | 
 |  |  |                         List<Integer> rangeListSouOther = avoidRange[itSmall ? 1 : 0]; | 
 |  |  |                         //就近排序 | 
 |  |  |                         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId()); | 
 |  |  |                         List<Integer> rangeList = RouteUtils.SortNearby(rangeListSou, rgvProtocol.RgvPos, basDevpPositions); | 
 |  |  |                         List<Integer> rangeListOther = RouteUtils.SortNearby(rangeListSouOther, rgvProtocol.RgvPos, basDevpPositions); | 
 |  |  |  | 
 |  |  |                         //所属部分就进取货 | 
 |  |  |  | 
 |  |  |                         //筛选范围内任务 | 
 |  |  |                         //就近排序 | 
 |  |  |                         //筛选在范围任务 | 
 |  |  |                         Long[][] avoidedRange = new TrackRangeUtils().avoidRangeArr(rgvSlave, trackEntireLength, trackBenchmark, avoidDistance); | 
 |  |  |                         List<Integer> belongToRange = RouteUtils.SortNearby(RouteUtils.belongToRange(rangeList, avoidedRange[0], basDevpPositions), rgvProtocol.RgvPos, basDevpPositions); | 
 |  |  |  | 
 |  |  |                         if (!sign && staList.size()==1){ | 
 |  |  |                             if (rgvOtherIDLEOther(rgvSlave)){ | 
 |  |  |                                 if (!rgvOtherIDLE(rgvSlave,staList.get(0))){ | 
 |  |  |                                     System.out.println("空闲就近跳过==="+rgvSlave.getId()+"==="); | 
 |  |  |                                     RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"空闲就近跳过"); | 
 |  |  |  | 
 |  |  |                                     sign=true; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                             if (sign){ | 
 |  |  |                                 for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                     if (rgvStn.getStaNo().equals(staList.get(0))) { | 
 |  |  |                                         TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                         if (taskWrk != null) { | 
 |  |  |                                             Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); | 
 |  |  |                                             for (RgvSlave.RgvStn rgvSuper : rgvSlave.getRgvSuperSta()){ | 
 |  |  |                                                 if (rgvSuper.getStaNo().equals(outStaNo)){ | 
 |  |  |                                                     System.out.println("空闲就近跳过后因最远再次执行==="+rgvSlave.getId()+"==="); | 
 |  |  |  | 
 |  |  |                                                     sign=false; | 
 |  |  |                                                     break; | 
 |  |  |                                                 } | 
 |  |  |                                             } | 
 |  |  |                                         } else { | 
 |  |  |                                             return; | 
 |  |  |                                         } | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         if(!sign){ | 
 |  |  |                             for (Integer staNoNow : belongToRange) { | 
 |  |  |                                 for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                     if (rgvStn.getStaNo().equals(staNoNow)) { | 
 |  |  |                                         TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                         if (taskWrk != null) { | 
 |  |  |                                             BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()))); | 
 |  |  |                                             if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) { | 
 |  |  |                                                 System.out.println("全范围执行==="+rgvSlave.getId()+"==="+taskWrk); | 
 |  |  |                                                 System.out.println("全范围执行==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); | 
 |  |  |  | 
 |  |  |                                                 sign = taskGenerate(rgvSlave, rgvStn, 0); | 
 |  |  |                                             } | 
 |  |  |                                         } | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                                 if (sign) { | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                         if (!sign) { | 
 |  |  |                             //  筛选范围内取货任务 | 
 |  |  |                             for (Integer staNoNow : belongToRange) { | 
 |  |  |                                 for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                     if (rgvStn.getStaNo().equals(staNoNow)) { | 
 |  |  |                                         TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                         if (taskWrk != null) { | 
 |  |  |                                             Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); | 
 |  |  |                                             for (RgvSlave.RgvStn rgvStnOut : rgvSlave.getRgvOutSta()) { | 
 |  |  |                                                 if (rgvStnOut.getStaNo().equals(outStaNo)) { | 
 |  |  |                                                     System.out.println("筛选范围内取货任务==="+rgvSlave.getId()+"==="+taskWrk); | 
 |  |  |                                                     System.out.println("筛选范围内取货任务==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); | 
 |  |  |  | 
 |  |  |                                                     sign = taskGenerate(rgvSlave, rgvStn, 0); | 
 |  |  |                                                     break; | 
 |  |  |                                                 } | 
 |  |  |                                             } | 
 |  |  |                                         } | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                                 if (sign) { | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         if (!sign && staList.size()==1){ | 
 |  |  |                             if (rgvOtherIDLEOther2(rgvSlave)){ | 
 |  |  |                                 if (!rgvOtherIDLE2(rgvSlave,staList.get(0))){ | 
 |  |  |                                     System.out.println("运行就近跳过==="+rgvSlave.getId()+"==="); | 
 |  |  |                                     RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"运行就近跳过"); | 
 |  |  |  | 
 |  |  |                                     sign=true; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                             if (sign){ | 
 |  |  |                                 for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                     if (rgvStn.getStaNo().equals(staList.get(0))) { | 
 |  |  |                                         TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                         if (taskWrk != null) { | 
 |  |  |                                             Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); | 
 |  |  |                                             for (RgvSlave.RgvStn rgvSuper : rgvSlave.getRgvSuperSta()){ | 
 |  |  |                                                 if (rgvSuper.getStaNo().equals(outStaNo)){ | 
 |  |  |                                                     System.out.println("运行就近跳过后因最远再次执行==="+rgvSlave.getId()+"==="); | 
 |  |  |  | 
 |  |  |                                                     sign=false; | 
 |  |  |                                                     break; | 
 |  |  |                                                 } | 
 |  |  |                                             } | 
 |  |  |                                         } else { | 
 |  |  |                                             return; | 
 |  |  |                                         } | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                         if (!sign && staList.size()>1) { | 
 |  |  |                             for (Integer staNoNow : rangeList) { | 
 |  |  |                                 for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                     if (rgvStn.getStaNo().equals(staNoNow)) { | 
 |  |  |                                         TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                         if (taskWrk != null) { | 
 |  |  |                                             BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()))); | 
 |  |  |                                             if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) { | 
 |  |  |                                                 System.out.println("筛选半边范围内任务==="+rgvSlave.getId()+"==="+taskWrk); | 
 |  |  |                                                 System.out.println("筛选半边范围内任务==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); | 
 |  |  |  | 
 |  |  |                                                 sign = taskGenerate(rgvSlave, rgvStn, 0); | 
 |  |  |                                             } | 
 |  |  |                                         } | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                                 if (sign) { | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         }else if (!sign && staList.size()==1){ | 
 |  |  |                             BasDevpPosition basDevpPosition1 = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", staList.get(0))); | 
 |  |  |                             if (Math.abs(basDevpPosition1.getPlcPosition()- rgvProtocol.getRgvPos())<rgvProtocol.getCarBodyJiaoMing()+rgvProtocol.getCarBodyKunPeng() + avoidDistance*2){ | 
 |  |  |                                 for (Integer staNoNow : rangeList) { | 
 |  |  |                                     for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                         if (rgvStn.getStaNo().equals(staNoNow)) { | 
 |  |  |                                             TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                             if (taskWrk != null) { | 
 |  |  |                                                 BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()))); | 
 |  |  |                                                 if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) { | 
 |  |  |                                                     System.out.println("筛选半边范围内任务==="+rgvSlave.getId()+"==="+taskWrk); | 
 |  |  |                                                     System.out.println("筛选半边范围内任务==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); | 
 |  |  |  | 
 |  |  |                                                     sign = taskGenerate(rgvSlave, rgvStn, 0); | 
 |  |  |                                                 } | 
 |  |  |                                             } | 
 |  |  |                                             break; | 
 |  |  |                                         } | 
 |  |  |                                     } | 
 |  |  |                                     if (sign) { | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                         if (!sign && staList.size()>1) { | 
 |  |  |                             //  半边区域内取货任务 | 
 |  |  |                             for (Integer staNoNow : rangeList) { | 
 |  |  |                                 for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                     if (rgvStn.getStaNo().equals(staNoNow)) { | 
 |  |  |                                         TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                         if (taskWrk != null) { | 
 |  |  |                                             Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); | 
 |  |  |                                             for (RgvSlave.RgvStn rgvStnOut : rgvSlave.getRgvOutSta()) { | 
 |  |  |                                                 if (rgvStnOut.getStaNo().equals(outStaNo)) { | 
 |  |  |                                                     System.out.println("筛选半边范围取货任务==="+rgvSlave.getId()+"==="+taskWrk); | 
 |  |  |                                                     System.out.println("筛选半边范围取货任务==="+rgvSlave.getId()+"==="+JSON.toJSONString(belongToRange)); | 
 |  |  |  | 
 |  |  |                                                     sign = taskGenerate(rgvSlave, rgvStn, 0); | 
 |  |  |                                                     break; | 
 |  |  |                                                 } | 
 |  |  |                                             } | 
 |  |  |                                         } | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                                 if (sign) { | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                         if (!sign && staList.size()>1) { | 
 |  |  |                             for (Integer staNoNow : rangeListOther) { | 
 |  |  |                                 for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                     if (rgvStn.getStaNo().equals(staNoNow)) { | 
 |  |  |                                         TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                         if (taskWrk != null) { | 
 |  |  |                                             Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); | 
 |  |  |                                             for (RgvSlave.RgvStn rgvSuper : rgvSlave.getRgvSuperSta()){ | 
 |  |  |                                                 if (rgvSuper.getStaNo().equals(outStaNo)){ | 
 |  |  |                                                     System.out.println("因最远执行半边区域内放货任务==="+rgvSlave.getId()+"==="); | 
 |  |  |                                                     BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()))); | 
 |  |  |                                                     if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) { | 
 |  |  |                                                         sign = taskGenerate(rgvSlave, rgvStn, 0); | 
 |  |  |                                                     } | 
 |  |  |                                                     break; | 
 |  |  |                                                 } | 
 |  |  |                                             } | 
 |  |  |                                         } | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                     if (sign) { | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                                 if (sign) { | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |  | 
 |  |  |                         }else if (!sign && staList.size()==1){ | 
 |  |  |                             for (Integer staNoNow : rangeList) { | 
 |  |  |                                 for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                     if (rgvStn.getStaNo().equals(staNoNow)) { | 
 |  |  |                                         TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                         if (taskWrk != null) { | 
 |  |  |                                             Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); | 
 |  |  |                                             for (RgvSlave.RgvStn rgvSuper : rgvSlave.getRgvSuperSta()){ | 
 |  |  |                                                 if (rgvSuper.getStaNo().equals(outStaNo)){ | 
 |  |  |                                                     System.out.println("因最远执行半边区域内放货任务==="+rgvSlave.getId()+"==="); | 
 |  |  |                                                     BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()))); | 
 |  |  |                                                     if (RouteUtils.CheckIfItIsWithinTheRange(rangeList, basDevpPosition.getPlcPosition(), basDevpPositions, itSmall)) { | 
 |  |  |                                                         sign = taskGenerate(rgvSlave, rgvStn, 0); | 
 |  |  |                                                     } | 
 |  |  |                                                     break; | 
 |  |  |                                                 } | 
 |  |  |                                             } | 
 |  |  |                                         } | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                     if (sign) { | 
 |  |  |                                         break; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                                 if (sign) { | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |  | 
 |  |  |                         } | 
 |  |  |                         RgvErrCache.updateRgvErr(rgvSlave.getId(),"未查询到可执行任务"); | 
 |  |  |  | 
 |  |  |                     } else { | 
 |  |  |                         //可用区域就近取货 | 
 |  |  |                         //就近排序 | 
 |  |  |                         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId()); | 
 |  |  |                         List<Integer> rangeList = RouteUtils.SortNearby(staList, rgvProtocol.RgvPos, basDevpPositions); | 
 |  |  |                         //  半边区域内取货任务 | 
 |  |  |                         for (Integer staNoNow : rangeList) { | 
 |  |  |                             for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |                                 if (rgvStn.getStaNo().equals(staNoNow)) { | 
 |  |  |                                     TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                                     if (taskWrk != null) { | 
 |  |  |                                         Integer outStaNo = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); | 
 |  |  |                                         for (RgvSlave.RgvStn rgvStnOut : rgvSlave.getRgvOutSta()) { | 
 |  |  |                                             if (rgvStnOut.getStaNo().equals(outStaNo)) { | 
 |  |  |                                                 sign = taskGenerate(rgvSlave, rgvStn, 0); | 
 |  |  |                                                 break; | 
 |  |  |                                             } | 
 |  |  |                                         } | 
 |  |  |                                     } | 
 |  |  |                                     break; | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                             if (sign) { | 
 |  |  |                                 break; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("任务生成失败===》异常信息:{}", e.getMessage()); | 
 |  |  |                 try{ | 
 |  |  |                     DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
 |  |  |                     deviceErrorService.addDeviceError("rgvErr", rgvSlave.getId(), "指令生成失败"); | 
 |  |  |                 } catch (Exception e2){ | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //获取起点与终点对象 | 
 |  |  |     public RgvSlave.RgvStn getRgvStnNow(RgvSlave rgvSlave, Integer staNo) { | 
 |  |  |         for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |             if (rgvStn.getStaNo().equals(staNo)) { | 
 |  |  |                 return rgvStn; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()) { | 
 |  |  |             if (rgvStn.getStaNo().equals(staNo)) { | 
 |  |  |                 return rgvStn; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //获取起点与终点对象 | 
 |  |  |     public RgvSlave.RgvStn[] getRgvStnAll(RgvSlave rgvSlave, Integer souSta, Integer endSta) { | 
 |  |  |         RgvSlave.RgvStn[] rgvStns = new RgvSlave.RgvStn[2]; | 
 |  |  |         for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) { | 
 |  |  |             if (rgvStn.getStaNo().equals(souSta)) { | 
 |  |  |                 rgvStns[0] = rgvStn; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()) { | 
 |  |  |             if (rgvStn.getStaNo().equals(endSta)) { | 
 |  |  |                 rgvStns[1] = rgvStn; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return rgvStns; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public boolean taskGenerate(RgvSlave rgvSlave, RgvSlave.RgvStn rgvStn, Integer sign) { | 
 |  |  |         try { | 
 |  |  |             RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId()); | 
 |  |  |             TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache(); | 
 |  |  |             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, rgvStn.getDevpPlcId()); | 
 |  |  |  | 
 |  |  |             TaskProtocol issuedTake = new TaskProtocol(); | 
 |  |  |             TaskProtocol issuedPut = new TaskProtocol(); | 
 |  |  |             try { | 
 |  |  |                 ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol(); | 
 |  |  |                 if (allTaskProtocol.size() > 0) { | 
 |  |  |                     return false; | 
 |  |  |                 } | 
 |  |  |                 TaskWrk taskWrk = deviceDetection(rgvStn); | 
 |  |  |                 if (taskWrk == null) { | 
 |  |  |                     return false; | 
 |  |  |                 } | 
 |  |  | //                Integer targetPointConvert = taskWrk.getTargetPointConvert(); | 
 |  |  |                 Integer targetPointConvert = BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint()); | 
 |  |  |                 if (targetPointConvert == null) { | 
 |  |  |                     return false; | 
 |  |  |                 } | 
 |  |  |                 if (targetPointConvert == 1009){ | 
 |  |  |                     if (!deviceDetection(rgvStn, rgvSlave.getId())){ | 
 |  |  |                         return false; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 try{ | 
 |  |  |                     devpThread.setPakMkTask(rgvStn.getStaNo(), false); | 
 |  |  |                 } catch (Exception e2){ | 
 |  |  |                     RgvErrCache.updateRgvErr(rgvSlave.getId(),rgvStn.getStaNo()+"小车任务下发标记更新失败"); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 BasDevpPosition basDevpPositionSou = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStn.getStaNo())); | 
 |  |  |                 BasDevpPosition basDevpPositionEnd = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", targetPointConvert)); | 
 |  |  |                 //执行 | 
 |  |  |                 issuedTake.setTaskNo(Long.valueOf(taskWrk.getWrkNo())); | 
 |  |  |                 issuedTake.setTaskStatus(2); | 
 |  |  |                 issuedTake.setTargetPositionStaNo(basDevpPositionSou.getDevNo()); | 
 |  |  |                 issuedTake.setTargetPositionStaNoPlcId(basDevpPositionSou.getPlcId()); | 
 |  |  |                 issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus())); | 
 |  |  |                 issuedTake.setTargetPosition(basDevpPositionSou.getPlcPosition()); | 
 |  |  |                 issuedTake.setIsRunning(1); | 
 |  |  |                 issuedTake.setDirection(basDevpPositionSou.getRgvSign()==1); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                 issuedPut.setTaskNo(Long.valueOf(taskWrk.getWrkNo())); | 
 |  |  |                 issuedPut.setTaskStatus(3); | 
 |  |  |                 issuedPut.setTargetPositionStaNo(basDevpPositionEnd.getDevNo()); | 
 |  |  |                 issuedPut.setTargetPositionStaNoPlcId(basDevpPositionEnd.getPlcId()); | 
 |  |  |                 issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus())); | 
 |  |  |                 issuedPut.setTargetPosition(basDevpPositionEnd.getPlcPosition()); | 
 |  |  |                 issuedPut.setIsRunning(1); | 
 |  |  |                 issuedPut.setDirection(basDevpPositionEnd.getRgvSign()==1); | 
 |  |  |  | 
 |  |  |                 try{ | 
 |  |  |                     if (taskWrk.getIoType()==2 && basDevpPositionEnd.getRgvSign()==1){ | 
 |  |  |                         Date now = new Date(); | 
 |  |  |                         taskWrk.setStatus(TaskStatusType.OVER.id); | 
 |  |  |                         taskWrk.setModiTime(now);//更新时间 | 
 |  |  |                         taskWrk.setCompleteTime(now);//完结时间 | 
 |  |  |                         taskWrkService.updateById(taskWrk); | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e){ | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("任务生成失败issued1===》异常信息:{}", e.getMessage()); | 
 |  |  |                 RgvErrCache.updateRgvErr(rgvSlave.getId(),rgvStn.getStaNo()+"站点任务生成失败issued1"); | 
 |  |  |  | 
 |  |  |                 try{ | 
 |  |  |                     DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
 |  |  |                     deviceErrorService.addDeviceError("rgvErr", rgvSlave.getId(), "任务生成失败issued1"); | 
 |  |  |                 } catch (Exception e2){ | 
 |  |  |                 } | 
 |  |  |                 return false; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             switch (sign) { | 
 |  |  |                 case 1: | 
 |  |  |                     taskProtocolCache.updateTaskProtocol(issuedTake); | 
 |  |  |                     break; | 
 |  |  |                 case 2: | 
 |  |  |                     taskProtocolCache.updateTaskProtocol(issuedPut); | 
 |  |  |                     break; | 
 |  |  |                 default: | 
 |  |  |                     taskProtocolCache.updateTaskProtocol(issuedTake); | 
 |  |  |                     taskProtocolCache.updateTaskProtocol(issuedPut); | 
 |  |  |                     break; | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("任务生成失败issued2===》异常信息:{}", e.getMessage()); | 
 |  |  |             RgvErrCache.updateRgvErr(rgvSlave.getId(),rgvStn.getStaNo()+"站点任务生成失败issued2"); | 
 |  |  |  | 
 |  |  |             try{ | 
 |  |  |                 DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class); | 
 |  |  |                 deviceErrorService.addDeviceError("rgvErr", rgvSlave.getId(), "站点任务生成失败issued2"); | 
 |  |  |             } catch (Exception e2){ | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 出库  ===>> 工作档信息写入led显示器 | 
 |  |  |      */ | 
 |  |  |     @Async | 
 |  |  |     public void ledExecute() { | 
 |  |  |     public synchronized void ledExecute(Integer mark) { | 
 |  |  |  | 
 |  |  |         for (LedSlave led : slaveProperties.getLed()) { | 
 |  |  |             // 获取输送线plc线程 | 
 |  |  |             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); | 
 |  |  |             // 命令集合 | 
 |  |  |             List<LedCommand> commands = new ArrayList<>(); | 
 |  |  |             // 工作档集合 | 
 |  |  |             List<WrkMast> wrkMasts = new ArrayList<>(); | 
 |  |  |             List<TaskWrk> taskWrks = new ArrayList<>(); | 
 |  |  |             for (Integer staNo : led.getStaArr()) { | 
 |  |  |                 // 获取叉车站点 | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(staNo); | 
 |  |  | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |                 // 获取工作档数据 | 
 |  |  |                 WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo()); | 
 |  |  | //                if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; } | 
 |  |  |                 if (null == wrkMast) { continue; } | 
 |  |  |                 wrkMasts.add(wrkMast); | 
 |  |  |                 // 组装命令 | 
 |  |  |                 LedCommand ledCommand = new LedCommand(); | 
 |  |  |                 ledCommand.setWorkNo(wrkMast.getWrkNo()); | 
 |  |  |                 ledCommand.setIoType(wrkMast.getIoType()); | 
 |  |  |                 // 出库模式 | 
 |  |  |                 switch (wrkMast.getIoType()) { | 
 |  |  |                     case 1: | 
 |  |  |                         ledCommand.setTitle("全板入库"); | 
 |  |  |                         break; | 
 |  |  |                     case 10: | 
 |  |  |                         ledCommand.setTitle("空板入库"); | 
 |  |  |                         break; | 
 |  |  |                     case 101: | 
 |  |  |                         ledCommand.setTitle("全板出库"); | 
 |  |  |                         break; | 
 |  |  |                     case 103: | 
 |  |  |                         ledCommand.setTitle("拣料出库"); | 
 |  |  |                         break; | 
 |  |  |                     case 104: | 
 |  |  |                         ledCommand.setTitle("并板出库"); | 
 |  |  |                         break; | 
 |  |  |                     case 107: | 
 |  |  |                         ledCommand.setTitle("盘点出库"); | 
 |  |  |                         break; | 
 |  |  |                     case 110: | 
 |  |  |                         ledCommand.setTitle("空板出库"); | 
 |  |  |                         ledCommand.setEmptyMk(true); | 
 |  |  |                         break; | 
 |  |  |                     default: | 
 |  |  |                         log.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType()); | 
 |  |  |                         break; | 
 |  |  |                 } | 
 |  |  |                 ledCommand.setSourceLocNo(wrkMast.getSourceLocNo()); | 
 |  |  |                 ledCommand.setLocNo(wrkMast.getLocNo()); | 
 |  |  |                 ledCommand.setStaNo(wrkMast.getStaNo()); | 
 |  |  | //                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo()); | 
 |  |  |                 if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10 ) { | 
 |  |  |                     List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo()); | 
 |  |  |                     wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme()))); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  | // | 
 |  |  | //                ledCommand.setWorkNo(wrkMast.getWrkNo()); | 
 |  |  | //                ledCommand.setIoType(wrkMast.getIoType()); | 
 |  |  | //                ledCommand.setTitle("空板出库"); | 
 |  |  | //                ledCommand.setEmptyMk(true); | 
 |  |  | //                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo()); | 
 |  |  | //                ledCommand.setLocNo(wrkMast.getLocNo()); | 
 |  |  | //                ledCommand.setStaNo(wrkMast.getStaNo()); | 
 |  |  |                 MatDto matDto = new MatDto(); | 
 |  |  |                 ledCommand.getMatDtos().add(matDto); | 
 |  |  |                 commands.add(ledCommand); | 
 |  |  |             } | 
 |  |  |             Set<Integer> workNos = wrkMasts.stream().map(WrkMast::getWrkNo).collect(Collectors.toSet()); | 
 |  |  |             Set<Integer> workNos = taskWrks.stream().map(TaskWrk::getWrkNo).collect(Collectors.toSet()); | 
 |  |  |             // 获取LED线程 | 
 |  |  |             LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId()); | 
 |  |  |             // 相同工作号集合则过滤 | 
 |  |  | 
 |  |  |             } | 
 |  |  |             // 命令下发 ------------------------------------------------------------------------------- | 
 |  |  |             if (!commands.isEmpty()) { | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) { | 
 |  |  |                     log.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) { | 
 |  |  | //                    News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                 }else { | 
 |  |  |                     ledThread.setLedMk(false); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             try { | 
 |  |  |                 // 修改主档led标记 | 
 |  |  |                 for (WrkMast wrkMast : wrkMasts) { | 
 |  |  |                     wrkMast.setOveMk("Y"); | 
 |  |  |                     wrkMast.setModiTime(new Date()); | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                 for (TaskWrk taskWrk : taskWrks) { | 
 |  |  | //                    taskWrk.setOveMk("Y"); | 
 |  |  |                     taskWrk.setModiTime(new Date()); | 
 |  |  |                     if (taskWrkMapper.updateById(taskWrk) == 0) { | 
 |  |  | //                        News.errorNoLog(""+mark+" - 4"+" - 更新工作档失败"); | 
 |  |  |                         throw new CoolException("更新工作档失败"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  | //        News.infoNoLog(""+mark+" - 0"+" - 出库  ===>> 工作档信息写入led显示器执行完成"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 其他  ===>> LED显示器复位,显示默认信息 | 
 |  |  |      */ | 
 |  |  |     @Async | 
 |  |  |     public void ledReset() { | 
 |  |  | //        for (LedSlave led : slaveProperties.getLed()) { | 
 |  |  | //            // 获取输送线plc线程 | 
 |  |  | //            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); | 
 |  |  | //            // 命令集合 | 
 |  |  | //            boolean reset = true; | 
 |  |  | //            for (Integer staNo : led.getStaArr()) { | 
 |  |  | //                // 获取叉车站点 | 
 |  |  | //                StaProtocol staProtocol = devpThread.getStation().get(staNo); | 
 |  |  | //                if (staProtocol == null) { | 
 |  |  | //                    continue; | 
 |  |  | //                } else { | 
 |  |  | //                    staProtocol = staProtocol.clone(); | 
 |  |  | //                } | 
 |  |  | //                if (staProtocol.getWorkNo() != 0) { | 
 |  |  | //                    reset = false; | 
 |  |  | //                    break; | 
 |  |  | //                } | 
 |  |  | //            } | 
 |  |  | //            // 获取led线程 | 
 |  |  | //            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getDevpPlcId()); | 
 |  |  | //            // led显示默认内容 | 
 |  |  | //            if (reset) { | 
 |  |  | //                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) { | 
 |  |  | //                    log.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); | 
 |  |  | //                } | 
 |  |  | //            } | 
 |  |  | //        } | 
 |  |  |     public synchronized void ledReset(Integer mark) { | 
 |  |  |  | 
 |  |  | //        News.warnNoLog(""+mark+" - 0"+" - 开始执行:其他  ===>> LED显示器复位,显示默认信息"); | 
 |  |  |         for (LedSlave led : slaveProperties.getLed()) { | 
 |  |  |  | 
 |  |  |             // 获取输送线plc线程 | 
 |  |  |             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId()); | 
 |  |  |             // 命令集合 | 
 |  |  | 
 |  |  |             // led显示默认内容 | 
 |  |  |             if (reset && !ledThread.isLedMk()) { | 
 |  |  |                 ledThread.setLedMk(true); | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) { | 
 |  |  |                     log.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(4, new ArrayList<>()))) { | 
 |  |  | //                    News.error(""+mark+" - 1"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort()); | 
 |  |  |                 } else { | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 因双深库位阻塞,对浅库位进行移转(入库版) | 
 |  |  |      * tip:同步 | 
 |  |  |      */ | 
 |  |  |     @Transactional | 
 |  |  |     public synchronized void moveLocForDeepLocPakin(CrnSlave crn, LocMast shallowLoc, WrkMast pakinWrkMast){ | 
 |  |  |         LocMast loc = locMastService.selectById(pakinWrkMast.getLocNo()); | 
 |  |  |  | 
 |  |  |         // 获取工作号 | 
 |  |  |         int workNo = commonService.getWorkNo(0); | 
 |  |  |         Date now = new Date(); | 
 |  |  |         // 保存工作档 | 
 |  |  |         WrkMast wrkMast = new WrkMast(); | 
 |  |  |         wrkMast.setWrkNo(workNo); | 
 |  |  |         wrkMast.setIoTime(now); | 
 |  |  |         wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID | 
 |  |  |         wrkMast.setIoType(11); // 入出库状态: 11.库格移载 | 
 |  |  |         wrkMast.setIoPri(15D); | 
 |  |  |         wrkMast.setCrnNo(crn.getId()); | 
 |  |  |         wrkMast.setSourceLocNo(shallowLoc.getLocNo()); // 源库位 | 
 |  |  |         wrkMast.setLocNo(loc.getLocNo()); // 目标库位 | 
 |  |  |         wrkMast.setFullPlt(shallowLoc.getFullPlt()); // 满板 | 
 |  |  |         wrkMast.setPicking("N"); // 拣料 | 
 |  |  |         wrkMast.setExitMk("N"); // 退出 | 
 |  |  |         wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D")?"Y":"N"); // 空板 | 
 |  |  |         wrkMast.setBarcode(shallowLoc.getBarcode()); // 托盘码 | 
 |  |  |         wrkMast.setLinkMis("N"); | 
 |  |  |         wrkMast.setCtnNo("Y");  // 入库阻塞库位移转标记 | 
 |  |  |         wrkMast.setAppeTime(now); | 
 |  |  |         wrkMast.setModiTime(now); | 
 |  |  |         int res = wrkMastMapper.insert(wrkMast); | 
 |  |  |         if (res == 0) { | 
 |  |  |             throw new CoolException("保存工作档失败"); | 
 |  |  |         } | 
 |  |  |         // 工作档明细保存 | 
 |  |  |         if (shallowLoc.getLocSts().equals("F")) { | 
 |  |  |             List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", shallowLoc.getLocNo())); | 
 |  |  |             for (LocDetl locDetl : locDetls) { | 
 |  |  |                 WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |                 wrkDetl.setWrkNo(workNo); | 
 |  |  |                 wrkDetl.setIoTime(now); | 
 |  |  |                 wrkDetl.setAnfme(locDetl.getAnfme()); | 
 |  |  |                 VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制 | 
 |  |  |                 wrkDetl.setAppeTime(now); | 
 |  |  |                 wrkDetl.setModiTime(now); | 
 |  |  |                 if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                     throw new CoolException("保存工作档明细失败"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         // 修改源库位状态 | 
 |  |  |         if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) { | 
 |  |  |             shallowLoc.setLocSts("S"); // S.入库预约,入库阻塞库位移转 | 
 |  |  |             shallowLoc.setModiTime(now); | 
 |  |  |             if (!locMastService.updateById(shallowLoc)){ | 
 |  |  |                 throw new CoolException("更新源库位状态失败"); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException("源库位出库失败"); | 
 |  |  |         } | 
 |  |  | //        // 修改目标库位状态 | 
 |  |  | //        if (loc.getLocSts().equals("O")) { | 
 |  |  | //            loc.setLocSts("S"); // S.入库预约 | 
 |  |  | //            loc.setModiTime(new Date()); | 
 |  |  | //            if (!locMastService.updateById(loc)) { | 
 |  |  | //                throw new CoolException("更新目标库位状态失败"); | 
 |  |  | //            } | 
 |  |  | //        } else { | 
 |  |  | //            throw new CoolException("移转失败"); | 
 |  |  | //        } | 
 |  |  |         wrkMast.setLocNo(shallowLoc.getLocNo()); | 
 |  |  |         if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |             throw new CoolException("修改阻塞入库任务失败"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 因双深库位阻塞,对浅库位进行移转(立即执行版) | 
 |  |  |      * tip:同步 | 
 |  |  |      */ | 
 |  |  |     private void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc){ | 
 |  |  |         try { | 
 |  |  |             List<Integer> rows = locMastService.queryDistinctRow(crn.getId()); | 
 |  |  |             LocMast loc = null; | 
 |  |  |             for (Integer row : rows) { | 
 |  |  |                 if (Utils.isDeepLoc(slaveProperties, row)) { | 
 |  |  |                     loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1()); | 
 |  |  |  | 
 |  |  |                     if (loc != null) { | 
 |  |  |                         if (Utils.isDeepLoc(slaveProperties, loc.getLocNo())) { | 
 |  |  |                             String shallowLocNo = Utils.getShallowLoc(slaveProperties, loc.getLocNo()); | 
 |  |  |                             LocMast shallowLoc1 = locMastService.selectById(shallowLocNo); | 
 |  |  |                             if (!shallowLoc1.getLocSts().equals("O")) { | 
 |  |  |                                 loc = null; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                     if (null != loc) { | 
 |  |  |                         break; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if (null == loc) { | 
 |  |  |                 for (Integer row : rows) { | 
 |  |  |                     if (Utils.isShallowLoc(slaveProperties, row)) { | 
 |  |  |                         loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1()); | 
 |  |  |  | 
 |  |  |                         if (null != loc) {//对应深库位非在库状态,不能移库 | 
 |  |  |                             String deepLoc = Utils.getDeepLoc(slaveProperties, loc.getLocNo()); | 
 |  |  |                             LocMast deepLoc1 = locMastService.selectById(deepLoc); | 
 |  |  |                             if (!deepLoc1.getLocSts().equals("F") && !deepLoc1.getLocSts().equals("D")) { | 
 |  |  |                                 loc = null; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         if (null != loc) { | 
 |  |  |                             break; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (null == loc) { | 
 |  |  |                 log.error("双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |                 throw new CoolException("双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 获取工作号 | 
 |  |  |             int workNo = commonService.getWorkNo(0); | 
 |  |  |             // 保存工作档 | 
 |  |  |             WrkMast wrkMast = new WrkMast(); | 
 |  |  |             wrkMast.setWrkNo(workNo); | 
 |  |  |             wrkMast.setIoTime(new Date()); | 
 |  |  |             wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID | 
 |  |  |             wrkMast.setIoType(11); // 入出库状态: 11.库格移载 | 
 |  |  |             wrkMast.setIoPri(13D); | 
 |  |  |             wrkMast.setCrnNo(crn.getId()); | 
 |  |  |             wrkMast.setSourceLocNo(shallowLoc.getLocNo()); // 源库位 | 
 |  |  |             wrkMast.setLocNo(loc.getLocNo()); // 目标库位 | 
 |  |  |             wrkMast.setFullPlt(shallowLoc.getFullPlt()); // 满板 | 
 |  |  |             wrkMast.setPicking("N"); // 拣料 | 
 |  |  |             wrkMast.setExitMk("N"); // 退出 | 
 |  |  |             wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D") ? "Y" : "N"); // 空板 | 
 |  |  |             wrkMast.setBarcode(shallowLoc.getBarcode()); // 托盘码 | 
 |  |  |             wrkMast.setLinkMis("N"); | 
 |  |  |             wrkMast.setAppeTime(new Date()); | 
 |  |  |             wrkMast.setModiTime(new Date()); | 
 |  |  |             int res = wrkMastMapper.insert(wrkMast); | 
 |  |  |             if (res == 0) { | 
 |  |  |                 throw new CoolException("保存工作档失败"); | 
 |  |  |             } | 
 |  |  |             // 工作档明细保存 | 
 |  |  |             if (shallowLoc.getLocSts().equals("F")) { | 
 |  |  |                 List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", shallowLoc.getLocNo())); | 
 |  |  |                 for (LocDetl locDetl : locDetls) { | 
 |  |  |                     WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |                     wrkDetl.setWrkNo(workNo); | 
 |  |  |                     wrkDetl.setIoTime(new Date()); | 
 |  |  |                     wrkDetl.setAnfme(locDetl.getAnfme()); | 
 |  |  |                     VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制 | 
 |  |  |                     wrkDetl.setAppeTime(new Date()); | 
 |  |  |                     wrkDetl.setModiTime(new Date()); | 
 |  |  |                     if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                         throw new CoolException("保存工作档明细失败"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             // 修改源库位状态 | 
 |  |  |             if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) { | 
 |  |  |                 shallowLoc.setLocSts("R"); // R.出库预约 | 
 |  |  |                 shallowLoc.setModiTime(new Date()); | 
 |  |  |                 if (!locMastService.updateById(shallowLoc)) { | 
 |  |  |                     throw new CoolException("更新源库位状态失败"); | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 throw new CoolException("源库位出库失败"); | 
 |  |  |             } | 
 |  |  |             // 修改目标库位状态 | 
 |  |  |             if (loc.getLocSts().equals("O")) { | 
 |  |  |                 loc.setLocSts("S"); // S.入库预约 | 
 |  |  |                 loc.setModiTime(new Date()); | 
 |  |  |                 if (!locMastService.updateById(loc)) { | 
 |  |  |                     throw new CoolException("更新目标库位状态失败"); | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 throw new CoolException("移转失败"); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("双深库位阻塞,对浅库位进行移转失败", e); | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 堆垛机演示  ===>> 库位移转 | 
 |  |  |      */ | 
 |  |  |     public synchronized void crnDemoOfLocMove1(){ | 
 |  |  |         try { | 
 |  |  |             for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |                 if (!crn.getDemo()) { | 
 |  |  |                     continue; | 
 |  |  |                 }   // 必须为演示状态 | 
 |  |  |  | 
 |  |  |                 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |                 CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |                 if (crnProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 只有当堆垛机空闲 并且 无任务时才继续执行 | 
 |  |  |                 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { | 
 |  |  |                     // 获取移库工作档信息 | 
 |  |  |                     WrkMast wrkMast = wrkMastMapper.selectLocMove(crn.getId()); | 
 |  |  |                     if (null != wrkMast) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     LocMast sourceLoc = locMastService.queryDemoSourceLoc(crn.getId()); | 
 |  |  |                     LocMast loc = locMastService.queryDemoLoc(crn.getId()); | 
 |  |  |                     if (null == sourceLoc || null == loc) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     String sourceLocNo = sourceLoc.getLocNo(); | 
 |  |  |                     String locNo = loc.getLocNo(); | 
 |  |  |  | 
 |  |  |                     // 获取工作号 | 
 |  |  |                     int workNo = commonService.getWorkNo(0); | 
 |  |  |                     // 保存工作档 | 
 |  |  |                     wrkMast = new WrkMast(); | 
 |  |  |                     wrkMast.setWrkNo(workNo); | 
 |  |  |                     wrkMast.setIoTime(new Date()); | 
 |  |  |                     wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID | 
 |  |  |                     wrkMast.setIoType(11); // 入出库状态: 11.库格移载 | 
 |  |  |                     wrkMast.setIoPri(13D); | 
 |  |  |                     wrkMast.setCrnNo(crn.getId()); | 
 |  |  |                     wrkMast.setSourceLocNo(sourceLocNo); // 源库位 | 
 |  |  |                     wrkMast.setLocNo(locNo); // 目标库位 | 
 |  |  |                     wrkMast.setFullPlt("N"); // 满板:Y | 
 |  |  |                     wrkMast.setPicking("N"); // 拣料 | 
 |  |  |                     wrkMast.setExitMk("N"); // 退出 | 
 |  |  |                     wrkMast.setEmptyMk(sourceLoc.getLocSts().equals("D") ? "Y" : "N"); // 空板 | 
 |  |  |                     wrkMast.setBarcode(sourceLoc.getBarcode()); // 托盘码 | 
 |  |  |                     wrkMast.setLinkMis("N"); | 
 |  |  |                     wrkMast.setAppeTime(new Date()); | 
 |  |  |                     wrkMast.setModiTime(new Date()); | 
 |  |  |                     int res = wrkMastMapper.insert(wrkMast); | 
 |  |  |                     if (res == 0) { | 
 |  |  |                         throw new CoolException("保存工作档失败"); | 
 |  |  |                     } | 
 |  |  |                     // 工作档明细保存 | 
 |  |  | //                List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", sourceLocNo)); | 
 |  |  | //                for (LocDetl locDetl : locDetls) { | 
 |  |  | //                    WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  | //                    wrkDetl.setWrkNo(workNo); | 
 |  |  | //                    wrkDetl.setIoTime(new Date()); | 
 |  |  | //                    wrkDetl.setAnfme(locDetl.getAnfme()); | 
 |  |  | //                    VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制 | 
 |  |  | //                    wrkDetl.setAppeTime(new Date()); | 
 |  |  | //                    wrkDetl.setModiTime(new Date()); | 
 |  |  | //                    if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  | //                        throw new CoolException("保存工作档明细失败"); | 
 |  |  | //                    } | 
 |  |  | //                } | 
 |  |  |                     // 修改源库位状态 | 
 |  |  |                     if (sourceLoc.getLocSts().equals("D")) { | 
 |  |  |                         sourceLoc.setLocSts("R"); // R.出库预约 | 
 |  |  |                         sourceLoc.setModiTime(new Date()); | 
 |  |  |                         if (!locMastService.updateById(sourceLoc)) { | 
 |  |  |                             throw new CoolException("更新源库位状态失败"); | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         throw new CoolException("源库位出库失败"); | 
 |  |  |                     } | 
 |  |  |                     // 修改目标库位状态 | 
 |  |  |                     if (loc.getLocSts().equals("O")) { | 
 |  |  |                         loc.setLocSts("S"); // S.入库预约 | 
 |  |  |                         loc.setModiTime(new Date()); | 
 |  |  |                         if (!locMastService.updateById(loc)) { | 
 |  |  |                             throw new CoolException("更新目标库位状态失败"); | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         throw new CoolException("移转失败"); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("堆垛机演示  ===>> 库位移转失败", e); | 
 |  |  |             e.printStackTrace(); | 
 |  |  |             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 堆垛机命令下发后,异步修改工作档状态 | 
 |  |  |      */ | 
 |  |  |     public synchronized void crnIoWrkMast(){ | 
 |  |  |         for (CrnSlave crn : slaveProperties.getCrn()) { | 
 |  |  |             // 获取堆垛机信息 | 
 |  |  |             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); | 
 |  |  |             CrnProtocol crnProtocol = crnThread.getCrnProtocol(); | 
 |  |  |             if (crnProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             Date now = new Date(); | 
 |  |  |             // 堆垛机正在运行 | 
 |  |  |             if (crnProtocol.getStatusType() != CrnStatusType.IDLE && crnProtocol.getTaskNo() != 0 && crnProtocol.getModeType() == CrnModeType.AUTO) { | 
 |  |  |                 // 获取工作档 | 
 |  |  |                 WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo()); | 
 |  |  |                 if (wrkMast == null) { continue; } | 
 |  |  |                 // 入库 | 
 |  |  |                 if (wrkMast.getWrkSts() == 1 || wrkMast.getWrkSts() == 2) { | 
 |  |  |                     log.warn("堆垛机非空闲情况下,开始修改工作档状态。[id:{},时间:{}] >>>>> 堆垛机当前状态为:{}。任务号:{}", crn.getId(), DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F), crnProtocol.getStatusType().desc, crnProtocol.getTaskNo()); | 
 |  |  |                     // 修改工作档状态 2.设备上走 => 3.吊车入库中 | 
 |  |  |                     wrkMast.setWrkSts(3L); | 
 |  |  |                     wrkMast.setCrnStrTime(now); | 
 |  |  |                     wrkMast.setModiTime(now); | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                         log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                     log.warn("修改工作档状态成功。[时间:{}] >>>>> 任务号:{}",  DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F),  wrkMast.getWrkNo()); | 
 |  |  |                 } | 
 |  |  |                 // 出库、移库 | 
 |  |  |                 if (wrkMast.getWrkSts() == 11) { | 
 |  |  |                     log.warn("堆垛机非空闲情况下,开始修改工作档状态。[id:{},时间:{}] >>>>> 堆垛机当前状态为:{}。任务号:{}", crn.getId(), DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F), crnProtocol.getStatusType().desc, crnProtocol.getTaskNo()); | 
 |  |  |                     // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                     wrkMast.setWrkSts(12L); | 
 |  |  |                     wrkMast.setCrnStrTime(now); | 
 |  |  |                     wrkMast.setModiTime(now); | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                         log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                     log.warn("修改工作档状态成功。[时间:{}] >>>>> 任务号:{}",  DateUtils.convert(now, DateUtils.yyyyMMddHHmmsssss_F),  wrkMast.getWrkNo()); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入出库模式切换函数 | 
 |  |  |      */ | 
 |  |  |     public void ioConvert() { | 
 |  |  |         try { | 
 |  |  |             // 根据输送线plc遍历 | 
 |  |  |             for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |                 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |  | 
 |  |  |                 for (DevpSlave.Sta inSta : devp.getInSta()) { | 
 |  |  |                     if (inSta.getStaNo() == 2) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     WrkMast pakout = wrkMastMapper.selectWorkingPakout(inSta.getStaNo()); | 
 |  |  |                     switch (inSta.getStaNo()) { | 
 |  |  |                         case 203://1F | 
 |  |  |                             if (pakout != null) { | 
 |  |  |                                 if (devpThread.ioModeOf2F != IoModeType.PAKOUT_MODE) { | 
 |  |  |                                     // 出库切换中 | 
 |  |  |                                     devpThread.ioModeOf2F = IoModeType.PAKOUT_BOOTING; | 
 |  |  |                                     WrkMast pakin = wrkMastMapper.selectWorkingPakin(inSta.getStaNo()); | 
 |  |  |                                     if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() | 
 |  |  |                                             && !devpThread.getStation().get(inSta.getStaNo()+1).isLoading() | 
 |  |  |                                             && devpThread.getStation().get(inSta.getStaNo()+1).getWorkNo()==0) { | 
 |  |  |                                         // 出库模式 | 
 |  |  |                                         devpThread.ioModeOf2F = IoModeType.PAKOUT_MODE; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 // 入库模式 | 
 |  |  |                                 devpThread.ioModeOf2F = IoModeType.PAKIN_MODE; | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void outOfDevp() { | 
 |  |  |         List<WrkMast> wrkMasts = wrkMastMapper.selectPick(); | 
 |  |  |         for (WrkMast wrkMast : wrkMasts) { | 
 |  |  |             if (basDevpService.selectCount(new EntityWrapper<BasDevp>().eq("wrk_no", wrkMast.getWrkNo())) == 0) { | 
 |  |  |                 wrkMast.setCtnNo("Y"); | 
 |  |  |                 if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                     log.error("修改{}工作档失败,ctn_no", wrkMast.getWrkNo()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  | //        News.infoNoLog(""+mark+" - 0"+" - 执行完成:其他  ===>> LED显示器复位,显示默认信息"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  |