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 implements LocDetlService { @Autowired private StaDescService staDescService; @Autowired private LocMastService locMastService; @Autowired private BasDevpService basDevpService; @Override public Page getStockOut(Page page) { page.setRecords(baseMapper.getStockOutPage(page.getCondition())); page.setTotal(baseMapper.getStockOutPageCount(page.getCondition())); return page; } @Override public boolean updateAnfme(Double anfme, String locNo, String matnr, String batch, String containerCode, String csoCode, String isoCode) { if (anfme <= 0) { return this.baseMapper.deleteItem(locNo, matnr, batch, containerCode, csoCode, isoCode) > 0; } else { return baseMapper.updateAnfme(anfme, locNo, matnr, batch, containerCode, csoCode, isoCode) > 0; } } @Override public boolean updateLocNo(String newLocNo, String oldLocNo) { return baseMapper.updateLocNo(newLocNo, oldLocNo) > 0; } @Override public List getSameDetl(String matnr) { return this.baseMapper.selectSameDetl(matnr); } @Override public List getSameLevDetl(String matnr, Integer lev) { return this.baseMapper.selectSameLevDetl(matnr, lev); } @Override public List getSameDetlToday(String matnr, Integer start, Integer end) { return this.baseMapper.selectSameDetlToday(matnr, start, end); } @Override public Page getStockStatis(Page 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 selectPakoutByRule(String matnr) { return this.baseMapper.selectPakoutByRule(matnr); } @Override public List getAsrsLocDetl(String matnr) { return this.baseMapper.getAsrsLocDetl(matnr); } @Override public Integer countLocNoNum(String locNo) { return this.baseMapper.countLocNoNum(locNo); } @Override public List queryStock(String matnr, String batch, String orderNo, Set locNos) { List result = new ArrayList<>(); List preDos = this.baseMapper.queryStockPre(matnr); for (QueryStockPreDo preDo : preDos) { List 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 locDtoList, double issued, String csocode, String isoseq) { Wrapper wrapper = new EntityWrapper().eq("matnr", matnr).orderBy("modi_time"); wapperSetCondition(wrapper,"batch",batch); wapperSetCondition(wrapper,"three_code",csocode); wapperSetCondition(wrapper,"dead_time",isoseq); List locDetlList = this.selectList(wrapper); Set 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 outSite = basDevpService.getAvailableOutSite(101); List 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 locDtoList, double issued, String csocode, String isoseq) { Wrapper wrapper = new EntityWrapper().eq("matnr", matnr).orderBy("modi_time"); wapperSetCondition(wrapper,"batch",batch); wapperSetCondition(wrapper,"three_code",csocode); wapperSetCondition(wrapper,"dead_time",isoseq); List locDetlList = this.selectList(wrapper); Set 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 staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), ioType); List 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 queryStockTotal() { return this.baseMapper.queryStockTotal(); } /** * 获取库存总数 * @return */ @Override public Integer sum() { return this.baseMapper.sum(); } @Override public List 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 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(); } return this.baseMapper.searchByLike(orderNo, matnr, maktx, specs, locNo); } @Override public List selectByLocNo(String locNo) { return this.baseMapper.selectByLocNo(locNo); } @Override public List selectLocNo(String matnr) { return this.baseMapper.selectLocNo(matnr); } public Set selectLocNos(String matnr) { Wrapper wrapper = new EntityWrapper().eq("matnr", matnr); //Utils.confirmOnlyMat(wrapper,matnr,batch,csocode,isocode); List locDetls = this.selectList(wrapper); Set locNos = new HashSet<>(); locDetls.forEach(locDetl -> { locNos.add(locDetl.getLocNo()); }); return locNos; } public LocDetl selectByContainerCode(String containerCode) { return this.selectOne(new EntityWrapper().eq("supp_code",containerCode)); } @Override public List selectByLocWithoutContainer(String locNo) { return this.selectList(new EntityWrapper().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 resort(List locDetls){ Set locDetlsResort = new LinkedHashSet<>(); for(LocDetl locDetl : locDetls){ LocMast locMast = locMastService.selectById(locDetl.getLocNo()); if(!"F".equals(locMast.getLocSts())){ continue; } List 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; } }