自动化立体仓库 - WMS系统
#
whycq
2024-04-16 2002142e29ed84ae83d55a9ceedb90d13ef84aaf
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -1,15 +1,35 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.result.StockVo;
import com.zy.asrs.mapper.LocDetlMapper;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.LocDetlService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.StaDescService;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.LocDto;
import com.zy.common.model.QueryStockPreDo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
@Service("locDetlService")
public class LocDetlServiceImpl extends ServiceImpl<LocDetlMapper, LocDetl> implements LocDetlService {
    @Autowired
    private StaDescService staDescService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private BasDevpService basDevpService;
    @Override
    public Page<LocDetl> getStockOut(Page<LocDetl> page) {
@@ -19,12 +39,11 @@
    }
    @Override
    public boolean updateAnfme(Double anfme, String locNo, String matnr) {
    public boolean updateAnfme(Double anfme, String locNo, String matnr, String batch, String containerCode, String csoCode, String isoCode) {
        if (anfme <= 0) {
            return delete(new EntityWrapper<LocDetl>().eq("loc_no", locNo).eq("matnr", matnr));
            return this.baseMapper.deleteItem(locNo, matnr, batch, containerCode, csoCode, isoCode) > 0;
        } else {
            int res = baseMapper.updateAnfme(anfme, locNo, matnr);
            return res > 0;
            return baseMapper.updateAnfme(anfme, locNo, matnr, batch, containerCode, csoCode, isoCode) > 0;
        }
    }
@@ -33,4 +52,259 @@
        return baseMapper.updateLocNo(newLocNo, oldLocNo) > 0;
    }
    @Override
    public List<String> getSameDetl(String matnr) {
        return this.baseMapper.selectSameDetl(matnr);
    }
    @Override
    public List<String> getSameLevDetl(String matnr, Integer lev) {
        return this.baseMapper.selectSameLevDetl(matnr, lev);
    }
    @Override
    public List<String> getSameDetlToday(String matnr, Integer start, Integer end) {
        return this.baseMapper.selectSameDetlToday(matnr, start, end);
    }
    @Override
    public Page<LocDetl> getStockStatis(Page<LocDetl> page) {
        page.setRecords(baseMapper.getStockStatis(page.getCondition()));
        page.setTotal(baseMapper.getStockStatisCount(page.getCondition()));
        return page;
    }
    @Override
    public Double getSumAnfme(String matnr) {
        return this.baseMapper.selectSumAnfmeByMatnr(matnr);
    }
    @Override
    public List<LocDetl> selectPakoutByRule(String matnr) {
        return this.baseMapper.selectPakoutByRule(matnr);
    }
    @Override
    public List<LocDetl> getAsrsLocDetl(String matnr) {
        return this.baseMapper.getAsrsLocDetl(matnr);
    }
    @Override
    public Integer countLocNoNum(String locNo) {
        return this.baseMapper.countLocNoNum(locNo);
    }
    @Override
    public List<LocDetl> queryStock(String matnr, String batch, String orderNo, Set<String> locNos) {
        List<LocDetl> result = new ArrayList<>();
        List<QueryStockPreDo> preDos = this.baseMapper.queryStockPre(matnr);
        for (QueryStockPreDo preDo : preDos) {
            List<LocDetl> locDetls = this.baseMapper.queryStock(matnr, preDo.getNo(), preDo.getOrderBy(), preDo.getBay());
            result.addAll(locDetls);
        }
        return result;
    }
    //出库
    public double queryStockAndSetLocDto(String matnr, String batch, String orderNo, List<LocDto> locDtoList, double issued, String csocode, String isoseq) {
        Wrapper<LocDetl> wrapper = new EntityWrapper<LocDetl>().eq("matnr", matnr).orderBy("modi_time");
        wapperSetCondition(wrapper,"batch",batch);
        wapperSetCondition(wrapper,"three_code",csocode);
        wapperSetCondition(wrapper,"dead_time",isoseq);
        List<LocDetl> locDetlList = this.selectList(wrapper);
        Set<LocDetl> resort = resort(locDetlList);
        for (LocDetl locDetl : resort) {
            if (issued > 0) {
                double anfme = locDetl.getAnfme();
                int ioType = anfme > issued ? 103 : 101;
                anfme = anfme > issued ? issued : anfme;
                //用于显示工作明细档的订单号
                String orderNoWrkDtel = Utils.getOrderNo(orderNo,anfme);
                //更新订单数量
                orderNo = Utils.orderMergeUpdate(orderNo,anfme);
                LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderNoWrkDtel, anfme);
                List<Integer> outSite = basDevpService.getAvailableOutSite(101);
                List<Integer> pickOutSite = basDevpService.getAvailableOutSite(103);
                pickOutSite.forEach(site -> {
                    if(!outSite.contains(site)){
                        outSite.add(site);
                    }
                });
                locDto.setStaNos(outSite);
                locDto.setCsocode(csocode);
                locDto.setIsoseq(isoseq);
                locDto.setContainerCode(locDetl.getSuppCode());
                locDtoList.add(locDto);
                // 剩余待出数量递减
                issued = issued - locDetl.getAnfme();
            }
        }
        return issued;
    }
    //补货出库
    public double queryStockAndSetLocDto1(String matnr, String batch, String orderNo, List<LocDto> locDtoList, double issued, String csocode, String isoseq) {
        Wrapper<LocDetl> wrapper = new EntityWrapper<LocDetl>().eq("matnr", matnr).orderBy("modi_time");
        wapperSetCondition(wrapper,"batch",batch);
        wapperSetCondition(wrapper,"three_code",csocode);
        wapperSetCondition(wrapper,"dead_time",isoseq);
        List<LocDetl> locDetlList = this.selectList(wrapper);
        Set<LocDetl> resort = resort(locDetlList);
        for (LocDetl locDetl : resort) {
            //判断当前库位货物是否F在库
            LocMast locMast = locMastService.selectById(locDetl.getLocNo());
            if(!"F".equals(locMast.getLocSts())){
                continue;
            }
            if (issued > 0) {
                double anfme = locDetl.getAnfme();
                int ioType = anfme > issued ? 103 : 101;
                //anfme = anfme > issued ? issued : anfme;
                LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderNo, anfme);
                //List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), ioType);
                List<Integer> outSite = basDevpService.getAvailableOutSite(101);
                locDto.setStaNos(outSite);
                locDto.setCsocode(csocode);
                locDto.setIsoseq(isoseq);
                locDto.setContainerCode(locDetl.getSuppCode());
                locDtoList.add(locDto);
                // 剩余待出数量递减
                issued = issued - locDetl.getAnfme();
            }
        }
        return issued;
    }
    @Override
    public Double queryStockAnfme(String matnr, String batch) {
        return this.baseMapper.queryStockAnfme(matnr, batch);
    }
    @Override
    public List<StockVo> queryStockTotal() {
        return this.baseMapper.queryStockTotal();
    }
    /**
     * 获取库存总数
     * @return
     */
    @Override
    public Integer sum() {
        return this.baseMapper.sum();
    }
    @Override
    public List<LocDetl> unreason() {
        return this.baseMapper.unreason();
    }
    @Override
    public LocDetl selectItem(String locNo, String matnr, String batch,String suppCode) {
        return this.baseMapper.selectItem(locNo, matnr, batch,suppCode);
    }
    @Override
    public List<LocDetl> searchByLike(String orderNo, String matnr, String maktx, String specs, String locNo) {
        if (Cools.isEmpty(orderNo) && Cools.isEmpty(matnr) && Cools.isEmpty(maktx) && Cools.isEmpty(specs) && Cools.isEmpty(locNo)) {
            return new ArrayList<LocDetl>();
        }
        return this.baseMapper.searchByLike(orderNo, matnr, maktx, specs, locNo);
    }
    @Override
    public List<LocDetl> selectByLocNo(String locNo) {
        return this.baseMapper.selectByLocNo(locNo);
    }
    @Override
    public List<String> selectLocNo(String matnr) {
        return this.baseMapper.selectLocNo(matnr);
    }
    public Set<String> selectLocNos(String matnr) {
        Wrapper<LocDetl> wrapper = new EntityWrapper<LocDetl>().eq("matnr", matnr);
        //Utils.confirmOnlyMat(wrapper,matnr,batch,csocode,isocode);
        List<LocDetl> locDetls = this.selectList(wrapper);
        Set<String> locNos = new HashSet<>();
        locDetls.forEach(locDetl -> {
            locNos.add(locDetl.getLocNo());
        });
        return locNos;
    }
    public LocDetl selectByContainerCode(String containerCode) {
        return this.selectOne(new EntityWrapper<LocDetl>().eq("supp_code",containerCode));
    }
    @Override
    public List<LocDetl> selectByLocWithoutContainer(String locNo) {
        return this.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locNo)
                .andNew().eq("supp_code", "").or().isNull("supp_code"));
    }
    @Override
    public int updateStockFreeze(String matnr, String locNo, Integer stockFreeze) {
        return this.baseMapper.updateStockFreeze(matnr, locNo, stockFreeze);
    }
    private void wapperSetCondition(Wrapper wrapper,String column, String condition){
        if(Cools.isEmpty(condition)){
            wrapper.andNew().eq(column,"").or().isNull(column);
        }else {
            wrapper.andNew().eq(column,condition);
        }
    }
    //根据深浅库位进行重新排序
    private Set<LocDetl> resort(List<LocDetl> locDetls){
        Set<LocDetl> locDetlsResort = new LinkedHashSet<>();
        for(LocDetl locDetl : locDetls){
            LocMast locMast = locMastService.selectById(locDetl.getLocNo());
            if(!"F".equals(locMast.getLocSts())){
                continue;
            }
            List<String> groupOuterLoc = Utils.getGroupOuterLoc(locDetl.getLocNo());
            if(Cools.isEmpty(groupOuterLoc)){
                locDetlsResort.add(locDetl);
            }else {
                groupOuterLoc.add(locDetl.getLocNo());
                //如果是深库位,则先找外侧的库位
                for (String locNo : groupOuterLoc){
                    LocMast locMastOuter = locMastService.selectById(locNo);
                    //外侧如果是拣料,则内测不允许出
                    if("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())){
                        break;
                    }
                    if(!"F".equals(locMastOuter.getLocSts())){
                        continue;
                    }
                    locDetlsResort.addAll(this.selectByLocNo(locNo));
                }
            }
        }
        return locDetlsResort;
    }
}