自动化立体仓库 - WMS系统
#
whycq
2024-05-18 fce34ab8e1453d7376de56eca7eff01576e62745
#
8个文件已修改
180 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvMobileController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/AgvWrkMastMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/AgvCommonService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvWrkMast/wrkMast.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvMobileController.java
@@ -41,6 +41,8 @@
    private AgvLocDetlService agvLocDetlService;
    @Autowired
    private AgvWrkMastService agvWrkMastService;
    @Autowired
    private AgvWrkDetlService agvWrkDetlService;
    /*
@@ -416,36 +418,23 @@
        }
        for (HashMap<String, String> map : dbList) {
            String locNo = map.get("locNo");
            String barcode = map.get("barcode");
            //生成工作档
            AgvWrkMast mast = new AgvWrkMast();
            //工作状态
            mast.setWrkSts(22L);
            //入出库类型
            mast.setIoType(ioType);
            mast.setIoTime(now);
            //优先级
            mast.setIoPri(300.0);
            //源站点
            mast.setSourceLocNo(locNo);
            //目标站点
            mast.setLocNo("");
            //容器编码
            mast.setBarcode(barcode);
            //容器类型
            mast.setWhsType(30);
            // 目标楼层
            mast.setCrnNo(floor);
            mast.setAppeUser(getUserId());
            mast.setAppeTime(now);
            mast.setModiUser(getUserId());
            mast.setModiTime(now);
            if (!agvWrkMastService.insertByIncrease(mast)) {
                throw new CoolException("保存工作档失败");
            }
            String barcode = map.get("suppCode");
            AgvWrkMast wrkMast = createWrkMast(ioType, 22L, locNo, "", barcode, now, getUserId(), 30,floor);
            // 同步调拨单
            List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", locNo));
            for (AgvLocDetl agvLocDetl : agvLocDetls) {
                AgvWrkDetl wrkDetl = new AgvWrkDetl();
                wrkDetl.setWrkNo(wrkMast.getWrkNo());
                wrkDetl.sync(agvLocDetl);
                wrkDetl.setSuppCode(agvLocDetl.getSuppCode());
                wrkDetl.setIoTime(now);
                wrkDetl.setAppeUser(getUserId());
                wrkDetl.setAppeTime(now);
                wrkDetl.setModiUser(getUserId());
                wrkDetl.setModiTime(now);
                if (!agvWrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作明细失败");
                }
                // 更新订单
                OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("order_no", "DB" + agvLocDetl.getOrderNo()).eq("matnr", agvLocDetl.getMatnr()).eq("three_code",agvLocDetl.getThreeCode()));
                orderDetl.setQty(orderDetl.getQty() + agvLocDetl.getAnfme());
@@ -454,7 +443,9 @@
                }
            }
            // 更新源库位
            AgvLocMast locMast = agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no", locNo));
            locMast.setLocSts("R");
            agvLocMastService.updateById(locMast);
        }
        return R.ok();
    }
@@ -501,5 +492,41 @@
        System.out.println(agvLocDetls22.equals(agvLocDetls2));
    }
    /*
   生成工作档
    */
    private AgvWrkMast createWrkMast(int ioType, long wrkSts, String sourceLocNo, String locNo, String barcode,  Date now, Long userId, int containerType,int floor){
        AgvWrkMast wrkMast = new AgvWrkMast();
        //工作状态
        wrkMast.setWrkSts(wrkSts);
        //入出库类型
        wrkMast.setIoType(ioType);
        wrkMast.setIoTime(now);
        //优先级
        wrkMast.setIoPri(300.0);
        //源站点
        wrkMast.setSourceLocNo(sourceLocNo);
        //目标站点
        wrkMast.setLocNo(locNo);
        //容器编码
        wrkMast.setBarcode(barcode);
        //容器类型
        wrkMast.setWhsType(containerType);
        // 目标楼层
        wrkMast.setCrnNo(floor);
        wrkMast.setAppeUser(userId);
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (!agvWrkMastService.insertByIncrease(wrkMast)) {
            throw new CoolException("保存工作档失败");
        }
        wrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", locNo).eq("source_loc_no",sourceLocNo));
        return wrkMast;
    }
}
src/main/java/com/zy/asrs/mapper/AgvWrkMastMapper.java
@@ -14,13 +14,14 @@
            "io_pri," +
            "source_loc_no," +
            "loc_no," +
            "crn_no," +
            "barcode," +
            "whs_type," +
            "appe_user," +
            "appe_time," +
            "modi_user," +
            "modi_time) " +
            "VALUES(#{wrkSts},#{ioType},#{ioTime},#{ioPri},#{sourceLocNo},#{locNo},#{barcode},#{whsType},#{appeUser},#{appeTime},#{modiUser},#{modiTime})")
            "VALUES(#{wrkSts},#{ioType},#{ioTime},#{ioPri},#{sourceLocNo},#{locNo},#{crnNo},#{barcode},#{whsType},#{appeUser},#{appeTime},#{modiUser},#{modiTime})")
    public int insertByIncrease(AgvWrkMast agvWrkMast);
}
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -564,7 +564,7 @@
        agvWrkMastService.updateWrkStsByWrkNo(wrkMast.getWrkNo(),205);
        //出库任务 101.出库 || 103.拣料出库 || 107.盘点出库
        if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107){
        if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107 || wrkMast.getIoType() == 111){
            //修改出库站点状态
            agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getLocNo(),"F",wrkMast.getBarcode(),wrkMast.getWhsType().shortValue());
        }
