| | |
| | | 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.R; |
| | | import com.core.common.*; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.param.AgvTaskAssignmentParam; |
| | |
| | | basRgvService.updateById(basRgv); |
| | | rgvThread.setPakMk(true); |
| | | } |
| | | List<WrkMastSta> wrkMastStaPakingNum = wrkMastStaService.selectPakingWrkNum(basRgv.getRgvNo()); |
| | | if(wrkMastStaPakingNum.size() <1){ |
| | | basRgv.setPakAll("1"); //防止无其他任务时,连续取货无法恢复 |
| | | basRgvService.updateById(basRgv); |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | basRgv.setPakAll("1"); |
| | | basRgvService.updateById(basRgv); |
| | | } |
| | | |
| | | // 只有当RGV空闲 并且 无任务时才继续执行 |
| | | if (rgvProtocol.getStatusType1() == RgvStatusType.IDLE && |
| | | rgvProtocol.getModeType() == RgvModeType.AUTO && rgvThread.isPakMk() |
| | |
| | | WrkMastSta wrkMastSta1 = wrkMastStaMapper.selectByWorkSta(1, (int) rgvProtocol.getRgvNo()); |
| | | if(wrkMastSta1 != null && wrkMastSta2 != null){ |
| | | rgvThread.setPakMk(false); //小车双工位锁定 |
| | | |
| | | } |
| | | // if(basRgv.getPakToCrn().equals("0")){ |
| | | // rgvRunWrkToCrn(rgv, rgvProtocol,mark); //若小车取到一个接驳任务,第二个工位只能取接驳任务 |
| | | // } |
| | | |
| | | // if(rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getTaskNo1() == 0 && rgvThread.isPakIn() && rgvThread.isPakRgv()){ |
| | | // rgvPreScheduling();//若暂无下发任务预调度提前到取货点 |
| | | // } |
| | | |
| | | |
| | | // if (rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO) { |
| | | // //小车执行放货任务 |
| | | // rgvOutExecute(); |
| | | // |
| | | // } |
| | | } |
| | | } |
| | | public synchronized void rgvRunWrkMastInTest(){ |
| | | BasRgvMap basRgvMap = basRgvMapMapper.selectById(1); |
| | | List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute()); |
| | | basRgvMap.setNowRoute(1021); //更新小车当前位置站点号 |
| | | WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(342);//根据站点工作号和小车工作范围检索任务档 |
| | | |
| | | // WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWorkSta(2, 1); |
| | | boolean result = false; |
| | | // if(wrkMastSta2 != null && rgvProtocol.getRgvNo() == 1){ //距离计算 2楼单入库口不需要计算 |
| | | // result = rgvCalcDistance((int) rgvProtocol.getRgvNo(),wrkMastSta2.getStaEnd(),wrkMastSta.getStaStart());//工位2放货站点,工位1取货站点 |
| | | // } |
| | | // if(result){//若小车距离放货点距离近于取货点则跳过取货 true跳过取货/false优先取货 |
| | | // rgvThread.setPakRgv(false); |
| | | // continue; |
| | | // } |
| | | wrkMastSta.setWorkSta(1); |
| | | wrkMastSta.setRgvNo(1); |
| | | wrkMastSta.setStaStart(1035); |
| | | Short direction = 2;//双工位最终抵达位置 |
| | | boolean sign = false; |
| | | // sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta,direction,); //命令下发 |
| | | if (sign){ |
| | | wrkMastSta.setWrkSts(1); |
| | | try{ |
| | | wrkMastStaMapper.updateById(wrkMastSta); |
| | | log.error("更新小车任务成功"); |
| | | }catch (Exception e){ |
| | | log.error("更新小车任务失败"); |
| | | } |
| | | // rgvThread.setPakOut(false);//出库不允许 |
| | | boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526"); |
| | | if (!signMap){ |
| | | log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo()); |
| | | } |
| | | } else { |
| | | log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo()); |
| | | } |
| | | } |
| | | /** |
| | |
| | | |
| | | if(wrkMastSta3 != null ){ |
| | | List<WrkMastSta> wrkMastStaPaking = wrkMastStaService.selectPakingWrk(wrkMastSta3.getStaStart()); |
| | | if(wrkMastStaPaking.size() < 1){//已有标记不再标记 |
| | | if(wrkMastStaPaking.size() < 1 ){//已有标记不再标记 |
| | | wrkMastSta3.setMk(1); |
| | | basRgv.setPakAll("0"); |
| | | basRgvService.updateById(basRgv); |
| | |
| | | } |
| | | WrkMastSta wrkMastSta1 = wrkMastStaMapper.selectByWrkNo( rgvProtocol.getTaskNo1()); |
| | | if(basRgv.getPakToCrn().equals("0")){ |
| | | wrkMastSta = wrkMastStaMapper.selectNoInterfereCrn(route, route, Long.valueOf(staProtocol.getWorkNo())); |
| | | wrkMastSta = wrkMastStaMapper.selectNoInterfereCrn(route, route, Long.valueOf(staProtocol.getWorkNo()));//处理接驳任务时,连续只取接驳任务 |
| | | } |
| | | boolean result = false; |
| | | if(wrkMastSta1!= null && rgvProtocol.getRgvNo() == 1){ //距离计算 2楼单入库口不需要计算 |
| | |
| | | .eq("status", 2) |
| | | .eq("binding_tags", basArmMast.getBindingTags()) |
| | | ); |
| | | |
| | | if (binding_tags<2){ |
| | | armTaskAssignmentCallApiLogSave(staProtocol, "条码数据已存在!!!", staProtocol.getSiteId()+"码垛位置,条码数据正在自动组托===>>" + barcode, false); |
| | | continue; |
| | | BasArmMast basArmMastOne = basArmMastService.selectOne( |
| | | new EntityWrapper<BasArmMast>() |
| | | .eq("status", 2) |
| | | .eq("binding_tags", basArmMast.getBindingTags()) |
| | | ); |
| | | Double anfmeSignOne = basArmMastService.selectBasArmMastSignValue(basArmMastOne.getOrderNo(), basArmMastOne.getSku(),basArmMastOne.getBindingTags()); |
| | | |
| | | if (anfmeSignOne>1D){ |
| | | armTaskAssignmentCallApiLogSave(staProtocol, "条码数据已存在!!!", staProtocol.getSiteId()+"码垛位置,条码数据正在自动组托===>>" + barcode, false); |
| | | continue; |
| | | } |
| | | |
| | | } |
| | | } |
| | | OrderDetlValueResultUtil orderDetlValueResultUtil = basArmMastService.selectOrderDetlValue(basArmMast.getOrderNo(), basArmMast.getSku()); |
| | |
| | | } |
| | | } |
| | | |
| | | public void armTaskAssignmentCallApiLogSave(StaProtocol staProtocol ,String tableName, String response, Boolean bool) { |
| | | ApiLog apiLog = apiLogService.selectOne(new EntityWrapper<ApiLog>() |
| | | public void armTaskAssignmentCallApiLogSave(StaProtocol staProtocol, String tableName, String response, Boolean bool) { |
| | | // 查询符合条件的所有 ApiLog |
| | | List<ApiLog> apiLogs = apiLogService.selectList(new EntityWrapper<ApiLog>() |
| | | .eq("namespace", "机械臂任务相关") |
| | | .eq("request", "站点号:" + staProtocol.getSiteId()) |
| | | .eq("response", response) |
| | |
| | | .orderBy("create_time", false) |
| | | ); |
| | | |
| | | if (!Cools.isEmpty(apiLog)){ |
| | | // 遍历结果集,检查时间戳差值是否小于 5 分钟 |
| | | for (ApiLog apiLog : apiLogs) { |
| | | long parseLong = Long.parseLong(apiLog.getTimestamp()); |
| | | if (new Date().getTime()-parseLong<5*1000*60){ |
| | | if (new Date().getTime() - parseLong < 5 * 1000 * 60) { |
| | | // 如果找到符合条件的记录且时间差小于 5 分钟,则不保存新记录,直接返回 |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // 如果没有符合条件的记录,或者所有记录时间差大于 5 分钟,保存新的日志 |
| | | apiLogService.save("机械臂任务相关", tableName, "null", staProtocol.getBarcode(), |
| | | "站点号:" + staProtocol.getSiteId() , |
| | | "站点号:" + staProtocol.getSiteId(), |
| | | response, bool); |
| | | } |
| | | |
| | | /* |
| | | * agv任务生成 Full |
| | | * */ |
| | | public synchronized void agvTaskCreateFull() { |
| | | // 根据输送线plc遍历 |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | // 遍历出库口 |
| | | for (DevpSlave.Sta outStaAgv : devp.getOutStaAgvFull()) { |
| | | // 获取入库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(outStaAgv.getStaNo()); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // 判断是否满足入库条件 |
| | | if (!staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | if (staProtocol.isAutoing() ) { |
| | | WrkMast wrkMast = wrkMastService.selectByWrkNo(staProtocol.getWorkNo()); |
| | | if (Cools.isEmpty(wrkMast) || Cools.isEmpty(wrkMast.getTakeNone()) || !wrkMast.getTakeNone().equals("1")){ |
| | | continue; |
| | | } |
| | | |
| | | // 判断重复工作档 |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("task_no", staProtocol.getWorkNo())); |
| | | if (!basAgvMastList.isEmpty()) { |
| | | wrkMast.setTakeNone("2"); |
| | | wrkMastMapper.updateById(wrkMast); |
| | | continue; |
| | | } |
| | | |
| | | // 任务生成区 -------------------------------------------------------------------------- |
| | | |
| | | BasAgvMast basAgvMast = new BasAgvMast(); |
| | | |
| | | |
| | | try { |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | |
| | | SearchLocParam param = new SearchLocParam(); |
| | | param.setBarcode(wrkMast.getBarcode()); |
| | | param.setIoType(1); |
| | | param.setSourceStaNo(outStaAgv.getStaNo()); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/agv/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); |
| | | |
| | | basAgvMast.setTaskNo(wrkMast.getWrkNo()); |
| | | basAgvMast.setSourceStaNo(outStaAgv.getStaNo()); |
| | | basAgvMast.setLocNo(dto.getLocNo()); |
| | | basAgvMast.setSourceLocNo(wrkMast.getSourceLocNo()); |
| | | basAgvMast.setDevpId(devp.getId()); |
| | | basAgvMast.setIoType(2); |
| | | |
| | | basAgvMastService.insert(basAgvMast); |
| | | |
| | | |
| | | wrkMast.setTakeNone("2"); |
| | | wrkMastMapper.updateById(wrkMast); |
| | | } else { |
| | | News.error(JSON.toJSONString(staProtocol)); |
| | | } |
| | | } catch (Exception e) { |
| | | News.error(JSON.toJSONString(e.getMessage())); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * agv任务生成 Empty |
| | | * */ |
| | | public synchronized void agvTaskCreateEmpty() { |
| | | // 根据输送线plc遍历 |
| | | for (DevpSlave devp : slaveProperties.getDevp()) { |
| | | // 遍历出库口 |
| | | for (DevpSlave.Sta outStaAgv : devp.getOutStaAgvEmpty()) { |
| | | // 获取入库站信息 |
| | | SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(outStaAgv.getStaNo()); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | // 判断是否满足入库条件 |
| | | if (!staProtocol.isLoading()){ |
| | | continue; |
| | | } |
| | | |
| | | String barcode = staProtocol.getBarcode(); |
| | | if(!Cools.isEmpty(barcode)) { |
| | | if("NG".endsWith(barcode) || "NoRead".equals(barcode)) { |
| | | News.info("{}号站点扫描器检测条码信息:{}", outStaAgv.getStaNo(), barcode); |
| | | continue; |
| | | } |
| | | } else { |
| | | News.info("{}号站点扫描器检测条码信息:{}", outStaAgv.getStaNo(), barcode); |
| | | continue; |
| | | } |
| | | if (staProtocol.isAutoing()) { |
| | | |
| | | // 判断重复工作档 |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("source_sta_no", outStaAgv.getStaNo())); |
| | | if (!basAgvMastList.isEmpty()) { |
| | | News.info("{}号站点存在任务执行中,请等待任务执行完毕:{}", outStaAgv.getStaNo(), barcode); |
| | | continue; |
| | | } |
| | | |
| | | List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<LocMast>().eq("barcode", barcode)); |
| | | if (!locMastList.isEmpty()) { |
| | | News.info("{}号站点条码信息重复:{}", outStaAgv.getStaNo(), barcode); |
| | | continue; |
| | | } |
| | | // 任务生成区 -------------------------------------------------------------------------- |
| | | |
| | | BasAgvMast basAgvMast = new BasAgvMast(); |
| | | |
| | | |
| | | try { |
| | | LocTypeDto locTypeDto = new LocTypeDto(staProtocol); |
| | | |
| | | SearchLocParam param = new SearchLocParam(); |
| | | param.setBarcode(barcode); |
| | | param.setIoType(1); |
| | | param.setSourceStaNo(outStaAgv.getStaNo()); |
| | | param.setLocType1(locTypeDto.getLocType1()); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/agv/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); |
| | | |
| | | basAgvMast.setTaskNo(outStaAgv.getStaNo()); |
| | | basAgvMast.setSourceStaNo(outStaAgv.getStaNo()); |
| | | basAgvMast.setLocNo(dto.getLocNo()); |
| | | basAgvMast.setDevpId(devp.getId()); |
| | | basAgvMast.setIoType(2); |
| | | |
| | | basAgvMastService.insert(basAgvMast); |
| | | } else { |
| | | News.error(JSON.toJSONString(staProtocol)); |
| | | } |
| | | } catch (Exception e) { |
| | | News.error(JSON.toJSONString(e.getMessage())); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /* |
| | | * agv任务下发:AGV库位==》输送线站点 |
| | |
| | | try{ |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("status", 0)); |
| | | for (BasAgvMast basAgvMast : basAgvMastList) { |
| | | if (basAgvMast.getStatus()!=0 && basAgvMast.getIoType()!=0){//0==》AGV库位==》输送线站点 |
| | | if (basAgvMast.getStatus()!=0 || basAgvMast.getIoType()!=0){//0==》AGV库位==》输送线站点 |
| | | continue; |
| | | } |
| | | try{ |
| | |
| | | AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(basAgvMast); |
| | | |
| | | //任务下发 |
| | | ReturnT<String> result = new PostMesDataUtils().postMesData("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam); |
| | | ReturnT<String> result = new PostMesDataUtils().postMesDataAgv("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam); |
| | | if (result.getCode()==200){ |
| | | basAgvMast.setStatus(1); |
| | | basAgvMastService.updateById(basAgvMast); |
| | |
| | | try{ |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("status", 0)); |
| | | for (BasAgvMast basAgvMast : basAgvMastList) { |
| | | if (basAgvMast.getStatus()!=0 && basAgvMast.getIoType()!=1){//1==》AGV库位==》AGV库位 |
| | | if (basAgvMast.getStatus()!=0 || basAgvMast.getIoType()!=1){//1==》AGV库位==》AGV库位 |
| | | continue; |
| | | } |
| | | try{ |
| | | AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(); |
| | | AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(basAgvMast); |
| | | |
| | | //任务下发 |
| | | ReturnT<String> result = new PostMesDataUtils().postMesData("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam); |
| | | ReturnT<String> result = new PostMesDataUtils().postMesDataAgv("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam); |
| | | if (result.getCode()==200){ |
| | | basAgvMast.setStatus(1); |
| | | basAgvMastService.updateById(basAgvMast); |
| | |
| | | try{ |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("status", 0)); |
| | | for (BasAgvMast basAgvMast : basAgvMastList) { |
| | | if (basAgvMast.getStatus()!=0 && basAgvMast.getIoType()!=2){//2==》输送线站点==》AGV库位 |
| | | if (basAgvMast.getStatus()!=0 || basAgvMast.getIoType()!=2){//2==》输送线站点==》AGV库位 |
| | | continue; |
| | | } |
| | | try{ |
| | |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | |
| | | if (!Cools.isEmpty(staProtocol.getWorkNo()) && staProtocol.getWorkNo().equals(basAgvMast.getTaskNo())){ |
| | | if ((!Cools.isEmpty(staProtocol.getWorkNo()) && staProtocol.getWorkNo().equals(basAgvMast.getTaskNo())) |
| | | || |
| | | (basAgvMast.getSourceStaNo().equals(2033))){ |
| | | |
| | | AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(); |
| | | AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(basAgvMast); |
| | | |
| | | //任务下发 |
| | | ReturnT<String> result = new PostMesDataUtils().postMesData("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam); |
| | | ReturnT<String> result = new PostMesDataUtils().postMesDataAgv("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam); |
| | | if (result.getCode()==200){ |
| | | basAgvMast.setStatus(1); |
| | | basAgvMastService.updateById(basAgvMast); |
| | |
| | | try{ |
| | | List<BasAgvMast> basAgvMastList = basAgvMastService.selectList(new EntityWrapper<BasAgvMast>().eq("status", 0)); |
| | | for (BasAgvMast basAgvMast : basAgvMastList) { |
| | | if (basAgvMast.getStatus()!=0 && basAgvMast.getIoType()!=3){//3==》输送线站点==》输送线站点 |
| | | if (basAgvMast.getStatus()!=0 || basAgvMast.getIoType()!=3){//3==》输送线站点==》输送线站点 |
| | | continue; |
| | | } |
| | | try{ |
| | |
| | | |
| | | if (!Cools.isEmpty(staProtocol.getWorkNo()) && staProtocol.getWorkNo().equals(basAgvMast.getTaskNo())){ |
| | | |
| | | AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(); |
| | | AgvTaskAssignmentParam agvTaskAssignmentParam = new AgvTaskAssignmentParam(basAgvMast); |
| | | |
| | | //任务下发 |
| | | ReturnT<String> result = new PostMesDataUtils().postMesData("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam); |
| | | ReturnT<String> result = new PostMesDataUtils().postMesDataAgv("AGV任务下发", AgvConstant.AGV_URL, AgvConstant.AGV_ADAPTOR, agvTaskAssignmentParam); |
| | | if (result.getCode()==200){ |
| | | basAgvMast.setStatus(1); |
| | | basAgvMastService.updateById(basAgvMast); |