自动化立体仓库 - WMS系统
skyouc
8 小时以前 1573adab705da74a98ad5a174f031e9171437c0c
出入库功能优化
5个文件已修改
254 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlPakoutMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/locAroundBind/locAroundBind.js 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/locAroundBind/locAroundBind.html 110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -466,8 +466,7 @@
        LocMast locMasts = locMastService.selectOne(new EntityWrapper<LocMast>()
                .in("loc_no", locs)
                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type)
                .orderAsc(Arrays.asList("loc_no"))
                .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
                .orderAsc(Arrays.asList("loc_no")));
        if (Objects.isNull(locMasts)) {
            binds = locAroundBindService.selectList(new EntityWrapper<LocAroundBind>()
@@ -478,18 +477,24 @@
            locMasts = locMastService.selectOne(new EntityWrapper<LocMast>()
                    .in("loc_no", nlocs)
                    .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type)
                    .orderAsc(Arrays.asList("loc_no"))
                    .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
                    .orderAsc(Arrays.asList("loc_no")));
            if (Objects.isNull(locMasts)) {
                throw new CoolException("暂无可用工作位!!");
            }
        }
            LocAroundBind bLocNo = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>().eq("b_loc_no", locMasts.getLocNo()));
            bLocNo.setLocType(LocStsType.LOC_STS_TYPE_S.type);
        LocAroundBind bLocNo = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>().eq("b_loc_no", locMasts.getLocNo()));
        bLocNo.setLocType(LocStsType.LOC_STS_TYPE_S.type);
            if (!locAroundBindService.updateById(bLocNo)) {
                throw new CoolException("工位预约失败!!");
            }
        if (!locAroundBindService.updateById(bLocNo)) {
            throw new CoolException("工位预约失败!!");
        }
        locMasts.setLocSts(LocStsType.LOC_STS_TYPE_S.type);
        locMasts.setModiUser(userId);
        locMasts.setModiTime(now);
        if (!locMastService.updateById(locMasts)) {
            throw new CoolException("预约库位状态失败,库位号:" + locMasts.getLocNo());
        }
        List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locMasts.getLocNo(), 1);
@@ -542,7 +547,7 @@
            wrkDetl.setIoTime(now);
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setOrderNo(locDto.getOrderNo());
            wrkDetl.setAnfme(locDto.getAnfme()); // 数量
