|  |  |  | 
|---|
|  |  |  | 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) { | 
|---|
|  |  |  | 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<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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public int updateNewMatnr(String matnrOld, String matnrNew) { | 
|---|
|  |  |  | return this.baseMapper.updateNewMatnr(matnrOld, matnrNew); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|