wangyingyang

fix

......@@ -67,14 +67,14 @@ public class ClientCustomerController {
@GetMapping("/clientCustomers/today/statistic")
@ResponseStatus(HttpStatus.OK)
public TodayOrderDto getClientCustomerTodayOrderStatistic(@RequestParam String customerToken) {
return clientCustomerService.getTodayOrderStatistic(customerToken, false);
return clientCustomerService.getTodayOrderStatistic(customerToken);
}
@ApiOperation(value = "获取his今日在住")
@GetMapping("/hisClientCustomers/today/statistic")
@ResponseStatus(HttpStatus.OK)
public TodayOrderDto getHisClientCustomerTodayOrderStatistic(@RequestParam String customerToken) {
return clientCustomerService.getTodayOrderStatistic(customerToken, true);
return clientCustomerService.getTodayOrderStatisticForHis(customerToken);
}
}
......
......@@ -15,6 +15,7 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse;
import com.infoloop.tianting.service.OrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import java.util.List;
import javax.validation.Valid;
import lombok.RequiredArgsConstructor;
......@@ -98,12 +99,12 @@ public class OrderController {
return orderService.batchUpdateOrderDetails(updateDto);
}
@ApiOperation(value = "检查是否预定过该餐单")
@ApiOperation(value = "获取已预定该餐单的次数")
@PostMapping("/order/check")
@ResponseStatus(HttpStatus.OK)
public Boolean checkOrder(
@Valid @RequestBody OrderDbDTO.CheckIfOrderedDto checkIfOrderedDto) {
return orderService.checkIfOrdered(checkIfOrderedDto);
public Integer checkOrder(
@Valid @RequestBody OrderDbDTO.getMenuOrderCountDto checkIfOrderedDto) {
return orderService.getMenuOrderCount(checkIfOrderedDto);
}
}
......
......@@ -26,6 +26,7 @@ public enum ErrorCodeEnum implements BaseEnum {
GENERATE_EXCEL_ERROR(406000004, "生成excel失败"),
ORDER_COUNT_LIMIT(406000005, "已超过该餐单预定次数"),
;
private final int code;
......
......@@ -575,7 +575,7 @@ public class OrderDbDTO {
@Builder
@ToString
@ApiModel(description = "检查是否已预定过某一餐单")
public static class CheckIfOrderedDto {
public static class getMenuOrderCountDto {
private Integer customerId;
private Integer menuId;
private LocalDateTime mealTime;
......
......@@ -2,6 +2,8 @@ package com.infoloop.tianting.model.dto;
import com.infoloop.tianting.enums.SettlementDimensionEnum;
import io.swagger.annotations.ApiModel;
import java.util.ArrayList;
import java.util.Map;
import lombok.Builder;
import lombok.Data;
......@@ -17,9 +19,14 @@ public class SettlementDTO {
@ApiModel(description = "SettlementRequestDto")
public static class SettlementRequestDto {
private int enterpriseId;
@Builder.Default
private int enterpriseId = 0;
private List<Integer> stallIds;
@Builder.Default
private List<Integer> stallIds = new ArrayList<>();
@Builder.Default
private int clientId = 0;
private SettlementDimensionEnum dimension;
......@@ -32,13 +39,23 @@ public class SettlementDTO {
@Builder
@ApiModel(description = "SettlementRequestDto")
public static class SettlementMenuSkuDto {
private String skuCode;
private String showName;
private Integer count;
private Integer price;
private Integer totalPrice;
}
@Data
@Builder
@ApiModel(description = "SettlementRequestDto")
public static class SettlementDataDto {
private String client;
private String startTime;
private String endTime;
private Map<String, Map<String, List<SettlementMenuSkuDto>>> classifyOrders;
}
}
......
......@@ -28,6 +28,8 @@ public interface ClientCustomerService {
BatchDeleteCustomerLabelRefResponseDto deleteClientCustomerLabelRefsByIds(
BatchDeleteCustomerLabelRefRequestDto deleteRequestDto);
TodayOrderDto getTodayOrderStatistic(String token, boolean isHis);
TodayOrderDto getTodayOrderStatistic(String token);
TodayOrderDto getTodayOrderStatisticForHis(String token);
}
......
......@@ -3,7 +3,7 @@ package com.infoloop.tianting.service;
import com.infoloop.tianting.model.common.OrderPageResult;
import com.infoloop.tianting.model.common.PageResult;
import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.CheckIfOrderedDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.OperatorCreateOrderDto;
......@@ -26,5 +26,5 @@ public interface OrderService {
CreateOrderResponse orderCreation(OperatorCreateOrderDto createOrderDto);
UpdateOrderResponse updateOrder(UpdateOrderDto updateOrderDto);
BatchUpdateOrderDetailResponse batchUpdateOrderDetails(OrderDetailBatchUpdateDto batchUpdateDto);
Boolean checkIfOrdered(CheckIfOrderedDto checkIfOrdered);
Integer getMenuOrderCount(getMenuOrderCountDto checkIfOrdered);
}
......
......@@ -77,7 +77,7 @@ public class OrderServiceRpcClient {
.setMealTimeEnd(queryOrderDto.getMealTimeEnd().toInstant(ZoneOffset.UTC).toEpochMilli())
.setShouldFilterCreatedAtStart(queryOrderDto.getShouldFilterCreatedAtTimeStart())
.setCreatedAtStart(queryOrderDto.getCreatedAtTimeStart().toInstant(ZoneOffset.UTC).toEpochMilli())
.setShouldFilterCreatedAtStart(queryOrderDto.getShouldFilterCreatedAtTimeEnd())
.setShouldFilterCreatedAtEnd(queryOrderDto.getShouldFilterCreatedAtTimeEnd())
.setCreatedAtEnd(queryOrderDto.getCreatedAtTimeEnd().toInstant(ZoneOffset.UTC).toEpochMilli())
.setShouldFilterClientIds(queryOrderDto.getShouldFilterClientIds())
.addAllClientIds(queryOrderDto.getClientIds())
......
......@@ -282,31 +282,16 @@ public class ClientCustomerServiceImpl implements ClientCustomerService {
// }
@Override
public TodayOrderDto getTodayOrderStatistic(String token, boolean isHis) {
public TodayOrderDto getTodayOrderStatistic(String token) {
List<CurrentClientCustomerDto> currentCustomers = new ArrayList<>();
List<Integer> customerIds = new ArrayList<>();
// 没有找到clientCustomer的hisCustomerIds
List<CurrentClientCustomerDto> notOrderedHisCustomers = new ArrayList<>();
if (isHis){
currentCustomers = clientCustomerServiceHttpClient.getCurrentClientCustomer(token, true);
final var hisCustomerIds = currentCustomers.stream().map(CurrentClientCustomerDto::getId).distinct()
.collect(Collectors.toList());
final var currentClientCustomers = clientCustomerServiceRpcClient.getClientCustomersByHISCustomerIds(hisCustomerIds).getResponsesList();
customerIds = currentClientCustomers.stream().map(SingleClientCustomerRpcResponse::getId).distinct().collect(Collectors.toList());
final var mappingHisCustomerIds = currentClientCustomers.stream().map(SingleClientCustomerRpcResponse::getHISCustomerId).collect(Collectors.toList());
// final var notOrderedHisCustomerIds = hisCustomerIds.stream().filter(i -> !mappingHisCustomerIds.contains(i)).collect(Collectors.toList());
notOrderedHisCustomers = currentCustomers.stream().filter(c -> !mappingHisCustomerIds.contains(c.getId())).collect(
Collectors.toList());
} else {
currentCustomers = clientCustomerServiceHttpClient.getCurrentClientCustomer(token, false);
currentCustomers = clientCustomerServiceHttpClient.getCurrentClientCustomer(token, false);
customerIds = currentCustomers.stream().map(CurrentClientCustomerDto::getId).map(id -> {try{
return Integer.valueOf(id);
} catch (NumberFormatException e) {
return null;
}
}).filter(Objects::nonNull).distinct().collect(Collectors.toList());
}
if (customerIds.isEmpty()) {
return TodayOrderDto.builder()
......@@ -400,8 +385,129 @@ public class ClientCustomerServiceImpl implements ClientCustomerService {
.build();
resNotOrderCustomers.add(resNotOrderCustomer);
}
if (isHis) {
for (CurrentClientCustomerDto currentClientCustomer: notOrderedHisCustomers) {
return TodayOrderDto.builder()
.totalCurrentCustomerCount(currentCustomers.size())
.notOrderCustomers(resNotOrderCustomers)
.build();
}
@Override
public TodayOrderDto getTodayOrderStatisticForHis(String token) {
List<CurrentClientCustomerDto> currentCustomers = new ArrayList<>();
List<Integer> customerIds = new ArrayList<>();
// 没有找到clientCustomer的hisCustomerIds
List<CurrentClientCustomerDto> notOrderedHisCustomers = new ArrayList<>();
currentCustomers = clientCustomerServiceHttpClient.getCurrentClientCustomer(token, true);
final var hisCustomerIds = currentCustomers.stream().map(CurrentClientCustomerDto::getId).distinct()
.collect(Collectors.toList());
final var currentClientCustomers = clientCustomerServiceRpcClient.getClientCustomersByHISCustomerIds(hisCustomerIds).getResponsesList();
customerIds = currentClientCustomers.stream().map(SingleClientCustomerRpcResponse::getId).distinct().collect(Collectors.toList());
final var mappingHisCustomerIds = currentClientCustomers.stream().map(SingleClientCustomerRpcResponse::getHISCustomerId).collect(Collectors.toList());
// final var notOrderedHisCustomerIds = hisCustomerIds.stream().filter(i -> !mappingHisCustomerIds.contains(i)).collect(Collectors.toList());
notOrderedHisCustomers = currentCustomers.stream().filter(c -> !mappingHisCustomerIds.contains(c.getId())).collect(
Collectors.toList());
if (customerIds.isEmpty()) {
return TodayOrderDto.builder()
.totalCurrentCustomerCount(0)
.notOrderCustomers(new ArrayList<>())
.build();
}
final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
LocalDate today = LocalDate.now();
LocalDateTime todayZero = today.atStartOfDay();
LocalDate tomorrow = today.plusDays(1);
LocalDateTime tomorrowZero = tomorrow.atStartOfDay();
final var queryOrderDto = QueryOrderByConditionDto.builder()
.enterpriseId(operatorLoginInfo.getEnterpriseId())
.shouldFilterCustomerIds(true)
.customerIds(customerIds)
.shouldFilterMealTimeStart(true)
.mealTimeStart(todayZero)
.shouldFilterMealTimeEnd(true)
.mealTimeEnd(tomorrowZero)
.build();
final var orderedResponseList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
List<Integer> uniqueOrderedCustomerIds = orderedResponseList.stream().map(
SingleClientCustomerOrderRpcResponse::getCustomerId).distinct()
.collect(Collectors.toList());
List<Integer> notOrderedCustomerIds = customerIds.stream().filter(id -> !uniqueOrderedCustomerIds.contains(id)).collect(
Collectors.toList());
// 根据customerIds 获取到menuRef列表
final var menuRefs = menuServiceRpcClient.getClientCustomerMenuRefsByCustomerIds(
operatorLoginInfo.getEnterpriseId(), notOrderedCustomerIds).getResponsesList();
final var menuIds = menuRefs.stream().map(SingleClientCustomerMenuRefRpcResponse::getMenuId)
.collect(Collectors.toList());
final var menus = menuServiceRpcClient.getMenusByIds(operatorLoginInfo.getEnterpriseId(),
menuIds).getResponsesList();
List<NotOrderCustomerDto> resNotOrderCustomers = new ArrayList<>();
// 在customers里找到未下单的用户
final var notOrderCustomers = currentClientCustomers.stream().filter(c ->
notOrderedCustomerIds.contains(c.getId())).collect(Collectors.toList());
for(SingleClientCustomerRpcResponse notOrderCustomer: notOrderCustomers) {
// 在ref里找到这个用户的menu ids
final var notOrderCustomerId = Integer.valueOf(notOrderCustomer.getId());
final var curMenuIds = menuRefs.stream().filter(r -> r.getCustomerId() == notOrderCustomerId)
.map(SingleClientCustomerMenuRefRpcResponse::getMenuId).collect(Collectors.toList());
// 根据menu ids找到 menus
final var curMenus = menus.stream().filter(m -> curMenuIds.contains(m.getId()))
.collect(Collectors.toList());
final var curMenuDtos = curMenus.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())
.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());
final var hisCustomer = currentCustomers.stream().filter(c -> c.getId().equals(notOrderCustomer.getHISCustomerId())).findFirst();
String roomNo = "";
if (hisCustomer.isPresent()) {
roomNo = hisCustomer.get().getRoomNo();
}
final var resNotOrderCustomer = NotOrderCustomerDto.builder()
.id(notOrderCustomerId.toString())
.name(notOrderCustomer.getName())
.roomNo(roomNo)
.menuList(curMenuDtos)
.build();
resNotOrderCustomers.add(resNotOrderCustomer);
}
for(CurrentClientCustomerDto currentClientCustomer: notOrderedHisCustomers) {
final var resNotOrderCustomer = NotOrderCustomerDto.builder()
.id(currentClientCustomer.getId())
.name(currentClientCustomer.getName())
......@@ -411,8 +517,6 @@ public class ClientCustomerServiceImpl implements ClientCustomerService {
resNotOrderCustomers.add(resNotOrderCustomer);
}
}
return TodayOrderDto.builder()
.totalCurrentCustomerCount(currentCustomers.size())
.notOrderCustomers(resNotOrderCustomers)
......
package com.infoloop.tianting.service.impl;
import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.ServeStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
......@@ -268,9 +269,9 @@ public class KdsServiceImpl implements KdsService {
if (meal.isPresent()) {
mealName = meal.get().getName();
}
final var serveStatusToFilter = List.of(ServeStatusEnum.SERVE_FINISHED, ServeStatusEnum.SERVE_NOT_START);
final var totalCount = orderDetailList.stream()
.filter(od -> od.getMealId() == mealId)
.filter(od -> od.getMealId() == mealId && serveStatusToFilter.contains(od.getServeStatus()))
.mapToInt(SingleClientCustomerOrderDetailRpcResponse::getCount)
.sum();
final var mealDetail = KdsMealDetailDto.builder()
......
package com.infoloop.tianting.service.impl;
import com.infoloop.rpc.meizhongyiheservice.MedicalAdviceTypeEnum;
import com.infoloop.tianting.SingleResponse;
import com.infoloop.tianting.SingleSpecialResponse;
import com.infoloop.tianting.clientcustomerorderservice.CloseTimeType;
......@@ -12,13 +13,18 @@ import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcRespon
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.deliveryruleservice.ClientLabelTypeEnum;
import com.infoloop.tianting.deliveryruleservice.SingleClientLabelRpcResponse;
import com.infoloop.tianting.exception.ClientEndExceptions;
import com.infoloop.tianting.exception.ErrorCodeEnum;
import com.infoloop.tianting.menuservice.CloseTimeTypeEnum;
import com.infoloop.tianting.menuservice.ModeOfPaymentEnum;
import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse;
import com.infoloop.tianting.model.common.OrderPageResult;
import com.infoloop.tianting.model.common.PageResult;
import com.infoloop.tianting.model.dto.ClientLabelDTO.HisAllergy;
import com.infoloop.tianting.model.dto.ClientLabelDTO.HisMedicalAdviceDto;
import com.infoloop.tianting.model.dto.ClientLabelDTO.QueryLabelsDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.BatchUpdateOrderDetailResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.CheckIfOrderedDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.getMenuOrderCountDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDetailDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.CreateOrderResponse;
......@@ -37,9 +43,11 @@ import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByPaginationDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderDto;
import com.infoloop.tianting.model.dto.OrderDbDTO.UpdateOrderResponse;
import com.infoloop.tianting.service.ClientCustomerService;
import com.infoloop.tianting.service.MeiZhongYiHeService;
import com.infoloop.tianting.service.OrderService;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import com.infoloop.tianting.service.client.DeliveryRuleServiceRpcClient;
import com.infoloop.tianting.service.client.MeiZhongYiHeServiceClient;
import com.infoloop.tianting.service.client.MenuServiceRpcClient;
import com.infoloop.tianting.service.client.OperatorServiceRpcClient;
import com.infoloop.tianting.service.client.OrderServiceRpcClient;
......@@ -52,6 +60,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -67,6 +76,7 @@ public class OrderServiceImpl implements OrderService {
private final MenuServiceRpcClient menuServiceRpcClient;
private final SkuServiceRpcClient skuServiceRpcClient;
private final DeliveryRuleServiceRpcClient deliveryRuleServiceRpcClient;
private final MeiZhongYiHeService meiZhongYiHeService;
@Override
public CreateOrderResponse createOrder(CreateOrderDto createOrderDto) {
......@@ -75,6 +85,12 @@ public class OrderServiceImpl implements OrderService {
@Override
public CreateOrderResponse orderCreation(OperatorCreateOrderDto operatorCreateOrderDto) {
final var getMenuOrderCountReq = getMenuOrderCountDto.builder()
.customerId(operatorCreateOrderDto.getCustomerId())
.mealTime(operatorCreateOrderDto.getMealTime())
.menuId(operatorCreateOrderDto.getMenuId())
.build();
final var menuOrderCount = this.getMenuOrderCount(getMenuOrderCountReq);
final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
final var operator = operatorServiceRpcClient.getCOperatorById(operatorLoginInfo.getId());
final var customer = clientCustomerServiceRpcClient.getClientCustomerById(operator.getEnterpriseId(), operatorCreateOrderDto.getCustomerId()).getResponse();
......@@ -94,6 +110,10 @@ public class OrderServiceImpl implements OrderService {
createOrderDto.setPayPrice(0);
final var menu = menuServiceRpcClient.getMenuById(operator.getEnterpriseId(),
createOrderDto.getMenuId()).getResponse();
final var placeOrderCount = menu.getOrderRuleJson().getPlaceOrderCount();
if (placeOrderCount != 0 && menuOrderCount >= placeOrderCount) {
throw ClientEndExceptions.OperationForbidden.build(ErrorCodeEnum.ORDER_COUNT_LIMIT.name());
}
createOrderDto.setCloseTimeType(
CloseTimeType.forNumber(menu.getOrderRuleJson().getCloseTimeType().getNumber()));
createOrderDto.setRoomNo(record.getRoomNo());
......@@ -120,11 +140,22 @@ public class OrderServiceImpl implements OrderService {
final var labels = deliveryRuleServiceRpcClient.GetClientLabelsByIds(customer.getEnterpriseId(), labelIds).getResponsesList();
final var avoids = labels.stream().filter(l -> l.getType() == ClientLabelTypeEnum.CLIENT_LABEL_TYPE_AVOID).map(
SingleClientLabelRpcResponse::getName).collect(Collectors.toList());
final var hisAllergies = meiZhongYiHeService.getHisCustomerAllergiesByCustomerId(customer.getHISCustomerId());
final var allergyCodes = hisAllergies.stream().map(HisAllergy::getAllergyCode).collect(Collectors.toList());
final var allLabels = deliveryRuleServiceRpcClient.getLabelsByTypes(QueryLabelsDto.builder()
.enterpriseId(operatorLoginInfo.getEnterpriseId())
.types(List.of(ClientLabelTypeEnum.CLIENT_LABEL_TYPE_AVOID, ClientLabelTypeEnum.CLIENT_LABEL_TYPE_DOCTOR, ClientLabelTypeEnum.CLIENT_LABEL_TYPE_ALLERGENS))
.build());
final var mappingAllergies = allLabels.getResponsesList().stream().filter(l -> allergyCodes.contains(l.getCode())).map(SingleClientLabelRpcResponse::getName).collect(Collectors.toList());
final var origionalHisDoctors = meiZhongYiHeService.getHisCustomerMedicalAdvicesByContractNo(record.getContractNo());
final var dietDoctors = origionalHisDoctors.stream().filter(d -> d.getMedicalAdviceType().equals(
MedicalAdviceTypeEnum.DIET)).map(HisMedicalAdviceDto::getConnotation).collect(Collectors.toList());
final var doctors = labels.stream().filter(l -> l.getType() == ClientLabelTypeEnum.CLIENT_LABEL_TYPE_DOCTOR).map(
SingleClientLabelRpcResponse::getName).collect(Collectors.toList());
final var customerNotice = CustomerNotice.builder()
.avoids(avoids)
.doctors(doctors)
.avoids(Stream.of(avoids, mappingAllergies).flatMap(List::stream).collect(Collectors.toList()))
.doctors(Stream.of(doctors, dietDoctors).flatMap(List::stream).collect(Collectors.toList()))
.build();
createOrderDto.setCustomerNoticeJson(customerNotice);
......@@ -207,7 +238,7 @@ public class OrderServiceImpl implements OrderService {
}
@Override
public Boolean checkIfOrdered(CheckIfOrderedDto checkIfOrdered) {
public Integer getMenuOrderCount(getMenuOrderCountDto checkIfOrdered) {
final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
final var mealTimeStart = checkIfOrdered.getMealTime().toLocalDate().atStartOfDay();
LocalDate tomorrow = checkIfOrdered.getMealTime().toLocalDate().plusDays(1);
......@@ -224,11 +255,7 @@ public class OrderServiceImpl implements OrderService {
.customerIds(List.of(checkIfOrdered.getCustomerId()))
.build();
final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
if (orderList.isEmpty()) {
return false;
} else {
return true;
}
return orderList.size();
}
@Override
......
package com.infoloop.tianting.service.impl;
import com.infoloop.tianting.clientcustomerorderservice.OrderStatusEnum;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
......@@ -7,13 +8,18 @@ import com.infoloop.tianting.exception.ClientEndExceptions.BusinessException;
import com.infoloop.tianting.exception.ErrorCodeEnum;
import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import com.infoloop.tianting.model.dto.SettlementDTO;
import com.infoloop.tianting.model.dto.SettlementDTO.SettlementDataDto;
import com.infoloop.tianting.model.dto.SettlementDTO.SettlementMenuSkuDto;
import com.infoloop.tianting.model.dto.SettlementDTO.SettlementRequestDto;
import com.infoloop.tianting.service.SettlementService;
import com.infoloop.tianting.service.client.InventoryServiceRpcClient;
import com.infoloop.tianting.service.client.MenuServiceRpcClient;
import com.infoloop.tianting.service.client.OperatorServiceRpcClient;
import com.infoloop.tianting.service.client.OrderServiceRpcClient;
import com.infoloop.tianting.service.client.SkuServiceRpcClient;
import com.infoloop.tianting.utils.DateUtil;
import java.util.Comparator;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
......@@ -40,23 +46,27 @@ public class SettlementServiceImpl implements SettlementService {
private final OrderServiceRpcClient orderServiceRpcClient;
private final MenuServiceRpcClient menuServiceRpcClient;
private final SkuServiceRpcClient skuServiceRpcClient;
private final InventoryServiceRpcClient inventoryServiceRpcClient;
@Override
public ByteArrayOutputStream generateOrderSettlementExcel(SettlementRequestDto settlementRequest) {
final var startDate = settlementRequest.getTimeStart().toLocalDate().atStartOfDay();
final var endDate = settlementRequest.getTimeEnd().toLocalDate().plusDays(1).atStartOfDay();
final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
final var queryOrderDto = QueryOrderByConditionDto.builder()
.enterpriseId(LoginContextHolder.hasLogin() ? operatorLoginInfo.getEnterpriseId() : settlementRequest.getEnterpriseId())
.shouldFilterCreatedAtTimeStart(true)
.createdAtTimeStart(settlementRequest.getTimeStart())
.createdAtTimeStart(startDate)
.shouldFilterCreatedAtTimeEnd(true)
.createdAtTimeEnd(settlementRequest.getTimeEnd())
.createdAtTimeEnd(endDate)
.shouldFilterStallIds(!settlementRequest.getStallIds().isEmpty())
.stallIds(settlementRequest.getStallIds())
.build();
final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
List<Integer> orderIds = orderList.stream().map(
SingleClientCustomerOrderRpcResponse::getId).distinct()
List<Integer> orderIds = orderList.stream()
.filter(o -> !o.getStatus().equals(OrderStatusEnum.ORDER_CANCELED))
.map(SingleClientCustomerOrderRpcResponse::getId).distinct()
.collect(Collectors.toList());
final var orderDetailList = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds);
List<Integer> skuIds = orderDetailList.stream()
......@@ -78,7 +88,8 @@ public class SettlementServiceImpl implements SettlementService {
//找出所有需要的日期
final var dates = orderList.stream()
.map(o -> DateUtil.formatDate(o.getCreatedAt(), DateUtil.YYYY_MM_DD))
.sorted(Comparator.comparingLong(SingleClientCustomerOrderRpcResponse::getCreatedAt))
.map(o -> DateUtil.formatDateOfUtc(o.getCreatedAt(), DateUtil.YYYY_MM_DD_UTC))
.distinct()
.collect(Collectors.toList());
for(String date: dates) {
......@@ -90,7 +101,7 @@ public class SettlementServiceImpl implements SettlementService {
// 找出当天所有的订单
final var curOrderList = orderList.stream()
.filter(o -> DateUtil.formatDate(o.getCreatedAt(), DateUtil.YYYY_MM_DD).equals(date))
.filter(o -> DateUtil.formatDateOfUtc(o.getCreatedAt(), DateUtil.YYYY_MM_DD_UTC).equals(date))
.collect(Collectors.toList());
final var curOrderIds = curOrderList.stream()
.map(SingleClientCustomerOrderRpcResponse::getId)
......@@ -142,7 +153,17 @@ public class SettlementServiceImpl implements SettlementService {
String skuCode = "";
if (curSku.isPresent()) {
skuCode = curSku.get().getCode();
final var existSku = menuSkuList.stream().filter(s -> s.getSkuCode().equals(curSku.get().getCode())).findFirst();
if (existSku.isPresent()) {
final var originalSku = existSku.get();
final var count = existSku.get().getCount();
final var newCount = count + countTotal;
originalSku.setCount(newCount);
originalSku.setTotalPrice(m.getPrice() * newCount);
continue;
}
}
final var settlementMenuSku = SettlementMenuSkuDto.builder()
.skuCode(skuCode)
.count(countTotal)
......@@ -157,9 +178,16 @@ public class SettlementServiceImpl implements SettlementService {
}
}
final var client = inventoryServiceRpcClient.getClientById(operatorLoginInfo.getEnterpriseId(),
settlementRequest.getClientId()).getClient();
final var settlementDataDto = SettlementDataDto.builder()
.classifyOrders(classifyOrders)
.client(client.getName())
.startTime(DateUtil.formatDate(settlementRequest.getTimeStart(), DateUtil.YYYY_MM_DD))
.endTime(DateUtil.formatDate(settlementRequest.getTimeEnd(), DateUtil.YYYY_MM_DD))
.build();
try {
final var bytes = writeToExcel(classifyOrders);
final var bytes = writeToExcel(settlementDataDto);
return bytes;
} catch (IOException e) {
throw BusinessException.build(ErrorCodeEnum.GENERATE_EXCEL_ERROR);
......@@ -167,12 +195,21 @@ public class SettlementServiceImpl implements SettlementService {
}
public static ByteArrayOutputStream writeToExcel(Map<String, Map<String, List<SettlementMenuSkuDto>>> classifyOrders)
public static ByteArrayOutputStream writeToExcel(SettlementDataDto settlementDataDto)
throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("订单数据");
final var classifyOrders = settlementDataDto.getClassifyOrders();
int rowNum = 0;
Row sheetTitleRow = sheet.createRow(rowNum++);
Cell sheetTitleCell = sheetTitleRow.createCell(0);
sheetTitleCell.setCellValue(settlementDataDto.getClient());
Row dateRangeRow = sheet.createRow(rowNum++);
Cell dateRangeCell = dateRangeRow.createCell(0);
final var dateRange = settlementDataDto.getStartTime() + "至" + settlementDataDto.getEndTime();
dateRangeCell.setCellValue(dateRange);
Row titleRow = sheet.createRow(rowNum++);
Cell dateTitleCell = titleRow.createCell(0);
dateTitleCell.setCellValue("点餐日期");
......
......@@ -32,7 +32,7 @@ public class SettlementController {
private final SettlementService settlementService;
@ApiIgnore
@ApiOperation(value = "结算账单生成excel")
@ApiOperation(value = "企业端结算账单生成excel")
@PostMapping("/enterprise/settlement/generate-excel")
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<byte[]> enterpriseSettlementGenerateExcel(@Valid @RequestBody SettlementRequestDto settlementRequestDto) {
......
......@@ -36,6 +36,8 @@ public final class DateUtil extends DateUtils {
public final static DateTimeFormatter YYYY_MM_DD = DateTimeFormatter
.ofPattern("yyyy-MM-dd")
.withZone(CHINA_ZONE);
public final static DateTimeFormatter YYYY_MM_DD_UTC = DateTimeFormatter
.ofPattern("yyyy-MM-dd");
public final static DateTimeFormatter YYYY_MM_DD_LEFT_SYMBOL = DateTimeFormatter
.ofPattern("yyyy/MM/dd")
.withZone(CHINA_ZONE);
......@@ -89,6 +91,14 @@ public final class DateUtil extends DateUtils {
.format(formatter);
}
public static String formatDateOfUtc(final long epochMillis, DateTimeFormatter formatter) {
if (epochMillis == 0L) {
return null;
}
return Instant.ofEpochMilli(epochMillis).atOffset(ZoneOffset.UTC)
.format(formatter);
}
public static String formatDate(final LocalDate localDate, DateTimeFormatter formatter) {
if (localDate == null) {
return null;
......