Browse Source

优化游客导出接口

jinch 2 weeks atrás
parent
commit
ccf7d0a0bc

+ 46 - 4
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/OtcTradeOrderController.java

@@ -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();
+        }
+    }
     }
 }

+ 1 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderMapper.java

@@ -201,6 +201,7 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
     /**
      * 查询游客名单导出表头信息
      */
+    @TenantIgnore
     Map<String, Object> selectTouristExportHead(@Param("vo") TradeOrderPageReqVO reqVO);
 
     /**