OrderDetailDbServiceImpl.java 16.5 KB
package com.tianting.infoloop.service.impl;

import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.infoloop.tianting.clientcustomerorderservice.BatchCreateClientCustomerOrderDetailsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.BatchUpdateClientCustomerOrderDetailsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.CreateClientCustomerOrderDetailRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.GetClientCustomerOrderDetailsByOrderIdsRpcRequest;
import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.UpdateClientCustomerOrderDetailRpcRequest;
import com.tianting.infoloop.mapper.OrderDbMapper;
import com.tianting.infoloop.mapper.OrderDetailMapper;
import com.tianting.infoloop.model.db.OrderDb;
import com.tianting.infoloop.model.db.OrderDetailDb;
import com.tianting.infoloop.model.dto.MealDetailJson;
import com.tianting.infoloop.service.OrderDetailDbService;
import com.tianting.infoloop.utils.ProtoBeanUtil;
import com.tianting.infoloop.utils.exception.ErrorCodeConstants;
import com.tianting.infoloop.utils.exception.ServiceExceptionUtil;
import java.time.Instant;
import java.time.ZoneId;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
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 OrderDetailDbServiceImpl extends ServiceImpl<OrderDetailMapper, OrderDetailDb>
    implements OrderDetailDbService {
  private final OrderDetailMapper orderDetailMapper;
  private final OrderDbMapper orderDbMapper;

  @Override
  public OrderDetailDb createOrderDetailDb(
      CreateClientCustomerOrderDetailRpcRequest createOrderDetailRequest) {
    ObjectMapper objectMapper = new ObjectMapper();
    OrderDetailDb orderDetailDb = new OrderDetailDb();
    if (createOrderDetailRequest.getCreation().getShouldCreateOrderId()){
      orderDetailDb.setOrderId(createOrderDetailRequest.getCreation().getOrderId());
    }
    orderDetailDb.setMenuDetailId(createOrderDetailRequest.getCreation().getMenuDetailId());
    orderDetailDb.setCount(createOrderDetailRequest.getCreation().getCount());
    orderDetailDb.setMealId(createOrderDetailRequest.getCreation().getMealId());
    orderDetailDb.setCategoryId(createOrderDetailRequest.getCreation().getCategoryId());
    orderDetailDb.setSkuId(createOrderDetailRequest.getCreation().getSkuId());
    orderDetailDb.setCreatedBy(createOrderDetailRequest.getCreatedBy());
    orderDetailDb.setCreationSource(createOrderDetailRequest.getCreationSourceValue());
    orderDetailDb.setUpdatedBy(createOrderDetailRequest.getCreatedBy());
    orderDetailDb.setUpdateSource(createOrderDetailRequest.getCreationSourceValue());
    orderDetailDb.setEnterpriseId(createOrderDetailRequest.getEnterpriseId());
    if (createOrderDetailRequest.getCreation().getShouldCreateShowName()) {
      orderDetailDb.setShowName(createOrderDetailRequest.getCreation().getShowName());
    }
    if (createOrderDetailRequest.getCreation().getShouldCreatePrice()) {
      orderDetailDb.setPrice(createOrderDetailRequest.getCreation().getPrice());
    }
    if (createOrderDetailRequest.getCreation().getShouldCreateAdjustSkuRemark()) {
      orderDetailDb.setAdjustSkuRemark(createOrderDetailRequest.getCreation().getAdjustSkuRemark());
    }
    orderDetailDb.setServeStatus(ServeStatusEnum.SERVE_NOT_START_VALUE);
    if (createOrderDetailRequest.getCreation().getShouldCreateMealDetailJson()) {
      orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
          .allergies(createOrderDetailRequest.getCreation().getMealDetailJson().getAllergiesList())
          .avoids(createOrderDetailRequest.getCreation().getMealDetailJson().getAvoidsList())
          .basicMaterials(createOrderDetailRequest.getCreation().getMealDetailJson().getBasicMaterials())
          .carbohydrate(createOrderDetailRequest.getCreation().getMealDetailJson().getCarbohydrate())
          .dockers(createOrderDetailRequest.getCreation().getMealDetailJson().getDockersList())
          .efficacies(createOrderDetailRequest.getCreation().getMealDetailJson().getEfficaciesList())
          .energy(createOrderDetailRequest.getCreation().getMealDetailJson().getEnergy())
          .fat(createOrderDetailRequest.getCreation().getMealDetailJson().getFat())
          .protein(createOrderDetailRequest.getCreation().getMealDetailJson().getProtein())
          .skus(createOrderDetailRequest.getCreation().getMealDetailJson().getSkusList())
          .tastes(createOrderDetailRequest.getCreation().getMealDetailJson().getTastesList())
          .build()));
    }
    boolean res = this.save(orderDetailDb);
    if (!res) {
      throw ServiceExceptionUtil.exception(ErrorCodeConstants.ORDER_DETAIL_GEN_FAIL);
    }
    return orderDetailDb;
  }

  @Override
  public List<OrderDetailDb> batchCreateOrderDetailDb(BatchCreateClientCustomerOrderDetailsRpcRequest
      batchCreateOrderDetailsRequest) {
    ObjectMapper objectMapper = new ObjectMapper();
    var list = batchCreateOrderDetailsRequest.getCreationsList().stream()
        .map(creation -> {
          OrderDetailDb orderDetailDb = new OrderDetailDb();
          orderDetailDb.setCreationSource(batchCreateOrderDetailsRequest.getCreationSourceValue());
          orderDetailDb.setCreatedBy(batchCreateOrderDetailsRequest.getCreatedBy());
          orderDetailDb.setUpdateSource(batchCreateOrderDetailsRequest.getCreationSourceValue());
          orderDetailDb.setUpdatedBy(batchCreateOrderDetailsRequest.getCreatedBy());
          orderDetailDb.setMenuDetailId(creation.getMenuDetailId());
          orderDetailDb.setCount(creation.getCount());
          orderDetailDb.setMealId(creation.getMealId());
          orderDetailDb.setCategoryId(creation.getCategoryId());
          orderDetailDb.setSkuId(creation.getSkuId());
          orderDetailDb.setIsDeleted(false);
          orderDetailDb.setServeStatus(ServeStatusEnum.SERVE_NOT_START_VALUE);
          orderDetailDb.setEnterpriseId(batchCreateOrderDetailsRequest.getEnterpriseId());
          if (creation.getShouldCreateOrderId()) {
            orderDetailDb.setOrderId(creation.getOrderId());
          }
          if (creation.getShouldCreateShowName()) {
            orderDetailDb.setShowName(creation.getShowName());
          }
          if (creation.getShouldCreatePrice()) {
            orderDetailDb.setPrice(creation.getPrice());
          }
          if (creation.getShouldCreateAdjustSkuRemark()) {
            orderDetailDb.setAdjustSkuRemark(creation.getAdjustSkuRemark());
          }
          if (creation.getShouldCreateMealDetailJson()) {
            orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
                .allergies(creation.getMealDetailJson().getAllergiesList())
                .avoids(creation.getMealDetailJson().getAvoidsList())
                .basicMaterials(creation.getMealDetailJson().getBasicMaterials())
                .carbohydrate(creation.getMealDetailJson().getCarbohydrate())
                .dockers(creation.getMealDetailJson().getDockersList())
                .efficacies(creation.getMealDetailJson().getEfficaciesList())
                .energy(creation.getMealDetailJson().getEnergy())
                .fat(creation.getMealDetailJson().getFat())
                .protein(creation.getMealDetailJson().getProtein())
                .skus(creation.getMealDetailJson().getSkusList())
                .tastes(creation.getMealDetailJson().getTastesList())
                .build()));
          }
          return orderDetailDb;
        })
        .collect(Collectors.toList());
    return SpringUtil.getBean(OrderDetailDbServiceImpl.class).saveBatch(list) ? list : Collections.emptyList();
  }

  @Override
  public Boolean updateOrderDetailDb(UpdateClientCustomerOrderDetailRpcRequest
      updateOrderDetailRequest) {
    var orderDetailDb = new OrderDetailDb();
    orderDetailDb.setId(updateOrderDetailRequest.getModification().getId());
    orderDetailDb.setUpdatedBy(updateOrderDetailRequest.getUpdatedBy());
    orderDetailDb.setUpdateSource(updateOrderDetailRequest.getUpdateSourceValue());

    if (updateOrderDetailRequest.getModification().getShouldUpdateMenuDetailId()) {
      orderDetailDb.setMenuDetailId(updateOrderDetailRequest.getModification().getMenuDetailId());
    }
    if (updateOrderDetailRequest.getModification().getShouldUpdateCount()) {
      orderDetailDb.setCount(updateOrderDetailRequest.getModification().getCount());
    }
    if (updateOrderDetailRequest.getModification().getShouldUpdateMealId()) {
      orderDetailDb.setMealId(updateOrderDetailRequest.getModification().getMealId());
    }
    if (updateOrderDetailRequest.getModification().getShouldUpdateCategoryId()) {
      orderDetailDb.setCategoryId(updateOrderDetailRequest.getModification().getCategoryId());
    }
    if (updateOrderDetailRequest.getModification().getShouldUpdateSkuId()) {
      orderDetailDb.setSkuId(updateOrderDetailRequest.getModification().getSkuId());
    }
    if (updateOrderDetailRequest.getModification().getShouldUpdateShowName()) {
      orderDetailDb.setShowName(updateOrderDetailRequest.getModification().getShowName());
    }
    if (updateOrderDetailRequest.getModification().getShouldUpdatePrice()) {
      orderDetailDb.setPrice(updateOrderDetailRequest.getModification().getPrice());
    }
    if (updateOrderDetailRequest.getModification().getShouldUpdateAdjustSkuRemark()) {
      orderDetailDb.setAdjustSkuRemark(updateOrderDetailRequest.getModification().getAdjustSkuRemark());
    }
    if (updateOrderDetailRequest.getModification().getShouldUpdateServeStatus()) {
      orderDetailDb.setServeStatus(updateOrderDetailRequest.getModification().getServeStatusValue());
    }
    if (updateOrderDetailRequest.getModification().getShouldUpdateMealDetailJson()) {
      ObjectMapper objectMapper = new ObjectMapper();
      orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
          .allergies(updateOrderDetailRequest.getModification().getMealDetailJson().getAllergiesList())
          .avoids(updateOrderDetailRequest.getModification().getMealDetailJson().getAvoidsList())
          .basicMaterials(updateOrderDetailRequest.getModification().getMealDetailJson().getBasicMaterials())
          .carbohydrate(updateOrderDetailRequest.getModification().getMealDetailJson().getCarbohydrate())
          .dockers(updateOrderDetailRequest.getModification().getMealDetailJson().getDockersList())
          .efficacies(updateOrderDetailRequest.getModification().getMealDetailJson().getEfficaciesList())
          .energy(updateOrderDetailRequest.getModification().getMealDetailJson().getEnergy())
          .fat(updateOrderDetailRequest.getModification().getMealDetailJson().getFat())
          .protein(updateOrderDetailRequest.getModification().getMealDetailJson().getProtein())
          .skus(updateOrderDetailRequest.getModification().getMealDetailJson().getSkusList())
          .tastes(updateOrderDetailRequest.getModification().getMealDetailJson().getTastesList())
          .build()));
    }
    return orderDetailMapper.updateById(orderDetailDb) > 0;
  }

  @Override
  public Boolean batchUpdateOrderDetailDbs(
      BatchUpdateClientCustomerOrderDetailsRpcRequest batchUpdateOrderDetailsRequest) {
    final var list = batchUpdateOrderDetailsRequest.getModificationsList().stream().map(modification -> {
      var orderDetailDb = new OrderDetailDb();
      orderDetailDb.setId(modification.getId());
      if (modification.getShouldUpdateMenuDetailId()) {
        orderDetailDb.setMenuDetailId(modification.getMenuDetailId());
      }
      if (modification.getShouldUpdateCount()) {
        orderDetailDb.setCount(modification.getCount());
      }
      if (modification.getShouldUpdateMealId()) {
        orderDetailDb.setMealId(modification.getMealId());
      }
      if (modification.getShouldUpdateCategoryId()) {
        orderDetailDb.setCategoryId(modification.getCategoryId());
      }
      if (modification.getShouldUpdateSkuId()) {
        orderDetailDb.setSkuId(modification.getSkuId());
      }
      if (modification.getShouldUpdateShowName()) {
        orderDetailDb.setShowName(modification.getShowName());
      }
      if (modification.getShouldUpdatePrice()) {
        orderDetailDb.setPrice(modification.getPrice());
      }
      if (modification.getShouldUpdateAdjustSkuRemark()) {
        orderDetailDb.setAdjustSkuRemark(modification.getAdjustSkuRemark());
      }
      if (modification.getShouldUpdateServeStatus()) {
        orderDetailDb.setServeStatus(modification.getServeStatusValue());
      }
      if (modification.getShouldUpdateMealDetailJson()) {
        ObjectMapper objectMapper = new ObjectMapper();
        orderDetailDb.setMealDetailJson(objectMapper.valueToTree(MealDetailJson.builder()
            .allergies(modification.getMealDetailJson().getAllergiesList())
            .avoids(modification.getMealDetailJson().getAvoidsList())
            .basicMaterials(modification.getMealDetailJson().getBasicMaterials())
            .carbohydrate(modification.getMealDetailJson().getCarbohydrate())
            .dockers(modification.getMealDetailJson().getDockersList())
            .efficacies(modification.getMealDetailJson().getEfficaciesList())
            .energy(modification.getMealDetailJson().getEnergy())
            .fat(modification.getMealDetailJson().getFat())
            .protein(modification.getMealDetailJson().getProtein())
            .skus(modification.getMealDetailJson().getSkusList())
            .tastes(modification.getMealDetailJson().getTastesList())
            .build()));
      }
      return orderDetailDb;
    }).collect(Collectors.toList());
    final var res = SpringUtil.getBean(OrderDetailDbServiceImpl.class).updateBatchById(list);
    // 如果一个订单中所有的orderDetail都是已出餐状态,那么该订单的状态需要修改为已完成。
    final var orderDetailIds = list.stream()
        .map(OrderDetailDb::getId)
        .distinct()
        .collect(Collectors.toList());
    QueryWrapper<OrderDetailDb> wrapper = new QueryWrapper<>();
    wrapper.eq("isDeleted", false);
    wrapper.in("id", orderDetailIds);
    final var orderDetails = orderDetailMapper.selectList(wrapper);
    final var orderIds = orderDetails.stream()
        .map(OrderDetailDb::getOrderId)
        .distinct()
        .collect(Collectors.toList());

    for (Integer orderId: orderIds) {
      // 找出这个订单所有的order detail
      QueryWrapper<OrderDetailDb> detailWrapper = new QueryWrapper<>();
      detailWrapper.eq("isDeleted", false);
      detailWrapper.eq("orderId", orderId);
      final var curOrderDetails = orderDetailMapper.selectList(detailWrapper);
      final var curOrderDetailStatus = curOrderDetails.stream()
          .filter(d -> d.getOrderId().equals(orderId))
          .map(OrderDetailDb::getServeStatus)
          .distinct()
          .collect(Collectors.toList());
      final var isCanceled = curOrderDetailStatus.stream().allMatch(s -> s.equals(ServeStatusEnum.SERVE_REJECT_VALUE));
      final var serveNotStartStatus = curOrderDetailStatus.stream()
          .filter(s -> s.equals(ServeStatusEnum.SERVE_NOT_START_VALUE))
          .findAny();
      if (isCanceled || serveNotStartStatus.isEmpty()) {
        var orderDb = new OrderDb();
        orderDb.setId(orderId);
        if (isCanceled) {
          orderDb.setStatus(OrderStatusEnum.ORDER_CANCELED_VALUE);
        } else {
          orderDb.setStatus(OrderStatusEnum.ALL_SERVED_VALUE);
        }
        orderDbMapper.updateById(orderDb);
      }
    }
    return res;
  }

  public   List<OrderDetailDb> getOrderDetailsByOrderIds(
      GetClientCustomerOrderDetailsByOrderIdsRpcRequest getOrderDetailsByOrderIdsRequest) {
    QueryWrapper<OrderDetailDb> wrapper = new QueryWrapper<>();
    if (!getOrderDetailsByOrderIdsRequest.getIncludeDeleted()) {
      wrapper.eq("isDeleted", false);
    }
    wrapper.in("orderId", getOrderDetailsByOrderIdsRequest.getOrderIdsList())
        .orderByDesc("createdAt");
    return orderDetailMapper.selectList(wrapper);

  }
}