MenuServiceImpl.java 13.1 KB
package com.infoloop.tianting.service.impl;

import com.infoloop.tianting.clientinventoryservice.SingleClientRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse;
import com.infoloop.tianting.menuservice.SingleMenuRpcResponse;
import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsDto;
import com.infoloop.tianting.model.dto.MenuDbDTO.BatchCreateMenuRefsResponseDto;
import com.infoloop.tianting.model.dto.MenuDbDTO.DishRuleJson;
import com.infoloop.tianting.model.dto.MenuDbDTO.MenuDetailDto;
import com.infoloop.tianting.model.dto.MenuDbDTO.MenuDto;
import com.infoloop.tianting.model.dto.MenuDbDTO.MenuRefDto;
import com.infoloop.tianting.model.dto.MenuDbDTO.OrderRuleJson;
import com.infoloop.tianting.service.MenuService;
import com.infoloop.tianting.service.client.MealOrderServiceRpcClient;
import com.infoloop.tianting.service.client.MenuServiceRpcClient;
import com.infoloop.tianting.utils.DateUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class MenuServiceImpl implements MenuService {

    private final MenuServiceRpcClient menuServiceRpcClient;

    private final MealOrderServiceRpcClient mealOrderServiceRpcClient;

    @Override
    public List<MenuDto> queryMiniProgramPublishedMenusByStallId(Integer enterpriseId, Integer stallId) {
        final var response = menuServiceRpcClient.queryMiniProgramPublishedMenusByStallId(enterpriseId, stallId);
        return response.getResponsesList().stream().map(menu ->
                MenuDto.builder()
                        .id(menu.getId())
                        .code(menu.getCode())
                        .enterpriseId(menu.getEnterpriseId())
                        .name(menu.getName())
                        .status(menu.getStatusValue())
                        .customerScope(menu.getCustomerScope())
                        .nutritionPromotion(menu.getNutritionPromotion())
                        .nutritionalStatistics(menu.getNutritionalStatistics())
                        .checkMedicalConflict(menu.getCheckMedicalConflict())
                        .dishRuleJson(DishRuleJson.builder()
                                .days(menu.getDishRuleJson().getDays())
                                .dishType(menu.getDishRuleJson().getDishType())
                                .mealIds(menu.getDishRuleJson().getMealIdsList())
                                .build())
                        .orderRuleJson(OrderRuleJson.builder()
                                .allowMicroPlaceOrder(menu.getOrderRuleJson().getAllowMicroPlaceOrder())
                                .closeTimeType(menu.getOrderRuleJson().getCloseTimeType())
                                .dishSelectRule(menu.getOrderRuleJson().getDishSelectRule())
                                .earlyDays(menu.getOrderRuleJson().getEarlyDays())
                                .modeOfPayment(menu.getOrderRuleJson().getModeOfPayment())
                                .placeOrderCount(menu.getOrderRuleJson().getPlaceOrderCount())
                                .startTime(menu.getOrderRuleJson().getStartTime())
                                .endTime(menu.getOrderRuleJson().getEndTime())
                                .deadline(menu.getOrderRuleJson().getDeadline())
                                .build())
                        .createdBy(menu.getCreatedBy())
                        .creationSource(menu.getCreationSource())
                        .createdAt(DateUtil.formatDate(menu.getCreatedAt()))
                        .updatedBy(menu.getUpdatedBy())
                        .updateSource(menu.getUpdateSource())
                        .updatedAt(DateUtil.formatDate(menu.getUpdatedAt()))
                        .publishAt(DateUtil.formatDate(menu.getPublishAt()))
                        .build()).collect(Collectors.toList());
    }

    @Override
    public List<MenuDto> queryPublishedMenusByStallId(Integer enterpriseId, List<Integer> stallIds) {
        final var response = menuServiceRpcClient.queryPublishedMenusByStallId(enterpriseId, stallIds);
        return new ArrayList<>(response.getResponsesList().stream()
                .collect(Collectors.toMap(
                        SingleMenuRpcResponse::getId,
                        menu -> MenuDto.builder()
                                .id(menu.getId())
                                .code(menu.getCode())
                                .enterpriseId(menu.getEnterpriseId())
                                .name(menu.getName())
                                .status(menu.getStatusValue())
                                .customerScope(menu.getCustomerScope())
                                .nutritionPromotion(menu.getNutritionPromotion())
                                .nutritionalStatistics(menu.getNutritionalStatistics())
                                .checkMedicalConflict(menu.getCheckMedicalConflict())
                                .dishRuleJson(DishRuleJson.builder()
                                        .days(menu.getDishRuleJson().getDays())
                                        .dishType(menu.getDishRuleJson().getDishType())
                                        .mealIds(menu.getDishRuleJson().getMealIdsList())
                                        .build())
                                .orderRuleJson(OrderRuleJson.builder()
                                        .allowMicroPlaceOrder(menu.getOrderRuleJson().getAllowMicroPlaceOrder())
                                        .closeTimeType(menu.getOrderRuleJson().getCloseTimeType())
                                        .dishSelectRule(menu.getOrderRuleJson().getDishSelectRule())
                                        .earlyDays(menu.getOrderRuleJson().getEarlyDays())
                                        .modeOfPayment(menu.getOrderRuleJson().getModeOfPayment())
                                        .placeOrderCount(menu.getOrderRuleJson().getPlaceOrderCount())
                                        .startTime(menu.getOrderRuleJson().getStartTime())
                                        .endTime(menu.getOrderRuleJson().getEndTime())
                                        .deadline(menu.getOrderRuleJson().getDeadline())
                                        .build())
                                .createdBy(menu.getCreatedBy())
                                .creationSource(menu.getCreationSource())
                                .createdAt(DateUtil.formatDate(menu.getCreatedAt()))
                                .updatedBy(menu.getUpdatedBy())
                                .updateSource(menu.getUpdateSource())
                                .updatedAt(DateUtil.formatDate(menu.getUpdatedAt()))
                                .publishAt(DateUtil.formatDate(menu.getPublishAt()))
                                .build(),
                        (existing, replacement) -> existing
                ))
                .values());
    }

    @Override
    public MenuDto getMenuById(Integer enterpriseId, Integer id) {
        final var response = menuServiceRpcClient.getMenuById(enterpriseId, id);
        final var menu = response.getResponse();
        return MenuDto.builder()
                .id(menu.getId())
                .code(menu.getCode())
                .enterpriseId(menu.getEnterpriseId())
                .name(menu.getName())
                .status(menu.getStatusValue())
                .customerScope(menu.getCustomerScope())
                .nutritionPromotion(menu.getNutritionPromotion())
                .nutritionalStatistics(menu.getNutritionalStatistics())
                .checkMedicalConflict(menu.getCheckMedicalConflict())
                .dishRuleJson(DishRuleJson.builder()
                        .days(menu.getDishRuleJson().getDays())
                        .dishType(menu.getDishRuleJson().getDishType())
                        .mealIds(menu.getDishRuleJson().getMealIdsList())
                        .build())
                .orderRuleJson(OrderRuleJson.builder()
                        .allowMicroPlaceOrder(menu.getOrderRuleJson().getAllowMicroPlaceOrder())
                        .closeTimeType(menu.getOrderRuleJson().getCloseTimeType())
                        .dishSelectRule(menu.getOrderRuleJson().getDishSelectRule())
                        .earlyDays(menu.getOrderRuleJson().getEarlyDays())
                        .modeOfPayment(menu.getOrderRuleJson().getModeOfPayment())
                        .placeOrderCount(menu.getOrderRuleJson().getPlaceOrderCount())
                        .startTime(menu.getOrderRuleJson().getStartTime())
                        .endTime(menu.getOrderRuleJson().getEndTime())
                        .deadline(menu.getOrderRuleJson().getDeadline())
                        .build())
                .createdBy(menu.getCreatedBy())
                .creationSource(menu.getCreationSource())
                .createdAt(DateUtil.formatDate(menu.getCreatedAt()))
                .updatedBy(menu.getUpdatedBy())
                .updateSource(menu.getUpdateSource())
                .updatedAt(DateUtil.formatDate(menu.getUpdatedAt()))
                .publishAt(DateUtil.formatDate(menu.getPublishAt()))
                .build();
    }

    @Override
    public List<MenuDetailDto> queryMenuDetailsByMenuId(Integer enterpriseId, Integer menuId) {
        final var response = menuServiceRpcClient.queryMenuDetailsByMenuId(enterpriseId, menuId);
        return response.getResponsesList().stream().map(menuDetail ->
                MenuDetailDto.builder()
                        .id(menuDetail.getId())
                        .categoryId(menuDetail.getCategoryId())
                        .mealId(menuDetail.getMealId())
                        .menuId(menuDetail.getMenuId())
                        .days(menuDetail.getDays())
                        .enterpriseId(menuDetail.getEnterpriseId())
                        .price(menuDetail.getPrice())
                        .categoryNames(menuDetail.getCategoryNamesList())
                        .sort(menuDetail.getSort())
                        .showName(menuDetail.getShowName())
                        .skuId(menuDetail.getSkuId())
                        .isDeleted(menuDetail.getIsDeleted())
                        .createdBy(menuDetail.getCreatedBy())
                        .creationSource(menuDetail.getCreationSource())
                        .createdAt(DateUtil.formatDate(menuDetail.getCreatedAt()))
                        .updatedBy(menuDetail.getUpdatedBy())
                        .updateSource(menuDetail.getUpdateSource())
                        .updatedAt(DateUtil.formatDate(menuDetail.getUpdatedAt()))
                        .build()).collect(Collectors.toList());
    }

    @Override
    public List<MenuRefDto> getClientCustomerMenuRefsByCustomerId(Integer enterpriseId, Integer customerId) {
        final var response = menuServiceRpcClient.getClientCustomerMenuRefsByCustomerId(enterpriseId, customerId);
        return response.getResponsesList().stream().map(ref ->
                MenuRefDto.builder()
                        .id(ref.getId())
                        .bindAt(DateUtil.formatDate(ref.getBindAt()))
                        .createdAt(DateUtil.formatDate(ref.getBindAt()))
                        .createdBy(ref.getCreatedBy())
                        .creationSource(ref.getCreationSource())
                        .customerId(ref.getCustomerId())
                        .enterpriseId(ref.getEnterpriseId())
                        .isTop(ref.getIsTop())
                        .menuId(ref.getMenuId())
                        .build()
        ).collect(Collectors.toList());

    }

    @Override
    public BatchCreateMenuRefsResponseDto batchCreateMenuRefs(BatchCreateMenuRefsDto batchCreateMenuRefsDto) {
        final var response = menuServiceRpcClient.batchCreateClientCustomerMenuRefs(batchCreateMenuRefsDto);
        return BatchCreateMenuRefsResponseDto.builder()
                .ids(response.getIdsList())
                .isCreated(response.getIsCreated())
                .build();
    }

    @Override
    public List<Integer> queryMenuSkuIdsByStallId(int enterpriseId, int stallId) {
        final var menuIds = menuServiceRpcClient.queryPublishedMenusByStallId(LoginContextHolder.getEnterpriseId(), List.of(stallId)).getResponsesList().stream().map(SingleMenuRpcResponse::getId).collect(Collectors.toList());
        return menuServiceRpcClient.queryMenuDetailsByMenuIds(LoginContextHolder.getEnterpriseId(), menuIds).getResponsesList().stream().map(SingleMenuDetailRpcResponse::getSkuId).distinct().collect(Collectors.toList());
    }

    @Override
    public String queryClientLatestMealMenuRecord(SingleClientRpcResponse client) {
        final var singleMealMenuRecordRpcResponses = mealOrderServiceRpcClient.queryLatestMealMenuRecordsByClientIds(LoginContextHolder.getEnterpriseId(), List.of(client.getId()));
        return singleMealMenuRecordRpcResponses.isEmpty() ? "" : singleMealMenuRecordRpcResponses.get(0).getImageUrl();
    }


}