| package com.zy.asrs.wms.utils;  | 
|   | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;  | 
| import com.zy.asrs.wms.asrs.entity.LocDetl;  | 
| import com.zy.asrs.wms.asrs.entity.dto.OrderOutBatchPreviewDto;  | 
| import com.zy.asrs.wms.asrs.entity.dto.OrderOutMergeDto;  | 
| import com.zy.asrs.wms.asrs.entity.dto.OutDetlDto;  | 
| import com.zy.asrs.wms.asrs.entity.dto.OutLocDto;  | 
| import com.zy.asrs.wms.asrs.entity.param.OrderOutMergeParam;  | 
| import com.zy.asrs.wms.asrs.entity.param.OutParam;  | 
| import com.zy.asrs.wms.asrs.service.LocDetlService;  | 
| import org.springframework.beans.factory.annotation.Autowired;  | 
| import org.springframework.stereotype.Component;  | 
|   | 
| import java.util.ArrayList;  | 
| import java.util.HashMap;  | 
| import java.util.List;  | 
| import java.util.Map;  | 
|   | 
| @Component  | 
| public class OutUtils {  | 
|   | 
|     @Autowired  | 
|     private LocDetlService locDetlService;  | 
|   | 
|     public List<OutLocDto> merge(OutParam outParam) {  | 
|         HashMap<Long, OutLocDto> map = new HashMap<>();  | 
|   | 
|         for (OutDetlDto detl : outParam.getDetls()) {  | 
|             LocDetl locDetl = locDetlService.getById(detl.getDetlId());  | 
|             if (locDetl == null) {  | 
|                 continue;  | 
|             }  | 
|             detl.setStock(locDetl.getAnfme());  | 
|   | 
|             if (map.containsKey(locDetl.getLocId())) {  | 
|                 OutLocDto locDto = map.get(locDetl.getLocId());  | 
|                 List<OutDetlDto> detlDtos = locDto.getDetls();  | 
|                 detlDtos.add(detl);  | 
|   | 
|                 locDto.setDetls(detlDtos);  | 
|             }else {  | 
|                 OutLocDto locDto = new OutLocDto();  | 
|                 map.put(locDetl.getLocId(), locDto);  | 
|   | 
|                 List<OutDetlDto> detlDtos = new ArrayList<>();  | 
|                 detlDtos.add(detl);  | 
|   | 
|                 locDto.setLocId(locDetl.getLocId());  | 
|                 locDto.setDetls(detlDtos);  | 
|             }  | 
|         }  | 
|   | 
|         List<OutLocDto> locDtos = new ArrayList<>();  | 
|         for (Map.Entry<Long, OutLocDto> entry : map.entrySet()) {  | 
|             OutLocDto locDto = entry.getValue();  | 
|             locDtos.add(locDto);  | 
|   | 
|             Boolean all = this.isAllForOut(locDto.getLocId(), locDto.getDetls());  | 
|             locDto.setAll(all);  | 
|             locDto.setOperationPort(outParam.getOperationPort());  | 
|         }  | 
|   | 
|         //add zero stock  | 
|         for (OutLocDto locDto : locDtos) {  | 
|             List<OutDetlDto> detls = locDto.getDetls();  | 
|             List<Long> detlIds = new ArrayList<>();  | 
|             for (OutDetlDto detl : detls) {  | 
|                 detlIds.add(detl.getDetlId());  | 
|             }  | 
|   | 
|             List<LocDetl> list = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, locDto.getLocId()).notIn(LocDetl::getId, detlIds));  | 
|             if (!list.isEmpty()) {  | 
|                 List<OutDetlDto> detlDtos = locDto.getDetls();  | 
|                 for (LocDetl locDetl : list) {  | 
|                     OutDetlDto outDetlDto = new OutDetlDto();  | 
|                     outDetlDto.setDetlId(locDetl.getId());  | 
|                     outDetlDto.setAnfme(0D);  | 
|                     outDetlDto.setStock(locDetl.getAnfme());  | 
|                     detlDtos.add(outDetlDto);  | 
|                 }  | 
|                 locDto.setDetls(detlDtos);  | 
|             }  | 
|         }  | 
|   | 
|         return locDtos;  | 
|     }  | 
|   | 
|     public Boolean isAllForMerge(Long locId, List<OrderOutMergeDto> list) {  | 
|         List<Double> anfmeList = new ArrayList<>();  | 
|         for (OrderOutMergeDto dto : list) {  | 
|             anfmeList.add(dto.getAnfme());  | 
|         }  | 
|         return isAll(locId, anfmeList);  | 
|     }  | 
|   | 
|     public Boolean isAllForPreview(Long locId, List<OrderOutBatchPreviewDto> list) {  | 
|         List<Double> anfmeList = new ArrayList<>();  | 
|         for (OrderOutBatchPreviewDto outPreviewDto : list) {  | 
|             anfmeList.add(outPreviewDto.getAnfme());  | 
|         }  | 
|         return isAll(locId, anfmeList);  | 
|     }  | 
|   | 
|     public Boolean isAllForOut(Long locId, List<OutDetlDto> list) {  | 
|         List<Double> anfmeList = new ArrayList<>();  | 
|         for (OutDetlDto dto : list) {  | 
|             anfmeList.add(dto.getAnfme());  | 
|         }  | 
|         return isAll(locId, anfmeList);  | 
|     }  | 
|   | 
|     private Boolean isAll(Long locId, List<Double> anfmeList) {  | 
|         if (anfmeList.isEmpty()) {  | 
|             return false;  | 
|         }  | 
|   | 
|         List<LocDetl> locDetls = locDetlService.list(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getLocId, locId));  | 
|         Double sum = 0D;  | 
|         for (LocDetl locDetl : locDetls) {  | 
|             sum += locDetl.getAnfme();  | 
|         }  | 
|   | 
|         for (Double anfme : anfmeList) {  | 
|             sum -= anfme;  | 
|         }  | 
|   | 
|         return sum <= 0;  | 
|     }  | 
|   | 
| }  |