From 926e065fb0b4424d0d51023c234a92433bac61c8 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期五, 01 八月 2025 11:53:45 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/QianYunTong

---
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java                                                  |    1 
 DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java                                 |    1 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java                             |    4 
 UserQYTTravel/guns-admin/pom.xml                                                                                                               |   21 
 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/taxi/service/IOrderTaxiService.java                                          |   12 
 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js                                     |  219 ++
 UserQYTTravel/guns-admin/src/main/resources/static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf                                                        |    0 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java                           |    5 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml                           |   48 
 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_add.html                  |  236 ++
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java                                      |   20 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java                                             |  155 +
 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js                     |  191 ++
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java                                  |   28 
 UserQYTTravel/guns-admin/src/main/resources/application.yml                                                                                    |   50 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java                                     |   22 
 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_edit.html                 |  268 +++
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java                                                |   12 
 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js                              |  312 +++
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java                                 |    3 
 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivityUser.html                  |   40 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java                                           |  337 ++++
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverPromotionActivityServiceImpl.java           |  117 +
 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html                                            |    2 
 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js                     |  196 ++
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml                                         |   46 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java       |  209 ++
 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html                                     |  121 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java                     |   29 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java                             |  109 +
 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_detail.html               |  384 ++++
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java                                          |   10 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverPromotionActivityService.java                   |   28 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml                               |   59 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml                          |  167 ++
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java                                                   |   52 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDriverPromotionActivityController.java |  364 ++++
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java                                 |    4 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java                                                |   33 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java                                                   |   11 
 DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java                   |    2 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverRankVo.java                                         |   16 
 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity.html                      |   53 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java                                  |    5 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java                   |   10 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java                                      |    5 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java                                           |   20 
 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js                 |  110 +
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java                                   |    2 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java                                      |   80 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java                                                    |   11 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverPromotionActivityMapper.xml                  |   60 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java                         |   27 
 DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java                                |    2 
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverPromotionActivityMapper.java                         |   22 
 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js                      |  209 ++
 UserQYTTravel/guns-admin/src/main/resources/static/img/logo.png                                                                                |    0 
 UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java                                                     |  307 +++
 59 files changed, 4,790 insertions(+), 110 deletions(-)

