pom.xml
@@ -124,7 +124,7 @@ </dependencies> <build> <finalName>ljqwms</finalName> <finalName>hkwms</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> src/main/java/com/zy/asrs/controller/OutController.java
@@ -232,12 +232,13 @@ i++; //配盘出库单使用,下发需要出的空板任务 if (orderPakout.getDocType() == 11) { if (size<5&&i==size){ if (i==size){ for (;j<=orderPakout.getPayType();j++){ String bar=""; if(!Cools.isEmpty(orderPakout.getShipCode())&&orderPakout.getShipCode().equals("A01")){ bar = "A01"; } //具体待定 // if(!Cools.isEmpty(orderPakout.getShipCode())&&orderPakout.getShipCode().equals("A01")){ // bar = "A01"; // } LocMast locMast = new LocMast(); if(Cools.isEmpty(bar)){ locMast=locMastService.selectOne(new EntityWrapper<LocMast>() @@ -254,11 +255,17 @@ EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam(); emptyPlateOutParam.setOutSite(303); emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locNo);}}); WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,ioPri); String agvSta = ""; if(locMast.getLocType3()==2){ }else { agvSta = orderPakout.getCstmrName();//agv目标站点位置 } WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,ioPri,agvSta); ioPri--; } }else if(i == 5){ }else if(i == 4){ String bar=""; if(!Cools.isEmpty(orderPakout.getShipCode())&&orderPakout.getShipCode().equals("A01")){ bar = "A01"; @@ -279,7 +286,13 @@ EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam(); emptyPlateOutParam.setOutSite(303); emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locNo);}}); WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,ioPri); String agvSta = ""; if(locMast.getLocType3()==2){ }else { agvSta = orderPakout.getCstmrName();//agv目标站点位置 } WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,ioPri,agvSta); ioPri--; } } src/main/java/com/zy/asrs/entity/BasDevp.java
@@ -94,9 +94,9 @@ private String downing; /** * 需求1 * 料架 */ @ApiModelProperty(value= "需求1") @ApiModelProperty(value= "料架") private String inreq1; /** src/main/java/com/zy/asrs/entity/OrderPakout.java
@@ -74,6 +74,13 @@ private String shipCode; /** * AGV目标站点 */ @ApiModelProperty(value= "AGV目标站点") @TableField("cstmr_name") private String cstmrName; /** * 项目编号 */ @ApiModelProperty(value= "项目编号") @@ -110,12 +117,6 @@ @ApiModelProperty(value= "客户编号") private Long cstmr; /** * 客户 */ @ApiModelProperty(value= "客户") @TableField("cstmr_name") private String cstmrName; /** * 联系方式 src/main/java/com/zy/asrs/service/WorkService.java
@@ -58,7 +58,7 @@ * @param param * @return */ public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri); public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri,String agvSta); /** * 盘点出库 src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -967,6 +967,7 @@ orderPakout.setUpdateTime(now); orderPakout.setMemo(JSONObject.toJSONString(mesCallOutApply)); orderPakout.setPakinPakoutStatus(2); orderPakout.setCstmrName(mesCallOutApply.getStationId());//agv目标站点 if (!orderPakoutService.insert(orderPakout)) { log.error("MES保存出库订单(叫料)主档失败"); throw new CoolException("保存出库订单(叫料)主档失败"); src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -606,9 +606,9 @@ if (Cools.isEmpty(mat)) { throw new CoolException(detlDto.getMatnr() + "商品档案不存在"); } if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) { throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty()); } // if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) { // throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty()); // } WaitPakin waitPakin = new WaitPakin(); BeanUtils.copyProperties(mat, waitPakin); waitPakin.setBatch(detlDto.getBatch()); @@ -704,6 +704,9 @@ // if (suplus < 0) { // throw new CoolException("物料:" + detlDto.getMatnr() + ", 超出当前托盘装载上限!!"); // } OrderDetlPakin detls = orderDetlPakinService.selectOne(new EntityWrapper<OrderDetlPakin>() .eq("order_no", param.getOrderNo()) .eq("matnr", detlDto.getMatnr())); WaitPakin waitPakin = new WaitPakin(); BeanUtils.copyProperties(mat, waitPakin); @@ -719,6 +722,7 @@ waitPakin.setAppeTime(now); waitPakin.setModiUser(userId); waitPakin.setModiTime(now); waitPakin.setStandby1(detls.getStandby1());//配盘号 if (!waitPakinService.insert(waitPakin)) { throw new CoolException("保存入库通知档失败"); } src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -105,7 +105,7 @@ // 源站点状态检测 BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getDevpNo(), true); // 检索库位 LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo); LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo,""); // List<String> matnrs = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatnr).distinct().collect(Collectors.toList()); // List<String> batchs = param.getList().stream().map(FullStoreParam.MatCodeStore::getBatch).distinct().collect(Collectors.toList()); FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(param.getList().get(0)); @@ -411,9 +411,22 @@ String orderNo = taskDto.getLocDtos().get(0).getOrderNo(); OrderPakout orderPakout = orderPakOutService.selectByNo(orderNo); int ioType = orderPakout.getDocType() == 8 ? 107 : (taskDto.isAll() ? 101 : 103); StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo()); // StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo()); // 生成工作号 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); //出库任务堆垛机出库站点指定 String SourceStaNo = ""; if(locMast.getLocType3()==2&&orderPakout.getDocType()==11){ SourceStaNo = "303"; }else if (locMast.getLocType3()==2&&!Cools.isEmpty(orderPakout.getCstmrName())){ SourceStaNo = "307"; }else if (locMast.getLocType3()==1&&locMast.getLocType2()==1){ SourceStaNo = "402"; }else if (locMast.getLocType3()==1&&locMast.getLocType2()==2){ SourceStaNo = "401"; } // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); @@ -422,8 +435,8 @@ wrkMast.setIoType(ioType); // 入出库状态 wrkMast.setIoPri(ioPri+0.0); // 优先级:13 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站 wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站 wrkMast.setSourceStaNo(SourceStaNo); // 源站 wrkMast.setStaNo(SourceStaNo); // 目标站 wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 @@ -435,6 +448,11 @@ wrkMast.setAppeTime(now); wrkMast.setModiUser(userId); wrkMast.setModiTime(now); if(locMast.getLocType3()==2&&orderPakout.getDocType()==11){ }else { wrkMast.setMemo(orderPakout.getCstmrName());//agv目标站点 } if (!wrkMastService.insert(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:" + taskDto.getLocNo()); } @@ -502,7 +520,7 @@ // 源站点状态检测 BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true); // 检索库位 LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo); LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo,""); FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(); StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto); @@ -629,7 +647,7 @@ @Override @Transactional public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri) { public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri,String agvSta) { WrkMast wrkMast = new WrkMast(); if (Cools.isEmpty(param.getOutSite())) { throw new CoolException("站点不存在"); @@ -642,10 +660,21 @@ if (Cools.isEmpty(locMast)) { throw new CoolException(locNo + "库位不存在"); } //出库任务堆垛机出库站点指定 String SourceStaNo = ""; if(locMast.getLocType3()==2){ SourceStaNo = "303"; }else if (locMast.getLocType3()==1&&locMast.getLocType2()==1){ SourceStaNo = "402"; }else if (locMast.getLocType3()==1&&locMast.getLocType2()==2){ SourceStaNo = "401"; } // 获取源站 Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() .eq("type_no", 110) .eq("stn_no", param.getOutSite()) .eq("stn_no", SourceStaNo) .eq("crn_no", locMast.getCrnNo()); StaDesc staDesc = staDescService.selectOne(wrapper); Integer sourceStaNo = staDesc.getCrnStn(); @@ -661,7 +690,7 @@ wrkMast.setIoType(110); // 入出库状态: 110.空板出库 wrkMast.setIoPri(ioPri+0.0); wrkMast.setSourceStaNo(sourceStaNo + ""); // 源站 wrkMast.setStaNo(param.getOutSite() + ""); // 目标站 wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceLocNo(locNo); // 源库位 wrkMast.setFullPlt("N"); // 满板:Y @@ -673,7 +702,7 @@ wrkMast.setAppeTime(now); wrkMast.setModiUser(1L); wrkMast.setModiTime(now); wrkMast.setMemo("生成自动空板出库"); wrkMast.setMemo(agvSta);//agv目标站点 boolean res = wrkMastService.insert(wrkMast); if (!res) { throw new CoolException("保存工作档失败"); src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java
@@ -3,10 +3,12 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.Task; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.TaskService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.BasDevpServiceImpl; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.handler.AGVTaskReportHandler; import org.slf4j.Logger; @@ -31,6 +33,8 @@ private Boolean switchErpReportOld; @Autowired private WrkMastService wrkMastService; @Autowired private BasDevpServiceImpl basDevpService; /** * 满板和空板出库任务,出到输送线后创建AGV搬运任务 @@ -40,13 +44,20 @@ if (!switchErpReportOld){ return; } List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 300)); List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 30)); if (wrkMasts.isEmpty()){ return; } for (WrkMast wrkMast : wrkMasts){ //查询是否有源站和目标站有一样的agv搬运任务 //如果有则跳过本次agv搬运任务下发 //mes给的agv目标站点需要解析 Q:区域 ; Z: 站点 String[] split = wrkMast.getMemo().split("-"); //入出库状态: 3.站到站 4.站到区域 Integer ioType = split[0].equals("Q") ? 4 : 3; //agv目标站点 String stnNo = split[1]; Task task1 = taskService.selectOne(new EntityWrapper<Task>() .in("source_sta_no", wrkMast.getSourceStaNo(), wrkMast.getMemo()) .in("sta_no", wrkMast.getSourceStaNo(), wrkMast.getMemo())); @@ -61,13 +72,13 @@ .setTaskNo(TaskNo) .setIoTime(date) .setWrkSts(301L) // 工作状态:301.任务下发 .setIoType(3) // 入出库状态: 3.站到站 .setIoType(ioType) // 入出库状态: 3.站到站 4.站到区域 .setTaskType("agv") .setIoPri(10D) .setFullPlt("Y") // 满板:Y .setPicking("N") // 拣料 .setExitMk("N")// 退出 .setStaNo(wrkMast.getMemo()) .setStaNo(stnNo) .setSourceStaNo(wrkMast.getSourceStaNo())//空料架缓存区E1 .setEmptyMk("N")// 空板 .setBarcode(wrkMast.getBarcode())// 托盘码 @@ -106,7 +117,67 @@ .andNew() .in("source_sta_no", task.getSourceStaNo(), task.getStaNo()) .in("sta_no", task.getStaNo(), task.getSourceStaNo())); Boolean flag = true; if (Cools.isEmpty(task1)) { //agv搬运移动任务下发时,搬运目标点是否是立库AGV和堆垛机接驳站点 //如果是接驳站点则需要判断接驳站点是否有空料架 //如果有空料架需要判断是否有出库任务 //有出库任务则禁止下发本次搬运任务 if (task.getStaNo().equals("401") || task.getStaNo().equals("402") || task.getStaNo().equals("307")) { BasDevp basDevp = basDevpService.checkSiteStatus(Integer.parseInt(task.getStaNo())); if (basDevp != null && !Cools.isEmpty(basDevp.getInreq1()) && basDevp.getInreq1().equals("Y")) { List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>() .in("io_type", 101, 110) .eq("sta_no", task1.getStaNo())); flag = false; if (Cools.isEmpty(wrkMasts)) { //判断是否已经生成空料架搬运回空料架补库区 //如果有的话,不在生成任务 Task task2 = taskService.selectOne(new EntityWrapper<Task>().eq("sta_no", task1.getStaNo()).eq("source_sta_no", task1.getSourceStaNo())); //有入库任务搬运,需要生成空料架搬运到空料架缓冲区AGV任务 if (Cools.isEmpty(task2)) { //生成AGV搬运出库任务 // 保存工作档 String SourceStaNo = ""; if (task.getStaNo().equals("401")) { //大料架缓冲区 SourceStaNo = "E3"; }else if (task.getStaNo().equals("402")) { SourceStaNo = "E2"; }else if (task.getStaNo().equals("307")) { SourceStaNo = "E1"; } Task task3 = new Task(); Date date = new Date(); String TaskNo = task.getTaskNo() + "-" + date.getTime(); task3.setWrkNo(999999) .setTaskNo(TaskNo) .setIoTime(date) .setWrkSts(301L) // 工作状态:301.任务下发 .setIoType(4) // 入出库状态: 3.站到站 4.站到区域 .setTaskType("agv") .setIoPri(10D) .setFullPlt("Y") // 满板:Y .setPicking("N") // 拣料 .setExitMk("N")// 退出 .setStaNo(task.getStaNo()) .setSourceStaNo(SourceStaNo)//空料架缓存区E1 .setEmptyMk("N")// 空板 .setBarcode("")// 托盘码 .setLinkMis("N") .setAppeUser(9945L) .setAppeTime(date) .setModiUser(9945L) .setModiTime(date); if (!taskService.insert(task)) { throw new CoolException("保存工作档失败"); } } } } } if (flag) { //AGV任务下发 ReturnT<String> start = AGVTaskReportHandler.start(task); if (!start.isSuccess()){ @@ -118,6 +189,9 @@ } } } } } } } src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -228,7 +228,7 @@ } } String url = MES_URL + "loadComplete"; String url = MES_URL + "issueCompleteFit"; String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result)); if (!StringUtils.isEmpty(response) && response.contains("Success")) { MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class); src/main/java/com/zy/common/model/LocTypeDto.java
@@ -1,6 +1,7 @@ package com.zy.common.model; import com.alibaba.fastjson.JSON; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.BasDevp; import lombok.Data; @@ -25,15 +26,20 @@ public LocTypeDto() { } public LocTypeDto(BasDevp basDevp) { if (basDevp.getLocType2() == null || basDevp.getLocType2() == 0) { public LocTypeDto(BasDevp basDevp,String barcode) { if (basDevp.getLocType1() == null || basDevp.getLocType1() == 0) { throw new CoolException("plc高低检测异常"); } if (basDevp.getLocType2() == 1) { if (basDevp.getLocType1() == 1) { this.locType1 = 1; // 低库位 } else { this.locType1 = 2; // 高库位 } if (!Cools.isEmpty(barcode)&&barcode.substring(0,1).equals("4")){ this.locType2 = 1; }else if (!Cools.isEmpty(barcode)&&barcode.substring(0,1).equals("5")){ this.locType2 = 2; } log.info(JSON.toJSONString(this)); } src/main/java/com/zy/common/service/CommonService.java
@@ -170,11 +170,16 @@ throw new CoolException("入库请求库位失败:路径不存在" + staDescId +"," + sourceStaNo); } Short locType1 = 1; LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("loc_type1", locType1).orderBy("lev1").orderBy("bay1").orderBy("row1")); LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>() .eq("loc_sts", "O") .eq("loc_type1", locTypeDto.getLocType1()) .eq("loc_type2", locTypeDto.getLocType2()) .orderBy("lev1") .orderBy("bay1") .orderBy("row1")); if (locMast == null) { log.error("入库请求库位失败:无库位" + locType1); throw new CoolException("入库请求库位失败:无库位" + locType1); log.error("入库请求库位失败:无库位" + locTypeDto.getLocType1()); throw new CoolException("入库请求库位失败:无库位" + locTypeDto.getLocType1()); } StartupDto startupDto = new StartupDto(); src/main/java/com/zy/common/web/WcsController.java
@@ -90,9 +90,9 @@ } // 源站点状态检测 // BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true); // sourceStaNo.setLocType2(param.getLocType1()); LocTypeDto locTypeDto = new LocTypeDto(); BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true); sourceStaNo.setLocType1(param.getLocType1()); LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo,param.getBarcode()); StartupDto dto = null; switch (param.getIoType()) { @@ -156,7 +156,7 @@ EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam(); emptyPlateOutParam.setOutSite(12); emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locMast.getLocNo()+"");}}); WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,50); WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,50,""); return R.ok(!Cools.isEmpty(wrkMast)? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败")); } src/main/resources/application-dev.yml
@@ -1,5 +1,5 @@ server: port: 8083 port: 8084 servlet: context-path: /@pom.build.finalName@ @@ -12,7 +12,7 @@ driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver username: sa password: sa@123 url: jdbc:sqlserver://127.0.0.1:1433;databasename=jnejc-ljqwms url: jdbc:sqlserver://127.0.0.1:1433;databasename=jnejc-hkwms # username: sa # password: Skyouc#23 # url: jdbc:sqlserver://192.168.4.24:1433;databasename=jsxswms @@ -138,7 +138,7 @@ #海康对接 hik: switch: false switch: true url: http://172.26.11.98:80/ #华晓对接 src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@ var baseUrl = "/ljqwms"; var baseUrl = "/hkwms"; // 详情窗口-高度 var detailHeight = '80%';