package com.zy.asrs.task.handler; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.SnowflakeIdWorker; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.MesBuyPakinReportParam; import com.zy.asrs.entity.param.MesOrderReportParam; import com.zy.asrs.entity.param.MesPakinReportParam; import com.zy.asrs.entity.param.MesPakoutReportParam; import com.zy.asrs.service.*; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.common.service.AgvCommonService; import lombok.Synchronized; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class AgvWrkMastHandler extends AbstractHandler { //入库类型数组 private static final List IN_TYPE_LIST = new ArrayList() {{ add(1); }}; //private static final int[] IN_TYPE_ARRAY = {1}; //出库类型数组 private static final List OUT_TYPE_List = new ArrayList() {{ // add(101); }}; //private static final int[] OUT_TYPE_ARRAY = {101}; //移库类型数组 private static final List MOVE_TYPE_List = new ArrayList() {{ add(11); add(12); add(53); add(101); add(103); add(108); add(111); add(112); }}; //private static final int[] MOVE_TYPE_ARRAY = {11,12}; @Value("${agvBasDev.maxWorkNum}") private int maxWrokNum; @Value("${mes.report}") private Boolean flag; @Value("${mes.url}") private String url; @Value("${mes.getTokenUrl}") private String getTokenUrl; @Value("${mes.orderReportPath}") private String orderReportPath; @Value("${mes.pakinReportPath}") private String pakinReportPath; @Value("${mes.buyPakinReportPath}") private String buyPakinReportPath; @Value("${mes.pakoutReportPath}") private String pakoutReportPath; @Value("${mes.getTokenPath}") private String getTokenPath; @Value("${mes.appKey}") private String appKey; @Value("${mes.appSecret}") private String appSecret; @Autowired private AgvWrkMastService agvWrkMastService; @Autowired private AgvLocMastService agvLocMastService; @Autowired private AgvLocDetlService agvLocDetlService; @Autowired private AgvWrkMastLogService agvWrkMastLogService; @Autowired private AgvWrkDetlService agvWrkDetlService; @Autowired private AgvWrkDetlLogService agvWrkDetlLogService; @Autowired private AgvWaitPakinService agvWaitPakinService; @Autowired private AgvWaitPakinLogService agvWaitPakinLogService; @Autowired private OrderService orderService; @Autowired private AgvBasDevpService agvBasDevpService; @Autowired private AgvWorkService agvWorkService; @Autowired private ApiLogService apiLogService; @Autowired private DocTypeService docTypeService; @Autowired private OrderDetlService orderDetlService; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Autowired private FlowLogService flowLogService; @Autowired private ReportDataService reportDataService; @Autowired private AgvCommonService agvCommonService; @Transactional public ReturnT completedPutWayWrk(AgvWrkMast agvWrkMast) { //用于上报mes的工作档明细 List agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper().eq("wrk_no", agvWrkMast.getWrkNo())); long flowId = snowflakeIdWorker.nextId(); Date now = new Date(); try { int wrkNo = agvWrkMast.getWrkNo(); String barcode = agvWrkMast.getBarcode(); String orderNo = getOrderNoByWrkNo(wrkNo); String agvBasDevp = ""; if (agvWrkMast.getIoType() > 100) { agvBasDevp = agvWrkMast.getLocNo(); } else { agvBasDevp = agvWrkMast.getSourceLocNo(); } Integer pltType = agvWrkMast.getPltType(); if (Cools.isEmpty(pltType)) { AgvLocMast agvLocMast; if (!Cools.isEmpty(agvWrkMast.getLocNo())) { agvLocMast = agvLocMastService.selectById(agvWrkMast.getLocNo()); if (agvLocMast != null) { pltType = agvLocMast.getPltType(); } } if (!Cools.isEmpty(agvWrkMast.getSourceLocNo())) { agvLocMast = agvLocMastService.selectById(agvWrkMast.getSourceLocNo()); if (agvLocMast != null) { pltType = agvLocMast.getPltType(); } } if (pltType != null) { agvWrkMast.setPltType(pltType); } //log.info("工作号--{},仓库编码:{}", agvWrkMast.getWrkNo(), agvWrkMast.getPltType()); } agvWrkMast.setModiTime(new Date()); //修改工作档状态为207.库存更新完成 agvWrkMast.setWrkSts(207L); agvWrkMastService.updateById(agvWrkMast); // 空板入库 设置库位状态为D.空桶/空栈板 String locSts = agvWrkMast.getIoType() == 10 ? "D" : "F"; if (agvWrkMast.getIoType() != 111) { //生成AGV工作历史档 agvWrkMastLogService.save(agvWrkMast); //生成AGV工作明细历史档 agvWrkDetlLogService.save(wrkNo); } switch (agvWrkMast.getIoType()) { case 1: agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue(), agvWrkMast.getCtnNo()); //更新目标库位明细 log.info("更新目标库位明细 agvWrkMast.getLocNo(): " + agvWrkMast.getLocNo() + ", wrkNo: " + wrkNo); agvLocDetlService.addLocDetlInfo(agvWrkMast.getLocNo(), wrkNo); //生成入库通知历史档 boolean save = agvWaitPakinLogService.save(barcode); //删除入库通知档 log.info("删除入库通知档 supp_code: " + barcode); agvWaitPakinService.delete(new EntityWrapper().eq("supp_code", barcode)); break; case 10: agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "D", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), "O", "", (short) 0); break; case 11: case 12: agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); //更新库存明细 agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(), agvWrkMast.getLocNo()); //修改源库位状态为O agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", null, ""); break; case 53: //修改工作党明细 //修改库存信息 List agvWrkDetlList = agvWrkDetlService.selectList(new EntityWrapper().eq("wrk_no", agvWrkMast.getWrkNo())); agvWrkDetlList.forEach(agvWrkDetl -> { AgvLocDetl agvLocDetl = agvLocDetlService.selectByMatnrAndBatchAndCsocodeAndisoCode(agvWrkMast.getLocNo(), agvWrkDetl.getMatnr(), agvWrkDetl.getBatch(), agvWrkDetl.getThreeCode(), agvWrkDetl.getDeadTime()); if (!Cools.isEmpty(agvLocDetl)) { double updateAnfme = agvLocDetl.getAnfme() - agvWrkDetl.getAnfme(); // OrderDetl orderDetl = orderDetlService.selectItem(agvWrkDetl.getOrderNo(), agvWrkDetl.getMatnr(), agvWrkDetl.getThreeCode()); // FlowLog flowLog = new FlowLog(); // flowLog.setFid(String.valueOf(flowId)); // flowLog.setSpare2(String.valueOf(agvWrkMast.getWrkNo())); // flowLog.setLocNo(agvWrkMast.getLocNo()); // flowLog.setSpare1(agvWrkDetl.getSuppCode()); // flowLog.setOpType(53L); // flowLog.setOrderNo(agvWrkDetl.getOrderNo()); // flowLog.setThreeCode(agvWrkDetl.getThreeCode()); // flowLog.setMatnr(agvWrkDetl.getMatnr()); // flowLog.setMaktx(agvWrkDetl.getMaktx()); // // flowLog.setOrderPrevious(orderDetl.getAnfme()); // flowLog.setOrderCurrent(orderDetl.getAnfme()); // flowLog.setOrderChanged(0.0); // // flowLog.setQtyPrevious(orderDetl.getQty()); // flowLog.setQtyCurrent(updateAnfme); // flowLog.setQtyChanged(agvWrkDetl.getAnfme()); // // flowLog.setLocPrevious(agvLocDetl.getAnfme()); // flowLog.setLocCurrent(updateAnfme); // flowLog.setLocChanged(agvWrkDetl.getAnfme()); // // flowLog.setAppeTime(now); // if (!flowLogService.insert(flowLog)) { // throw new CoolException("同步半成品调拨单流水记录失败"); // } log.info("53添加库存日志:{},{}", updateAnfme, JSON.toJSON(agvLocDetl)); agvLocDetlService.updateAnfme(updateAnfme, agvLocDetl.getLocNo(), agvLocDetl.getMatnr(), agvLocDetl.getBatch(), agvLocDetl.getThreeCode(), agvLocDetl.getDeadTime()); } //AgvLocDetl agvLocDetl = agvLocDetlService.selectLocdetl(agvWrkMast.getLocNo(),agvWrkDetl.getMatnr(),agvWrkDetl.getBatch(),agvWrkDetl.getThreeCode(),agvWrkDetl.getDeadTime()); }); agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue()); break; case 57: // 更新库存明细 List wrkDetlList = agvWrkDetlService.selectList(new EntityWrapper().eq("wrk_no", agvWrkMast.getWrkNo())); wrkDetlList.forEach(agvWrkDetl -> { AgvLocDetl agvLocDetl = new AgvLocDetl(); agvLocDetl.setLocNo(agvWrkMast.getLocNo()); agvLocDetl.sync(agvWrkDetl); agvLocDetl.setModiTime(now); agvLocDetl.setAppeTime(now); log.info("57添加库存日志:{}", JSON.toJSON(agvLocDetl)); if (!agvLocDetlService.insert(agvLocDetl)) { throw new CoolException("保存工作明细失败"); } }); // 更新站点 + 库位状态 源库位是站点 agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue()); agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue(), agvWrkMast.getCtnNo()); break; case 58: agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue()); break; case 108: case 114: agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); //更新库存明细 agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(), agvWrkMast.getLocNo()); //修改源库位状态为O agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue(), "", (short) 0); break; case 109: // 库位 -- 接驳位 / 库位 if (agvWrkMast.getLocNo().substring(0, 2).equals("DB")) { agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); // 接驳位 -- 库位 } else { agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "D", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); } // 接驳位 -- 库位 if (agvWrkMast.getSourceLocNo().substring(0, 2).equals("DB")) { agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), "O", "", (short) 0); // 库位 -- 接驳位 / 库位 } else { //修改源库位状态为O agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue(), "", (short) 0); } break; case 111: // 库位 -- 接驳位 / 库位 if (agvWrkMast.getLocNo().substring(0, 2).equals("DB")) { agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); // 接驳位 -- 库位 } else { agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "D", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); } // 接驳位 -- 库位 if (agvWrkMast.getSourceLocNo().substring(0, 2).equals("DB")) { agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), "O", "", (short) 0); // 库位 -- 接驳位 / 库位 } else { //修改源库位状态为O agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue(), "", (short) 0); //更新目标库位明细 101.出库 删除源库位库存明细 agvLocDetlService.delete(new EntityWrapper().eq("loc_no", agvWrkMast.getSourceLocNo())); } break; case 112: agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); List agvWrkDetls = agvWrkDetlService.selectList(new EntityWrapper().eq("wrk_no", agvWrkMast.getWrkNo())); for (AgvWrkDetl agvWrkDetl : agvWrkDetls) { AgvLocDetl locDetl = new AgvLocDetl(); locDetl.setLocNo(agvWrkMast.getLocNo()); locDetl.sync(agvWrkDetl); locDetl.setModiTime(new Date()); log.info("112添加库存日志:{}", JSON.toJSON(locDetl)); agvLocDetlService.insert(locDetl); } // 接驳位 -- 库位 if (agvWrkMast.getSourceLocNo().substring(0, 2).equals("DB")) { agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), "O", "", (short) 0); // 库位 -- 接驳位 / 库位 } else { //修改源库位状态为O agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue(), "", (short) 0); } break; case 113: agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "D", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); // 接驳位 -- 库位 if (agvWrkMast.getSourceLocNo().substring(0, 2).equals("DB")) { agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), "O", "", (short) 0); } break; case 121: agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue()); //更新库存明细 agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(), agvWrkMast.getLocNo()); //修改源库位状态为O agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue(), "", (short) 0); break; default: return null; } if (agvWrkMast.getIoType() != 111) { //删除AGV工作档 agvWrkMastService.deleteById(wrkNo); //删除AGV工作明细档 agvWrkDetlService.delete(new EntityWrapper().eq("wrk_no", wrkNo)); } // else { // agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"O","",agvWrkMast.getWhsType().shortValue()); // if (!agvWrkMast.getSourceLocNo().substring(0,2).equals("DB")) { // agvWrkMast.setSourceLocNo(""); // } // agvWrkMastService.updateById(agvWrkMast); // } if (!isJSON(orderNo)) { //检查订单是否已完成 orderService.checkComplete(orderNo, pltType); } else { List maps = JSONArray.parseArray(orderNo, Map.class); Integer finalPltType = pltType; maps.forEach(map -> { String o = map.get("orderNo").toString(); orderService.checkComplete(o, finalPltType); }); } //上报mes // MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld); // if(!Cools.isEmpty(param)){ // doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1"); // } //return SUCCESS; } catch (Exception e) { log.error("" + e.getMessage()); } //TODO //暂时加上trycatch reportMes(agvWrkMast, agvWrkDetlListOld); return SUCCESS; } @Transactional public ReturnT completedCarryWrk(AgvWrkMast agvWrkMast) { //用于上报mes的工作档明细 List agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper().eq("wrk_no", agvWrkMast.getWrkNo())); try { Date now = new Date(); int wrkNo = agvWrkMast.getWrkNo(); String orderNo = getOrderNoByWrkNo(wrkNo); //修改工作档状态为207.库存更新完成 agvWrkMast.setWrkSts(207L); agvWrkMast.setModiTime(new Date()); agvWrkMastService.updateById(agvWrkMast); //修改源库位状态为O if (agvWrkMast.getIoType() == 110) { agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", null); } if (agvWrkMast.getIoType() == 101) { //更新目标库位明细 101.出库 删除源库位库存明细 agvLocDetlService.delete(new EntityWrapper().eq("loc_no", agvWrkMast.getSourceLocNo())); //生成空板入库任务 Short containerType = Short.valueOf(agvWrkMast.getBarcode().substring(0, 2)); try { // agvWorkService.emptyPlateIn(agvWrkMast.getLocNo(),agvWrkMast.getBarcode(),containerType,9527L,true); AgvWrkMast wrkMast = new AgvWrkMast(); //工作状态 wrkMast.setWrkSts(201L); //入出库类型 wrkMast.setIoType(10); wrkMast.setIoTime(now); //优先级 wrkMast.setIoPri(300.0); //源站点 wrkMast.setSourceLocNo(agvWrkMast.getLocNo()); //目标站点 if (agvWrkMast.getLocNo().startsWith("QO") && agvWrkMast.getLocNo().endsWith("F4") && Integer.valueOf(agvWrkMast.getBarcode().substring(0, 2)) == 30) { if (!agvWrkMast.getSourceLocNo().endsWith("02F1")) { AgvLocMast locByFloor = agvCommonService.getLocByFloor(3, 1); if (locByFloor != null) { wrkMast.setLocNo(locByFloor.getLocNo()); } else { wrkMast.setLocNo(agvWrkMast.getSourceLocNo()); } } else { wrkMast.setLocNo(agvWrkMast.getSourceLocNo()); } } else { wrkMast.setLocNo(agvWrkMast.getSourceLocNo()); } //货架编码 wrkMast.setBarcode(agvWrkMast.getBarcode()); //货架类型 wrkMast.setWhsType(Integer.valueOf(agvWrkMast.getBarcode().substring(0, 2))); wrkMast.setAppeUser(agvWrkMast.getAppeUser()); wrkMast.setAppeTime(now); wrkMast.setModiUser(9527L); wrkMast.setModiTime(now); wrkMast.setPltType(agvWrkMast.getPltType()); wrkMast.setLogErrMemo("completedCarryWrk"); if (!agvWrkMastService.insertByIncrease(wrkMast)) { throw new CoolException("保存工作档失败"); } AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMast.getSourceLocNo()); agvLocMast.setLocSts("S"); agvLocMast.setModiTime(now); agvLocMastService.updateById(agvLocMast); AgvBasDevp agvBasDevp = agvBasDevpService.selectById(agvWrkMast.getLocNo()); agvBasDevp.setLocSts("R"); agvBasDevp.setLocType2(Short.valueOf(agvWrkMast.getBarcode().substring(0, 2))); agvBasDevpService.updateById(agvBasDevp); } catch (Exception e) { e.printStackTrace(); log.error(e.getMessage()); } } //生成AGV工作历史档 agvWrkMastLogService.save(agvWrkMast); //生成AGV工作明细历史档 agvWrkDetlLogService.save(wrkNo); //删除AGV工作档 agvWrkMastService.deleteById(wrkNo); //删除AGV工作明细档 agvWrkDetlService.delete(new EntityWrapper().eq("wrk_no", wrkNo)); if (!isJSON(orderNo)) { //检查订单是否已完成 orderService.checkComplete(orderNo, agvWrkMast.getPltType()); } else { List maps = JSONArray.parseArray(orderNo, Map.class); maps.forEach(map -> { String o = map.get("orderNo").toString(); orderService.checkComplete(o, agvWrkMast.getPltType()); }); } //上报mes // MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld); // if(!Cools.isEmpty(param)){ // doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1"); // } } catch (Exception e) { log.error("" + e.getMessage()); } reportMes(agvWrkMast, agvWrkDetlListOld); return SUCCESS; } @Transactional public ReturnT completedCarryWrk2(AgvWrkMast agvWrkMast) { //用于上报mes的工作档明细 List agvWrkDetlListOld = agvWrkDetlService.selectList(new EntityWrapper().eq("wrk_no", agvWrkMast.getWrkNo())); try { int wrkNo = agvWrkMast.getWrkNo(); String orderNo = getOrderNoByWrkNo(wrkNo); String agvBasDevp = ""; if (agvWrkMast.getIoType() > 100) { agvBasDevp = agvWrkMast.getLocNo(); } else { agvBasDevp = agvWrkMast.getSourceLocNo(); } //修改工作档状态为207.库存更新完成 agvWrkMast.setWrkSts(207L); agvWrkMast.setModiTime(new Date()); agvWrkMastService.updateById(agvWrkMast); //修改源库位状态为O agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", null); if (agvWrkMast.getIoType() == 101) { //更新目标库位明细 101.出库 删除源库位库存明细 agvLocDetlService.delete(new EntityWrapper().eq("loc_no", agvWrkMast.getSourceLocNo())); } //生成AGV工作历史档 agvWrkMastLogService.save(agvWrkMast); //生成AGV工作明细历史档 agvWrkDetlLogService.save(wrkNo); //删除AGV工作档 agvWrkMastService.deleteById(wrkNo); //删除AGV工作明细档 agvWrkDetlService.delete(new EntityWrapper().eq("wrk_no", wrkNo)); if (!isJSON(orderNo)) { //检查订单是否已完成 orderService.checkComplete(orderNo, agvWrkMast.getPltType()); } else { List maps = JSONArray.parseArray(orderNo, Map.class); maps.forEach(map -> { String o = map.get("orderNo").toString(); orderService.checkComplete(o, agvWrkMast.getPltType()); }); } //上报mes // MesOrderReportParam param = generateMesParam(agvWrkMast, agvWrkDetlListOld); // if(!Cools.isEmpty(param)){ // doHttpRequest(param,getMesTokenInfo(),"上报mes单据信息",url,orderReportPath,null,"127.0.0.1"); // } // reportMes(agvWrkMast,agvWrkDetlListOld); // return SUCCESS; } catch (Exception e) { log.error("" + e.getMessage()); } //TODO 张超 reportMes(agvWrkMast, agvWrkDetlListOld); return SUCCESS; } @Transactional @Synchronized public ReturnT startPutWayWrk(AgvWrkMast agvWrkMast) throws IOException { try { //下发任务 int startWrkCode = agvWrkMastService.startWrk(agvWrkMast); if (startWrkCode != 0) { throw new CoolException("任务下发失败"); } //agvWrkMast.setWrkSts(202L); //agvWrkMast.setModiTime(new Date()); //boolean b = agvWrkMastService.updateById(agvWrkMast); boolean b = agvWrkMastService.updateWrkStsByWrkNo(Math.abs(agvWrkMast.getWrkNo()), 202L); if (!b) { log.info("更新任务状态失败,{}", agvWrkMast.getWrkNo()); throw new CoolException("更新任务状态失败"); } else { log.info("更新任务状态成功,{}", agvWrkMast.getWrkNo()); } if (agvWrkMast.getIoType() == 1) { //修改AGV入库通知档状态入出状态为Y agvWaitPakinService.updateIoStatus(agvWrkMast.getWrkNo(), "Y"); } return SUCCESS; } catch (Exception e) { //TODO //log.error("修改AGV入库通知档状态入出状态为Y,{}", e.getMessage()); } return FAIL; } @Transactional @Synchronized public ReturnT startAllcationIn(AgvWrkMast agvWrkMast) throws IOException { //下发任务 try { int startWrkCode = agvWrkMastService.startAllcationIn(agvWrkMast); if (startWrkCode != 0) { throw new CoolException("任务下发失败"); } return SUCCESS; } catch (Exception e) { log.error("任务下发失败" + e.getMessage()); } return FAIL; } // @Transactional // public ReturnT startCarryWrk(AgvWrkMast agvWrkMast) throws IOException { // //log.info(agvWrkMastList.toString()); // //任务过滤,过滤掉已存在相同目标库位的工作档 // //agvWrkMastList = filter(agvWrkMastList); // int code = agvWrkMastService.startWrk(agvWrkMast); // //log.info(agvWrkMastList.toString()); // if (Cools.isEmpty(agvWrkMastList)){ // return SUCCESS; // } // if(code == 0){ // agvWrkMastList.forEach(agvWrkMast -> { // //202.RCS取货中 // agvWrkMast.setWrkSts(202L); // agvWrkMastService.updateById(agvWrkMast); // }); // //agvWrkMastService.updateBatchById(agvWrkMastList); // // return SUCCESS; // } // // return FAIL; // } @Synchronized @Transactional public ReturnT dealWatiWrk(List agvWrkMastList) throws IOException { agvWrkMastList.forEach(agvWrkMast -> { //查询该站点所有暂存位在工作档中出现的次数 List> devNoMaps = agvBasDevpService.selectDevNoAndNumBystationCode(agvWrkMast.getLocNo()); //取第一个暂存位,并查询其次数与配置的次数做比较 Map devNoMap = devNoMaps.get(0); if ((int) devNoMap.get("num") < maxWrokNum) { agvWrkMast.setLocNo(devNoMap.get("dev_no").toString()); agvWrkMast.setModiTime(new Date()); agvWrkMastService.updateById(agvWrkMast); log.info("after:" + devNoMap.toString() + ", wrkNo:" + agvWrkMast.getWrkNo() + ", locNo: " + agvWrkMast.getLocNo()); } }); return SUCCESS; } @Synchronized @Transactional public ReturnT autoEmptyOut(AgvBasDevp agvBasDevp) { agvWorkService.emptyPlateOut(agvBasDevp.getDevNo(), 0, 9527L); return SUCCESS; } private String getOrderNoByWrkNo(int wrkNo) { AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper().eq("wrk_no", wrkNo)); if (Cools.isEmpty(agvWrkDetl)) { return null; } return agvWrkDetl.getOrderNo(); } private boolean isJSON(String str) { if (Cools.isEmpty(str)) { return false; } else { str = str.trim(); if (str.startsWith("{") && str.endsWith("}")) { return true; } else if (str.startsWith("[") && str.endsWith("]")) { return true; } else { return false; } } } private List filter(List agvWrkMastList) { return agvWrkMastList.stream().filter(agvWrkMast -> { AgvWrkMast agvWrkMastWroking = agvWrkMastService.selectOne(new EntityWrapper().eq("source_loc_no", agvWrkMast.getLocNo())); if (!Cools.isEmpty(agvWrkMastWroking) && agvWrkMastWroking.getWrkSts() <= 202) { System.out.println("source_loc_no > 1"); return false; } log.info(agvWrkMast.toString()); int num = agvWrkMastService.selectCount(new EntityWrapper().eq("loc_no", agvWrkMast.getLocNo())); return num <= maxWrokNum; }).collect(Collectors.toList()); } /* 生成工作档 */ private AgvWrkMast createWrkMast(int ioType, long wrkSts, String sourceLocNo, String locNo, String barcode, Date now, Long userId, int containerType, int floor) { AgvWrkMast wrkMast = new AgvWrkMast(); //工作状态 wrkMast.setWrkSts(wrkSts); //入出库类型 wrkMast.setIoType(ioType); wrkMast.setIoTime(now); //优先级 wrkMast.setIoPri(300.0); //源站点 wrkMast.setSourceLocNo(sourceLocNo); //目标站点 wrkMast.setLocNo(locNo); //货架编码 wrkMast.setBarcode(barcode); //货架类型 wrkMast.setWhsType(containerType); // 目标楼层 wrkMast.setCrnNo(floor); wrkMast.setAppeUser(userId); wrkMast.setAppeTime(now); wrkMast.setModiUser(userId); wrkMast.setModiTime(now); if (!agvWrkMastService.insertByIncrease(wrkMast)) { throw new CoolException("保存工作档失败"); } wrkMast = agvWrkMastService.selectOne(new EntityWrapper().eq("loc_no", locNo).eq("source_loc_no", sourceLocNo).eq("barcode", barcode).orderBy("modi_time", false)); return wrkMast; } private void reportMes(AgvWrkMast agvWrkMast, List agvWrkDetls) { if (Cools.isEmpty(agvWrkDetls)) { return; } List data = new ArrayList<>(); //区分不同任务类型的上报方式 for (AgvWrkDetl agvWrkDetl : agvWrkDetls) { if (agvWrkDetl.getMatnr().compareTo("39") <= 0) { data.add(agvWrkDetl); } } if (!data.isEmpty()) { if (IN_TYPE_LIST.contains(agvWrkMast.getIoType())) { reportMesPakinOrder(agvWrkMast, data); } // if (OUT_TYPE_List.contains(agvWrkMast.getIoType())) { // reportMesPakoutOrder(agvWrkMast, data); // } // if (MOVE_TYPE_List.contains(agvWrkMast.getIoType())) { // generateMesParam(agvWrkMast, data); // } } } private void reportMesPakinOrder(AgvWrkMast agvWrkMast, List agvWrkDetls) { for (AgvWrkDetl agvWrkDetl : agvWrkDetls) { //判断是否采购入库 String orderNo = agvWrkDetl.getOrderNo(); Order order = orderService.selectByNo(orderNo); DocType docType = docTypeService.selectById(order.getDocType()); if (docType.getDocName().contains("采购")) { OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(orderNo, agvWrkDetl.getMatnr(), agvWrkDetl.getThreeCode(), agvWrkDetl.getDeadTime()); MesBuyPakinReportParam mesBuyPakinReportParam = new MesBuyPakinReportParam(); List iteams = new ArrayList<>(); MesBuyPakinReportParam.Iteam iteam = new MesBuyPakinReportParam.Iteam(); iteam.setMaterialCode(agvWrkDetl.getMatnr()); iteam.setBatchNo(agvWrkDetl.getBatch()); iteam.setAmount(agvWrkDetl.getAnfme()); iteam.setStorageLocationCode(agvWrkMast.getLocNo()); iteam.setLineNo(orderDetl.getItemNum()); iteam.setSupplierCode(order.getSalesman()); iteam.setUnit(agvWrkDetl.getUnit()); iteam.setRemark(agvWrkDetl.getThreeCode()); iteams.add(iteam); mesBuyPakinReportParam.setCode(orderNo); mesBuyPakinReportParam.setIteam(iteams); doHttpRequest(mesBuyPakinReportParam, getMesTokenInfo(), "上报mes采购入库信息", url, buyPakinReportPath, null, "127.0.0.1"); } else { MesPakinReportParam mesPakinReportParam = new MesPakinReportParam(); //mesPakinReportParam.setInboundOrderCode(agvWrkDetl.getOrderNo()); mesPakinReportParam.setBizType("0"); mesPakinReportParam.setInventoryAttr(new MesPakinReportParam.InventoryAttr(null, agvWrkDetl.getMatnr(), agvWrkMast.getLocNo())); mesPakinReportParam.setNoQrCodeExecAmount(new MesPakinReportParam.NoQrCodeExecAmount(agvWrkDetl.getAnfme(), agvWrkDetl.getUnit(), null)); doHttpRequest(mesPakinReportParam, getMesTokenInfo(), "上报mes入库信息", url, pakinReportPath, null, "127.0.0.1"); } } } private void reportMesPakoutOrder(AgvWrkMast agvWrkMast, List agvWrkDetls) { for (AgvWrkDetl agvWrkDetl : agvWrkDetls) { MesPakoutReportParam mesPakoutReportParam = new MesPakoutReportParam(); mesPakoutReportParam.setStorageCode(agvWrkMast.getLocNo()); AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMast.getLocNo()); mesPakoutReportParam.setWareHouseCode(agvLocMast.getPltType().toString()); mesPakoutReportParam.setMaterialCode(agvWrkDetl.getMatnr()); mesPakoutReportParam.setBatchNos(Arrays.asList(agvWrkDetl.getThreeCode().trim())); mesPakoutReportParam.setAmount(new MesPakoutReportParam.Amount(agvWrkDetl.getAnfme(), agvWrkDetl.getUnit(), null)); doHttpRequest(mesPakoutReportParam, getMesTokenInfo(), "上报mes出库信息", url, pakoutReportPath, null, "127.0.0.1"); } } private void generateMesParam(AgvWrkMast agvWrkMast, List agvWrkDetls) { if (agvWrkMast.getIoType() == 53) { String locNo = agvWrkMast.getLocNo(); agvWrkMast.setLocNo(agvWrkMast.getSourceLocNo()); agvWrkMast.setSourceLocNo(locNo); } MesOrderReportParam param = new MesOrderReportParam(); List transferOrderItems = new ArrayList<>(); //MesOrderReportParam.RecordCustomFieldBaseCO.CustomField customFields = new MesOrderReportParam.RecordCustomFieldBaseCO.CustomField(); MesOrderReportParam.RecordCustomFieldBaseCO recordCustomFieldBaseCO = new MesOrderReportParam.RecordCustomFieldBaseCO(); //recordCustomFieldBaseCO.setCustomFields(customFields); param.setRecordCustomFieldBaseCO(recordCustomFieldBaseCO); //添加transferOrderItem属性 MesOrderReportParam.TransferOrderItem transferOrderItem = new MesOrderReportParam.TransferOrderItem(); transferOrderItem.setRemark(agvWrkDetls.get(0).getOrderNo()); //调拨 if (agvWrkMast.getLocNo().contains("YZ")) { transferOrderItem.setTargetLocationCode(agvWrkMast.getLocNo()); } else { //出库默认仓位 String floor = agvWrkMast.getLocNo().split("F")[1]; transferOrderItem.setTargetLocationCode(getTargetLocationByFloor(floor)); } transferOrderItems.add(transferOrderItem); param.setTransferOrderItems(transferOrderItems); for (AgvWrkDetl agvWrkDetl : agvWrkDetls) { List inventoryDetails = new ArrayList<>(); MesOrderReportParam.TransferOrderItem.InventoryDetail inventoryDetail = new MesOrderReportParam.TransferOrderItem.InventoryDetail(); //添加amount属性 MesOrderReportParam.TransferOrderItem.InventoryDetail.Amount amount = new MesOrderReportParam.TransferOrderItem.InventoryDetail.Amount(agvWrkDetl.getAnfme(), agvWrkDetl.getUnit(), null); inventoryDetail.setAmount(amount); //添加bizKey属性 MesOrderReportParam.TransferOrderItem.InventoryDetail.BizKey bizKey = new MesOrderReportParam.TransferOrderItem.InventoryDetail.BizKey(Cools.isEmpty(agvWrkDetl.getBatch()) ? "" : agvWrkDetl.getBatch().trim()); inventoryDetail.setBizKey(bizKey); //添加inventoryDetail属性 inventoryDetail.setLocationCode(agvWrkMast.getSourceLocNo()); inventoryDetail.setMaterialCode(agvWrkDetl.getMatnr()); inventoryDetail.setQcStatus(1); inventoryDetail.setStorageStatus(1); inventoryDetails.add(inventoryDetail); transferOrderItem.setInventoryDetails(inventoryDetails); //添加销售订单号 MesOrderReportParam.RecordCustomFieldBaseCO.CustomField customField = new MesOrderReportParam.RecordCustomFieldBaseCO.CustomField("workOrderCode__c", agvWrkDetl.getThreeCode().trim()); //customFields.add(customField); recordCustomFieldBaseCO.setCustomFields(customField); doHttpRequest(param, getMesTokenInfo(), "上报mes调拨信息", url, orderReportPath, null, "127.0.0.1"); } } //获取mes token信息 private Map getMesTokenInfo() { // Map param = new HashMap<>(); // param.put("appKey", appKey); // param.put("appSecret", appSecret); // // JSONObject jsonObject = doHttpRequest(param, null, "获取MesToken", getTokenUrl, getTokenPath, null, "127.0.0.1"); // // Map headParam = new HashMap<>(); // headParam.put("X-AUTH", JSON.parseObject(jsonObject.get("data").toString()).get("appAccessToken").toString()); // return headParam; return null; } //根据楼层默认出库仓位 private String getTargetLocationByFloor(String f) { int floor = Integer.parseInt(f); if (floor == 1) { return "WH-000"; } if (floor == 2) { return "WH-000"; } if (floor == 3) { return "WH-000"; } return null; } private void doHttpRequest(Object requestParam, Map headParam, String namespace, String url, String path, String appkey, String ip) { //保证上报表 ReportData reportData = new ReportData(); reportData.setReportJson(JSONObject.toJSONString(requestParam)); reportData.setMemo(namespace); reportData.setCreateTime(new Date()); reportData.setReportType("MES"); reportDataService.insert(reportData); // String response = ""; // boolean success = false; // // try { // response = new HttpHandler.Builder().setUri(url).setPath(path).setTimeout(30, TimeUnit.SECONDS).setHeaders(headParam).setJson(JSONObject.toJSONString(requestParam)).setHttps(true).build().doPost(); // JSONObject jsonObject = JSON.parseObject(response); // // if (Cools.isEmpty(jsonObject.get("code")) || Integer.parseInt(jsonObject.get("code").toString()) != 200) { // log.info("mes接口调用失败,返回信息:" + jsonObject); // //TODO 张超 // throw new CoolException("mes接口调用失败,返回信息:" + jsonObject); // } // success = true; // return jsonObject; // //// String succeed = jsonObject.get("succeed").toString(); //// //// int code = Cools.eq("0",succeed) ? 0 : 1; //// if(code != 200){ //// throw new CoolException(jsonObject.get("dsc").toString()); //// } //// success = true; // // } catch (Exception e) { // log.error(e.getMessage()); // throw new CoolException(e.getMessage()); // } finally { // apiLogService.save(namespace, url + path, appkey, ip, JSON.toJSONString(JSONObject.toJSONString(requestParam)), response, success); // } } }