From d8f0615909cedc1446da7c06b2ab7599abe07c9d Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期二, 05 八月 2025 18:39:09 +0800
Subject: [PATCH] 修改bug

---
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java |  398 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 384 insertions(+), 14 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 7878a7d..cc777a1 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
@@ -13,12 +13,19 @@
 import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
 import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
 import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.dao.CarMapper;
 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.*;
 import com.stylefeng.guns.modular.system.util.*;
+import com.stylefeng.guns.modular.system.util.qianyuntong.OrderUtil;
+import com.stylefeng.guns.modular.system.util.qianyuntong.model.ModifyTravelItineraryRequest;
 import com.stylefeng.guns.modular.system.util.qianyuntong.model.QYTPaymentCallback;
+import com.stylefeng.guns.modular.system.util.qianyuntong.model.QYTPaymentCallbackData;
 import com.stylefeng.guns.modular.system.warpper.*;
 import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
 import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
@@ -31,6 +38,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;
@@ -39,8 +49,13 @@
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
 import java.io.PrintWriter;
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 /**
@@ -138,7 +153,20 @@
 	
 	@Resource
 	private ISystemPriceCityService systemPriceCityService;
-	
+    
+    @Value("${trip.sheet.filePath}")
+    private  String filePath;
+    @Autowired
+    private EmailUtil emailUtil;
+    @Autowired
+    private  TripSheetGenerator tripSheetGenerator;
+    @Autowired
+    private IServerCarModelService serverCarModelService;
+    
+    
+    
+    
+    
 	
 	/**
 	 * 获取正在进行中的订单
@@ -534,8 +562,8 @@
 						return ResultUtil.error("请先配置价格规则");
 					}
 					Map<String, Object> query1 = systemPriceMapper.query(orderPrivateCar.getCompanyId(), 1, orderPrivateCar.getServerCarModelId(), systemPriceCity.getId());
-					System.out.println("参数:" + orderPrivateCar.getCompanyId() + "|" + orderPrivateCar.getServerCarModelId());
-					System.out.println("query1:" + query1);
+//					System.out.println("参数:" + orderPrivateCar.getCompanyId() + "|" + orderPrivateCar.getServerCarModelId());
+//					System.out.println("query1:" + query1);
 					//开始根据不同的方式计算金额
 					if (query1 != null) {
 						JSONObject jsonObject = JSON.parseObject(query1.get("content").toString());//等待费
@@ -1370,9 +1398,11 @@
 			@ApiImplicitParam(value = "优惠数据id", name = "objectId", required = false, dataType = "int"),
 			@ApiImplicitParam(value = "数据类型(1=优惠券,2=打车卡)", name = "objectType", required = false, dataType = "int"),
 			@ApiImplicitParam(value = "支付端(1=用户APP端,2=司机APP端,3=用户小程序端)", name = "type", required = true, dataType = "int"),
+			@ApiImplicitParam(value = "小程序支付成功跳转路径", name = "path", required = true, dataType = "String"),
+			@ApiImplicitParam(value = "设备当前IP地址", name = "ip", required = true, dataType = "String"),
 			@ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
 	})
-	public ResultUtil payTaxiOrder1(Integer payType, Integer orderId, Integer orderType, Integer objectId, Integer objectType, Integer type, HttpServletRequest request) {
+	public ResultUtil payTaxiOrder1(Integer payType, Integer orderId, Integer orderType, Integer objectId, Integer objectType, Integer type, String path, String ip, HttpServletRequest request) {
 		System.out.println(objectType);
 		System.out.println(objectId);
 		try {
@@ -1382,11 +1412,15 @@
 			}
 			switch (orderType) {
 				case 1:
-					return orderPrivateCarService.payPrivateCarOrder1(payType, orderId, objectId, objectType, type);
+					return orderPrivateCarService.payPrivateCarOrder1(payType, orderId, objectId, objectType, type, path, ip);
 				case 2:
-					return orderTaxiService.payTaxiOrder1(payType, orderId, objectId, objectType, type);
+					return orderTaxiService.payTaxiOrder1(payType, orderId, objectId, objectType, type, path, ip);
 				case 3:
-					return orderCrossCityService.payCrossCityOrder1(payType, orderId, objectId, objectType, type);
+					ResultUtil resultUtil = orderCrossCityService.payCrossCityOrder1(payType, orderId, objectId, objectType, type);
+
+					orderCrossCityService.promotion(orderId);
+
+					return resultUtil;
 				case 4:
 					return orderLogisticsService.payLogisticsOrder1(payType, orderId, objectId, objectType, type);
 				case 5:
@@ -1427,6 +1461,23 @@
 						OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
 						orderPrivateCar.setState(9);
 						orderPrivateCarService.updateById(orderPrivateCar);
+						Driver driver1 = null;
+						Company company = null;
+						//中台修改订单状态
+						ModifyTravelItineraryRequest request = new ModifyTravelItineraryRequest();
+						request.setOrderId(orderPrivateCar.getTravelId());
+						request.setStatus(orderPrivateCar.getState());
+						if (null != orderPrivateCar.getDriverId()) {
+							driver1 = driverService.selectById(orderPrivateCar.getDriverId());
+							company = companyService.selectById(driver1.getCompanyId());
+							request.setDriverId(driver1.getEmpId().toString());
+							request.setSupplierShopId(company.getEnterCode());
+						}
+						if (2 == orderPrivateCar.getPromotion()) {
+							Driver driver2 = driverService.selectById(orderPrivateCar.getPromotionDriverId());
+							request.setPromoterId(driver2.getEmpId().toString());
+						}
+						OrderUtil.modifyTravelItinerary(request);
 						new Thread(new Runnable() {
 							@Override
 							public void run() {
@@ -1441,6 +1492,23 @@
 						OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
 						orderTaxi.setState(9);
 						orderTaxiService.updateById(orderTaxi);
+						Driver driver = null;
+						Company company1 = null;
+						//中台修改订单状态
+						ModifyTravelItineraryRequest request2 = new ModifyTravelItineraryRequest();
+						request2.setOrderId(orderTaxi.getTravelId());
+						request2.setStatus(orderTaxi.getState());
+						if (null != orderTaxi.getDriverId()) {
+							driver = driverService.selectById(orderTaxi.getDriverId());
+							company1 = companyService.selectById(driver.getCompanyId());
+							request2.setDriverId(driver.getEmpId().toString());
+							request2.setSupplierShopId(company1.getEnterCode());
+						}
+						if (2 == orderTaxi.getPromotion()) {
+							Driver driver2 = driverService.selectById(orderTaxi.getPromotionDriverId());
+							request2.setPromoterId(driver2.getEmpId().toString());
+						}
+						OrderUtil.modifyTravelItinerary(request2);
 						break;
 					case 3:
 						OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
@@ -2080,7 +2148,30 @@
 	@PostMapping("/base/order/qytPaymentCallback")
 	public String qytPaymentCallback(@RequestBody QYTPaymentCallback qytPaymentCallback) {
 		log.info("【黔云通支付回调通知】请求参数:" + JSON.toJSONString(qytPaymentCallback));
-		if (null == qytPaymentCallback) {
+		try {
+			if (null == qytPaymentCallback) {
+				return "error";
+			}
+			QYTPaymentCallbackData data = qytPaymentCallback.getData();
+			if("1".equals(data.getStatus())){
+				return "error";
+			}
+			String orderNo = data.getOrderNo();
+			String payId = data.getPayId();
+			//网约车
+			if(orderNo.contains("PR")){
+				orderNo = orderNo.substring(2);
+				orderPrivateCarService.payOrderPrivateCarCallback(Integer.valueOf(orderNo), payId, 1);
+				orderPrivateCarService.promotion(Integer.valueOf(orderNo));
+			}
+			//出租车
+			if(orderNo.contains("TA")){
+				orderNo = orderNo.substring(2);
+				orderTaxiService.payOrderTaxiCallback(Integer.valueOf(orderNo), payId, 1, 0);
+				orderTaxiService.promotion(Integer.valueOf(orderNo));
+			}
+		}catch (Exception e){
+			e.printStackTrace();
 			return "error";
 		}
 		return "success";
@@ -2095,12 +2186,6 @@
 	 */
 	private void promotion(Integer orderType, Integer orderId) {
 		switch (orderType) {
-			case 1:
-				orderPrivateCarService.promotion(orderId);
-				break;
-			case 2:
-				orderTaxiService.promotion(orderId);
-				break;
 			case 3:
 				orderCrossCityService.promotion(orderId);
 				break;
@@ -2165,5 +2250,290 @@
 			return ResultUtil.runErr();
 		}
 	}
