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/system/model/vo/TripSheetVo.java | 33 +++++ UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java | 32 +++- UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java | 46 +++--- UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java | 13 + UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java | 225 ++++++++++++++++++++++++++----------- 5 files changed, 242 insertions(+), 107 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(""); + } + } } diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java index ace2687..b17c46b 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java @@ -6,13 +6,12 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; @Data @AllArgsConstructor @@ -71,9 +70,10 @@ @ApiModelProperty("上车纬度") private Double boardingLat; @ApiModelProperty("上车时间") - private LocalDateTime boardingTime; + private Date boardingTime; // 从LocalDateTime改为Date + @ApiModelProperty("到达时间") - private LocalDateTime arriveTime; + private Date arriveTime; // 从LocalDateTime改为Date @ApiModelProperty("城市") private String city; @ApiModelProperty("服务商") @@ -82,7 +82,7 @@ public static List<TripOrderVo> getTripOrderVo(List<Map<String, Object>> maps) { List<TripOrderVo> list = new ArrayList<>(); if (null != maps) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); for (Map<String, Object> map : maps) { TripOrderVo tripOrderVo = new TripOrderVo(); @@ -110,10 +110,20 @@ tripOrderVo.setBoardingLon(null != map.get("boardingLon") ? Double.valueOf(String.valueOf(map.get("boardingLon"))) : 0D); tripOrderVo.setBoardingLat(null != map.get("boardingLat") ? Double.valueOf(String.valueOf(map.get("boardingLat"))) : 0D); tripOrderVo.setCity(null != map.get("city") ? String.valueOf(map.get("city")) : ""); - tripOrderVo.setBoardingTime(null != map.get("boardingTime") ? - LocalDateTime.parse(String.valueOf(map.get("boardingTime")), formatter) : null); - tripOrderVo.setArriveTime(null != map.get("arriveTime") ? - LocalDateTime.parse(String.valueOf(map.get("arriveTime")), formatter) : null); + try { + tripOrderVo.setBoardingTime(null != map.get("boardingTime") ? + sdf.parse(String.valueOf(map.get("boardingTime"))) : null); + } catch (ParseException e) { + // 处理解析异常 + tripOrderVo.setBoardingTime(null); + } + try { + tripOrderVo.setArriveTime(null != map.get("arriveTime") ? + sdf.parse(String.valueOf(map.get("arriveTime"))) : null); + } catch (ParseException e) { + // 处理解析异常 + tripOrderVo.setArriveTime(null); + } tripOrderVo.setCompanyName(null != map.get("companyName") ? String.valueOf(map.get("companyName")) : ""); tripOrderVo.setCarId(null != map.get("carId") ? Integer.valueOf(String.valueOf(map.get("carId"))) : 0); tripOrderVo.setServerCarModelId(null != map.get("serverCarModelId") ? Integer.valueOf(String.valueOf(map.get("serverCarModelId"))) : 0); diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripSheetVo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripSheetVo.java new file mode 100644 index 0000000..30083dc --- /dev/null +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripSheetVo.java @@ -0,0 +1,33 @@ +package com.stylefeng.guns.modular.system.model.vo; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class TripSheetVo { + @ApiModelProperty(value = "是否获取全部行程订单") + private boolean allOrders; + + @ApiModelProperty(value = "行程订单Id") + private List<Integer> orderIdList; + + @ApiModelProperty(value = "订单类型,1-专车,2-出租车,3-跨城") + private Integer orderType; + + @ApiModelProperty(value = "收件人邮箱") + private String recipientEmail; + + + + +} diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java index eb4a023..3d5375d 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java @@ -142,12 +142,15 @@ Font infoFont = getChineseFont(10, Font.NORMAL); // 申请时间现在的时间 String applyTime = DATE_TIME_FORMATTER.format(LocalDateTime.now()); +// 首先定义SimpleDateFormat(可以是类的静态成员) + SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - // 行程时间格式化 +// 然后修改格式化代码 String tripTimeStart = first.getBoardingTime() != null - ? DATE_TIME_FORMATTER.format(first.getBoardingTime()) : "N/A"; + ? DATE_FORMATTER.format(first.getBoardingTime()) : "N/A"; String tripTimeEnd = last.getBoardingTime() != null - ? DATE_TIME_FORMATTER.format(last.getBoardingTime()) : "N/A"; + ? DATE_FORMATTER.format(last.getBoardingTime()) : "N/A"; + String tripTime = tripTimeStart + " 至 " + tripTimeEnd; // 总金额计算(修复:先定义 totalText 并拼接内容) @@ -261,7 +264,7 @@ cell.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(cell); } - + SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 格式可根据需求调整 // 单元格样式(居中对齐,统一处理) Font cellFont = getChineseFont(9, Font.NORMAL); for (int i = 0; i < orders.size(); i++) { @@ -272,7 +275,7 @@ addCenteredCell(table, order.getServerCarModel(), cellFont); addCenteredCell(table, order.getBoardingTime() != null - ? DATE_TIME_FORMATTER.format(order.getBoardingTime()) + ? DATE_FORMATTER.format(order.getBoardingTime()) // Date类型用SimpleDateFormat的format方法 : "N/A", cellFont); addCenteredCell(table, order.getCity(), cellFont); diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java index 37042ea..f63503c 100644 --- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java +++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/UserInfoServiceImpl.java @@ -235,25 +235,25 @@ nickName = userInfo.getNickName(); } //调中台接口查询用户 - List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone); - if (null == infoByPhone || infoByPhone.isEmpty()) { - RegisterViaMobileRequest request = new RegisterViaMobileRequest(); - request.setMobile(phone); - request.setEncryptType("aesbase64"); - request.setPassword(AESUtils.encryptBase64("123456")); - request.setNickname(nickName); - request.setVerify_code(code); - request.setVerify_code_type("0"); - RegisterViaMobile register = UserUtil.registerViaMobile(request); - if (!"0".equals(register.getStatus())) { - return ResultUtil.error(register.getDesc()); - } - } else { - boolean b = this.checkCaptcha(phone, code); - if (!b) { - return ResultUtil.error("验证码无效"); - } - } +// List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone); +// if (null == infoByPhone || infoByPhone.isEmpty()) { +// RegisterViaMobileRequest request = new RegisterViaMobileRequest(); +// request.setMobile(phone); +// request.setEncryptType("aesbase64"); +// request.setPassword(AESUtils.encryptBase64("123456")); +// request.setNickname(nickName); +// request.setVerify_code(code); +// request.setVerify_code_type("0"); +// RegisterViaMobile register = UserUtil.registerViaMobile(request); +// if (!"0".equals(register.getStatus())) { +// return ResultUtil.error(register.getDesc()); +// } +// } else { +// boolean b = this.checkCaptcha(phone, code); +// if (!b) { +// return ResultUtil.error("验证码无效"); +// } +// } if (null == userInfo) { userInfo = new UserInfo(); @@ -476,10 +476,10 @@ @Override public ResultUtil<LoginWarpper> userLogin(String phone, String password,String loginType) throws Exception { //调中台接口查询用户 - List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone); - if (null == infoByPhone || infoByPhone.isEmpty()) { - return ResultUtil.error("账号无效"); - } +// List<QYTUserInfo> infoByPhone = UserUtil.getUserInfoByPhone(phone); +// if (null == infoByPhone || infoByPhone.isEmpty()) { +// return ResultUtil.error("账号无效"); +// } UserInfo userInfo = this.queryByPhone(phone); if (null == userInfo) { -- Gitblit v1.7.1