@@ -616,9 +616,13 @@
            String targetLocNo = wrkMast.getLocNo();
            agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo),"",(short)0);
            if (wrkMast.getIoType() == 108) {
                agvLocMastService.updateLocStsByLocNo(targetLocNo,"O","",null);
                if (wrkMast.getWrkSts() != 22) {
                    agvLocMastService.updateLocStsByLocNo(targetLocNo,"O","",null);
                }
            } else {
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(targetLocNo,"O","",wrkMast.getWhsType().shortValue());
                if (wrkMast.getWrkSts() != 22) {
                    agvBasDevpService.updateLocStsAndBarcodeByDevNo(targetLocNo,"O","",wrkMast.getWhsType().shortValue());
                }
            }
            List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", locNo));
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java
@@ -79,6 +79,7 @@
        }
    }
    /*
    定时处理AGV工作档中工作状态为206.出库完成 且 (101.出库 || 110.空板出库)
     */
src/main/java/com/zy/asrs/task/AutoMoveScheduler.java
@@ -3,7 +3,9 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.AgvLocMast;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.service.AgvLocMastService;
import com.zy.asrs.service.AgvWrkMastService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.AutoMoveHandler;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,6 +23,8 @@
    private AgvLocMastService agvLocMastService;
    @Autowired
    private AutoMoveHandler autoMoveHandler;
    @Autowired
    private AgvWrkMastService agvWrkMastService;
    // 调拨出库
    @Scheduled(cron = "0/2 * * * * ? ")
