| | |
| | | package com.zy.asrs.service.impl; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.zy.asrs.domain.enums.NotifyMsgType; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.utils.NotifyUtils; |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.common.model.*; |
| | | import com.zy.common.model.MapNode; |
| | | import com.zy.common.model.NavigateNode; |
| | | import com.zy.common.model.SearchLocParam; |
| | | import com.zy.common.model.StartupDto; |
| | | import com.zy.common.model.enums.NavigationMapType; |
| | | import com.zy.common.service.CommonService; |
| | | import com.zy.common.utils.*; |
| | | import com.zy.core.News; |
| | | import com.zy.core.action.LiftAction; |
| | | import com.zy.core.action.ShuttleAction; |
| | | import com.zy.core.cache.MessageQueue; |
| | | import com.zy.core.cache.SlaveConnection; |
| | | import com.zy.core.dispatcher.ShuttleDispatchUtils; |
| | | import com.zy.core.enums.*; |
| | | import com.zy.core.model.*; |
| | | import com.zy.core.model.command.*; |
| | | import com.zy.core.model.command.LiftAssignCommand; |
| | | import com.zy.core.model.command.LiftCommand; |
| | | import com.zy.core.model.command.ShuttleAssignCommand; |
| | | import com.zy.core.model.command.ShuttleCommand; |
| | | import com.zy.core.model.protocol.*; |
| | | import com.zy.core.properties.SlaveProperties; |
| | | import com.zy.core.thread.*; |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.*; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 立体仓库WCS系统主流程业务 |
| | |
| | | @Autowired |
| | | private LiftAction liftAction; |
| | | |
| | | //入库站点 |
| | | public static final ArrayList<Integer> inSta = new ArrayList<Integer>() {{ |
| | | add(1012); |
| | | add(1014); |
| | | add(1022); |
| | | add(1025); |
| | | add(1032); |
| | | }}; |
| | | |
| | | //出库站点 |
| | | public static final ArrayList<Integer> outSta = new ArrayList<Integer>() {{ |
| | | add(1012); |
| | | add(1014); |
| | | add(1022); |
| | | add(1025); |
| | | add(1032); |
| | | }}; |
| | | |
| | | |
| | | private boolean isInEnable(DevpThread devpThread, Integer staNo) { |
| | | if (staNo == null) { |
| | | return false; |
| | | } |
| | | // 获取入库站信息 |
| | | switch (staNo) { |
| | | case 1011: |
| | | case 1012: |
| | | devpThread.getStation().get(1012).isInEnable(); |
| | | break; |
| | | case 1021: |
| | | case 1022: |
| | | case 1023: |
| | | devpThread.getStation().get(1022).isInEnable(); |
| | | break; |
| | | case 1031: |
| | | case 1032: |
| | | devpThread.getStation().get(1032).isInEnable(); |
| | | break; |
| | | case 1025: |
| | | case 1026: |
| | | devpThread.getStation().get(1025).isInEnable(); |
| | | break; |
| | | case 1013: |
| | | case 1014: |
| | | case 1015: |
| | | devpThread.getStation().get(1014).isInEnable(); |
| | | break; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private boolean isOutEnable(DevpThread devpThread, Integer staNo) { |
| | | if (staNo == null) { |
| | | return false; |
| | | } |
| | | // 获取入库站信息 |
| | | switch (staNo) { |
| | | case 1011: |
| | | case 1012: |
| | | devpThread.getStation().get(1012).isOutEnable(); |
| | | break; |
| | | case 1021: |
| | | case 1022: |
| | | case 1023: |
| | | devpThread.getStation().get(1022).isOutEnable(); |
| | | break; |
| | | case 1031: |
| | | case 1032: |
| | | devpThread.getStation().get(1032).isOutEnable(); |
| | | break; |
| | | case 1025: |
| | | case 1026: |
| | | devpThread.getStation().get(1025).isOutEnable(); |
| | | break; |
| | | case 1013: |
| | | case 1014: |
| | | case 1015: |
| | | devpThread.getStation().get(1014).isOutEnable(); |
| | | break; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 组托 |
| | | * 入库站,根据条码扫描生成入库工作档,工作状态 2 |
| | | */ |
| | | public synchronized void generateInboundWrk() { |
| | | try { |
| | | DevpSlave devpSlave = slaveProperties.getDevpSlave().get(0); |
| | | // 遍历入库口 |
| | | for (DevpSlave.Sta inSta : devpSlave.getInSta()) { |
| | | // 获取入库站信息 |
| | | DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpSlave.getId()); |
| | | StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); |
| | | if (staProtocol == null) { |
| | | continue; |
| | | } else { |
| | | staProtocol = staProtocol.clone(); |
| | | } |
| | | Short workNo = staProtocol.getWorkNo(); |
| | | // 尺寸检测异常 |
| | | boolean back = false; |
| | | String errMsg = "异常:"; |
| | | if (staProtocol.isFrontErr()) { |
| | | errMsg = errMsg + "前超限;"; |
| | | back = true; |
| | | } |
| | | if (staProtocol.isBackErr()) { |
| | | errMsg = errMsg + "后超限"; |
| | | back = true; |
| | | } |
| | | if (staProtocol.isHighErr()) { |
| | | errMsg = errMsg + "高超限"; |
| | | back = true; |
| | | } |
| | | if (staProtocol.isLeftErr()) { |
| | | errMsg = errMsg + "左超限"; |
| | | back = true; |
| | | } |
| | | if (staProtocol.isRightErr()) { |
| | | errMsg = errMsg + "右超限"; |
| | | back = true; |
| | | } |
| | | if (staProtocol.isWeightErr()) { |
| | | errMsg = errMsg + "超重"; |
| | | back = true; |
| | | } |
| | | if (staProtocol.isBarcodeErr()) { |
| | | errMsg = errMsg + "扫码失败"; |
| | | back = true; |
| | | } |
| | | // 退回 |
| | | if (back) { |
| | | // led 异常显示 |
| | | LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed()); |
| | | if (ledThread != null) { |
| | | ledThread.error(errMsg); |
| | | } |
| | | continue; |
| | | } |
| | | |
| | | // 判断是否满足入库条件 |
| | | if (staProtocol.isAutoing() && staProtocol.isLoading() |
| | | && isInEnable(devpThread, inSta.getStaNo()) |
| | | && !staProtocol.isEmptyMk() && (workNo == 0 || (workNo >= 9990 && workNo <= 9999)) |
| | | && staProtocol.isPakMk() |
| | | ) { |
| | | String barcode = staProtocol.getBarcode(); |
| | | if (!Cools.isEmpty(barcode)) { |
| | | News.info("条码扫描器检测条码信息:{}", barcode); |
| | | } |
| | | |
| | | // 判断重复工作档 |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>() |
| | | .eq("source_sta_no", inSta.getStaNo()) |
| | | .eq("wrk_sts", WrkStsType.NEW_INBOUND) |
| | | .eq("barcode", barcode)); |
| | | if (wrkMast != null) { |
| | | News.error("工作档已存在,工作号={}", wrkMast.getWrkNo()); |
| | | if (staProtocol.getWorkNo().intValue() != wrkMast.getWrkNo()) { |
| | | MessageQueue.offer(SlaveType.Devp, devpSlave.getId(), new Task(2, staProtocol)); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | News.info("输送线入库命令下发,任务数据={}", JSON.toJSON(wrkMast)); |
| | | } |
| | | continue; |
| | | } |
| | | |
| | | try { |
| | | String wmsUrl = "127.0.0.1:8080/fyxcwms"; |
| | | SearchLocParam param = new SearchLocParam(); |
| | | param.setBarcode(barcode); |
| | | param.setIoType(1); |
| | | param.setSourceStaNo(inSta.getStaNo()); |
| | | param.setLocType1(staProtocol.getLocType1().shortValue()); |
| | | String response = new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/pakin/loc/v1") |
| | | .setJson(JSON.toJSONString(param)) |
| | | .build() |
| | | .doPost(); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | Integer code = jsonObject.getInteger("code"); |
| | | if (code.equals(200)) { |
| | | MessageQueue.offer(SlaveType.Devp, devpSlave.getId(), new Task(2, staProtocol)); |
| | | devpThread.setPakMk(staProtocol.getSiteId(), false); |
| | | News.info("输送线入库命令下发,任务数据={}", JSON.toJSON(wrkMast)); |
| | | |
| | | StartupDto dto = jsonObject.getObject("data", StartupDto.class); |
| | | |
| | | // String wmsLocNo = dto.getLocNo(); |
| | | // int row = Integer.parseInt(wmsLocNo.substring(0, 2)); |
| | | // int bay = Integer.parseInt(wmsLocNo.substring(2, 5)); |
| | | // int lev = Integer.parseInt(wmsLocNo.substring(5, 7)); |
| | | // String wcsLocNo = Utils.getLocNo(row, bay, lev); |
| | | // |
| | | // CreateInTaskParam createInTaskParam = new CreateInTaskParam(); |
| | | // createInTaskParam.setTaskNo(String.valueOf(dto.getWorkNo())); |
| | | // createInTaskParam.setDestLoc(wcsLocNo); |
| | | // createInTaskParam.setOriginSite(dto.getSourceStaNo().toString()); |
| | | // createInTaskParam.setDestSite(dto.getStaNo().toString()); |
| | | // createInTaskParam.setPriority(11); |
| | | // createInTaskParam.setBarcode(barcode); |
| | | // |
| | | // R result = openUtils.createInTask(createInTaskParam); |
| | | // News.info("创建入库任务,任务数据={},WMS响应={},请求响应={}", JSON.toJSON(param), JSON.toJSON(jsonObject), JSON.toJSON(result)); |
| | | // try{ |
| | | // String msg = ""; |
| | | // HashMap<String, String> hashMap = new HashMap<>(); |
| | | // hashMap.put("msg", msg); |
| | | // hashMap.put("sta", inSta.getStaNo().toString()); |
| | | // new HttpHandler.Builder() |
| | | // .setUri(wmsUrl) |
| | | // .setPath("/rpc/led/getError") |
| | | // .setJson(JSON.toJSONString(hashMap)) |
| | | // .build() |
| | | // .doPost(); |
| | | // }catch (Exception e){ |
| | | // |
| | | // } |
| | | } else { |
| | | String msg = jsonObject.getString("msg"); |
| | | HashMap<String, String> hashMap = new HashMap<>(); |
| | | hashMap.put("msg", msg); |
| | | hashMap.put("sta", inSta.getStaNo().toString()); |
| | | new HttpHandler.Builder() |
| | | .setUri(wmsUrl) |
| | | .setPath("/rpc/led/getError") |
| | | .setJson(JSON.toJSONString(hashMap)) |
| | | .build() |
| | | .doPost(); |
| | | News.error("入库申请失败,任务数据={},请求响应={}", JSON.toJSON(param), JSON.toJSON(jsonObject)); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 初始化实时地图 |
| | | */ |