自动化立体仓库 - WCS系统
luxiaotao1123
2021-01-13 44bddde6414f5c7565c21ef510c6c63dbc0971c3
#test
8个文件已修改
166 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/CrnController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/CrnDemoParam.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/CrnSlave.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/css/crn.css 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/crn.html 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -216,6 +216,7 @@
        return R.ok().add(str.toString());
    }
    @PostMapping("/demo/switch")
    @ManagerAuth(memo = "堆垛机演示")
    public R crnDemo(CrnDemoParam param) throws InterruptedException {
@@ -229,11 +230,17 @@
            return R.error("口令错误");
        }
        Thread.sleep(200L);
        mainService.crnDemoOfLocMove(param.getCrnId());
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            if (crnSlave.getId().equals(param.getCrnId())) {
                crnSlave.setDemo(param.getOpt());
            }
        }
//        mainService.crnDemoOfLocMove(param.getCrnId());
        return R.ok();
    }
    /****************************************************************/
    /************************** 手动操作 ******************************/
    /****************************************************************/
src/main/java/com/zy/asrs/domain/param/CrnDemoParam.java
@@ -15,4 +15,6 @@
    // 密码口令
    private String password;
    private Boolean opt;
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1222,4 +1222,93 @@
        }
    }
    /**
     * 堆垛机演示  ===>> 库位移转
     */
    public synchronized void crnDemoOfLocMove1(){
        for (CrnSlave crn : slaveProperties.getCrn()) {
            if (!crn.getDemo()) { continue; }   // 必须为演示状态
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            // 只有当堆垛机空闲 并且 无任务时才继续执行
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                // 获取移库工作档信息
                WrkMast wrkMast = wrkMastMapper.selectLocMove(crn.getId());
                if (null != wrkMast) { continue; }
                LocMast sourceLoc = locMastService.queryDemoSourceLoc(crn.getId());
                LocMast loc = locMastService.queryDemoLoc(crn.getId());
                if (null == sourceLoc || null == loc) { continue; }
                String sourceLocNo = sourceLoc.getLocNo();
                String locNo = loc.getLocNo();
                // 获取工作号
                int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
                // 保存工作档
                wrkMast = new WrkMast();
                wrkMast.setWrkNo(workNo);
                wrkMast.setIoTime(new Date());
                wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
                wrkMast.setIoType(11); // 入出库状态: 11.库格移载
                wrkMast.setIoPri(13D);
                wrkMast.setCrnNo(crn.getId());
                wrkMast.setSourceLocNo(sourceLocNo); // 源库位
                wrkMast.setLocNo(locNo); // 目标库位
                wrkMast.setFullPlt("N"); // 满板:Y
                wrkMast.setPicking("N"); // 拣料
                wrkMast.setExitMk("N"); // 退出
                wrkMast.setEmptyMk(sourceLoc.getLocSts().equals("D")?"Y":"N"); // 空板
                wrkMast.setBarcode(sourceLoc.getBarcode()); // 托盘码
                wrkMast.setLinkMis("N");
                wrkMast.setAppeTime(new Date());
                wrkMast.setModiTime(new Date());
                int res = wrkMastMapper.insert(wrkMast);
                if (res == 0) {
                    throw new CoolException("保存工作档失败");
                }
                // 工作档明细保存
                List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", sourceLocNo));
                for (LocDetl locDetl : locDetls) {
                    WrkDetl wrkDetl = new WrkDetl();
                    wrkDetl.setWrkNo(workNo);
                    wrkDetl.setIoTime(new Date());
                    wrkDetl.setAnfme(locDetl.getAnfme());
                    VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制
                    wrkDetl.setAppeTime(new Date());
                    wrkDetl.setModiTime(new Date());
                    if (!wrkDetlService.insert(wrkDetl)) {
                        throw new CoolException("保存工作档明细失败");
                    }
                }
                // 修改源库位状态
                if (sourceLoc.getLocSts().equals("D") || sourceLoc.getLocSts().equals("F")) {
                    sourceLoc.setLocSts("R"); // R.出库预约
                    sourceLoc.setModiTime(new Date());
                    if (!locMastService.updateById(sourceLoc)){
                        throw new CoolException("更新源库位状态失败");
                    }
                } else {
                    throw new CoolException("源库位出库失败");
                }
                // 修改目标库位状态
                if (loc.getLocSts().equals("O")) {
                    loc.setLocSts("S"); // S.入库预约
                    loc.setModiTime(new Date());
                    if (!locMastService.updateById(loc)) {
                        throw new CoolException("更新目标库位状态失败");
                    }
                } else {
                    throw new CoolException("移转失败");
                }
            }
        }
    }
}
src/main/java/com/zy/core/MainProcess.java
@@ -39,6 +39,9 @@
                        continue;
                    }
                    // 演示
                    mainService.crnDemoOfLocMove1();
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile(); // 组托
                    mainService.generateStoreWrkFile0(); // WMS入库
