自动化立体仓库 - WMS系统
#
whycq
2024-05-14 d9d5c6dd59f2f844a11f70f0bbec4b88a4228351
#
1个文件已添加
10个文件已修改
189 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvMobileController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvWorkController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/LocMoveParam.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvMobileService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWorkService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvWrkMast/wrkMast.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/agvWrkMast/wrkMast.html 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvMobileController.java
@@ -9,20 +9,14 @@
import com.zy.asrs.entity.AgvLocDetl;
import com.zy.asrs.entity.AgvLocMast;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.param.AgvMobileStartPakin;
import com.zy.asrs.entity.param.AgvMobileStartParam;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.PickParam;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.service.*;
import com.zy.common.web.BaseController;
import io.swagger.models.auth.In;
import lombok.Synchronized;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
@@ -370,6 +364,7 @@
    @PostMapping("/agv/v1/locMove")
    @Transactional
    @ManagerAuth(memo = "调拨单任务下发")
    public R agvLocMove(@RequestBody HashMap<String,Object> params){
        String fl = String.valueOf(params.get("floor"));
        short floor =(short)Integer.parseInt(fl.substring(0, 1));
@@ -391,6 +386,14 @@
        return R.ok();
    }
    @PostMapping("/hand/control/locMove")
    @Transactional
    @ManagerAuth(memo = "手动库位转移")
    public R handControlLocMove(@RequestBody LocMoveParam param){
        agvMobileService.handControlLocMove(param, getUserId());
        return R.ok();
    }
    public static void main(String[] args) {
        List<AgvLocDetl> agvLocDetls1 = new ArrayList<>();
        List<AgvLocDetl> agvLocDetls2 = new ArrayList<>();
src/main/java/com/zy/asrs/controller/AgvWorkController.java
@@ -49,7 +49,10 @@
            workService.completeWrkMast(workNo, getUserId());
            return R.ok("工作档已完成");
        } else if (type == 2) {
            workService.cancelWrkMast(workNo, getUserId());
            workService.cancelWrkMast(workNo, getUserId(),2);
            return R.ok("工作档已取消");
        } else if (type == 5) {
            workService.cancelWrkMast(workNo, getUserId(),5);
            return R.ok("工作档已取消");
        }
        return R.ok();
