自动化立体仓库 - WMS系统
#
pang.jiabao
2024-08-06 2ff79b71d902e733a0cf0d70052ace24fa1c479e
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -19,6 +19,8 @@
import com.zy.common.model.StartupDto;
import com.zy.common.service.CommonService;
import com.zy.common.utils.NodeUtils;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -28,7 +30,6 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2022/4/9
@@ -73,6 +74,190 @@
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private ConfigService configService;
    @Override
    public R synCallowWarehousing() {
        Config outModel = configService.selectConfigByCode("outModel");
        if (outModel.getValue().equals("Y")) {
            // 没有到305的出库任务(305的出库任务优先)
            int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101)
                    .eq("sta_no", 305));
            if (count > 0) {
                return R.parse("存在305出库任务");
            }
            outModel.setValue("N");
            configService.updateById(outModel);
        }
        return R.ok();
    }
    @Autowired
    private WaitPakinService waitPakinService;
    @Override
    public R syncWarehousing(CombParam param) {
        Long userId = 9999L;
        // 参数非空判断
        if (Cools.isEmpty(param.getCombMats())) {
            throw new CoolException("数据不完整,请检查请求参数");
        }
        Config outModel = configService.selectConfigByCode("outModel");
        if (outModel.getValue().equals("Y")) {
            throw new CoolException("305不允许入库");
        }
        for (CombParam.CombMat combMat : param.getCombMats()) {
            String batch = combMat.getBatch();
            int countL = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("batch", batch));
            int countW = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("batch", batch));
            if (countW > 0) {
                return R.ok("存在任务");
            }
            int countP = waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("batch", batch));
            if (countL > 0 || countW > 0 || countP > 0) {
                throw new CoolException("该批号已经存在===>>" + batch);
            }
            WaitPakin waitPakin = new WaitPakin();
            Date now = new Date();
            waitPakin.sync(combMat);
            waitPakin.setBarcode("");
            waitPakin.setZpallet(""); // 托盘码
            waitPakin.setIoStatus("N");     // 入出状态
            waitPakin.setAnfme(1.0);  // 数量
            waitPakin.setStatus("Y");    // 状态
            waitPakin.setAppeUser(userId);
            waitPakin.setAppeTime(now);
            waitPakin.setModiUser(userId);
            waitPakin.setModiTime(now);
            // 源站点状态检测
            BasDevp sourceStaNo = basDevpService.checkSiteStatus(305, true);
            // 长度>3500放宽库位
            sourceStaNo.setLocType2((short) (waitPakin.getLength() > 3500 ? 2 : 1));
            LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
            // 寻找库位
            StartupDto dto = commonService.getLocNo(sourceStaNo, locTypeDto, 1);
            int workNo = dto.getWorkNo();
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setWhsType(1);
            wrkMast.setIoTime(new Date());
            wrkMast.setWrkSts(1L); // 工作状态:生成入库ID
            wrkMast.setIoType(1); // 入出库状态:1.入库
            wrkMast.setIoPri(13D); // 优先级
            wrkMast.setCrnNo(dto.getCrnNo());
            wrkMast.setSourceStaNo(dto.getSourceStaNo());
            wrkMast.setStaNo(dto.getStaNo());
            wrkMast.setLocNo(dto.getLocNo());
            wrkMast.setBarcode(""); // 托盘码
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("Y");
            wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
            // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiTime(now);
            boolean res = wrkMastService.insert(wrkMast);
            if (!res) {
                throw new CoolException("保存工作档失败");
            }
            // 生成工作档明细
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(waitPakin);
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            wrkDetl.setIoTime(wrkMast.getIoTime());
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiTime(now);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细失败");
            }
