From ee7208a3bb7770e24fa135916fa5f7165b25fee6 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期五, 01 八月 2025 09:03:21 +0800
Subject: [PATCH] 推广活动

---
 ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverPromotionActivity/tDriverPromotionActivity.html                      |   53 +
 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/TDriverPromotionActivity.java                             |  109 ++++
 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/tDriverPromotionActivity/tDriverPromotionActivity_edit.html                 |  268 +++++++++
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverPromotionActivityService.java                   |   28 +
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverPromotionActivityMapper.xml                  |   60 ++
 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_info.js                 |  110 ++++
 ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TDriverPromotionActivityController.java |  364 +++++++++++++
 ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tDriverPromotionActivity/tDriverPromotionActivity.js                      |  209 +++++++
 11 files changed, 1,576 insertions(+), 0 deletions(-)

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/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/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/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/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/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/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/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_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/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/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() {
+
+});

--
Gitblit v1.7.1