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.core.exception.CoolException; import com.zy.asrs.entity.AgvLocDetl; import com.zy.asrs.entity.AgvLocMast; import com.zy.asrs.entity.AgvWrkDetl; import com.zy.asrs.mapper.AgvLocDetlMapper; import com.zy.asrs.service.AgvBasDevpService; import com.zy.asrs.service.AgvLocDetlService; import com.zy.asrs.service.AgvLocMastService; import com.zy.asrs.service.AgvWrkDetlService; import com.zy.asrs.utils.Utils; import com.zy.common.model.LocDto; import com.zy.common.model.TaskDto; import lombok.extern.slf4j.Slf4j; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.DataFormatter; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @Service @Slf4j public class AgvLocDetlServiceImpl extends ServiceImpl implements AgvLocDetlService { @Autowired AgvWrkDetlService agvWrkDetlService; @Autowired AgvBasDevpService agvBasDevpService; @Autowired AgvLocMastService agvLocMastService; public void addLocDetlInfo(String locNo, int taskCode) { List agvWrkDetls = agvWrkDetlService.selectList(new EntityWrapper().eq("wrk_no", taskCode)); agvWrkDetls.stream().map(agvWrkDetl -> { AgvLocDetl agvLocDetl = new AgvLocDetl(); log.info("agvWrkDetl: " + agvLocDetl.getBarcode()); BeanUtils.copyProperties(agvWrkDetl, agvLocDetl); agvLocDetl.setLocNo(locNo); this.insert(agvLocDetl); return agvLocDetl; }).collect(Collectors.toList()); } 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 agvLocDetls = this.selectList(wrapper); for (AgvLocDetl agvLocDetl: agvLocDetls) { //判断当前库位货物是否F在库 AgvLocMast agvLocMast = agvLocMastService.selectById(agvLocDetl.getLocNo()); if(!"F".equals(agvLocMast.getLocSts())){ continue; } //如果订单剩余出库量大于0 if(issued > 0) { //当前库位的库存量 double anfme = agvLocDetl.getAnfme(); //int ioType = anfme > issued ? 101 : 103; anfme = anfme > issued ? issued : anfme; //用于显示工作明细档的订单号 String orderNoWrkDtel = Utils.getOrderNo(orderNo,anfme); //更新订单数量 orderNo = Utils.orderMergeUpdate(orderNo,anfme); LocDto locDto = new LocDto(agvLocDetl.getLocNo(), agvLocDetl.getMatnr(), agvLocDetl.getMaktx(), agvLocDetl.getBatch(), orderNoWrkDtel, anfme); locDto.setCsocode(csocode); locDto.setIsoseq(isoseq); locDto.setContainerCode(agvLocDetl.getSuppCode()); //当前库位所处楼层 int floor = Integer.parseInt(agvLocDetl.getLocNo().split("F")[1]); //locDto.setAgvStaNos(queryAgvStaNosByFloor(floor)); locDto.setAgvStaNos(agvBasDevpService.selectCacheShelvesStationCodeByLocType(agvLocMast.getLocType1(),floor)); locDtoList.add(locDto); issued -= anfme; } } return issued; } /* 更新库存明细 */ public void updateStock(String sourceLoc, String targetLoc) { this.baseMapper.updateStock(sourceLoc,targetLoc); } public Page getStockStatis(Page page) { page.setRecords(baseMapper.getStockStatis1(page.getCondition())); page.setTotal(baseMapper.getStockStatisCount(page.getCondition())); return page; } @Override public Double getSumAnfme(String matnr, String threeCode) { return this.baseMapper.selectSumAnfmeByMatnr(matnr, threeCode); } @Override public Double getSumAnfmeDb(String matnr, String threeCode,Integer floor) { return this.baseMapper.selectSumAnfmeByMatnr2(matnr, threeCode, floor); } /* 获取库存总数 */ public Integer sum() { return this.baseMapper.sum(); } public List getStockStatisExcel(){ return this.baseMapper.getStockStatisExcel(); } 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(); } EntityWrapper wrapper = new EntityWrapper<>(); if(Cools.isEmpty(orderNo)){ wrapper.like("order_no",orderNo); } if(Cools.isEmpty(matnr)){ wrapper.like("matnr",matnr); } if(Cools.isEmpty(maktx)){ wrapper.like("maktx",maktx); } if(Cools.isEmpty(specs)){ wrapper.like("specs",specs); } if(Cools.isEmpty()){ wrapper.like("loc_no",locNo); } return this.selectList(wrapper); } public boolean updateAnfme(Double anfme, String locNo, String matnr, String batch, String csocode, String isocode) { EntityWrapper wrapper = new EntityWrapper<>(); wrapper.eq("loc_no", locNo); Utils.confirmOnlyMat(wrapper,matnr,batch,csocode,isocode); if (anfme <= 0) { return this.baseMapper.deleteLocDetl(locNo,anfme,matnr,batch,csocode,isocode) > 0; } else { AgvLocDetl agvLocDetl = this.selectOne(wrapper); agvLocDetl.setAnfme(anfme); agvLocDetl.setModiTime(new Date()); return this.baseMapper.updateAnfme(locNo,anfme,matnr,batch,csocode,isocode) > 0; } } 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); } } public AgvLocDetl selectByLocNo(String locNo){ return this.selectOne(new EntityWrapper().eq("loc_no",locNo)); } @Override public List selectByTaskDto(TaskDto taskDto) { List agvLocDetls = new ArrayList<>(); taskDto.getLocDtos().forEach(locDto -> { AgvLocDetl agvLocDetl = this.selectByMatnrAndBatchAndCsocodeAndisoCode(locDto.getLocNo(),locDto.getMatnr(), locDto.getBatch(), locDto.getCsocode(), locDto.getIsoseq()); agvLocDetls.add(agvLocDetl); }); return agvLocDetls; } @Override public AgvLocDetl selectByMatnrAndBatchAndCsocodeAndisoCode(String locNo, String matnr, String batch, String csocode, String isocode) { EntityWrapper wrapper = new EntityWrapper<>(); wrapper.eq("loc_no",locNo); Utils.confirmOnlyMat(wrapper,matnr,batch,csocode,isocode); return this.selectOne(wrapper); } @Override public Double selectSumAnfmeByLocNo(String locNo) { return this.baseMapper.sumByLocNo(locNo); } @Override public Double selectSumAnfmeByMatnr(String matnr) { return this.baseMapper.sumByMatnr(matnr); } @Override public AgvLocDetl selectLocdetl(String locNo, String matnr, String batch, String csocode, String isocode) { return this.baseMapper.selectLocdetl(locNo,matnr,batch,csocode,isocode); } @Override public void compareToEss(MultipartFile file) throws IOException { InputStream inStream = file.getInputStream(); String fileMime = file.getContentType(); int excelVersion = 2007; if ("application/vnd.ms-excel".equals(fileMime)) { excelVersion = 2003; } Workbook book = null; try { if (excelVersion == 2003) { book = new HSSFWorkbook(inStream); } else { // 当 excel 是 2007 时 book = new XSSFWorkbook(inStream); } } catch (Exception e) { log.error("fail", e); throw new CoolException("导入文件格式错误,请使用xls后缀的文件!"); } Sheet sheet = book.getSheetAt(0); int totalRows = sheet.getLastRowNum() + 1; // 总 Date now = new Date(); DataFormatter dataFormatter = new DataFormatter(); for (int i = 0; i < totalRows; i++) { Row row = sheet.getRow(i); // 库位号 String locNo = dataFormatter.formatCellValue(row.getCell(0)); // 货架码 String containerCode = dataFormatter.formatCellValue(row.getCell(1)); List agvLocDetls = this.selectList(new EntityWrapper().eq("loc_no", locNo).eq("supp_code", containerCode)); if(Cools.isEmpty(agvLocDetls)){ log.info("库位号:" + locNo + ",货架码:" + containerCode + ",不存在明细"); } if(agvLocDetls.size()>1){ log.info("库位号:" + locNo + ",货架码:" + containerCode + ",存在1条以上记录"); } } } @Override public void updateLocNo(String locNo, String sourceLoc, AgvLocDetl agvLocDetl) { this.baseMapper.updateLocNo(locNo,sourceLoc,agvLocDetl.getSuppCode()); } }