| | |
| | | package com.zy.asrs.service.impl; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | 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.zy.asrs.entity.AgvLocDetl; |
| | | import com.core.common.Cools; |
| | | import com.core.common.SnowflakeIdWorker; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.mapper.AgvLocDetlMapper; |
| | | import com.zy.asrs.service.AgvLocDetlService; |
| | | import com.zy.asrs.service.*; |
| | | 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<AgvLocDetlMapper, AgvLocDetl> implements AgvLocDetlService { |
| | | |
| | | @Autowired |
| | | AgvWrkDetlService agvWrkDetlService; |
| | | @Autowired |
| | | AgvBasDevpService agvBasDevpService; |
| | | @Autowired |
| | | AgvLocMastService agvLocMastService; |
| | | @Autowired |
| | | private OrderDetlService orderDetlService; |
| | | @Autowired |
| | | private SnowflakeIdWorker snowflakeIdWorker; |
| | | @Autowired |
| | | private FlowLogService flowLogService; |
| | | |
| | | public void addLocDetlInfo(String locNo, int taskCode) { |
| | | Date now = new Date(); |
| | | List<AgvWrkDetl> agvWrkDetls = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", taskCode)); |
| | | long flowId = snowflakeIdWorker.nextId(); |
| | | agvWrkDetls.stream().map(agvWrkDetl -> { |
| | | AgvLocDetl agvLocDetl = new AgvLocDetl(); |
| | | log.info("agvWrkDetl: " + agvLocDetl.getBarcode()); |
| | | BeanUtils.copyProperties(agvWrkDetl, agvLocDetl); |
| | | agvLocDetl.setLocNo(locNo); |
| | | log.info("zc添加库存日志:{}", JSON.toJSON(agvLocDetl)); |
| | | this.insert(agvLocDetl); |
| | | // 流水 -- 新增订单明细 |
| | | OrderDetl orderDetl = orderDetlService.selectItem(agvWrkDetl.getOrderNo(), agvWrkDetl.getMatnr(), agvWrkDetl.getBatch(), agvWrkDetl.getThreeCode()); |
| | | // FlowLog flowLog = new FlowLog(); |
| | | // flowLog.setFid(String.valueOf(flowId)); |
| | | // flowLog.setSpare2(String.valueOf(taskCode)); |
| | | // flowLog.setLocNo(locNo); |
| | | // flowLog.setSpare1(agvWrkDetl.getSuppCode()); |
| | | // flowLog.setOpType(101L); |
| | | // flowLog.setOrderNo(agvWrkDetl.getOrderNo()); |
| | | // flowLog.setThreeCode(agvWrkDetl.getThreeCode()); |
| | | // flowLog.setMatnr(agvWrkDetl.getMatnr()); |
| | | // flowLog.setMaktx(agvWrkDetl.getMaktx()); |
| | | // flowLog.setOrderPrevious(orderDetl.getAnfme()); |
| | | // flowLog.setOrderCurrent(orderDetl.getAnfme()); |
| | | // flowLog.setOrderChanged(0.0); |
| | | // flowLog.setQtyPrevious(orderDetl.getQty()-agvWrkDetl.getAnfme()); |
| | | // flowLog.setQtyCurrent(orderDetl.getQty()); |
| | | // flowLog.setQtyChanged(agvWrkDetl.getAnfme()); |
| | | // |
| | | // flowLog.setLocPrevious(0.0D); |
| | | // flowLog.setLocCurrent(agvWrkDetl.getAnfme()); |
| | | // flowLog.setLocChanged(agvWrkDetl.getAnfme()); |
| | | // |
| | | // flowLog.setAppeTime(now); |
| | | // if (!flowLogService.insert(flowLog)) { |
| | | // throw new CoolException("同步半成品调拨单流水记录失败"); |
| | | // } |
| | | return agvLocDetl; |
| | | }).collect(Collectors.toList()); |
| | | |
| | | } |
| | | |
| | | public double queryStockAndSetLocDto(String matnr, String batch, String orderNo, List<LocDto> locDtoList, double issued, String csocode, String isoseq, String type) { |
| | | //根据物料号和批次找到对应的库存,并且按照修改时间排序 |
| | | Wrapper<AgvLocDetl> wrapper = new EntityWrapper<AgvLocDetl>().eq("matnr", matnr).orderBy("modi_time"); |
| | | if (type != null) { |
| | | wrapper.notLike("loc_no", "F1"); |
| | | } |
| | | wapperSetCondition(wrapper, "batch", batch); |
| | | wapperSetCondition(wrapper, "three_code", csocode); |
| | | wapperSetCondition(wrapper, "dead_time", isoseq); |
| | | |
| | | if ("JG".equals(orderNo.substring(0, 2))) { |
| | | wapperSetCondition(wrapper, "process_sts", "1"); |
| | | } |
| | | |
| | | List<AgvLocDetl> 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, agvLocDetl.getProcessSts()); |
| | | locDto.setCsocode(csocode); |
| | | locDto.setIsoseq(isoseq); |
| | | locDto.setContainerCode(agvLocDetl.getSuppCode()); |
| | | locDto.setProcessSts(agvLocDetl.getProcessSts()); |
| | | //当前库位所处楼层 |
| | | 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<AgvLocDetl> getStockStatis(Page<AgvLocDetl> 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 AgvLocDetl selectItem(String locNo, String matnr, String batch, String csocode, String isoCode) { |
| | | return this.baseMapper.selectItemByOrderNo(locNo, matnr, batch, csocode, isoCode); |
| | | } |
| | | |
| | | @Override |
| | | public Double getSumAnfmeProcess(String matnr, String threeCode) { |
| | | return this.baseMapper.selectSumAnfmeByMatnrProcess(matnr, threeCode); |
| | | } |
| | | |
| | | @Override |
| | | public Double getSumAnfmeProcessed(String matnr, String threeCode) { |
| | | return this.baseMapper.selectSumAnfmeByMatnrProcessed(matnr, threeCode); |
| | | } |
| | | |
| | | @Override |
| | | public Double getSumAnfmeDb(String matnr, String threeCode, Integer floor) { |
| | | return this.baseMapper.selectSumAnfmeByMatnr2(matnr, threeCode, floor); |
| | | } |
| | | |
| | | @Override |
| | | public Double getSumAnfmeback(String matnr, String threeCode, Integer floor) { |
| | | return this.baseMapper.getSumAnfmeback(matnr, threeCode, floor); |
| | | } |
| | | |
| | | /* |
| | | 获取库存总数 |
| | | */ |
| | | public Integer sum() { |
| | | return this.baseMapper.sum(); |
| | | } |
| | | |
| | | public List<AgvLocDetl> getStockStatisExcel() { |
| | | return this.baseMapper.getStockStatisExcel(); |
| | | } |
| | | |
| | | public List<AgvLocDetl> 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<AgvLocDetl>(); |
| | | } |
| | | EntityWrapper<AgvLocDetl> 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<AgvLocDetl> 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; |
| | | } |
| | | } |
| | | |
| | | public boolean updateAnfmeProcess(Double anfme, String locNo, String matnr, String batch, String csocode, String isocode, Integer process) { |
| | | EntityWrapper<AgvLocDetl> 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.updateAnfmeProcess(locNo, anfme, matnr, batch, csocode, isocode, process) > 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<AgvLocDetl>().eq("loc_no", locNo)); |
| | | } |
| | | |
| | | @Override |
| | | public List<AgvLocDetl> selectByTaskDto(TaskDto taskDto) { |
| | | List<AgvLocDetl> 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<AgvLocDetl> wrapper = new EntityWrapper<>(); |
| | | wrapper.eq("loc_no", locNo); |
| | | Utils.confirmOnlyMat(wrapper, matnr, batch, csocode, isocode); |
| | | return this.selectOne(wrapper); |
| | | } |
| | | |
| | | @Override |
| | | public AgvLocDetl selectByMatnrAndBatchAndCsocodeAndisoCode2(String locNo, String orderNo, String matnr, String batch, String csocode, String isocode) { |
| | | EntityWrapper<AgvLocDetl> wrapper = new EntityWrapper<>(); |
| | | wrapper.eq("loc_no", locNo); |
| | | Utils.confirmOnlyMat2(wrapper, orderNo, 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<AgvLocDetl> agvLocDetls = this.selectList(new EntityWrapper<AgvLocDetl>().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()); |
| | | } |
| | | } |