SettlementServiceImpl.java
5.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package com.infoloop.tianting.service.impl;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderDetailRpcResponse;
import com.infoloop.tianting.clientcustomerorderservice.SingleClientCustomerOrderRpcResponse;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.menuservice.SingleMenuDetailRpcResponse;
import com.infoloop.tianting.menuservice.SingleMenuRpcResponse;
import com.infoloop.tianting.model.dto.OrderDbDTO.QueryOrderByConditionDto;
import com.infoloop.tianting.model.dto.SettlementDTO.SettlementMenuSkuDto;
import com.infoloop.tianting.model.dto.SettlementDTO.SettlementRequestDto;
import com.infoloop.tianting.service.OrderService;
import com.infoloop.tianting.service.SettlementService;
import com.infoloop.tianting.service.client.MenuServiceRpcClient;
import com.infoloop.tianting.service.client.OrderServiceRpcClient;
import com.infoloop.tianting.utils.DateUtil;
import java.io.ByteArrayOutputStream;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 SettlementServiceImpl implements SettlementService {
private final OrderServiceRpcClient orderServiceRpcClient;
private final MenuServiceRpcClient menuServiceRpcClient;
@Override
public ByteArrayOutputStream generateOrderSettlementExcel(SettlementRequestDto settlementRequest) {
final var operatorLoginInfo = LoginContextHolder.getLoginInfo();
final var queryOrderDto = QueryOrderByConditionDto.builder()
.enterpriseId(operatorLoginInfo.getEnterpriseId())
.shouldFilterCreatedAtTimeStart(true)
.createdAtTimeStart(settlementRequest.getTimeStart())
.shouldFilterCreatedAtTimeEnd(true)
.createdAtTimeEnd(settlementRequest.getTimeEnd())
.build();
final var orderList = orderServiceRpcClient.getOrdersByCondition(queryOrderDto);
List<Integer> orderIds = orderList.stream().map(
SingleClientCustomerOrderRpcResponse::getId).distinct()
.collect(Collectors.toList());
final var orderDetailList = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds);
List<Integer> menuIds = orderList.stream().map(
SingleClientCustomerOrderRpcResponse::getMenuId).distinct()
.collect(Collectors.toList());
final var menuList = menuServiceRpcClient.getMenusByIds(operatorLoginInfo.getEnterpriseId(), menuIds);
final var menuDetailList = menuServiceRpcClient.queryMenuDetailsByMenuIds(
operatorLoginInfo.getEnterpriseId(), menuIds).getResponsesList();
Map<String, Map<Integer, List<SettlementMenuSkuDto>>> classifyOrders = new HashMap<>();
//找出所有需要的日期
final var dates = orderList.stream()
.map(o -> DateUtil.formatDate(o.getCreatedAt(), DateUtil.YYYY_MM_DD))
.collect(Collectors.toList());
for(String date: dates) {
if (!classifyOrders.containsKey(date)) {
classifyOrders.put(date, new HashMap<>());
}
final var menusMap = classifyOrders.get(date);
// 找出当天所有的订单
final var curOrderList = orderList.stream()
.filter(o -> DateUtil.formatDate(o.getCreatedAt(), DateUtil.YYYY_MM_DD).equals(date))
.collect(Collectors.toList());
final var curOrderIds = curOrderList.stream()
.map(SingleClientCustomerOrderRpcResponse::getId)
.collect(Collectors.toList());
// 找出当天已点的所有餐单
final var curMenuIds = curOrderList.stream()
.map(SingleClientCustomerOrderRpcResponse::getMenuId)
.collect(Collectors.toList());
for (Integer curMenuId: curMenuIds) {
if (!menusMap.containsKey(curMenuId)) {
menusMap.put(curMenuId, new ArrayList<>());
}
final var menuSkuList = new ArrayList<SettlementMenuSkuDto>();
// 找出当天餐单所有的菜品
final var curMenuDetails = menuDetailList.stream()
.filter(md -> md.getMenuId() == curMenuId)
.collect(Collectors.toList());
final var curMenuDetailIds = curMenuDetails.stream()
.map(SingleMenuDetailRpcResponse::getId)
.collect(Collectors.toList());
//找出当天所有已点的菜品明细
final var curOrderDetails = orderDetailList.stream()
.filter(d -> curOrderIds.contains(d.getOrderId()))
.collect(Collectors.toList());
for (SingleMenuDetailRpcResponse m: curMenuDetails) {
// 找出该餐单下该sku所点菜品的明细
final var curSkuOrderDetails = curOrderDetails.stream()
.filter(rd-> rd.getMenuDetailId() == m.getId())
.collect(Collectors.toList());
final var countList = curSkuOrderDetails.stream()
.map(SingleClientCustomerOrderDetailRpcResponse::getCount)
.collect(Collectors.toList());
int countTotal = countList.stream().mapToInt(Integer::intValue).sum();
final var settlementMenuSku = SettlementMenuSkuDto.builder()
.count(countTotal)
.showName(m.getShowName())
.price(m.getPrice())
.totalPrice(m.getPrice() * countTotal)
.build();
menuSkuList.add(settlementMenuSku);
}
menusMap.get(curMenuId).addAll(menuSkuList);
}
}
}
}