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;  
 | 
    }  
 | 
  
 | 
}  
 |