|
|
@@ -278,64 +278,89 @@ public class OtcTradeOrderController {
|
|
|
@Operation(summary = "win-平台订单列表[分页]", description = "根据条件查询订单列表")
|
|
|
@PlatTenantEnv
|
|
|
public CommonResult<PageResult<TradeOrderRespNewVO>> getTradeOrderPage(@Valid @RequestBody TradeOrderPageReqVO pageReqVO) {
|
|
|
+ // 1. 查询订单分页数据并转换为新的VO对象
|
|
|
PageResult<TradeOrderRespVO> platOrderPage = tradeOrderService.getPlatOrderPage(pageReqVO);
|
|
|
PageResult<TradeOrderRespNewVO> page = BeanUtils.toBean(platOrderPage, TradeOrderRespNewVO.class);
|
|
|
List<TradeOrderRespNewVO> list = page.getList();
|
|
|
+
|
|
|
//处理游轮名称
|
|
|
+ // 2. 批量查询游轮信息:提取所有订单的游轮ID,通过API批量查询游轮详情,构建游轮ID到游轮信息的映射
|
|
|
List<Long> shipIds = CollectionUtils.convertList(list, TradeOrderRespNewVO::getShipId);
|
|
|
Map<Long, ShipRespDTO> shipMap = shipApi.queryShip(shipIds);
|
|
|
|
|
|
//国籍数据
|
|
|
+ // 3. 批量查询订单关联数据:提取所有订单ID
|
|
|
List<Long> orderIds = CollectionUtils.convertList(list, TradeOrderRespNewVO::getId);
|
|
|
+ // 3.1 查询订单国籍信息列表
|
|
|
List<TradeOrderCountryDO> countryList = tradeOrderCountryService.getListByOrderIds(orderIds);
|
|
|
+ // 3.2 查询订单房型信息列表
|
|
|
List<TradeOrderRoomModelDO> roomModelList = tradeOrderRoomModelService.getListByOrderIds(orderIds);
|
|
|
+ // 3.3 将DO对象转换为VO对象
|
|
|
List<TradeOrderCountryBaseVO> countRespVOList = BeanUtils.toBean(countryList, TradeOrderCountryBaseVO.class);
|
|
|
List<TradeOrderRoomModelVO> roomModeVOList = BeanUtils.toBean(roomModelList, TradeOrderRoomModelVO.class);
|
|
|
+ // 3.4 填充国籍名称:根据国籍ID转换为国籍名称字符串
|
|
|
countRespVOList.forEach(item -> {
|
|
|
if (item.getCountryId() != null) {
|
|
|
item.setCountryName(AreaUtils.format2Str(item.getCountryId()));
|
|
|
}
|
|
|
});
|
|
|
+ // 3.5 构建订单ID到国籍列表的映射(一个订单可能有多个国籍)
|
|
|
Map<Long, List<TradeOrderCountryBaseVO>> countryMap = CollectionUtils.convertMultiMap(countRespVOList, TradeOrderCountryBaseVO::getOrderId);
|
|
|
+ // 3.6 构建订单ID到房型列表的映射(一个订单可能有多个房型)
|
|
|
Map<Long, List<TradeOrderRoomModelVO>> roomModelMap = CollectionUtils.convertMultiMap(roomModeVOList, TradeOrderRoomModelVO::getOrderId);
|
|
|
|
|
|
//订单汇总数据
|
|
|
+ // 4. 批量查询订单汇总统计数据:包含成人、儿童、婴儿数量等统计信息
|
|
|
List<TradeOrderTotalDO> tradeOrderTotalDOList = tradeOrderTotalService.getByOrderIds(orderIds);
|
|
|
List<TradeOrderTotalVO> tradeOrderTotalVOList = BeanUtils.toBean(tradeOrderTotalDOList, TradeOrderTotalVO.class);
|
|
|
+ // 4.1 构建旧订单ID到汇总数据的映射
|
|
|
Map<Long, TradeOrderTotalVO> orderTotalVoMap = CollectionUtils.convertMap(tradeOrderTotalVOList, TradeOrderTotalVO::getOldOrderId);
|
|
|
|
|
|
//航次信息
|
|
|
+ // 5. 批量查询航次信息:提取所有订单的航次ID,查询航次详情并构建映射
|
|
|
List<Long> voyageIds = CollectionUtils.convertList(list, TradeOrderRespNewVO::getVoyageId);
|
|
|
List<VoyageDO> voyageList = voyageService.getList(voyageIds);
|
|
|
List<VoyageRespVO> voyageRespVOList = BeanUtils.toBean(voyageList, VoyageRespVO.class);
|
|
|
Map<Long, VoyageRespVO> voyageRespVoMap = CollectionUtils.convertMap(voyageRespVOList, VoyageRespVO::getId);
|
|
|
|
|
|
// 拼房数量
|
|
|
+ // 6. 批量查询拼房统计数据:查询每个订单的拼房人数和性别统计
|
|
|
List<OrderShareVO> orderShareVOS = tradeOrderRoomModelService.getOrderShareStatsByOrderIds(orderIds);
|
|
|
Map<Long, List<OrderShareVO>> orderShareMap = CollectionUtils.convertMultiMap(orderShareVOS, OrderShareVO::getOrderId);
|
|
|
|
|
|
+ // 7. 组装订单详细信息:遍历订单列表,将各类关联数据填充到订单对象中
|
|
|
if (!list.isEmpty()) {
|
|
|
list.forEach(item -> {
|
|
|
+ // 7.1 填充游轮名称
|
|
|
MapUtils.findAndThen(shipMap, item.getShipId(), ship -> item.setShipName(ship.getName()));
|
|
|
+ // 7.2 填充国籍列表
|
|
|
MapUtils.findAndThen(countryMap, item.getId(), item::setCountryList);
|
|
|
+ // 7.3 填充房型列表
|
|
|
MapUtils.findAndThen(roomModelMap, item.getId(), item::setRoomModelList);
|
|
|
+ // 7.4 填充订单汇总数据和人员统计描述(格式:X大Y小)
|
|
|
MapUtils.findAndThen(orderTotalVoMap, item.getId(), totalVO -> {
|
|
|
item.setSummary(totalVO);
|
|
|
item.setPersonStat(totalVO.getAdultTotalNum() + "大" + (totalVO.getChildTotalNum() + totalVO.getBabyTotalNum()) + "小");
|
|
|
});
|
|
|
+ // 7.5 填充航次信息
|
|
|
MapUtils.findAndThen(voyageRespVoMap, item.getVoyageId(), item::setVoyage);
|
|
|
+ // 7.6 计算订单总人数:根据游客列表大小设置
|
|
|
if (item.getVisitors() != null && !item.getVisitors().isEmpty()) {
|
|
|
item.setTotalPerson(item.getVisitors().size());
|
|
|
} else {
|
|
|
item.setTotalPerson(0);
|
|
|
}
|
|
|
|
|
|
+ // 7.7 生成房型详情描述:按"房型名称(楼层F)"分组统计数量,格式:数量*房型名称(楼层F)
|
|
|
if(item.getRoomModelList()!=null && !item.getRoomModelList().isEmpty()) {
|
|
|
+ // 按房型名称和楼层分组
|
|
|
Map<String, List<TradeOrderRoomModelVO>> roomDesc = item.getRoomModelList().stream().collect(Collectors.groupingBy(p -> p.getRoomModelName() + "(" + p.getFloor() + "F)"));
|
|
|
AtomicReference<String> roomDescStr = new AtomicReference<>("");
|
|
|
+ // 拼接房型描述字符串
|
|
|
roomDesc.forEach((key, value) -> roomDescStr.set(roomDescStr.get() + " " + value.size() + "*" + key));
|
|
|
item.setRoomModelDetails(roomDescStr.get().trim());
|
|
|
}
|
|
|
+ // 7.8 生成拼房描述:拼接拼房人数和性别信息
|
|
|
MapUtils.findAndThen(orderShareMap, item.getId(), orderShareList -> {
|
|
|
String shareDesc = orderShareList.stream().map(orderShare -> orderShare.getNum() + "" + orderShare.getGender()).collect(Collectors.joining());
|
|
|
item.setShareDesc(shareDesc);
|
|
|
@@ -653,10 +678,18 @@ public class OtcTradeOrderController {
|
|
|
@PreAuthorize("@ss.hasPermission('trade:order:export-operator')")
|
|
|
public void exportTouristList(@Valid TradeOrderPageReqVO pageReqVO, HttpServletResponse response) throws IOException {
|
|
|
File tempFile = otcTradeOrderService.exportTouristList(pageReqVO);
|
|
|
+ try {
|
|
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
|
response.setHeader("Content-Disposition", "attachment; filename=" + tempFile.getName());
|
|
|
- InputStream is = Files.newInputStream(tempFile.toPath());
|
|
|
- IOUtils.copy(is, response.getOutputStream());
|
|
|
+ try (InputStream is = Files.newInputStream(tempFile.toPath())) {
|
|
|
+ IOUtils.copy(is, response.getOutputStream());
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ // 确保临时文件被删除
|
|
|
+ if (tempFile != null && tempFile.exists()) {
|
|
|
+ tempFile.delete();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -669,9 +702,18 @@ public class OtcTradeOrderController {
|
|
|
@PreAuthorize("@ss.hasPermission('trade:order:export-agent')")
|
|
|
public void exportTouristListToAgent(@Valid TradeOrderPageReqVO pageReqVO, HttpServletResponse response) throws IOException {
|
|
|
File tempFile = otcTradeOrderService.exportTouristListToAgent(pageReqVO);
|
|
|
+ try {
|
|
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
|
response.setHeader("Content-Disposition", "attachment; filename=" + tempFile.getName());
|
|
|
- InputStream is = Files.newInputStream(tempFile.toPath());
|
|
|
- IOUtils.copy(is, response.getOutputStream());
|
|
|
+ // 使用 try-with-resources 自动关闭流
|
|
|
+ try (InputStream is = Files.newInputStream(tempFile.toPath())) {
|
|
|
+ IOUtils.copy(is, response.getOutputStream());
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ // 确保临时文件被删除
|
|
|
+ if (tempFile != null && tempFile.exists()) {
|
|
|
+ tempFile.delete();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|