自动化立体仓库 - WMS系统
#
luxiaotao1123
2021-07-02 52241e80f87805d69b5682469f7f98fb14cbbf18
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -1,10 +1,12 @@
package com.zy.asrs.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.BaseRes;
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.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
@@ -13,12 +15,12 @@
import com.zy.asrs.entity.param.StockOutParam;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.VersionUtils;
import com.zy.common.model.LocDetlDto;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.OutLocDto;
import com.zy.common.model.StartupDto;
import com.zy.common.model.*;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.service.wms.Result;
import com.zy.common.service.wms.WmsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -30,6 +32,7 @@
/**
 * Created by vincent on 2020/6/11
 */
@Slf4j
@Service
public class WorkServiceImpl implements WorkService {
@@ -60,6 +63,10 @@
    private WrkMastLogService wrkMastLogService;
    @Autowired
    private WrkDetlLogService wrkDetlLogService;
    @Autowired
    private WmsService wmsService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Override
    @Transactional
@@ -72,8 +79,10 @@
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getDevpNo(), true);
        // 检索库位
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        log.info(JSON.toJSONString(locTypeDto));
        log.info("{}入库口尺寸检测:{}", param.getDevpNo(), locTypeDto.getLocType1()==1?"低规格库位":"高规格库位");
        List<String> matNos = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatNo).distinct().collect(Collectors.toList());
        StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 1, param.getDevpNo(), matNos, locTypeDto);
        StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 1, param.getDevpNo(), matNos, locTypeDto, 0);
        // 生成工作号
        int workNo = dto.getWorkNo();
        // 生成工作档
@@ -149,7 +158,7 @@
        }
        if (!locDetlDtos.isEmpty()) {
            // 启动出库开始 101.出库
            stockOut(staNo, locDetlDtos, null, userId);
            stockOut(staNo, locDetlDtos, null, userId, null, false, null);
        } else {
            throw new CoolException("库位物料不存在");
        }
@@ -157,7 +166,7 @@
    @Override
    @Transactional
    public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, Integer ioType, Long userId) {
    public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, Integer ioType, Long userId, String allotNo, Boolean sell, Double more) {
        // 合并同类项
        Set<String> locNos = new HashSet<>();
        locDetlDtos.forEach(dto -> locNos.add(dto.getLocDetl().getLocNo()));
@@ -209,6 +218,9 @@
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setPacked(allotNo); // 平仓补仓单号
            wrkMast.setPdcType(sell?"Y":"N"); // ERP销售订单出库任务
            wrkMast.setRefWrkno(more==null?0.0D:more);
            wrkMast.setAppeUser(userId); // 操作人员数据
            wrkMast.setAppeTime(new Date());
            wrkMast.setModiUser(userId);
@@ -256,7 +268,7 @@
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 10, devpNo, null, locTypeDto);
        StartupDto dto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 10, devpNo, null, locTypeDto, 0);
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -385,7 +397,7 @@
        }
        if (!locDetlDtos.isEmpty()) {
            // 启动出库开始 107.盘点出库
            stockOut(staNo, locDetlDtos, 107, userId);
            stockOut(staNo, locDetlDtos, 107, userId, null, false, null);
        } else {
            throw new CoolException("库位物料不存在");
        }
