zhuyifan

feat(settlement): 添加分餐表空数据Excel生成功能

- 引入ZoneId用于获取今日起始时间戳- 过滤订单列表,仅保留今日及以后且支付状态为成功或取消的订单
- 在订单列表或详情为空时,返回空的分餐表Excel文件
- 新增createEmptyExcelBySeparateMeal方法用于生成空数据Excel
- 使用SeparateMealDataDto构建空数据并写入Excel输出流
......@@ -61,6 +61,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collections;
......@@ -1124,10 +1125,25 @@ public class SettlementServiceImpl implements SettlementService {
// 查询订单列表
final var queryClientCustomerOrdersByConditionRpcResponse = orderServiceRpcClient.queryClientCustomerOrdersByCondition(queryOrderDto);
final var orderList = queryClientCustomerOrdersByConditionRpcResponse.getResponsesList();
// 今天开始时间的时间戳(毫秒)
final long todayStartTimestamp = LocalDate.now().atStartOfDay()
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
final var orderList = queryClientCustomerOrdersByConditionRpcResponse.getResponsesList()
.stream()
.filter(e -> {
boolean payStatusMatch = e.getPayStatus() == PayStatusEnum.SUCCEED|| e.getPayStatus() == PayStatusEnum.PAY_CANCELED;
// 过滤时间:只查询今天和以后的订单
boolean timeMatch = e.getMealTime() >= todayStartTimestamp;
return payStatusMatch && timeMatch;
})
.toList();
if (orderList.isEmpty()) {
log.warn("未查询到订单数据,enterpriseId: {}", enterpriseId);
return null;
return createEmptyExcelBySeparateMeal();
}
// 获取订单IDs
......@@ -1145,7 +1161,7 @@ public class SettlementServiceImpl implements SettlementService {
final var orderDetailList = orderServiceRpcClient.getOrderDetailsByOrderIds(orderIds);
if (orderDetailList == null || orderDetailList.isEmpty()) {
log.warn("未查询到订单详情数据,orderIds: {}", orderIds);
return null;
return createEmptyExcelBySeparateMeal();
}
// 订单详情按订单ID分组
......@@ -1443,4 +1459,19 @@ public class SettlementServiceImpl implements SettlementService {
return outputStream;
}
/**
* 创建空的分餐表Excel(无数据)
*/
private static ByteArrayOutputStream createEmptyExcelBySeparateMeal() {
try {
SeparateMealDataDto emptyData = SeparateMealDataDto.builder()
.mealDetails(new ArrayList<>())
.build();
return writeToExcelBySeparateMeal(emptyData);
} catch (IOException e) {
log.error("创建空分餐表Excel失败", e);
throw BusinessException.build(ErrorCodeEnum.GENERATE_EXCEL_ERROR);
}
}
}
......