diff --git a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
index 13f8988..90700fe 100644
--- a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
+++ b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -371,7 +371,7 @@
         UserInfo userInfo = userInfoMapper.selectById(userId);
         if(userInfo.getBindDriverId()!=null && userInfo.getBindExpireDate().getTime()<=System.currentTimeMillis()){
             String registAreaCode = userInfo.getRegistAreaCode();
-            TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1"));
+            TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("state",1).eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1"));
             if(tDriverPromotionActivity!=null){
                 return 2;
             }
diff --git a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java
index c67d940..cc0556f 100644
--- a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java
+++ b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java
@@ -100,6 +100,7 @@
     private Date createTime;
     private Date updateTime;
 
+    private Integer state;
 
     @Override
     protected Serializable pkVal() {
diff --git a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
index 6f71f7e..7bcf42c 100644
--- a/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
+++ b/DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -331,7 +331,7 @@
         UserInfo userInfo = userInfoMapper.selectById(userId);
         if(userInfo.getBindDriverId()!=null && userInfo.getBindExpireDate().getTime()<=System.currentTimeMillis()){
             String registAreaCode = userInfo.getRegistAreaCode();
-            TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1"));
+            TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("state",1).eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1"));
             if(tDriverPromotionActivity!=null){
                 return userInfo.getBindDriverId();
             }
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDriverPromotionActivityController.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDriverPromotionActivityController.java
new file mode 100644
index 0000000..cc921d3
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDriverPromotionActivityController.java
@@ -0,0 +1,364 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.rabbitmq.client.LongString;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.beetl.ShiroExtUtil;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.model.DriverRankVo;
+import com.stylefeng.guns.modular.system.model.TRegion;
+import com.stylefeng.guns.modular.system.service.ITRegionService;
+import com.stylefeng.guns.modular.system.util.ExcelExportUtil;
+import lombok.SneakyThrows;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.ui.Model;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.stylefeng.guns.core.log.LogObjectHolder;
+import com.stylefeng.guns.modular.system.model.TDriverPromotionActivity;
+import com.stylefeng.guns.modular.system.service.ITDriverPromotionActivityService;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 控制器
+ *
+ * @author fengshuonan
+ * @Date 2025-07-31 11:20:54
+ */
+@Controller
+@RequestMapping("/tDriverPromotionActivity")
+public class TDriverPromotionActivityController extends BaseController {
+
+    private String PREFIX = "/system/tDriverPromotionActivity/";
+
+    @Autowired
+    private ITDriverPromotionActivityService tDriverPromotionActivityService;
+
+    @Autowired
+    private ITRegionService tRegionService;
+
+
+    @Autowired
+    private ShiroExtUtil shiroExtUtil;
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("")
+    public String index() {
+        return PREFIX + "tDriverPromotionActivity.html";
+    }
+
+    /**
+     * 跳转到添加
+     */
+    @RequestMapping("/tDriverPromotionActivity_add")
+    public String tDriverPromotionActivityAdd(Model model) {
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+        return PREFIX + "tDriverPromotionActivity_add.html";
+    }
+
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/tDriverPromotionActivity_update/{tDriverPromotionActivityId}")
+    public String tDriverPromotionActivityUpdate(@PathVariable Integer tDriverPromotionActivityId, Model model) {
+        TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(tDriverPromotionActivityId);
+        model.addAttribute("item",tDriverPromotionActivity);
+
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        model.addAttribute("time",simpleDateFormat.format(tDriverPromotionActivity.getStartTime())+" - "+simpleDateFormat.format(tDriverPromotionActivity.getEndTime()));
+
+
+        LogObjectHolder.me().set(tDriverPromotionActivity);
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+
+        TRegion province = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tDriverPromotionActivity.getProvinceCode()));
+        //市
+        List<TRegion> cityList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", province.getId()));
+        model.addAttribute("cityList",cityList);
+
+        //区
+        TRegion city = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tDriverPromotionActivity.getCityCode()));
+        List<TRegion> areaList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", city.getId()));
+        model.addAttribute("areaList",areaList);
+
+
+
+
+
+
+
+
+        return PREFIX + "tDriverPromotionActivity_edit.html";
+    }
+    @RequestMapping("/tDriverPromotionActivity_viewUser/{id}")
+    public String tDriverPromotionActivityViewUser(@PathVariable Integer id, Model model) {
+
+        model.addAttribute("driverId",id);
+        return PREFIX + "tDriverPromotionActivityUser.html";
+    }
+    /**
+     * 跳转到修改
+     */
+    @RequestMapping("/tDriverPromotionActivity_info/{tDriverPromotionActivityId}")
+    public String tDriverPromotionActivityInfo(@PathVariable Integer tDriverPromotionActivityId, Model model) {
+        TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(tDriverPromotionActivityId);
+        model.addAttribute("item",tDriverPromotionActivity);
+
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        model.addAttribute("time",simpleDateFormat.format(tDriverPromotionActivity.getStartTime())+" - "+simpleDateFormat.format(tDriverPromotionActivity.getEndTime()));
+
+
+        LogObjectHolder.me().set(tDriverPromotionActivity);
+        List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
+        model.addAttribute("provinceList",provinceList);
+
+        TRegion province = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tDriverPromotionActivity.getProvinceCode()));
+        //市
+        List<TRegion> cityList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", province.getId()));
+        model.addAttribute("cityList",cityList);
+
+        //区
+        TRegion city = tRegionService.selectOne(new EntityWrapper<TRegion>().eq("code", tDriverPromotionActivity.getCityCode()));
+        List<TRegion> areaList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", city.getId()));
+        model.addAttribute("areaList",areaList);
+
+        return PREFIX + "tDriverPromotionActivity_detail.html";
+    }
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,String name,Integer status) {
+
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)) {
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        return tDriverPromotionActivityService.list(beginTime,endTime,name,status);
+    }
+
+
+
+
+    /**
+     * 获取列表
+     */
+    @RequestMapping(value = "/list1")
+    @ResponseBody
+    public Object list1(Long id,String driverName) {
+
+        return tDriverPromotionActivityService.list1(id,driverName);
+    }
+    @RequestMapping(value = "/list2")
+    @ResponseBody
+    public Object list2(Long driverId,String name) {
+
+        return tDriverPromotionActivityService.list2(driverId,name);
+    }
+    @GetMapping("/export1")
+    @ResponseBody
+    public void export1(Long driverId,String name, HttpServletRequest request, HttpServletResponse response) {
+        try {
+            ArrayList<HashMap<String, Object>> list = tDriverPromotionActivityService.list2(driverId, name);
+
+
+            // 表格数据【封装】
+            List<List<String>> dataList = new ArrayList<>();
+
+            //第一行显示【封装】
+            List<String> twoList = new ArrayList<String>();
+            twoList.add("总计:");
+            twoList.add(String.valueOf(list.size())+"条");
+            dataList.add(twoList);
+            // 列【封装】
+            List<String> shellList = new ArrayList<String>();
+            shellList.add("序号");
+            shellList.add("用户昵称");
+            shellList.add("用户手机号");
+            shellList.add("绑定时间");
+            shellList.add("有效期至");
+            shellList.add("产生收益合计");
+            dataList.add(shellList);
+            Integer index = 0;
+            for (HashMap<String, Object> object : list){
+                index++;
+                // 详细数据列【封装】
+                shellList = new ArrayList<String>();
+                shellList.add(index.toString());
+                shellList.add(object.get("userName").toString());
+                shellList.add(object.get("userPhone").toString());
+                shellList.add(object.get("bindDate").toString());
+                shellList.add(object.get("bindExpireDate").toString());
+                shellList.add(object.get("money").toString());
+
+                dataList.add(shellList);
+            }
+            try {
+                // 调用工具类进行导出
+                ExcelExportUtil.easySheet("司机推广下级用户导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "司机推广下级用户导出记录", dataList,request, response);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @GetMapping("/export")
+    @ResponseBody
+    public void export(Long id,String driverName, HttpServletRequest request, HttpServletResponse response) {
+        try {
+            List<DriverRankVo> list = tDriverPromotionActivityService.list1(id, driverName);
+
+
+            // 表格数据【封装】
+            List<List<String>> dataList = new ArrayList<>();
+
+            //第一行显示【封装】
+            List<String> twoList = new ArrayList<String>();
+            twoList.add("总计:");
+            twoList.add(String.valueOf(list.size())+"条");
+            dataList.add(twoList);
+            // 列【封装】
+            List<String> shellList = new ArrayList<String>();
+            shellList.add("推广排名");
+            shellList.add("司机姓名");
+            shellList.add("推广用户数量");
+            shellList.add("推广收益合计");
+            dataList.add(shellList);
+            Integer index = 0;
+            for (DriverRankVo object : list){
+                index++;
+                // 详细数据列【封装】
+                shellList = new ArrayList<String>();
+                shellList.add(index.toString());
+                shellList.add(object.getDriverName());
+                shellList.add(object.getUserNum().toString());
+                shellList.add(object.getMoney().toString());
+
+
+                dataList.add(shellList);
+            }
+            try {
+                // 调用工具类进行导出
+                ExcelExportUtil.easySheet("推广情况导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "推广情况导出记录", dataList,request, response);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 新增
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(String activityTitle,String bizTypeValue,String province,String city,String area,String time,Integer commissionRatio,Integer bindingDays,String content) throws ParseException {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        TDriverPromotionActivity tDriverPromotionActivity = new TDriverPromotionActivity();
+        tDriverPromotionActivity.setActivityTitle(activityTitle);
+        tDriverPromotionActivity.setBizType(bizTypeValue);
+        tDriverPromotionActivity.setProvinceCode(province);
+        tDriverPromotionActivity.setCityCode(city);
+        tDriverPromotionActivity.setDistrictCode(area);
+        String s = time.split(" - ")[0] + " 00:00:00";
+        String s1 = time.split(" - ")[1] + " 23:59:59";
+        tDriverPromotionActivity.setStartTime(simpleDateFormat.parse(s));
+        tDriverPromotionActivity.setEndTime(simpleDateFormat.parse(s1));
+        tDriverPromotionActivity.setCommissionRatio(BigDecimal.valueOf(commissionRatio));
+        tDriverPromotionActivity.setBindingDays(bindingDays);
+        tDriverPromotionActivity.setActivityDesc(ToolUtil.cleanXSS(content));
+        tDriverPromotionActivity.setStatus(1);
+        tDriverPromotionActivity.setCreator(shiroExtUtil.getUser().getName());
+        tDriverPromotionActivity.setCreateTime(new Date());
+        tDriverPromotionActivityService.insert(tDriverPromotionActivity);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(@RequestParam Integer tDriverPromotionActivityId) {
+        TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(tDriverPromotionActivityId);
+        tDriverPromotionActivity.setRemove(1);
+        tDriverPromotionActivityService.updateById(tDriverPromotionActivity);
+        return SUCCESS_TIP;
+    }
+    @RequestMapping(value = "/stop")
+    @ResponseBody
+    public Object stop(@RequestParam Integer id) {
+        TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(id);
+        tDriverPromotionActivity.setState(2);
+        tDriverPromotionActivityService.updateById(tDriverPromotionActivity);
+        return SUCCESS_TIP;
+    }
+    @RequestMapping(value = "/start")
+    @ResponseBody
+    public Object start(@RequestParam Integer id) {
+        TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(id);
+        tDriverPromotionActivity.setState(1);
+        tDriverPromotionActivityService.updateById(tDriverPromotionActivity);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 修改
+     */
+    @SneakyThrows
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(Long id,String activityTitle, String bizTypeValue, String province, String city, String area, String time, Integer commissionRatio, Integer bindingDays, String content) {
+        TDriverPromotionActivity tDriverPromotionActivity = tDriverPromotionActivityService.selectById(id);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        tDriverPromotionActivity.setActivityTitle(activityTitle);
+        tDriverPromotionActivity.setBizType(bizTypeValue);
+        tDriverPromotionActivity.setProvinceCode(province);
+        tDriverPromotionActivity.setCityCode(city);
+        tDriverPromotionActivity.setDistrictCode(area);
+        String s = time.split(" - ")[0] + " 00:00:00";
+        String s1 = time.split(" - ")[1] + " 23:59:59";
+        tDriverPromotionActivity.setStartTime(simpleDateFormat.parse(s));
+        tDriverPromotionActivity.setEndTime(simpleDateFormat.parse(s1));
+        tDriverPromotionActivity.setCommissionRatio(BigDecimal.valueOf(commissionRatio));
+        tDriverPromotionActivity.setBindingDays(bindingDays);
+        tDriverPromotionActivity.setActivityDesc(ToolUtil.cleanXSS(content));
+        tDriverPromotionActivity.setStatus(1);
+        tDriverPromotionActivity.setCreator(shiroExtUtil.getUser().getName());
+        tDriverPromotionActivity.setCreateTime(new Date());
+        tDriverPromotionActivity.setUpdateTime(new Date());
+        tDriverPromotionActivityService.updateById(tDriverPromotionActivity);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 详情
+     */
+    @RequestMapping(value = "/detail/{tDriverPromotionActivityId}")
+    @ResponseBody
+    public Object detail(@PathVariable("tDriverPromotionActivityId") Integer tDriverPromotionActivityId) {
+        return tDriverPromotionActivityService.selectById(tDriverPromotionActivityId);
+    }
+}
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java
new file mode 100644
index 0000000..67e223b
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java
@@ -0,0 +1,209 @@
+package com.stylefeng.guns.modular.system.controller.specialTrain;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.beetl.ShiroExtUtil;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.*;
+import com.stylefeng.guns.modular.system.util.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 快车订单控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-09-02 17:28:59
+ */
+@Controller
+@RequestMapping("/promotionInfo")
+public class TPromotionOrderCarController extends BaseController {
+
+    private String PREFIX = "/system/tPromotionOrderCar/";
+
+    @Autowired
+    private ITOrderPrivateCarService tOrderPrivateCarService;
+
+    @Autowired
+    private ShiroExtUtil shiroExtUtil;
+
+
+    /**
+     * 跳转到快车订单首页
+     */
+    @RequestMapping("")
+    public String index(Model model) {
+        List<Map<String, Object>> list=new ArrayList<>();
+        list =  tOrderPrivateCarService.promotionInfoExport(null, null, null, null, null, null, null, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId());
+        BigDecimal reduce = list.stream().map(e -> new BigDecimal(e.get("promotionMoney").toString())).reduce(BigDecimal.ZERO, BigDecimal::add);
+        model.addAttribute("money",reduce);
+        model.addAttribute("size",list.size());
+
+        return PREFIX + "tPromotionOrder.html";
+    }
+
+
+    /**
+     * 获取快车订单列表
+     */
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String insertTime,
+                       String orderNum,
+                       String userName,
+                       String name,
+                       String driverName){
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(insertTime)) {
+            String[] timeArray = insertTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(tOrderPrivateCarService.promotionInfo(page, beginTime, endTime, orderNum, userName, name, driverName, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId()));
+        return super.packForBT(page);
+    }
+
+
+
+    @GetMapping("/export")
+    @ResponseBody
+    public void export(String insertTime,
+                       String orderNum,
+                       String userName,
+                       String name,
+                       String driverName, HttpServletRequest request, HttpServletResponse response) {
+        try {
+            String beginTime = null;
+            String endTime = null;
+            if (SinataUtil.isNotEmpty(insertTime)) {
+                String[] timeArray = insertTime.split(" - ");
+                beginTime = timeArray[0];
+                endTime = timeArray[1];
+            }
+            List<Map<String, Object>> list=new ArrayList<>();
+            list =  tOrderPrivateCarService.promotionInfoExport(null, beginTime, endTime, orderNum, userName, name, driverName, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId());
+
+
+            // 表格数据【封装】
+            List<List<String>> dataList = new ArrayList<>();
+
+            //第一行显示【封装】
+            List<String> twoList = new ArrayList<String>();
+            twoList.add("总计:");
+            twoList.add(String.valueOf(list.size())+"条");
+            dataList.add(twoList);
+
+            // 列【封装】
+            List<String> shellList = new ArrayList<String>();
+            shellList.add("活动名称");
+            shellList.add("司机名称");
+            shellList.add("下级用户");
+            shellList.add("订单编号");
+            shellList.add("订单金额");
+            shellList.add("司机推广收益");
+            shellList.add("收益时间");
+            dataList.add(shellList);
+
+            for (Map<String,Object> object : list){
+                // 详细数据列【封装】
+                shellList = new ArrayList<String>();
+                if(SinataUtil.isNotEmpty(object.get("name"))){
+                    shellList.add(object.get("name").toString());
+                }else{
+                    shellList.add("-");
+                }
+                if(SinataUtil.isNotEmpty(object.get("driverName"))){
+                    shellList.add(object.get("driverName").toString());
+                }else{
+                    shellList.add("-");
+                }
+                if(SinataUtil.isNotEmpty(object.get("userName"))){
+                    shellList.add(object.get("userName").toString());
+                }else{
+                    shellList.add("-");
+                }
+                if(SinataUtil.isNotEmpty(object.get("orderNum"))){
+                    shellList.add(object.get("orderNum").toString());
+                }else{
+                    shellList.add("-");
+                }
+                if(SinataUtil.isNotEmpty(object.get("money"))){
+                    shellList.add(object.get("money").toString());
+                }else{
+                    shellList.add("-");
+                }
+                if(SinataUtil.isNotEmpty(object.get("promotionMoney"))){
+                    shellList.add(object.get("promotionMoney").toString());
+                }else{
+                    shellList.add("-");
+                }
+
+                if(SinataUtil.isNotEmpty(object.get("successTime"))){
+                    shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("successTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
+                }else{
+                    shellList.add("-");
+                }
+
+
+
+                dataList.add(shellList);
+            }
+            try {
+                // 调用工具类进行导出
+                ExcelExportUtil.easySheet("推广收益明细导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "推广收益明细导出记录", dataList,request, response);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @PostMapping("/list1")
+    @ResponseBody
+    public Object list1(String insertTime,
+                       String orderNum,
+                       String userName,
+                       String name,
+                       String driverName) {
+            String beginTime = null;
+            String endTime = null;
+            if (SinataUtil.isNotEmpty(insertTime)) {
+                String[] timeArray = insertTime.split(" - ");
+                beginTime = timeArray[0];
+                endTime = timeArray[1];
+            }
+            List<Map<String, Object>> list=new ArrayList<>();
+            list =  tOrderPrivateCarService.promotionInfoExport(null, beginTime, endTime, orderNum, userName, name, driverName, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId());
+        HashMap<String, Object> map = new HashMap<>();
+        BigDecimal reduce = list.stream().map(e -> new BigDecimal(e.get("promotionMoney").toString())).reduce(BigDecimal.ZERO, BigDecimal::add);
+        map.put("money", reduce);
+        map.put("size", list.size());
+        return map;
+    }
+
+
+
+}
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverPromotionActivityMapper.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverPromotionActivityMapper.java
new file mode 100644
index 0000000..32900b7
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverPromotionActivityMapper.java
@@ -0,0 +1,22 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.stylefeng.guns.modular.system.model.TDriverPromotionActivity;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 司机推广活动主表 Mapper 接口
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2025-07-31
+ */
+public interface TDriverPromotionActivityMapper extends BaseMapper<TDriverPromotionActivity> {
+
+    List<Map<String,Object>> list(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("name") String name, @Param("status") Integer status);
+
+}
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java
index 9d1908d..ef8edfb 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java
@@ -70,4 +70,8 @@
 
 
     List<Map<String,Object>> getSurcharge(@Param("id") Object id,@Param("orderType") Integer orderType);
+
+    List<Map<String, Object>> promotionInfo(@Param("page") Page<Map<String, Object>> page, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("orderNum") String orderNum, @Param("userName") String userName, @Param("name") String name, @Param("driverName") String driverName, @Param("roleType") Integer roleType, @Param("objectId") Integer objectId);
+
+    List<Map<String, Object>> promotionInfoExport(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("orderNum") String orderNum, @Param("userName") String userName, @Param("name") String name, @Param("driverName") String driverName, @Param("roleType") Integer roleType, @Param("objectId") Integer objectId);
 }
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverPromotionActivityMapper.xml b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverPromotionActivityMapper.xml
new file mode 100644
index 0000000..f31aa95
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverPromotionActivityMapper.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.TDriverPromotionActivityMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TDriverPromotionActivity">
+        <id column="id" property="id" />
+        <result column="bizType" property="bizType" />
+        <result column="activityTitle" property="activityTitle" />
+        <result column="province" property="province" />
+        <result column="provinceCode" property="provinceCode" />
+        <result column="city" property="city" />
+        <result column="cityCode" property="cityCode" />
+        <result column="district" property="district" />
+        <result column="districtCode" property="districtCode" />
+        <result column="startTime" property="startTime" />
+        <result column="endTime" property="endTime" />
+        <result column="commissionRatio" property="commissionRatio" />
+        <result column="bindingDays" property="bindingDays" />
+        <result column="activityDesc" property="activityDesc" />
+        <result column="status" property="status" />
+        <result column="creator" property="creator" />
+        <result column="createTime" property="createTime" />
+        <result column="updateTime" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, bizType, activityTitle, province, provinceCode, city, cityCode, district, districtCode, startTime, endTime, commissionRatio, bindingDays, activityDesc,  creator, createTime, updateTime,
+    </sql>
+
+    <select id="list" resultType="java.util.Map">
+select  * from (
+        select <include refid="Base_Column_List"/>
+            case
+                when now()>endTime then 4
+                when startTime>now()  then 3
+                when now()>startTime and endTime >now() and state =1 then 1
+                when now()>startTime and endTime >now() and state =2 then 2
+                else 0
+            end as status
+            from t_driver_promotion_activity
+        where remove=0
+        <if test="beginTime != null and endTime != null">
+            and createTime between #{beginTime} and #{endTime}
+        </if>
+
+        <if test="name != null">
+            and activityTitle like concat('%',#{name},'%')
+        </if>
+        ) t1 where 1=1
+        <if test="status!= null">
+            and t1.status =#{status}
+        </if>
+        order by t1.createTime desc
+
+
+    </select>
+
+</mapper>
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml
index f0b5ae9..27d4230 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml
@@ -259,4 +259,171 @@
         SELECT  IFNULL(amount,0) amount,b.`name`  FROM  t_order_additional_fee a   LEFT JOIN t_additional_fee b ON a.additionalFeeId=b.id  WHERE a.orderId=#{id} AND a.orderType=#{orderType} AND a.id>1 AND amount>0
     </select>
 
+
+
+
+    <select id="promotionInfo" resultType="java.util.Map">
+select  * from (
+        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
+        from t_order_private_car t1
+        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
+        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
+        LEFT JOIN t_user t4 ON t1.userId = t4.id
+        where t1.promotionActivityId is not null
+        <if test="orderNum != null and orderNum != ''">
+            and t1.orderNum  =#{orderNum}
+        </if>
+        <if test="beginTime != null and endTime != null">
+            and t1.successTime  between #{beginTime} and #{endTime}
+        </if>
+        <if test="userName != null and userName != ''">
+            and t4.nickName  like CONCAT('%',#{userName},'%')
+        </if>
+        <if test="name != null and name != ''">
+            and t2.activityTitle  like CONCAT('%',#{name},'%')
+        </if>
+        <if test="driverName != null and driverName != ''">
+            and t3.name  like CONCAT('%',#{driverName},'%')
+        </if>
+        <if test="roleType != null and roleType != '' and roleType != 1">
+            and t1.companyId = #{objectId}
+        </if>
+
+        union all
+        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
+        from t_order_taxi t1
+        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
+        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
+        LEFT JOIN t_user t4 ON t1.userId = t4.id
+        where t1.promotionActivityId is not null
+        <if test="orderNum != null and orderNum != ''">
+            and t1.orderNum  =#{orderNum}
+        </if>
+        <if test="beginTime != null and endTime != null">
+            and t1.successTime  between #{beginTime} and #{endTime}
+        </if>
+        <if test="userName != null and userName != ''">
+            and t4.nickName  like CONCAT('%',#{userName},'%')
+        </if>
+        <if test="name != null and name != ''">
+            and t2.activityTitle  like CONCAT('%',#{name},'%')
+        </if>
+        <if test="driverName != null and driverName != ''">
+            and t3.name  like CONCAT('%',#{driverName},'%')
+        </if>
+        <if test="roleType != null and roleType != '' and roleType != 1">
+            and t1.companyId = #{objectId}
+        </if>
+
+        union all
+
+        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
+        from t_order_cross_city t1
+        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
+        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
+        LEFT JOIN t_user t4 ON t1.userId = t4.id
+        where t1.promotionActivityId is not null
+        <if test="orderNum != null and orderNum != ''">
+            and t1.orderNum  =#{orderNum}
+        </if>
+        <if test="beginTime != null and endTime != null">
+            and t1.successTime  between #{beginTime} and #{endTime}
+        </if>
+        <if test="userName != null and userName != ''">
+            and t4.nickName  like CONCAT('%',#{userName},'%')
+        </if>
+        <if test="name != null and name != ''">
+            and t2.activityTitle  like CONCAT('%',#{name},'%')
+        </if>
+        <if test="driverName != null and driverName != ''">
+            and t3.name  like CONCAT('%',#{driverName},'%')
+        </if>
+        <if test="roleType != null and roleType != '' and roleType != 1">
+            and t1.companyId = #{objectId}
+        </if>
+        ) as t5 order by t5.successTime desc
+
+    </select>
+    <select id="promotionInfoExport" resultType="java.util.Map">
+        select  * from (
+        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
+        from t_order_private_car t1
+        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
+        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
+        LEFT JOIN t_user t4 ON t1.userId = t4.id
+        where t1.promotionActivityId is not null
+        <if test="orderNum != null and orderNum != ''">
+            and t1.orderNum  =#{orderNum}
+        </if>
+        <if test="beginTime != null and endTime != null">
+            and t1.successTime  between #{beginTime} and #{endTime}
+        </if>
+        <if test="userName != null and userName != ''">
+            and t4.nickName  like CONCAT('%',#{userName},'%')
+        </if>
+        <if test="name != null and name != ''">
+            and t2.activityTitle  like CONCAT('%',#{name},'%')
+        </if>
+        <if test="driverName != null and driverName != ''">
+            and t3.name  like CONCAT('%',#{driverName},'%')
+        </if>
+        <if test="roleType != null and roleType != '' and roleType != 1">
+            and t1.companyId = #{objectId}
+        </if>
+
+        union all
+        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
+        from t_order_taxi t1
+        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
+        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
+        LEFT JOIN t_user t4 ON t1.userId = t4.id
+        where t1.promotionActivityId is not null
+        <if test="orderNum != null and orderNum != ''">
+            and t1.orderNum  =#{orderNum}
+        </if>
+        <if test="beginTime != null and endTime != null">
+            and t1.successTime  between #{beginTime} and #{endTime}
+        </if>
+        <if test="userName != null and userName != ''">
+            and t4.nickName  like CONCAT('%',#{userName},'%')
+        </if>
+        <if test="name != null and name != ''">
+            and t2.activityTitle  like CONCAT('%',#{name},'%')
+        </if>
+        <if test="driverName != null and driverName != ''">
+            and t3.name  like CONCAT('%',#{driverName},'%')
+        </if>
+        <if test="roleType != null and roleType != '' and roleType != 1">
+            and t1.companyId = #{objectId}
+        </if>
+
+        union all
+
+        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
+        from t_order_cross_city t1
+        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
+        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
+        LEFT JOIN t_user t4 ON t1.userId = t4.id
+        where t1.promotionActivityId is not null
+        <if test="orderNum != null and orderNum != ''">
+            and t1.orderNum  =#{orderNum}
+        </if>
+        <if test="beginTime != null and endTime != null">
+            and t1.successTime  between #{beginTime} and #{endTime}
+        </if>
+        <if test="userName != null and userName != ''">
+            and t4.nickName  like CONCAT('%',#{userName},'%')
+        </if>
+        <if test="name != null and name != ''">
+            and t2.activityTitle  like CONCAT('%',#{name},'%')
+        </if>
+        <if test="driverName != null and driverName != ''">
+            and t3.name  like CONCAT('%',#{driverName},'%')
+        </if>
+        <if test="roleType != null and roleType != '' and roleType != 1">
+            and t1.companyId = #{objectId}
+        </if>
+        ) as t5 order by t5.successTime desc
+    </select>
+
 </mapper>
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverRankVo.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverRankVo.java
new file mode 100644
index 0000000..845273f
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/DriverRankVo.java
@@ -0,0 +1,16 @@
+package com.stylefeng.guns.modular.system.model;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class DriverRankVo {
+    private Integer driverId;
+
+    private String driverName;
+
+    private Integer userNum;
+
+    private BigDecimal money;
+}
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java
new file mode 100644
index 0000000..b6366bb
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java
@@ -0,0 +1,109 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.enums.IdType;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 司机推广活动主表
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2025-07-31
+ */
+@TableName("t_driver_promotion_activity")
+@Data
+public class TDriverPromotionActivity extends Model<TDriverPromotionActivity>{
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 推广活动ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 关联业务:1-专车/2-出租车/3-城际/4-顺风车/5-代驾
+     */
+    private String bizType;
+    /**
+     * 推广活动标题
+     */
+    private String activityTitle;
+    /**
+     * 活动区域-省
+     */
+    private String province;
+    /**
+     * 省code
+     */
+    private String provinceCode;
+    /**
+     * 活动区域-市
+     */
+    private String city;
+    /**
+     * 市code
+     */
+    private String cityCode;
+    /**
+     * 活动区域-区/县
+     */
+    private String district;
+    /**
+     * 区code
+     */
+    private String districtCode;
+    /**
+     * 活动开始时间
+     */
+    private Date startTime;
+    /**
+     * 活动结束时间
+     */
+    private Date endTime;
+    /**
+     * 抽佣比例(如 10.00 代表 10%)
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING)
+    private BigDecimal commissionRatio;
+    /**
+     * 司机乘客绑定有效期(天)
+     */
+    private Integer bindingDays;
+    /**
+     * 推广活动说明
+     */
+    private String activityDesc;
+    /**
+     * 状态:1-未开始 2-进行中 3-已结束
+     */
+    private Integer status;
+    /**
+     * 创建人
+     */
+    private String creator;
+    private Date createTime;
+    private Date updateTime;
+
+    private Integer state;
+    /**
+     *
+     * 删除标识:0-正常 1-删除
+     */
+    private Integer remove;
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+
+}
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java
index f4e1444..903157b 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java
@@ -307,6 +307,26 @@
 
     private String abnormalRemark;
 
+    private Integer promotionDriverId;
+
+    private BigDecimal promotionMoney;
+
+    public BigDecimal getPromotionMoney() {
+        return promotionMoney;
+    }
+
+    public void setPromotionMoney(BigDecimal promotionMoney) {
+        this.promotionMoney = promotionMoney;
+    }
+
+    public Integer getPromotionDriverId() {
+        return promotionDriverId;
+    }
+
+    public void setPromotionDriverId(Integer promotionDriverId) {
+        this.promotionDriverId = promotionDriverId;
+    }
+
     public Integer getAbnormalStatus() {
         return abnormalStatus;
     }
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java
index 018d71a..150e4a7 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java
@@ -344,6 +344,28 @@
 
     private String abnormalRemark;
 
+
+    private Integer promotionDriverId;
+
+
+    private BigDecimal promotionMoney;
+
+    public BigDecimal getPromotionMoney() {
+        return promotionMoney;
+    }
+
+    public void setPromotionMoney(BigDecimal promotionMoney) {
+        this.promotionMoney = promotionMoney;
+    }
+
+    public Integer getPromotionDriverId() {
+        return promotionDriverId;
+    }
+
+    public void setPromotionDriverId(Integer promotionDriverId) {
+        this.promotionDriverId = promotionDriverId;
+    }
+
     public Integer getAbnormalStatus() {
         return abnormalStatus;
     }
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java
index d9648b9..9e240dc 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTaxi.java
@@ -310,6 +310,26 @@
 
     private BigDecimal responsibilityMoney;
 
+    private Integer promotionDriverId;
+
+    private BigDecimal promotionMoney;
+
+    public BigDecimal getPromotionMoney() {
+        return promotionMoney;
+    }
+
+    public void setPromotionMoney(BigDecimal promotionMoney) {
+        this.promotionMoney = promotionMoney;
+    }
+
+    public Integer getPromotionDriverId() {
+        return promotionDriverId;
+    }
+
+    public void setPromotionDriverId(Integer promotionDriverId) {
+        this.promotionDriverId = promotionDriverId;
+    }
+
     public Integer getAbnormalStatus() {
         return abnormalStatus;
     }
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java
index 50711b0..acc7e52 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TUser.java
@@ -139,8 +139,37 @@
 	 * 实名认证照片
 	 */
 	private String certificationImg;
-	
-	
+
+	private Integer bindDriverId;
+
+	private Date bindDate;
+
+	private Date bindExpireDate;
+
+	public Date getBindDate() {
+		return bindDate;
+	}
+
+	public void setBindDate(Date bindDate) {
+		this.bindDate = bindDate;
+	}
+
+	public Date getBindExpireDate() {
+		return bindExpireDate;
+	}
+
+	public void setBindExpireDate(Date bindExpireDate) {
+		this.bindExpireDate = bindExpireDate;
+	}
+
+	public Integer getBindDriverId() {
+		return bindDriverId;
+	}
+
+	public void setBindDriverId(Integer bindDriverId) {
+		this.bindDriverId = bindDriverId;
+	}
+
 	public Integer getId() {
 		return id;
 	}
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverPromotionActivityService.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverPromotionActivityService.java
new file mode 100644
index 0000000..721acbb
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverPromotionActivityService.java
@@ -0,0 +1,28 @@
+package com.stylefeng.guns.modular.system.service;
+
+import com.stylefeng.guns.modular.system.model.DriverRankVo;
+import com.stylefeng.guns.modular.system.model.TDriverPromotionActivity;
+import com.baomidou.mybatisplus.service.IService;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 司机推广活动主表 服务类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2025-07-31
+ */
+public interface ITDriverPromotionActivityService extends IService<TDriverPromotionActivity> {
+
+    Object list(String beginTime, String endTime, String name, Integer status);
+
+    List<DriverRankVo> list1(Long id, String driverName);
+
+
+    ArrayList<HashMap<String, Object>> list2(Long driverId, String name);
+
+}
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java
index 19f3cc3..7b1da0c 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java
@@ -70,4 +70,9 @@
 
 
     List<Map<String,Object>> getSurcharge(Object id,Integer orderType);
+
+    List<Map<String, Object>> promotionInfo(Page<Map<String, Object>> page, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId);
+
+
+    List<Map<String, Object>> promotionInfoExport(Object o, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId);
 }
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverPromotionActivityServiceImpl.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverPromotionActivityServiceImpl.java
new file mode 100644
index 0000000..c581749
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverPromotionActivityServiceImpl.java
@@ -0,0 +1,117 @@
+package com.stylefeng.guns.modular.system.service.impl;
+
+import cn.hutool.system.UserInfo;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.dao.TDriverPromotionActivityMapper;
+import com.stylefeng.guns.modular.system.service.*;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 司机推广活动主表 服务实现类
+ * </p>
+ *
+ * @author stylefeng
+ * @since 2025-07-31
+ */
+@Service
+public class TDriverPromotionActivityServiceImpl extends ServiceImpl<TDriverPromotionActivityMapper, TDriverPromotionActivity> implements ITDriverPromotionActivityService {
+
+    @Autowired
+    private ITDriverService driverService;
+    @Autowired
+    private ITUserService userService;
+    @Autowired
+    private ITOrderPrivateCarService orderPrivateCarService;
+    @Autowired
+    private ITOrderTaxiService orderTaxiService;
+    @Autowired
+    private ITOrderCrossCityService orderCrossCityService;
+
+    @Override
+    public Object list(String beginTime, String endTime, String name, Integer status) {
+        return this.baseMapper.list(beginTime, endTime, name, status);
+    }
+
+    @Override
+    public List<DriverRankVo> list1(Long id, String driverName) {
+       List<DriverRankVo> hashMaps = new ArrayList<>();
+
+        // 获取所有的司机
+        Wrapper<TDriver> flag = new EntityWrapper<TDriver>().ne("flag", 3);
+        if (driverName != null && !"".equals(driverName)) {
+            flag.like("name", driverName);
+        }
+
+        List<TDriver> tDrivers = driverService.selectList(flag);
+
+        // 获取绑定的司机的用户
+        List<TUser> tUsers = userService.selectList(new EntityWrapper<TUser>().isNotNull("bindDriverId").gt("bindExpireDate", new Date()));
+
+        // 获取所有获得司机收益的订单
+        List<TOrderPrivateCar> tOrderPrivateCars = orderPrivateCarService.selectList(new EntityWrapper<TOrderPrivateCar>().eq("promotionActivityId",id).isNotNull("promotionDriverId").isNotNull("successTime"));
+        List<TOrderTaxi> tOrderTaxis = orderTaxiService.selectList(new EntityWrapper<TOrderTaxi>().eq("promotionActivityId",id).isNotNull("promotionDriverId").isNotNull("successTime"));
+        List<TOrderCrossCity> tOrderCrossCities = orderCrossCityService.selectList(new EntityWrapper<TOrderCrossCity>().eq("promotionActivityId",id).isNotNull("promotionDriverId").isNotNull("successTime"));
+
+
+        for (TDriver tDriver : tDrivers) {
+            DriverRankVo driverRankVo = new DriverRankVo();
+            driverRankVo.setDriverId(tDriver.getId());
+            driverRankVo.setDriverName(tDriver.getName());
+            long count = tUsers.stream().filter(e -> tDriver.getId().equals(e.getBindDriverId())).count();
+            driverRankVo.setUserNum((int) count);
+
+            BigDecimal reduce = tOrderPrivateCars.stream().filter(e -> tDriver.getId().equals(e.getPromotionDriverId())).map(TOrderPrivateCar::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal reduce1 = tOrderTaxis.stream().filter(e -> tDriver.getId().equals(e.getPromotionDriverId())).map(TOrderTaxi::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal reduce2 = tOrderCrossCities.stream().filter(e -> tDriver.getId().equals(e.getPromotionDriverId())).map(TOrderCrossCity::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            driverRankVo.setMoney(reduce.add(reduce1).add(reduce2));
+            hashMaps.add(driverRankVo);
+        }
+//        hashMaps.stream().sorted(Comparator.comparing(e -> Integer.valueOf(e.get("userNum").toString())).reversed()).collect(Collectors.toList())
+        // hashMaps 通过userNUm 倒叙
+        List<DriverRankVo> collect = hashMaps.stream().sorted(Comparator.comparing(DriverRankVo::getUserNum).reversed()).collect(Collectors.toList());
+        return collect;
+    }
+
+    @Override
+    public  ArrayList<HashMap<String, Object>> list2(Long driverId, String name) {
+        ArrayList<HashMap<String, Object>> hashMaps = new ArrayList<>();
+
+        Wrapper<TUser> gt = new EntityWrapper<TUser>().eq("bindDriverId", driverId).gt("bindExpireDate", new Date());
+        if (name != null && !"".equals(name)) {
+            gt.like("nickName", name);
+        }
+
+        // 获取所有获得司机收益的订单
+        List<TOrderPrivateCar> tOrderPrivateCars = orderPrivateCarService.selectList(new EntityWrapper<TOrderPrivateCar>().eq("promotionDriverId",driverId).isNotNull("successTime"));
+        List<TOrderTaxi> tOrderTaxis = orderTaxiService.selectList(new EntityWrapper<TOrderTaxi>().eq("promotionDriverId",driverId).isNotNull("successTime"));
+        List<TOrderCrossCity> tOrderCrossCities = orderCrossCityService.selectList(new EntityWrapper<TOrderCrossCity>().eq("promotionDriverId",driverId).isNotNull("successTime"));
+
+        // 找出绑定这个司机的用户
+        List<TUser> tUsers = userService.selectList(gt);
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        for (TUser tUser : tUsers) {
+            HashMap<String, Object> map = new HashMap<>();
+            map.put("userId", tUser.getId());
+            map.put("userName", tUser.getNickName());
+            map.put("userPhone", tUser.getPhone());
+            map.put("bindDate",simpleDateFormat.format( tUser.getBindDate()));
+            map.put("bindExpireDate",simpleDateFormat.format( tUser.getBindExpireDate()));
+            BigDecimal reduce = tOrderPrivateCars.stream().filter(e -> e.getUserId().equals(tUser.getId())).map(TOrderPrivateCar::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal reduce1 = tOrderTaxis.stream().filter(e -> e.getUserId().equals(tUser.getId())).map(TOrderTaxi::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal reduce2 = tOrderCrossCities.stream().filter(e -> e.getUserId().equals(tUser.getId())).map(TOrderCrossCity::getPromotionMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
+            map.put("money", reduce.add(reduce1).add(reduce2));
+            hashMaps.add( map);
+        }
+        return hashMaps;
+    }
+}
diff --git a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java
index 15648ff..6373e9d 100644
--- a/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java
+++ b/ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java
@@ -113,4 +113,14 @@
     public List<Map<String, Object>> getSurcharge(Object id, Integer orderType) {
         return this.baseMapper.getSurcharge(id,orderType);
     }
+
+    @Override
+    public List<Map<String, Object>> promotionInfo(Page<Map<String, Object>> page, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId) {
+        return this.baseMapper.promotionInfo(page, beginTime, endTime, orderNum, userName, name, driverName, roleType, objectId);
+    }
+
+    @Override
+    public List<Map<String, Object>> promotionInfoExport(Object o, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId) {
+        return this.baseMapper.promotionInfoExport(beginTime, endTime, orderNum, userName, name, driverName, roleType, objectId);
+    }
 }
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity.html
new file mode 100644
index 0000000..323426c
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity.html
@@ -0,0 +1,53 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>管理</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="活动名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="status" name="状态" >
+                                <option value="">全部</option>
+                                <!--                                    <option value="1">APP下单</option>-->
+                                <option value="1">已开启</option>
+                                <option value="2">暂停</option>
+                                <!--                                    <option value="4">司机下单</option>-->
+                                <option value="3">未开启</option>
+                                <!--                                    <option value="6">道行龙城下单</option>-->
+                            </#SelectCon>
+                        </div>
+                            <div class="col-sm-3">
+                                <#button name="重置" icon="" clickFun="TDriverPromotionActivity.research()"/>
+                                <#button name="搜索" icon="" clickFun="TDriverPromotionActivity.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TDriverPromotionActivityTableToolbar" role="group">
+                                <#button name="添加" icon="fa-plus" clickFun="TDriverPromotionActivity.openAddTDriverPromotionActivity()"/>
+                                <#button name="暂停/开启" icon="fa-edit" clickFun="TDriverPromotionActivity.startOrStop()" space="true"/>
+                        </div>
+                        <#table id="TDriverPromotionActivityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+
+@}
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivityUser.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivityUser.html
new file mode 100644
index 0000000..2d589a3
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivityUser.html
@@ -0,0 +1,40 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>司机推广下级用户</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <input type="hidden" id="driverId" value="${driverId}"/>
+                    <div class="col-sm-12">
+                        <div class="row">
+
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="用户姓名" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="重置" icon="" clickFun="TDriverPromotionActivity.research()"/>
+                                <#button name="搜索" icon="" clickFun="TDriverPromotionActivity.search()"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TDriverPromotionActivityTableToolbar" role="group">
+                            <#button name="导出Excel" icon="" clickFun="TDriverPromotionActivity.exportExcel()" space="true"/>
+                        </div>
+                        <#table id="TDriverPromotionActivityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+</script>
+
+@}
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_add.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_add.html
new file mode 100644
index 0000000..f4cdd3e
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_add.html
@@ -0,0 +1,236 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+
+            <div class="row">
+                <div class="col-sm-4">
+                    <#input id="activityTitle" name="推广活动标题"/>
+                </div>
+            </div>
+
+            <div class="row" style="margin-left: -24px">
+                <label class="col-sm-1 control-label">关联业务:</label>
+                <div class="col-sm-3">
+                    <label class="checkbox-inline">
+                        <input type="checkbox" name="bizType" value="1"> 专车
+                    </label>
+                    <label class="checkbox-inline">
+                        <input type="checkbox" name="bizType" value="2"> 出租车
+                    </label>
+                    <label class="checkbox-inline">
+                        <input type="checkbox" name="bizType" value="3"> 城际
+                    </label>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 10px">
+                <label class="col-sm-1 control-label">活动区域:</label>
+                <div class="col-sm-2">
+                    <select class="form-control" id="province" onchange="provinceChange(this)">
+                        <option value="">选择省</option>
+                        @for(obj in provinceList){
+                        <option value="${obj.code}">${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+                <div class="col-sm-2">
+                    <select class="form-control" id="city" onchange="cityChage(this)">
+                        <option value="">选择市</option>
+                    </select>
+                </div>
+                <div class="col-sm-2">
+                    <select class="form-control" id="area">
+                        <option value="">选择区</option>
+                    </select>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 10px">
+                <div class="col-sm-3">
+                <#input id="time" name="活动时间" isTime="false"/>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col-sm-3">
+                    <#input id="commissionRatio" name="抽佣比例" />
+                </div>
+            </div>
+            <div class="form-group">
+                <div class="col-sm-3">
+                    <#input id="bindingDays" name="绑定有效期" />
+                </div>
+            </div>
+            <div class="form-group">
+                <div class="col-sm-3">
+                    <label style="font-weight:700">推广活动说明:</label>
+
+                    <div class="tab-content">
+                        <div id="tab-1" class="tab-pane active">
+                            <div class="panel-body">
+                                <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;"></textarea>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+
+
+
+
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TDriverPromotionActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js"></script>
+<script>
+    function addSubmit() {
+        var activityTitle = $("#activityTitle").val();
+        var bizTypes = [];
+        $('input[name="bizType"]:checked').each(function() {
+            bizTypes.push($(this).val());
+        });
+        var bizTypeValue = bizTypes.join(',');
+
+        var province = $("#province").val();
+        var city = $("#city").val();
+        var area = $("#area").val();
+        var time = $("#time").val();
+        var commissionRatio = $("#commissionRatio").val();
+        var bindingDays = $("#bindingDays").val();
+        var content = editor_1.getContent();
+
+
+        console.log(activityTitle)
+        console.log(bizTypeValue)
+        console.log(province)
+        console.log(city)
+        console.log(area)
+        console.log(time)
+        console.log(commissionRatio)
+        console.log(bindingDays)
+        console.log(content)
+        if(activityTitle==null||activityTitle==''){
+            Feng.error("请填写活动标题");
+            return;
+        }
+        if(bizTypeValue==null||bizTypeValue==''){
+            Feng.error("请选择业务类型");
+            return;
+        }
+        if(province==null||province==''){
+            Feng.error("请选择活动区域");
+            return;
+        }
+        if(city==null||city==''){
+            Feng.error("请选择活动区域");
+            return;
+        }
+        if(area==null||area==''){
+            Feng.error("请选择活动区域");
+            return;
+        }
+        if(time==null||time==''){
+            Feng.error("请填写活动时间");
+            return;
+        }
+
+        if(commissionRatio==null||commissionRatio==''){
+            Feng.error("请填写抽佣比例");
+            return;
+        }
+        // 使用正则表达式验证 0-100 的整数
+        var commissionRatioReg = /^(?:[1-9]|[1-9][0-9]|100|0)$/;
+        if (!commissionRatioReg.test(commissionRatio)) {
+            Feng.error("抽佣比例必须是0-100之间的整数");
+            return;
+        }
+        if(bindingDays==null||bindingDays==''){
+            Feng.error("请填写绑定有效期");
+            return;
+        }
+        // 使用正则表达式验证大于0的整数
+        var bindingDaysReg = /^[1-9]\d*$/;
+        if (!bindingDaysReg.test(bindingDays)) {
+            Feng.error("绑定有效期必须是大于0的整数");
+            return;
+        }
+        if(content==null||content==''){
+            Feng.error("请填写活动说明");
+            return;
+        }
+
+        var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/add", function(data){
+            Feng.success("添加成功!");
+            TDriverPromotionActivityInfoDlg.close();
+            parent.TDriverPromotionActivity.table.refresh();
+        },function(data){
+            Feng.error("添加失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("activityTitle", activityTitle);
+        ajax.set("bizTypeValue", bizTypeValue);
+        ajax.set("province", province);
+        ajax.set("city", city);
+        ajax.set("area", area);
+        ajax.set("time", time);
+        ajax.set("commissionRatio", commissionRatio);
+        ajax.set("bindingDays", bindingDays);
+        ajax.set("content", content);
+        ajax.start();
+
+
+
+
+    }
+
+
+    var editor_1 = null;
+    $(function () {
+        //初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+    });
+    laydate.render({
+        elem: '#time'
+        ,range: true
+    });
+    function provinceChange(e) {
+        var provinceCode=$(e).val();
+        var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+            if(data!=null){
+                var content='<option value="">选择市</option>';
+                $.each(data, function(k,v) {
+                    content += "<option value='"+v.code+"'>"+v.name+"</option>";
+                });
+                $("#city").empty().append(content);
+                $("#area").empty().append('<option value="">选择区</option>');
+            }
+        });
+        ajax.set("code",provinceCode);
+        ajax.start();
+    }
+
+    function cityChage(e) {
+        var cityCode=$(e).val();
+        var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+            if(data!=null){
+                var content='<option value="">选择区</option>';
+                $.each(data, function(k,v) {
+                    content += "<option value='"+v.code+"'>"+v.name+"</option>";
+                });
+                $("#area").empty().append(content);
+            }
+        });
+        ajax.set("code",cityCode);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_detail.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_detail.html
new file mode 100644
index 0000000..902a54f
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_detail.html
@@ -0,0 +1,384 @@
+@layout("/common/_container.html"){
+<head>
+    <meta charset="UTF-8">
+    <title>处理异常订单</title>
+    <style>
+        body {
+            background: #888;
+            margin: 0;
+            padding: 0;
+        }
+
+        .container {
+            background: #fff;
+            margin: 20px auto;
+            padding: 20px 30px;
+            border-radius: 10px;
+            max-width: 98vw;
+            min-width: 1200px;
+        }
+
+        .title {
+            font-size: 20px;
+            font-weight: bold;
+            margin-bottom: 20px;
+        }
+
+        .order-table {
+            width: 100%;
+            border-collapse: collapse;
+            margin-bottom: 30px;
+        }
+
+        .order-table th,
+        .order-table td {
+            border: 1px solid #e0e0e0;
+            padding: 8px 6px;
+            text-align: center;
+            font-size: 13px;
+        }
+
+        .order-table th {
+            background: #f8f8f8;
+            font-weight: 600;
+        }
+
+        .section-title {
+            font-size: 16px;
+            font-weight: bold;
+            margin: 30px 0 10px 0;
+        }
+
+        .desc-row {
+            margin-bottom: 10px;
+        }
+
+        .desc-label {
+            font-weight: bold;
+            margin-right: 10px;
+        }
+
+        .img-list {
+            display: flex;
+            gap: 20px;
+            margin: 10px 0 20px 0;
+        }
+
+        .img-list img {
+            width: 120px;
+            height: 80px;
+            object-fit: cover;
+            border-radius: 6px;
+            border: 1px solid #ccc;
+        }
+
+        .order-link {
+            color: #1976d2;
+            text-decoration: underline;
+            cursor: pointer;
+        }
+
+        input[type="radio"] {
+            accent-color: #1976d2;
+            width: 18px;
+            height: 18px;
+            vertical-align: middle;
+            margin-right: 4px;
+        }
+
+        .radio-group label {
+            margin-right: 18px;
+            font-size: 15px;
+            cursor: pointer;
+        }
+
+        #duty-selector {
+            display: flex;
+            margin-bottom: 18px;
+            border: 1px solid #ccc;
+            border-radius: 4px;
+            overflow: hidden;
+            width: fit-content;
+        }
+
+
+        .duty-btn {
+            flex: 1 1 0;
+            padding: 12px 32px;
+            border: none;
+            background: #fff;
+            color: #222;
+            font-size: 16px;
+            cursor: pointer;
+            outline: none;
+            border-right: 1px solid #ccc;
+            transition: background 0.2s, color 0.2s;
+            height: 62px;
+            line-height: 24px;
+        }
+
+        .duty-btn:last-child {
+            border-right: none;
+        }
+
+        .duty-btn.active {
+            background: #1976d2;
+            color: #fff;
+            font-weight: bold;
+        }
+
+        .action-btn {
+            min-width: 140px;
+            height: 48px;
+            background: #1976d2;
+            color: #fff;
+            border: none;
+            border-radius: 5px;
+            font-size: 16px;
+            font-weight: bold;
+            margin-right: 18px;
+            cursor: pointer;
+            transition: background 0.2s, box-shadow 0.2s;
+            box-shadow: 0 2px 6px rgba(25, 118, 210, 0.08);
+        }
+
+        .action-btn:last-child {
+            margin-right: 0;
+        }
+
+        .action-btn:hover {
+            background: #1565c0;
+        }
+
+        #action-btns {
+            margin-top: 32px;
+            display: flex;
+            align-items: center;
+        }
+    </style>
+</head>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" value="${item.id!}"/>
+
+            <div id="duty-selector">
+                <button type="button" class="duty-btn active" data-type="platformAll">活动基础信息</button>
+                <button type="button" class="duty-btn" data-type="driverAll">推广情况</button>
+            </div>
+            <div id="s1">
+                <div class="row">
+                    <div class="col-sm-4">
+                        <#input id="activityTitle" name="推广活动标题" value="${item.activityTitle}"/>
+                    </div>
+                </div>
+
+                <div class="row" style="margin-left: -24px">
+                    <label class="col-sm-1 control-label">关联业务:</label>
+                    <div class="col-sm-3">
+                        <label class="checkbox-inline">
+                            <input type="checkbox" name="bizType" value="1"> 专车
+                        </label>
+                        <label class="checkbox-inline">
+                            <input type="checkbox" name="bizType" value="2"> 出租车
+                        </label>
+                        <label class="checkbox-inline">
+                            <input type="checkbox" name="bizType" value="3"> 城际
+                        </label>
+                    </div>
+                </div>
+
+                <div class="row" style="margin-top: 10px">
+                    <label class="col-sm-1 control-label">活动区域:</label>
+                    <div class="col-sm-2">
+                        <select class="form-control" id="province" onchange="provinceChange(this)">
+                            <option value="">选择省</option>
+                            @for(obj in provinceList){
+                            <option value="${obj.code}" ${obj.code== item.provinceCode ?
+                            'selected=selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                    <div class="col-sm-2">
+                        <select class="form-control" id="city" onchange="cityChage(this)">
+                            <option value="">选择市</option>
+                            @for(obj in cityList){
+                            <option value="${obj.code}" ${obj.code== item.cityCode ?
+                            'selected=selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                    <div class="col-sm-2">
+                        <select class="form-control" id="area">
+                            <option value="">选择区</option>
+                            @for(obj in areaList){
+                            <option value="${obj.code}" ${obj.code== item.districtCode ?
+                            'selected=selected' : ''}>${obj.name}</option>
+                            @}
+                        </select>
+                    </div>
+                </div>
+
+                <div class="row" style="margin-top: 10px">
+                    <div class="col-sm-3">
+                        <#input id="time" name="活动时间" isTime="false"/>
+                    </div>
+                </div>
+
+                <div class="row">
+                    <div class="col-sm-3">
+                        <#input id="commissionRatio" name="抽佣比例" />
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-3">
+                        <#input id="bindingDays" name="绑定有效期" />
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-3">
+                        <label style="font-weight:700">推广活动说明:</label>
+
+                        <div class="tab-content">
+                            <div id="tab-1" class="tab-pane active">
+                                <div class="panel-body">
+                                    <textarea id="editor_1" type="text/plain"
+                                              style="width:1200px;height:400px;"></textarea>
+                                </div>
+                            </div>
+
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+
+        <div id="s2">
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#NameCon id="driverName" name="司机姓名" />
+                            </div>
+
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="TDriverPromotionActivity.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="TDriverPromotionActivity.resetSearch()"
+                                space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="TOrderPrivateCarTableToolbar" role="group">
+                            <#button name="导出Excel" icon="" clickFun="TDriverPromotionActivity.exportExcel()" space="true"/>
+                        </div>
+                        <#table id="TDriverPromotionActivityTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+</div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js"></script>
+<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js"></script>
+<script>
+
+
+    // 在现有的 script 标签内添加以下代码
+    $(document).ready(function () {
+        // 处理 duty-selector 按钮点击事件
+        $('#duty-selector .duty-btn').on('click', function () {
+            // 移除所有按钮的 active 类
+            $('#duty-selector .duty-btn').removeClass('active');
+            // 为当前点击的按钮添加 active 类
+            $(this).addClass('active');
+
+            // 可以根据 data-type 值执行不同的操作
+            var selectedType = $(this).data('type');
+            if (selectedType === 'platformAll') {
+                // 处理活动基础信息选中逻辑
+                console.log('活动基础信息被选中');
+                $("#s1").show();
+                $("#s2").hide();
+            } else if (selectedType === 'driverAll') {
+                // 处理推广情况选中逻辑
+                console.log('推广情况被选中');
+                $("#s1").hide();
+                $("#s2").show();
+            }
+        });
+    });
+    $(function () {
+        $("#s1").show();
+        $("#s2").hide();
+
+        // 初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+
+        // 初始化活动时间
+        laydate.render({
+            elem: '#time',
+            range: true
+        });
+
+        // 回显关联业务
+        var bizTypeStr = "${item.bizType!}"; // 获取业务类型字符串
+        if (bizTypeStr) {
+            var bizTypes = bizTypeStr.split(',');
+            $('input[name="bizType"]').each(function () {
+                if (bizTypes.indexOf($(this).val()) !== -1) {
+                    $(this).prop('checked', true);
+                }
+            });
+        }
+
+        // 回显活动时间
+        $("#time").val("${time!}");
+
+        // 回显抽佣比例和绑定有效期
+        $("#commissionRatio").val("${item.commissionRatio!}");
+        $("#bindingDays").val("${item.bindingDays!}");
+
+        // 回显活动说明
+        setTimeout(function () {
+            editor_1.ready(function () {
+                editor_1.setContent('${item.activityDesc!}');
+            });
+        }, 100);
+    });
+
+
+    function provinceChange(e) {
+        var provinceCode = $(e).val();
+        var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function (data) {
+            if (data != null) {
+                var content = '<option value="">选择市</option>';
+                $.each(data, function (k, v) {
+                    content += "<option value='" + v.code + "'>" + v.name + "</option>";
+                });
+                $("#city").empty().append(content);
+                $("#area").empty().append('<option value="">选择区</option>');
+            }
+        });
+        ajax.set("code", provinceCode);
+        ajax.start();
+    }
+
+    function cityChage(e) {
+        var cityCode = $(e).val();
+        var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function (data) {
+            if (data != null) {
+                var content = '<option value="">选择区</option>';
+                $.each(data, function (k, v) {
+                    content += "<option value='" + v.code + "'>" + v.name + "</option>";
+                });
+                $("#area").empty().append(content);
+            }
+        });
+        ajax.set("code", cityCode);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_edit.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_edit.html
new file mode 100644
index 0000000..1592838
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity_edit.html
@@ -0,0 +1,268 @@
+@layout("/common/_container.html"){
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="form-horizontal">
+            <input type="hidden" id="id" value="${item.id!}"/>
+            <div class="row">
+                <div class="col-sm-4">
+                    <#input id="activityTitle" name="推广活动标题" value="${item.activityTitle}"/>
+                </div>
+            </div>
+
+            <div class="row" style="margin-left: -24px">
+                <label class="col-sm-1 control-label">关联业务:</label>
+                <div class="col-sm-3">
+                    <label class="checkbox-inline">
+                        <input type="checkbox" name="bizType" value="1"> 专车
+                    </label>
+                    <label class="checkbox-inline">
+                        <input type="checkbox" name="bizType" value="2"> 出租车
+                    </label>
+                    <label class="checkbox-inline">
+                        <input type="checkbox" name="bizType" value="3"> 城际
+                    </label>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 10px">
+                <label class="col-sm-1 control-label">活动区域:</label>
+                <div class="col-sm-2">
+                    <select class="form-control" id="province" onchange="provinceChange(this)">
+                        <option value="">选择省</option>
+                        @for(obj in provinceList){
+                        <option value="${obj.code}" ${obj.code == item.provinceCode ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+                <div class="col-sm-2">
+                    <select class="form-control" id="city" onchange="cityChage(this)">
+                        <option value="">选择市</option>
+                        @for(obj in cityList){
+                        <option value="${obj.code}" ${obj.code == item.cityCode ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+                <div class="col-sm-2">
+                    <select class="form-control" id="area">
+                        <option value="">选择区</option>
+                        @for(obj in areaList){
+                        <option value="${obj.code}" ${obj.code == item.districtCode ? 'selected=selected' : ''}>${obj.name}</option>
+                        @}
+                    </select>
+                </div>
+            </div>
+
+            <div class="row" style="margin-top: 10px">
+                <div class="col-sm-3">
+                    <#input id="time" name="活动时间" isTime="false"/>
+                </div>
+            </div>
+
+            <div class="row">
+                <div class="col-sm-3">
+                    <#input id="commissionRatio" name="抽佣比例" />
+                </div>
+            </div>
+            <div class="form-group">
+                <div class="col-sm-3">
+                    <#input id="bindingDays" name="绑定有效期" />
+                </div>
+            </div>
+            <div class="form-group">
+                <div class="col-sm-3">
+                    <label style="font-weight:700">推广活动说明:</label>
+
+                    <div class="tab-content">
+                        <div id="tab-1" class="tab-pane active">
+                            <div class="panel-body">
+                                <textarea id="editor_1" type="text/plain" style="width:1200px;height:400px;"></textarea>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TDriverPromotionActivityInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js"></script>
+<script>
+    $(function() {
+        // 初始化编辑器
+        editor_1 = UE.getEditor('editor_1');
+
+        // 初始化活动时间
+        laydate.render({
+            elem: '#time',
+            range: true
+        });
+
+        // 回显关联业务
+        var bizTypeStr = "${item.bizType!}"; // 获取业务类型字符串
+        if (bizTypeStr) {
+            var bizTypes = bizTypeStr.split(',');
+            $('input[name="bizType"]').each(function() {
+                if (bizTypes.indexOf($(this).val()) !== -1) {
+                    $(this).prop('checked', true);
+                }
+            });
+        }
+
+
+
+
+        // 回显活动时间
+        $("#time").val("${time!}");
+
+        // 回显抽佣比例和绑定有效期
+        $("#commissionRatio").val("${item.commissionRatio!}");
+        $("#bindingDays").val("${item.bindingDays!}");
+
+        // 回显活动说明
+        setTimeout(function() {
+            editor_1.ready(function() {
+                editor_1.setContent('${item.activityDesc!}');
+            });
+        }, 100);
+    });
+
+    function editSubmit() {
+            var activityTitle = $("#activityTitle").val();
+            var bizTypes = [];
+            $('input[name="bizType"]:checked').each(function() {
+                bizTypes.push($(this).val());
+            });
+            var bizTypeValue = bizTypes.join(',');
+
+            var province = $("#province").val();
+            var city = $("#city").val();
+            var area = $("#area").val();
+            var time = $("#time").val();
+            var id = $("#id").val();
+            var commissionRatio = $("#commissionRatio").val();
+            var bindingDays = $("#bindingDays").val();
+            var content = editor_1.getContent();
+
+
+
+            console.log(activityTitle)
+            console.log(bizTypeValue)
+            console.log(province)
+            console.log(city)
+            console.log(area)
+            console.log(time)
+            console.log(commissionRatio)
+            console.log(bindingDays)
+            console.log(content)
+            if(activityTitle==null||activityTitle==''){
+                Feng.error("请填写活动标题");
+                return;
+            }
+            if(bizTypeValue==null||bizTypeValue==''){
+                Feng.error("请选择业务类型");
+                return;
+            }
+            if(province==null||province==''){
+                Feng.error("请选择活动区域");
+                return;
+            }
+            if(city==null||city==''){
+                Feng.error("请选择活动区域");
+                return;
+            }
+            if(area==null||area==''){
+                Feng.error("请选择活动区域");
+                return;
+            }
+            if(time==null||time==''){
+                Feng.error("请填写活动时间");
+                return;
+            }
+
+            if(commissionRatio==null||commissionRatio==''){
+                Feng.error("请填写抽佣比例");
+                return;
+            }
+            // 使用正则表达式验证 0-100 的整数
+            var commissionRatioReg = /^(?:[1-9]|[1-9][0-9]|100|0)$/;
+            if (!commissionRatioReg.test(commissionRatio)) {
+                Feng.error("抽佣比例必须是0-100之间的整数");
+                return;
+            }
+            if(bindingDays==null||bindingDays==''){
+                Feng.error("请填写绑定有效期");
+                return;
+            }
+            // 使用正则表达式验证大于0的整数
+            var bindingDaysReg = /^[1-9]\d*$/;
+            if (!bindingDaysReg.test(bindingDays)) {
+                Feng.error("绑定有效期必须是大于0的整数");
+                return;
+            }
+            if(content==null||content==''){
+                Feng.error("请填写活动说明");
+                return;
+            }
+
+            var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/update", function(data){
+                Feng.success("编辑成功!");
+                TDriverPromotionActivityInfoDlg.close();
+                parent.TDriverPromotionActivity.table.refresh();
+            },function(data){
+                Feng.error("编辑失败!" + data.responseJSON.message + "!");
+            });
+            ajax.set("id", id);
+            ajax.set("activityTitle", activityTitle);
+            ajax.set("bizTypeValue", bizTypeValue);
+            ajax.set("province", province);
+            ajax.set("city", city);
+            ajax.set("area", area);
+            ajax.set("time", time);
+            ajax.set("commissionRatio", commissionRatio);
+            ajax.set("bindingDays", bindingDays);
+            ajax.set("content", content);
+            ajax.start();
+
+
+    }
+
+
+    function provinceChange(e) {
+        var provinceCode=$(e).val();
+        var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+            if(data!=null){
+                var content='<option value="">选择市</option>';
+                $.each(data, function(k,v) {
+                    content += "<option value='"+v.code+"'>"+v.name+"</option>";
+                });
+                $("#city").empty().append(content);
+                $("#area").empty().append('<option value="">选择区</option>');
+            }
+        });
+        ajax.set("code",provinceCode);
+        ajax.start();
+    }
+
+    function cityChage(e) {
+        var cityCode=$(e).val();
+        var ajax = new $ax(Feng.ctxPath + "/tCompany/change", function(data){
+            if(data!=null){
+                var content='<option value="">选择区</option>';
+                $.each(data, function(k,v) {
+                    content += "<option value='"+v.code+"'>"+v.name+"</option>";
+                });
+                $("#area").empty().append(content);
+            }
+        });
+        ajax.set("code",cityCode);
+        ajax.start();
+    }
+</script>
+@}
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html
new file mode 100644
index 0000000..8027935
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html
@@ -0,0 +1,121 @@
+@layout("/common/_container.html"){
+<div class="row">
+    <div class="col-sm-12">
+        <div class="ibox float-e-margins">
+            <div class="ibox-title">
+                <h5>推广收益明细</h5>
+            </div>
+            <div class="ibox-content">
+                <div class="row row-lg">
+                    <div class="col-sm-12">
+                        <div class="row">
+                            <div class="col-sm-3">
+                                <#TimeCon id="insertTime" name="收益时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="name" name="活动名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="driverName" name="司机名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="userName" name="用户名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="orderNum" name="订单编号" />
+                            </div>
+
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="resetSearch()" space="true"/>
+                            </div>
+                        </div>
+
+                        <div class="form-group">
+                            <div class="row">
+                                <div class="col-sm-6">
+                                    <div class="stat-card" style=" border: none; padding: 20px; border-radius: 10px;  margin-bottom: 15px; box-shadow: 0 4px 15px rgba(0,0,0,0.1);">
+                                        <div class="stat-content">
+                                            <div class="stat-number" style="font-size: 28px; font-weight: bold; margin-bottom: 5px;" id="money">
+                                                ${money}
+                                            </div>
+                                            <div class="stat-label" style="font-size: 14px; opacity: 0.9;">
+                                                合计推广收益金额
+                                            </div>
+                                        </div>
+                                        <div style="clear: both;"></div>
+                                    </div>
+                                </div>
+                                <div class="col-sm-6">
+                                    <div class="stat-card" style=" border: none; padding: 20px; border-radius: 10px;  margin-bottom: 15px; box-shadow: 0 4px 15px rgba(0,0,0,0.1);">
+                                        <div class="stat-content">
+                                            <div class="stat-number" style="font-size: 28px; font-weight: bold; margin-bottom: 5px;" id="size">
+                                                ${size}
+                                            </div>
+                                            <div class="stat-label" style="font-size: 14px; opacity: 0.9;">
+                                                合计推广收益笔数
+                                            </div>
+                                        </div>
+                                        <div style="clear: both;"></div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="hidden-xs" id="TOrderPrivateCarTableToolbar" role="group">
+                            <#button name="导出Excel" icon="" clickFun="TAbnormalOrder.exportExcel()" space="true"/>
+                        </div>
+                        <#table id="TOrderPrivateCarTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/tPromotionOrderCar/tPromotionOrder.js"></script>
+<script>
+    laydate.render({
+        elem: '#insertTime'
+        ,range: true
+    });
+
+    function search() {
+
+        let insertTime = $('#insertTime').val();
+        let name = $('#name').val();
+        let driverName = $('#driverName').val();
+        let userName = $('#userName').val();
+        let orderNum = $('#orderNum').val();
+
+
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/promotionInfo/list1", function(data){
+            console.log(data)
+            $("#money").text(data.money)
+            $("#size").text(data.size)
+        },function(data){
+        });
+        ajax.set("insertTime",insertTime);
+        ajax.set("name",name);
+        ajax.set("driverName",driverName);
+        ajax.set("userName",userName);
+        ajax.set("orderNum",orderNum);
+        ajax.start();
+        TAbnormalOrder.search()
+    }
+
+
+    function resetSearch() {
+
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/promotionInfo/list1", function(data){
+            console.log(data)
+            $("#money").text(data.money)
+            $("#size").text(data.size)
+        },function(data){
+        });
+        ajax.start();
+        TAbnormalOrder.resetSearch()
+    }
+</script>
+@}
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html
index 5c41fc9..2188e2f 100644
--- a/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html
@@ -43,7 +43,7 @@
                     <div>
                         <div style="float: left;">
                             <label class="lab checked" onclick="checkedLable(this)" tag="pushOrderSettings">推单设置</label>
-                            <label class="lab" onclick="checkedLable(this)" tag="driverPayDays">司机分账账期设置</label>
+<!--                            <label class="lab" onclick="checkedLable(this)" tag="driverPayDays">司机分账账期设置</label>-->
                             <label class="lab" onclick="checkedLable(this)" tag="cancelOrderSettings">取消订单设置</label>
                             <label class="lab" onclick="checkedLable(this)" tag="cancelTheReservationOrderSetting">预约单取消设置</label>
                             <label class="lab" onclick="checkedLable(this)" tag="spellOrderSetting">拼单派单设置</label>
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js
new file mode 100644
index 0000000..0dac890
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js
@@ -0,0 +1,209 @@
+/**
+ * 管理初始化
+ */
+var TDriverPromotionActivity = {
+    id: "TDriverPromotionActivityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TDriverPromotionActivity.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '推广活动ID', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '添加时间', field: 'createTime', visible: true, align: 'center', valign: 'middle'},
+        {
+            title: '活动区域-省', field: 'province', visible: true, align: 'center', valign: 'middle',
+
+            formatter: function (value, row, index) {
+                if (row.province != null && row.city != null && row.district != null) {
+                    return row.province + "-" + row.city + "-" + row.district;
+                }
+                if (row.province != null && row.city != null) {
+                    return row.province + "-" + row.city;
+                }
+                if (row.province != null) {
+                    return row.province;
+                }
+
+            }
+        },
+        {title: '活动名称', field: 'activityTitle', visible: true, align: 'center', valign: 'middle'},
+        {
+            title: '活动时间', field: 'startTime', visible: true, align: 'center', valign: 'middle',
+
+            formatter: function (value, row, index) {
+                return row.startTime + " - " + row.endTime;
+            }
+
+        },
+        {title: '当前状态', field: 'status', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+            return {1:"已开启",2:"暂停",3:"未开启",4:"已结束"}[value];
+            }
+        },
+        {
+            title: '操作', field: 'opt', visible: true, align: 'left', valign: 'middle', width: "10%",
+            formatter: function (value, row) {
+                if(row.status==1){
+                    var btn = [];
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.stop(' + row.id + ')" style="color: #0e9aef">暂停</a>&nbsp;&nbsp;';
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')" style="color: #0e9aef">详情</a>&nbsp;&nbsp;';
+                    return btn;
+                }
+                if(row.status==2){
+                    var btn = [];
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.start(' + row.id + ')" style="color: #0e9aef">开启</a>&nbsp;&nbsp;';
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')" style="color: #0e9aef">详情</a>&nbsp;&nbsp;';
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.update(' + row.id + ')" style="color: #0e9aef">编辑</a>&nbsp;&nbsp;';
+                    return btn;
+                }
+                if(row.status==3){
+                    var btn = [];
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')" style="color: #0e9aef">详情</a>&nbsp;&nbsp;';
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.update(' + row.id + ')" style="color: #0e9aef">编辑</a>&nbsp;&nbsp;';
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.delete(' + row.id + ')" style="color: #0e9aef">删除</a>&nbsp;&nbsp;';
+                    return btn;
+                }
+                if(row.status==4){
+                    var btn = [];
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')">详情</a>&nbsp;&nbsp;';
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.delete(' + row.id + ')">删除</a>&nbsp;&nbsp;';
+                    return btn;
+                }
+
+            }
+        }
+
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TDriverPromotionActivity.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        TDriverPromotionActivity.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TDriverPromotionActivity.openAddTDriverPromotionActivity = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_add'
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 打开查看详情
+ */
+TDriverPromotionActivity.update = function (e) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_update/' + e
+        });
+        this.layerIndex = index;
+};
+TDriverPromotionActivity.info = function (e) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_info/' + e
+        });
+        this.layerIndex = index;
+};
+
+/**
+ * 删除
+ */
+TDriverPromotionActivity.delete = function (e) {
+        var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/delete", function (data) {
+            Feng.success("删除成功!");
+            TDriverPromotionActivity.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tDriverPromotionActivityId", e);
+        ajax.start();
+};
+TDriverPromotionActivity.stop = function (e) {
+        var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/stop", function (data) {
+            Feng.success("暂停成功!");
+            TDriverPromotionActivity.table.refresh();
+        }, function (data) {
+            Feng.error("暂停失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id", e);
+        ajax.start();
+};
+
+TDriverPromotionActivity.start = function (e) {
+    var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/start", function (data) {
+        Feng.success("暂停成功!");
+        TDriverPromotionActivity.table.refresh();
+    }, function (data) {
+        Feng.error("暂停失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id", e);
+    ajax.start();
+};
+
+
+TDriverPromotionActivity.startOrStop = function () {
+    if (this.check()) {
+        if (TDriverPromotionActivity.seItem.status == 1) {
+            TDriverPromotionActivity.stop(TDriverPromotionActivity.seItem.id);
+        } else {
+            TDriverPromotionActivity.start(TDriverPromotionActivity.seItem.id);
+        }
+    }
+};
+
+/**
+ * 查询列表
+ */
+TDriverPromotionActivity.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['status'] = $("#status").val();
+    TDriverPromotionActivity.table.refresh({query: queryData});
+};
+TDriverPromotionActivity.research = function () {
+    $("#insertTime").val('');
+    $("#name").val('');
+    $("#status").val('');
+    TDriverPromotionActivity.search()
+};
+
+
+$(function () {
+    var defaultColunms = TDriverPromotionActivity.initColumn();
+    var table = new BSTable(TDriverPromotionActivity.id, "/tDriverPromotionActivity/list", defaultColunms);
+    table.setPaginationType("client");
+    TDriverPromotionActivity.table = table.init();
+});
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js
new file mode 100644
index 0000000..d8dd13b
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity1.js
@@ -0,0 +1,196 @@
+/**
+ * 管理初始化
+ */
+var TDriverPromotionActivity = {
+    id: "TDriverPromotionActivityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TDriverPromotionActivity.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '推广排名', field: 'sort', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                // 使用序号作为排名,index从0开始,所以需要+1
+                return index + 1;
+            }
+        },
+        {title: '司机Id', field: 'driverId', visible: false, align: 'center', valign: 'middle'},
+        {title: '司机姓名', field: 'driverName', visible: true, align: 'center', valign: 'middle'},
+        {title: '推广用户数量', field: 'userNum', visible: true, align: 'center', valign: 'middle'},
+        {title: '推广收益合计', field: 'money', visible: true, align: 'center', valign: 'middle',
+        },
+        {
+            title: '操作', field: 'opt', visible: true, align: 'left', valign: 'middle', width: "10%",
+            formatter: function (value, row) {
+                    var btn = [];
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.viewUser(' + row.driverId + ')" style="color: #0e9aef">查看下级用户</a>&nbsp;&nbsp;';
+                    btn += '<a href="javascript:void(0);" onclick="TDriverPromotionActivity.info(' + row.id + ')" style="color: #0e9aef">查看收益明细</a>&nbsp;&nbsp;';
+                    return btn;
+                }
+
+        }
+
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TDriverPromotionActivity.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        TDriverPromotionActivity.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TDriverPromotionActivity.openAddTDriverPromotionActivity = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_add'
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 打开查看详情
+ */
+TDriverPromotionActivity.viewUser = function (e) {
+    var index = layer.open({
+        type: 2,
+        title: '司机推广下级用户',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_viewUser/' + e
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 打开查看详情
+ */
+TDriverPromotionActivity.update = function (e) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_update/' + e
+        });
+        this.layerIndex = index;
+};
+TDriverPromotionActivity.info = function (e) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_info/' + e
+        });
+        this.layerIndex = index;
+};
+
+/**
+ * 删除
+ */
+TDriverPromotionActivity.delete = function (e) {
+        var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/delete", function (data) {
+            Feng.success("删除成功!");
+            TDriverPromotionActivity.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tDriverPromotionActivityId", e);
+        ajax.start();
+};
+TDriverPromotionActivity.stop = function (e) {
+        var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/stop", function (data) {
+            Feng.success("暂停成功!");
+            TDriverPromotionActivity.table.refresh();
+        }, function (data) {
+            Feng.error("暂停失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id", e);
+        ajax.start();
+};
+
+TDriverPromotionActivity.start = function (e) {
+    var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/start", function (data) {
+        Feng.success("暂停成功!");
+        TDriverPromotionActivity.table.refresh();
+    }, function (data) {
+        Feng.error("暂停失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id", e);
+    ajax.start();
+};
+
+
+TDriverPromotionActivity.startOrStop = function () {
+    if (this.check()) {
+        if (TDriverPromotionActivity.seItem.status == 1) {
+            TDriverPromotionActivity.stop(TDriverPromotionActivity.seItem.id);
+        } else {
+            TDriverPromotionActivity.start(TDriverPromotionActivity.seItem.id);
+        }
+    }
+};
+
+/**
+ * 查询列表
+ */
+TDriverPromotionActivity.search = function () {
+    var queryData = {};
+    queryData['driverName'] = $("#driverName").val();
+    queryData['id'] = $("#id").val();
+    TDriverPromotionActivity.table.refresh({query: queryData});
+};
+TDriverPromotionActivity.resetSearch = function () {
+    $("#driverName").val('');
+    TDriverPromotionActivity.search()
+};
+TDriverPromotionActivity.exportExcel = function () {
+    let p = "";
+    let id = $('#id').val();
+    let driverName = $('#driverName').val();
+    if(null != id && '' != id){
+        p += "id=" + id + "&";
+    }
+    if(null != driverName && '' != driverName){
+        p += "driverName=" + driverName + "&";
+    }
+    if('' != p){
+        p = "?" + p.substring(0, p.length - 1);
+    }
+    console.log('p['+p+']')
+    window.location.href = Feng.ctxPath + '/tDriverPromotionActivity/export' + p;
+};
+
+
+$(function () {
+    var defaultColunms = TDriverPromotionActivity.initColumn();
+    var table = new BSTable(TDriverPromotionActivity.id, "/tDriverPromotionActivity/list1", defaultColunms);
+    table.setPaginationType("client");
+    TDriverPromotionActivity.table = table.init();
+});
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js
new file mode 100644
index 0000000..366c9e0
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity2.js
@@ -0,0 +1,191 @@
+/**
+ * 管理初始化
+ */
+var TDriverPromotionActivity = {
+    id: "TDriverPromotionActivityTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TDriverPromotionActivity.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '序号', field: 'sort', visible: true, align: 'center', valign: 'middle',
+            formatter: function (value, row, index) {
+                // 使用序号作为排名,index从0开始,所以需要+1
+                return index + 1;
+            }
+        },
+        {title: '用户Id', field: 'userId', visible: true, align: 'center', valign: 'middle'},
+        {title: '用户昵称', field: 'userName', visible: true, align: 'center', valign: 'middle'},
+        {title: '用户手机号', field: 'userPhone', visible: true, align: 'center', valign: 'middle'},
+        {title: '绑定时间', field: 'bindDate', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '有效期至', field: 'bindExpireDate', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '产生收益合计', field: 'money', visible: true, align: 'center', valign: 'middle',
+        },
+
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TDriverPromotionActivity.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    } else {
+        TDriverPromotionActivity.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+TDriverPromotionActivity.openAddTDriverPromotionActivity = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_add'
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 打开查看详情
+ */
+TDriverPromotionActivity.viewUser = function (e) {
+    var index = layer.open({
+        type: 2,
+        title: '司机推广下级用户',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_viewUser/' + e
+    });
+    this.layerIndex = index;
+};
+
+
+/**
+ * 打开查看详情
+ */
+TDriverPromotionActivity.update = function (e) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_update/' + e
+        });
+        this.layerIndex = index;
+};
+TDriverPromotionActivity.info = function (e) {
+        var index = layer.open({
+            type: 2,
+            title: '编辑',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tDriverPromotionActivity/tDriverPromotionActivity_info/' + e
+        });
+        this.layerIndex = index;
+};
+
+/**
+ * 删除
+ */
+TDriverPromotionActivity.delete = function (e) {
+        var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/delete", function (data) {
+            Feng.success("删除成功!");
+            TDriverPromotionActivity.table.refresh();
+        }, function (data) {
+            Feng.error("删除失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("tDriverPromotionActivityId", e);
+        ajax.start();
+};
+TDriverPromotionActivity.stop = function (e) {
+        var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/stop", function (data) {
+            Feng.success("暂停成功!");
+            TDriverPromotionActivity.table.refresh();
+        }, function (data) {
+            Feng.error("暂停失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id", e);
+        ajax.start();
+};
+
+TDriverPromotionActivity.start = function (e) {
+    var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/start", function (data) {
+        Feng.success("暂停成功!");
+        TDriverPromotionActivity.table.refresh();
+    }, function (data) {
+        Feng.error("暂停失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id", e);
+    ajax.start();
+};
+
+
+TDriverPromotionActivity.startOrStop = function () {
+    if (this.check()) {
+        if (TDriverPromotionActivity.seItem.status == 1) {
+            TDriverPromotionActivity.stop(TDriverPromotionActivity.seItem.id);
+        } else {
+            TDriverPromotionActivity.start(TDriverPromotionActivity.seItem.id);
+        }
+    }
+};
+
+/**
+ * 查询列表
+ */
+TDriverPromotionActivity.search = function () {
+    var queryData = {};
+    queryData['name'] = $("#name").val();
+    queryData['driverId'] = $("#driverId").val();
+    TDriverPromotionActivity.table.refresh({query: queryData});
+};
+TDriverPromotionActivity.research = function () {
+    $("#name").val('');
+    TDriverPromotionActivity.search()
+};
+TDriverPromotionActivity.exportExcel = function () {
+    let p = "";
+    let name = $('#name').val();
+    let driverId = $('#driverId').val();
+    if(null != name && '' != name){
+        p += "name=" + name + "&";
+    }
+    if(null != driverId && '' != driverId){
+        p += "driverId=" + driverId + "&";
+    }
+    if('' != p){
+        p = "?" + p.substring(0, p.length - 1);
+    }
+    console.log('p['+p+']')
+    window.location.href = Feng.ctxPath + '/tDriverPromotionActivity/export1' + p;
+};
+
+
+$(function () {
+    var defaultColunms = TDriverPromotionActivity.initColumn();
+    var table = new BSTable(TDriverPromotionActivity.id, "/tDriverPromotionActivity/list2", defaultColunms);
+    table.setPaginationType("client");
+    TDriverPromotionActivity.table = table.init();
+    TDriverPromotionActivity.search()
+});
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js
new file mode 100644
index 0000000..4fded4e
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity_info.js
@@ -0,0 +1,110 @@
+/**
+ * 初始化详情对话框
+ */
+var TDriverPromotionActivityInfoDlg = {
+    tDriverPromotionActivityInfoData : {}
+};
+
+/**
+ * 清除数据
+ */
+TDriverPromotionActivityInfoDlg.clearData = function() {
+    this.tDriverPromotionActivityInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TDriverPromotionActivityInfoDlg.set = function(key, val) {
+    this.tDriverPromotionActivityInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TDriverPromotionActivityInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TDriverPromotionActivityInfoDlg.close = function() {
+    parent.layer.close(window.parent.TDriverPromotionActivity.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TDriverPromotionActivityInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('bizType')
+    .set('activityTitle')
+    .set('province')
+    .set('provinceCode')
+    .set('city')
+    .set('cityCode')
+    .set('district')
+    .set('districtCode')
+    .set('startTime')
+    .set('endTime')
+    .set('commissionRatio')
+    .set('bindingDays')
+    .set('activityDesc')
+    .set('status')
+    .set('creator')
+    .set('createTime')
+    .set('updateTime');
+}
+
+/**
+ * 提交添加
+ */
+TDriverPromotionActivityInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.TDriverPromotionActivity.table.refresh();
+        TDriverPromotionActivityInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tDriverPromotionActivityInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+TDriverPromotionActivityInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tDriverPromotionActivity/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.TDriverPromotionActivity.table.refresh();
+        TDriverPromotionActivityInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tDriverPromotionActivityInfoData);
+    ajax.start();
+}
+
+$(function() {
+
+});
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js
new file mode 100644
index 0000000..5fdbf49
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js
@@ -0,0 +1,312 @@
+/**
+ * 初始化快车订单详情对话框
+ */
+var TOrderPrivateCarInfoDlg = {
+    tOrderPrivateCarInfoData: {}
+};
+
+/**
+ * 清除数据
+ */
+TOrderPrivateCarInfoDlg.clearData = function () {
+    this.tOrderPrivateCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderPrivateCarInfoDlg.set = function (key, val) {
+    this.tOrderPrivateCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+TOrderPrivateCarInfoDlg.get = function (key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+TOrderPrivateCarInfoDlg.close = function () {
+    parent.layer.close(window.parent.TOrderPrivateCar.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+TOrderPrivateCarInfoDlg.collectData = function () {
+    this
+        .set('id')
+        .set('type')
+        .set('userId')
+        .set('driverId')
+        .set('carId')
+        .set('orderNum')
+        .set('placementLon')
+        .set('placementLat')
+        .set('placementAddress')
+        .set('startLon')
+        .set('startLat')
+        .set('endLon')
+        .set('startAddress')
+        .set('endLat')
+        .set('endAddress')
+        .set('boardingLon')
+        .set('boardingLat')
+        .set('boardingAddress')
+        .set('boardingTime')
+        .set('getoffLon')
+        .set('getoffLat')
+        .set('getoffAddress')
+        .set('getoffTime')
+        .set('mileage')
+        .set('payManner')
+        .set('payType')
+        .set('orderMoney')
+        .set('startMoney')
+        .set('mileageMoney')
+        .set('durationMoney')
+        .set('longDistanceMoney')
+        .set('parkMoney')
+        .set('roadTollMoney')
+        .set('redPacketMoney')
+        .set('couponMoney')
+        .set('redPacketId')
+        .set('couponId')
+        .set('discount')
+        .set('discountMoney')
+        .set('activityId')
+        .set('companyId')
+        .set('payMoney')
+        .set('substitute')
+        .set('passengers')
+        .set('passengersPhone')
+        .set('state')
+        .set('insertTime')
+        .set('travelTime')
+        .set('snatchOrderTime')
+        .set('setOutTime')
+        .set('arriveTime')
+        .set('startServiceTime')
+        .set('endServiceTime')
+        .set('orderType')
+        .set('orderSource')
+        .set('invoiceId')
+        .set('isReassign')
+        .set('reassignNotice')
+        .set('trackId')
+        .set('isDelete')
+        .set('oldState')
+        .set('telX')
+        .set('bindId')
+        .set('serverCarModelId');
+}
+
+/**
+ * 提交添加
+ */
+TOrderPrivateCarInfoDlg.addSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    if ($("#startAddress").val() === ""){
+        Feng.error("请输入起点");
+        return false;
+    }
+    if ($("#endAddress").val() === ""){
+        Feng.error("请输入终点");
+        return false;
+    }
+    if ($("#travelTime").val() === ""){
+        Feng.error("请选择用车时间");
+        return false;
+    }
+    if ($("#passengers").val() === ""){
+        Feng.error("请输入乘车人姓名");
+        return false;
+    }
+    if ($("#passengersPhone").val() === ""){
+        Feng.error("请输入乘车人手机号");
+        return false;
+    }
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/add", function (data) {
+        Feng.success("添加成功!");
+        window.parent.TOrderPrivateCar.table.refresh();
+        TOrderPrivateCarInfoDlg.close();
+    }, function (data) {
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderPrivateCarInfoData);
+    ajax.start();
+}
+TOrderPrivateCarInfoDlg.save = function (){
+
+        const selectedBtn = document.querySelector('.duty-btn.active');
+        const responsibilityTypeVal = reverseTypeMap[selectedBtn.dataset.type];
+        const remark = document.querySelector('textarea[name=handleRemark]').value;
+        // 取money
+        const money = document.querySelector('input[name=money]').value;
+        const type = document.querySelector('input[name=type]').value;
+        const orderNum = document.querySelector('input[name=orderNum]').value;
+
+        console.log(type,orderNum)
+
+        //提交信息
+        var ajax = new $ax(Feng.ctxPath + "/abnormal/save", function(data){
+            Feng.success("操作成功!");
+        },function(data){
+            Feng.error("操作失败!");
+        });
+        ajax.set("responsibilityTypeVal",responsibilityTypeVal);
+        ajax.set("remark",remark);
+        ajax.set("money",money);
+        ajax.set("type",type);
+        ajax.set("orderNum",orderNum);
+        ajax.start();
+
+}
+/**
+ * 提交修改
+ */
+TOrderPrivateCarInfoDlg.editSubmit = function () {
+
+    this.clearData();
+    this.collectData();
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/update", function (data) {
+        Feng.success("修改成功!");
+        window.parent.TOrderPrivateCar.table.refresh();
+        TOrderPrivateCarInfoDlg.close();
+    }, function (data) {
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set(this.tOrderPrivateCarInfoData);
+    ajax.start();
+}
+
+var map = new AMap.Map("container", {
+    resizeEnable: true,
+    zoom: 14
+});
+$(function () {
+    var type = $("#type").val();
+    if (type != 2) {
+        getTrajectory();
+    }
+});
+
+function getTrajectory() {
+    $.ajax({
+        url: Feng.ctxPath + '/tOrderPrivateCar/getOrderTrack',
+        type: 'POST',
+        data: {
+            orderDetailId: $("#id").val()
+        },
+        success: function (res) {
+            if (res.status == 200) {
+                var data = res.data;
+                if (data.length > 0) {
+                    orderTrack(data);
+                }
+                /*else{
+                                    Feng.error("当前订单没有轨迹");
+                                }*/
+            } else {
+                Feng.error(res.msg);
+            }
+        }
+    });
+}
+
+var marker, lineArr = [];
+
+function orderTrack(data) {
+    for (var i in data) {
+        var waypoints = [];
+        var lon = parseFloat(data[i].lon);
+        var lat = parseFloat(data[i].lat);
+        waypoints.push(lon);
+        waypoints.push(lat);
+        lineArr.push(waypoints);
+    }
+
+    marker = new AMap.Marker({
+        map: map,
+        position: lineArr[0],
+        icon: "https://webapi.amap.com/images/car.png",
+        offset: new AMap.Pixel(-26, -13),
+        autoRotation: true,
+        angle: -90,
+    });
+
+    // 绘制轨迹
+    var polyline = new AMap.Polyline({
+        map: map,
+        path: lineArr,
+        showDir: true,
+        strokeColor: "#28F",  //线颜色
+        // strokeOpacity: 1,     //线透明度
+        strokeWeight: 6,      //线宽
+        // strokeStyle: "solid"  //线样式
+    });
+
+    var passedPolyline = new AMap.Polyline({
+        map: map,
+        // path: lineArr,
+        strokeColor: "#AF5",  //线颜色
+        // strokeOpacity: 1,     //线透明度
+        strokeWeight: 6,      //线宽
+        // strokeStyle: "solid"  //线样式
+    });
+
+
+    marker.on('moving', function (e) {
+        passedPolyline.setPath(e.passedPath);
+    });
+
+    map.setFitView();
+}
+
+
+function startAnimation() {
+    marker.moveAlong(lineArr, 200);
+}
+
+function pauseAnimation() {
+    marker.pauseMove();
+}
+
+function resumeAnimation() {
+    marker.resumeMove();
+}
+
+function stopAnimation() {
+    marker.stopMove();
+}
+
+/**
+ * 选择起点
+ */
+TOrderPrivateCarInfoDlg.startAddress = function () {
+    $("#startAddressModel").show();
+};
+
+
+/**
+ * 选择终点
+ */
+TOrderPrivateCarInfoDlg.endAddress = function () {
+    $("#endAddressModel").show();
+};
diff --git a/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js
new file mode 100644
index 0000000..8aaf06f
--- /dev/null
+++ b/ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js
@@ -0,0 +1,219 @@
+/**
+ * 快车订单管理初始化
+ */
+var TAbnormalOrder = {
+    id: "TOrderPrivateCarTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TAbnormalOrder.initColumn = function () {
+    return [
+        {field: 'selectItem', radio: true},
+        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+        {title: '活动名称', field: 'name', visible: true, align: 'center', valign: 'middle',width:'8%',
+        },
+        {title: '司机名称', field: 'driverName', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '下级用户', field: 'userName', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '订单金额', field: 'money', visible: false, align: 'center', valign: 'middle'},
+        {title: '司机推广收益', field: 'promotionMoney', visible: true, align: 'center', valign: 'middle',
+        },
+        {title: '收益时间', field: 'successTime', visible: true, align: 'center', valign: 'middle',
+        }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+TAbnormalOrder.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        TAbnormalOrder.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 添加快车订单
+ */
+TAbnormalOrder.addOrder =function(){
+    var index = layer.open({
+        type: 2,
+        title: '添加快车订单',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/tOrderPrivateCar/tOrderPrivateCar_addOrder'
+    });
+    this.layerIndex = index;
+
+};
+
+/**
+ * 打开查看快车订单详情
+ */
+TAbnormalOrder.orderDetail = function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '异常订单详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/abnormal/tOrderPrivateCar_orderDetail?tOrderPrivateCarId=' + TAbnormalOrder.seItem.id+'&type='+$("#type").val()
+        });
+        this.layerIndex = index;
+    }
+};
+TAbnormalOrder.orderDetail1 = function () {
+    if (this.check()) {
+        let abnormalStatus = TAbnormalOrder.seItem.abnormalStatus
+        if(abnormalStatus==2){
+            Feng.info("此异常订单已处理")
+            return;
+        }
+        console.log(abnormalStatus)
+        var index = layer.open({
+            type: 2,
+            title: '异常订单详情',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/abnormal/tOrderPrivateCar_orderDetail1?tOrderPrivateCarId=' + TAbnormalOrder.seItem.id+'&type='+$("#type").val()
+        });
+        this.layerIndex = index;
+    }
+};
+
+
+/**
+ * 订单轨迹
+ */
+TAbnormalOrder.trajectory = function(){
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '快车订单轨迹',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/tOrderPrivateCar/tOrderPrivateCar_trajectory/' + TAbnormalOrder.seItem.id
+        });
+        this.layerIndex = index;
+    }
+}
+
+
+/**
+ * 删除快车订单
+ */
+TAbnormalOrder.deleteOrder = function () {
+    if (this.check()) {
+        var orderNum = TAbnormalOrder.seItem.orderNum;
+        if (orderNum == "" || orderNum == null || orderNum == undefined) {
+            orderNum = "该订单";
+        } else {
+            orderNum = "【" + orderNum + "】";
+        }
+        if (TAbnormalOrder.seItem.state != 10) {
+            swal("删除失败", "【已取消】状态下才能执行此操作", "warning");
+            return;
+        }
+        swal({
+            title: "您是否确认删除" + orderNum + "?",
+            text: "请谨慎操作,删除后数据无法恢复!",
+            type: "warning",
+            showCancelButton: true,
+            confirmButtonColor: "#DD6B55",
+            confirmButtonText: "删除",
+            closeOnConfirm: false
+        }, function () {
+            var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/delete", function (data) {
+                swal("删除成功", "您已经删除了" + orderNum + "。", "success");
+                TAbnormalOrder.table.refresh();
+            }, function (data) {
+                swal("删除失败", data.responseJSON.message + "!", "warning");
+            });
+            ajax.set("tOrderPrivateCarId", TAbnormalOrder.seItem.id);
+            ajax.start();
+        });
+    }
+};
+
+
+
+
+
+/**
+ * 查询快车订单列表
+ */
+TAbnormalOrder.search = function () {
+    var queryData = {};
+    queryData['insertTime'] = $("#insertTime").val();
+    queryData['name'] = $("#name").val();
+    queryData['driverName'] = $("#driverName").val();
+    queryData['userName'] = $("#userName").val();
+    queryData['orderNum'] = $("#orderNum").val();
+    TAbnormalOrder.table.refresh({query: queryData});
+};
+
+TAbnormalOrder.exportExcel=function (){
+    let p = "";
+    let insertTime = $('#insertTime').val();
+    let name = $('#name').val();
+    let driverName = $('#driverName').val();
+    let userName = $('#userName').val();
+    let orderNum = $('#orderNum').val();
+    if(null != insertTime && '' != insertTime){
+        p += "insertTime=" + insertTime + "&";
+    }
+    if(null != name && '' != name){
+        p += "name=" + name + "&";
+    }
+    if(null != driverName && '' != driverName){
+        p += "driverName=" + driverName + "&";
+    }
+    if(null != userName && '' != userName){
+        p += "userName=" + userName + "&" ;
+    }
+    if(null != orderNum && '' != orderNum){
+        p += "orderNum=" + orderNum + "&" ;
+    }
+    if('' != p){
+        p = "?" + p.substring(0, p.length - 1);
+    }
+    console.log('p['+p+']')
+    window.location.href = Feng.ctxPath + '/promotionInfo/export' + p;
+}
+
+
+
+TAbnormalOrder.resetSearch = function () {
+    $("#insertTime").val("");
+    $("#name").val("");
+    $("#driverName").val("");
+    $("#userName").val("");
+    $("#orderNum").val("");
+    TAbnormalOrder.search();
+};
+
+
+
+$(function () {
+    var defaultColunms = TAbnormalOrder.initColumn();
+    var table = new BSTable(TAbnormalOrder.id, "/promotionInfo/list", defaultColunms);
+    table.setPaginationType("server");
+    TAbnormalOrder.table = table.init();
+});
diff --git a/UserQYTTravel/guns-admin/pom.xml b/UserQYTTravel/guns-admin/pom.xml
index 14973e1..3db4b12 100644
--- a/UserQYTTravel/guns-admin/pom.xml
+++ b/UserQYTTravel/guns-admin/pom.xml
@@ -232,6 +232,27 @@
             <artifactId>quartz</artifactId>
             <version>2.2.1</version>
         </dependency>
+<!--        生成pdf-->
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+            <version>5.2.0</version>
+        </dependency>
+<!--        邮件依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.11.0</version>
+        </dependency>
     </dependencies>
 
 
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 34f5fbd..9707d2c 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,9 +13,13 @@
 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;
@@ -33,6 +37,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;
@@ -41,7 +48,10 @@
 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.util.*;
 
@@ -140,7 +150,20 @@
 	
 	@Resource
 	private ISystemPriceCityService systemPriceCityService;
-	
+    
+    @Value("${trip.sheet.filePath}")
+    private  String filePath;
+    @Autowired
+    private EmailUtil emailUtil;
+    @Autowired
+    private  TripSheetGenerator tripSheetGenerator;
+    @Autowired
+    private IServerCarModelService serverCarModelService;
+    
+    
+    
+    
+    
 	
 	/**
 	 * 获取正在进行中的订单
@@ -2203,5 +2226,287 @@
 			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);
+            emailUtil.sendEmailWithAttachment(tripSheet.getRecipientEmail(), "行程单", "请查收您的行程单", attachment);
+            attachment.delete(); // 发送成功后删除临时文件
+            return ResultUtil.success("邮件发送成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResultUtil.error("邮件发送失败");
+        }
+    }
+    /**
+     * 根据订单类型和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("");
+        }
+    }
 	
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java
index 6cf4a8a..0a28538 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java
@@ -361,6 +361,7 @@
                     Date endTime = DateUtils.addDays(new Date(), bindingDays);
                     userInfo.setBindDriverId(driverId);
                     userInfo.setBindExpireDate(endTime);
+                    userInfo.setBindDate(new Date());
                     userInfoService.updateById(userInfo);
                 }
 
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java
index 9dbc933..02d3c8c 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/OrderCrossCityMapper.java
@@ -91,4 +91,9 @@
      * @return
      */
     List<Map<String, Object>> queryRedEnvelope(@Param("uid") Integer uid);
+
+    List<Map<String, Object>> queryMyTripList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
+                                               @Param("size") Integer size);
+
+    List<Map<String, Object>> queryMyTripListAll(@Param("uid") Integer uid);
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml
index 1c9da11..89bb029 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml
@@ -350,12 +350,12 @@
 		CONCAT(j.startTime, '-', j.endTime) as lineShiftTime,
 		a.holidayFee,
 		a.discountAmount as taxiCardMoney,
-        a.responsibilityType,
-        a.abnormalStatus,
-        a.abnormalRemark,
-        a.abnormalIntro,
-        a.abnormalImg,
-        a.companyId
+        a.responsibilityType as responsibilityType,
+        a.abnormalStatus as abnormalStatus,
+        a.abnormalRemark as abnormalRemark,
+        a.abnormalIntro as abnormalIntro,
+        a.abnormalImg as abnormalImg,
+        a.companyId as companyId
         from t_order_cross_city a
 		left join t_driver b on (a.driverId = b.id)
 		left join t_car c on (a.carId = c.id)
@@ -612,4 +612,51 @@
             and DATE_FORMAT(a.travelTime, '%Y-%m-%d') = #{day}
         </if>
     </select>
+
+
+    <select id="queryMyTripList" resultType="map">
+        select
+            id as orderId,
+            DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+            DATE_FORMAT(travelTime, '%m月?d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (3) as orderType,
+        state as state,
+        oldState as oldState,
+        thankYouFee,
+        passengersPhone,
+        payMoney,
+        endServiceTime,
+        companyId,
+        arriveTime,
+        boardingTime,
+        boardingLon,
+        boardingLat
+        from t_order_cross_city where userId = #{uid}  and state in (8, 9) order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+
+    <select id="queryMyTripListAll" resultType="map">
+        select
+            id as orderId,
+            DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+            DATE_FORMAT(travelTime, '%m月?d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (3) as orderType,
+        state as state,
+        oldState as oldState,
+        thankYouFee,
+        passengersPhone,
+        payMoney,
+        endServiceTime,
+        companyId,
+        arriveTime,
+        boardingTime,
+        boardingLon,
+        boardingLat
+        from t_order_cross_city where userId = #{uid}  and state in (8, 9) order by insertTime desc
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java
index 7302a60..3fc8960 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/OrderCrossCity.java
@@ -387,6 +387,16 @@
 
     private Integer responsibilityType;
 
+    private Long promotionActivityId;
+
+    public Long getPromotionActivityId() {
+        return promotionActivityId;
+    }
+
+    public void setPromotionActivityId(Long promotionActivityId) {
+        this.promotionActivityId = promotionActivityId;
+    }
+
     public Integer getResponsibilityType() {
         return responsibilityType;
     }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java
index 2f6c4d5..d1f2130 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/IOrderCrossCityService.java
@@ -329,5 +329,6 @@
 
     void promotion(Integer orderId);
 
-
+    List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception;
+    List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception;
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
index 92675f9..9605ec5 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -2706,7 +2706,7 @@
 		}
 		orderCrossCity.setAbnormalIntro(abnormalIntro);
 		orderCrossCity.setAbnormalImg(abnormalImg);
-		orderCrossCity.setAbnormal(1);
+		orderCrossCity.setAbnormal(2);
 		this.baseMapper.updateById(orderCrossCity);
 	}
 
@@ -2722,6 +2722,7 @@
 				BigDecimal bigDecimal = tDriverPromotionActivity.getCommissionRatio().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(payMoney)).setScale(2, RoundingMode.HALF_UP);
 				orderCrossCity.setPromotionDriverId(userInfo.getBindDriverId());
 				orderCrossCity.setPromotionMoney(bigDecimal);
+				orderCrossCity.setPromotionActivityId(tDriverPromotionActivity.getId());
 				this.baseMapper.updateById(orderCrossCity);
 			}
 		}
@@ -2736,4 +2737,28 @@
 			}
 		}
 	}
+
+	@Override
+	public List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception {
+		pageNum = (pageNum - 1) * size;
+		List<Map<String, Object>> maps = orderCrossCityMapper.queryMyTripList(uid, pageNum, size);
+		for (Map<String, Object> map : maps) {
+			if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
+				map.put("state", map.get("oldState"));
+			}
+		}
+		return maps;
+	}
+
+	@Override
+	public List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception {
+
+		List<Map<String, Object>> maps = orderCrossCityMapper.queryMyTripListAll(uid);
+		for (Map<String, Object> map : maps) {
+			if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
+				map.put("state", map.get("oldState"));
+			}
+		}
+		return maps;
+	}
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java
index 28e3d56..f2a49a8 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/OrderPrivateCarMapper.java
@@ -98,4 +98,9 @@
                                              @Param("state") Integer state,
                                              @Param("lon") String lon,
                                              @Param("lat") String lat);
+
+    List<Map<String, Object>> queryMyTripList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
+                                               @Param("size") Integer size);
+
+    List<Map<String, Object>> queryMyTripListAll(@Param("uid") Integer uid);
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml
index 6bd4523..7e722ca 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/dao/mapping/OrderPrivateCarMapper.xml
@@ -581,4 +581,52 @@
         </if>
 
     </select>
+
+
+    <select id="queryMyTripList" resultType="map">
+        select
+            id as orderId,
+            rideType as rideType,
+            DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+            DATE_FORMAT(travelTime, '%m月?d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (1) as orderType,
+        state as state,
+        oldState as oldState,
+        thankYouFee,
+        passengersPhone,
+        payMoney,
+        endServiceTime,
+        companyId,
+        arriveTime,
+        boardingTime,
+        boardingLon,
+        boardingLat
+        from t_order_private_car where userId = #{uid}  and state in (8, 9)  order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+    <select id="queryMyTripListAll" resultType="map">
+        select
+            id as orderId,
+            rideType as rideType,
+            DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+            DATE_FORMAT(travelTime, '%m月?d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (1) as orderType,
+        state as state,
+        oldState as oldState,
+        thankYouFee,
+        passengersPhone,
+        payMoney,
+        endServiceTime,
+        companyId,
+        arriveTime,
+        boardingTime,
+        boardingLon,
+        boardingLat
+        from t_order_private_car where userId = #{uid}  and state in (8, 9) order by insertTime desc
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java
index 53e9b55..aaa80e8 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/model/OrderPrivateCar.java
@@ -474,6 +474,8 @@
 	private String splitAllocation;
 	
 	private Integer responsibilityType;
+	
+	private Long promotionActivityId;
 	/**
 	 * 中台行程id
 	 */
@@ -1271,81 +1273,5 @@
 		this.recoveryOrder = recoveryOrder;
 	}
 	
-	@Override
-	public String toString() {
-		return "OrderPrivateCar{" +
-				"id=" + id +
-				", type=" + type +
-				", crossCityOrderId=" + crossCityOrderId +
-				", place=" + place +
-				", userId=" + userId +
-				", serverCarModelId=" + serverCarModelId +
-				", driverId=" + driverId +
-				", carId=" + carId +
-				", orderNum='" + orderNum + '\'' +
-				", placementLon=" + placementLon +
-				", placementLat=" + placementLat +
-				", placementAddress='" + placementAddress + '\'' +
-				", startLon=" + startLon +
-				", startLat=" + startLat +
-				", startAddress='" + startAddress + '\'' +
-				", endLon=" + endLon +
-				", endLat=" + endLat +
-				", endAddress='" + endAddress + '\'' +
-				", boardingLon=" + boardingLon +
-				", boardingLat=" + boardingLat +
-				", boardingAddress='" + boardingAddress + '\'' +
-				", boardingTime=" + boardingTime +
-				", getoffLon=" + getoffLon +
-				", getoffLat=" + getoffLat +
-				", getoffAddress='" + getoffAddress + '\'' +
-				", getoffTime=" + getoffTime +
-				", mileage=" + mileage +
-				", payManner=" + payManner +
-				", payType=" + payType +
-				", orderMoney=" + orderMoney +
-				", startMileage=" + startMileage +
-				", startMoney=" + startMoney +
-				", mileageKilometers=" + mileageKilometers +
-				", mileageMoney=" + mileageMoney +
-				", duration=" + duration +
-				", durationMoney=" + durationMoney +
-				", wait=" + wait +
-				", waitMoney=" + waitMoney +
-				", longDistance=" + longDistance +
-				", longDistanceMoney=" + longDistanceMoney +
-				", parkMoney=" + parkMoney +
-				", roadTollMoney=" + roadTollMoney +
-				", redPacketMoney=" + redPacketMoney +
-				", couponMoney=" + couponMoney +
-				", redPacketId=" + redPacketId +
-				", couponId=" + couponId +
-				", discount=" + discount +
-				", discountMoney=" + discountMoney +
-				", activityId=" + activityId +
-				", companyId=" + companyId +
-				", payMoney=" + payMoney +
-				", substitute=" + substitute +
-				", passengers='" + passengers + '\'' +
-				", passengersPhone='" + passengersPhone + '\'' +
-				", state=" + state +
-				", insertTime=" + insertTime +
-				", travelTime=" + travelTime +
-				", snatchOrderTime=" + snatchOrderTime +
-				", setOutTime=" + setOutTime +
-				", arriveTime=" + arriveTime +
-				", startServiceTime=" + startServiceTime +
-				", endServiceTime=" + endServiceTime +
-				", orderType=" + orderType +
-				", orderSource=" + orderSource +
-				", invoiceId=" + invoiceId +
-				", isReassign=" + isReassign +
-				", reassignNotice=" + reassignNotice +
-				", trackId='" + trackId + '\'' +
-				", isDelete=" + isDelete +
-				", oldState=" + oldState +
-				", telX='" + telX + '\'' +
-				", bindId='" + bindId + '\'' +
-				'}';
-	}
+	
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java
index a859fcd..0c9e66c 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/IOrderPrivateCarService.java
@@ -332,4 +332,8 @@
 
     void promotion(Integer orderId);
 
+    List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception;
+
+    List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception;
+
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
index 615c797..7236fab 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -752,7 +752,7 @@
 		UserInfo userInfo = userInfoService.selectById(userId);
 		if(userInfo.getBindDriverId()!=null && userInfo.getBindExpireDate().getTime()<=System.currentTimeMillis()){
 			String registAreaCode = userInfo.getRegistAreaCode();
-			TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("districtCode", registAreaCode).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1"));
+			TDriverPromotionActivity tDriverPromotionActivity = driverPromotionActivityService.selectOne(new EntityWrapper<TDriverPromotionActivity>().eq("districtCode", registAreaCode).eq("state",1).ge("startTime", new Date()).lt("endTime", new Date()).last("AND FIND_IN_SET(" + 1 + ", bizType) limit 1"));
 			if(tDriverPromotionActivity!=null){
 				return userInfo.getBindDriverId();
 			}
@@ -2894,7 +2894,7 @@
 		}
 		orderPrivateCar.setAbnormalIntro(abnormalIntro);
 		orderPrivateCar.setAbnormalImg(abnormalImg);
-		orderPrivateCar.setAbnormal(1);
+		orderPrivateCar.setAbnormal(2);
 		this.baseMapper.updateById(orderPrivateCar);
 		
 	}
@@ -2913,6 +2913,7 @@
 				BigDecimal bigDecimal = tDriverPromotionActivity.getCommissionRatio().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(payMoney)).setScale(2, RoundingMode.HALF_UP);
 				orderPrivateCar.setPromotionDriverId(userInfo.getBindDriverId());
 				orderPrivateCar.setPromotionMoney(bigDecimal);
+				orderPrivateCar.setPromotionActivityId(tDriverPromotionActivity.getId());
 				this.baseMapper.updateById(orderPrivateCar);
 			}
 		}
@@ -2927,4 +2928,28 @@
 			}
 		}
 	}
+
+	@Override
+	public List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception {
+		pageNum = (pageNum - 1) * size;
+		List<Map<String, Object>> maps = orderPrivateCarMapper.queryMyTripList(uid, pageNum, size);
+		for (Map<String, Object> map : maps) {
+			if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
+				map.put("state", map.get("oldState"));
+			}
+		}
+		return maps;
+	}
+
+	@Override
+	public List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception {
+
+		List<Map<String, Object>> maps = orderPrivateCarMapper.queryMyTripListAll(uid);
+		for (Map<String, Object> map : maps) {
+			if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
+				map.put("state", map.get("oldState"));
+			}
+		}
+		return maps;
+	}
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java
index a2e62ff..f3da3bf 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverPromotionActivity.java
@@ -96,6 +96,8 @@
     private Date createTime;
     private Date updateTime;
 
+    private Integer state;
+
 
     @Override
     protected Serializable pkVal() {
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java
index ba4d63d..a941215 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/UserInfo.java
@@ -151,6 +151,17 @@
     @TableField("onconUUID")
     private String onconUUID;
 
+
+    private Date bindDate;
+
+    public Date getBindDate() {
+        return bindDate;
+    }
+
+    public void setBindDate(Date bindDate) {
+        this.bindDate = bindDate;
+    }
+
     public Integer getBindDriverId() {
         return bindDriverId;
     }
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
new file mode 100644
index 0000000..b17c46b
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/vo/TripOrderVo.java
@@ -0,0 +1,155 @@
+package com.stylefeng.guns.modular.system.model.vo;
+
+import com.stylefeng.guns.modular.system.warpper.OrderWarpper;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+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.*;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TripOrderVo  implements Comparable{
+
+    @ApiModelProperty("订单id")
+    private Integer orderId;
+    @ApiModelProperty("订单日期")
+    private String orderTime;
+    @ApiModelProperty("出行时间/(小件物流的取货时间)")
+    private String time;
+    @ApiModelProperty("起点名称")
+    private String startAddress;
+    @ApiModelProperty("终点名称")
+    private String endAddress;
+    @ApiModelProperty("公司id(服务商)")
+    private Integer companyId;
+    @ApiModelProperty("司机id")
+    private Integer driverId;
+    @ApiModelProperty("车辆id")
+    private Integer carId;
+    @ApiModelProperty("行程人电话")
+    private String passengersPhone;
+    @ApiModelProperty("订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)<br/>" +
+            "小件物流订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待取货,5=送货中,6=已送达,7=待支付,8=需补差价,9=已取货,10=已取消,11=已支付差价")
+    private Integer state;
+    @ApiModelProperty("用车时长")
+    private Integer carTime;
+    @ApiModelProperty("车型id")
+    private Integer serverCarModelId;
+    @ApiModelProperty("车型")
+    private String serverCarModel;
+//    @ApiModelProperty("订单金额")
+//    private Double orderMoney;
+    @ApiModelProperty("支付金额")
+    private Double payMoney;
+//    @ApiModelProperty("差价金额")
+//    private Double differenceMoney;
+    @ApiModelProperty("感谢费")
+    private Double thankYouFee;
+//    @ApiModelProperty("开票状态(1=未开票,2=已开票)")
+//    private Integer invoice;
+    @ApiModelProperty("订单名称")
+    private String orderName;
+    @ApiModelProperty("订单类型(1=专车,2=出租车,3=跨城出行,4=小件物流,5=包车)")
+    private Integer orderType;
+    @ApiModelProperty("下单时间")
+    private Long insertTime;
+    @ApiModelProperty("服务结束事件")
+    private String endServiceTime;
+    @ApiModelProperty("乘车类型(1=独享,2=一口价,3=拼车)")
+    private Integer rideType;
+    @ApiModelProperty("上车经度")
+    private Double boardingLon;
+    @ApiModelProperty("上车纬度")
+    private Double boardingLat;
+    @ApiModelProperty("上车时间")
+    private Date boardingTime;  // 从LocalDateTime改为Date
+
+    @ApiModelProperty("到达时间")
+    private Date arriveTime;    // 从LocalDateTime改为Date
+    @ApiModelProperty("城市")
+    private String city;
+    @ApiModelProperty("服务商")
+    private String companyName;
+
+    public static List<TripOrderVo> getTripOrderVo(List<Map<String, Object>> maps) {
+        List<TripOrderVo> list = new ArrayList<>();
+        if (null != maps) {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
+            for (Map<String, Object> map : maps) {
+                TripOrderVo tripOrderVo = new TripOrderVo();
+
+                tripOrderVo.setRideType(null != map.get("rideType") ? Integer.valueOf(String.valueOf(map.get("rideType"))) : 1);
+                tripOrderVo.setOrderId(null != map.get("orderId") ? Integer.valueOf(String.valueOf(map.get("orderId"))) : 0);
+                tripOrderVo.setOrderTime(null != map.get("orderTime") ? String.valueOf(map.get("orderTime")) : "");
+                tripOrderVo.setTime(null != map.get("time") ? String.valueOf(map.get("time")) : "");
+                tripOrderVo.setStartAddress(null != map.get("startAddress") ? String.valueOf(map.get("startAddress")) : "");
+                tripOrderVo.setEndAddress(null != map.get("endAddress") ? String.valueOf(map.get("endAddress")) : "");
+                tripOrderVo.setState(null != map.get("state") ? Integer.valueOf(String.valueOf(map.get("state"))) : 0);
+//                tripOrderVo.setOrderMoney(null != map.get("orderMoney") ? Double.valueOf(String.valueOf(map.get("orderMoney"))) : 0);
+                tripOrderVo.setPayMoney(null != map.get("payMoney") ? Double.valueOf(String.valueOf(map.get("payMoney"))) : 0);
+//                tripOrderVo.setInvoice(null != map.get("invoice") ? Integer.valueOf(String.valueOf(map.get("invoice"))) : 0);
+                tripOrderVo.setOrderName(null != map.get("orderName") ? String.valueOf(map.get("orderName")) : "");
+                tripOrderVo.setInsertTime(null != map.get("insertTime") ? Long.valueOf(String.valueOf(map.get("insertTime"))) : 0);
+                tripOrderVo.setOrderType(null != map.get("orderType") ? Integer.valueOf(String.valueOf(map.get("orderType"))) : 0);
+                tripOrderVo.setDriverId(null != map.get("driverId") ? Integer.valueOf(String.valueOf(map.get("driverId"))) : 0);
+                tripOrderVo.setCarTime(null != map.get("carTime") ? Integer.valueOf(String.valueOf(map.get("carTime"))) : 0);
+                tripOrderVo.setServerCarModel(null != map.get("serverCarModel") ? String.valueOf(map.get("serverCarModel")) : "");
+//                tripOrderVo.setDifferenceMoney(null != map.get("differenceMoney") ? Double.valueOf(map.get("differenceMoney").toString()) : 0D);
+                tripOrderVo.setThankYouFee(null != map.get("thankYouFee") ? Double.valueOf(map.get("thankYouFee").toString()) : 0D);
+                tripOrderVo.setEndServiceTime(null != map.get("endServiceTime") ? String.valueOf(map.get("endServiceTime")) : "");
+                tripOrderVo.setCompanyId(null != map.get("companyId") ? Integer.valueOf(String.valueOf(map.get("companyId"))) : 0);
+                tripOrderVo.setPassengersPhone(null != map.get("passengersPhone") ? String.valueOf(map.get("passengersPhone")) : "");
+                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")) : "");
+                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);
+                list.add(tripOrderVo);
+            }
+
+        }
+        Collections.sort(list);
+        return list;
+    }
+
+    @Override
+    public int compareTo(Object o) {
+        if (o instanceof OrderWarpper) {
+            OrderWarpper s = (OrderWarpper) o;
+            if(this.insertTime == null || s.getInsertTime() == null){
+                return -1;
+            }
+            if (this.insertTime > s.getInsertTime()) {
+                return -1;
+            } else if (this.insertTime == s.getInsertTime()) {
+                return 0;
+            } else {
+                return 1;
+            }
+        }
+        return 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
new file mode 100644
index 0000000..23c7f29
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/pdf/TripSheetGenerator.java
@@ -0,0 +1,337 @@
+package com.stylefeng.guns.modular.system.pdf;
+
+import com.itextpdf.text.*;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfPCell;
+import com.itextpdf.text.pdf.PdfPTable;
+import com.itextpdf.text.pdf.PdfWriter;
+import com.stylefeng.guns.modular.system.model.vo.TripOrderVo;
+import com.stylefeng.guns.modular.system.warpper.OrderWarpper;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.ServletContextAware;
+
+import java.io.*;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.UUID;
+
+@Component
+public class TripSheetGenerator {
+
+    @Value("${trip.sheet.filePath}")
+    private String pdfDir;
+
+    // 内置中文备用字体
+    private static final String FALLBACK_FONT = "STSong-Light";
+    private static final String FALLBACK_ENCODING = "UniGB-UCS2-H";
+
+    // 完整日期时间格式
+    private static final DateTimeFormatter DATE_TIME_FORMATTER =
+            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    public String generatePdf(List<TripOrderVo> orders) throws DocumentException, IOException {
+        if (orders == null || orders.isEmpty()) {
+            throw new IllegalArgumentException("订单列表不能为空");
+        }
+
+        String fileName = "行程单_" + UUID.randomUUID() + ".pdf";
+        String filePath = pdfDir + fileName;
+        File file = new File(filePath);
+        FileUtils.forceMkdirParent(file);
+
+        Document document = new Document(PageSize.A4);
+        PdfWriter.getInstance(document, new FileOutputStream(file));
+        document.open();
+
+        // 新布局:Logo+标题 → 主标题 → 信息行 → 表格
+        addLogoAndTitle(document);
+        addMainTitle(document);
+        addTripInfo(document, orders);
+        addOrderTable(document, orders);
+
+        document.close();
+        return filePath;
+    }
+
+    private void addLogoAndTitle(Document document) throws DocumentException {
+        try {
+            document.setMargins(10, 50, 50, 50); // 左=0,右=50,上=50,下=50(单位:pt)
+            Resource logoResource = new ClassPathResource("static/img/logo.png");
+            if (logoResource.exists()) {
+                Image logo = Image.getInstance(logoResource.getURL());
+                logo.scaleToFit(80, 40); // 保持logo原有尺寸(宽100pt,高40pt)
+
+                // 1. 调整表格列宽:左列刚好容纳logo,右列仅够放下文字(缩小间距)
+                // 列宽比例:左列100pt(logo宽度),右列80pt(文字宽度,足够放下“贵人家园”)
+                PdfPTable layoutTable = new PdfPTable(new float[]{81f, 100f}); // 左列(Logo),右列100f(文字)
+                layoutTable.setWidthPercentage(35);
+                layoutTable.setSpacingAfter(15f); // 与下方主标题的间距不变
+                layoutTable.setHorizontalAlignment(Element.ALIGN_LEFT); // 整体左对齐,避免居中导致的空隙
+
+                // 2. 左单元格(logo):消除内边距,紧贴右侧
+                PdfPCell logoCell = new PdfPCell(logo);
+                logoCell.setBorder(Rectangle.NO_BORDER); // 无边框
+                logoCell.setPadding(0); // 去除内边距(关键:默认padding会导致空隙)
+                logoCell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 垂直居中对齐
+                logoCell.setHorizontalAlignment(Element.ALIGN_RIGHT); //logo居中
+                layoutTable.addCell(logoCell);
+
+                // 3. 右单元格(文字):消除内边距,紧贴左侧
+                Font titleFont = getChineseFont(18, Font.BOLD);
+                Paragraph titlePara = new Paragraph("贵人家园", titleFont);
+                titlePara.setAlignment(Element.ALIGN_LEFT); // 文字左对齐,贴近logo
+                titlePara.setSpacingBefore(0);
+                titlePara.setSpacingAfter(0);
+
+                PdfPCell titleCell = new PdfPCell(titlePara);
+                titleCell.setBorder(Rectangle.NO_BORDER); // 无边框
+                titleCell.setPadding(0); // 去除内边距(关键)
+                titleCell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 垂直居中对齐
+                titleCell.setHorizontalAlignment(Element.ALIGN_LEFT); // 文字靠左,贴近logo
+                layoutTable.addCell(titleCell);
+
+                document.add(layoutTable);
+                // 关键3:恢复页面默认边距(避免影响后续内容)
+                document.setMargins(50, 50, 50, 50);
+            } else {
+                // 降级处理(无logo时)
+                Font titleFont = getChineseFont(18, Font.BOLD);
+                Paragraph fallbackTitle = new Paragraph("贵人家园", titleFont);
+                fallbackTitle.setAlignment(Element.ALIGN_LEFT);
+                fallbackTitle.setSpacingAfter(15f);
+                document.add(fallbackTitle);
+            }
+        } catch (Exception e) {
+            System.err.println("Logo加载失败: " + e.getMessage());
+            // 降级处理
+            Font titleFont = getChineseFont(18, Font.BOLD);
+            Paragraph fallbackTitle = new Paragraph("贵人家园", titleFont);
+            fallbackTitle.setAlignment(Element.ALIGN_LEFT);
+            fallbackTitle.setSpacingAfter(15f);
+            document.add(fallbackTitle);
+        }
+    }
+
+    // 新增主标题方法(原 addTitle 逻辑调整)
+    private void addMainTitle(Document document) throws DocumentException {
+        Font titleFont = getChineseFont(18, Font.BOLD);
+        Paragraph mainTitle = new Paragraph("贵人家园—打车—行程单", titleFont);
+        mainTitle.setAlignment(Element.ALIGN_CENTER);
+        mainTitle.setSpacingBefore(5f);
+        mainTitle.setSpacingAfter(15f);
+        document.add(mainTitle);
+    }
+
+
+
+    // 修改信息行构建逻辑(以第一行为例)
+    private void addTripInfo(Document document, List<TripOrderVo> orders) throws DocumentException {
+        if (orders.isEmpty()) return;
+        TripOrderVo first = orders.get(0);
+        TripOrderVo last = orders.size() > 1 ? orders.get(orders.size() - 1) : first;
+
+        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_FORMATTER.format(first.getBoardingTime()) : "N/A";
+        String tripTimeEnd = last.getBoardingTime() != null
+                ? DATE_FORMATTER.format(last.getBoardingTime()) : "N/A";
+
+        String tripTime = tripTimeStart + " 至 " + tripTimeEnd;
+
+        // 总金额计算(修复:先定义 totalText 并拼接内容)
+        double totalAmount = orders.stream()
+                .mapToDouble(o -> o.getPayMoney() != null ? o.getPayMoney() : 0)
+                .sum();
+        String totalPrefix = "共计" + orders.size() + "单行程,合计";
+        String totalMoney = String.format("%.2f元", totalAmount);
+        String totalText = totalPrefix + totalMoney; // 正确定义 totalText
+
+
+        // ========== 第一行:申请时间 + 行程时间(均带分隔条) ==========
+        // 关键:通过表格列宽控制分隔条宽度(8pt)
+        PdfPTable line1Table = new PdfPTable(4);
+        line1Table.setWidthPercentage(100);
+        line1Table.setSpacingAfter(5f);
+        // 列宽比例:分隔条列固定为8pt,内容列按比例分配
+        line1Table.setWidths(new float[]{4, 200, 4, 374});
+
+        // 列1:申请时间前的蓝色分隔条(宽度由表格列宽控制)
+        line1Table.addCell(createBlueSeparatorCell());
+
+        // 列2:申请时间内容
+        Paragraph applyPara = new Paragraph();
+        applyPara.add(new Chunk("申请时间:", infoFont));
+        applyPara.add(new Chunk(applyTime, infoFont));
+        line1Table.addCell(createContentCell(applyPara));
+
+        // 列3:行程时间前的蓝色分隔条(与列1宽度一致)
+        line1Table.addCell(createBlueSeparatorCell());
+
+        // 列4:行程时间内容
+        Paragraph tripPara = new Paragraph();
+        tripPara.add(new Chunk("行程时间:", infoFont));
+        tripPara.add(new Chunk(tripTime, infoFont));
+        line1Table.addCell(createContentCell(tripPara));
+
+        document.add(line1Table);
+
+
+        // ========== 第二行:手机号 + 共计订单(均带分隔条) ==========
+        PdfPTable line2Table = new PdfPTable(4);
+        line2Table.setWidthPercentage(100);
+        line2Table.setSpacingAfter(15f);
+        // 与第一行保持完全相同的列宽比例(确保分隔条对齐)
+        line2Table.setWidths(new float[]{4, 200, 4, 374});
+
+        // 列1:手机号前的蓝色分隔条
+        line2Table.addCell(createBlueSeparatorCell());
+
+        // 列2:手机号内容
+        Paragraph phonePara = new Paragraph();
+        phonePara.add(new Chunk("行程人手机号:", infoFont));
+        phonePara.add(new Chunk(first.getPassengersPhone() != null ? first.getPassengersPhone() : "N/A", infoFont));
+        line2Table.addCell(createContentCell(phonePara));
+
+        // 列3:共计订单前的蓝色分隔条
+        line2Table.addCell(createBlueSeparatorCell());
+
+        // 列4:共计订单内容
+        Paragraph totalPara = new Paragraph();
+        totalPara.add(new Chunk(totalPrefix, infoFont));
+        Font totalFont = getChineseFont(10, Font.BOLD);
+        totalFont.setColor(BaseColor.RED);
+        totalPara.add(new Chunk(totalMoney, totalFont));
+        line2Table.addCell(createContentCell(totalPara));
+
+        document.add(line2Table);
+    }
+
+    /**
+     * 蓝色分隔条单元格(宽度由所在表格的列宽控制,无需单独设置)
+     */
+    private PdfPCell createBlueSeparatorCell() {
+        PdfPCell separatorCell = new PdfPCell();
+        // 关键:不设置宽度,完全由表格的 setWidths() 控制
+        separatorCell.setBackgroundColor(BaseColor.BLUE); // 蓝色背景
+        separatorCell.setBorder(Rectangle.NO_BORDER); // 无边框
+        separatorCell.setMinimumHeight(8); // 匹配文字行高
+        separatorCell.setPadding(0); // 去除内边距,确保分隔条紧凑
+        return separatorCell;
+    }
+
+    /**
+     * 内容单元格样式
+     */
+    private PdfPCell createContentCell(Paragraph content) {
+        PdfPCell cell = new PdfPCell(content);
+        cell.setBorder(Rectangle.NO_BORDER);
+        cell.setPaddingLeft(5); // 内容与分隔条的间距
+        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
+        return cell;
+    }
+    private void addOrderTable(Document document, List<TripOrderVo> orders) throws DocumentException {
+        // 调整列宽:第1列(序号)加宽至1.5f
+        float[] columnWidths = {1.5f, 2f, 2f, 3f, 2f, 3f, 3f, 2f};
+        PdfPTable table = new PdfPTable(columnWidths);
+        table.setWidthPercentage(100);
+        table.setSpacingBefore(10f); // 与上方信息行的间距
+
+        // 表头样式(蓝色背景,白色文字,居中)
+        Font headerFont = getChineseFont(10, Font.BOLD);
+        headerFont.setColor(BaseColor.WHITE);
+        BaseColor headerBg = new BaseColor(59, 130, 246);
+        String[] headers = {"序号","服务商","车型","上车时间","城市","起点","终点","金额"};
+
+        for (String header : headers) {
+            PdfPCell cell = new PdfPCell(new Paragraph(header, headerFont));
+            cell.setBackgroundColor(headerBg);
+            cell.setPadding(5);
+            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++) {
+            TripOrderVo order = orders.get(i);
+            // 序号列:强制居中,内容为 i+1
+            addCenteredCell(table, String.valueOf(i + 1), cellFont);
+            addCenteredCell(table, order.getCompanyName(), cellFont);
+            addCenteredCell(table, order.getServerCarModel(), cellFont);
+            addCenteredCell(table,
+                    order.getBoardingTime() != null
+                            ? DATE_FORMATTER.format(order.getBoardingTime())  // Date类型用SimpleDateFormat的format方法
+                            : "N/A",
+                    cellFont);
+            addCenteredCell(table, order.getCity(), cellFont);
+            addCenteredCell(table, order.getStartAddress(), cellFont);
+            addCenteredCell(table, order.getEndAddress(), cellFont);
+
+            // 金额列:右对齐
+            PdfPCell moneyCell = new PdfPCell(
+                    new Paragraph(String.format("%.2f元",
+                            order.getPayMoney() != null ? order.getPayMoney() : 0),
+                            cellFont)
+            );
+            moneyCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
+            moneyCell.setPadding(5);
+            table.addCell(moneyCell);
+        }
+
+        document.add(table);
+    }
+
+    // 辅助方法:创建居中对齐的单元格
+    private void addCenteredCell(PdfPTable table, String text, Font font) {
+        PdfPCell cell = new PdfPCell(new Paragraph(text != null ? text : "", font));
+        cell.setPadding(5);
+        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
+        table.addCell(cell);
+    }
+
+    private void addTableCell(PdfPTable table, String text, Font font) {
+        PdfPCell cell = new PdfPCell(new Paragraph(text != null ? text : "", font));
+        cell.setPadding(5);
+        table.addCell(cell);
+    }
+
+    /**
+     * 获取中文字体,优先自定义字体,fallback到 CJK 内置
+     */
+    private Font getChineseFont(float size, int style) {
+        // 自定义字体
+        try {
+            Resource res = new ClassPathResource("static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf");
+            if (res.exists()) {
+                BaseFont bf = BaseFont.createFont(
+                        res.getURL().toString(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
+                return new Font(bf, size, style);
+            }
+        } catch (Exception e) {
+            System.err.println("加载自定义字体失败: " + e.getMessage());
+        }
+        // 内置 CJK 字体
+        try {
+            BaseFont bf = BaseFont.createFont(
+                    FALLBACK_FONT, FALLBACK_ENCODING, BaseFont.EMBEDDED);
+            return new Font(bf, size, style);
+        } catch (Exception e) {
+            System.err.println("加载备用字体失败: " + e.getMessage());
+            return new Font(Font.FontFamily.HELVETICA, size, style);
+        }
+    }
+}
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java
new file mode 100644
index 0000000..e09f2dd
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java
@@ -0,0 +1,52 @@
+package com.stylefeng.guns.modular.system.util;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.io.File;
+
+@Component
+public class EmailUtil {
+    private final JavaMailSender javaMailSender;
+
+    // 从配置文件读取发件人邮箱(必须与spring.mail.username一致)
+    @Value("${spring.mail.username}")
+    private String fromEmail;
+
+    @Autowired
+    public EmailUtil(JavaMailSender javaMailSender) {
+        this.javaMailSender = javaMailSender;
+    }
+
+    public void sendEmailWithAttachment(String to, String subject, String text, File attachment) throws MessagingException {
+        MimeMessage message = javaMailSender.createMimeMessage();
+        MimeMessageHelper helper = new MimeMessageHelper(message, true);
+
+        // 设置发件人(必须与配置的spring.mail.username一致)
+        helper.setFrom(fromEmail);
+        // 设置收件人
+        helper.setTo(to);
+        // 设置邮件主题和内容
+        helper.setSubject(subject);
+        helper.setText(text);
+        // 添加附件
+        helper.addAttachment(attachment.getName(), attachment);
+
+        // 发送邮件
+        javaMailSender.send(message);
+    }
+
+    public void sendSimpleEmail(String to, String subject, String text) {
+        SimpleMailMessage message = new SimpleMailMessage();
+        message.setTo(to);
+        message.setSubject(subject);
+        message.setText(text);
+        javaMailSender.send(message);
+    }
+}
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java
index 6f8920e..dce3cc5 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/OrderTaxiMapper.java
@@ -89,4 +89,16 @@
      */
     List<OrderTaxi> queryByState_(@Param("uid") Integer uid, @Param("orderType") Integer orderType,
                                   @Param("type") Integer type, @Param("state") Integer...state);
+
+    /**
+     * 获取用户的行程列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     */
+    List<Map<String, Object>> queryMyTripList(@Param("uid") Integer uid, @Param("pageNum") Integer pageNum,
+                                               @Param("size") Integer size);
+
+    List<Map<String, Object>> queryMyTripListAll(@Param("uid") Integer uid);
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml
index da859a5..53b5f99 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/dao/mapping/OrderTaxiMapper.xml
@@ -414,4 +414,50 @@
             and `type` = #{type}
         </if>
     </select>
+
+    <select id="queryMyTripList" resultType="map">
+        select
+            id as orderId,
+            DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+            DATE_FORMAT(travelTime, '%m月%d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (2) as orderType,
+        state as state,
+        oldState as oldState,
+        thankYouFee,
+        passengersPhone,
+        payMoney,
+        endServiceTime,
+        companyId,
+        arriveTime,
+        boardingTime,
+        boardingLon,
+        boardingLat
+        from t_order_taxi where userId = #{uid}  and state in (8, 9) order by insertTime desc limit #{pageNum}, #{size}
+    </select>
+
+    <select id="queryMyTripListAll" resultType="map">
+        select
+            id as orderId,
+            DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i') as orderTime,
+            DATE_FORMAT(travelTime, '%m月%d日 %H:%i') as time,
+        startAddress as startAddress,
+        endAddress as endAddress,
+        driverId as driverId,
+        (2) as orderType,
+        state as state,
+        oldState as oldState,
+        thankYouFee,
+        passengersPhone,
+        payMoney,
+        endServiceTime,
+        companyId,
+        arriveTime,
+        boardingTime,
+        boardingLon,
+        boardingLat
+        from t_order_taxi where userId = #{uid}  and state in (8, 9) order by insertTime desc
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java
index 2e10d90..a63b98b 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/model/OrderTaxi.java
@@ -403,6 +403,17 @@
      */
     private Integer isCreated;
 
+    private Long promotionActivityId;
+
+    public Long getPromotionActivityId() {
+        return promotionActivityId;
+    }
+
+    public void setPromotionActivityId(Long promotionActivityId) {
+        this.promotionActivityId = promotionActivityId;
+    }
+
+
     public Integer getResponsibilityType() {
         return responsibilityType;
     }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java
index 99f5386..a3812e1 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java
@@ -313,4 +313,16 @@
 
     void promotion(Integer orderId);
 
+    /**
+     * 获取我的行程列表
+     * @param uid
+     * @param pageNum
+     * @param size
+     * @return
+     * @throws Exception
+     */
+    List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception;
+
+    List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception;
+
 }
diff --git a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
index 2cfd3a2..800a5a2 100644
--- a/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
+++ b/UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -2462,7 +2462,7 @@
 		}
 		orderTaxi.setAbnormalIntro(abnormalIntro);
 		orderTaxi.setAbnormalImg(abnormalImg);
-		orderTaxi.setAbnormal(1);
+		orderTaxi.setAbnormal(2);
 		this.baseMapper.updateById(orderTaxi);
 	}
 	
@@ -2478,6 +2478,7 @@
 				BigDecimal bigDecimal = tDriverPromotionActivity.getCommissionRatio().divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(payMoney)).setScale(2, RoundingMode.HALF_UP);
 				orderTaxi.setPromotionDriverId(userInfo.getBindDriverId());
 				orderTaxi.setPromotionMoney(bigDecimal);
+				orderTaxi.setPromotionActivityId(tDriverPromotionActivity.getId());
 				this.baseMapper.updateById(orderTaxi);
 			}
 		}
@@ -2491,4 +2492,29 @@
 			}
 		}
 	}
+
+	@Override
+	public List<Map<String, Object>> queryMyTripList(Integer uid, Integer pageNum, Integer size) throws Exception {
+		pageNum = (pageNum - 1) * size;
+		List<Map<String, Object>> maps = orderTaxiMapper.queryMyTripList(uid, pageNum, size);
+		for (Map<String, Object> map : maps) {
+			if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
+				map.put("state", map.get("oldState"));
+			}
+		}
+		return maps;
+	}
+
+	@Override
+	public List<Map<String, Object>> queryMyTripListAll(Integer uid) throws Exception {
+
+		List<Map<String, Object>> maps = orderTaxiMapper.queryMyTripListAll(uid);
+		for (Map<String, Object> map : maps) {
+			if (Integer.valueOf(String.valueOf(map.get("state"))) == 11) {
+				map.put("state", map.get("oldState"));
+			}
+		}
+		return maps;
+	}
+
 }
diff --git a/UserQYTTravel/guns-admin/src/main/resources/application.yml b/UserQYTTravel/guns-admin/src/main/resources/application.yml
index 3d56997..8a3a7ca 100644
--- a/UserQYTTravel/guns-admin/src/main/resources/application.yml
+++ b/UserQYTTravel/guns-admin/src/main/resources/application.yml
@@ -33,14 +33,14 @@
     host: 192.168.110.80
     port: 6379
     password: 123456
