|  |  | 
 |  |  | package com.zy.asrs.service.impl; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.baomidou.mybatisplus.mapper.EntityWrapper; | 
 |  |  | import com.baomidou.mybatisplus.mapper.Wrapper; | 
 |  |  | import com.core.common.Cools; | 
 |  |  | import com.core.common.R; | 
 |  |  | import com.core.exception.CoolException; | 
 |  |  | import com.zy.asrs.entity.LocMast; | 
 |  |  | import com.zy.asrs.entity.StaDesc; | 
 |  |  | import com.zy.asrs.entity.WaitPakin; | 
 |  |  | import com.zy.asrs.entity.WrkMast; | 
 |  |  | import com.zy.asrs.mapper.WaitPakinMapper; | 
 |  |  | 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.entity.wms.StorageEscalationParam; | 
 |  |  | import com.zy.asrs.mapper.BasCrnErrorMapper; | 
 |  |  | import com.zy.asrs.mapper.StaDescMapper; | 
 |  |  | import com.zy.asrs.mapper.TaskWrkMapper; | 
 |  |  | import com.zy.asrs.mapper.WrkMastMapper; | 
 |  |  | import com.zy.asrs.service.LocMastService; | 
 |  |  | import com.zy.asrs.service.StaDescService; | 
 |  |  | import com.zy.asrs.service.WrkDetlService; | 
 |  |  | import com.zy.common.model.StartupDto; | 
 |  |  | import com.zy.core.Slave; | 
 |  |  | import com.zy.asrs.service.*; | 
 |  |  | import com.zy.asrs.utils.Utils; | 
 |  |  | import com.zy.common.service.CommonService; | 
 |  |  | 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.enums.CrnStatusType; | 
 |  |  | import com.zy.core.enums.SlaveType; | 
 |  |  | import com.zy.core.enums.*; | 
 |  |  | import com.zy.core.model.CrnSlave; | 
 |  |  | import com.zy.core.model.DevpSlave; | 
 |  |  | import com.zy.core.model.Task; | 
 |  |  | import com.zy.core.model.command.CrnCommand; | 
 |  |  | import com.zy.core.model.protocol.CrnProtocol; | 
 |  |  | import com.zy.core.model.protocol.StaProtocol; | 
 |  |  | import com.zy.core.properties.SlaveProperties; | 
 |  |  | import com.zy.core.thread.BarcodeThread; | 
 |  |  | import com.zy.core.thread.CrnThread; | 
 |  |  | import com.zy.core.thread.DevpThread; | 
 |  |  | import com.zy.core.thread.SiemensDevpThread; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.jdbc.core.JdbcTemplate; | 
 |  |  | import org.springframework.beans.factory.annotation.Value; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.transaction.interceptor.TransactionAspectSupport; | 
 |  |  |  | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  | import java.util.Random; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * 立体仓库WCS系统主流程业务 | 
 |  |  |  * Created by vincent on 2020/8/6 | 
 |  |  |  */ | 
 |  |  | @Slf4j | 
 |  |  | @Service("mainService") | 
 |  |  | @Transactional | 
 |  |  | public class MainServiceImpl { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private CommonService commonService; | 
 |  |  |     public static final long COMMAND_TIMEOUT = 5 * 1000; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SlaveProperties slaveProperties; | 
 |  |  |     @Autowired | 
 |  |  |     private WrkMastMapper wrkMastMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private WrkDetlService wrkDetlService; | 
 |  |  |     @Autowired | 
 |  |  |     private WaitPakinMapper waitPakinMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private LocMastService locMastService; | 
 |  |  |     @Autowired | 
 |  |  |     private StaDescService staDescService; | 
 |  |  |     private LocDetlService locDetlService; | 
 |  |  |     @Autowired | 
 |  |  |     private JdbcTemplate jdbcTemplate; | 
 |  |  |     private BasCrnpService basCrnpService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasDevpService basDevpService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasErrLogService basErrLogService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasCrnErrorMapper basCrnErrorMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private TaskWrkMapper taskWrkMapper; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入库站,根据条码扫描生成入库工作档,工作状态 2 | 
 |  |  |      */ | 
 |  |  |     @Transactional | 
 |  |  |     public void generateStoreWrkFile() { | 
 |  |  |         // 根据输送线plc遍历 | 
 |  |  |         for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |             // 遍历入库口 | 
 |  |  |             for (DevpSlave.Sta inSta : devp.getInSta()) { | 
 |  |  |                 // 获取条码 | 
 |  |  |                 BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); | 
 |  |  |                 String barcode = barcodeThread.getBarcode(); | 
 |  |  |                 // 获取入库站信息 | 
 |  |  |                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); | 
 |  |  |                 // 判断是否满足入库条件 | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInreq1() | 
 |  |  |                         && !staProtocol.isEmptyMk() && staProtocol.isInreq1() && staProtocol.getWorkNo() ==0 | 
 |  |  |                         && staProtocol.isPakMk() && !Cools.isEmpty(barcode)) { | 
 |  |  |                     // 判断重复工作档 | 
 |  |  |                     WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode); | 
 |  |  |                     if (wrkMast != null) { | 
 |  |  |                         log.warn("工作档中已存在该站状态为1的数据,工作号-{}", wrkMast.getWrkNo()); | 
 |  |  |     @Autowired | 
 |  |  |     private TaskWrkService taskWrkService; | 
 |  |  |     @Autowired | 
 |  |  |     private CommonService commonService; | 
 |  |  |     @Autowired | 
 |  |  |     private StaDescMapper staDescMapper; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private StaDescService staDescService; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ToWmsService toWmsService; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private CrnController crnController; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private TransferTaskService transferTaskService; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private WrkMastService wrkMastService; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private WrkDetlService wrkDetlService; | 
 |  |  |  | 
 |  |  |     @Value("${loc-move.enable}") | 
 |  |  |     private boolean enable; | 
 |  |  |  | 
 |  |  |     @Value("${config.outloading}") | 
 |  |  |     private boolean outloading; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public synchronized void generateStoreWrkFile() { | 
 |  |  |         try { | 
 |  |  |             // 根据输送线plc遍历 | 
 |  |  |             for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |                 // 遍历入库口 | 
 |  |  |                 for (DevpSlave.Sta inSta : devp.getInSta()) { | 
 |  |  |                     StorageEscalationParam storageEscalationParam = new StorageEscalationParam(); | 
 |  |  |                     storageEscalationParam.setStationCode(inSta.getStaNo()); | 
 |  |  |                     // 获取入库站信息 | 
 |  |  |                     DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                     StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); | 
 |  |  |                     if (staProtocol == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 获取入库通知档 | 
 |  |  |                     List<WaitPakin> waitPakins = waitPakinMapper.selectList(new EntityWrapper<WaitPakin>().eq("barcode", barcode)); | 
 |  |  |                     // 工作号 | 
 |  |  |                     int workNo = commonService.getWorkNo(0); | 
 |  |  |                     // 检索库位 | 
 |  |  |                     List<String> matNos = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList()); | 
 |  |  |                     StartupDto startupDto = commonService.getLocNo(1, 1, inSta.getStaNo(), matNos); | 
 |  |  |                     String locNo = startupDto.getLocNo(); | 
 |  |  |                     if (!waitPakins.isEmpty()) { | 
 |  |  |                         // 插入工作明细档 | 
 |  |  |                         wrkDetlService.createWorkDetail(workNo, waitPakins, barcode); | 
 |  |  |                     } else { | 
 |  |  |                         log.warn("无此入库条码数据---{}", barcode); | 
 |  |  |                         continue; | 
 |  |  |                         staProtocol = staProtocol.clone(); | 
 |  |  |                     } | 
 |  |  |                     Short workNo = staProtocol.getWorkNo(); | 
 |  |  |                     // 尺寸检测异常 | 
 |  |  |                     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 && staProtocol.isBarcodeErr()) { | 
 |  |  |                         errMsg = "扫码失败"; | 
 |  |  |                         back = true; | 
 |  |  |                     } | 
 |  |  |                     // 判断是否满足入库条件 | 
 |  |  |                     if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() | 
 |  |  |                             && !staProtocol.isEmptyMk() && workNo >= 9000 && staProtocol.isPakMk()) { | 
 |  |  |                         // 获取条码扫描仪信息 | 
 |  |  |                         BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); | 
 |  |  |                         if (barcodeThread == null) { | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         String BoxNo = barcodeThread.getBarcode(); | 
 |  |  |                         if (Cools.isEmpty(BoxNo)) { | 
 |  |  |                             log.error("{}号条码扫描失败,值:{}", inSta.getBarcode(), BoxNo); | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", BoxNo)); | 
 |  |  |                         if (!Cools.isEmpty(taskWrk1)) { | 
 |  |  |                             log.info("托盘码:" + BoxNo + "任务档存在"); | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                         if (back) { | 
 |  |  |                             storageEscalationParam.setWCSStatus(1); | 
 |  |  |                             storageEscalationParam.setWCSErrorMessage(storageEscalationParam.getWCSErrorMessage() + errMsg); | 
 |  |  |                         } | 
 |  |  |                         storageEscalationParam.setBarcode(BoxNo); | 
 |  |  |                         storageEscalationParam.setMatIdList(staProtocol.getMatIdList()); | 
 |  |  |                         storageEscalationParam.setFullPlt(staProtocol.isFullPlt() ? 1 : 0); | 
 |  |  |                         storageEscalationParam.setMpHigh((short) (staProtocol.getSiteId() < 200 ? 1 :staProtocol.isHigh() ? 2 : staProtocol.isLow() ? 1 : 0));    // 高度,侧面码盘的高度 低1,高2 | 
 |  |  |                         log.info("组托入库={}", storageEscalationParam); | 
 |  |  |                         TaskWrk taskWrk = toWmsService.getLocNoFromWms(storageEscalationParam); | 
 |  |  |                         if (taskWrk == null) { | 
 |  |  |                             log.error("入库请求wms创建任务工作档为空:{}", storageEscalationParam); | 
 |  |  |                             continue; | 
 |  |  |                         } else { | 
 |  |  |                             if (-1 == taskWrk.getWrkNo()) { | 
 |  |  |                                 back = true; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                         if (back) { | 
 |  |  |                             staProtocol.setWorkNo((short) 9991); | 
 |  |  |                             staProtocol.setStaNo(inSta.getBackSta().shortValue()); | 
 |  |  |                             devpThread.setPakMk(staProtocol.getSiteId(), false); | 
 |  |  |                             MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                             log.info("组托入库托盘退回命令推送输送线队列成功==>{},{},{}", BoxNo, errMsg, taskWrk.getWrkNo()); | 
 |  |  |                         } else { | 
 |  |  |                             StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() | 
 |  |  |                                     .eq("crn_no", taskWrk.getCrnNo()).eq("type_no", 1).eq("stn_no", staProtocol.getSiteId())); | 
 |  |  |                             if (staDesc == null) { | 
 |  |  |                                 log.error("组托入库路径不存在,wrkNo={},crn={},stn_no={}", taskWrk.getWrkNo(), taskWrk.getCrnNo(), staProtocol.getSiteId()); | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |                             staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue()); | 
 |  |  |                             staProtocol.setStaNo(staDesc.getCrnStn().shortValue()); | 
 |  |  |                             MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); | 
 |  |  |                             log.info("组托入库命令推送输送线队列成功:{}", staProtocol); | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                     // 插入工作主档 | 
 |  |  |                     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.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命令 | 
 |  |  |                     barcodeThread.setBarcode(""); | 
 |  |  |                     staProtocol.setWorkNo(workNo); | 
 |  |  |                     staProtocol.setStaNo(startupDto.getStaNo()); | 
 |  |  |                     staProtocol.setPakMk(false); | 
 |  |  |                     staProtocol.setInreq1(false); | 
 |  |  |                     boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task<>(4, staProtocol)); | 
 |  |  |                     if (!result) { | 
 |  |  |                         throw new CoolException("更新plc站点信息失败"); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 拣料、并板、盘点再入库 | 
 |  |  |      */ | 
 |  |  |     public void stnToCrnStnPick(){ | 
 |  |  |         for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |             // 遍历拣料入库口 | 
 |  |  |             for (DevpSlave.Sta pickSta : devp.getPickSta()) { | 
 |  |  |                 // 获取拣料入库站信息 | 
 |  |  |                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo()); | 
 |  |  |  | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInreq1() | 
 |  |  |                     && staProtocol.getWorkNo() > 0 && staProtocol.isPakMk()){ | 
 |  |  |                     WrkMast wrkMast = wrkMastMapper.selectPickStep(staProtocol.getWorkNo()); | 
 |  |  |                     if (wrkMast == null) { | 
 |  |  |                         // 无拣料数据 | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 1070) | 
 |  |  |                         || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo()) ) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     // 保存工作明细档历史档 | 
 |  |  |                     if (wrkMastMapper.saveWrkDetlLog(wrkMast.getWrkNo()) == 0) { | 
 |  |  |                         throw new CoolException("保存工作明细档历史档失败"); | 
 |  |  |                     } | 
 |  |  |                     // 保存工作主档历史档 | 
 |  |  |                     if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) { | 
 |  |  |                         throw new CoolException("保存工作主档历史档失败"); | 
 |  |  |                     } | 
 |  |  |                     // 获取目标站 | 
 |  |  |                     Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() | 
 |  |  |                             .eq("type_no", wrkMast.getIoType() - 50) | 
 |  |  |                             .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站 | 
 |  |  |                             .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号 | 
 |  |  |                     StaDesc staDesc = staDescService.selectOne(wrapper); | 
 |  |  |                     if (Cools.isEmpty(staDesc)) { | 
 |  |  |                         throw new CoolException("入库路径不存在"); | 
 |  |  |                     } | 
 |  |  |                     // 堆垛机站点(目标站) | 
 |  |  |                     Integer staNo = staDesc.getCrnStn(); | 
 |  |  |                     // 更新工作档数据状态 | 
 |  |  |                     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(new Date()); | 
 |  |  |                     if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                         throw new CoolException("更新工作档数据状态失败"); | 
 |  |  |                     } | 
 |  |  |                     // 修改库位状态 Q.拣料/盘点/并板再入库 | 
 |  |  |                     LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); | 
 |  |  |                     locMast.setLocSts("Q"); | 
 |  |  |                     locMast.setModiTime(new Date()); | 
 |  |  |                     if (!locMastService.updateById(locMast)) { | 
 |  |  |                         throw new CoolException("修改库位状态失败"); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 更新站点信息 且 下发plc命令 | 
 |  |  |                     staProtocol.setWorkNo(wrkMast.getWrkNo()); | 
 |  |  |                     staProtocol.setStaNo(wrkMast.getStaNo()); | 
 |  |  |                     staProtocol.setPakMk(false); | 
 |  |  |                     staProtocol.setInreq1(false); | 
 |  |  |                     boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task<>(4, staProtocol)); | 
 |  |  |                     if (!result) { | 
 |  |  |                         throw new CoolException("更新plc站点信息失败"); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             log.error("generateStoreWrkFile e", e); | 
 |  |  |             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 堆垛机站出库到出库站 | 
 |  |  |      */ | 
 |  |  |     public void crnStnToOutStn() { | 
 |  |  |         for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |             // 遍历拣料入库口 | 
 |  |  |             for (DevpSlave.Sta outSta : devp.getOutSta()) { | 
 |  |  |                 // 获取堆垛机出库站信息 | 
 |  |  |                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(outSta.getStaNo()); | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == null)) { | 
 |  |  |                     // 查询工作档 | 
 |  |  |                     WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(staProtocol.getSiteId()); | 
 |  |  |                     if (wrkMast == null) { | 
 |  |  |         for (CrnSlave crnSlave : slaveProperties.getCrn()) { | 
 |  |  |             // 遍历堆垛机出库站 | 
 |  |  |             for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) { | 
 |  |  |                 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 (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; | 
 |  |  |                     } | 
 |  |  |                     // 更新工作档状态为14失败 todo:luxiaotao | 
 |  |  |                     if (crnProtocol.mode == 3 && crnProtocol.getTaskNo() == wrkMast.getWrkNo() | 
 |  |  |                             && crnProtocol.statusType == CrnStatusType.IDLE | 
 |  |  |                             && crnProtocol.forkPos==0) { | 
 |  |  |                         wrkMast.setWrkSts(14L); | 
 |  |  |                         wrkMast.setCrnEndTime(new Date()); | 
 |  |  |                         if (wrkMastMapper.updateById(wrkMast) == 0) { | 
 |  |  |                             throw new CoolException("更新工作档的工作状态为14失败,工作号"+wrkMast.getWrkNo()); | 
 |  |  |                     if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) { | 
 |  |  |                         if (crnStn.getStaNo() >= 200) { | 
 |  |  |                             // 查询工作档 | 
 |  |  |                             TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), String.valueOf(crnStn.getStaNo() + 2)); | 
 |  |  |                             if (taskWrk == null) { | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |                             log.info("下发输送线任务:taskWrk:" + JSON.toJSONString(taskWrk)); | 
 |  |  |                             staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue()); | 
 |  |  |                             staProtocol.setStaNo(Short.valueOf(taskWrk.getTargetPoint())); | 
 |  |  |                             staProtocol.setBarcode(taskWrk.getBarcode()); | 
 |  |  |                             if (!Cools.isEmpty(taskWrk.getType())) { | 
 |  |  |                                 staProtocol.setHeight(taskWrk.getType()); | 
 |  |  |                             } | 
 |  |  |                             boolean offer = false; | 
 |  |  |                             try { | 
 |  |  |                                 offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol)); | 
 |  |  | //                                staProtocol.setMp(taskWrk.getMp()); | 
 |  |  | //                                staProtocol.setLx(taskWrk.getLx()); | 
 |  |  | //                                staProtocol.setLev(taskWrk.getLev()); | 
 |  |  | //                                MessageQueue.offer(SlaveType.Devp, 1, new Task(3, staProtocol)); | 
 |  |  |                             } catch (Exception e) { | 
 |  |  |                                 log.error("下发输送线任务失败:异常:" + e); | 
 |  |  |                                 log.error("下发输送线任务失败:异常:offer:" + offer); | 
 |  |  |                             } | 
 |  |  |                             if (offer) { | 
 |  |  |                                 log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(taskWrk)); | 
 |  |  |                                 taskWrk.setStatus(5); | 
 |  |  |                                 taskWrk.setWrkSts(14); | 
 |  |  |                                 taskWrk.setCompleteTime(new Date()); | 
 |  |  |                                 taskWrkService.updateById(taskWrk); | 
 |  |  |                                 // 侧面出库完成 上报执行状态 | 
 |  |  |                                 toWmsService.executionStatusReport(taskWrk.getTaskNo(), taskWrk.getWrkSts()); | 
 |  |  |                             } else { | 
 |  |  |                                 log.error("下发输送线任务失败:taskWrk:" + JSON.toJSONString(taskWrk)); | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             // 查询工作档 | 
 |  |  |                             TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), String.valueOf(crnStn.getStaNo() - 1)); | 
 |  |  |                             if (taskWrk == null) { | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |                             log.info("下发输送线任务:taskWrk:" + JSON.toJSONString(taskWrk)); | 
 |  |  |                             staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue()); | 
 |  |  |                             staProtocol.setStaNo(Short.valueOf(taskWrk.getTargetPoint())); | 
 |  |  |                             if (!Cools.isEmpty(taskWrk.getType())) { | 
 |  |  |                                 staProtocol.setHeight(taskWrk.getType()); | 
 |  |  |                             } | 
 |  |  |                             boolean offer = false; | 
 |  |  |                             try { | 
 |  |  |                                 offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol)); | 
 |  |  |                             } catch (Exception e) { | 
 |  |  |                                 log.error("下发输送线任务失败:异常:" + e); | 
 |  |  |                                 log.error("下发输送线任务失败:异常:offer:" + offer); | 
 |  |  |                             } | 
 |  |  |                             if (offer) { | 
 |  |  |                                 log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(taskWrk)); | 
 |  |  |                                 taskWrk.setStatus(5); | 
 |  |  |                                 taskWrk.setWrkSts(14); | 
 |  |  |                                 taskWrk.setCompleteTime(new Date()); | 
 |  |  |                                 taskWrkService.updateById(taskWrk); | 
 |  |  |  | 
 |  |  |                             } else { | 
 |  |  |                                 log.error("下发输送线任务失败:taskWrk:" + JSON.toJSONString(taskWrk)); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 更新堆垛机信息 且 下发plc命令 todo:luxiaotao | 
 |  |  |                     crnProtocol.setStatus(CrnStatusType.IDLE); | 
 |  |  |                     crnProtocol.setTaskNo((short)0); | 
 |  |  |                     boolean result = MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task<>(4, crnProtocol)); | 
 |  |  |                     if (!result) { | 
 |  |  |                         throw new CoolException("更新堆垛机信息失败"); | 
 |  |  | //                            } | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     log.error("出库到出库站异常:异常信息:" + e); | 
 |  |  |                 } | 
 |  |  | //                } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入出库  ===>>  堆垛机入出库作业下发 | 
 |  |  |      */ | 
 |  |  |     public synchronized void crnIoExecute() throws IOException { | 
 |  |  |         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 | 
 |  |  |                     && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { | 
 |  |  |                 // 如果最近一次是入库模式 | 
 |  |  |                 if (crnProtocol.getLastIo().equals("I")) { | 
 |  |  |                     if (basCrnp.getInEnable().equals("Y")) { | 
 |  |  |                         this.crnStnToLoc(crn, crnProtocol); //  入库 | 
 |  |  |                         crnProtocol.setLastIo("O"); | 
 |  |  |                     } else if (basCrnp.getOutEnable().equals("Y")) { | 
 |  |  |                         this.locToCrnStn(crn, crnProtocol); //  出库 | 
 |  |  |                         crnProtocol.setLastIo("I"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 // 如果最近一次是出库模式 | 
 |  |  |                 else if (crnProtocol.getLastIo().equals("O")) { | 
 |  |  |                     if (basCrnp.getOutEnable().equals("Y")) { | 
 |  |  |                         this.locToCrnStn(crn, crnProtocol); //  出库 | 
 |  |  |                         crnProtocol.setLastIo("I"); | 
 |  |  |                     } else if (basCrnp.getInEnable().equals("Y")) { | 
 |  |  |                         this.crnStnToLoc(crn, crnProtocol); //  入库 | 
 |  |  |                         crnProtocol.setLastIo("O"); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 // 库位移转 | 
 |  |  |                 this.locToLoc(crn, crnProtocol); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入库  ===>>  堆垛机站到库位 | 
 |  |  |      */ | 
 |  |  |     public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException { | 
 |  |  |         for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) { | 
 |  |  |             List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo())); | 
 |  |  |             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 { | 
 |  |  |                     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(设备上走)的入库工作档 | 
 |  |  |                 TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString()); | 
 |  |  |                 if (null == taskWrk) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); | 
 |  |  |                 if (!locMast.getLocSts().equals("O")) { | 
 |  |  |                     if (taskWrk.getWrkSts() == 2) { | 
 |  |  |                         log.error("入库WMS分配库位{}有误,库位状态为{}", locMast.getLocNo(), locMast.getLocSts()); | 
 |  |  |                         taskWrk.setWrkSts(5); | 
 |  |  |                         taskWrk.setMemo("WMS分配库位有误"); | 
 |  |  |                         taskWrkService.updateById(taskWrk); | 
 |  |  |                     } | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 堆垛机控制过滤 | 
 |  |  |                 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  | //                int workNo = commonService.getWorkNo(WorkNoType.PAKIN.type);//获取入库工作号 | 
 |  |  | //                taskWrk.setWrkNo(workNo);//工作号 | 
 |  |  |                 taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态 | 
 |  |  |                 taskWrk.setExecuteTime(new Date()); | 
 |  |  | //                taskWrk.setAssignTime(new Date());//派发时间 | 
 |  |  |                 taskWrk.setWrkSts(3);//工作状态 3.吊车入库 | 
 |  |  |                 taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号 | 
 |  |  | //                taskWrk.setModiTime(new Date()); | 
 |  |  | //                taskWrk.setModiUser(9988L); | 
 |  |  |  | 
 |  |  |                 // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |                 CrnCommand crnCommand = new CrnCommand(); | 
 |  |  |                 crnCommand.setCrnNo(staDesc.getCrnNo()); // 堆垛机编号 | 
 |  |  |                 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                 crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                 crnCommand.setSourcePosX(crnStn.getRow().shortValue());     // 源库位列 | 
 |  |  |                 crnCommand.setSourcePosY(crnStn.getBay().shortValue());     // 源库位层 | 
 |  |  |                 crnCommand.setSourcePosZ(crnStn.getLev().shortValue());     // 源库位排 | 
 |  |  |                 crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint()));     // 目标库位列 | 
 |  |  |                 crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位层 | 
 |  |  |                 crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位排 | 
 |  |  |                 crnCommand.setCommand((short) 1); | 
 |  |  |                 log.info("堆垛机入库任务下发={}", crnCommand); | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                     log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                     throw new CoolException("堆垛机命令生成失败"); | 
 |  |  |                 } else { | 
 |  |  |                     try { | 
 |  |  |                         // 上报执行状态 | 
 |  |  |                         toWmsService.executionStatusReport(taskWrk.getTaskNo(), taskWrk.getWrkSts()); | 
 |  |  |                         taskWrkService.updateById(taskWrk); | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                         log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                         log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,异常:" + e); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 执行对工作档的入库完成 | 
 |  |  |      * 出库  ===>>  库位到堆垛机站 | 
 |  |  |      * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库 | 
 |  |  |      */ | 
 |  |  |     public void storeFinished() { | 
 |  |  |         for (Slave crn : slaveProperties.getCrn()) { | 
 |  |  |     public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol) { | 
 |  |  |         List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(slave.getId(), null); | 
 |  |  |         if (taskWrksInitial.size() == 0) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { | 
 |  |  |             List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo())); | 
 |  |  |             for (StaDesc staDesc : staDescs) { | 
 |  |  |                 // 获取工作状态为11(生成出库ID)的出库工作档 | 
 |  |  |                 List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(), 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; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint()); | 
 |  |  |                     //判断其库位是否为深库位,如果为深库位找其浅库位是都有货 | 
 |  |  |                     int flag = 0; | 
 |  |  |                     if (locMast.getRow1() == 1 || locMast.getRow1() == 5 || locMast.getRow1() == 9) { | 
 |  |  |                         flag = 1; | 
 |  |  |                     } else if (locMast.getRow1() == 4 || locMast.getRow1() == 8 || locMast.getRow1() == 12) { | 
 |  |  |                         flag = 2; | 
 |  |  |                     } | 
 |  |  |                     if (flag == 1) { | 
 |  |  |                         LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>() | 
 |  |  |                                 .eq("row1", (locMast.getRow1() + 1)) | 
 |  |  |                                 .eq("bay1", locMast.getBay1()) | 
 |  |  |                                 .eq("lev1", locMast.getLev1()).eq("loc_sts", "F")); | 
 |  |  |                         if (!Cools.isEmpty(locMast1)) { | 
 |  |  |                             log.info(locMast.getLocNo() + "出深库位,浅库位有货"); | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                     } else if (flag == 2) { | 
 |  |  |                         LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>() | 
 |  |  |                                 .eq("row1", (locMast.getRow1() - 1)) | 
 |  |  |                                 .eq("bay1", locMast.getBay1()) | 
 |  |  |                                 .eq("lev1", locMast.getLev1()).eq("loc_sts", "F")); | 
 |  |  |                         if (!Cools.isEmpty(locMast1)) { | 
 |  |  |                             log.info(locMast.getLocNo() + "出深库位,浅库位有货"); | 
 |  |  |                             continue; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |                     // 获取堆垛机出库站信息 | 
 |  |  |                     SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); | 
 |  |  |                     StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); | 
 |  |  |                     if (staProtocol == null) { | 
 |  |  |                         break; | 
 |  |  |                     } else { | 
 |  |  |                         staProtocol = staProtocol.clone(); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 查询站点详细信息 | 
 |  |  |                     BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); | 
 |  |  |                     if (staDetl == null) { | 
 |  |  |                         log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); | 
 |  |  |                         break; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                     // 判断堆垛机出库站状态 | 
 |  |  |                     if (staProtocol.isAutoing() && (outloading || !staProtocol.isLoading()) && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") | 
 |  |  |                             && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { | 
 |  |  |                         // 命令下发区 -------------------------------------------------------------------------- | 
 |  |  |  | 
 |  |  |                         // 堆垛机控制过滤 | 
 |  |  |                         if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { | 
 |  |  |                             break; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                         if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { | 
 |  |  |                             break; | 
 |  |  |                         } | 
 |  |  |                         CrnCommand command = new CrnCommand(); | 
 |  |  |                         command.setCrnNo(taskWrk.getCrnNo()); // 堆垛机编号 | 
 |  |  |                         command.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                         command.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                         command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式 | 
 |  |  |                         command.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint()));     // 源库位排 | 
 |  |  |                         command.setSourcePosY(Utils.getBayShort(taskWrk.getStartPoint()));     // 源库位列 | 
 |  |  |                         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 (Cools.isEmpty(taskWrk.getMarkStart()) || taskWrk.getMarkStart() == 0) { | 
 |  |  |                             toWmsService.addReportLog(taskWrk); | 
 |  |  |                             taskWrk.setMarkStart(1); | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |                         if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command))) { | 
 |  |  |                             log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(command)); | 
 |  |  |                             throw new CoolException("堆垛机命令生成失败"); | 
 |  |  |                         } else { | 
 |  |  |                             try { | 
 |  |  |                                 // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                                 Date now = new Date(); | 
 |  |  |                                 taskWrk.setWrkSts(12); | 
 |  |  |                                 taskWrk.setStatus(2); | 
 |  |  |                                 taskWrk.setExecuteTime(now); | 
 |  |  |                                 if (taskWrkMapper.updateById(taskWrk) == 0) { | 
 |  |  |                                     log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                                 } | 
 |  |  |                                 // 上报执行状态 | 
 |  |  |                                 toWmsService.executionStatusReport(taskWrk.getTaskNo(), taskWrk.getWrkSts()); | 
 |  |  |                             } catch (Exception e) { | 
 |  |  |                                 log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                                 log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,异常:" + e); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 库位移转 | 
 |  |  |      */ | 
 |  |  |     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", slave.getId()) | 
 |  |  |                     .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) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 已经存在吊车执行任务时,则过滤 | 
 |  |  |                 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 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.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 | 
 |  |  |                 crnCommand.setAckFinish((short) 0);  // 任务完成确认位 | 
 |  |  |                 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转 | 
 |  |  |                 crnCommand.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint()));     // 源库位排 | 
 |  |  |                 crnCommand.setSourcePosY(Utils.getBayShort(taskWrk.getStartPoint()));     // 源库位列 | 
 |  |  |                 crnCommand.setSourcePosZ(Utils.getLevShort(taskWrk.getStartPoint()));     // 源库位层 | 
 |  |  |                 crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint()));     // 目标库位排 | 
 |  |  |                 crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位列 | 
 |  |  |                 crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位层 | 
 |  |  |                 crnCommand.setCommand((short) 1); | 
 |  |  |                 if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { | 
 |  |  |                     log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); | 
 |  |  |                 } else { | 
 |  |  |                     // 修改工作档状态 11.生成出库ID => 12.吊车出库中 | 
 |  |  |                     Date now = new Date(); | 
 |  |  |                     taskWrk.setWrkSts(12); | 
 |  |  |                     taskWrk.setStatus(2); | 
 |  |  |                     taskWrk.setExecuteTime(now); | 
 |  |  |                     taskWrk.setModiTime(now); | 
 |  |  |                     if (taskWrkMapper.updateById(taskWrk) == 0) { | 
 |  |  |                         log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); | 
 |  |  |                     } | 
 |  |  |                     toWmsService.addReportLog(taskWrk); | 
 |  |  |                 } | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 执行对工作档的完成操作 | 
 |  |  |      */ | 
 |  |  |     public void storeFinished() throws InterruptedException { | 
 |  |  |         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.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) { | 
 |  |  |                 //获取入库待确认工作档 | 
 |  |  |                 TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(), crnProtocol.getTaskNo().intValue()); | 
 |  |  |                 if (Cools.isEmpty(taskWrk) && crnProtocol.getTaskNo() != 999) { | 
 |  |  |                     log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 //确认完成信号 | 
 |  |  |                 CrnOperatorParam crnOperatorParam = new CrnOperatorParam(); | 
 |  |  |                 crnOperatorParam.setCrnNo(crn.getId()); | 
 |  |  |                 R r = crnController.crnTaskComplete(crnOperatorParam); | 
 |  |  |                 Thread.sleep(1000); | 
 |  |  |                 if (!r.get("code").equals(200)) { | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |                 if (!Cools.isEmpty(taskWrk)) { | 
 |  |  |                     if (taskWrk.getIoType() == 1 && taskWrk.getWrkSts() == 3) { | 
 |  |  |                         taskWrk.setWrkSts(4);//入库完成 | 
 |  |  |                         taskWrk.setStatus(5);//完结 | 
 |  |  |                         //更新库位状态 | 
 |  |  |                         LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); | 
 |  |  |                         locMast.setLocSts("F");//F.在库 | 
 |  |  |                         locMast.setBarcode(taskWrk.getBarcode());//托盘码 | 
 |  |  |                         locMast.setModiTime(new Date()); | 
 |  |  |                         locMast.setModiUser(9999L); | 
 |  |  |                         locMastService.updateById(locMast); | 
 |  |  |                     } else if (taskWrk.getIoType() == 2 && taskWrk.getWrkSts() == 12) { | 
 |  |  |                         taskWrk.setWrkSts(13);//出库完成 | 
 |  |  |                         taskWrk.setStatus(5);//完结 | 
 |  |  |                         //更新库位状态 | 
 |  |  |                         LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint()); | 
 |  |  |                         locMast.setLocSts("O");//O.空库位 | 
 |  |  |                         locMast.setBarcode("");//托盘码 | 
 |  |  |                         locMast.setModiTime(new Date()); | 
 |  |  |                         locMast.setModiUser(9999L); | 
 |  |  |                         locMastService.updateById(locMast); | 
 |  |  |                     } else if (taskWrk.getIoType() == 3 && taskWrk.getWrkSts() == 12) { | 
 |  |  |                         taskWrk.setWrkSts(4);//入库完成 | 
 |  |  |                         taskWrk.setStatus(5);//完结 | 
 |  |  |                         //更新库位状态 | 
 |  |  |                         LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); | 
 |  |  |                         locMast.setLocSts("F");//F.在库 | 
 |  |  |                         locMast.setBarcode(taskWrk.getBarcode());//托盘码 | 
 |  |  |                         locMast.setModiTime(new Date()); | 
 |  |  |                         locMast.setModiUser(9999L); | 
 |  |  |                         locMastService.updateById(locMast); | 
 |  |  |  | 
 |  |  |                         LocMast locMast1 = locMastService.selectByLocNo(taskWrk.getStartPoint()); | 
 |  |  |                         locMast1.setLocSts("O");//O.空库位 | 
 |  |  |                         locMast1.setBarcode("");//托盘码 | 
 |  |  |                         locMast1.setModiTime(new Date()); | 
 |  |  |                         locMast1.setModiUser(9999L); | 
 |  |  |                         locMastService.updateById(locMast1); | 
 |  |  |                     } | 
 |  |  |                     taskWrk.setCompleteTime(new Date()); | 
 |  |  |                     taskWrkService.updateById(taskWrk); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 堆垛机异常信息记录 | 
 |  |  |      */ | 
 |  |  |     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 (false) { | 
 |  |  | //            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) { | 
 |  |  |                             WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo()); | 
 |  |  |                             if (wrkMast == null) { | 
 |  |  |                                 continue; | 
 |  |  |                             } | 
 |  |  |                             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.getAlarm1(),    // 异常码 | 
 |  |  |                                     errName,    // 异常 | 
 |  |  |                                     1,    // 异常情况 | 
 |  |  |                                     now,    // 添加时间 | 
 |  |  |                                     null,    // 添加人员 | 
 |  |  |                                     now,    // 修改时间 | 
 |  |  |                                     null,    // 修改人员 | 
 |  |  |                                     "任务中异常"    // 备注 | 
 |  |  |                             ); | 
 |  |  |                             if (!basErrLogService.insert(basErrLog)) { | 
 |  |  |                                 log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         // 异常修复 | 
 |  |  |                         if (crnProtocol.getAlarm1() == null || crnProtocol.getAlarm1() == 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.getAlarm1() != 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.getAlarm1(),    // 异常码 | 
 |  |  |                                     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()); | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     //agv取放货任务完成 | 
 |  |  |     public synchronized void autoCompleteAGV() { | 
 |  |  |         List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<>()); | 
 |  |  |         try { | 
 |  |  |             Thread.sleep(500); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         for (BasDevp basDevp : basDevps) { | 
 |  |  |             DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1); | 
 |  |  |             StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo()); | 
 |  |  |             if (staProtocol == null) { | 
 |  |  |                 continue; | 
 |  |  |             } else { | 
 |  |  |                 staProtocol = staProtocol.clone(); | 
 |  |  |             } | 
 |  |  |             if (basDevp.getWrkNo() != 0) { | 
 |  |  |                 if (basDevp.getAgvTargetPick() != 0) {//取货 | 
 |  |  |                     staProtocol.setAgvTypeSign((short) 0); | 
 |  |  |                     staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
 |  |  |                     MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
 |  |  |                 } | 
 |  |  |                 boolean sign = true; | 
 |  |  |                 if (basDevp.getAgvTargetPlace() != 0) { | 
 |  |  |                     sign = false; | 
 |  |  |                     basDevp.setAgvTargetPlace(0); | 
 |  |  |                     basDevpService.updateById(basDevp); | 
 |  |  |                     staProtocol.setAgvTypeSign((short) 3);//1 | 
 |  |  |                     staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
 |  |  |                     MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
 |  |  |                 } | 
 |  |  |             } else { | 
 |  |  |                 if (basDevp.getAgvTargetPlace() != 0) { | 
 |  |  |                     if (basDevp.getLoading().equals("Y")) { | 
 |  |  |                         staProtocol.setAgvTypeSign((short) 1); | 
 |  |  |                         staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
 |  |  |                         MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
 |  |  |                     } else { | 
 |  |  |                         log.error("AGV放货完成但输送线无物,复位信号 ===>> [staNo:{}] [basDevp:{}]", basDevp.getDevNo(), basDevp); | 
 |  |  |                         basDevp.setAgvTargetPlace(0); | 
 |  |  |                         basDevpService.updateById(basDevp); | 
 |  |  |                         staProtocol.setAgvTypeSign((short) 3);//1 | 
 |  |  |                         staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
 |  |  |                         MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |                 if (basDevp.getAgvTargetPick() != 0) { | 
 |  |  |                     basDevp.setAgvTargetPick(0); | 
 |  |  |                     basDevpService.updateById(basDevp); | 
 |  |  |                     staProtocol.setAgvTypeSign((short) 2);//0 | 
 |  |  |                     staProtocol.setStaNo(basDevp.getDevNo().shortValue()); | 
 |  |  |                     MessageQueue.offer(SlaveType.Devp, 1, new Task(4, staProtocol)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 入出库模式切换函数 | 
 |  |  |      */ | 
 |  |  |     public synchronized void ioConvert() { | 
 |  |  |         try { | 
 |  |  |             // 根据输送线plc遍历 | 
 |  |  |             for (DevpSlave devp : slaveProperties.getDevp()) { | 
 |  |  |                 if (devp.getId() == 2) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); | 
 |  |  |                 for (DevpSlave.Sta inSta : devp.getInSta()) { | 
 |  |  |                     TaskWrk taskWrk = taskWrkService.selectByTargetPoint(inSta.getBackSta() + ""); | 
 |  |  |                     switch (inSta.getBackSta()) { | 
 |  |  |                         case 101: | 
 |  |  |                             if (taskWrk != null) { | 
 |  |  |                                 if (devpThread.ioModeOf1F1 != IoModeType.PAKOUT_MODE) { | 
 |  |  |                                     // 出库切换中 | 
 |  |  |                                     devpThread.ioModeOf1F1 = IoModeType.PAKOUT_BOOTING; | 
 |  |  |                                     TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); | 
 |  |  |                                     if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() | 
 |  |  |                                             && !devpThread.getStation().get(inSta.getBackSta()).isLoading() | 
 |  |  |                                             && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { | 
 |  |  |                                         // 出库模式 | 
 |  |  |                                         devpThread.ioModeOf1F1 = IoModeType.PAKOUT_MODE; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 // 入库模式 | 
 |  |  |                                 devpThread.ioModeOf1F1 = IoModeType.PAKIN_MODE; | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |                         case 104: | 
 |  |  |                             if (taskWrk != null) { | 
 |  |  |                                 if (devpThread.ioModeOf1F2 != IoModeType.PAKOUT_MODE) { | 
 |  |  |                                     // 出库切换中 | 
 |  |  |                                     devpThread.ioModeOf1F2 = IoModeType.PAKOUT_BOOTING; | 
 |  |  |                                     TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); | 
 |  |  |                                     if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() | 
 |  |  |                                             && !devpThread.getStation().get(inSta.getBackSta()).isLoading() | 
 |  |  |                                             && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { | 
 |  |  |                                         // 出库模式 | 
 |  |  |                                         devpThread.ioModeOf1F2 = IoModeType.PAKOUT_MODE; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 // 入库模式 | 
 |  |  |                                 devpThread.ioModeOf1F2 = IoModeType.PAKIN_MODE; | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |                         case 107: | 
 |  |  |                             if (taskWrk != null) { | 
 |  |  |                                 if (devpThread.ioModeOf1F3 != IoModeType.PAKOUT_MODE) { | 
 |  |  |                                     // 出库切换中 | 
 |  |  |                                     devpThread.ioModeOf1F3 = IoModeType.PAKOUT_BOOTING; | 
 |  |  |                                     TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); | 
 |  |  |                                     if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() | 
 |  |  |                                             && !devpThread.getStation().get(inSta.getBackSta()).isLoading() | 
 |  |  |                                             && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { | 
 |  |  |                                         // 出库模式 | 
 |  |  |                                         devpThread.ioModeOf1F3 = IoModeType.PAKOUT_MODE; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 // 入库模式 | 
 |  |  |                                 devpThread.ioModeOf1F3 = IoModeType.PAKIN_MODE; | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |                         case 110: | 
 |  |  |                             if (taskWrk != null) { | 
 |  |  |                                 if (devpThread.ioModeOf1F4 != IoModeType.PAKOUT_MODE) { | 
 |  |  |                                     // 出库切换中 | 
 |  |  |                                     devpThread.ioModeOf1F4 = IoModeType.PAKOUT_BOOTING; | 
 |  |  |                                     TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); | 
 |  |  |                                     if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() | 
 |  |  |                                             && !devpThread.getStation().get(inSta.getBackSta()).isLoading() | 
 |  |  |                                             && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { | 
 |  |  |                                         // 出库模式 | 
 |  |  |                                         devpThread.ioModeOf1F4 = IoModeType.PAKOUT_MODE; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 // 入库模式 | 
 |  |  |                                 devpThread.ioModeOf1F4 = IoModeType.PAKIN_MODE; | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |                         case 113: | 
 |  |  |                             if (taskWrk != null) { | 
 |  |  |                                 if (devpThread.ioModeOf1F5 != IoModeType.PAKOUT_MODE) { | 
 |  |  |                                     // 出库切换中 | 
 |  |  |                                     devpThread.ioModeOf1F5 = IoModeType.PAKOUT_BOOTING; | 
 |  |  |                                     TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); | 
 |  |  |                                     if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() | 
 |  |  |                                             && !devpThread.getStation().get(inSta.getBackSta()).isLoading() | 
 |  |  |                                             && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { | 
 |  |  |                                         // 出库模式 | 
 |  |  |                                         devpThread.ioModeOf1F5 = IoModeType.PAKOUT_MODE; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 // 入库模式 | 
 |  |  |                                 devpThread.ioModeOf1F5 = IoModeType.PAKIN_MODE; | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |                         case 203: | 
 |  |  |                             if (taskWrk != null) { | 
 |  |  |                                 if (devpThread.ioModeOf2F1 != IoModeType.PAKOUT_MODE) { | 
 |  |  |                                     // 出库切换中 | 
 |  |  |                                     devpThread.ioModeOf2F1 = IoModeType.PAKOUT_BOOTING; | 
 |  |  |                                     TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); | 
 |  |  |                                     if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() | 
 |  |  |                                             && !devpThread.getStation().get(inSta.getBackSta()).isLoading() | 
 |  |  |                                             && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { | 
 |  |  |                                         // 出库模式 | 
 |  |  |                                         devpThread.ioModeOf2F1 = IoModeType.PAKOUT_MODE; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 // 入库模式 | 
 |  |  |                                 devpThread.ioModeOf2F1 = IoModeType.PAKIN_MODE; | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |  | 
 |  |  |                         case 207: | 
 |  |  |                             if (taskWrk != null) { | 
 |  |  |                                 if (devpThread.ioModeOf2F2 != IoModeType.PAKOUT_MODE) { | 
 |  |  |                                     // 出库切换中 | 
 |  |  |                                     devpThread.ioModeOf2F2 = IoModeType.PAKOUT_BOOTING; | 
 |  |  |                                     TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); | 
 |  |  |                                     if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() | 
 |  |  |                                             && !devpThread.getStation().get(inSta.getBackSta()).isLoading() | 
 |  |  |                                             && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { | 
 |  |  |                                         // 出库模式 | 
 |  |  |                                         devpThread.ioModeOf2F2 = IoModeType.PAKOUT_MODE; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 // 入库模式 | 
 |  |  |                                 devpThread.ioModeOf2F2 = IoModeType.PAKIN_MODE; | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |  | 
 |  |  |                         case 212: | 
 |  |  |                             if (taskWrk != null) { | 
 |  |  |                                 if (devpThread.ioModeOf2F3 != IoModeType.PAKOUT_MODE) { | 
 |  |  |                                     // 出库切换中 | 
 |  |  |                                     devpThread.ioModeOf2F3 = IoModeType.PAKOUT_BOOTING; | 
 |  |  |                                     TaskWrk pakin = taskWrkService.selectByStartPoint(inSta.getStaNo() + ""); | 
 |  |  |                                     if (pakin == null && !devpThread.getStation().get(inSta.getStaNo()).isLoading() | 
 |  |  |                                             && !devpThread.getStation().get(inSta.getBackSta()).isLoading() | 
 |  |  |                                             && devpThread.getStation().get(inSta.getBackSta()).getWorkNo() == 0) { | 
 |  |  |                                         // 出库模式 | 
 |  |  |                                         devpThread.ioModeOf2F3 = IoModeType.PAKOUT_MODE; | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } else { | 
 |  |  |                                 // 入库模式 | 
 |  |  |                                 devpThread.ioModeOf2F3 = IoModeType.PAKIN_MODE; | 
 |  |  |                             } | 
 |  |  |                             break; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 跑库程序 | 
 |  |  |      */ | 
 |  |  |     public void debug(String sts, Long modiUser, Integer loc_type1) { | 
 |  |  |         if (!enable) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>()); | 
 |  |  |         if (basCrnps.isEmpty()) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         for (BasCrnp basCrnp : basCrnps) { | 
 |  |  |             if (!basCrnp.getInEnable().equals("N") || !basCrnp.getOutEnable().equals("Y")) { | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", basCrnp.getCrnNo()).eq("io_type", 11)); | 
 |  |  |             if (Cools.isEmpty(wrkMasts) || wrkMasts.isEmpty()) { | 
 |  |  |                 int i = locMastService.selectCount(new EntityWrapper<LocMast>().eq("loc_sts", sts).eq("loc_type1", loc_type1).ne("modi_user", modiUser)); | 
 |  |  |                 LocMast locMastStart = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", sts).eq("loc_type1", loc_type1).ne("modi_user", modiUser)); | 
 |  |  |                 if (locMastStart == null || i > 1) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() | 
 |  |  |                         .eq("loc_sts", "O") | 
 |  |  |                         .eq("crn_no", basCrnp.getCrnNo()) | 
 |  |  |                         .eq("loc_type1", locMastStart.getLocType1()) | 
 |  |  |                         .ne("modi_user", 77)); | 
 |  |  |                 if (Cools.isEmpty(locMasts)) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  |                 Random random = new Random(); | 
 |  |  |                 LocMast locMastEnd = locMasts.get(random.nextInt(locMasts.size())); | 
 |  |  |                 locMove(locMastStart, locMastEnd, Long.parseLong(basCrnp.getCrnNo().toString())); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public void locMove(LocMast sourceLoc, LocMast locNo, Long userId) { | 
 |  |  |         List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", sourceLoc.getLocNo())); | 
 |  |  |         LocMast loc = locMastService.selectById(locNo); | 
 |  |  |         if (!sourceLoc.getCrnNo().equals(loc.getCrnNo())) { | 
 |  |  |             throw new CoolException("移转库位属于不同堆垛机"); | 
 |  |  |         } | 
 |  |  |         Date now = new Date(); | 
 |  |  |         // 获取工作号 | 
 |  |  |         int workNo = commonService.getWorkNo(WorkNoType.PICK.type); | 
 |  |  |         // 保存工作档 | 
 |  |  |         WrkMast wrkMast = new WrkMast(); | 
 |  |  |         wrkMast.setWrkNo(workNo); | 
 |  |  |         wrkMast.setIoTime(now); | 
 |  |  |         wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID | 
 |  |  |         wrkMast.setIoType(11); // 入出库状态: 11.库格移载 | 
 |  |  |         wrkMast.setIoPri(10D); | 
 |  |  |         wrkMast.setCrnNo(sourceLoc.getCrnNo()); | 
 |  |  |         wrkMast.setSourceLocNo(sourceLoc.getLocNo()); // 源库位 | 
 |  |  |         wrkMast.setLocNo(locNo.getLocNo()); // 目标库位 | 
 |  |  |         wrkMast.setFullPlt(Cools.isEmpty(locDetls) ? "N" : "Y"); // 满板:Y | 
 |  |  |         wrkMast.setPicking("N"); // 拣料 | 
 |  |  |         wrkMast.setExitMk("N"); // 退出 | 
 |  |  |         wrkMast.setEmptyMk(sourceLoc.getLocSts().equals("D") ? "Y" : "N"); // 空板 | 
 |  |  |         wrkMast.setBarcode(sourceLoc.getBarcode()); // 托盘码 | 
 |  |  |         wrkMast.setLinkMis("N"); | 
 |  |  |         wrkMast.setAppeUser(userId); | 
 |  |  |         wrkMast.setAppeTime(now); | 
 |  |  |         wrkMast.setModiUser(userId); | 
 |  |  |         wrkMast.setModiTime(now); | 
 |  |  |         boolean res = wrkMastService.insert(wrkMast); | 
 |  |  |         if (!res) { | 
 |  |  |             throw new CoolException("保存工作档失败"); | 
 |  |  |         } | 
 |  |  |         // 工作档明细保存 | 
 |  |  |         for (LocDetl locDetl : locDetls) { | 
 |  |  |             WrkDetl wrkDetl = new WrkDetl(); | 
 |  |  |             wrkDetl.sync(locDetl); | 
 |  |  |             wrkDetl.setWrkNo(workNo); | 
 |  |  |             wrkDetl.setIoTime(now); | 
 |  |  |             wrkDetl.setAnfme(locDetl.getAnfme()); | 
 |  |  |             wrkDetl.setAppeTime(now); | 
 |  |  |             wrkDetl.setAppeUser(userId); | 
 |  |  |             wrkDetl.setModiTime(now); | 
 |  |  |             wrkDetl.setModiUser(userId); | 
 |  |  |             if (!wrkDetlService.insert(wrkDetl)) { | 
 |  |  |                 throw new CoolException("保存工作档明细失败"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         // 修改源库位状态 | 
 |  |  |         if (sourceLoc.getLocSts().equals("D") || sourceLoc.getLocSts().equals("F")) { | 
 |  |  |             sourceLoc.setLocSts("R"); // R.出库预约 | 
 |  |  |             sourceLoc.setModiUser(userId); | 
 |  |  |             sourceLoc.setModiTime(now); | 
 |  |  |             if (!locMastService.updateById(sourceLoc)) { | 
 |  |  |                 throw new CoolException("更新源库位状态失败"); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException("源库位出库失败,状态:" + sourceLoc.getLocSts$()); | 
 |  |  |         } | 
 |  |  |         // 修改目标库位状态 | 
 |  |  |         if (loc.getLocSts().equals("O")) { | 
 |  |  |             loc.setLocSts("S"); // S.入库预约 | 
 |  |  |             loc.setModiTime(now); | 
 |  |  |             loc.setModiUser(userId); | 
 |  |  |             if (!locMastService.updateById(loc)) { | 
 |  |  |                 throw new CoolException("更新目标库位状态失败"); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             throw new CoolException("移转失败,目标库位状态:" + loc.getLocSts$()); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 转移任务下发 | 
 |  |  |      */ | 
 |  |  |     public void transferTaskStart() { | 
 |  |  |         for (DevpSlave.Sta sta : slaveProperties.getDevp().get(1).getInSta()) { | 
 |  |  |             try { | 
 |  |  |                 // 获取入库站信息 | 
 |  |  |                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 2); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(sta.getStaNo()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) { | 
 |  |  |                     // 查询工作档 | 
 |  |  |                     TransferTask transferTask = transferTaskService.selectByStartPoint(sta.getStaNo()); | 
 |  |  |                     if (transferTask == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     log.info("下发输送线转移任务:taskWrk:" + JSON.toJSONString(transferTask)); | 
 |  |  |                     staProtocol.setWorkNo(transferTask.getWrkNo().shortValue()); | 
 |  |  |                     staProtocol.setStaNo(transferTask.getTargetPoint().shortValue()); | 
 |  |  |                     boolean offer = false; | 
 |  |  |                     try { | 
 |  |  |                         offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol)); | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                         log.error("下发输送线转移任务:异常:" + e); | 
 |  |  |                         log.error("下发输送线转移任务:异常:offer:" + offer); | 
 |  |  |                     } | 
 |  |  |                     if (offer) { | 
 |  |  |                         log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(transferTask)); | 
 |  |  |                         transferTask.setStatus(2); | 
 |  |  |                         transferTaskService.updateById(transferTask); | 
 |  |  |                     } else { | 
 |  |  |                         log.error("下发输送线任务失败:taskWrk:" + JSON.toJSONString(transferTask)); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("转移任务异常:异常信息:" + e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 转移任务完成 | 
 |  |  |      */ | 
 |  |  |     public void transferTaskEnd() { | 
 |  |  |         for (DevpSlave.Sta sta : slaveProperties.getDevp().get(1).getInSta()) { | 
 |  |  |             try { | 
 |  |  |                 // 获取终点站 | 
 |  |  |                 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 2); | 
 |  |  |                 StaProtocol staProtocol = devpThread.getStation().get(sta.getOverSta()); | 
 |  |  |                 if (staProtocol == null) { | 
 |  |  |                     continue; | 
 |  |  |                 } else { | 
 |  |  |                     staProtocol = staProtocol.clone(); | 
 |  |  |                 } | 
 |  |  |                 if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) { | 
 |  |  |                     // 查询工作档 | 
 |  |  |                     TransferTask transferTask = transferTaskService.selectByEndPoint(sta.getStaNo()); | 
 |  |  |                     if (transferTask == null) { | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                     log.info("转移任务完成:transferTask:" + JSON.toJSONString(transferTask)); | 
 |  |  |                     transferTask.setStatus(3); | 
 |  |  |                     transferTaskService.updateById(transferTask); | 
 |  |  |                 } | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 log.error("转移任务异常:异常信息:" + e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } |