zjj
2024-05-30 09284f08c7a901f684cf26ccb0e51a9204d9cd64
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/WorkServiceImpl.java
@@ -5,6 +5,7 @@
import com.zy.asrs.common.domain.entity.StaDesc;
import com.zy.asrs.common.domain.enums.IoWorkType;
import com.zy.asrs.common.domain.enums.WorkNoType;
import com.zy.asrs.common.domain.param.EmptyPlateOutParam;
import com.zy.asrs.common.domain.param.FullStoreParam;
import com.zy.asrs.common.domain.param.LocDetlAdjustParam;
import com.zy.asrs.common.domain.param.StockOutParam;
@@ -22,6 +23,7 @@
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2020/6/11
@@ -66,7 +68,11 @@
        }
        Date now = new Date();
        LocTypeDto locTypeDto = new LocTypeDto();
        StartupDto dto = commonService.getLocNo(1, param.getDevpNo(), hostId, locTypeDto, 0);
        locTypeDto.setLocType1(param.getLocType1());
        locTypeDto.setLocRangeDto(param.getLocRangeDto());
        List<String> matnrs = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatnr).distinct().collect(Collectors.toList());
        String batch = param.getList().get(0).getBatch();
        StartupDto dto = commonService.getLocNo(1, param.getDevpNo(), matnrs, batch, hostId, locTypeDto, 0);
        // 生成工作号
        int workNo = dto.getWorkNo();
        // 生成工作档
@@ -89,6 +95,7 @@
        wrkMast.setModiUser(String.valueOf(userId));
        wrkMast.setModiTime(now);
        wrkMast.setHostId(hostId);
        wrkMast.setCrnNo(dto.getCrnNo());
        if (!wrkMastService.save(wrkMast)) {
            throw new CoolException("保存工作档失败");
        }
@@ -144,6 +151,64 @@
    }
    @Override
    public String emptyPlateIn(Integer devpNo, Long userId, Long hostId) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true, hostId);
        // 检索库位
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        StartupDto dto = commonService.getLocNo(10, devpNo, null, null, hostId, locTypeDto, 0);
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(1L); // 工作状态:生成入库ID
        wrkMast.setIoType(10); // 入出库状态:10.空板入库
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setCrnNo(dto.getCrnNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo());
        wrkMast.setStaNo(dto.getStaNo());
        wrkMast.setLocNo(dto.getLocNo());
        wrkMast.setFullPlt("N"); // 满板
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("Y"); // 空板
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        // 操作人员数据
        wrkMast.setAppeUser(String.valueOf(userId));
        wrkMast.setAppeTime(new Date());
        wrkMast.setModiUser(String.valueOf(userId));
        wrkMast.setModiTime(new Date());
        wrkMast.setHostId(hostId);
        boolean res = wrkMastService.save(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiUser(userId);
        sourceStaNo.setModiTime(new Date());
        if (!basDevpService.updateById(sourceStaNo)){
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.getOne(new LambdaQueryWrapper<LocMast>()
                .eq(LocMast::getLocNo, dto.getLocNo())
                .eq(LocMast::getHostId, hostId));
        if (locMast.getLocSts().equals("O")){
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiUser(userId);
            locMast.setModiTime(new Date());
            if (!locMastService.updateById(locMast)){
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
        }
        return dto.getLocNo();
    }
    @Override
    @Transactional
    public void startupFullTakeStore(StockOutParam param, Long userId, Long hostId) {
        // 获取库位明细
@@ -159,6 +224,90 @@
            stockOut(param.getOutSite(), locDetlDtos, null, userId, hostId);
        } else {
            throw new CoolException("库存不存在");
        }
    }
    @Override
    public void emptyPlateOut(EmptyPlateOutParam param, Long userId, Long hostId) {
        if (Cools.isEmpty(param.getOutSite())) {
            throw new CoolException("站点不存在");
        }
        for (String locNo : param.getLocNos()) {
            // 获取工作号
            int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
            // 获取库位
            LocMast locMast = locMastService.getOne(new LambdaQueryWrapper<LocMast>()
                    .eq(LocMast::getLocNo, locNo)
                    .eq(LocMast::getHostId, hostId));
            if (Cools.isEmpty(locMast)) {
                throw new CoolException(locNo+"库位不存在");
            }
            if (!locMast.getLocSts().equals("D")){
                throw new CoolException("所选库位存在状态不为D的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$());
            }
            // 获取源站
            StaDesc staDesc = staDescService.getOne(new LambdaQueryWrapper<StaDesc>()
                    .eq(StaDesc::getTypeNo, 110)
                    .eq(StaDesc::getStnNo, param.getOutSite())
                    .eq(StaDesc::getDeviceNo, locMast.getCrnNo()));
            Integer sourceStaNo = staDesc.getDeviceStn();
            if (Cools.isEmpty(sourceStaNo)) {
                throw new CoolException("检索源站失败");
            }
            Date now = new Date();
            // 保存工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(101L); // 工作状态:101.生成出库ID
            wrkMast.setIoType(110); // 入出库状态: 110.空板出库
            wrkMast.setIoPri(10D);
            wrkMast.setSourceStaNo(sourceStaNo); // 源站
            wrkMast.setStaNo(param.getOutSite()); // 目标站
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceLocNo(locNo); // 源库位
            wrkMast.setFullPlt("N"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("Y"); // 空板
            wrkMast.setAppeUser(String.valueOf(userId));
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(String.valueOf(userId));
            wrkMast.setModiTime(now);
            wrkMast.setHostId(hostId);
            boolean res = wrkMastService.save(wrkMast);
            if (!res) {
                throw new CoolException("保存工作档失败");
            }
            // 更新库位状态 D.空板 -> R.出库预约
            if (locMast.getLocSts().equals("D")){
                locMast.setLocSts("R");
                locMast.setModiUser(userId);
                locMast.setModiTime(now);
                if (!locMastService.updateById(locMast)) {
                    throw new CoolException("更新库位状态失败");
                }
            }
        }
    }
    @Override
    public void locCheckOut(StockOutParam param, Long userId, Long hostId) {
        // 目标站点状态检测
        BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite(), false, hostId);
        // 获取库位明细
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
            if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
                LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch(), hostId);
                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
            }
        }
        if (!locDetlDtos.isEmpty()) {
            // 启动出库开始 107.盘点出库
            stockOut(param.getOutSite(), locDetlDtos, IoWorkType.CHECK_OUT, userId, hostId);
        } else {
            throw new CoolException("库位物料不存在");
        }
    }
@@ -196,7 +345,7 @@
            // 获取库位
            LocMast locMast = locMastService.getOne(new LambdaQueryWrapper<LocMast>().eq(LocMast::getLocNo, dto.getLocNo()).eq(LocMast::getHostId, hostId));
            // 获取路径
            StaDesc staDesc = staDescService.getOne(new LambdaQueryWrapper<StaDesc>().eq(StaDesc::getTypeNo, ioType).eq(StaDesc::getDeviceStn, staNo).eq(StaDesc::getHostId, hostId));
            StaDesc staDesc = staDescService.getOne(new LambdaQueryWrapper<StaDesc>().eq(StaDesc::getTypeNo, ioType).eq(StaDesc::getStnNo, staNo).eq(StaDesc::getHostId, hostId));
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
            // 生成工作档
@@ -219,6 +368,7 @@
            wrkMast.setModiUser(String.valueOf(userId));
            wrkMast.setModiTime(now);
            wrkMast.setHostId(hostId);
            wrkMast.setCrnNo(staDesc.getDeviceNo());
            if (!wrkMastService.save(wrkMast)) {
                throw new CoolException("保存工作档失败,出库库位号:" + dto.getLocNo());
            }
@@ -362,7 +512,7 @@
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
        }
        if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 14) {
        if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 199) {
            throw new CoolException("当前工作档已完成");
        }
        // 入库 + 库位转移
@@ -389,6 +539,14 @@
        if (Cools.isEmpty(wrkMast)) {
            throw new CoolException(workNo + "工作档不存在");
        }
        if (wrkMast.getIoType() == 300) {
            //RGV调度任务
            //删除工作档
            wrkMastService.removeById(wrkMast.getId());
            return;
        }
        String locNo = ""; // 待修改目标库位
        String locSts = ""; // 待修改目标库位状态
        // 入库取消(修改目标库位)