-#  redis:
-#    host: 172.21.35.151
-#    port: 6512
-#    password: SC_cache@20#25
-#    database: 0
-#    timeout: 1000
-#    cluster:
-#      nodes: 172.21.35.151:6512,172.21.35.152:6512,172.21.35.153:6512,172.21.35.151:6513,172.21.35.152:6513,172.21.35.153:6513
+  #  redis:
+  #    host: 172.21.35.151
+  #    port: 6512
+  #    password: SC_cache@20#25
+  #    database: 0
+  #    timeout: 1000
+  #    cluster:
+  #      nodes: 172.21.35.151:6512,172.21.35.152:6512,172.21.35.153:6512,172.21.35.151:6513,172.21.35.152:6513,172.21.35.153:6513
 
 mybatis-plus:
   typeAliasesPackage: com.stylefeng.guns.modular
@@ -72,13 +72,13 @@
     filters: wall,mergeStat
 
 
-#spring:
-#  datasource:
-#    url: jdbc:mysql://172.21.35.140:8066/traffic_scdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
-#    username: traffic_scusr
-#    password: QYT_sc@20#25
-#    db-name: traffic_scdb #用来搜集数据库的所有表
-#    filters: wall,mergeStat
+  #spring:
+  #  datasource:
+  #    url: jdbc:mysql://172.21.35.140:8066/traffic_scdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
+  #    username: traffic_scusr
+  #    password: QYT_sc@20#25
+  #    db-name: traffic_scdb #用来搜集数据库的所有表
+  #    filters: wall,mergeStat
 
 
 ---