src/main/java/com/zy/core/model/CrnSlave.java
@@ -20,6 +20,8 @@
    private Integer offset;
    private Boolean demo;
    // 堆垛机入库站点
    private List<CrnStn> crnInStn = new ArrayList<>();
src/main/resources/application.yml
@@ -50,6 +50,7 @@
    slot: 1
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
@@ -87,6 +88,7 @@
    slot: 1
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
src/main/webapp/static/css/crn.css
@@ -40,7 +40,7 @@
.crn-command-item input {
    vertical-align: middle;
    outline: none;
    width: 70%;
    width: 60%;
}
/* 右 */
src/main/webapp/views/crn.html
@@ -44,18 +44,20 @@
<!-- 日志监控板 -->
<div class="log-board">
    <!-- 执行命令 -->
    <!-- 执行命令 -->
    <div class="command-log">
        <h2>执行中的命令</h2>
        <div class="crn-command-item">
            <label>1#</label>
<!--            <button id="demoBtn-1" class="demoBtn" onclick="demoSwitch(this.id)">演示</button>-->
                        <span>&nbsp;</span>
            <button id="demoBtn-1" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>
            <!--            <span>&nbsp;</span>-->
            <input id="crn1" disabled="disabled">
        </div>
        <div class="crn-command-item">
            <label>2#</label>
<!--            <button id="demoBtn-2" class="demoBtn" onclick="demoSwitch(this.id)">演示</button>-->
                        <span>&nbsp;</span>
            <button id="demoBtn-2" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>
            <!--            <span>&nbsp;</span>-->
            <input id="crn2" disabled="disabled">
        </div>
    </div>
@@ -229,6 +231,7 @@
    setInterval(function () {
        getCrnOutput();
        operatorBlockShow();
        initDemo();
    },500);
    // 判断手动操作模块是否可用
@@ -550,22 +553,45 @@
        crnOutputDom.scrollTop = crnOutputDom.scrollHeight;
    }
    // function demoSwitch(el) {
    //     var crnId = el.split("-")[1];
    //     layer.prompt({title: '请输入口令,并开始'+crnId+"号堆垛机演示", formType: 1, shadeClose: true}, function (pass, idx) {
    //         layer.close(idx);
    //         doDemo(crnId, pass); // 停止wcs系统
    //     });
    // }
    var crnDemoData;
    function initDemo() {
        $.ajax({
            url: baseUrl+"/crn/demo/status",
            async: false,
            method: 'GET',
            success: function (res) {
                if (res.code === 200) {
                    crnDemoData = res.data;
                    crnDemoData.forEach(function (e) {
                        $("#demoBtn-"+e.crnNo).html(e.demo?'停止':'演示');
                    })
                } else if (res.code === 403){
                    parent.location.href = baseUrl+"/login";
                }  else {
                    layer.msg(res.msg, {icon: 2});
                }
            }
        })
    }
    function demoSwitch(el) {
        var crnId = el.split("-")[1];
        layer.confirm(crnId + ' 号堆垛机确定开始演示吗?', function(){
            doDemo(crnId, 'root'); // 停止wcs系统
        var opt;
        if (crnDemoData == null) {
            initDemo();
        }
        for (var i = 0; i<crnDemoData.length; i++) {
            if (Number(crnDemoData[i].crnNo) === Number(crnId)) {
                opt = !crnDemoData[i].demo;
            }
        }
        layer.confirm(crnId + ' 号堆垛机确定'+ (opt?'开始':'停止') + '演示吗?', function(){
            doDemo(crnId, 'root', opt); // 停止wcs系统
        });
    }
    function doDemo(crnId, password) {
    function doDemo(crnId, password, opt) {
        // 加载tips
        var index = layer.load(1, {
            shade: [0.1,'#fff']
@@ -576,7 +602,8 @@
            // async: false,
            data: {
                crnId: Number(crnId),
                password: password
                password: password,
                opt: opt
            },
            method: 'POST',
            success: function (res) {