//            // 更新源站点信息
//            sourceStaNo.setWrkNo(workNo);
//            sourceStaNo.setModiTime(now);
//            if (!basDevpService.updateById(sourceStaNo)) {
//                throw new CoolException("更新源站失败");
//            }
            // 更新目标库位状态
            LocMast locMast = locMastService.selectById(dto.getLocNo());
            if (locMast.getLocSts().equals("O")) {
                locMast.setLocSts("S"); // S.入库预约
                locMast.setModiTime(now);
                if (!locMastService.updateById(locMast)) {
                    throw new CoolException("改变库位状态失败");
                }
            } else {
                throw new CoolException(dto.getLocNo() + "目标库位已被占用");
            }
        }
        return R.ok();
    }
    @Override
    public R agvAskOpen(AgvAskOpenParam param) {
        if (param.getFlag() == 0) { // 出库请求wms开门
            BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 305));
            if (basDevp.getWrkNo() > 6000 && basDevp.getWrkNo() <= 9000 && basDevp.getLoading().equals("Y") && basDevp.getAutoing().equals("Y")
                    && basDevp.getOutEnable().equals("Y")) { // 出库工作档
                WrkMast wrkMast = wrkMastService.selectById(basDevp.getWrkNo());
                if (wrkMast.getWhsType() == null) {
                    throw new CoolException("没有通知agv过来取货");
                } else if (wrkMast.getWhsType() == 1) {
                    WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", basDevp.getWrkNo()));
                    if (wrkDetl.getMatnr().equals(param.getMatnr()) && wrkDetl.getBatch().equals(param.getBatch())) {
                        wrkMast.setWhsType(2);
                        wrkMastService.updateById(wrkMast);
                        return R.ok("物料校验成功,马上开门");
                    } else {
                        throw new CoolException("编码+批号校验失败:" + param.getBatch());
                    }
                } else if (wrkMast.getWhsType() == 2) {
                    return R.ok("马上开门");
                } else {
                    return R.error("工作档当前状态有误");
                }
            } else {
                return R.error("不满足出库条件");
            }
        } else if(param.getFlag() == 1) { // 入库请求wms开门
            BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 305));
            if (basDevp.getAutoing().equals("Y") && basDevp.getLoading().equals("Y")
                    && basDevp.getInEnable().equals("Y")) { // 入库底座
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type",1)
                        .eq("source_sta_no",305).lt("wrk_sts",3));
                if (wrkMast.getWhsType() == null) {
                    throw new CoolException("没有入库任务");
                } else if (wrkMast.getWhsType() == 1) {
                    WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetl.getMatnr().equals(param.getMatnr()) && wrkDetl.getBatch().equals(param.getBatch())) {
                        wrkMast.setWhsType(2);
                        wrkMastService.updateById(wrkMast);
                        return R.ok("物料校验成功,马上开门");
                    } else {
                        throw new CoolException("编码+批号校验失败:" + param.getBatch());
                    }
                } else if (wrkMast.getWhsType() == 2) {
                    return R.ok("马上开门");
                } else {
                    return R.error("工作档当前状态有误");
                }
            } else {
                return R.error("底座还未达到");
            }
        }
        return R.error("出入库标识错误:" + param.getFlag());
    }
    @Override
    @Transactional
@@ -567,128 +752,6 @@
            }
        }
    }
    @Override
    public R synCallowWarehousing(String flag) {
        List<WrkMast> wrkMasts = wrkMastMapper.queryOutLocWork();
        if (wrkMasts.isEmpty()) {
            return R.ok();
        }
        return R.parse("当前存在出库任务");
    }
    @Override
    public R syncWarehousing(FullStoreParam param) {
        Long userId = 9999L;
       // 参数非空判断
        if (Cools.isEmpty(param.getBarcode(), param.getList())) {
            throw new CoolException("数据不完整,请检查请求参数");
        }
        List<WrkMast> wrkMasts = wrkMastMapper.queryOutLocWork();
        if(!wrkMasts.isEmpty()) {
            throw new CoolException("305存在出库任务");
        }
        int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
        int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode()));
        if (countLoc > 0 || countWrk > 0) {
            throw new CoolException("工作档/库存条码数据已存在");
        }
        Date now = new Date();
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(305, true);
        // 检索库位
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        List<String> matnrs = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatnr).distinct().collect(Collectors.toList());
        List<String> batchs = param.getList().stream().map(FullStoreParam.MatCodeStore::getBatch).distinct().collect(Collectors.toList());
        StartupDto dto = commonService.getLocNo(sourceStaNo,locTypeDto, 1);
        // 生成工作号
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(2L); // 工作状态:生成入库ID
        wrkMast.setIoType(1); // 入出库状态:1.入库
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setCrnNo(dto.getCrnNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo());
        wrkMast.setStaNo(dto.getStaNo());
        wrkMast.setLocNo(dto.getLocNo());
        wrkMast.setBarcode(param.getBarcode()); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        wrkMast.setAppeUser(userId);
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败");
        }
        // 生成工作档明细
        List<DetlDto> detlDtos = new ArrayList<>();
        param.getList().forEach(elem -> {
            DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme());
            detlDto.setMaktx(elem.getMaktx());
            detlDto.setSpecs(elem.getSpecs());
            detlDto.setTagId(elem.getTagId());
            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);
            }
        });
        wrkDetlService.createWorkDetail(workNo, detlDtos, param.getBarcode(), userId, now);
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiUser(userId);
        sourceStaNo.setModiTime(now);
        if (!basDevpService.updateById(sourceStaNo)){
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiUser(userId);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)){
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
        }
        return R.ok();
    }
    @Override
    public R getOutboundMaterials(String flag) {
        List<WrkDetl> outboundMaterials = wrkMastMapper.getOutboundMaterials();
        if (Cools.isEmpty(outboundMaterials)) {
            return R.parse("货物未到达或已取走");
        }
        List<FullStoreParam.MatCodeStore> matCodeStoreList = new ArrayList<>();
        for(WrkDetl wrkDetl : outboundMaterials){
            FullStoreParam.MatCodeStore matCodeStore = new FullStoreParam.MatCodeStore();
            matCodeStore.setMatnr(wrkDetl.getMatnr());
            matCodeStore.setBatch(wrkDetl.getBatch());
            matCodeStore.setAnfme(wrkDetl.getAnfme());
            matCodeStoreList.add(matCodeStore);
        }
        return R.ok(matCodeStoreList);
    }
}