src/main/java/com/zy/asrs/entity/param/LocMoveParam.java
New file
@@ -0,0 +1,11 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class LocMoveParam {
    private String locNo;
    private String floor;
}
src/main/java/com/zy/asrs/service/AgvMobileService.java
@@ -2,6 +2,7 @@
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.LocMoveParam;
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.PickParam;
@@ -34,4 +35,10 @@
    void pakoutEmpty(String devNo);
    /**
     * 手动库位转移
     */
    String handControlLocMove(LocMoveParam param, Long userId);
}
src/main/java/com/zy/asrs/service/AgvWorkService.java
@@ -56,6 +56,6 @@
    /**
     * 手动取消工作档
     */
    void cancelWrkMast(String workNo, Long userId);
    void cancelWrkMast(String workNo, Long userId, Integer type);
}
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java
@@ -4,13 +4,16 @@
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.LocMoveParam;
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.PickParam;
import com.zy.asrs.service.*;
import com.zy.common.model.DetlDto;
import com.zy.common.service.AgvCommonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -48,6 +51,10 @@
    private AgvWorkService agvWorkService;
    @Autowired
    private AgvWrkDetlService agvWrkDetlService;
    @Autowired
    private AgvLocMastService agvLocMastService;
    @Autowired
    private AgvCommonService agvCommonService;
    /*
@@ -354,4 +361,99 @@
    }
    /*
       手动移库
    */
    @Override
    @Transactional
    public String handControlLocMove(LocMoveParam param, Long userId) {
        String fl = String.valueOf(param.getFloor());
        short floor =(short)Integer.parseInt(fl.substring(0, 1));
        Integer ioType = 0;
        AgvLocMast agvLocMast = agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no", param.getLocNo()));
        if (Cools.isEmpty(agvLocMast)) {
            throw new CoolException("当前库位为空,请检查库位!");
        }
//        if (agvLocMast.getLocSts() == "F") {
//            return R.error("当前库位不为在库,或者空货架,不支持移库");
        // 校验楼层
        if (agvLocMast.getLocType1() != 3) { // 不为箱壳区域
            if (agvLocMast.getFloor() != floor) {
                throw new CoolException("当前库位不支持跨楼层转移");
            } else {
                ioType = 11;
            }
        } else {
            ioType = 12;
        }
        Date now = new Date();
        //查询工作档
        AgvWrkMast agvWrkMast = agvWrkMastService.selectByContainerCode(agvLocMast.getBarcode());
        if(!Cools.isEmpty(agvWrkMast)){
            throw new CoolException("当前"+agvLocMast.getBarcode()+"货架码已在工作档中");
        }
        //检索库位,选择合适的库位
        AgvLocMast locMast = agvCommonService.getLocNo(agvLocMast.getLocType1(),floor);
        if (Cools.isEmpty(locMast)) {
            throw new CoolException("当前楼层没有空库位");
        }
        //生成工作档
        AgvWrkMast mast = new AgvWrkMast();
        //工作状态
        mast.setWrkSts(201L);
        //入出库类型
        mast.setIoType(ioType);
        mast.setIoTime(now);
        //优先级
        mast.setIoPri(300.0);
        //源站点
        mast.setSourceLocNo(agvLocMast.getLocNo());
        //目标站点
        mast.setLocNo(locMast.getLocNo());
        //容器编码
        mast.setBarcode(agvLocMast.getBarcode());
        //容器类型
        mast.setWhsType(30);
        mast.setAppeUser(userId);
        mast.setAppeTime(now);
        mast.setModiUser(userId);
        mast.setModiTime(now);
        if (!agvWrkMastService.insertByIncrease(mast)) {
            throw new CoolException("保存工作档失败");
        }
        if (!agvLocMast.getLocSts().equals("F")) {
            AgvWrkMast mast1 = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", locMast.getLocNo()).eq("source_loc_no",agvLocMast.getLocNo()));
            //生成工作档明细
            List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", agvLocMast.getLocNo()));
            agvLocDetls.forEach(agvLocDetl -> {
                AgvWrkDetl wrkDetl = new AgvWrkDetl();
                wrkDetl.setWrkNo(mast1.getWrkNo());
                wrkDetl.sync(agvLocDetl);
                wrkDetl.setSuppCode(agvLocDetl.getSuppCode());
                wrkDetl.setIoTime(now);
                wrkDetl.setAppeUser(9527L);
                wrkDetl.setAppeTime(now);
                wrkDetl.setModiUser(9527L);
                wrkDetl.setModiTime(now);
                if (!agvWrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作明细失败");
                }
            });
        }
        //更新目标库位状态
        updateAgvLocMast(agvLocMast,"R");
        updateAgvLocMast(locMast,"S");
        return "ok";
    }
    /*
   更新目标库位信息
    */
    private void updateAgvLocMast(AgvLocMast locMast, String locSts){
        locMast.setLocSts(locSts);
        agvLocMastService.updateById(locMast);
    }
}
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -580,7 +580,7 @@
    }
    @Transactional
    public void cancelWrkMast(String workNo, Long userId) {
    public void cancelWrkMast(String workNo, Long userId,Integer type) {
        AgvWrkMast wrkMast = agvWrkMastService.selectById(workNo);
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
@@ -599,6 +599,16 @@
            agvLocMastService.updateLocStsByLocNo(locNo,"O","",null);
            agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"F",wrkMast.getBarcode(),wrkMast.getWhsType().shortValue());
            // 移库取消
        }else if(wrkMast.getIoType() == 108) {
            //源库位
            String locNo = wrkMast.getSourceLocNo();
            //目标站点
            String devNo = wrkMast.getLocNo();
            agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo));
            if(devNo.contains("@")){
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"O","",null);
            }
            //出库取消
        }else {
            //源库位
@@ -645,9 +655,11 @@
        if(!agvWrkMastService.deleteByWrkNo(wrkMast.getWrkNo()) || !agvWrkDetlService.deleteByWrkNo(wrkMast.getWrkNo())){
            throw new CoolException("删除失败,请联系管理员");
        }
        if (type == 2) {
        //调用agv取消任务接口
        agvWrkMastService.callCancelTask(wrkMast.getWrkNo());
        }
    }
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -187,7 +187,7 @@
            agvWrkMast.setWrkNo(-agvWrkMast.getWrkNo());
        }
        agvTaskCreateParam.setTaskCode(agvWrkMast.getWrkNo().toString());
        if (agvWrkMast.getIoType() == 108 || agvWrkMast.getIoType() == 109) {
        if (agvWrkMast.getIoType() == 108 || agvWrkMast.getIoType() == 109 || agvWrkMast.getIoType() == 12) {
            agvTaskCreateParam.setTaskTyp("F06");
        } else  {
            agvTaskCreateParam.setTaskTyp("F01");
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java
@@ -107,6 +107,8 @@
                .or().eq("io_type", 1)
                .or().eq("io_type", 10)
                .or().eq("io_type", 57)
                .or().eq("io_type", 11)
                .or().eq("io_type", 12)
                .or().eq("io_type", 109)
                .or().eq("io_type", 108)).getRecords();
src/main/webapp/static/js/agvWrkMast/wrkMast.js
@@ -349,6 +349,26 @@
                    });
                }
                break;
            // 取消
            case 'cancel1':
                if (data.pdcType === "Y") {
                    layer.confirm('当前任务关联ERP销售单,取消将重新生成出库作业,是否继续?', {title: '工作号:'+data.wrkNo, shadeClose: true}, function(){
                        http.post(baseUrl+"/agv/hand/control/wrkMast", {workNo: data.wrkNo, type:5}, function (res) {
                            $(".layui-laypage-btn")[0].click();
                            layer.msg(data.wrkNo + res.msg);
                        })
                        layer.closeAll();
                    });
                } else {
                    layer.confirm('确认取消该笔工作档?', {title: '工作号:'+data.wrkNo, shadeClose: true}, function(){
                        http.post(baseUrl+"/agv/hand/control/wrkMast", {workNo: data.wrkNo, type:5}, function (res) {
                            $(".layui-laypage-btn")[0].click();
                            layer.msg(data.wrkNo + res.msg);
                        })
                        layer.closeAll();
                    });
                }
                break;
            //  拣料入库
            case 'pick':
                layer.confirm('拣料入库该笔工作档?', {title: '工作号:'+data.wrkNo, shadeClose: true}, function(){
src/main/webapp/views/agvWrkMast/wrkMast.html
@@ -121,7 +121,8 @@
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-xs btn-detlShow" lay-event="detlShow">明细</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-complete" lay-event="complete">完成</a>
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-cancel" lay-event="cancel">取消</a>
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-cancel" lay-event="cancel">取消(AGV)</a>
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-cancel" lay-event="cancel1">取消</a>
    <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="priWrkMast">维护状态</a>
    {{#if (d.steNo) { }}
    <a class="layui-btn layui-btn-warm layui-btn-xs btn-pick" lay-event="removeSte">弃车</a>