@@ -539,12 +551,37 @@
                adjDetl.setOriQty(0.0D);
                adjDetl.setAdjQty(adjust.getCount());
                adjDetlService.save(adjDetl, userId);
                // 上报erp
                String docNum = "CS-" + String.valueOf(snowflakeIdWorker.nextId()).substring(0, 15);
                Integer docId = 14; // 报溢单
                List<BillDto> dtos = new ArrayList<>();
                BillDto billDto = new BillDto();
                billDto.setMatnr(adjust.getMatnr());
                billDto.setQty(Math.abs(adjust.getCount()));
                dtos.add(billDto);
                Result result = wmsService.erpUpload(dtos, docId, docNum);
                if (result.getCode() != 200) {
                    throw new CoolException("库存调整失败,原因:无法上报至ERP");
                }
            // 修改原库存明细
            } else {
                // 如果数量修改,则更新库存明细
                if (!adjust.getCount().equals(one.getAnfme())) {
                    // 当数量被修改为 0 时,直接清除库存明细
                    if (adjust.getCount() == 0) {
                        // 上报erp
                        String docNum = "CD-" + String.valueOf(snowflakeIdWorker.nextId()).substring(0, 15);
                        Integer docId = 9; // 报损单
                        List<BillDto> dtos = new ArrayList<>();
                        BillDto billDto = new BillDto();
                        billDto.setMatnr(adjust.getMatnr());
                        billDto.setQty(Math.abs(one.getAnfme()));
                        dtos.add(billDto);
                        Result result = wmsService.erpUpload(dtos, docId, docNum);
                        if (result.getCode() != 200) {
                            throw new CoolException("库存调整失败,原因:无法上报至ERP");
                        }
                        // 删除库存
                        if (!locDetlService.delete(new EntityWrapper<>(one))) {
                            throw new CoolException("清除库存明细失败");
                        }
@@ -557,6 +594,27 @@
                                .eq("loc_no", locMast.getLocNo())
                                .eq("matnr", adjust.getMatnr()))) {
                            throw new CoolException("修改库存明细失败");
                        }
                        // 上报erp
                        String docNum;
                        Integer docId;
                        if (one.getAnfme() > adjust.getCount()) {
                            // 报损
                            docNum = "CD-" + String.valueOf(snowflakeIdWorker.nextId()).substring(0, 15);
                            docId = 9;
                        } else {
                            // 报溢
                            docNum = "CS-" + String.valueOf(snowflakeIdWorker.nextId()).substring(0, 15);
                            docId = 14;
                        }
                        List<BillDto> dtos = new ArrayList<>();
                        BillDto billDto = new BillDto();
                        billDto.setMatnr(adjust.getMatnr());
                        billDto.setQty(Math.abs(one.getAnfme() - adjust.getCount()));
                        dtos.add(billDto);
                        Result result = wmsService.erpUpload(dtos, docId, docNum);
                        if (result.getCode() != 200) {
                            throw new CoolException("库存调整失败,原因:无法上报至ERP");
                        }
                    }
                    // 保存调整记录
@@ -647,12 +705,16 @@
        }
        // 删除工作主档
        boolean wrkMastRes = wrkMastService.deleteById(wrkMast);
        // 保存工作明细档历史档
        if (!wrkDetlLogService.save(wrkMast.getWrkNo())) {
            throw new CoolException("保存工作明细历史档失败, workNo = " + wrkMast.getWrkNo());
        if (wrkMast.getIoType() != 10 && wrkMast.getIoType() != 110) {
            // 保存工作明细档历史档
            if (!wrkDetlLogService.save(wrkMast.getWrkNo())) {
                throw new CoolException("保存工作明细历史档失败, workNo = " + wrkMast.getWrkNo());
            }
            // 删除工作档明细
            boolean wrkDetlRes = wrkDetlService.delete(new EntityWrapper<WrkDetl>().eq("wrk_no", workNo));
        }
        // 删除工作档明细
        boolean wrkDetlRes = wrkDetlService.delete(new EntityWrapper<WrkDetl>().eq("wrk_no", workNo));
        // 修改库位状态
        LocMast locMast = locMastService.selectById(locNo);
        if (Cools.isEmpty(locMast)) {
@@ -662,7 +724,7 @@
        locMast.setModiTime(new Date());
        locMast.setModiUser(userId);
        boolean locMastRes = locMastService.updateById(locMast);
        if (!wrkMastRes || !wrkDetlRes || !locMastRes) {
        if (!wrkMastRes || !locMastRes) {
            throw new CoolException("保存数据失败");
        }
    }