自动化立体仓库 - WMS系统
pang.jiabao
2024-12-31 44d51d79370da8973fcd52203c669da9d0a1e479
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -7,19 +7,17 @@
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.OffSaleParam;
import com.zy.asrs.entity.param.OpenOrderPakinParam;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.mapper.LocMastMapper;
import com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.CodeRes;
import com.zy.common.constant.MesConstant;
import com.zy.common.entity.Parameter;
import com.zy.common.model.DetlDto;
import com.zy.common.model.MesCombParam;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
@@ -27,10 +25,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.annotation.Resource;
import java.util.*;
/**
 * 移动端服务核心类
@@ -79,6 +75,468 @@
    @Autowired
    private ManLocDetlMapper manLocDetlMapper;
    @Autowired
    private AdjDetlService adjDetlService;
    @Resource
    private LocMastMapper locMastMapper;
    @Resource
    private DocTypeService docTypeService;
    @Resource
    private OrderDetlPakinService orderDetlPakinService;
    @Resource
    private OrderPakinService orderPakinService;
    @Resource
    private OrderPakoutService orderPakoutService;
    @Resource
    private OrderDetlPakoutService orderDetlPakoutService;
    @Override
    @Transactional
    public R WarehouseOutPickMergeV1(WarehouseOutPickMergeParam param, Long hostId, Long userId) {
        //判断库位状态
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", param.getLocNo()));
        if (Cools.isEmpty(locMast)){
            return R.error("该库位不存在");
        }
        if (!locMast.getLocSts().equals("P")){
            return R.error("该库位状态为:"+locMast.getLocSts()+",不满足拣料途中并板条件!!!");
        }
        Date now = new Date();
        // 创建入库工作主档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(commonService.getWorkNo(0));
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(4L); // 工作状态:入库完成
        wrkMast.setIoType(8); // 入出库状态:8.拣料途中并板
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setCrnNo(1);
        wrkMast.setSourceStaNo(1);
        wrkMast.setStaNo(1);
        wrkMast.setLocNo(param.getLocNo());
        wrkMast.setBarcode(param.getBarcode()); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(0); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setAppeUser(userId);
        wrkMast.setModiUser(userId);
        wrkMastService.insert(wrkMast);
        for (OrderDetl orderDetl : param.getCombMats()) {
            Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("matnr",orderDetl.getMatnr()));
            if (mat == null) {
                throw new CoolException("保存工作档失败,物料信息不存在:" + orderDetl.getMatnr());
            }
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setOrderNo(orderDetl.getOrderNo());
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            wrkDetl.setIoTime(now);
            wrkDetl.setAnfme(orderDetl.getAnfme()); // 数量
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setBatch(orderDetl.getBatch());
            if(Cools.isEmpty(orderDetl.getBatch())){
                wrkDetl.setBatch("");
            }
            wrkDetl.setBoxType1(orderDetl.getBoxType1());
            wrkDetl.setBoxType2(orderDetl.getBoxType2());
            wrkDetl.setBoxType3(orderDetl.getBoxType3());
            wrkDetl.setStandby1(orderDetl.getStandby1());
            wrkDetl.setStandby2(orderDetl.getStandby2());
            wrkDetl.setStandby3(orderDetl.getStandby3());
            // 生成工作档明细
            wrkDetlService.insert(wrkDetl);
            if (!Cools.isEmpty(orderDetl.getOrderNo())) {
                OrderPakin order = orderPakinService.selectByNo(orderDetl.getOrderNo());
                if (Cools.isEmpty(order)){
                    continue;
                }
                OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBrand(),orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3());
                if (Cools.isEmpty(orderDetlPakin)){
                    continue;
                }
                if (orderDetlPakin.getAnfme() < (orderDetlPakin.getWorkQty() + orderDetl.getAnfme())) {
                    throw new CoolException("并板数量出错,订单剩余出库数量小于已出库数量与将并板数量之和!!!");
                }
                // 修改订单明细作业数量
                if (!orderDetlPakinService.increaseWorkQty(orderDetlPakin.getOrderId(), orderDetlPakin.getMatnr(), orderDetlPakin.getBatch(), orderDetlPakin.getBrand(),
                        orderDetlPakin.getStandby1(), orderDetlPakin.getStandby2(), orderDetlPakin.getStandby3(), orderDetlPakin.getBoxType1(), orderDetlPakin.getBoxType2(), orderDetlPakin.getBoxType3(),orderDetl.getAnfme())) {
                    throw new CoolException("修改单据明细工作数量失败");
                }
                if (order.getSettle() == 1){
                    orderPakinService.updateSettle(order.getId(), 2L, userId);
                }
            }
        }
        return R.ok();
    }
    @Override
    @Transactional
    public R pickConfirm(PickConfirmParam param,Long userId) {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                .eq("loc_no", param.getLocNo()));
        if (!locMast.getLocSts().equals("F")) {
            return R.error("库位状态不是在库");
        }
        // 判断库位是否冻结
        String sourceLocFrozen = locMastMapper.findFirstFrozenLocNo(Collections.singletonList(locMast.getLocNo()));
        if (sourceLocFrozen != null) {
            throw new CoolException(sourceLocFrozen + "库位已被冻结!");
        }
        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                .eq("type_no", 104)
                .eq("stn_no", param.getStaNo()));
        if (staDesc == null) {
            return R.error("站点不存在");
        }
        OrderDetlPakin orderDetlPakin = null;
        //检验传参是否和订单明细匹配
        for (PickMatParam matParam : param.getList()) {
            orderDetlPakin = orderDetlPakinService.selectItem
                    (matParam.getOrderNo(), matParam.getMatnr(),matParam.getBatch(),matParam.getBrand(),
                            matParam.getStandby1(),matParam.getStandby2(),matParam.getStandby3(),
                            matParam.getBoxType1(),matParam.getBoxType2(),matParam.getBoxType3());
            if (orderDetlPakin == null) {
                return R.error("物料数据不存在");
            }
            //剩余可用数量
            double count = orderDetlPakin.getAnfme() - orderDetlPakin.getWorkQty();
            if (matParam.getCount() != count) {
                return R.error("物料数据已过期");
            }
            if (matParam.getUseCount() > count) {
                return R.error("可用数量不足");
            }
        }
        Date now = new Date();
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(104));
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L); // 工作状态:101.生成出库
        wrkMast.setIoType(104); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
        wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
        wrkMast.setSourceLocNo(param.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("Y"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setBarcode(locMast.getBarcode());
        wrkMast.setAppeUser(userId); // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        wrkMast.setCrnNo(staDesc.getCrnNo());
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败,出库库位号:" + param.getLocNo());
        }
        // 生成工作档明细
        for (PickMatParam matParam : param.getList()) {
            Wrapper<Mat> wrapper = new EntityWrapper<>();
            wrapper.eq("status", 1);
            wrapper.eq("matnr", matParam.getMatnr());
            Mat mat = matService.selectOne(wrapper);
            if (mat == null) {
                throw new CoolException("保存工作档失败,物料信息不存在:" + matParam.getMatnr());
            }
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setBatch(matParam.getBatch());
            wrkDetl.setOrderNo(matParam.getOrderNo());
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setIoTime(now);
            wrkDetl.setAnfme(matParam.getUseCount()); // 数量
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            if(Cools.isEmpty(matParam.getBatch())){
                wrkDetl.setBatch("");
            }
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
            //更新订单工作数量
            orderDetlPakinService.increaseWorkQty(orderDetlPakin.getOrderId(), matParam.getMatnr(),
                    matParam.getBatch(),matParam.getBrand(),matParam.getStandby1(),matParam.getStandby2(),matParam.getStandby3(),
                    matParam.getBoxType1(),matParam.getBoxType2(),matParam.getBoxType3(),matParam.getUseCount());
            // 更新工作档状态
            orderPakinService.updateSettle(orderDetlPakin.getOrderId(),2L,userId);
        }
        // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
        locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", param.getLocNo()));
        if (locMast.getLocSts().equals("F")) {
            locMast.setLocSts("P");
            locMast.setModiUser(userId);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("预约库位状态失败,库位号:" + param.getLocNo());
            }
        } else {
            throw new CoolException(param.getLocNo() + "库位不是在库状态");
        }
        return R.ok();
    }
    @Override
    @Transactional
    public R WarehouseOutV1(CombParam combParam, Long hostId, Long userId) {
        //判断库位状态
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", combParam.getLocNo()));
        if (Cools.isEmpty(locMast)){
            return R.error("该库位不存在");
        }
        if (!locMast.getLocSts().equals("P")){
            return R.error("该库位状态为:"+locMast.getLocSts()+",不满足并板途中拣选条件!!!");
        }
        //查询库存数据
        for (CombParam.CombMat combMat :combParam.getCombMats()){
            List<LocDetl> locDetlList = locDetlService.selectList(new EntityWrapper<LocDetl>()
                            .eq("loc_no", combParam.getLocNo())
                            .eq("matnr", combMat.getMatnr())
            );
            if (locDetlList.isEmpty()){
                return R.error("未查询到库存数据");
            }
            if (locDetlList.size()>1){
                return R.error("库存数据大于1条,为保证数据准确性,请用正常流程出库!!!");
            }
            LocDetl locDetl = locDetlList.get(0);
            if (combMat.getAnfme() > locDetl.getAnfme()){
                return R.error("拣选数量错误,超出库存数量");
            }
            if (!Cools.isEmpty(combMat.getOrderNo())){
                OrderPakout orderPakout = orderPakoutService.selectByNo(combMat.getOrderNo());
                if (Cools.isEmpty(orderPakout)){
                    continue;
                }
                if (orderPakout.getSettle() == 1){
                    OrderInAndOutUtil.updateOrder(false,orderPakout.getId(), 2L, 9527L);
                }
                OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(orderPakout.getId(), combMat.getMatnr(), combMat.getBatch(),
                        combMat.getBrand(), combMat.getStandby1(), combMat.getStandby2(), combMat.getStandby3(), combMat.getBoxType1(), combMat.getBoxType2(), combMat.getBoxType3());
                if (Cools.isEmpty(orderDetlPakout)){
                    continue;
                }
                if (orderDetlPakout.getAnfme() < (orderDetlPakout.getWorkQty()+combMat.getAnfme())){
                    throw new CoolException("拣选数量出错,订单剩余出库数量小于已出库数量与将拣选数量之和!!!");
                }
                // 修改订单明细作业数量
                if (!orderDetlPakoutService.increaseWorkQty(orderDetlPakout.getOrderId(), combMat.getMatnr(), combMat.getBatch(), combMat.getBrand(),
                        combMat.getStandby1(), combMat.getStandby2(), combMat.getStandby3(), combMat.getBoxType1(), combMat.getBoxType2(), combMat.getBoxType3(),combMat.getAnfme())) {
                    throw new CoolException("修改单据明细工作数量失败");
                }
//                // 修改订单明细完成数量
//                if (!orderDetlPakoutService.increase(orderPakout.getId(),combMat.getMatnr(), combMat.getBatch(), combMat.getBrand(),
//                        combMat.getStandby1(), combMat.getStandby2(), combMat.getStandby3(), combMat.getBoxType1(), combMat.getBoxType2(), combMat.getBoxType3(),combMat.getAnfme())) {
//                    throw new CoolException("修改单据明细完成数量失败");
//                }
//                // 修改订单状态 作业中 ===>> 已完成
//                orderPakoutService.checkComplete(combMat.getOrderNo());
            }
            try {
                Date now = new Date();
                // 创建入库工作档
                WrkMast wrkMast = new WrkMast();
                wrkMast.setWrkNo(commonService.getWorkNo(2));
                wrkMast.setIoTime(now);
                wrkMast.setWrkSts(14L); // 工作状态:出库完成
                wrkMast.setIoType(108); // 入出库状态:出库,拣料入库
                wrkMast.setIoPri(13D); // 优先级
                wrkMast.setCrnNo(1);
                wrkMast.setSourceStaNo(1);
                wrkMast.setStaNo(1);
                wrkMast.setSourceLocNo(combParam.getLocNo());
                wrkMast.setBarcode(combParam.getBarcode()); // 托盘码
                wrkMast.setFullPlt("Y"); // 满板:Y
                wrkMast.setPicking("N"); // 拣料
                wrkMast.setExitMk("N"); // 退出
                wrkMast.setEmptyMk("N"); // 空板
                wrkMast.setLinkMis("Y");
                wrkMast.setCtnType(0); // 容器类型
                // 操作人员数据
                wrkMast.setAppeTime(now);
                wrkMast.setModiTime(now);
                wrkMast.setAppeUser(userId);
                wrkMast.setModiUser(userId);
                wrkMastService.insert(wrkMast);
                Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("matnr",combMat.getMatnr()));
                if (mat == null) {
                    throw new CoolException("保存工作档失败,物料信息不存在:" + combMat.getMatnr());
                }
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(mat);
                wrkDetl.setOrderNo(combMat.getOrderNo());
                wrkDetl.setWrkNo(wrkMast.getWrkNo());
                wrkDetl.setIoTime(now);
                wrkDetl.setAnfme(combMat.getAnfme()); // 数量
                wrkDetl.setAppeTime(now);
                wrkDetl.setAppeUser(userId);
                wrkDetl.setModiTime(now);
                wrkDetl.setModiUser(userId);
                wrkDetl.setZpallet(wrkMast.getBarcode());
                wrkDetl.setBatch(combMat.getBatch());
                if(Cools.isEmpty(combMat.getBatch())){
                    wrkDetl.setBatch("");
                }
                wrkDetl.setBoxType1(combMat.getBoxType1());
                wrkDetl.setBoxType2(combMat.getBoxType2());
                wrkDetl.setBoxType3(combMat.getBoxType3());
                wrkDetl.setStandby1(combMat.getStandby1());
                wrkDetl.setStandby2(combMat.getStandby2());
                wrkDetl.setStandby3(combMat.getStandby3());
                // 生成工作档明细
                wrkDetlService.insert(wrkDetl);
                System.out.println("正常");
            }catch (Exception e) {
                throw new CoolException("操作数据异常:"+e.getMessage());
            }
        }
        return R.ok("操作成功!");
    }
    @Override
    public R orderOutListOrder(String barcode, Long userId) {
        ArrayList<WrkMast> wrkMastArrayList = new ArrayList<>();
        if (Cools.isEmpty(barcode) || barcode.isEmpty()) {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("wrk_sts", 14L)
                    .eq("io_type", 104));
            wrkMastArrayList.addAll(wrkMasts);
            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("wrk_sts", 14L)
                    .eq("io_type", 107));
            wrkMastArrayList.addAll(wrkMasts1);
        } else {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .like("barcode", barcode)
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 104));
            wrkMastArrayList.addAll(wrkMasts);
            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .like("barcode", barcode)
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 107));
            wrkMastArrayList.addAll(wrkMasts1);
        }
        return R.ok().add(wrkMastArrayList);
    }
    @Override
    public R orderOutListOrderPick(String barcode, Long userId) {
        ArrayList<WrkMast> wrkMastArrayList = new ArrayList<>();
        if (Cools.isEmpty(barcode) || barcode.isEmpty()) {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 103));
            wrkMastArrayList.addAll(wrkMasts);
            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 107));
            wrkMastArrayList.addAll(wrkMasts1);
        } else {
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .like("barcode", barcode)
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 103)
            );
            wrkMastArrayList.addAll(wrkMasts);
            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                    .like("barcode", barcode)
                    .eq("wrk_sts", 199L)
                    .eq("io_type", 107));
            wrkMastArrayList.addAll(wrkMasts1);
        }
        return R.ok().add(wrkMastArrayList);
    }
    @Override
    public R pickMats(String matnr, String orderNo) {
        List<DocType> docTypes = docTypeService.selectList(new EntityWrapper<DocType>().like("pakin", "1"));
        ArrayList<Long> typeList = new ArrayList<>();
        for (DocType docType : docTypes) {
            typeList.add(docType.getDocId());
        }
        Wrapper<Order> wrapper = new EntityWrapper<>();
        wrapper.eq("status", 1);
        wrapper.in("doc_type", typeList);
        List<Order> orders = orderService.selectList(wrapper);
        ArrayList<Long> orderIds = new ArrayList<>();
        for (Order order : orders) {
            orderIds.add(order.getId());
        }
        //搜索明细
        Wrapper<OrderDetl> wrapper1 = new EntityWrapper<>();
        wrapper1.eq("status", 1);
        wrapper1.in("order_id", orderIds);
        wrapper1.orderBy("create_time",false);
        if (!Cools.isEmpty(matnr)) {
            wrapper1.like("matnr", matnr);
        }
        if (!Cools.isEmpty(orderNo)) {
            wrapper1.like("order_no", orderNo);
        }
        List<OrderDetl> list = orderDetlService.selectList(wrapper1);
        ArrayList<PickMatParam> maps = new ArrayList<>();
        for (OrderDetl orderDetl : list) {
            //剩余可用数量
            double count = orderDetl.getAnfme() - orderDetl.getWorkQty();
            if (count <= 0) {
                continue;
            }
            PickMatParam matParam = new PickMatParam();
            matParam.setMatnr(orderDetl.getMatnr());
            matParam.setBatch(orderDetl.getBatch());
            matParam.setOrderNo(orderDetl.getOrderNo());
            matParam.setOrderId(orderDetl.getOrderId());
            matParam.setCount(count);
            matParam.setUseCount(count);
            maps.add(matParam);
        }
        return R.ok().add(maps);
    }
    @Override
    @Transactional
@@ -215,10 +673,10 @@
    public void onSale(CombParam param) {
        Date now = new Date();
        // 获取库位号
        String locno = param.getLocno();
        String locno = param.getLocNo();
        Node node = nodeService.selectByUuid(locno);
        if (Cools.isEmpty(node)) {
            throw new CoolException(param.getLocno() + ":库位不存在");
            throw new CoolException(param.getLocNo() + ":库位不存在");
        }
        // 获取商品列表