KdsServiceImpl.java 13.2 KB
package com.infoloop.tianting.service.impl;

import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.model.dto.KdsDTO.KdsMealDetailDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderLocationDetailDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderLocationDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderLocationQueryDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderSkuDetailDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderSkuDto;
import com.infoloop.tianting.model.dto.KdsDTO.KdsOrderSkuQueryDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CustomerNotice;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import com.infoloop.tianting.service.KdsService;
import com.infoloop.tianting.service.MealService;
import com.infoloop.tianting.service.client.EnterpriseResourceServiceRpcClient;
import com.infoloop.tianting.service.client.MealServiceRpcClient;
import com.infoloop.tianting.service.client.MenuServiceRpcClient;
import com.infoloop.tianting.service.client.OrderServiceRpcClient;
import com.infoloop.tianting.service.client.SkuServiceRpcClient;
import com.infoloop.tianting.service.client.WOperatorServiceRpcClient;
import com.infoloop.tianting.utils.DateUtil;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class KdsServiceImpl implements KdsService {

  private final OrderServiceRpcClient orderServiceRpcClient;
  private final EnterpriseResourceServiceRpcClient enterpriseResourceServiceRpcClient;
  private final WOperatorServiceRpcClient wOperatorServiceRpcClient;
  private final MealServiceRpcClient mealServiceRpcClient;
  private final SkuServiceRpcClient skuServiceRpcClient;

  @Override
  public List<KdsOrderSkuDto> getOrderDetailBySku(KdsOrderSkuQueryDto queryDto) {

    // 获取当日所有的订单 和 订单明细
    LocalDate today = LocalDate.now();
    LocalDateTime todayZero = today.atStartOfDay();
    LocalDate tomorrow = today.plusDays(1);
    LocalDateTime tomorrowZero = tomorrow.atStartOfDay();

    final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
    boolean shouldFilterStallIds = false;
    List<Integer> stallIds = new ArrayList<>();
    final var operator = wOperatorServiceRpcClient.getWOperatorById(operatorLoginInfo.getId()).getResponse();
    if (!operator.getIsSuper()) {
      shouldFilterStallIds = true;
      final var userResource = enterpriseResourceServiceRpcClient.getUserResources(
          operatorLoginInfo.getEnterpriseId(), operatorLoginInfo.getId());
      stallIds.addAll(userResource.getStallIdsList());
    }

    final var queryOrderDto = QueryOrderByConditionDto.builder()
        .enterpriseId(operatorLoginInfo.getEnterpriseId())
        .shouldFilterStallIds(shouldFilterStallIds)
        .stallIds(stallIds)
        .shouldFilterMealTimeStart(true)
        .mealTimeStart(todayZero)
        .shouldFilterMealTimeEnd(true)
        .mealTimeEnd(tomorrowZero)
        .build();
    final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
    List<Integer> orderIds = orderList.stream()
        .map(SingleClientCustomerOrderRpcResponse::getId)
        .distinct()
        .collect(Collectors.toList());
    final var orderDetailList = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds);
    final var filteredOrderDetailList = orderDetailList.stream()
        .filter(od -> od.getServeStatus() == queryDto.getServeStatus() && od.getMealId() == queryDto.getMealId())
        .collect(Collectors.toList());

    //在所有的orderDetail里找出所有所有不同的menuDetailId,然后根据menuDetailId进行分类
    final var menuDetailIds = filteredOrderDetailList.stream()
        .map(SingleClientCustomerOrderDetailRpcResponse::getMenuDetailId)
        .distinct()
        .collect(Collectors.toList());

    final var skuIds = filteredOrderDetailList.stream()
        .map(SingleClientCustomerOrderDetailRpcResponse::getSkuId)
        .distinct()
        .collect(Collectors.toList());
    final var skus = skuServiceRpcClient.getDishSkusByIds(skuIds).getResponseList();

    List<KdsOrderSkuDto> kdsOrderSkuList = new ArrayList<>();
    for (Integer menuDetailId: menuDetailIds) {
      // 找出该menuDetailId 的所有orderDetail
      final var curOrderDetails = filteredOrderDetailList.stream()
          .filter(d-> d.getMenuDetailId() == menuDetailId)
          .collect(Collectors.toList());
      final var totalCount = curOrderDetails.stream()
          .mapToInt(SingleClientCustomerOrderDetailRpcResponse::getCount)
          .sum();
      List<KdsOrderSkuDetailDto> kdsOrders = new ArrayList<>();
      for(SingleClientCustomerOrderDetailRpcResponse detail: curOrderDetails) {
        final var order = orderList.stream()
            .filter(o -> o.getId() == detail.getOrderId())
            .findFirst();
        if (order.isEmpty()) {
          continue;
        }
        final var kdsOrder = KdsOrderSkuDetailDto.builder()
            .count(detail.getCount())
            .orderDetailId(detail.getId())
            .remark(order.get().getRemark())
            .orderId(order.get().getId())
            .roomNo(order.get().getRoomNo())
            .tableCode(order.get().getTableCode())
            .customerNotice(CustomerNotice.builder()
                .doctors(order.get().getCustomerNoticeJson().getDoctorsList())
                .avoids(order.get().getCustomerNoticeJson().getAvoidsList())
                .build())
            .adjustSkuRemark(detail.getAdjustSkuRemark())
            .mealTime(DateUtil.formatDate(order.get().getMealTime()))
            .build();
        kdsOrders.add(kdsOrder);
      }
      String skuCode = "";
      if (!curOrderDetails.isEmpty()) {
        final var skuId = curOrderDetails.get(0).getSkuId();
        final var sku = skus.stream().filter(s -> s.getId() == skuId).findFirst();
        if (sku.isPresent()) {
          skuCode = sku.get().getCode();
        }
      }

      final var kdsOrderSku = KdsOrderSkuDto.builder()
          .showName(curOrderDetails.get(0).getShowName())
          .skuCode(skuCode)
          .totalCount(totalCount)
          .orderList(kdsOrders)
          .build();
      kdsOrderSkuList.add(kdsOrderSku);

    }

    return kdsOrderSkuList;

  }

  @Override
  public List<KdsMealDetailDto> getMealDetail() {
    // 获取当日用餐的所有的订单 和 订单明细
    LocalDate today = LocalDate.now();
    LocalDateTime todayZero = today.atStartOfDay();
    LocalDate tomorrow = today.plusDays(1);
    LocalDateTime tomorrowZero = tomorrow.atStartOfDay();

    final var operatorLoginInfo = LoginContextHolder.getLoginInfo();

    boolean shouldFilterStallIds = false;
    List<Integer> stallIds = new ArrayList<>();
    final var operator = wOperatorServiceRpcClient.getWOperatorById(operatorLoginInfo.getId()).getResponse();
    if (!operator.getIsSuper()) {
      shouldFilterStallIds = true;
      final var userResource = enterpriseResourceServiceRpcClient.getUserResources(
          operatorLoginInfo.getEnterpriseId(), operatorLoginInfo.getId());
      stallIds.addAll(userResource.getStallIdsList());
    }

    final var queryOrderDto = QueryOrderByConditionDto.builder()
        .enterpriseId(operatorLoginInfo.getEnterpriseId())
        .shouldFilterStallIds(shouldFilterStallIds)
        .stallIds(stallIds)
        .shouldFilterMealTimeStart(true)
        .mealTimeStart(todayZero)
        .shouldFilterMealTimeEnd(true)
        .mealTimeEnd(tomorrowZero)
        .build();

    final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
    List<Integer> orderIds = orderList.stream()
        .filter(o -> o.getStatus() == OrderStatusEnum.ALL_SERVED ||  o.getStatus() == OrderStatusEnum.PARTIAL_SERVED ||  o.getStatus() == OrderStatusEnum.PREPARING)
        .map(SingleClientCustomerOrderRpcResponse::getId)
        .distinct()
        .collect(Collectors.toList());
    final var orderDetailList = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds);
    //找出所有的不同的meal Ids
    final var mealIds = orderDetailList.stream()
        .map(SingleClientCustomerOrderDetailRpcResponse::getMealId)
        .distinct()
        .collect(Collectors.toList());
    //获取到所有的餐别
    final var allMeals = mealServiceRpcClient.getAllMeals(operatorLoginInfo.getEnterpriseId()).getResponsesList();

    List<KdsMealDetailDto> kdsMealDetailDtoList = new ArrayList<>();
    for(Integer mealId: mealIds) {
      final var meal = allMeals.stream().filter(m -> m.getId() == mealId).findFirst();
      String mealName = "";
      if(meal.isEmpty() && mealId != 0) {
        continue;
      }
      if (meal.isPresent()) {
        mealName = meal.get().getName();
      }

      final var totalCount = orderDetailList.stream()
          .filter(od -> od.getMealId() == mealId)
          .mapToInt(SingleClientCustomerOrderDetailRpcResponse::getCount)
          .sum();
      final var mealDetail = KdsMealDetailDto.builder()
          .mealId(mealId)
          .mealName(mealName)
          .totalCount(totalCount)
          .build();
      kdsMealDetailDtoList.add(mealDetail);
    }

    return kdsMealDetailDtoList;
  }

  @Override
  public List<KdsOrderLocationDto> getOrderDetailByLocation(KdsOrderLocationQueryDto queryDto) {
    // 获取当日用餐的所有的订单 和 订单明细
    LocalDate today = LocalDate.now();
    LocalDateTime todayZero = today.atStartOfDay();
    LocalDate tomorrow = today.plusDays(1);
    LocalDateTime tomorrowZero = tomorrow.atStartOfDay();

    final var operatorLoginInfo = LoginContextHolder.getLoginInfo();

    boolean shouldFilterStallIds = false;
    List<Integer> stallIds = new ArrayList<>();
    final var operator = wOperatorServiceRpcClient.getWOperatorById(operatorLoginInfo.getId()).getResponse();
    if (!operator.getIsSuper()) {
      shouldFilterStallIds = true;
      final var userResource = enterpriseResourceServiceRpcClient.getUserResources(
          operatorLoginInfo.getEnterpriseId(), operatorLoginInfo.getId());
      stallIds.addAll(userResource.getStallIdsList());
    }

    final var queryOrderDto = QueryOrderByConditionDto.builder()
        .enterpriseId(operatorLoginInfo.getEnterpriseId())
        .shouldFilterStallIds(shouldFilterStallIds)
        .stallIds(stallIds)
        .shouldFilterMealTimeStart(true)
        .mealTimeStart(todayZero)
        .shouldFilterMealTimeEnd(true)
        .mealTimeEnd(tomorrowZero)
        .shouldFilterStatus(true)
        .status(queryDto.getOrderStatus())
        .build();

    final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
    List<Integer> orderIds = orderList.stream()
        .map(SingleClientCustomerOrderRpcResponse::getId)
        .distinct()
        .collect(Collectors.toList());
    final var orderDetailList = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds);
    final var filteredOrderDetailList = orderDetailList.stream()
        .filter(od -> od.getMealId() == queryDto.getMealId())
        .collect(Collectors.toList());

    //在所有的orderDetail里找出所有所有不同的menuDetailId,然后根据menuDetailId进行分类
    final var menuDetailIds = filteredOrderDetailList.stream()
        .map(SingleClientCustomerOrderDetailRpcResponse::getMenuDetailId)
        .distinct()
        .collect(Collectors.toList());

    List<KdsOrderLocationDto> kdsOrderLocationList = new ArrayList<>();

    for (SingleClientCustomerOrderRpcResponse order: orderList) {
      final var curOrderDetails = filteredOrderDetailList.stream()
          .filter(d-> d.getOrderId() == order.getId())
          .collect(Collectors.toList());
      final var kdsOrderDetails = curOrderDetails.stream().map(od ->
        KdsOrderLocationDetailDto.builder()
            .adjustSkuRemark(od.getAdjustSkuRemark())
            .count(od.getCount())
            .orderDetailId(od.getId())
            .serveStatus(od.getServeStatus())
            .showName(od.getShowName())
            .build()
      ).collect(Collectors.toList());
      final var kdsOrder = KdsOrderLocationDto.builder()
          .totalCount(order.getTotalNum())
          .remark(order.getRemark())
          .orderId(order.getId())
          .roomNo(order.getRoomNo())
          .tableCode(order.getTableCode())
          .customerNotice(CustomerNotice.builder()
              .doctors(order.getCustomerNoticeJson().getDoctorsList())
              .avoids(order.getCustomerNoticeJson().getAvoidsList())
              .build())
          .orderDetailList(kdsOrderDetails)
          .mealTime(DateUtil.formatDate(order.getMealTime()))
          .build();
      kdsOrderLocationList.add(kdsOrder);
    }

    return kdsOrderLocationList;
  }


}