@@ -40,6 +44,38 @@
    }
    // 调拨出库
    @Scheduled(cron = "0/2 * * * * ? ")
    private void execute2(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 22)
                .andNew().eq("io_type",108)
                );
        if (agvWrkMastList.isEmpty()) {
            return;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            ReturnT<String> returnT = autoMoveHandler.start2(agvWrkMast);
        }
    }
    // 调拨出库
    @Scheduled(cron = "0/2 * * * * ? ")
    private void execute3(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 22)
                .andNew().eq("io_type",111)
        );
        if (agvWrkMastList.isEmpty()) {
            return;
        }
        for (AgvWrkMast agvWrkMast : agvWrkMastList) {
            ReturnT<String> returnT = autoMoveHandler.start3(agvWrkMast);
        }
    }
    // 空板自动回库
    @Scheduled(cron = "0/2 * * * * ? ")
    private void autoEmptyBack(){
src/main/java/com/zy/asrs/task/handler/AutoMoveHandler.java
@@ -45,6 +45,17 @@
        return SUCCESS;
    }
    public ReturnT<String> start2(AgvWrkMast agvWrkMast) {
        // locType 1. 自动, 2. 手动
        doAutoMove2(agvWrkMast);
        return SUCCESS;
    }
    public ReturnT<String> start3(AgvWrkMast agvWrkMast) {
        // locType 1. 自动, 2. 手动
        doHandMove2(agvWrkMast);
        return SUCCESS;
    }
    private ReturnT<String> doAutoMove(AgvLocMast agvLocMast) {
        Date now = new Date();
        //查询工作档
@@ -168,6 +179,33 @@
        return SUCCESS;
    }
    private ReturnT<String> doAutoMove2(AgvWrkMast agvWrkMast) {
        Date now = new Date();
        //检索库位,选择合适的库位
        AgvLocMast locMast = agvCommonService.getLocNo(3,agvWrkMast.getCrnNo());
        if (Cools.isEmpty(locMast)) {
            throw new CoolException("暂无库位");
        }
        agvWrkMast.setWrkSts(201L);
        agvWrkMast.setLocNo(locMast.getLocNo());
        agvWrkMastService.updateById(agvWrkMast);
        //更新目标库位状态
        updateAgvLocMast(locMast,"S");
        return SUCCESS;
    }
    private ReturnT<String> doHandMove2(AgvWrkMast agvWrkMast) {
        Date now = new Date();
        AgvBasDevp devpNo = agvCommonService.getDevpNo(3, 1);
        if (Cools.isEmpty(devpNo)) {
            throw new CoolException("暂无空闲接驳位");
        }
        agvWrkMast.setWrkSts(201L);
        agvWrkMast.setLocNo(devpNo.getDevNo());
        agvWrkMastService.updateById(agvWrkMast);
        updateAgvBasDevp(devpNo,"S",null,agvWrkMast.getBarcode());
        return SUCCESS;
    }
    /*
    更新目标库位信息
     */
src/main/java/com/zy/common/service/AgvCommonService.java
@@ -250,7 +250,7 @@
        }
        //找不到库位,抛出异常
        throw new CoolException("该楼层没有空库位");
        throw new CoolException("该楼层没有空接驳位");
    }
    //随机取一个货位
src/main/webapp/static/js/agvWrkMast/wrkMast.js
@@ -24,16 +24,17 @@
            ,{field: 'ioTime$', align: 'center',title: '工作时间',sort: true, width: 160}
            ,{field: 'wrkSts$', align: 'center',title: '工作状态'}
            ,{field: 'ioType$', align: 'center',title: '入出库类型'}
            ,{field: 'ioPri', align: 'center',title: '优先级'}
            ,{field: 'ioPri', align: 'center',title: '优先级',width: 80}
            //,{field: 'sourceStaNo$', align: 'center',title: '源站'}
            //,{field: 'staNo$', align: 'center',title: '目标站'}
            ,{field: 'sourceLocNo', align: 'center',title: '源库位'}
            ,{field: 'locNo', align: 'center',title: '目标库位'}
            //,{field: 'steNo', align: 'center',title: '小车', width: 70}
            ,{field: 'barcode', align: 'center',title: '容器码'}
            ,{field: 'whsType', align: 'center',title: '容器类型'}
            ,{field: 'barcode', align: 'center',title: '容器码',width: 80}
            ,{field: 'whsType', align: 'center',title: '容器类型',width: 90}
            ,{field: 'preHave', align: 'center',title: '先入品', hide: true}
            ,{field: 'takeNone', align: 'center',title: '空操作', hide: true}
            ,{field: 'crnNo', align: 'center',title: '目标楼层', hide: false}
            // ,{field: 'picking', align: 'center',title: '拣料', templet:function(row){
            //         var html = "<input value='picking' type='checkbox' lay-skin='primary' lay-filter='tableCheckbox' table-index='"+row.LAY_TABLE_INDEX+"'";
            //         if(row.picking === 'Y'){html += " checked ";}