#
luxiaotao1123
2021-01-04 da7d75a235969e1fcc55d55189f8d30867ea1cfc
#
8个文件已修改
171 ■■■■ 已修改文件
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 138 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/css/crn.css 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/crn.html 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -13,6 +13,9 @@
@Repository
public interface LocMastMapper extends BaseMapper<LocMast> {
    @Select("select distinct row1 from asr_loc_mast where crn_no = #{crnNo}")
    List<Integer> queryDistinctRow(@Param("crnNo")Integer crnNo);
    LocMast queryFreeLocMast(@Param("row") Integer row, @Param("locType1") Short locType1);
    @Select("select loc_no from asr_loc_mast where 1=1 and loc_sts = 'O' and crn_no = #{crnNo}")
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -11,6 +11,8 @@
@Repository
public interface WrkMastMapper extends BaseMapper<WrkMast> {
    WrkMast selectByLocNo(@Param("sourceLocNo") String sourceLocNo);
//    @Select("select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 ) and io_type <> 103 and io_type <> 104 and io_type <> 107 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,io_time,wrk_no")
    List<WrkMast> selectToBeCompleteData();
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -8,6 +8,11 @@
public interface LocMastService extends IService<LocMast> {
    /**
     * 堆垛机对应的排号集合
     */
    List<Integer> queryDistinctRow(Integer crnNo);
    /**
     * 检索可用库位
     */
    LocMast queryFreeLocMast(Integer row, Short locType1);
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -13,6 +13,11 @@
public class LocMastServiceImpl extends ServiceImpl<LocMastMapper, LocMast> implements LocMastService {
    @Override
    public List<Integer> queryDistinctRow(Integer crnNo) {
        return this.baseMapper.queryDistinctRow(crnNo);
    }
    @Override
    public LocMast queryFreeLocMast(Integer row, Short locType1) {
        return this.baseMapper.queryFreeLocMast(row, locType1);
    }
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -11,6 +11,7 @@
import com.zy.asrs.mapper.WaitPakinMapper;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.asrs.utils.VersionUtils;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.MatDto;
@@ -112,9 +113,10 @@
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing() && staProtocol.isLoading()
//                        && staProtocol.isInEnable()
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() == 0
                        && staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
                    // 判断重复工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
                    if (wrkMast != null) {
@@ -155,7 +157,6 @@
                        wrkMast.setExitMk("N"); // 退出
                        wrkMast.setEmptyMk("N"); // 空板
                        wrkMast.setLinkMis("N");
//                    wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
                        // 操作人员数据
                        wrkMast.setAppeTime(new Date());
                        wrkMast.setModiTime(new Date());
@@ -177,7 +178,6 @@
                        // 命令下发区 --------------------------------------------------------------------------
                        // 更新站点信息 且 下发plc命令
                        barcodeThread.setBarcode("");
                        staProtocol.setWorkNo((short) workNo);
@@ -187,8 +187,6 @@
                        if (!result) {
                            throw new CoolException("更新plc站点信息失败");
                        }
                    } catch (Exception e) {
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -574,6 +572,35 @@
                    continue;
                }
                // 双深库位且浅库位有货,则需先对浅库位进行库位移转
                if (Utils.isDeepLoc(slaveProperties, wrkMast.getLocNo())) {
                    String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getLocNo());
                    LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                    // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                    if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                        WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                        if (null == waitWrkMast) {
                            log.error("{}库位异常,未检索到相应工作档!", shallowLocNo);
                        } else {
                            waitWrkMast.setIoPri(15D);
                            waitWrkMast.setModiTime(new Date());
                            if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                                log.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
                            }
                        }
                        continue;
                    } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                        // 此标记避免多次执行移库任务
                        if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())) {
                            wrkMast.setUpdMk("Y");
                            wrkMastMapper.updateById(wrkMast);
                            // 生成工作档、改变浅库位的源库/目标库 库位状态、下发堆垛机命令(立马执行)
                            moveLocForDeepLoc(slave, shallowLoc);
                        }
                        continue;
                    }
                }
                // 1.堆垛机开始移动
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
@@ -606,7 +633,7 @@
     * 库位移转
     */
    @Async
    public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol){
    public synchronized void locToLoc(CrnSlave slave, CrnProtocol crnProtocol){
        // 获取工作档信息
        WrkMast wrkMast = wrkMastMapper.selectLocMove(slave.getId());
        if (null == wrkMast) {
@@ -700,11 +727,6 @@
                    crnThread.setResetFlag(true);
                }
                // 完成通知档
//                if (wrkMastMapper.updateWaitPakInStep2(wrkMast.getBarcode()) == 0) {
//                    log.error("入库通知档修改结束状态失败,workNo=[{}]", wrkMast.getWrkNo());
//                }
            }
        }
    }
