| | |
| | | */ |
| | | @RequestMapping("/AGVMove") |
| | | public R AGVMove(@RequestParam(required = false) String sourceStaNo |
| | | ,@RequestParam(required = false) String staNo){ |
| | | RCSParam rcsParam = new RCSParam(); |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); |
| | | String formattedDate = now.format(formatter); // 格式化日期时间 |
| | | //网络流水号 |
| | | rcsParam.setReqId(now.toString()); |
| | | //应用标识 |
| | | rcsParam.setClientId("WMS"); |
| | | //通知时间 |
| | | rcsParam.setReqTime(formattedDate); |
| | | RCSParam.DataBody dataBody=new RCSParam.DataBody(); |
| | | //任务号 |
| | | dataBody.setId(formattedDate); |
| | | ,@RequestParam(required = false) String staNo |
| | | ,Integer priority){ |
| | | String noww="aa" + new Date().getTime(); |
| | | |
| | | List<RCSParam.TaskBody> taskBodyList=new ArrayList<>(); |
| | | RCSParam.TaskBody taskBody=new RCSParam.TaskBody(); |
| | | //取货类型 |
| | | taskBody.setType("load"); |
| | | taskBody.setStation(sourceStaNo); |
| | | taskBodyList.add(taskBody); |
| | | LinkedHashMap<String,Object> rcsParam=new LinkedHashMap<>(); |
| | | rcsParam.put("task_id",noww); |
| | | rcsParam.put("start_location",sourceStaNo); |
| | | rcsParam.put("start_command",1); |
| | | rcsParam.put("target_location",staNo); |
| | | rcsParam.put("target_command",2); |
| | | rcsParam.put("priority",1);//优先级越小先执行 |
| | | rcsParam.put("robot_type",1);//车 辆 类 型 0:XC 1:XCD 2:XP_T 3:XP_L |
| | | rcsParam.put("MoverID","XCD"); |
| | | |
| | | RCSParam.TaskBody taskBody1=new RCSParam.TaskBody(); |
| | | //放货类型 |
| | | taskBody1.setType("unload"); |
| | | taskBody1.setStation(staNo); |
| | | taskBodyList.add(taskBody1); |
| | | |
| | | dataBody.setTasks(taskBodyList); |
| | | rcsParam.setData(dataBody); |
| | | LinkedHashMap<String,Object> map=new LinkedHashMap<>(); |
| | | map.put("data",rcsParam); |
| | | String response =""; |
| | | Boolean bool =false; |
| | | |
| | | String msg = ""; |
| | | try { |
| | | log.info("wms派发搬运任务给AGV搬运={}", rcsParam); |
| | | response = new HttpHandler.Builder() |
| | | // .setHeaders(headParam) |
| | | .setUri(url) |
| | | .setPath(attrcs) |
| | | .setJson(JSON.toJSONString(rcsParam)) |
| | | .setJson(JSON.toJSONString(map)) |
| | | .build() |
| | | .doPost(); |
| | | JSONObject jsonObject = JSON.parseObject(response); |
| | | if(jsonObject.getBoolean("IsSuccess")){ |
| | | JSONObject data = jsonObject.getJSONObject("data"); |
| | | JSONObject errInfo = jsonObject.getJSONObject("err_info"); |
| | | if(data.getInteger("result")==0){ |
| | | bool = true; |
| | | }else{ |
| | | msg=errInfo.getString("err_msg"); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("wms派发搬运任务给AGV搬运失败返回值={}", response); |
| | |
| | | , url + attrcs |
| | | , null |
| | | , "127.0.0.1" |
| | | , JSON.toJSONString(rcsParam) |
| | | , JSON.toJSONString(map) |
| | | , response |
| | | , bool |
| | | ); |
| | | } |
| | | |
| | | if(bool){ |
| | | return R.ok(); |
| | | return R.ok(noww); |
| | | }else { |
| | | return R.error("下发任务失败"); |
| | | } |
| | |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @ApiModelProperty(value= "RCS任务") |
| | | @TableField("item_num") |
| | | private String itemNum; |
| | | |
| | | @ApiModelProperty(value= "托盘条码") |
| | | private String zpallet; |
| | | |
| | |
| | | @ApiModelProperty(value= "生产日期") |
| | | @TableField("manu_date") |
| | | private String manuDate; |
| | | |
| | | @ApiModelProperty(value= "品项数") |
| | | @TableField("item_num") |
| | | private String itemNum; |
| | | |
| | | @ApiModelProperty(value= "安全库存量") |
| | | @TableField("safe_qty") |
| | |
| | | @TableField("ctn_type") |
| | | private Integer ctnType; |
| | | |
| | | @ApiModelProperty(value= "") |
| | | @ApiModelProperty(value= "RCS工作号") |
| | | private String packed; |
| | | |
| | | @ApiModelProperty(value= "") |
| | |
| | | } |
| | | |
| | | Integer outSta = staNo.getDevNo(); |
| | | //2号堆垛机全板出库站指定为103 |
| | | if(locMast.getCrnNo()==2){ |
| | | outSta = 103; |
| | | //出库站点为205, |
| | | }else if(staNo.getDevNo()==205){ |
| | | |
| | | } |
| | | |
| | | // 获取路径 |
| | | StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta); |
| | |
| | | wrkMast.setIoPri(13D); // 优先级:13 |
| | | wrkMast.setCrnNo(locMast.getCrnNo()); |
| | | wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站 |
| | | wrkMast.setStaNo(staDesc.getStnNo()); // 目标站 |
| | | wrkMast.setStaNo(104); // 目标站 |
| | | wrkMast.setSourceLocNo(dto.getLocNo()); // 源库位 |
| | | wrkMast.setFullPlt("Y"); // 满板:Y |
| | | wrkMast.setPicking("N"); // 拣料 |
| | |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiUser(userId); |
| | | wrkMast.setModiTime(now); |
| | | wrkMast.setMemo(outSta+""); |
| | | if (!wrkMastService.insert(wrkMast)) { |
| | | throw new CoolException("保存工作档失败,出库库位号:"+dto.getLocNo()); |
| | | } |
| | |
| | | if (!Cools.isEmpty(waitPakin)) { |
| | | waitPakin.setIoStatus("N"); |
| | | waitPakin.setLocNo(""); |
| | | waitPakin.setZpallet(""); |
| | | boolean result = waitPakinService.update(waitPakin, new EntityWrapper<WaitPakin>() |
| | | .eq("zpallet", wrkMast.getBarcode())); |
| | | } |
| | |
| | | * 自动派发入库任务给RCS |
| | | */ |
| | | @Scheduled(cron = "0/3 * * * * ? ") |
| | | private void execute(){ |
| | | private synchronized void execute(){ |
| | | //查看是否有agv在做的任务 |
| | | WaitPakin waitPakin1=waitPakinService.selectOne(new EntityWrapper<WaitPakin>().eq("be_batch",1)); |
| | | if(waitPakin1!=null){ |
| | |
| | | //该数据进行0转1 |
| | | WaitPakin waitPakin=waitPakinService.selectOne(new EntityWrapper<WaitPakin>().eq("be_batch",0)); |
| | | if(waitPakin!=null){ |
| | | R r=mobileController.AGVMove(waitPakin.getMemo(),100+""); |
| | | R r=mobileController.AGVMove(waitPakin.getMemo(),6001+"",1); |
| | | if (r.get("code").equals(200)){ |
| | | waitPakin.setBeBatch(1);//0转1 |
| | | waitPakinService.update(waitPakin,new EntityWrapper<WaitPakin>().eq("manu",waitPakin.getManu())); |
| | | R r1=mobileController.AGVMove(6001+"",waitPakin.getMemo(),2); |
| | | if (r1.get("code").equals(200)){ |
| | | waitPakin.setItemNum(r.get("msg")+""); |
| | | waitPakin.setBeBatch(1);//0转1 |
| | | waitPakinService.update(waitPakin,new EntityWrapper<WaitPakin>().eq("manu",waitPakin.getManu())); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.zy.asrs.task.NewWay; |
| | | |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.common.R; |
| | | import com.zy.asrs.controller.MobileController; |
| | | import com.zy.asrs.entity.WaitPakin; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import com.zy.asrs.service.impl.WaitPakinServiceImpl; |
| | | import com.zy.asrs.task.handler.WorkMastHandler; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * Created by vincent on 2020/7/7 |
| | | */ |
| | | @Component |
| | | public class AutomaticallyAssignOutTasksToRCSScheduler { |
| | | |
| | | private static final Logger log = LoggerFactory.getLogger(AutomaticallyAssignOutTasksToRCSScheduler.class); |
| | | |
| | | @Autowired |
| | | private WrkMastService wrkMastService; |
| | | @Autowired |
| | | private MobileController mobileController; |
| | | |
| | | /** |
| | | * 自动派发入库任务给RCS |
| | | */ |
| | | @Scheduled(cron = "0/3 * * * * ? ") |
| | | private synchronized void execute(){ |
| | | //查看是否有agv在做的任务 |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_sts", 15)); |
| | | if(!Cools.isEmpty(wrkMast)){ |
| | | return; |
| | | } |
| | | //找到出库任务 |
| | | //将任务档状态从30转15 |
| | | WrkMast wrkMast1 =wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_sts", 30)); |
| | | if(wrkMast1!=null){ |
| | | R r=mobileController.AGVMove(wrkMast1.getMemo()+"","6002",3); |
| | | if (r.get("code").equals(200)){ |
| | | R r1=mobileController.AGVMove("6002",wrkMast1.getMemo()+"",4); |
| | | if (r1.get("code").equals(200)){ |
| | | wrkMast1.setWrkSts(15L); |
| | | wrkMast1.setPacked(r.get("msg")+"");//RCS 工作号 |
| | | wrkMastService.updateById(wrkMast1); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import com.zy.asrs.utils.PostMesDataUtils; |
| | | import com.zy.common.utils.HttpHandler; |
| | | import com.zy.system.entity.Config; |
| | | import com.zy.system.service.ConfigService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | |
| | | private PackQualifiedService packQualifiedService; |
| | | @Autowired |
| | | private ReportQueryMapper reportQueryMapper; |
| | | @Autowired |
| | | private ConfigService configService; |
| | | |
| | | public ReturnT<String> start(WrkMast wrkMast) { |
| | | // 4.入库完成 |
| | |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]"); |
| | | }else{ |
| | | //出库标记 |
| | | packQualifiedService.insertPackQualified(false,new Date(),wrkDetls101.get(0).getMatnr()); |
| | | //2.出库完成上报 |
| | | CombParam combParam = new CombParam(); |
| | | combParam.setPackNo(wrkDetls101.get(0).getMatnr()); |
| | | combParam.setLocNo(wrkMast.getLocNo()); |
| | | combParam.setBarcode(wrkMast.getBarcode()); |
| | | //目标站206出库 |
| | | if(wrkMast.getStaNo()==206){ |
| | | combParam.setPackSts(1);//OK |
| | | combParam.setStepSts(7);//测试库出库完成 |
| | | }else if(wrkMast.getStaNo()==204){//NG 出库 |
| | | //NG出库修改测试档的状态为5.已移库 |
| | | TestMast testMast=testMastService.selectOne(new EntityWrapper<TestMast>() |
| | | .eq("user_id",wrkMast.getBarcode()) |
| | | .eq("barcode",wrkDetls101.get(0).getMatnr())); |
| | | combParam.setPackSts(2);//NG |
| | | combParam.setStepSts(8);//NG出库完成 |
| | | testMast.setStatus(5); |
| | | if(!testMastService.update(testMast,new EntityWrapper<TestMast>() |
| | | .eq("user_id",wrkMast.getBarcode()) |
| | | .eq("barcode",wrkDetls101.get(0).getMatnr()))){ |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | return FAIL.setMsg("全板出库 ===>> 修改测试表状态为5失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]"); |
| | | } |
| | | }else if(wrkMast.getStaNo()==103){//目标站103出库 |
| | | combParam.setPackSts(1);//OK |
| | | combParam.setStepSts(6);//静置库出库完成 |
| | | Config config=configService.selectOne(new EntityWrapper<Config>().eq("code","OutTask")); |
| | | if(config.getValue().equals("Y")){ |
| | | // 修改工作主档状态 |
| | | wrkMast.setWrkSts(30L);//等待上报 |
| | | }else{ |
| | | wrkMast.setWrkSts(15L); |
| | | } |
| | | combParam.setRequestTime(DateUtils.convert(now)); |
| | | // new PostMesDataUtils().postMesData("MES系统",mesUrl,inpath,combParam); |
| | | |
| | | } |
| | | } |
| | | break; |
| | |
| | | // exceptionHandle("空板出库 ===>> 修改源库位状态失败;[workNo={0}],[sourceLocNo={1}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo()); |
| | | TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); |
| | | return FAIL.setMsg("空板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]"); |
| | | }else{ |
| | | // 修改工作主档状态 |
| | | wrkMast.setWrkSts(15L); |
| | | } |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | // 修改工作主档状态 |
| | | wrkMast.setWrkSts(15L); |
| | | |
| | | wrkMast.setModiTime(now); |
| | | if (!wrkMastService.updateById(wrkMast)) { |
| | | // exceptionHandle("更新出库完成状态失败;[workNo={0}]", wrkMast.getWrkNo()); |
| | |
| | | return R.error("条码不能为空"); |
| | | } |
| | | waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode())); |
| | | if (Cools.isEmpty(waitPakins) || waitPakins.size() !=1) { |
| | | List<WaitPakin> beBatch = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("be_batch", 1)); |
| | | if(beBatch.size() > 1){ |
| | | return R.error("组托档中有多条搬运任务"); |
| | | }else if(Cools.isEmpty(beBatch)){ |
| | | return R.error("组托档中没有搬运任务"); |
| | | } |
| | | if (Cools.isEmpty(waitPakins)) { |
| | | WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode()); |
| | | if (wrkMast != null || waitPakins.size() !=1) { |
| | | if (wrkMast != null) { |
| | | return R.parse("600-重复组托"); |
| | | } |
| | | return R.parse(CodeRes.NO_COMB_700); |
| | | } |
| | | int countWait = waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("zpallet",param.getBarcode()) |
| | | .eq("io_status", "Y")); |
| | | int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode())); |
| | | int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode())); |
| | | if (countLoc > 0 || countWrk > 0 || countWait > 0) { |
| | | if (!Cools.isEmpty(waitPakins.get(0).getDeadWarn()) && waitPakins.get(0).getDeadWarn()!=0){ |
| | | return R.error(CodeRes.EXIST_500); |
| | | for (WaitPakin waitPakin : beBatch) { |
| | | waitPakin.setZpallet(param.getBarcode()); |
| | | waitPakinService.update(waitPakin,new EntityWrapper<WaitPakin>().eq("be_batch",1)); |
| | | } |
| | | }else { |
| | | int countWait = waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("zpallet",param.getBarcode()) |
| | | .eq("io_status", "Y")); |
| | | int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode())); |
| | | int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode())); |
| | | if (countLoc > 0 || countWrk > 0 || countWait > 0) { |
| | | if (!Cools.isEmpty(waitPakins.get(0).getDeadWarn()) && waitPakins.get(0).getDeadWarn()!=0){ |
| | | return R.error(CodeRes.EXIST_500); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | if (Cools.isEmpty(param.getLocType1())){ |
| | | param.setLocType1((short)1); |
| | |
| | | locMast.setModiTime(now); |
| | | if (!locMastService.updateById(locMast)){ |
| | | throw new CoolException("改变库位状态失败"); |
| | | }else{ |
| | | if (locMast.getRow1()<2){ |
| | | //1.扫码上报 |
| | | CombParam combParam = new CombParam(); |
| | | combParam.setPackNo(waitPakins.get(0).getMatnr()); |
| | | combParam.setBarcode(wrkMast.getBarcode()); |
| | | combParam.setLocNo(wrkMast.getLocNo()); |
| | | combParam.setPackSts(0); |
| | | combParam.setStepSts(1); |
| | | combParam.setRequestTime(DateUtils.convert(now)); |
| | | // new PostMesDataUtils().postMesData("MES系统",mesUrl,inpath,combParam); |
| | | } |
| | | } |
| | | } else { |
| | | throw new CoolException(dto.getLocNo()+"目标库位已被占用"); |
| | |
| | | server: |
| | | port: 8081 |
| | | port: 8083 |
| | | servlet: |
| | | context-path: /@pom.build.finalName@ |
| | | # tomcat: |
| | |
| | | enabled: false |
| | | datasource: |
| | | driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver |
| | | url: jdbc:sqlserver://127.0.0.1:50948;databasename=dlzasrs |
| | | url: jdbc:sqlserver://178.18.1.200:1433;databasename=jxtlfasrs |
| | | # url: jdbc:sqlserver://10.12.55.200:1433;databasename=zjfnasrs |
| | | username: sa |
| | | password: sa@123 |
| | |
| | | doubleLocs: 3 |
| | | # 一个堆垛机负责的货架排数 |
| | | groupCount: 3 |
| | | workIssued : 1 |
| | | url: 1 |
| | | |
| | | # MES系统 |
| | | mes: |
| | |
| | | #RCS |
| | | rcs: |
| | | address: |
| | | url: http://192.168.3.102:16001 |
| | | url: http://178.18.1.220:50001 |
| | | #任务下发地址 |
| | | attrcs: 3CLOUD/Kingdee.BOS.WebApi.ServicesStub. |
| | | attrcs: rbrainrobot/create_task |