@@ -86,7 +86,7 @@
   data:
     mongodb:
       uri: mongodb://192.168.110.80:27017/traveling_track
-#      uri: mongodb://qyt_jtcx:qyt_jtcx2025@172.21.35.195:27017,172.21.35.196:27017/traveling_track
+  #      uri: mongodb://qyt_jtcx:qyt_jtcx2025@172.21.35.195:27017,172.21.35.196:27017/traveling_track
 
 
 ---
@@ -127,3 +127,21 @@
 
 #交通部推送数据功能开关
 pushMinistryOfTransport: false
+
+#邮件配置
+spring:
+  mail:
+    host: smtp.qq.com
+    port: 465
+    username: 1721849008@qq.com
+    password: nhnbmjfdywilcbdj  # 这里是授权码,不是邮箱登录密码
+    properties:
+      mail:
+        smtp:
+          ssl:
+            enable: true  # 启用 SSL 加密(根据端口是否为 465 决定,通常需要开启)
+          auth: true      # 启用身份验证(必须为 true)
+# pdf生成位置
+trip:
+  sheet:
+    filePath: D:/qytPdf/
\ No newline at end of file
diff --git a/UserQYTTravel/guns-admin/src/main/resources/static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf b/UserQYTTravel/guns-admin/src/main/resources/static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf
new file mode 100644
index 0000000..3d865c2
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/resources/static/fonts/AlibabaPuHuiTi-3-105-Heavy.ttf
Binary files differ
diff --git a/UserQYTTravel/guns-admin/src/main/resources/static/img/logo.png b/UserQYTTravel/guns-admin/src/main/resources/static/img/logo.png
new file mode 100644
index 0000000..0576707
--- /dev/null
+++ b/UserQYTTravel/guns-admin/src/main/resources/static/img/logo.png
Binary files differ

--
Gitblit v1.7.1