自动化立体仓库 - WMS系统
pang.jiabao
2024-09-24 0329286b3ba1ddbdcad4769b9ccd4d5b3f5d1e64
备货定时任务
11个文件已修改
231 ■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/OrderDetl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/GhjtScheduler.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/GhjtHandler.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/order.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetl.java
@@ -397,14 +397,14 @@
    }
    public String getInspect$(){
        if (null == this.inspect){ return null; }
        if (null == this.inspect){ return "待备货"; }
        switch (this.inspect){
            case 1:
                return "是";
            case 0:
                return "否";
                return "备货中";
            case 2:
                return "已备货";
            default:
                return String.valueOf(this.inspect);
                return "待备货";
        }
    }
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -86,4 +86,9 @@
     * 查询包装组号在库时间
     */
    List<InLocTimeDto> queryInLocTime(@Param("param") List<String> param);
    /**
     * 按包装组号列表查询库位号列表
     */
    List<LocDetl> selectLocNoByGroupNo(@Param("packageGroupNos") List<String> packageGroupNos);
}
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
@@ -48,4 +48,9 @@
     * 按包装组号标记盘点记录异常
     */
    void updateCheckExceptionByGroup(@Param("groups") List<String> groups);
    /**
     * 按包装组号更新订单明细状态
     */
    void updateOrderDetlStatusByPackageNo(@Param("brands") List<String> brands,@Param("status") int status);
}
src/main/java/com/zy/asrs/mapper/OrderMapper.java
@@ -21,4 +21,14 @@
    List<Order> selectorderNoL(@Param("orderNo")String orderNo);
    void updateSettleByOrderNo(@Param("orderNo") String orderNo, @Param("status") long status, @Param("userId") Long userId);
    /**
     * 查询出库申请单中没有备货的订单明细的包装组号
     */
    List<String> selectStockUpOrderDetl();
    /**
     * 更新订单备货状态
     */
    void updateStatusByOrderNo(@Param("orderNo") String orderNo,@Param("status") int status,@Param("userId") int userId);
}
src/main/java/com/zy/asrs/task/GhjtScheduler.java
@@ -1,7 +1,6 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.OrderMapper;
import com.zy.asrs.mapper.WrkMastMapper;
@@ -36,20 +35,24 @@
    @Resource
    private ConfigMapper configMapper;
    // 备货(根据出库单,把要出的货提前放到靠近出库口位置)
