OrderServiceRpcClient.java 17.8 KB
package com.infoloop.tianting.service.client;

import com.infoloop.tianting.SingleResponse;
import com.infoloop.tianting.SingleSpecialResponse;
import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderCreation;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderDetailCreation;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderDetailModification;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderModification;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderServiceRpcGrpc;
import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType;
import com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.CustomerNotice;
import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderDetailsByOrderIdsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrdersByCustomerIdRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrdersByCustomerIdRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.MealDetail;
import com.infoloop.tianting.clientcustomerorderservice.OrderSourceEnum;
import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.PayStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByConditionRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.QueryClientCustomerOrdersByPaginationRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.enums.OrderTypeEnum;
import com.infoloop.tianting.model.common.PageResult;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailBatchUpdateDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.OrderDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto;
import io.swagger.models.auth.In;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class OrderServiceRpcClient {
  private final ClientCustomerOrderServiceRpcGrpc.ClientCustomerOrderServiceRpcBlockingStub orderServiceRpcBlockingStub;
  private final MenuServiceRpcClient menuServiceRpcClient;
  private final SkuServiceRpcClient skuServiceRpcClient;
  private final OperatorServiceRpcClient operatorServiceRpcClient;
  private final EnterpriseResourceServiceRpcClient enterpriseResourceServiceRpcClient;

  public List<SingleClientCustomerOrderRpcResponse> getOrdersByCustomerId(Integer customerId) {
    return orderServiceRpcBlockingStub.getClientCustomerOrdersByCustomerId(
        GetClientCustomerOrdersByCustomerIdRpcRequest.newBuilder().setCustomerId(customerId).build()).getResponsesList();
  }

  public List<SingleClientCustomerOrderRpcResponse> getOrdersByCondition(
      QueryOrderByConditionDto queryOrderDto) {
    final var request = QueryClientCustomerOrdersByConditionRpcRequest.newBuilder()
        .setEnterpriseId(queryOrderDto.getEnterpriseId())
        .setShouldFilterOpenIds(queryOrderDto.getShouldFilterOpenId())
        .addAllOpenIds(List.of(queryOrderDto.getOpenId()))
        .setShouldFilterCustomerIds(queryOrderDto.getShouldFilterCustomerIds())
        .addAllCustomerIds(queryOrderDto.getCustomerIds())
        .setShouldFilterMealTimeStart(queryOrderDto.getShouldFilterMealTimeStart())
        .setMealTimeStart(queryOrderDto.getMealTimeStart().toInstant(ZoneOffset.UTC).toEpochMilli())
        .setShouldFilterMealTimeEnd(queryOrderDto.getShouldFilterMealTimeEnd())
        .setMealTimeEnd(queryOrderDto.getMealTimeEnd().toInstant(ZoneOffset.UTC).toEpochMilli())
        .setShouldFilterCreatedAtStart(queryOrderDto.getShouldFilterCreatedAtTimeStart())
        .setCreatedAtStart(queryOrderDto.getCreatedAtTimeStart().toInstant(ZoneOffset.UTC).toEpochMilli())
        .setShouldFilterCreatedAtEnd(queryOrderDto.getShouldFilterCreatedAtTimeEnd())
        .setCreatedAtEnd(queryOrderDto.getCreatedAtTimeEnd().toInstant(ZoneOffset.UTC).toEpochMilli())
        .setShouldFilterClientIds(queryOrderDto.getShouldFilterClientIds())
        .addAllClientIds(queryOrderDto.getClientIds())
        .setShouldFilterStallIds(queryOrderDto.getShouldFilterStallIds())
        .addAllStallIds(queryOrderDto.getStallIds())
        .setShouldFilterStatus(queryOrderDto.getShouldFilterStatus())
        .setStatus(queryOrderDto.getStatus())
        .setShouldFilterMenuIds(queryOrderDto.getShouldFilterMenuId())
        .addAllMenuIds(List.of(queryOrderDto.getMenuId()))
        .build();
    return orderServiceRpcBlockingStub.queryClientCustomerOrdersByCondition(request).getResponsesList();
  }

  public UpdateClientCustomerOrderRpcResponse updateClientCustomerOrder(
      UpdateOrderDto updateOrderDto) {
    OrderStatusEnum status = OrderStatusEnum.UNKNOWN_STATUS;
    if (updateOrderDto.isShouldUpdateStatus()) {
      status = updateOrderDto.getStatus();
    }
    String roomNo = "";
    if (updateOrderDto.isShouldUpdateRoomNo()) {
      roomNo = updateOrderDto.getRoomNo();
    }
    String tableCode = "";
    if (updateOrderDto.isShouldUpdateTableCode()) {
      tableCode = updateOrderDto.getTableCode();
    }
    final var modification = ClientCustomerOrderModification.newBuilder()
        .setId(updateOrderDto.getId())
        .setShouldUpdateStatus(updateOrderDto.isShouldUpdateStatus())
        .setStatus(status)
        .setShouldUpdateTableCode(updateOrderDto.isShouldUpdateTableCode())
        .setTableCode(tableCode)
        .setShouldUpdateRoomNo(updateOrderDto.isShouldUpdateRoomNo())
        .setRoomNo(roomNo)
        .build();
    final var request = UpdateClientCustomerOrderRpcRequest.newBuilder()
        .setEnterpriseId(updateOrderDto.getEnterpriseId())
        .setUpdatedBy(updateOrderDto.getUpdatedBy())
        .setUpdateSource(updateOrderDto.getUpdatedSource())
        .setModification(modification)
        .build();
    return orderServiceRpcBlockingStub.updateClientCustomerOrder(request);
  }


  public BatchUpdateClientCustomerOrderDetailsRpcResponse batchUpdateClientCustomerOrderDetails(
      OrderDetailBatchUpdateDto orderDetailBatchUpdateDto) {
    final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
    final var modifications = orderDetailBatchUpdateDto.getDetails().stream().map( d-> {
      MealDetail mealDetail = MealDetail.newBuilder().build();;
      Integer menuDetailId = 0;
      Integer mealId = 0;
      Integer categoryId = 0;
      Integer skuId = 0;
      String showName = "";
      if (d.getShouldUpdateMenuDetailId()) {
        menuDetailId = d.getMenuDetailId();
        final var menuDetail = menuServiceRpcClient.getMenuDetailById(
            operatorLoginInfo.getEnterpriseId(), menuDetailId).getResponse();
        mealId = menuDetail.getMealId();
        categoryId = menuDetail.getCategoryId();
        skuId = menuDetail.getSkuId();
        showName = menuDetail.getShowName();
        final var rpcSkus = skuServiceRpcClient.getDishSkusByIds(List.of(skuId)).getResponseList();
        if (!rpcSkus.isEmpty()) {
          final var skus = rpcSkus.get(0).getSkusList().stream().map(SingleResponse::getName).collect(Collectors.toList());
          final var skuAvoids = rpcSkus.get(0).getAvoidsList().stream().map(SingleResponse::getName).collect(Collectors.toList());
          final var tastes = rpcSkus.get(0).getTastesList().stream().map(SingleResponse::getName).collect(Collectors.toList());
          final var efficacies = rpcSkus.get(0).getEfficaciesList().stream().map(SingleResponse::getName).collect(Collectors.toList());
          final var allergies = rpcSkus.get(0).getAllergiesList().stream().map(
              SingleSpecialResponse::getName).collect(Collectors.toList());
          final var skuDoctors = rpcSkus.get(0).getDoctorsList().stream().map(SingleSpecialResponse::getName).collect(Collectors.toList());
          mealDetail = MealDetail.newBuilder()
              .setBasicMaterials(rpcSkus.get(0).getBasicMaterials())
              .addAllTastes(tastes)
              .addAllEfficacies(efficacies)
              .addAllDockers(skuDoctors)
              .setEnergy(rpcSkus.get(0).getEnergy())
              .setFat(rpcSkus.get(0).getFat())
              .setProtein(rpcSkus.get(0).getProtein())
              .setCarbohydrate(rpcSkus.get(0).getCarbohydrate())
              .addAllAllergies(allergies)
              .addAllAvoids(skuAvoids)
              .addAllSkus(skus)
              .build();
        }

      }

      ServeStatusEnum serveStatus = ServeStatusEnum.UNKNOWN_SERVE_STATUS;
      if (d.getShouldUpdateServeStatus()) {
        serveStatus = d.getServeStatus();
      }
      Integer count = 0;
      if (d.getShouldUpdateCount()) {
        count = d.getCount();
      }
        final var detail = ClientCustomerOrderDetailModification.newBuilder()
            .setId(d.getId())
            .setShouldUpdateMenuDetailId(d.getShouldUpdateMenuDetailId())
            .setMenuDetailId(menuDetailId)
            .setShouldUpdateCount(d.getShouldUpdateCount())
            .setCount(count)
            .setShouldUpdateMealId(d.getShouldUpdateMenuDetailId())
            .setMealId(mealId)
            .setShouldUpdateCategoryId(d.getShouldUpdateMenuDetailId())
            .setCategoryId(categoryId)
            .setShouldUpdateSkuId(d.getShouldUpdateMenuDetailId())
            .setSkuId(skuId)
            .setShouldUpdateShowName(d.getShouldUpdateMenuDetailId())
            .setShowName(showName)
            .setShouldUpdateServeStatus(d.getShouldUpdateServeStatus())
            .setServeStatus(serveStatus)
            .setShouldUpdateMealDetailJson(d.getShouldUpdateMenuDetailId())
            .setMealDetailJson(mealDetail)
            .build();
        return detail;
    }
    ).collect(Collectors.toList());
    final var request = BatchUpdateClientCustomerOrderDetailsRpcRequest.newBuilder()
        .setEnterpriseId(operatorLoginInfo.getEnterpriseId())
        .setUpdatedBy(operatorLoginInfo.getId())
        .setUpdateSourceValue(orderDetailBatchUpdateDto.getUpdatedSource().getNumber())
        .addAllModifications(modifications)
        .build();
    return orderServiceRpcBlockingStub.batchUpdateClientCustomerOrderDetails(request);
  }

  public QueryClientCustomerOrdersByPaginationRpcResponse queryClientCustomerOrdersByPagination(
      QueryOrderByPaginationDto queryOrderDto) {
    final var request = QueryClientCustomerOrdersByPaginationRpcRequest.newBuilder()
        .setKeyword(queryOrderDto.getKeyword())
        .setPageNo(queryOrderDto.getPn())
        .setPageSize(queryOrderDto.getPz())
        .setStatus(queryOrderDto.getStatus())
        .setEnterpriseId(queryOrderDto.getEnterpriseId())
        .setClientId(queryOrderDto.getClientId())
        .addAllStallIds(queryOrderDto.getStallIds())
        .build();
    return orderServiceRpcBlockingStub.queryClientCustomerOrdersByPagination(request);
  }

  public List<SingleClientCustomerOrderDetailRpcResponse> getOrderDetailsByOrderId(Integer orderId) {
    return orderServiceRpcBlockingStub.getClientCustomerOrderDetailsByOrderIds(
        GetClientCustomerOrderDetailsByOrderIdsRpcRequest.newBuilder()
            .setIncludeDeleted(false)
            .addAllOrderIds(List.of(orderId))
            .build()).getResponsesList();
  }

  public List<SingleClientCustomerOrderDetailRpcResponse> getOrderDetailsByOrderIds(List<Integer> orderIds) {
    return orderServiceRpcBlockingStub.getClientCustomerOrderDetailsByOrderIds(
        GetClientCustomerOrderDetailsByOrderIdsRpcRequest.newBuilder()
            .setIncludeDeleted(false)
            .addAllOrderIds(orderIds)
            .build()).getResponsesList();
  }

  public CreateOrderResponse createOrder(CreateOrderDto createOrderDto) {
    final var orderDetails = new ArrayList<ClientCustomerOrderDetailCreation>();
    for (CreateOrderDetailDto orderDetailDto: createOrderDto.getOrderDetailDtos()) {
      final var mealDetail = MealDetail.newBuilder()
          .setBasicMaterials(orderDetailDto.getMealDetailJson().getBasicMaterials())
          .addAllTastes(orderDetailDto.getMealDetailJson().getTastes())
          .addAllEfficacies(orderDetailDto.getMealDetailJson().getEfficacies())
          .addAllDockers(orderDetailDto.getMealDetailJson().getDockers())
          .setEnergy(orderDetailDto.getMealDetailJson().getEnergy())
          .setFat(orderDetailDto.getMealDetailJson().getFat())
          .setProtein(orderDetailDto.getMealDetailJson().getProtein())
          .setCarbohydrate(orderDetailDto.getMealDetailJson().getCarbohydrate())
          .addAllAllergies(orderDetailDto.getMealDetailJson().getAllergies())
          .addAllAvoids(orderDetailDto.getMealDetailJson().getAvoids())
          .addAllSkus(orderDetailDto.getMealDetailJson().getSkus())
          .build();
      final  var orderDetail = ClientCustomerOrderDetailCreation.newBuilder()
          .setMenuDetailId(orderDetailDto.getMenuDetailId())
          .setShouldCreateOrderId(false)
          .setOrderId(0)
          .setCount(orderDetailDto.getCount())
          .setMealId(orderDetailDto.getMealId())
          .setCategoryId(orderDetailDto.getCategoryId())
          .setShouldCreateShowName(true)
          .setShowName(orderDetailDto.getShowName())
          .setPrice(orderDetailDto.getPrice())
          .setMealDetailJson(mealDetail)
//          .setAdjustSkuRemark(orderDetailDto.getAdjustSkuRemark())
          .setServeStatus(ServeStatusEnum.SERVE_NOT_START)
//          .setShouldCreateAdjustSkuRemark(true)
          .setShouldCreatePrice(true)
          .setShouldCreateMealDetailJson(true)
          .setSkuId(orderDetailDto.getSkuId())
          .build();
      orderDetails.add(orderDetail);
    }
    final var customerNotice = CustomerNotice.newBuilder()
        .addAllAvoids(createOrderDto.getCustomerNoticeJson().getAvoids())
        .addAllDoctors(createOrderDto.getCustomerNoticeJson().getDoctors())
        .build();

    //判断用餐时间是否是当天
    final var mealDate = createOrderDto.getMealTime().toLocalDate();
    final var todayDate = LocalDate.now();
    OrderStatusEnum orderStatus = OrderStatusEnum.TO_PREPARE;
    if (mealDate.equals(todayDate)) {
      orderStatus = OrderStatusEnum.PREPARING;
    }

    final var creation = ClientCustomerOrderCreation.newBuilder()
        .setShouldCreateCustomerId(createOrderDto.getShouldCreateCustomerId())
        .setCustomerId(createOrderDto.getCustomerId())
        .setStallId(createOrderDto.getStallId())
        .setStatus(orderStatus)
        .setAddress(createOrderDto.getAddress())
        .setClientId(createOrderDto.getClientId())
        .setShouldCreateOpenId(createOrderDto.getShouldCreateOpenId())
        .setOpenId(createOrderDto.getOpenId())
        .setShouldCreateRoomNo(!createOrderDto.getRoomNo().isEmpty())
        .setRoomNo(createOrderDto.getRoomNo())
        .setShouldCreateTableCode(createOrderDto.getOrderType().equals(OrderTypeEnum.DINE_IN.getValue()))
        .setTableCode(createOrderDto.getTableCode())
        .setOnlinePay(createOrderDto.getOnlinePay())
        .setShouldCreatePayStatus(createOrderDto.getOnlinePay())
        .setPayStatus(PayStatusEnum.TO_PAY)
        .setMenuId(createOrderDto.getMenuId())
        .setTotalNum(createOrderDto.getTotalNum())
        .setPayPrice(createOrderDto.getPayPrice())
        .setMealTime(createOrderDto.getMealTime().toInstant(ZoneOffset.UTC).toEpochMilli())
        .setShouldCreateTableCode(createOrderDto.getCloseTimeType().equals(CloseTimeType.IMMEDIATELY))
        .setTableCode(createOrderDto.getTableCode())
        .setShouldCreatePickupCode(createOrderDto.getCloseTimeType().equals(CloseTimeType.IMMEDIATELY))
//        .setPickupCode(createOrderDto.getPickupCode())
        .setShouldCreateRemark(true)
        .setRemark(createOrderDto.getRemark())
        .setShouldCreateCustomerNoticeJson(true)
        .setCustomerNoticeJson(customerNotice)
        .setCloseTimeType(createOrderDto.getCloseTimeType())
        .setShouldCreateOrderDetails(true)
        .addAllOrderDetails(orderDetails)
        .build();
    CreateClientCustomerOrderRpcResponse orderResponse = orderServiceRpcBlockingStub
        .createClientCustomerOrder(CreateClientCustomerOrderRpcRequest.newBuilder()
            .setCreation(creation)
            .setCreationSource(OrderSourceEnum.forNumber(createOrderDto.getCreationSource()))
            .setEnterpriseId(createOrderDto.getEnterpriseId())
            .setCreatedBy(createOrderDto.getCreatedBy())
            .build());
    return CreateOrderResponse.builder().id(orderResponse.getId()).isCreated(true).build();
  }

}