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

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.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderRpcResponse;
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.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;

  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()))
        .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 modifications = orderDetailBatchUpdateDto.getDetails().stream().map( d-> {
      MealDetail mealDetail;
      if(d.getShouldUpdateMealDetailJson()) {
        mealDetail = MealDetail.newBuilder()
            .setBasicMaterials(d.getMealDetailJson().getBasicMaterials())
            .addAllTastes(d.getMealDetailJson().getTastes())
            .addAllEfficacies(d.getMealDetailJson().getEfficacies())
            .addAllDockers(d.getMealDetailJson().getDockers())
            .setEnergy(d.getMealDetailJson().getEnergy())
            .setFat(d.getMealDetailJson().getFat())
            .setProtein(d.getMealDetailJson().getProtein())
            .setCarbohydrate(d.getMealDetailJson().getCarbohydrate())
            .addAllAllergies(d.getMealDetailJson().getAllergies())
            .addAllAvoids(d.getMealDetailJson().getAvoids())
            .addAllSkus(d.getMealDetailJson().getSkus())
            .build();
      } else {
        mealDetail = MealDetail.newBuilder().build();
      }
      Integer menuDetailId = 0;
      if (d.getShouldUpdateMenuDetailId()) {
        menuDetailId = d.getMenuDetailId();
      }
      Integer count = 0;
      if (d.getShouldUpdateCount()) {
        count = d.getCount();
      }
      Integer mealId = 0;
      if (d.getShouldUpdateMealId()) {
        mealId = d.getMealId();
      }
      Integer categoryId = 0;
      if (d.getShouldUpdateCategoryId()) {
        categoryId = d.getCategoryId();
      }
      Integer skuId = 0;
      if (d.getShouldUpdateSkuId()) {
        skuId = d.getSkuId();
      }
      String showName = "";
      if (d.getShouldUpdateShowName()) {
        showName = d.getShowName();
      }
      Boolean notServe = false;
      if (d.getShouldUpdateNotServe()) {
        notServe = true;
      }
        final var detail = ClientCustomerOrderDetailModification.newBuilder()
            .setId(d.getId())
            .setShouldUpdateMenuDetailId(d.getShouldUpdateMenuDetailId())
            .setMenuDetailId(menuDetailId)
            .setShouldUpdateCount(d.getShouldUpdateCount())
            .setCount(count)
            .setShouldUpdateMealId(d.getShouldUpdateMealId())
            .setMealId(mealId)
            .setShouldUpdateCategoryId(d.getShouldUpdateCategoryId())
            .setCategoryId(categoryId)
            .setShouldUpdateSkuId(d.getShouldUpdateSkuId())
            .setSkuId(skuId)
            .setShouldUpdateShowName(d.getShouldUpdateShowName())
            .setShowName(showName)
            .setShouldUpdateNotServe(d.getShouldUpdateNotServe())
            .setNotServe(notServe)
            .setShouldUpdateMealDetailJson(d.getShouldUpdateMealDetailJson())
            .setMealDetailJson(mealDetail)
            .build();
        return detail;
    }
    ).collect(Collectors.toList());
    final var request = BatchUpdateClientCustomerOrderDetailsRpcRequest.newBuilder()
        .setEnterpriseId(orderDetailBatchUpdateDto.getEnterpriseId())
        .setUpdatedBy(orderDetailBatchUpdateDto.getUpdatedBy())
        .setUpdateSourceValue(orderDetailBatchUpdateDto.getUpdateSource().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())
        .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 GetOrdersByOpenIdRpcResponse queryOrdersByOpenId(Integer openId) {
//    return orderServiceRpcBlockingStub.getOrdersByCustomerId(
//        GetOrdersByOpenIdRpcRequest.newBuilder().setOpenId(openId).build());
//  }

  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())
          .setNotServe(orderDetailDto.getNotServe())
          .setShouldCreateAdjustSkuRemark(true)
          .setShouldCreatePrice(true)
          .setShouldCreateMealDetailJson(false)
          .setSkuId(orderDetailDto.getSkuId())
          .build();
      orderDetails.add(orderDetail);
    }
    final var customerNotice = CustomerNotice.newBuilder()
        .addAllAvoids(createOrderDto.getCustomerNoticeJson().getAvoids())
        .addAllDoctors(createOrderDto.getCustomerNoticeJson().getDoctors())
        .build();

    final var creation = ClientCustomerOrderCreation.newBuilder()
        .setShouldCreateCustomerId(createOrderDto.getShouldCreateCustomerId())
        .setCustomerId(createOrderDto.getCustomerId())
        .setStallId(createOrderDto.getStallId())
        .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())
        .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();
  }

}