//    @Scheduled(cron = "0/4 * * * * ? ")
    public void stockUp() {
        // 查询待出库订单
        List<Order> orderList = orderMapper.selectList(new EntityWrapper<Order>().eq("settle", 1));
//        ghjtHandler.stockUp();
        List<Order> orders = orderMapper.selectComplete();
        for (Order order : orders) {
            try {
//                ghjtHandler.OutBoundCompleteReport(order);
            } catch (Exception e) {
                log.error("出库订单完成则上报MES失败,异常信息:" + e);
            }
    // 自动备货(根据出库单,把要出的货提前放到靠近出库口位置)
    // 定时任务获取待备货订单明细->获取堆垛机对应的源库位,获取备货区库位->生成移库任务11->
    // 执行移库任务12->入库完成4->更新工作档定时任务中更新订单备货状态和订单明细备货状态5->转储历史
    @Scheduled(cron = "0/10 * * * * ?")
    public synchronized void autoStockUp() {
        // 查询自动备货配置
        Config config = configMapper.selectConfigByCode("auto_stock_up");
        if (config == null || config.getStatus() == 0) {
            return;
        }
        // 查询出库申请单中没有备货的订单明细的包装组号
        List<String> list = orderMapper.selectStockUpOrderDetl();
        if (list.isEmpty()) {
            return;
        }
        ghjtHandler.autoStockUpHandler(list, Integer.parseInt(config.getValue()));
    }
    // 下发出库任务给GWCS(从出库码头到出库口)
src/main/java/com/zy/asrs/task/handler/GhjtHandler.java
@@ -4,12 +4,13 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkDetl;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.mapper.OrderMapper;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.mapper.*;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.WorkService;
import com.zy.asrs.service.WrkDetlService;
import com.zy.common.constant.MesConstant;
import com.zy.common.utils.HttpHandler;
@@ -19,10 +20,7 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -48,6 +46,15 @@
    @Resource
    private OrderDetlMapper orderDetlMapper;
    @Resource
    private LocDetlMapper locDetlMapper;
    @Resource
    private LocMastMapper locMastMapper;
    @Resource
    private WorkService workService;
    @Transactional
    public void startCkrwPushGwcs(WrkMast wrkMast) {
@@ -158,4 +165,96 @@
        return flag;
    }
    /**
     * 自动备货处理
     */
    public void autoStockUpHandler(List<String> list,int columnNum) {
        // 根据包装组号获取所在库位
        List<LocDetl> locDetls = locDetlMapper.selectLocNoByGroupNo(list);
        if (locDetls.isEmpty()) {
            return;
        }
        // 相同则合并,一个库位两个包装组号
        Map<String,List<String>> map = new HashMap<>();
        for(LocDetl locDetl : locDetls) {
            List<String> brand = map.get(locDetl.getLocNo());
            if (brand == null) {
                map.put(locDetl.getLocNo(),new ArrayList<String>(){{add(locDetl.getBrand());}});
            } else {
                brand.add(locDetl.getBrand());
                map.put(locDetl.getLocNo(),brand);
            }
        }
        // 遍历堆垛机并且判断是否存在任务
        for (int i = 1; i <= 6; i++) {
            // 要备货的库位
            String sourceLocNo = null;
            // 备货目标库位
            String staLocNo = null;
            Integer wrkCount = wrkMastMapper.selectCount(new EntityWrapper<WrkMast>().eq("crn_no", i));
            if(wrkCount > 0) {
                log.warn("{}号堆垛机已存在任务",i);
                continue;
            }
            // 根据堆垛机号查询到对应的深库位和浅库位  深库位4*n-3和4*n 浅库位4*n-2和4*n-1
            int s1 = 4*i-3;
            int s2 = 4*i;
            int q1 = 4 * i - 2;
            int q2 = 4 * i -1;
            // 根据堆垛机号获取一个浅库位
            for(String key : map.keySet()) {
                int row = Integer.parseInt(key.substring(0, 2));
                if (row == q1 || row == q2) {
                    sourceLocNo = key;
                    break;
                }
            }
            // 浅库位没有则找一个深库位
            if (sourceLocNo == null) {
                for(String key : map.keySet()) {
                    int row = Integer.parseInt(key.substring(0, 2));
                    if (row == s1 || row == s2) {
                        sourceLocNo = key;
                        break;
                    }
                }
            }
            // 没有找到源库位
            if (sourceLocNo == null) {
                log.warn("没有找到源库位,堆垛机:{}",i);
                continue;
            }
            // 寻找一个备货的目标库位,先深后浅
            List<LocMast> locMasts1 = locMastMapper.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("crn_no", i).in("row1", s1, s2)
                    .le("bay1", columnNum));
            if (locMasts1.isEmpty()) {
                // 深库位为空了,取浅库位
                List<LocMast> locMasts2 = locMastMapper.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("crn_no", i).in("row1", q1, q2)
                        .le("bay1", columnNum));
                if (!locMasts2.isEmpty()) {
                    staLocNo = locMasts2.get(0).getLocNo();
                }
            } else {
                staLocNo = locMasts1.get(0).getLocNo();
            }
            if(staLocNo == null) {
                log.warn("{}号堆垛机备货区满了",i);
                continue;
            }
            // 备货的源库位,目标库位都获取到了,生成移库任务
            workService.locMove(sourceLocNo,staLocNo,29L);
            // 订单明细改成备货中,在任务完成时候改成备货完成,并判断整个订单是否完成
            orderDetlMapper.updateOrderDetlStatusByPackageNo(map.get(sourceLocNo), 1);
            // 移除已生成备货库位
            map.remove(sourceLocNo);
        }
    }
}
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -4,6 +4,7 @@
import com.core.common.Cools;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.mapper.OrderMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
@@ -16,6 +17,7 @@
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2020/7/4
@@ -39,6 +41,9 @@
    private OrderDetlService orderDetlService;
    @Resource
    private OrderDetlMapper orderDetlMapper;
    @Resource
    private OrderMapper orderMapper;
    public ReturnT<String> start(WrkMast wrkMast) {
        // 4.入库完成
        if (wrkMast.getWrkSts() == 4) {
@@ -313,6 +318,26 @@
                            return FAIL.setMsg("库位移转 ===>> 转移库存明细数据失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        }
                    }
                    // 备货,更新订单明细及订单状态
                    List<WrkDetl> wrkDetlList = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (!wrkDetlList.isEmpty()) {
                        List<String> brands = wrkDetlList.stream().map(WrkDetl::getBrand).distinct().collect(Collectors.toList());
                        // 查询订单明细
                        List<OrderDetl> orderDetlList = orderDetlMapper.selectList(new EntityWrapper<OrderDetl>().in("brand", brands));
                        if (!orderDetlList.isEmpty()) {
                            // 更新明细为已备货
                            orderDetlMapper.updateOrderDetlStatusByPackageNo(brands,2);
                            // 获取订单号
                            String orderNo = orderDetlList.get(0).getOrderNo();
                            // 判断该订单明细是否全部已备货
                            Integer selectCount = orderDetlMapper.selectCount(new EntityWrapper<OrderDetl>().eq("order_no", orderNo).ne("inspect", 2));
                            if (selectCount == 0) {
                                // 更新订单为备货完成
                                orderMapper.updateStatusByOrderNo(orderNo,2,29);
                            }
                        }
                    }
                    // 修改源库位状态 ==> O
                    LocMast sourceLoc = locMastService.selectById(wrkMast.getSourceLocNo());
                    if (null != sourceLoc) {
src/main/resources/mapper/LocDetlMapper.xml
@@ -388,6 +388,12 @@
            brand,
            appe_time
    </select>
    <select id="selectLocNoByGroupNo" resultType="com.zy.asrs.entity.LocDetl">
        select distinct ald.loc_no as locNo,ald.brand from asr_loc_detl ald where ald.brand in
        <foreach collection="packageGroupNos" item="item" index="index" open="(" close=")" separator=",">
            #{item}
        </foreach>
    </select>
    <update id="updateMatTurn">
        UPDATE a
src/main/resources/mapper/OrderDetlMapper.xml
@@ -237,5 +237,11 @@
            #{item}
        </foreach>
    </update>
    <update id="updateOrderDetlStatusByPackageNo">
        update man_order_detl set inspect = #{status} where brand in
        <foreach collection="brands" open="(" separator="," close=")" item="item"  index="index">
            #{item}
        </foreach>
    </update>
</mapper>
src/main/resources/mapper/OrderMapper.xml
@@ -63,6 +63,9 @@
        and order_no = #{orderNo}
        and settle != #{status}
    </update>
    <update id="updateStatusByOrderNo">
        update man_order set account_day = #{status},update_time = getdate(),update_by = #{userId} where order_no = #{orderNo}
    </update>
    <select id="selectComplete" resultMap="BaseResultMap">
        select
@@ -91,5 +94,18 @@
            and order_no = #{orderNo}
        </if>
    </select>
    <select id="selectStockUpOrderDetl" resultType="java.lang.String">
        select
            DISTINCT md.brand
        from
            man_order mo
                left join man_order_detl md on
                mo.order_no = md.order_no
        where
            mo.doc_type = 21
          and mo.account_day = 1
          and md.inspect = 0
          and mo.settle = 1
    </select>
</mapper>
src/main/webapp/static/js/order/order.js
@@ -260,8 +260,8 @@
                            // {field: 'inQty', title: '已入库量'},
                            // {field: 'color', title: '颜色'},
                            // {field: 'specs', title: '接头'},
                            {field: 'qty$', title: '状态', style: 'font-weight: bold'},
                            {field: 'source$', title: '是否确认', style: 'font-weight: bold'}
                            {field: 'qty$', title: '出库状态', style: 'font-weight: bold'},
                            {field: 'inspect$', title: '备货状态', style: 'font-weight: bold'}
                        ]],
                        request: {
                            pageName: 'curr',