自动化立体仓库 - WMS系统
zwl
1 天以前 757f103f37d83dfb55bb49b3df0b805cb520d4f7
第三版
21个文件已修改
2个文件已添加
582 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MobileController.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WaitPakinController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WorkController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocMast.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WaitPakin.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CombParam.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/RCSTaskStatusParam.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WorkService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/NewWay/AutoEmptyOutTaskscheduler.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/NewWay/AutomaticallyAssignInTasksToRCSScheduler.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/NewWay/AutomaticallyAssignOutTasksToRCSScheduler.java 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/waitPakin/waitPakin.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pakStore/locDetlQuery.html 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/waitPakin/waitPakin.html 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -168,22 +168,25 @@
    /**
     * 出库确认 - 扫托盘码
     * 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();
    }
@@ -477,6 +480,19 @@
        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);
@@ -516,7 +532,7 @@
        if(bool){
            return R.ok(noww);
        }else {
            return R.error("下发任务失败");
            return R.error(msg);
        }
    }
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -1,15 +1,18 @@
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;
@@ -36,6 +39,8 @@
    private OpenService openService;
    @Autowired
    private LocMastServiceImpl locMastService;
    @Autowired
    private WrkMastServiceImpl wrkMastService;
    @PostMapping("/order/matSync/default/v1")
    @AppAuth(memo = "商品信息同步接口")
@@ -243,13 +248,127 @@
        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();
    }
src/main/java/com/zy/asrs/controller/WaitPakinController.java
@@ -113,6 +113,19 @@
        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){
src/main/java/com/zy/asrs/controller/WorkController.java
@@ -101,7 +101,7 @@
    @RequestMapping("/empty/plate/out/start")
    @ManagerAuth(memo = "空板出库")
    public R emptyPlateOutStart(EmptyPlateOutParam param) {
        workService.emptyPlateOut(param, getUserId());
        workService.emptyPlateOut("",param, getUserId());
        return R.ok("出库启动成功");
    }
src/main/java/com/zy/asrs/entity/LocMast.java
@@ -94,6 +94,11 @@
    @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;
@@ -185,11 +190,6 @@
    @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;
src/main/java/com/zy/asrs/entity/WaitPakin.java
@@ -27,6 +27,10 @@
    @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;
@@ -105,10 +109,6 @@
    @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;
@@ -155,10 +155,13 @@
    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);
        }
src/main/java/com/zy/asrs/entity/param/CombParam.java
@@ -9,6 +9,16 @@
 */
@Data
public class CombParam {
    //组
    private String group;
    //通道
    private Integer channel;
    private Integer status;
    private Integer groupId;
    //packNo    是    字符串    PACK码
    private String packNo;
@@ -35,7 +45,10 @@
    // 库位编号
    private String locNo;
    private Integer channel;
    //组托agv源站点
    private String staNo;
    private List<CombMat> combMats;
src/main/java/com/zy/asrs/entity/param/RCSTaskStatusParam.java
New file
@@ -0,0 +1,19 @@
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;
    }
}
src/main/java/com/zy/asrs/service/WorkService.java
@@ -45,7 +45,7 @@
    /**
     * 空板出库
     */
    void emptyPlateOut(EmptyPlateOutParam param, Long userId);
    void emptyPlateOut(String agvSourceSite,EmptyPlateOutParam param, Long userId);
    /**
     * 盘点出库
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -161,7 +161,8 @@
                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)) {
@@ -214,6 +215,10 @@
                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("保存入库通知档失败");
                }
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -423,7 +423,7 @@
    @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("站点不存在");
        }
@@ -454,7 +454,7 @@
            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
@@ -466,6 +466,7 @@
            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("保存工作档失败");
src/main/java/com/zy/asrs/task/NewWay/AutoEmptyOutTaskscheduler.java
New file
@@ -0,0 +1,72 @@
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);
        }
    }
}
src/main/java/com/zy/asrs/task/NewWay/AutomaticallyAssignInTasksToRCSScheduler.java
@@ -1,6 +1,7 @@
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;
@@ -9,6 +10,9 @@
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;
@@ -34,15 +38,26 @@
    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;
        }
        //找到正在等待的组托数据
@@ -51,13 +66,40 @@
        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);
//                }
            }
    }
}
src/main/java/com/zy/asrs/task/NewWay/AutomaticallyAssignOutTasksToRCSScheduler.java
@@ -4,16 +4,23 @@
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
@@ -27,27 +34,55 @@
    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);
                }
            }
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -511,7 +511,7 @@
                            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);
                            }
@@ -534,7 +534,7 @@
                            return FAIL.setMsg("空板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                        }else{
                            // 修改工作主档状态
                            wrkMast.setWrkSts(15L);
                            wrkMast.setWrkSts(30L);//等待给agv下发空板搬运任务
                        }
                    }
                    break;
src/main/java/com/zy/common/service/CommonService.java
@@ -143,82 +143,47 @@
        // 更新库位排号
        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("没有空库位");
        }
src/main/java/com/zy/common/web/WcsController.java
@@ -103,6 +103,13 @@
                }
            }
        }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);
@@ -162,6 +169,7 @@
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setMemo(waitPakins.get(0).getMemo());//agv取货点
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
src/main/resources/application.yml
@@ -12,7 +12,7 @@
    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
src/main/resources/mapper/LocDetlMapper.xml
@@ -91,6 +91,9 @@
        <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>
src/main/webapp/static/js/common.js
@@ -232,7 +232,7 @@
    ,{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}
@@ -249,11 +249,12 @@
    ,{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}
]
src/main/webapp/static/js/waitPakin/waitPakin.js
@@ -16,7 +16,8 @@
                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;
}
@@ -324,6 +325,16 @@
                   });
                }
                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;
        }
    });
src/main/webapp/views/pakStore/locDetlQuery.html
@@ -69,7 +69,12 @@
        </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>
        <!-- 日期范围 -->
src/main/webapp/views/waitPakin/waitPakin.html
@@ -51,10 +51,13 @@
</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>