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

import com.infoloop.tianting.clientcustomerorderservice.BatchCreateClientCustomerOrderAndDetailsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.BatchCreateClientCustomerOrderAndDetailsRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.BatchCreateClientCustomerOrderDetailsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.BatchCreateClientCustomerOrderDetailsRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderCreation;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderDetailCreation;
import com.infoloop.tianting.clientcustomerorderservice.ClientCustomerOrderServiceRpcGrpc;
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.QueryClientCustomerOrdersByConditionRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.enums.OrderTypeEnum;
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.OrderDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderDto;
import io.swagger.models.auth.In;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
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;

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

  public List<SingleClientCustomerOrderRpcResponse> getOrdersByCondition(QueryOrderDto queryOrderDto) {
    final var request = QueryClientCustomerOrdersByConditionRpcRequest.newBuilder()
        .setEnterpriseId(queryOrderDto.getEnterpriseId())
        .setShouldFilterStatus(queryOrderDto.isShouldFilterStatus())
        .setStatus(queryOrderDto.getStatus())
        .build();
    return orderServiceRpcBlockingStub.queryClientCustomerOrdersByCondition(request).getResponsesList();
  }

  public List<SingleClientCustomerOrderDetailRpcResponse> getOrderDetailsByOrderId(Integer orderId) {
    return orderServiceRpcBlockingStub.getClientCustomerOrderDetailsByOrderIds(
        GetClientCustomerOrderDetailsByOrderIdsRpcRequest.newBuilder()
            .setIncludeDeleted(false)
            .addAllOrderIds(List.of(orderId))
            .build()).getResponsesList();
  }
//  public GetOrdersByOpenIdRpcResponse queryOrdersByOpenId(Integer openId) {
//    return orderServiceRpcBlockingStub.getOrdersByCustomerId(
//        GetOrdersByOpenIdRpcRequest.newBuilder().setOpenId(openId).build());
//  }

  public CreateOrderResponse createOrder(CreateOrderDto createOrderDto) {
    final var customerNotice = CustomerNotice.newBuilder()
        .addAllAvoids(createOrderDto.getCustomerNoticeJson().getAvoids())
        .addAllDoctors(createOrderDto.getCustomerNoticeJson().getDoctors())
        .build();

    final var creation = ClientCustomerOrderCreation.newBuilder()
        .setShouldCreateCustomerId(true)
        .setCustomerId(createOrderDto.getCustomerId())
        .setStallId(createOrderDto.getStallId())
        .setAddress(createOrderDto.getAddress())
        .setClientId(createOrderDto.getClientId())
        .setShouldCreateOpenId(!createOrderDto.getOpenId().isEmpty())
        .setOpenId(createOrderDto.getOpenId())
        .setShouldCreateRoomNo(!createOrderDto.getRoomNo().isEmpty())
        .setRoomNo(createOrderDto.getRoomNo())
        .setShouldCreateTableCode(createOrderDto.getOrderType().equals(OrderTypeEnum.DINE_IN.getValue()))
        .setTableCode(createOrderDto.getTableCode())
        .setOnlinePay(createOrderDto.getOnlinePay())
        .setMenuId(createOrderDto.getMenuId())
        .setTotalNum(createOrderDto.getTotalNum())
        .setPayPrice(createOrderDto.getPayPrice())
        .setMealTime(createOrderDto.getMealTime().toInstant(ZoneOffset.UTC).toEpochMilli())
        .setShouldCreatePickupCode(createOrderDto.getOrderType().equals(OrderTypeEnum.DINE_IN.getValue()))
        .setPickupCode(createOrderDto.getPickupCode())
        .setRemark(createOrderDto.getRemark())
        .setCustomerNoticeJson(customerNotice)
        .build();
    CreateClientCustomerOrderRpcResponse orderResponse = orderServiceRpcBlockingStub
        .createClientCustomerOrder(CreateClientCustomerOrderRpcRequest.newBuilder()
            .setCreation(creation)
            .setCreationSource(OrderSourceEnum.forNumber(createOrderDto.getCreationSource()))
            .setEnterpriseId(createOrderDto.getEnterpriseId())
            .setCreatedBy(createOrderDto.getCreatedBy())
            .build());

    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()
          .setOrderId(orderResponse.getId())
          .setMenuDetailId(orderDetailDto.getMenuDetailId())
          .setCount(orderDetailDto.getCount())
          .setMealId(orderDetailDto.getMealId())
          .setCategoryId(orderDetailDto.getCategoryId())
          .setShouldCreateShowName(true)
          .setShowName(orderDetailDto.getShowName())
          .setPrice(orderDetailDto.getPrice())
          .setMealDetailJson(mealDetail)
          .setAdjustSkuRemark(orderDetailDto.getAdjustSkuRemark())
          .setNotServe(orderDetailDto.getNotServe())
          .setShouldCreateAdjustSkuRemark(true)
          .setShouldCreatePrice(true)
          .setShouldCreateMealDetailJson(false)
          .setSkuId(orderDetailDto.getSkuId())
          .build();
      orderDetails.add(orderDetail);
    }
    BatchCreateClientCustomerOrderDetailsRpcResponse orderDetailsRpcResponse = orderServiceRpcBlockingStub.batchCreateClientCustomerOrderDetails(
        BatchCreateClientCustomerOrderDetailsRpcRequest.newBuilder()
            .addAllCreations(orderDetails)
            .setCreatedBy(createOrderDto.getCreatedBy())
            .setEnterpriseId(createOrderDto.getEnterpriseId())
            .setCreationSource(OrderSourceEnum.forNumber(createOrderDto.getCreationSource())).build());
    return CreateOrderResponse.builder().id(orderResponse.getId()).isCreated(true).build();
  }

}