From 72e086578b8c5d9dccdb51f8840f72f38addc744 Mon Sep 17 00:00:00 2001 From: guyue <1721849008@qq.com> Date: 星期四, 31 七月 2025 21:25:51 +0800 Subject: [PATCH] 发送行程单接口修改 --- UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java | 225 +++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 157 insertions(+), 68 deletions(-) diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java index a6f588b..85f4e01 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java @@ -17,6 +17,7 @@ import com.stylefeng.guns.modular.system.dao.SystemPriceMapper; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.model.vo.TripOrderVo; +import com.stylefeng.guns.modular.system.model.vo.TripSheetVo; import com.stylefeng.guns.modular.system.model.vo.UnPayOrderVO; import com.stylefeng.guns.modular.system.pdf.TripSheetGenerator; import com.stylefeng.guns.modular.system.service.*; @@ -34,6 +35,9 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; @@ -45,6 +49,7 @@ import java.io.File; import java.io.PrintWriter; import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; import java.text.SimpleDateFormat; import java.util.*; @@ -2203,64 +2208,10 @@ if(null == uid){ return ResultUtil.tokenErr(); } -// List<Map<String, Object>> list = null; -// switch (type){ -// case 1: -// list = orderPrivateCarService.queryMyTripList(uid, pageNum, size); -// break; -// case 2: -// list = orderTaxiService.queryMyTripList(uid, pageNum, size); -// break; -// case 3: -// list = orderCrossCityService.queryMyTripList(uid, pageNum, size); -// break; -// -// } -// -// // 将经纬度转换为城市并设置到数据中 -// if (list != null && !list.isEmpty()) { -// for (Map<String, Object> orderMap : list) { -// // 获取经纬度(根据实际字段名调整) -// Object lonObj = orderMap.get("boardingLon"); -// Object latObj = orderMap.get("boardingLat"); -// //获取公司id -// Object companyId = orderMap.get("companyId"); -// -// Object serverCarModelId =null; -// ServerCarModel serverCarModel = null; -// if (type == 1 || type == 3){ -// //获取车型id -// serverCarModelId = orderMap.get("serverCarModelId"); -// serverCarModel = serverCarModelService.selectById((Serializable) serverCarModelId); -// } -// -// if (lonObj != null && latObj != null) { -// String lon = lonObj.toString(); -// String lat = latObj.toString(); -// Company company = companyService.selectById((Serializable) companyId); -// -// try { -// // 调用逆地理编码接口获取城市信息 -// Map<String, String> geoInfo = gdMapGeocodingUtil.geocode(lon, lat); -// // 将城市信息存入map,供后续转换VO使用 -// orderMap.put("city", geoInfo.getOrDefault("city", "")); -// orderMap.put("companyName", company.getName()); -// if (serverCarModel != null) { -// orderMap.put("serverCarModel", serverCarModel.getName()); -// } -// } catch (Exception e) { -// // 记录转换失败日志,不中断流程 -// System.err.println("经纬度转城市失败: " + lon + "," + lat + ",错误: " + e.getMessage()); -// orderMap.put("city", ""); // 转换失败时设为空 -// } -// } else { -// orderMap.put("city", ""); // 经纬度为空时设为空 -// } -// } -// } + List<Map<String,Object>> raw = fetchTrips(uid, type, pageNum, size); return ResultUtil.success(TripOrderVo.getTripOrderVo(raw)); -// return ResultUtil.success(TripOrderVo.getTripOrderVo(list)); + }catch (Exception e){ e.printStackTrace(); return ResultUtil.runErr(); @@ -2349,13 +2300,10 @@ @PostMapping("/api/user/sendTripSheetEmail") @ApiOperation(value = "发送行程单邮件", tags = {"用户端-个人中心"}, notes = "") @ApiImplicitParams({ - @ApiImplicitParam(value = "订单列表", name = "orders", required = false, dataType = "List<OrderWarpper>"), - @ApiImplicitParam(value = "收件人邮箱", name = "recipientEmail", required = false, dataType = "String"), + @ApiImplicitParam(value = "行程单信息", name = "tripSheet", required = false, dataType = "com.stylefeng.guns.modular.system.model.vo.TripSheetVo"), @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....") }) - public ResultUtil sendTripSheetEmail( @RequestParam boolean allOrders, - @RequestBody(required = false) List<TripOrderVo> orders, - @RequestParam String recipientEmail, + public ResultUtil sendTripSheetEmail(@RequestBody TripSheetVo tripSheet, HttpServletRequest request) { try { // 从Redis中获取当前用户ID @@ -2363,19 +2311,23 @@ if (null == uid) { return ResultUtil.tokenErr(); } - if (allOrders) { + List<TripOrderVo> orderList = new ArrayList<>(); + if (tripSheet.isAllOrders()) { // 这里复用 queryMyTripList 逻辑,不分页,type=0 表示全部 List<Map<String, Object>> rawList = fetchTrips(uid, 0, null, null); - orders = TripOrderVo.getTripOrderVo(rawList); + orderList = TripOrderVo.getTripOrderVo(rawList); } else { - // allOrders=false,需要前端传 orders - if (orders == null || orders.isEmpty()) { - return ResultUtil.error("请传入 orders 或者选择全部订单"); + // 指定订单ID集合:验证并查询订单 + if (tripSheet.getOrderIdList() == null || tripSheet.getOrderIdList().isEmpty()) { + return ResultUtil.error("请传入订单ID集合或者选择全部订单"); } + // 根据订单类型和ID查询订单 + orderList = queryOrdersByTypeAndIds(uid, tripSheet.getOrderType(), tripSheet.getOrderIdList()); } - String filePath = tripSheetGenerator.generatePdf(orders); + List<TripOrderVo> tripOrderVos = processTripOrderVos(orderList); + String filePath = tripSheetGenerator.generatePdf(tripOrderVos); File attachment = new File(filePath); - emailUtil.sendEmailWithAttachment(recipientEmail, "行程单", "请查收您的行程单", attachment); + emailUtil.sendEmailWithAttachment(tripSheet.getRecipientEmail(), "行程单", "请查收您的行程单", attachment); attachment.delete(); // 发送成功后删除临时文件 return ResultUtil.success("邮件发送成功"); } catch (Exception e) { @@ -2383,5 +2335,142 @@ return ResultUtil.error("邮件发送失败"); } } + /** + * 根据订单类型和ID集合查询订单 + */ + private List<TripOrderVo> queryOrdersByTypeAndIds(Integer userId, Integer orderType, List<Integer> orderIds) throws InvocationTargetException, IllegalAccessException { + List<TripOrderVo> orderList = new ArrayList<>(); + + // 根据订单类型查询对应表的订单 + switch (orderType) { + case 1: + EntityWrapper<OrderPrivateCar> wrapper = new EntityWrapper<>(); + wrapper.in("id", orderIds); + List<OrderPrivateCar> orderPrivateCars = orderPrivateCarService.selectList(wrapper); + for (OrderPrivateCar orderPrivateCar : orderPrivateCars) { + TripOrderVo vo = new TripOrderVo(); + BeanUtils.copyProperties(orderPrivateCar, vo); + orderList.add(vo); + } + break; + case 2: + EntityWrapper<OrderTaxi> wrapper2 = new EntityWrapper<>(); + wrapper2.in("id", orderIds); + List<OrderTaxi> orderTaxis = orderTaxiService.selectList(wrapper2); + for (OrderTaxi orderTaxi : orderTaxis) { + TripOrderVo vo = new TripOrderVo(); + BeanUtils.copyProperties(orderTaxi, vo); + orderList.add(vo); + } + break; + case 3: + EntityWrapper<OrderCrossCity> wrapper3 = new EntityWrapper<>(); + wrapper3.in("id", orderIds); + List<OrderCrossCity> orderCrossCities = orderCrossCityService.selectList(wrapper3); + for (OrderCrossCity orderCrossCity : orderCrossCities) { + TripOrderVo vo = new TripOrderVo(); + BeanUtils.copyProperties(orderCrossCity, vo); + orderList.add(vo); + } + break; + default: + throw new IllegalArgumentException("无效的订单类型:" + orderType); + } + orderList.sort((a, b) -> { + Date da = a.getBoardingTime(); + Date db = b.getBoardingTime(); + if (da == null && db == null) return 0; + if (da == null) return 1; // a 在后面 + if (db == null) return -1; // b 在后面 + return db.compareTo(da); // 都不为空,再按时间倒序 + }); + + + return orderList; + } + + /** + * 处理行程订单VO列表,补充经纬度、公司和车型信息 + */ + private List<TripOrderVo> processTripOrderVos(List<TripOrderVo> orderVoList) { + if (orderVoList == null || orderVoList.isEmpty()) { + return new ArrayList<>(); + } + + for (TripOrderVo orderVo : orderVoList) { + // 处理经纬度转城市信息 + handleGeoInfoForVo(orderVo); + + // 处理公司信息 + handleCompanyInfoForVo(orderVo); + + // 处理车型信息 + handleCarModelInfoForVo(orderVo); + } + + return orderVoList; + } + + /** + * 处理经纬度转城市信息 + */ + private void handleGeoInfoForVo(TripOrderVo orderVo) { + // 直接从VO获取经纬度(假设VO中有对应的getter方法) + String lon = String.valueOf(orderVo.getBoardingLon()); + String lat = String.valueOf(orderVo.getBoardingLat()); + + if (StringUtils.isEmpty(lon) || StringUtils.isEmpty(lat)) { + orderVo.setCity(""); + return; + } + + try { + // 调用逆地理编码接口获取城市信息 + Map<String, String> geoInfo = gdMapGeocodingUtil.geocode(lon, lat); + orderVo.setCity(geoInfo.getOrDefault("city", "")); + } catch (Exception e) { + // 记录转换失败日志,不中断流程 + System.err.println("经纬度转城市失败: " + lon + "," + lat + ",错误: " + e.getMessage()); + orderVo.setCity(""); + } + } + + /** + * 处理公司信息 + */ + private void handleCompanyInfoForVo(TripOrderVo orderVo) { + // 从VO获取公司ID + Integer companyId = orderVo.getCompanyId(); + if (companyId == null) { + orderVo.setCompanyName(""); + return; + } + + Company company = companyService.selectById(companyId); + if (company != null) { + orderVo.setCompanyName(company.getName()); + } else { + orderVo.setCompanyName(""); + } + } + + /** + * 处理车型信息 + */ + private void handleCarModelInfoForVo(TripOrderVo orderVo) { + // 从VO获取车型ID + Integer serverCarModelId = orderVo.getServerCarModelId(); + if (serverCarModelId == null) { + orderVo.setServerCarModel(""); + return; + } + + ServerCarModel serverCarModel = serverCarModelService.selectById(serverCarModelId); + if (serverCarModel != null) { + orderVo.setServerCarModel(serverCarModel.getName()); + } else { + orderVo.setServerCarModel(""); + } + } } -- Gitblit v1.7.1