自动化立体仓库 - WMS系统
zyx
2023-08-04 3f30983db5b3cd2b25cb215579501a2ef134883c
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -1,22 +1,23 @@
package com.zy.asrs.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.AgvLocMast;
import com.zy.asrs.entity.AgvWaitPakin;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
import com.zy.common.model.DetlDto;
import com.zy.common.model.LocDto;
import com.zy.common.model.OrderDto;
import com.zy.common.model.StartupDto;
import com.zy.common.model.TaskDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.AgvCommonService;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -39,20 +40,32 @@
    @Autowired
    private AgvLocMastService agvLockMastService;
    @Autowired
    private AgvLocDetlService agvLocDetlService;
    @Autowired
    private AgvCommonService agvCommonService;
    @Autowired
    private AgvWrkMastService agvWrkMastService;
    @Autowired
    private AgvWrkDetlService agvWrkDetlService;
    @Autowired
    private MatService matService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Override
    /*
    入库
     */
    @Transactional
    public StartupDto createWaitPainWrkMastStart(List<AgvBasDevp> agvBasDevpList, Long userId) {
        Date now = new Date();
        agvBasDevpList.forEach(agvBasDevp -> {
            if(Cools.isEmpty(agvBasDevp.getBarcode())){
                throw new CoolException("选中的站点中含有位绑定托盘的站点,请重新选择");
                throw new CoolException("选中的站点中含有未绑定托盘的站点,请重新选择");
            }
            if(!"F".equals(agvBasDevp.getLocSts())){
@@ -64,74 +77,237 @@
            //检索库位,选择合适的库位
            AgvLocMast agvLocMast = agvCommonService.getLocNo(agvWaitPakinList, agvBasDevp.getFloor());
            //生成工作档
            AgvWrkMast wrkMast = createWrkMast(agvBasDevp, agvLocMast, now, userId);
            //AgvWrkMast wrkMast = createWrkMast(agvBasDevp, agvLocMast, now, userId);
            AgvWrkMast wrkMast = createWrkMast(1,201L,agvBasDevp.getDevNo(),agvLocMast.getLocNo(),agvBasDevp.getBarcode(),now,userId);
            //生成工作档明细
            createWrkDetl(agvWaitPakinList,wrkMast,userId);
            //createWrkDetlReWrite(agvWaitPakinList,wrkMast,userId);
            agvWaitPakinList.forEach(wp -> {
                createWrkDetlReWrite(wp.getMatnr(),wrkMast.getWrkNo(),wp.getOrderNo(),wp.getBatch(),wp.getAnfme(),wp.getZpallet(),now,userId);
            });
            //更新源站点信息
            updateAgvBasDevp(agvBasDevp);
            updateAgvBasDevp(agvBasDevp,"R");
            //更新目标库位状态
            updateAgvLocMast(agvLocMast);
            updateAgvLocMast(agvLocMast,"S");
        });
        //TODO
        return null;
    }
    /*
    订单出库
     */
    @Transactional
    public void stockOutWrkMast(List<TaskDto> agvTaskDtos, Long userId) {
        Date now = new Date();
        agvTaskDtos.forEach(taskDto -> {
            AgvLocMast agvLocMast = agvLockMastService.selectById(taskDto.getLocNo());
            AgvLocDetl agvLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no", taskDto.getLocNo()));
            //工作档所需参数
            double anfme = taskDto.getLocDtos().get(0).getAnfme();
            long wrkSts = 21L;
            String sourceLocNo = taskDto.getLocNo();
            String targetLocNo = taskDto.getAgvStaNo();
            String barcode = agvLocDetl.getZpallet();
            //明细档所需参数
            String mantr = taskDto.getLocDtos().get(0).getMatnr();
            String orderNo = taskDto.getLocDtos().get(0).getOrderNo();
            String batch = taskDto.getLocDtos().get(0).getBatch();
            //判断是否全板出库
            int ioType = isPakOut(sourceLocNo,anfme) ?  101 : 103;
            //生成工作档
            AgvWrkMast wrkMast = createWrkMast(ioType,wrkSts,sourceLocNo,targetLocNo,barcode,now,userId);
            //生成工作档明细
            createWrkDetlReWrite(mantr,wrkMast.getWrkNo(),orderNo,batch,anfme,barcode,now,userId);
            //修改订单信息
            modifyOrderDetl(taskDto.getLocDtos().get(0), userId);
            //更新源站点信息
            String locSts = ioType == 101 ? "R" : "P";
            updateAgvLocMast(agvLockMastService.selectById(sourceLocNo),locSts);
            //更新目标站点状态
            //locSts = ioType == 101 ? "S" : "Q";
            updateAgvBasDevp(agvBasDevpService.selectById(targetLocNo),"S");
        });
    }
    //拣料入库
    @Transactional
    public void pickIn(List<AgvWrkMast> agvWrkMastList){
        Date now = new Date();
        agvWrkMastList.forEach(agvWrkMast -> {
            //修改工作党
            agvWrkMast.setWrkSts(201L);
            agvWrkMast.setIoType(53);
            String locNo = agvWrkMast.getLocNo();
            agvWrkMast.setLocNo(agvWrkMast.getSourceLocNo());
            agvWrkMast.setSourceLocNo(locNo);
            agvWrkMast.setIoTime(now);
            agvWrkMastService.updateById(agvWrkMast);
            AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
            AgvLocMast agvLocMast = agvLockMastService.selectById(agvWrkMast.getLocNo());
            AgvLocDetl agvLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvLocMast.getLocNo()));
            AgvBasDevp agvBasDevp = agvBasDevpService.selectById(agvWrkMast.getSourceLocNo());
            //修改工作党明细
            agvWrkDetl.setAnfme(agvLocDetl.getAnfme() - agvWrkDetl.getAnfme());
            agvWrkDetlService.update(agvWrkDetl,new EntityWrapper<AgvWrkDetl>().eq("wrk_no",agvWrkDetl.getWrkNo()));
            //修改库存信息
            agvLocDetl.setAnfme(agvWrkDetl.getAnfme());
            agvLocDetlService.update(agvLocDetl,new EntityWrapper<AgvLocDetl>().eq("loc_no",agvLocDetl.getLocNo()));
            //修改库位信息
            agvLocMast.setLocSts("Q");
            agvLockMastService.selectById(agvLocMast);
            //修改站点信息
            agvBasDevp.setLocSts("R");
            agvBasDevpService.updateById(agvBasDevp);
        });
    }
    /*
    更新目标库位信息
     */
    private void updateAgvLocMast(AgvLocMast locMast){
        locMast.setLocSts("S");
    private void updateAgvLocMast(AgvLocMast locMast, String locSts){
        locMast.setLocSts(locSts);
        agvLockMastService.updateById(locMast);
    }
    /*
    更新源站点信息
     */
    private void updateAgvBasDevp(AgvBasDevp agvBasDevp){
        agvBasDevp.setLocSts("R");
    private void updateAgvBasDevp(AgvBasDevp agvBasDevp, String locSts){
        agvBasDevp.setLocSts(locSts);
        agvBasDevpService.updateById(agvBasDevp);
    }
    /*
    生成工作档明细
     */
    private void createWrkDetl(List<AgvWaitPakin> agvWaitPakinList, AgvWrkMast wrkMast, Long userId){
        List<DetlDto> detlDtos = new ArrayList<>();
        agvWaitPakinList.forEach(agvWaitPakin -> {
            DetlDto detlDto = new DetlDto(agvWaitPakin.getMatnr(), agvWaitPakin.getBatch(), agvWaitPakin.getAnfme());
            if (DetlDto.has(detlDtos, detlDto)) {
                DetlDto detlDto1 = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch());
                assert detlDto1 != null;
                detlDto1.setAnfme(detlDto1.getAnfme() + detlDto.getAnfme());
            } else {
                detlDtos.add(detlDto);
    private void createWrkDetlReWrite(String matnr, int wrkNo, String orderNo,String batch, double anfme, String zpallet, Date now, Long userId){
        Mat mat = matService.selectByMatnr(matnr);
        if (Cools.isEmpty(mat)) {
            throw new CoolException(matnr + "商品维护失败");
        }
        AgvWrkDetl wrkDetl = new AgvWrkDetl();
        wrkDetl.sync(mat);
        wrkDetl.setWrkNo(wrkNo);
        wrkDetl.setOrderNo(orderNo);
        wrkDetl.setIoTime(now);
        wrkDetl.setBatch(batch);
        wrkDetl.setAnfme(anfme); // 数量
        wrkDetl.setZpallet(zpallet); // 托盘条码
        wrkDetl.setAppeUser(userId);
        wrkDetl.setAppeTime(now);
        wrkDetl.setModiUser(userId);
        wrkDetl.setModiTime(now);
        if (!agvWrkDetlService.insert(wrkDetl)) {
            throw new CoolException("保存工作明细失败");
        }
    }
    /*
    生成工作档明细
     */
    @Deprecated
    private void createWrkDetlReWrite(List<AgvWaitPakin> agvWaitPakinList, AgvWrkMast wrkMast, Long userId){
        Date now = new Date();
        agvWaitPakinList.stream().forEach(agvWaitPakin -> {
            Mat mat = matService.selectByMatnr(agvWaitPakin.getMatnr());
            if (Cools.isEmpty(mat)) {
                throw new CoolException(agvWaitPakin.getMatnr() + "商品维护失败");
            }
            AgvWrkDetl wrkDetl = new AgvWrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            wrkDetl.setOrderNo(agvWaitPakin.getOrderNo());
            wrkDetl.setIoTime(now);
            wrkDetl.setBatch(agvWaitPakin.getBatch());
            wrkDetl.setAnfme(agvWaitPakin.getAnfme()); // 数量
            wrkDetl.setZpallet(agvWaitPakin.getZpallet()); // 托盘条码
            wrkDetl.setAppeUser(userId);
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiUser(userId);
            wrkDetl.setModiTime(now);
            if (!agvWrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细失败");
            }
        });
        agvWrkDetlService.createWorkDetail(wrkMast.getWrkNo(), detlDtos, wrkMast.getBarcode(), userId);
    }
    /*
    生成工作档
     */
    private AgvWrkMast createWrkMast(int ioType, long wrkSts, String sourceLocNo, String locNo, String barcode,  Date now, Long userId){
        AgvWrkMast wrkMast = new AgvWrkMast();
        //生成工作号
        int workNo = agvCommonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        wrkMast.setWrkNo(workNo);
        //工作状态
        wrkMast.setWrkSts(wrkSts);
        //入出库类型
        wrkMast.setIoType(ioType);
        wrkMast.setIoTime(now);
        //优先级
        wrkMast.setIoPri(300.0);
        //源站点
        wrkMast.setSourceLocNo(sourceLocNo);
        //目标站点
        wrkMast.setLocNo(locNo);
        //容器编码
        wrkMast.setBarcode(barcode);
        // 满板:Y
        //wrkMast.setFullPlt("Y");
        // 拣料
        //wrkMast.setPicking("N");
        // 退出
        //wrkMast.setExitMk("N");
        // 空板
        //wrkMast.setEmptyMk("N");
        //wrkMast.setLinkMis("N");
        wrkMast.setAppeUser(userId);
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (!agvWrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败");
        }
        return wrkMast;
    }
    /*
    生成工作档
     */
    @Deprecated
    private AgvWrkMast createWrkMast(AgvBasDevp agvBasDevp,AgvLocMast agvLocMast, Date now, Long userId){
        AgvWrkMast wrkMast = new AgvWrkMast();
        //生成工作号
        int workNo = agvCommonService.getWorkNo(0);
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(201L); // 工作状态:201.生成入库任务ID
        wrkMast.setIoType(1); // 入出库状态:1.入库
        // 工作状态:201.生成入库任务ID
        wrkMast.setWrkSts(201L);
        // 入出库状态:1.入库
        wrkMast.setIoType(1);
        //生成优先级
        wrkMast.setIoPri(300.0);
        wrkMast.setSourceLocNo(agvBasDevp.getDevNo());
        wrkMast.setLocNo(agvLocMast.getLocNo());
        wrkMast.setBarcode(agvBasDevp.getBarcode());
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        // 满板:Y
        wrkMast.setFullPlt("Y");
        // 拣料
        wrkMast.setPicking("N");
        // 退出
        wrkMast.setExitMk("N");
        // 空板
        wrkMast.setEmptyMk("N");
        wrkMast.setLinkMis("N");
        wrkMast.setAppeUser(userId);
        wrkMast.setAppeTime(now);
@@ -141,6 +317,62 @@
            throw new CoolException("保存工作档失败");
        }
        return wrkMast;
    }
    private boolean isPakOut(String locNo, double anfme){
        AgvLocDetl agvLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no", locNo));
        if(agvLocDetl.getAnfme() > anfme){
            return false;
        }
        return true;
    }
    /*
    AGV生成出库工作档后修改订单信息
    TODO 与四项库生成出库工作档后修改订单信息整合到一起
     */
    private void modifyOrderDetl(LocDto locDto, Long userId){
        if (!BaseController.isJSON(locDto.getOrderNo())) {
            //非合并出库
            OrderDetl orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
            if (orderDetl == null) {
                orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
            }
            if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme())) {
                throw new CoolException("修改订单明细数量失败");
            }
            orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
        }else {
            //合并出库
            List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class);
            //实际出库数量
            Double locAnfme = locDto.getAnfme();
            //订单实际出库数量
            Double orderAnfme;
            for (OrderDto orderDto : orderDtoList) {
                OrderDetl orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
                if (orderDetl == null) {
                    orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), null);
                }
                if(locAnfme > orderDetl.getAnfme()){
                    orderAnfme = orderDetl.getAnfme();
                    locAnfme -= orderAnfme;
                }else {
                    orderAnfme = locAnfme;
                }
                if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderAnfme)) {
                    throw new CoolException("修改订单明细数量失败");
                }
                orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
            }
        }
    }
}