| | |
| | | |
| | | /** |
| | | * 出库确认 - 扫托盘码 |
| | | * 1.全板 返回 101 |
| | | * 2.拣料 返回 103 |
| | | * 31.全板出库等待下架 -->32.等待AGV搬运空板回库 |
| | | */ |
| | | @RequestMapping("/pakout/confirm/barcode/auth") |
| | | @ManagerAuth |
| | | public R pakoutQueryByBarcode(@RequestParam(required = false) String barcode){ |
| | | if (Cools.isEmpty(barcode)) { |
| | | return R.ok(); |
| | | public R pakoutQueryByBarcode(@RequestParam(required = false) String barcode, |
| | | @RequestParam(required = false) String staNo){ |
| | | if (Cools.isEmpty(barcode)||Cools.isEmpty(staNo)) { |
| | | return R.error("托盘码或者AGV站点不能为空"); |
| | | } |
| | | WrkMast wrkMast = wrkMastService.selectByBarcode(barcode); |
| | | if (wrkMast != null) { |
| | | List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo()); |
| | | // 去除已出库确认的明细 |
| | | wrkDetls.removeIf(wrkDetl -> wrkDetl.getInspect() != null && wrkDetl.getInspect() != 0); |
| | | return R.ok().add(Cools.add("wrkNo", wrkMast.getWrkNo()).add("ioType", wrkMast.getIoType()).add("list", wrkDetls)); |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode", barcode).eq("io_type", 101)); |
| | | if (Cools.isEmpty(wrkMast)) { |
| | | return R.error("没有找到该托盘="+barcode+"对应的出库任务"); |
| | | } |
| | | wrkMast.setWrkSts(32L);//32.等待AGV搬运空板回库 |
| | | wrkMast.setMemo(staNo);//AGV取空托盘站点 |
| | | wrkMast.setOveMk("Y"); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | |
| | | return R.ok(); |
| | | } |
| | | |
| | |
| | | rcsParam.put("priority",1);//优先级越小先执行 |
| | | rcsParam.put("robot_type",1);//车 辆 类 型 0:XC 1:XCD 2:XP_T 3:XP_L |
| | | rcsParam.put("MoverID","XCD"); |
| | | String wait_location = ""; |
| | | if(staNo.equals("5001") || staNo.equals("5002") ){ |
| | | wait_location = "4"; |
| | | }else if(staNo.equals("6001") ){ |
| | | wait_location = "122"; |
| | | }else if(staNo.equals("6002") ){ |
| | | wait_location = "120"; |
| | | }else if(staNo.equals("7001") ){ |
| | | wait_location = "120"; |
| | | }else if(staNo.equals("7002") ){ |
| | | wait_location = "120"; |
| | | } |
| | | rcsParam.put("wait_location",wait_location);//任务完成休息站点名称 |
| | | |
| | | LinkedHashMap<String,Object> map=new LinkedHashMap<>(); |
| | | map.put("data",rcsParam); |
| | |
| | | if(bool){ |
| | | return R.ok(noww); |
| | | }else { |
| | | return R.error("下发任务失败"); |
| | | return R.error(msg); |
| | | } |
| | | |
| | | } |
| | |
| | | package com.zy.asrs.controller; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.annotations.AppAuth; |
| | | import com.core.common.*; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.LocMast; |
| | | import com.zy.asrs.entity.TestMast; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.asrs.entity.param.*; |
| | | import com.zy.asrs.service.OpenService; |
| | | import com.zy.asrs.service.impl.LocMastServiceImpl; |
| | | import com.zy.asrs.service.impl.WrkMastServiceImpl; |
| | | import com.zy.common.model.DetlDto; |
| | | import com.zy.common.web.BaseController; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | private OpenService openService; |
| | | @Autowired |
| | | private LocMastServiceImpl locMastService; |
| | | @Autowired |
| | | private WrkMastServiceImpl wrkMastService; |
| | | |
| | | @PostMapping("/order/matSync/default/v1") |
| | | @AppAuth(memo = "商品信息同步接口") |
| | |
| | | if (Cools.isEmpty(param)) { |
| | | return R.parse(BaseRes.PARAM); |
| | | } |
| | | LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("channel", param.getChannel())); |
| | | Integer channel = 0; |
| | | if(param.getGroup().equals("192.168.1.101")){ |
| | | switch (param.getChannel()){ |
| | | case 1: channel = 24; |
| | | break; |
| | | case 2: channel = 23; |
| | | break; |
| | | case 3: channel = 22; |
| | | break; |
| | | case 4: channel = 21; |
| | | break; |
| | | } |
| | | }else if(param.getGroup().equals("192.168.1.102")){ |
| | | switch (param.getChannel()){ |
| | | case 1: channel = 20; |
| | | break; |
| | | case 2: channel = 19; |
| | | break; |
| | | case 3: channel = 18; |
| | | break; |
| | | case 4: channel = 17; |
| | | break; |
| | | } |
| | | }else if(param.getGroup().equals("192.168.1.103")){ |
| | | switch (param.getChannel()){ |
| | | case 1: channel = 16; |
| | | break; |
| | | case 2: channel = 15; |
| | | break; |
| | | case 3: channel = 14; |
| | | break; |
| | | case 4: channel = 13; |
| | | break; |
| | | } |
| | | }else if(param.getGroup().equals("192.168.1.104")){ |
| | | switch (param.getChannel()){ |
| | | case 1: channel = 1; |
| | | break; |
| | | case 2: channel = 2; |
| | | break; |
| | | case 3: channel = 3; |
| | | break; |
| | | case 4: channel = 4; |
| | | break; |
| | | } |
| | | }else if(param.getGroup().equals("192.168.1.105")){ |
| | | switch (param.getChannel()){ |
| | | case 1: channel = 5; |
| | | break; |
| | | case 2: channel = 6; |
| | | break; |
| | | case 3: channel = 7; |
| | | break; |
| | | case 4: channel = 8; |
| | | break; |
| | | } |
| | | }else if(param.getGroup().equals("192.168.1.106")){ |
| | | switch (param.getChannel()){ |
| | | case 1: channel = 9; |
| | | break; |
| | | case 2: channel = 10; |
| | | break; |
| | | case 3: channel = 11; |
| | | break; |
| | | case 4: channel = 12; |
| | | break; |
| | | } |
| | | } |
| | | LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>() |
| | | .eq("channel", channel) |
| | | .eq("loc_sts","F")); |
| | | if (Cools.isEmpty(locMast)) { |
| | | return R.error("没有找到该通道----"+param.getChannel()); |
| | | return R.error("没有找到该通道----"+channel); |
| | | } |
| | | // 产品状态{0:无,1:待测,2:测试中;3.测试完成;4.测试失败;5.静置中;6:静置完成;7:暂停测试;8:紧急出库;} |
| | | locMast.setPackStatus(param.getPackSts()); |
| | | locMast.setPackStatus(param.getStatus()); |
| | | locMast.setModiTime(new Date()); |
| | | locMastService.updateById(locMast); |
| | | return R.ok(); |
| | | } |
| | | |
| | | /** |
| | | * 获取agv状态 |
| | | * @param param |
| | | * @return |
| | | * 0:已验证 1:等待分配 2:已分配 3:取货中 4:已取 |
| | | * 货 5:放货中 6:已放货 7:完成 8.任务失败 9.任务取消 10.任务异常 |
| | | * 只接受7.完成的任务状态 |
| | | * 9.任务取消重新发送移动任务 |
| | | */ |
| | | @PostMapping("/rbrainrobot/post_task_state") |
| | | // @AppAuth(memo = "PACK信息下发") |
| | | public synchronized R postTaskState(@RequestBody(required = false) RCSTaskStatusParam param) { |
| | | log.info("AGV任务反馈={}",param); |
| | | if(Cools.isEmpty(param.getData().getTask_id())) { |
| | | return R.error("RCS任务号不能为空"); |
| | | } |
| | | if(Cools.isEmpty(param.getData().getTask_state())) { |
| | | return R.error("RCS工作状态不能为空"); |
| | | } |
| | | //任务完成更新补空板完成任务 |
| | | //任务完成更新出库完成任务 |
| | | if(param.getData().getTask_state()==7) { |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("packed", param.getData().getTask_id())); |
| | | |
| | | if(Cools.isEmpty(wrkMast)) { |
| | | return R.ok(); |
| | | } |
| | | |
| | | if(wrkMast.getIoType()==110) { |
| | | wrkMast.setWrkSts(15L);//出库任务转历史档 |
| | | wrkMastService.updateById(wrkMast); |
| | | }else if(wrkMast.getIoType()==101) { |
| | | wrkMast.setWrkSts(34L);//AGV搬运空托盘回库完成,等待空板入库后转历史档、 |
| | | wrkMastService.updateById(wrkMast); |
| | | } |
| | | |
| | | }else if (param.getData().getTask_state()==9){ |
| | | |
| | | } |
| | | |
| | | return R.ok(); |
| | | } |
| | | |
| | |
| | | return R.ok(); |
| | | } |
| | | |
| | | @RequestMapping(value = "/hand/control/complete1") |
| | | @ManagerAuth |
| | | @Transactional |
| | | public R complete(@RequestParam String zpallet){ |
| | | WaitPakin waitPakin = waitPakinService.selectOne(new EntityWrapper<WaitPakin>().eq("zpallet", zpallet)); |
| | | if (Cools.isEmpty(waitPakin)){ |
| | | return R.error("没有找到该托盘码="+zpallet+"对应的组托档"); |
| | | } |
| | | waitPakin.setBeBatch(0);//从1--》0重新下发agv搬运任务 |
| | | waitPakinService.update(waitPakin,new EntityWrapper<WaitPakin>().eq("zpallet", zpallet)); |
| | | return R.ok(); |
| | | } |
| | | |
| | | @RequestMapping(value = "/waitPakin/export/auth") |
| | | @ManagerAuth |
| | | public R export(@RequestBody JSONObject param){ |
| | |
| | | @RequestMapping("/empty/plate/out/start") |
| | | @ManagerAuth(memo = "空板出库") |
| | | public R emptyPlateOutStart(EmptyPlateOutParam param) { |
| | | workService.emptyPlateOut(param, getUserId()); |
| | | workService.emptyPlateOut("",param, getUserId()); |
| | | return R.ok("出库启动成功"); |
| | | } |
| | | |
| | |
| | | @TableField("loc_type1") |
| | | private Short locType1; |
| | | |
| | | // 产品状态{0:空闲,1:待测,2:测试中;3.测试完成;4.测试失败;} |
| | | @ApiModelProperty(value= "") |
| | | @TableField("pack_status") |
| | | private Integer packStatus; |
| | | |
| | | @ApiModelProperty(value= "通道:1、2、3、4、5、6") |
| | | @TableField("loc_type2") |
| | | private Short locType2; |
| | |
| | | @ApiModelProperty(value= "") |
| | | @TableField("fire_status") |
| | | private Integer fireStatus; |
| | | |
| | | // 产品状态{0:空闲,1:待测,2:测试中;3.测试完成;4.测试失败;} |
| | | @ApiModelProperty(value= "") |
| | | @TableField("pack_status") |
| | | private Integer packStatus; |
| | | |
| | | @ApiModelProperty(value= "通道") |
| | | private Integer channel; |
| | |
| | | @ApiModelProperty(value= "数量") |
| | | private Double anfme; |
| | | |
| | | @ApiModelProperty(value= "agv任务下发 : 0:待下发 1:下发成功 2:任务完成") |
| | | @TableField("be_batch") |
| | | private Integer beBatch; |
| | | |
| | | @ApiModelProperty(value= "库位号") |
| | | @TableField("loc_no") |
| | | private String locNo; |
| | |
| | | @TableField("supp_code") |
| | | private String suppCode; |
| | | |
| | | @ApiModelProperty(value= "agv任务下发 : 0:待下发 1:下发成功 2:任务完成") |
| | | @TableField("be_batch") |
| | | private Integer beBatch; |
| | | |
| | | @ApiModelProperty(value= "保质期") |
| | | @TableField("dead_time") |
| | | private String deadTime; |
| | |
| | | public String getBeBatch$(){ |
| | | if (null == this.beBatch){ return null; } |
| | | switch (this.beBatch){ |
| | | case 1: |
| | | return "是"; |
| | | case 0: |
| | | return "否"; |
| | | return "等待呼叫agv"; |
| | | case 1: |
| | | return "呼叫agv入库搬运成功"; |
| | | case 2: |
| | | return "agv入库搬运成功"; |
| | | |
| | | default: |
| | | return String.valueOf(this.beBatch); |
| | | } |
| | |
| | | */ |
| | | @Data |
| | | public class CombParam { |
| | | //组 |
| | | private String group; |
| | | |
| | | //通道 |
| | | private Integer channel; |
| | | |
| | | private Integer status; |
| | | |
| | | private Integer groupId; |
| | | |
| | | //packNo 是 字符串 PACK码 |
| | | private String packNo; |
| | | |
| | |
| | | // 库位编号 |
| | | private String locNo; |
| | | |
| | | private Integer channel; |
| | | //组托agv源站点 |
| | | private String staNo; |
| | | |
| | | |
| | | |
| | | private List<CombMat> combMats; |
| | | |
New file |
| | |
| | | package com.zy.asrs.entity.param; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class RCSTaskStatusParam { |
| | | private Ddata data; |
| | | |
| | | @Data |
| | | public class Ddata { |
| | | private String task_id; |
| | | private Integer task_state; |
| | | private String state_name; |
| | | private String agv_ip; |
| | | private Integer start_command; |
| | | private Integer target_command; |
| | | private String agv_name; |
| | | } |
| | | } |
| | |
| | | /** |
| | | * 空板出库 |
| | | */ |
| | | void emptyPlateOut(EmptyPlateOutParam param, Long userId); |
| | | void emptyPlateOut(String agvSourceSite,EmptyPlateOutParam param, Long userId); |
| | | |
| | | /** |
| | | * 盘点出库 |
| | |
| | | waitPakin.setAppeTime(now); |
| | | waitPakin.setModiUser(userId); |
| | | waitPakin.setModiTime(now); |
| | | waitPakin.setMemo(param.getBarcode());//AGV源站 |
| | | waitPakin.setZpallet(param.getBarcode());//托盘码 |
| | | waitPakin.setMemo(param.getStaNo());//AGV源站 |
| | | waitPakin.setBeBatch(0);//AGV 任务等待下发 |
| | | waitPakin.setManu(now.getTime()+"");//唯一码 |
| | | if (!waitPakinService.insert(waitPakin)) { |
| | |
| | | waitPakin.setAppeTime(now); |
| | | waitPakin.setModiUser(userId); |
| | | waitPakin.setModiTime(now); |
| | | waitPakin.setZpallet(param.getBarcode());//托盘码 |
| | | waitPakin.setMemo(param.getStaNo());//AGV源站 |
| | | waitPakin.setBeBatch(0);//AGV 任务等待下发 |
| | | waitPakin.setManu(now.getTime()+"");//唯一码 |
| | | if (!waitPakinService.insert(waitPakin)) { |
| | | throw new CoolException("保存入库通知档失败"); |
| | | } |
| | |
| | | |
| | | @Override |
| | | @Transactional |
| | | public void emptyPlateOut(EmptyPlateOutParam param, Long userId) { |
| | | public void emptyPlateOut(String agvSourceSite,EmptyPlateOutParam param, Long userId) { |
| | | if (Cools.isEmpty(param.getOutSite())) { |
| | | throw new CoolException("站点不存在"); |
| | | } |
| | |
| | | wrkMast.setIoType(110); // 入出库状态: 110.空板出库 |
| | | wrkMast.setIoPri(10D); |
| | | wrkMast.setSourceStaNo(sourceStaNo); // 源站 |
| | | wrkMast.setStaNo(param.getOutSite()); // 目标站 |
| | | wrkMast.setStaNo(102); // 目标站 |
| | | wrkMast.setCrnNo(locMast.getCrnNo()); |
| | | wrkMast.setSourceLocNo(locNo); // 源库位 |
| | | wrkMast.setFullPlt("N"); // 满板:Y |
| | |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiUser(userId); |
| | | wrkMast.setModiTime(now); |
| | | wrkMast.setMemo(Cools.isEmpty(agvSourceSite) ? "" : agvSourceSite); |
| | | boolean res = wrkMastService.insert(wrkMast); |
| | | if (!res) { |
| | | throw new CoolException("保存工作档失败"); |
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.LocMast; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.asrs.entity.param.EmptyPlateOutParam; |
| | | import com.zy.asrs.service.WorkService; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import com.zy.asrs.service.impl.LocMastServiceImpl; |
| | | import com.zy.system.entity.Config; |
| | | import com.zy.system.service.ConfigService; |
| | | 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; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * Created by vincent on 2020/7/7 |
| | | */ |
| | | @Component |
| | | public class AutoEmptyOutTaskscheduler { |
| | | |
| | | private static final Logger log = LoggerFactory.getLogger(AutoEmptyOutTaskscheduler.class); |
| | | |
| | | @Autowired |
| | | private WrkMastService wrkMastService; |
| | | @Autowired |
| | | private MobileController mobileController; |
| | | @Autowired |
| | | private LocMastServiceImpl locMastService; |
| | | @Autowired |
| | | private WorkService workService; |
| | | @Autowired |
| | | private ConfigService configService; |
| | | |
| | | /** |
| | | * 自动生成空板出库任务给RCS |
| | | */ |
| | | @Scheduled(cron = "0/3 * * * * ? ") |
| | | private synchronized void execute(){ |
| | | List<WrkMast> wrkMastsEmpty = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type",110)); |
| | | if (!Cools.isEmpty(wrkMastsEmpty)){ |
| | | return; |
| | | } |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 1).ge("wrk_sts", 3)); |
| | | if (!Cools.isEmpty(wrkMast)){ |
| | | //生成空板出库任务 |
| | | EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam(); |
| | | emptyPlateOutParam.setOutSite(102); |
| | | List<String> strings= new ArrayList<>(); |
| | | |
| | | //查看空板 |
| | | List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").orderBy("row1",true)); |
| | | if (Cools.isEmpty(locMasts)){ |
| | | log.error("中转库没有空板!!!!"); |
| | | return; |
| | | } |
| | | //获取空栈板库位 |
| | | strings.add(locMasts.get(0).getLocNo()); |
| | | emptyPlateOutParam.setLocNos(strings); |
| | | emptyPlateOutParam.setOutSite(Integer.valueOf(wrkMast.getMemo())); |
| | | workService.emptyPlateOut(wrkMast.getMemo(),emptyPlateOutParam, 9955L); |
| | | } |
| | | } |
| | | } |
| | |
| | | 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.service.impl.WaitPakinServiceImpl; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import com.zy.asrs.task.handler.WorkMastHandler; |
| | | import com.zy.common.service.CommonService; |
| | | import com.zy.system.entity.Config; |
| | | import com.zy.system.service.ConfigService; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | private WaitPakinServiceImpl waitPakinService; |
| | | @Autowired |
| | | private MobileController mobileController; |
| | | @Autowired |
| | | private ConfigService configService; |
| | | |
| | | /** |
| | | * 自动派发入库任务给RCS |
| | | */ |
| | | @Scheduled(cron = "0/3 * * * * ? ") |
| | | private synchronized void execute(){ |
| | | Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "Instatus").eq("value", "Y")); |
| | | if(Cools.isEmpty(config)){ |
| | | return; |
| | | } |
| | | //查看是否有agv在做的任务 |
| | | WaitPakin waitPakin1=waitPakinService.selectOne(new EntityWrapper<WaitPakin>().eq("be_batch",1)); |
| | | WaitPakin waitPakin1=waitPakinService.selectOne(new EntityWrapper<WaitPakin>().ge("be_batch",1)); |
| | | if(waitPakin1!=null){ |
| | | return; |
| | | } |
| | | //查看是否有空板补到产线的任务 |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 110)); |
| | | if (!Cools.isEmpty(wrkMast)){ |
| | | return; |
| | | } |
| | | //找到正在等待的组托数据 |
| | |
| | | if(waitPakin!=null){ |
| | | R r=mobileController.AGVMove(waitPakin.getMemo(),6001+"",1); |
| | | if (r.get("code").equals(200)){ |
| | | R r1=mobileController.AGVMove(6001+"",waitPakin.getMemo(),2); |
| | | if (r1.get("code").equals(200)){ |
| | | // 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())); |
| | | } |
| | | waitPakin.setModiTime(new Date()); |
| | | config.setValue("N");//N是入库后切换成空板出库 |
| | | configService.updateById(config); |
| | | waitPakinService.update(waitPakin,new EntityWrapper<WaitPakin>().eq("zpallet",waitPakin.getZpallet())); |
| | | // } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 自动派发空托盘回库任务 |
| | | */ |
| | | @Scheduled(cron = "0/3 * * * * ? ") |
| | | private synchronized void execute1(){ |
| | | //wrk_sts 32.等待AGV搬运空板回库 |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 101).eq("wrk_sts", 32)); |
| | | if (Cools.isEmpty(wrkMast)){ |
| | | return; |
| | | } |
| | | |
| | | R r=mobileController.AGVMove(wrkMast.getMemo(),6002+"",1); |
| | | if (r.get("code").equals(200)){ |
| | | // R r1=mobileController.AGVMove(6001+"",waitPakin.getMemo(),2); |
| | | // if (r1.get("code").equals(200)){ |
| | | wrkMast.setPacked(r.get("msg")+""); |
| | | wrkMast.setWrkSts(33L);//33.AGV搬运空托盘回库下发成功 |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | // } |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | import com.core.common.Cools; |
| | | import com.core.common.R; |
| | | import com.zy.asrs.controller.MobileController; |
| | | import com.zy.asrs.entity.BasDevp; |
| | | import com.zy.asrs.entity.WaitPakin; |
| | | import com.zy.asrs.entity.WrkMast; |
| | | import com.zy.asrs.service.WrkMastService; |
| | | import com.zy.asrs.service.impl.BasDevpServiceImpl; |
| | | import com.zy.asrs.service.impl.LocMastServiceImpl; |
| | | import com.zy.asrs.service.impl.WaitPakinServiceImpl; |
| | | import com.zy.asrs.task.handler.WorkMastHandler; |
| | | import com.zy.system.entity.Config; |
| | | import com.zy.system.service.ConfigService; |
| | | 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; |
| | | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * Created by vincent on 2020/7/7 |
| | |
| | | private WrkMastService wrkMastService; |
| | | @Autowired |
| | | private MobileController mobileController; |
| | | @Autowired |
| | | private LocMastServiceImpl locMastService; |
| | | @Autowired |
| | | private BasDevpServiceImpl basDevpService; |
| | | @Autowired |
| | | private ConfigService configService; |
| | | |
| | | /** |
| | | * 自动派发入库任务给RCS |
| | | * 自动派发出库任务给RCS |
| | | */ |
| | | @Scheduled(cron = "0/3 * * * * ? ") |
| | | private synchronized void execute(){ |
| | | Config config = configService.selectOne(new EntityWrapper<Config>() |
| | | .eq("code", "Instatus") |
| | | .eq("value", "N")); |
| | | if(Cools.isEmpty(config)){ |
| | | return; |
| | | } |
| | | //查看是否有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); |
| | | String sourceSite="6002"; |
| | | if (wrkMast1.getStaNo()==102){ |
| | | sourceSite="6001"; |
| | | } |
| | | BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("autoing","Y").eq("loading","Y").gt("wrk_no",0)); |
| | | if(Cools.isEmpty(basDevp)){ |
| | | return; |
| | | } |
| | | log.info("给AGV下发ioType={}出库任务,源站点={},目标站点={}",wrkMast1.getIoType(),sourceSite,wrkMast1.getMemo()); |
| | | R r=mobileController.AGVMove(sourceSite,wrkMast1.getMemo(),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 工作号 |
| | | // R r1=mobileController.AGVMove("6002",wrkMast1.getMemo(),4); |
| | | if (r.get("code").equals(200)){ |
| | | if(wrkMast1.getIoType()==110){ |
| | | wrkMast1.setWrkSts(41L);//下发agv搬运任务完成--》产线补空板 |
| | | wrkMast1.setPacked(r.get("msg")+"");//RCS 工作号 |
| | | config.setValue("Y");//Y是空板出库库后切换成组托入库 |
| | | configService.insert(config); |
| | | }else{ |
| | | wrkMast1.setWrkSts(31L);//下发给agv搬运任务完成-->出库到分拣区 |
| | | } |
| | | wrkMast1.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast1); |
| | | } |
| | | } |
| | |
| | | Config config=configService.selectOne(new EntityWrapper<Config>().eq("code","OutTask")); |
| | | if(config.getValue().equals("Y")){ |
| | | // 修改工作主档状态 |
| | | wrkMast.setWrkSts(30L);//等待上报 |
| | | wrkMast.setWrkSts(30L);//等待给agv下发空板搬运任务 |
| | | }else{ |
| | | wrkMast.setWrkSts(15L); |
| | | } |
| | |
| | | return FAIL.setMsg("空板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]"); |
| | | }else{ |
| | | // 修改工作主档状态 |
| | | wrkMast.setWrkSts(15L); |
| | | wrkMast.setWrkSts(30L);//等待给agv下发空板搬运任务 |
| | | } |
| | | } |
| | | break; |
| | |
| | | // 更新库位排号 |
| | | rowLastno.setCurrentRow(curRow); |
| | | rowLastnoService.updateById(rowLastno); |
| | | |
| | | if (crnNo==1){ |
| | | LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>() |
| | | .eq("loc_sts", "F") |
| | | .eq("loc_type1", (short) 3));//待测库位 |
| | | LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>() |
| | | if(staDescId==1){ |
| | | List<LocMast> locMast1 = locMastService.selectList(new EntityWrapper<LocMast>() |
| | | .eq("loc_sts", "O") |
| | | .eq("loc_type1", (short) 1));//测试库位 |
| | | if (!Cools.isEmpty(locMast1)||Cools.isEmpty(locMast2)){ |
| | | List<LocMast> locMasts=locMastService.selectList(new EntityWrapper<LocMast>() |
| | | .eq("loc_sts", "O").eq("loc_type1", (short) 3) |
| | | .orderBy("row1",false).orderBy("bay1",true)); |
| | | if(!Cools.isEmpty(locMasts)){ |
| | | locMast = locMasts.get(0); |
| | | }else{ |
| | | throw new CoolException("没有待测库位无法入库!!!"); |
| | | } |
| | | .eq("loc_type1", (short) 3)//待测库位 |
| | | .orderBy("row1",true) |
| | | .orderBy("bay1",true)); |
| | | List<LocMast> locMast2 = locMastService.selectList(new EntityWrapper<LocMast>() |
| | | .eq("loc_sts", "O") |
| | | .eq("loc_type1", (short) 1)//测试库位 |
| | | .orderBy("row1",true) |
| | | .orderBy("bay1",true)); |
| | | if (Cools.isEmpty(locMast1) || Cools.isEmpty(locMast2)) { |
| | | throw new CoolException("没有待测和测试库位无法入库!!!"); |
| | | } |
| | | } |
| | | // 靠近摆放规则 --- 空托 |
| | | if (staDescId == 10) { |
| | | List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").ge("row1", sRow).le("row1", eRow)); |
| | | if (locMasts.size() > 0) { |
| | | for (LocMast loc : locMasts) { |
| | | if (Utils.isShallowLoc(slaveProperties, loc.getLocNo())) { |
| | | continue; |
| | | } |
| | | String shallowLocNo = Utils.getShallowLoc(slaveProperties, loc.getLocNo()); |
| | | // 检测目标库位是否为空库位 |
| | | LocMast shallowLoc = locMastService.selectById(shallowLocNo); |
| | | if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) { |
| | | if (shallowLoc.getLocType1()<locTypeDto.getLocType1()){ |
| | | continue; |
| | | } |
| | | if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) { |
| | | locMast = shallowLoc; |
| | | crnNo = locMast.getCrnNo(); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | if(!Cools.isEmpty(locMast2)){ |
| | | locMast=locMast2.get(0); |
| | | }else if(!Cools.isEmpty(locMast1)){ |
| | | locMast=locMast1.get(0); |
| | | } |
| | | if (Cools.isEmpty(locMast)) { |
| | | List<LocMast> locMastList3 = locMastService.selectList(new EntityWrapper<LocMast>() |
| | | .eq("loc_sts", "O") |
| | | .eq("row1",3) |
| | | .notIn("loc_type1",1)); |
| | | if (!Cools.isEmpty(locMastList3)) { |
| | | locMast = locMastList3.get(0); |
| | | }else { |
| | | List<LocMast> locMastList1 = locMastService.selectList(new EntityWrapper<LocMast>() |
| | | .eq("loc_sts", "O") |
| | | .eq("row1",1) |
| | | .notIn("loc_type1",1)); |
| | | if (!Cools.isEmpty(locMastList1)) { |
| | | locMast = locMastList1.get(0); |
| | | } |
| | | } |
| | | }else if(staDescId==10){ |
| | | List<LocMast> locMast1 = locMastService.selectList(new EntityWrapper<LocMast>() |
| | | .eq("loc_sts", "O") |
| | | .eq("loc_type1", (short) 3)//待测库位 |
| | | .orderBy("row1",true) |
| | | .orderBy("bay1",true)); |
| | | List<LocMast> locMast2 = locMastService.selectList(new EntityWrapper<LocMast>() |
| | | .eq("loc_sts", "O") |
| | | .eq("loc_type1", (short) 1)//测试库位 |
| | | .orderBy("row1",true) |
| | | .orderBy("bay1",true)); |
| | | if (Cools.isEmpty(locMast1) || Cools.isEmpty(locMast2)) { |
| | | throw new CoolException("没有待测和测试库位无法入空托!!!"); |
| | | } |
| | | if(!Cools.isEmpty(locMast1)){ |
| | | locMast=locMast1.get(0); |
| | | }else if(!Cools.isEmpty(locMast2)){ |
| | | locMast=locMast2.get(0); |
| | | } |
| | | } |
| | | |
| | | if (Cools.isEmpty(locMast)){ |
| | | locMast = locMastService.queryFreeLocMast(1, locTypeDto.getLocType1()); |
| | | // // 开始查找库位 ==============================> |
| | | // int ruleId = Integer.parseInt(Parameter.get().getFindLocRule()); |
| | | // if (whsType != 1) { |
| | | // locMast = locMastService.queryFreeLocMast(curRow, locTypeDto.getLocType1()); |
| | | // } else if (ruleId == 1) { //按测试设备排序,优先排满单台设备 |
| | | // locMast = locMastService.queryFreeLocMast1(curRow, locTypeDto.getLocType1(), channelMax + 1); |
| | | // } else if (ruleId == 2) { //按通道排序,均匀分配每台设备 |
| | | // Short locType2 = getLocType2Small(curRow, locTypeDto.getLocType1()); |
| | | // locMast = locMastService.queryFreeLocMast2(curRow, locTypeDto.getLocType1(), locType2); |
| | | // } else { //默认规则 |
| | | // locMast = locMastService.queryFreeLocMast(curRow, locTypeDto.getLocType1()); |
| | | // } |
| | | } |
| | | |
| | | if (Cools.isEmpty(locMast)) { |
| | | throw new CoolException("没有空库位"); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | }else if (param.getIoType() == 10 && !Cools.isEmpty(param.getBarcode())) { |
| | | WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode()); |
| | | if (wrkMast != null) { |
| | | wrkMast.setWrkSts(15L); |
| | | wrkMast.setModiTime(new Date()); |
| | | wrkMastService.updateById(wrkMast); |
| | | } |
| | | } |
| | | if (Cools.isEmpty(param.getLocType1())){ |
| | | param.setLocType1((short)1); |
| | |
| | | // 操作人员数据 |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiTime(now); |
| | | wrkMast.setMemo(waitPakins.get(0).getMemo());//agv取货点 |
| | | boolean res = wrkMastService.insert(wrkMast); |
| | | if (!res) { |
| | | throw new CoolException("保存工作档失败"); |
| | |
| | | enabled: false |
| | | datasource: |
| | | driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver |
| | | url: jdbc:sqlserver://178.18.1.200:1433;databasename=jxtlfasrs |
| | | url: jdbc:sqlserver://178.18.1.201:1433;databasename=jxtlfasrs |
| | | # url: jdbc:sqlserver://10.12.55.200:1433;databasename=zjfnasrs |
| | | username: sa |
| | | password: sa@123 |
| | |
| | | <if test="matnr!=null and matnr!='' "> |
| | | and a.matnr like '%' + #{matnr} + '%' |
| | | </if> |
| | | <if test="zpallet!=null and zpallet!='' "> |
| | | and a.zpallet like '%' + #{zpallet} + '%' |
| | | </if> |
| | | <if test="maktx!=null and maktx!='' "> |
| | | and a.maktx like '%' + #{maktx} + '%' |
| | | </if> |
| | |
| | | ,{field: 'specs', align: 'center',title: '配置', hide: false} |
| | | ,{field: 'model', align: 'center',title: '代码', hide: true} |
| | | ,{field: 'color', align: 'center',title: '颜色', hide: true} |
| | | ,{field: 'brand', align: 'center',title: '品牌', hide: false} |
| | | ,{field: 'brand', align: 'center',title: '品牌', hide: true} |
| | | ,{field: 'unit', align: 'center',title: '单位', hide: true} |
| | | ,{field: 'price', align: 'center',title: '单价', hide: true} |
| | | ,{field: 'sku', align: 'center',title: 'sku', hide: true} |
| | |
| | | ,{field: 'threeCode', align: 'center',title: '箱子尺寸', hide: true} |
| | | ,{field: 'supp', align: 'center',title: '供应商', hide: true} |
| | | ,{field: 'suppCode', align: 'center',title: '供应商编码', hide: true} |
| | | ,{field: 'beBatch$', align: 'center',title: '是否批次', hide: true} |
| | | ,{field: 'beBatch$', align: 'center',title: 'agv状态', hide: false} |
| | | ,{field: 'deadTime', align: 'center',title: '保质期', hide: true} |
| | | ,{field: 'deadWarn', align: 'center',title: '静置时长(分钟)', hide: false} |
| | | ,{field: 'source$', align: 'center',title: '制购', hide: true} |
| | | ,{field: 'check$', align: 'center',title: '要求检验', hide: true} |
| | | ,{field: 'danger$', align: 'center',title: '危险品', hide: true} |
| | | ,{field: 'memo', align: 'center',title: 'agv源站点', hide: false} |
| | | ] |
| | | |
| | |
| | | return html; |
| | | }} |
| | | ,{field: 'modiUser$', align: 'center',title: '修改人员', hide:true} |
| | | ,{field: 'modiTime$', align: 'center',title: '修改时间', hide:true}) |
| | | ,{field: 'modiTime$', align: 'center',title: '修改时间', hide:true} |
| | | ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:250}) |
| | | return cols; |
| | | } |
| | | |
| | |
| | | }); |
| | | } |
| | | break; |
| | | case 'complete': |
| | | layer.confirm('确认重新呼叫agv进行入库搬运?', {title: '托盘码:'+data.zpallet, shadeClose: true}, function(){ |
| | | http.post(baseUrl+"/hand/control/complete1", {zpallet: data.zpallet, type:1}, function (res) { |
| | | $(".layui-laypage-btn")[0].click(); |
| | | layer.msg(data.wrkNo + res.msg); |
| | | }) |
| | | layer.closeAll(); |
| | | |
| | | }); |
| | | break; |
| | | |
| | | } |
| | | }); |
| | |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <div class="layui-input-inline"> |
| | | <input class="layui-input" type="text" name="maktx" placeholder="物料描述" autocomplete="off"> |
| | | <input class="layui-input" type="text" name="maktx" placeholder="物料名称" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <div class="layui-input-inline"> |
| | | <input class="layui-input" type="text" name="zpallet" placeholder="托盘码" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <!-- 日期范围 --> |
| | |
| | | </script> |
| | | |
| | | <script type="text/html" id="operate"> |
| | | <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">详情</a> |
| | | <a class="layui-btn layui-btn-xs btn-edit" lay-event="edit">编辑</a> |
| | | <!-- <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">详情</a>--> |
| | | {{#if (d.beBatch === 1 ) { }} |
| | | <a class="layui-btn layui-btn-danger layui-btn-xs btn-complete" lay-event="complete">重发agv搬运</a> |
| | | {{# } }} |
| | | </script> |
| | | |
| | | |
| | | <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script> |
| | | <script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script> |
| | | <script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script> |