+    
+    @PostMapping("/api/order/queryMyTripList")
+    @ApiOperation(value = "获取我的行程列表", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "订单类型(1=专车,2=出租车,3=跨城出行)", name = "type", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页码(首页1)", name = "pageNum", required = true, dataType = "int"),
+            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
+            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+    })
+    public ResultUtil<List<TripOrderVo>> queryMyTripList(Integer type, Integer pageNum, Integer size, HttpServletRequest request){
+        try {
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if(null == uid){
+                return ResultUtil.tokenErr();
+            }
+            
+            List<Map<String,Object>> raw = fetchTrips(uid, type, pageNum, size);
+            return ResultUtil.success(TripOrderVo.getTripOrderVo(raw));
+            
+        }catch (Exception e){
+            e.printStackTrace();
+            return ResultUtil.runErr();
+        }
+    }
+    /**
+     * 私有:拉取指定 type 的行程列表。
+     * type=0 → 全部类型;1/2/3 → 对应三种服务;pageNum/size 负责分页。
+     * 对于 type==1 或 3,内部额外加载 serverCarModel 信息。
+     */
+    private List<Map<String,Object>> fetchTrips(
+            Integer uid, Integer type, Integer pageNum, Integer size) throws Exception {
+        
+        List<Map<String, Object>> list = new ArrayList<>();
+        if (type == null || type == 0) {
+            list.addAll(orderPrivateCarService.queryMyTripListAll(uid));
+            list.addAll(orderTaxiService.queryMyTripListAll(uid));
+            list.addAll(orderCrossCityService.queryMyTripListAll(uid));
+        } else {
+            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;
+                default:
+                    throw new IllegalArgumentException("无效的订单类型:" + type);
+            }
+        }
+        // 排序
+        list.sort((a, b) -> {
+            Date da = (Date) a.get("boardingTime");
+            Date db = (Date) b.get("boardingTime");
+            if (da == null && db == null) return 0;
+            if (da == null) return 1;   // a 在后面
+            if (db == null) return -1;  // b 在后面
+            return da.compareTo(db);    // 按时间正序(升序)排列
+        });
+        // 将经纬度转换为城市并设置到数据中
+        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 (orderMap.get("serverCarModelId") != null ){
+                    //获取车型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", ""); // 经纬度为空时设为空
+                }
+            }
+        }
+        return list;
+    }
+    @PostMapping("/api/user/sendTripSheetEmail")
+    @ApiOperation(value = "发送行程单邮件", tags = {"用户端-个人中心"}, notes = "")
+    @ApiImplicitParams({
+            @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(@RequestBody TripSheetVo tripSheet,
+                                         HttpServletRequest  request) {
+        try {
+            // 从Redis中获取当前用户ID
+            Integer uid = userInfoService.getUserIdFormRedis(request);
+            if (null == uid) {
+                return ResultUtil.tokenErr();
+            }
+            List<TripOrderVo> orderList = new ArrayList<>();
+            if (tripSheet.isAllOrders()) {
+                // 这里复用 queryMyTripList 逻辑,不分页,type=0 表示全部
+                List<Map<String, Object>> rawList = fetchTrips(uid, 0, null, null);
+                orderList = TripOrderVo.getTripOrderVo(rawList);
+            } else {
+                // 指定订单ID集合:验证并查询订单
+                if (tripSheet.getOrderIdList() == null || tripSheet.getOrderIdList().isEmpty()) {
+                    return ResultUtil.error("请传入订单ID集合或者选择全部订单");
+                }
+                // 根据订单类型和ID查询订单
+                orderList = queryOrdersByTypeAndIds(uid, tripSheet.getOrderType(), tripSheet.getOrderIdList());
+            }
+            List<TripOrderVo> tripOrderVos = processTripOrderVos(orderList);
+            String filePath = tripSheetGenerator.generatePdf(tripOrderVos);
+            File attachment = new File(filePath);
+            String displayFileName = "贵人家园行程单.pdf";
+            emailUtil.sendEmailWithAttachment(tripSheet.getRecipientEmail(), "行程单", "请查收您的行程单", attachment,displayFileName);
+            attachment.delete(); // 发送成功后删除临时文件
+            Map<String, Object> result = new HashMap<>();
+            result.put("orderNum", orderList.size());
+            return ResultUtil.success(result);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultUtil.error("邮件发送失败"+e.getMessage());
+        }
+    }
+    /**
+     * 根据订单类型和ID集合查询订单
+     */
+    private List<TripOrderVo> queryOrdersByTypeAndIds(Integer userId, Integer orderType, List<Integer> orderIds) throws InvocationTargetException, IllegalAccessException {
+        List<TripOrderVo> orderList = new ArrayList<>();
+        List<Integer> states = Arrays.asList(8, 9);
+        // 根据订单类型查询对应表的订单
+        switch (orderType) {
+            case 1:
+                EntityWrapper<OrderPrivateCar> wrapper = new EntityWrapper<>();
+                wrapper.in("id", orderIds);
+                wrapper.in("state", states);
+                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);
+                wrapper2.in("state", states);
+                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);
+                wrapper3.in("state", states);
+                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 da.compareTo(db);    // 按时间正序(升序)排列
+        });
+        
+        
+        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