自动化立体仓库 - WMS系统
zhangc
2025-01-03 2fc477de92ef724cd37a79a3679c7d605adb94ab
src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java
@@ -1,24 +1,24 @@
package com.zy.asrs.task.handler;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.service.LocDetlService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.WorkService;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class AutoReplenishmentHandler extends AbstractHandler<String> {
@@ -29,71 +29,289 @@
    private LocDetlService locDetlService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private WorkService workService;
    private AgvLocMastService agvLocMastService;
    @Autowired
    private CommonService commonService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Transactional
    public ReturnT<String> start(Order order) {
    public ReturnT<String> create(Mat mat, double anfme) {
        //创建一个新的自动补货单据
        Order order = createOrder();
        orderService.insert(order);
        OrderDetl orderDetl = createOrderDetl(order);
        orderDetl.setMatnr(mat.getMatnr());
        orderDetl.setMaktx(mat.getMaktx());
        orderDetl.setSpecs(mat.getSpecs());
        orderDetl.setAnfme(anfme);
        orderDetl.setQty(0.0);
        Set<String> locNos = pakoutLoc(order);
        for (String locNo : locNos){
            LocMast locMast = locMastService.selectByLoc(locNo);
            if(!"F".equals(locMast.getLocSts())){
                throw new CoolException("库位状态已变更");
            }
            //生成工作档
            //生成工作档明细
            //修改库位状态
        }
        orderDetlService.insert(orderDetl);
        return SUCCESS;
    }
    private Set<String> pakoutLoc(Order order){
    @Transactional
    public ReturnT<String> start(Order order) {
        Date now = new Date();
        Set<String> locNos = pakoutLoc(order);
        for (String locNo : locNos) {
            LocMast locMast = locMastService.selectByLoc(locNo);
            if (!"F".equals(locMast.getLocSts())) {
                throw new CoolException("库位状态已变更");
            }
            //生成工作档
            WrkMast wrkMast = createWrkMast(locNo, locMast.getBarcode(), now);
            //生成工作档明细
            List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo);
            createWrkDetl(locDetls, wrkMast, order.getOrderNo(), now);
            //修改库位状态
            locMast.setLocSts("R");
            locMastService.updateByLocNo(locMast);
        }
        order.setSettle(2L);
        orderService.updateById(order);
        return SUCCESS;
    }
    private Order createOrder() {
        Date now = new Date();
        return new Order(
                String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
                "AUTO" + snowflakeIdWorker.nextId(),    // 订单编号
                DateUtils.convert(now),    // 单据日期
                21L,    // 单据类型 21.自动补货单
                null,    // 项目编号
                null,    //
                null,    // 调拨项目编号
                null,    // 初始票据号
                null,    // 票据号
                null,    // 客户编号
                null,    // 客户
                null,    // 联系方式
                null,    // 操作人员
                null,    // 合计金额
                null,    // 优惠率
                null,    // 优惠金额
                null,    // 销售或采购费用合计
                null,    // 实付金额
                null,    // 付款类型
                null,    // 业务员
                null,    // 结算天数
                null,    // 邮费支付类型
                null,    // 邮费
                null,    // 付款时间
                null,    // 发货时间
                null,    // 物流名称
                null,    // 物流单号
                1L,    // 订单状态
                1,    // 状态
                9999L,    // 添加人员
                now,    // 添加时间
                9999L,    // 修改人员
                now,    // 修改时间
                null    // 备注
        );
    }
    private OrderDetl createOrderDetl(Order order) {
        Date now = new Date();
        OrderDetl orderDetl = new OrderDetl();
        orderDetl.setOrderId(order.getId());
        orderDetl.setOrderNo(order.getOrderNo());
        orderDetl.setCreateBy(order.getCreateBy());
        orderDetl.setCreateTime(now);
        orderDetl.setUpdateBy(order.getCreateBy());
        orderDetl.setUpdateTime(now);
        orderDetl.setStatus(1);
        orderDetl.setQty(0.0D);
        return orderDetl;
    }
    private Set<String> pakoutLoc(Order order) {
        //需要出库的库位
        Set<String> locNos = new HashSet<>();
        //根据订单生成四项库出库工作档
        List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo()));
        orderDetlList.forEach(orderDetl -> {
        for (OrderDetl orderDetl : orderDetlList) {
            if (orderDetl.getAnfme() - orderDetl.getQty() <= 0) {
                continue;
            }
            String matnr = orderDetl.getMatnr();
            Double orderAnfme = orderDetl.getAnfme();
            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
                    .eq("matnr", matnr)
                    .eq("loc_sts","F")
                    .groupBy("loc_no"));
            for (LocDetl locDetl : locDetls){
                String locNo = locDetl.getLocNo();
                //订单待出数量减去库存数量
                orderAnfme -= locDetl.getAnfme();
                //添加待出库库位
            double orderAnfme = orderDetl.getAnfme();
            //List<String> locNosSearch = locDetlService.selectLocNo(matnr);
            Set<String> locNosSearch = locDetlService.selectLocNos(matnr);
            //过滤库位货物为高货物
            locNosSearch = locNosSearch.stream().filter(locNo -> {
                LocMast locMast = locMastService.selectByLoc(locNo);
                if (locMast.getLocType1() == 3) {
                    return false;
                } else {
                    //且检测该库位是否含没有货架码的物料,如有有则不允许出库
//                    LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locNo)
//                            .andNew().eq("supp_code", "").or().isNull("supp_code"));
                    if (Cools.isEmpty(locDetlService.selectByLocWithoutContainer(locNo))) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }).collect(Collectors.toSet());
            //重新排序
            Set<String> resort = resort(locNosSearch);
            for (String locNo : resort) {
                List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo);
                locNos.add(locNo);
                if(orderAnfme <= 0){
                for (LocDetl locDetl : locDetls) {
                    if (matnr.equals(locDetl.getMatnr())) {
                        orderAnfme -= locDetl.getAnfme();
                    } else {
                        OrderDetl odNew = createOrderDetl(order);
                        odNew.setMatnr(locDetl.getMatnr());
                        odNew.setMaktx(locDetl.getMaktx());
                        odNew.setBatch(locDetl.getBatch());
                        odNew.setThreeCode(locDetl.getThreeCode());
                        odNew.setDeadTime(locDetl.getDeadTime());
                        odNew.setSpecs(locDetl.getSpecs());
                        odNew.setAnfme(0.0);
                        odNew.setQty(locDetl.getAnfme());
                        orderDetlService.insert(odNew);
                    }
                }
                if (orderAnfme <= 0) {
                    orderDetl.setQty(orderDetl.getAnfme() - orderAnfme);
                    orderDetlService.updateById(orderDetl);
                    break;
                }
            }
        });
            if (orderAnfme > 0) {
                orderDetl.setAnfme(orderDetl.getAnfme() - orderAnfme);
                orderDetl.setQty(orderDetl.getAnfme());
                orderDetlService.updateById(orderDetl);
            }
        }
        return locNos;
    }
    public static void main(String[] args) {
        for (int i=0; i<10; i++){
            for (int y=0; y<10; y++){
                System.out.println(i);
                System.out.println(y);
                if(y == 5){
                    break;
    //根据深浅库位进行重新排序
    private Set<String> resort(Set<String> locNos) {
        Set<String> locNosResort = new LinkedHashSet<>();
        for (String locNoSearch : locNos) {
            LocMast locMast = locMastService.selectById(locNoSearch);
            if (!"F".equals(locMast.getLocSts())) {
                continue;
            }
            List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNoSearch);
            if (Cools.isEmpty(groupOuterLoc)) {
                locNosResort.add(locNoSearch);
            } else {
                groupOuterLoc.add(locNoSearch);
                //如果是深库位,则先找外侧的库位
                for (String locNoOut : groupOuterLoc) {
                    LocMast locMastOuter = locMastService.selectById(locNoOut);
                    //外侧如果是拣料,则内测不允许出
                    if ("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())) {
                        break;
                    }
                    if (!"F".equals(locMastOuter.getLocSts())) {
                        continue;
                    }
                    locNosResort.add(locNoOut);
                }
            }
        }
        return locNosResort;
    }
    private WrkMast createWrkMast(String locNo, String barCode, Date now) {
        int ioType = 101;
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(21L); // 工作状态:21.生成出库任务
        wrkMast.setIoType(ioType); // 入出库状态
        wrkMast.setIoPri(300D); // 优先级:13
        //wrkMast.setOutMost(outMost?1:0);;
        //wrkMast.setCrnNo(outMost?outCrnNo:locMast.getCrnNo());
        //wrkMast.setSourceStaNo(loc); // 源站
        wrkMast.setStaNo(300); // 目标站
        wrkMast.setSourceLocNo(locNo); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setBarcode(barCode);
        //wrkMast.setAppeUser(userId); // 操作人员数据
        wrkMast.setAppeTime(now);
        //wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        Integer pltType = null;
        if (!Cools.isEmpty(locNo) && Cools.isEmpty(pltType)) {
            AgvLocMast agvLocMast = agvLocMastService.selectById(locNo);
            if (agvLocMast != null) {
                pltType = agvLocMast.getPltType();
            }
        }
        wrkMast.setPltType(pltType);
        //补货标识
        wrkMast.setMk("Y");
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败,出库库位号:" + locNo);
        }
        return wrkMast;
    }
    private void createWrkDetl(List<LocDetl> locDetls, WrkMast wrkMast, String orderNo, Date now) {
        locDetls.forEach(locDetl -> {
            WrkDetl wrkDetl = new WrkDetl();
            BeanUtils.copyProperties(locDetl, wrkDetl);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setIoTime(now);
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            //wrkDetl.setBatch(locDetl.getBatch());
            wrkDetl.setOrderNo(orderNo);
            //wrkDetl.setAnfme(locDetl.getAnfme()); // 数量
            wrkDetl.setAppeTime(now);
            //wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            //wrkDetl.setSuppCode(locDetl.getSuppCode());
            //wrkDetl.setModiUser(userId);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
        });
    }
}