//            wrkDetl.setAnfme(locDto.getAnfme()); // 数量
            wrkDetl.setStandby1(locDto.getStandby1());
            LocDetl locDel = locDetlService.selectOne(new EntityWrapper<LocDetl>()
                    .eq("loc_no", locDto.getLocNo())
@@ -557,7 +562,7 @@
            wrkDetl.setUnit(locDel.getUnit());
            wrkDetl.setSpecs(locDel.getSpecs());
            wrkDetl.setBatch(locDel.getBatch());
//            wrkDetl.setAnfme(locDel.getAnfme());
            wrkDetl.setAnfme(locDel.getAnfme());
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
@@ -1206,11 +1211,20 @@
            if (!Objects.isNull(wrkMast.getWrkCode())) {
                LocAroundBind aroundBind = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>().eq("b_loc_no", wrkMast.getSourceLocNo()));
                if (!Objects.isNull(aroundBind)) {
                    aroundBind.setLocType(LocStsType.LOC_STS_TYPE_O.type);
                    aroundBind.setLocType(LocStsType.LOC_STS_TYPE_F.type);
                    if (!locAroundBindService.updateById(aroundBind)) {
                        throw new CoolException("工位状态修改失败!!");
                    }
                }
                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", wrkMast.getSourceLocNo()));
                if (!Objects.isNull(locMast)) {
                    locMast.setLocSts(LocStsType.LOC_STS_TYPE_F.type);
                    if (!locMastService.updateById(locMast)) {
                        throw new CoolException("库位状态修改失败!!");
                    }
                }
            }
            // 出库取消(修改源库位)
        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14) {
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -6,10 +6,7 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.enums.LocStsType;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.BasStationServiceImpl;
import com.zy.asrs.service.impl.LocCacheServiceImpl;
import com.zy.asrs.service.impl.OrderPakinServiceImpl;
import com.zy.asrs.service.impl.TaskDetlServiceImpl;
import com.zy.asrs.service.impl.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import lombok.extern.slf4j.Slf4j;
@@ -58,6 +55,8 @@
    private BasStationServiceImpl basStationService;
    @Autowired
    private WorkService workService;
    @Autowired
    private LocAroundBindService locAroundBindService;
    public ReturnT<String> start(WrkMast wrkMast) {
        // 4.入库完成
@@ -489,7 +488,8 @@
    }
    private ReturnT<String> doOut(WrkMast wrkMast) {
    @Transactional(rollbackFor = Exception.class)
    public ReturnT<String> doOut(WrkMast wrkMast) {
        Date now = new Date();
        LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
        try {
@@ -507,7 +507,18 @@
                    if (!Objects.isNull(wrkMast.getWrkCode())) {
                        //TODO 移库
//                        workService.locMove(wrkMast.getSourceLocNo(), wrkMast.getLocNo(), wrkMast.getAppeUser());
                        movLoc(wrkMast);
                        //修改工位库态
                        LocAroundBind bLocNo = locAroundBindService.selectOne(new EntityWrapper<LocAroundBind>().eq("b_loc_no", wrkMast.getLocNo()));
                        if (Objects.isNull(bLocNo)) {
                            throw new CoolException("数据错误, 目标工位不存在!!");
                        }
                        bLocNo.setLocType(LocStsType.LOC_STS_TYPE_F.type);
                        if (!locAroundBindService.updateById(bLocNo)) {
                            throw new CoolException("工位状态修改失败!!");
                        }
                    } else {
//                    // 出库确认信号位
//                    if (Cools.isEmpty(wrkMast.getInvWh()) || wrkMast.getInvWh().equals("N")) {
src/main/resources/mapper/OrderDetlPakoutMapper.xml
@@ -57,7 +57,9 @@
    <sql id="standbyAll">
        and batch = #{batch}
        and brand = #{brand}
        <if test="brand != null and brand != ''">
            and brand = #{brand}
        </if>
        and standby1 = #{standby1}
        and standby2 = #{standby2}
        and standby3 = #{standby3}
src/main/webapp/static/js/locAroundBind/locAroundBind.js
@@ -12,7 +12,7 @@
    // 数据渲染
    tableIns = table.render({
        elem: '#locAroundBind',
        headers: { token: localStorage.getItem('token') },
        headers: {token: localStorage.getItem('token')},
        url: baseUrl + '/locAroundBind/list/auth',
        page: true,
        limit: 15,
@@ -21,16 +21,16 @@
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            { type: 'checkbox' }
            , { field: 'id', align: 'center', title: 'ID' , hide: true }
            , { field: 'devId', align: 'center', title: '机台ID', hide: true }
            , { field: 'devNo', align: 'center', title: '机台号' }
            , { field: 'devName', align: 'center', title: '设备名称' }
            , { field: 'blocId', align: 'center', title: '库位ID', hide: true }
            , { field: 'blocNo', align: 'center', title: '工位' }
            ,{field: 'locType$', align:'center', title: '工位状态'}
            , { field: 'def$', align: 'center', title: '工位类型' }
            , { fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 120 }
            {type: 'checkbox'}
            , {field: 'id', align: 'center', title: 'ID', hide: true}
            , {field: 'devId', align: 'center', title: '机台ID', hide: true}
            , {field: 'devNo', align: 'center', title: '机台号'}
            , {field: 'devName', align: 'center', title: '设备名称'}
            , {field: 'blocId', align: 'center', title: '库位ID', hide: true}
            , {field: 'blocNo', align: 'center', title: '工位'}
            , {field: 'locType$', align: 'center', title: '工位状态'}
            , {field: 'def$', align: 'center', title: '工位类型'}
            , {fixed: 'right', title: '操作', align: 'center', toolbar: '#operate', width: 240}
        ]],
        request: {
            pageName: 'curr',
@@ -66,7 +66,7 @@
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: { curr: 1 }
            page: {curr: 1}
        });
    });
@@ -79,7 +79,7 @@
                break;
            case 'deleteData':
                if (checkStatus.length === 0) {
                    layer.msg('请选择要删除的数据', { icon: 2 });
                    layer.msg('请选择要删除的数据', {icon: 2});
                    return;
                }
                del(checkStatus.map(function (d) {
@@ -87,7 +87,7 @@
                }));
                break;
            case 'exportData':
                admin.confirm('确定导出Excel吗', { shadeClose: true }, function () {
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function () {
                    var titles = [];
                    var fields = [];
                    obj.config.cols[0].map(function (col) {
@@ -106,7 +106,7 @@
                    };
                    $.ajax({
                        url: baseUrl + "/locAroundBind/export/auth",
                        headers: { 'token': localStorage.getItem('token') },
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType: 'json',
                        contentType: 'application/json;charset=UTF-8',
@@ -118,15 +118,15 @@
                            } else if (res.code === 403) {
                                top.location.href = baseUrl + "/";
                            } else {
                                layer.msg(res.msg, { icon: 2 })
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                });
                break;
            case "init":
                layer.prompt({ title: '请输入口令,并重置库位', formType: 1, shadeClose: true }, function (pass, idx) {
                    http.get(baseUrl + "/locMast/init/pwd", { pwd: pass }, function (res) {
                layer.prompt({title: '请输入口令,并重置库位', formType: 1, shadeClose: true}, function (pass, idx) {
                    http.get(baseUrl + "/locMast/init/pwd", {pwd: pass}, function (res) {
                        if (res.data) {
                            layer.open({
                                type: 1,
@@ -149,11 +149,26 @@
        }
    });
    // iframe物料详情
    function locDetlToLayer(val) {
        locNo = val;
        layer.open({
            type: 2,
            title: '库存明细',
            maxmin: true,
            area: [top.detailWidth, top.detailHeight],
            shadeClose: true,
            content: '../report/locDetl.html',
            success: function(layero, index){
            }
        });
    }
    // 初始化保存
    form.on('submit(initDo)', function (data) {
        $.ajax({
            url: baseUrl + "/locAroundBind/bind/init",
            headers: { 'token': localStorage.getItem('token') },
            headers: {'token': localStorage.getItem('token')},
            data: JSON.stringify(data.field),
            contentType: 'application/json;charset=UTF-8',
            method: 'POST',
@@ -182,6 +197,17 @@
            case "del":
                del([data.id]);
                break;
            // 查看明细
            case 'locDetl':
                if (data.locType.trim() === ''
                    || data.locType.trim() === 'S'
                    || data.locType.trim() === 'D'
                    || data.locType.trim() === 'O') {
                    layer.msg("工位的状态不存在物料");
                    return;
                }
                locDetlToLayer(data.blocNo);
                break;
        }
    });
@@ -199,19 +225,19 @@
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl + "/locAroundBind/" + (mData ? 'update' : 'add') + "/auth",
                        headers: { 'token': localStorage.getItem('token') },
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200) {
                                layer.close(dIndex);
                                layer.msg(res.msg, { icon: 1 });
                                layer.msg(res.msg, {icon: 1});
                                tableReload();
                            } else if (res.code === 403) {
                                top.location.href = baseUrl + "/";
                            } else {
                                layer.msg(res.msg, { icon: 2 });
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
@@ -233,18 +259,18 @@
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl + "/locAroundBind/delete/auth",
                headers: { 'token': localStorage.getItem('token') },
                data: { ids: ids },
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200) {
                        layer.msg(res.msg, { icon: 1 });
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403) {
                        top.location.href = baseUrl + "/";
                    } else {
                        layer.msg(res.msg, { icon: 2 });
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
@@ -270,6 +296,7 @@
        }, 300);
    }
    layDateRender();
});
@@ -286,6 +313,6 @@
    });
    tableIns.reload({
        where: searchData,
        page: { curr: pageCurr }
        page: {curr: pageCurr}
    });
}
src/main/webapp/views/locAroundBind/locAroundBind.html
@@ -13,51 +13,54 @@
</head>
<body>
    <div class="layui-fluid">
        <div class="layui-card">
            <div class="layui-card-body">
                <div class="layui-form toolbar" id="search-box">
                    <div class="layui-form-item">
                        <div class="layui-inline">
                            <div class="layui-input-inline">
                                <input class="layui-input" type="text" name="condition" placeholder="请输入"
                                       autocomplete="off">
                            </div>
                        </div>
                        <div class="layui-inline">&emsp;
                            <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                                <i class="layui-icon">&#xe615;</i>搜索
                            </button>
                            <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                                <i class="layui-icon">&#xe666;</i>重置
                            </button>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入"
                                   autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                    </div>
                </div>
                <table class="layui-hide" id="locAroundBind" lay-filter="locAroundBind"></table>
            </div>
            <table class="layui-hide" id="locAroundBind" lay-filter="locAroundBind"></table>
        </div>
    </div>
</div>
    <script type="text/html" id="toolbar">
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary" id="btn-init" lay-event="init">初始化</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData"
                style="float: right">导出
        </button>
    </div>
</script>
    <script type="text/html" id="operate">
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
    <a class="layui-btn layui-btn-xs loc-detl" lay-event="locDetl">查看明细</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>
    <script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
    <script type="text/javascript" src="../../static/js/locAroundBind/locAroundBind.js" charset="utf-8"></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>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/locAroundBind/locAroundBind.js" charset="utf-8"></script>
</body>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
@@ -68,7 +71,8 @@
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">机台: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="devNo" placeholder="请输入机台号" lay-vertype="tips" lay-verify="required">
                        <input class="layui-input" name="devNo" placeholder="请输入机台号" lay-vertype="tips"
                               lay-verify="required">
                    </div>
                </div>
                <div class="layui-form-item">
@@ -80,7 +84,8 @@
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">工位: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="blocNo" placeholder="请输入库位码" lay-vertype="tips" lay-verify="required">
                        <input class="layui-input" name="blocNo" placeholder="请输入库位码" lay-vertype="tips"
                               lay-verify="required">
                    </div>
                </div>
                <div class="layui-form-item">
@@ -97,7 +102,8 @@
                        <label class="layui-form-label">工位状态</label>
                        <div class="layui-input-inline cool-auto-complete">
                            <input id="locType" name="locType" class="layui-input" type="text" style="display: none">
                            <input id="locType$" name="locType$"  class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text"
                            <input id="locType$" name="locType$" class="layui-input cool-auto-complete-div"
                                   onclick="autoShow(this.id)" type="text"
                                   placeholder="工位状态" onfocus=this.blur()>
                            <div class="cool-auto-complete-window">
                                <input class="cool-auto-complete-window-input" data-key="basLocStsQueryBylocSts"
@@ -109,7 +115,7 @@
                        </div>
                    </div>
                </div>
             </div>
            </div>
        </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
@@ -135,12 +141,12 @@
                <label class="layui-form-label">起止排</label>
                <div class="layui-input-inline" style="width: 100px;">
                    <input type="text" name="startRow" autocomplete="off" class="layui-input"
                        lay-verify="required|number">
                           lay-verify="required|number">
                </div>
                <div class="layui-form-mid">-</div>
                <div class="layui-input-inline" style="width: 100px;">
                    <input type="text" name="endRow" autocomplete="off" class="layui-input"
                        lay-verify="required|number">
                           lay-verify="required|number">
                </div>
            </div>
        </div>
@@ -150,12 +156,12 @@
                <label class="layui-form-label">起止列</label>
                <div class="layui-input-inline" style="width: 100px;">
                    <input type="text" name="startBay" autocomplete="off" class="layui-input"
                        lay-verify="required|number">
                           lay-verify="required|number">
                </div>
                <div class="layui-form-mid">-</div>
                <div class="layui-input-inline" style="width: 100px;">
                    <input type="text" name="endBay" autocomplete="off" class="layui-input"
                        lay-verify="required|number">
                           lay-verify="required|number">
                </div>
            </div>
        </div>
@@ -165,12 +171,12 @@
                <label class="layui-form-label">起止层</label>
                <div class="layui-input-inline" style="width: 100px;">
                    <input type="text" name="startLev" autocomplete="off" class="layui-input"
                        lay-verify="required|number">
                           lay-verify="required|number">
                </div>
                <div class="layui-form-mid">-</div>
                <div class="layui-input-inline" style="width: 100px;">
                    <input type="text" name="endLev" autocomplete="off" class="layui-input"
                        lay-verify="required|number">
                           lay-verify="required|number">
                </div>
            </div>
        </div>
@@ -184,22 +190,22 @@
                    <option value="R">S.预约出库</option>
                </select>
            </div>
<!--            <div class="layui-inline">-->
<!--                <label class="layui-form-label">库位状态</label>-->
            <!--            <div class="layui-inline">-->
            <!--                <label class="layui-form-label">库位状态</label>-->
<!--                <div class="layui-input-inline cool-auto-complete">-->
<!--                    <input id="locSts" name="loc_sts" class="layui-input" type="text" style="display: none">-->
<!--                    <input id="locSts$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text"-->
<!--                           placeholder="库位状态" onfocus=this.blur()>-->
<!--                    <div class="cool-auto-complete-window">-->
<!--                        <input class="cool-auto-complete-window-input" data-key="basLocStsQueryBylocSts"-->
<!--                               onkeyup="autoLoad2(this.getAttribute('data-key'))">-->
<!--                        <select class="cool-auto-complete-window-select" data-key="basLocStsQueryBylocStsSelect"-->
<!--                                onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
<!--                        </select>-->
<!--                    </div>-->
<!--                </div>-->
<!--            </div>-->
            <!--                <div class="layui-input-inline cool-auto-complete">-->
            <!--                    <input id="locSts" name="loc_sts" class="layui-input" type="text" style="display: none">-->
            <!--                    <input id="locSts$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text"-->
            <!--                           placeholder="库位状态" onfocus=this.blur()>-->
            <!--                    <div class="cool-auto-complete-window">-->
            <!--                        <input class="cool-auto-complete-window-input" data-key="basLocStsQueryBylocSts"-->
            <!--                               onkeyup="autoLoad2(this.getAttribute('data-key'))">-->
            <!--                        <select class="cool-auto-complete-window-select" data-key="basLocStsQueryBylocStsSelect"-->
            <!--                                onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">-->
            <!--                        </select>-->
            <!--                    </div>-->
            <!--                </div>-->
            <!--            </div>-->
        </div>