@@ -750,7 +772,7 @@
                                    wrkMast.getSourceStaNo(),    // 源站
                                    wrkMast.getSourceLocNo(),    // 源库位
                                    wrkMast.getBarcode(),    // 条码
                                    crnProtocol.getAlarm1().intValue(),    // 异常码
                                    crnProtocol.getAlarm1(),    // 异常码
                                    errName,    // 异常
                                    1,    // 异常情况
                                    now,    // 添加时间
@@ -760,7 +782,7 @@
                                    "任务中异常"    // 备注
                            );
                            if (!basErrLogService.insert(basErrLog)) {
                                log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), crnError.getErrName());
                                log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName);
                            }
                        }
                    } else {
@@ -797,7 +819,7 @@
                                    null,    // 源站
                                    null,    // 源库位
                                    null,    // 条码
                                    crnProtocol.getAlarm1().intValue(),    // 异常码
                                    crnProtocol.getAlarm1(),    // 异常码
                                    errName,    // 异常
                                    1,    // 异常情况
                                    now,    // 添加时间
@@ -1038,6 +1060,94 @@
    }
    /**
     * 因双深库位阻塞,对浅库位进行移转(立即执行版)
     * tip:同步
     */
    private void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc){
        List<Integer> rows = locMastService.queryDistinctRow(crn.getId());
        LocMast loc = null;
        for (Integer row : rows) {
            if (Utils.isDeepLoc(slaveProperties, row)) {
                loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1());
                if (null != loc) { break; }
            }
        }
        if (null == loc) {
            for (Integer row : rows) {
                if (Utils.isShallowLoc(slaveProperties, row)) {
                    loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1());
                    if (null != loc) { break; }
                }
            }
        }
        if (null == loc) {
            throw new CoolException("双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo());
        }
        // 获取工作号
        int workNo = commonService.getWorkNo(0);
        // 保存工作档
        WrkMast 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(shallowLoc.getLocNo()); // 源库位
        wrkMast.setLocNo(loc.getLocNo()); // 目标库位
        wrkMast.setFullPlt(shallowLoc.getFullPlt()); // 满板
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D")?"Y":"N"); // 空板
        wrkMast.setBarcode(shallowLoc.getBarcode()); // 托盘码
        wrkMast.setLinkMis("N");
        wrkMast.setAppeTime(new Date());
        wrkMast.setModiTime(new Date());
        int res = wrkMastMapper.insert(wrkMast);
        if (res == 0) {
            throw new CoolException("保存工作档失败");
        }
        // 工作档明细保存
        if (shallowLoc.getLocSts().equals("F")) {
            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", shallowLoc.getLocNo()));
            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 (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) {
            shallowLoc.setLocSts("R"); // R.出库预约
            shallowLoc.setModiTime(new Date());
            if (!locMastService.updateById(shallowLoc)){
                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("移转失败");
        }
    }
    /**
     * 堆垛机演示  ===>> 库位移转
     */
    @Async
src/main/resources/mapper/WrkMastMapper.xml
@@ -62,6 +62,10 @@
    </resultMap>
    <select id="selectByLocNo">
        select top 1 * from asr_wrk_mast where source_loc_no = #{sourceLocNo}
    </select>
    <select id="selectToBeCompleteData" resultMap="BaseResultMap">
        select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 ) and io_type != 103 and io_type != 104 and io_type != 107 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,io_time,wrk_no
    </select>
src/main/webapp/static/css/crn.css
@@ -40,7 +40,7 @@
.crn-command-item input {
    vertical-align: middle;
    outline: none;
    width: 60%;
    width: 70%;
}
/* 右 */
src/main/webapp/views/crn.html
@@ -48,14 +48,14 @@
        <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>
@@ -185,8 +185,8 @@
                <button class="item" onclick="take()">出库</button>
                <button class="item" onclick="stockMove()">库位转移</button>
                <button class="item" onclick="siteMove()">站到站</button>
                <button class="item" onclick="bacOrigin()">回原点</button>
                <button class="item" onclick="reverseOrigin()">反原点</button>
<!--                <button class="item" onclick="bacOrigin()">回原点</button>-->
<!--                <button class="item" onclick="reverseOrigin()">反原点</button>-->
<!--                <button class="item" onclick="coorMove()">坐标移行</button>-->
                <button class="item" onclick="taskComplete()">任务完成</button>
<!--                <button class="item" onclick="pause()">暂停</button>-->