From 4bd9195ff5beeb416792b50bbaea84c56a1b500b Mon Sep 17 00:00:00 2001
From: luodangjia <luodangjia>
Date: 星期四, 30 五月 2024 11:05:47 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java                         |    2 
 ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity_info.js                                        |  164 +++
 ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/generalization_info.js                              |  358 ++++++++
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TActivityGeneralizationServiceImpl.java     |   10 
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java                             |    2 
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCitySiteMapper.xml                      |    7 
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_add.html                             |    1 
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/addHtml.html                                          |  167 +++
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/qrCodeHtml.html                                       |   35 
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/QRCodeUtil.java                          |   50 +
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/GeneralizationActivityController.java |  271 ++++++
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/generalization_detail.html                            |  180 ++++
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TActivityGeneralizationMapper.xml            |   18 
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/sysCouponRecord.html                                  |   47 +
 ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/generalization.js                                   |  236 +++++
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCitySite.java                                 |  161 +++
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTape/tOrderTape.html                                           |    3 
 ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/sysCouponRecord.js                                  |  162 +++
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_edit.html                                        |   61 +
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCitySiteMapper.java                             |   19 
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java                                  |   18 
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html                   |    8 
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/MyQrCodeUtil.java                        |   93 ++
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html                          |    8 
 ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord.js                                 |    2 
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOpenCityController.java              |  110 ++
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderTapeController.java             |   10 
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/editHtml.html                                         |  194 ++++
 ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOrderTape/tOrderTape.js                                           |   28 
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_orderDetail.html                       |    8 
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html                                                 |    2 
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TActivityGeneralizationMapper.java                   |   13 
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_add.html                                         |   30 
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDeMapUtil.java                                   |    2 
 ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/generalization.html                                   |   55 +
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TActivityGeneralization.java                       |   33 
 ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITActivityGeneralizationService.java             |    7 
 37 files changed, 2,550 insertions(+), 25 deletions(-)

diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/GeneralizationActivityController.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/GeneralizationActivityController.java
new file mode 100644
index 0000000..6ea493b
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/GeneralizationActivityController.java
@@ -0,0 +1,271 @@
+package com.stylefeng.guns.modular.system.controller.general;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.stylefeng.guns.core.base.controller.BaseController;
+import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.shiro.ShiroKit;
+import com.stylefeng.guns.core.util.DateUtil;
+import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.controller.util.MyQrCodeUtil;
+import com.stylefeng.guns.modular.system.controller.util.QRCodeUtil;
+import com.stylefeng.guns.modular.system.model.*;
+import com.stylefeng.guns.modular.system.service.ISysCouponRecordService;
+import com.stylefeng.guns.modular.system.service.ITActivityGeneralizationService;
+import com.stylefeng.guns.modular.system.util.GaoDeMapUtil;
+import com.stylefeng.guns.modular.system.util.OssUploadUtil;
+import com.stylefeng.guns.modular.system.util.UUIDUtil;
+import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * todo 新增推广活动设置控制器
+ *
+ * @author fengshuonan
+ * @Date 2020-06-17 20:51:18
+ */
+@Controller
+@RequestMapping("/generalization")
+public class GeneralizationActivityController extends BaseController {
+    @Autowired
+    private ITActivityGeneralizationService activityGeneralizationService;
+    @Autowired
+    private ISysCouponRecordService sysCouponRecordService;
+    private String PREFIX = "/system/generalization/";
+
+    /**
+     * 跳转到首页
+     */
+    @RequestMapping("/activity")
+    public String index() {
+        return PREFIX + "generalization.html";
+    }
+    /**
+     * 跳转到选择优惠券页面
+     * @return
+     */
+    @RequestMapping("/sysCouponRecord")
+    public String sysCouponRecord() {
+        return PREFIX + "sysCouponRecord.html";
+    }
+    @RequestMapping("/addHtml")
+    public String addHtml() {
+        return PREFIX + "addHtml.html";
+    }
+    @RequestMapping("/editHtml/{id}")
+    public String editHtml(Model model,@PathVariable("id") Integer id) {
+        TActivityGeneralization data = activityGeneralizationService.selectById(id);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        model.addAttribute("startTime", sdf.format(data.getStartTime()));
+        model.addAttribute("endTime", sdf.format(data.getEndTime()));
+        model.addAttribute("item",data);
+        List<SysCouponRecord> siteList = sysCouponRecordService.selectList(new EntityWrapper<SysCouponRecord>()
+                .eq("id",data.getCouponId()));
+        model.addAttribute("siteList",siteList);
+        return PREFIX + "editHtml.html";
+    }
+    @RequestMapping("/generalization_detail/{id}")
+    public String generalization_detail(Model model,@PathVariable("id") Integer id) {
+        TActivityGeneralization data = activityGeneralizationService.selectById(id);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        model.addAttribute("startTime", sdf.format(data.getStartTime()));
+        model.addAttribute("endTime", sdf.format(data.getEndTime()));
+        model.addAttribute("item",data);
+        List<SysCouponRecord> siteList = sysCouponRecordService.selectList(new EntityWrapper<SysCouponRecord>()
+                .eq("id",data.getCouponId()));
+        model.addAttribute("siteList",siteList);
+        return PREFIX + "generalization_detail.html";
+    }
+
+    @RequestMapping("/qrCodeHtml/{id}")
+    public String qrCodeHtml(Model model,@PathVariable("id") Integer id) {
+        TActivityGeneralization data = activityGeneralizationService.selectById(id);
+        model.addAttribute("qrCode",data.getQrCode());
+        return PREFIX + "qrCodeHtml.html";
+    }
+
+    @RequestMapping(value = "/list")
+    @ResponseBody
+    public Object list(String createTime,String activityName,Integer state) {
+        String beginTime = null;
+        String endTime = null;
+        if (SinataUtil.isNotEmpty(createTime)){
+            String[] timeArray = createTime.split(" - ");
+            beginTime = timeArray[0];
+            endTime = timeArray[1];
+        }
+        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+        page.setRecords(activityGeneralizationService.getList(page,beginTime,endTime,activityName,state));
+        return super.packForBT(page);
+    }
+
+    /**
+     * 新增推广活动
+     */
+    @RequestMapping(value = "/add")
+    @ResponseBody
+    public Object add(TActivityGeneralization tActivityGeneralization) throws Exception {
+
+        // 判断状态
+        if(new Date().after(tActivityGeneralization.getStartTime()) && new Date().before(tActivityGeneralization.getEndTime())){
+            tActivityGeneralization.setState(1);
+        }
+        if(new Date().after(tActivityGeneralization.getEndTime())){
+            tActivityGeneralization.setState(3);
+        }
+        if(new Date().before(tActivityGeneralization.getStartTime())){
+            tActivityGeneralization.setState(2);
+        }
+        activityGeneralizationService.insert(tActivityGeneralization);
+
+        // 生成二维码,上传到服务器
+        MyQrCodeUtil.createCodeToFile("https://www.baidu.com?id=" + tActivityGeneralization.getId());
+        BufferedImage qrCodeImage = QRCodeUtil.createImage("https://www.baidu.com?id=" + tActivityGeneralization.getId());
+        MultipartFile qrCodeFile = convert(qrCodeImage, new Date().getTime()+ UUIDUtil.getRandomCode(3)+".PNG");
+        String picture = OssUploadUtil.ossUpload(qrCodeFile);
+        System.err.println("二维码:"+ picture);
+        tActivityGeneralization.setQrCode(picture);
+        activityGeneralizationService.updateById(tActivityGeneralization);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 编辑推广活动
+     */
+    @RequestMapping(value = "/update")
+    @ResponseBody
+    public Object update(TActivityGeneralization tActivityGeneralization) {
+
+        // 判断状态
+        if(new Date().after(tActivityGeneralization.getStartTime()) && new Date().before(tActivityGeneralization.getEndTime())){
+            tActivityGeneralization.setState(1);
+        }
+        if(new Date().after(tActivityGeneralization.getEndTime())){
+            tActivityGeneralization.setState(3);
+        }
+        if(new Date().before(tActivityGeneralization.getStartTime())){
+            tActivityGeneralization.setState(2);
+        }
+        activityGeneralizationService.updateById(tActivityGeneralization);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 删除推广活动
+     */
+    @RequestMapping(value = "/delete")
+    @ResponseBody
+    public Object delete(Integer tActivityGeneralizationId) {
+        TActivityGeneralization activityGeneralization = activityGeneralizationService.selectById(tActivityGeneralizationId);
+        activityGeneralization.setIsDelete(2);
+        activityGeneralizationService.updateById(activityGeneralization);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 启动/暂停
+     */
+    @RequestMapping(value = "/updateStatus")
+    @ResponseBody
+    public Object updateStatus(Integer id, Integer status) {
+        TActivityGeneralization tActivityGeneralization = activityGeneralizationService.selectById(id);
+        if(status == 1){
+            if(new Date().after(tActivityGeneralization.getStartTime()) && new Date().before(tActivityGeneralization.getEndTime())){
+                tActivityGeneralization.setState(1);
+            }
+            if(new Date().after(tActivityGeneralization.getEndTime())){
+                tActivityGeneralization.setState(3);
+            }
+            if(new Date().before(tActivityGeneralization.getStartTime())){
+                tActivityGeneralization.setState(2);
+            }
+        }else {
+            tActivityGeneralization.setState(status);
+        }
+        activityGeneralizationService.updateById(tActivityGeneralization);
+        return SUCCESS_TIP;
+    }
+
+    /**
+     * 启动/暂停
+     */
+    @RequestMapping(value = "/downQrcode")
+    @ResponseBody
+    public Object downQrcode(HttpServletResponse response, String imgURL) throws Exception {
+        File localFile = new File("D://qrCode");
+        File file = new File(imgURL);
+
+
+        // 创建File对象
+        File downloadedFile = new File(localFile.getAbsolutePath());
+
+        System.out.println("文件已下载到: " + downloadedFile.getAbsolutePath());
+
+        // 设置响应头
+        response.reset();
+        response.setContentType("image/png"); // 根据图片类型调整
+        response.setHeader("Content-Disposition", "attachment; filename=二维码.png");
+
+        // 输出文件内容到响应输出流
+        FileInputStream fis = new FileInputStream(file);
+        OutputStream os = response.getOutputStream();
+
+        byte[] buffer = new byte[1024];
+        int bytesRead;
+        while ((bytesRead = fis.read(buffer)) != -1) {
+            os.write(buffer, 0, bytesRead);
+        }
+        // 关闭流
+        os.flush();
+        os.close();
+        fis.close();
+        return SUCCESS_TIP;
+    }
+
+    public static MultipartFile convert(BufferedImage bufferedImage, String fileName) throws IOException {
+        // 将 BufferedImage 转换为字节数组
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ImageIO.write(bufferedImage, "png", baos);
+        byte[] bytes = baos.toByteArray();
+
+        // 创建 ByteArrayResource
+        ByteArrayResource resource = new ByteArrayResource(bytes);
+
+        // 创建 MockMultipartFile
+        MockMultipartFile multipartFile = new MockMultipartFile(
+                "file",
+                fileName,
+                "image/png",
+                resource.getInputStream()
+        );
+
+        return multipartFile;
+    }
+
+}
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOpenCityController.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOpenCityController.java
index 04e08e9..dd5b3b0 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOpenCityController.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOpenCityController.java
@@ -10,7 +10,9 @@
 import com.stylefeng.guns.core.shiro.ShiroKit;
 import com.stylefeng.guns.core.util.DateUtil;
 import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.modular.system.dao.TOpenCitySiteMapper;
 import com.stylefeng.guns.modular.system.model.TOpenCityBusiness;
+import com.stylefeng.guns.modular.system.model.TOpenCitySite;
 import com.stylefeng.guns.modular.system.model.TRegion;
 import com.stylefeng.guns.modular.system.service.ITOpenCityBusinessService;
 import com.stylefeng.guns.modular.system.service.ITRegionService;
@@ -26,10 +28,13 @@
 import com.stylefeng.guns.modular.system.model.TOpenCity;
 import com.stylefeng.guns.modular.system.service.ITOpenCityService;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 城市管理控制器
@@ -51,7 +56,8 @@
 
     @Autowired
     private ITOpenCityBusinessService tOpenCityBusinessService;
-
+    @Autowired
+    private TOpenCitySiteMapper tOpenCitySiteMapper;
     /**
      * 跳转到城市管理首页
      */
@@ -78,7 +84,6 @@
         TOpenCity tOpenCity = tOpenCityService.selectById(tOpenCityId);
         model.addAttribute("item",tOpenCity);
         LogObjectHolder.me().set(tOpenCity);
-
         //省
         List<TRegion> provinceList = tRegionService.selectList(new EntityWrapper<TRegion>().eq("parent_id", 0));
         model.addAttribute("provinceList",provinceList);
@@ -91,6 +96,16 @@
         //经营业务
         List<Map<String,Object>> businessList = tOpenCityService.getBusinessByCityId(tOpenCityId);
         model.addAttribute("businessList",businessList);
+        // 机场/动车站点
+        List<TOpenCitySite> siteList = tOpenCitySiteMapper.selectList(new EntityWrapper<TOpenCitySite>()
+                .eq("openCityId", tOpenCityId)
+                .ne("flag",3));
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd");
+        for (TOpenCitySite openCitySite : siteList) {
+            String format = simpleDateFormat.format(openCitySite.getInsertTime());
+            openCitySite.setInsertTime1(format);
+        }
+        model.addAttribute("siteList",siteList);
         return PREFIX + "tOpenCity_edit.html";
     }
 
@@ -127,7 +142,10 @@
      */
     @RequestMapping(value = "/add")
     @ResponseBody
-    public Object add(TOpenCity tOpenCity,@RequestParam String businessTypeStr,Integer areaId,Integer cityId,Integer provinceId) {
+    public Object add(TOpenCity tOpenCity,@RequestParam String businessTypeStr,
+                      String sites,
+                      Integer areaId,Integer cityId,
+                      Integer provinceId) {
         //获取code
         if (SinataUtil.isNotEmpty(areaId)){
             TRegion area = tRegionService.selectById(areaId);
@@ -163,6 +181,35 @@
 
         //添加经营业务
         testJSONStrToJSONArray(businessTypeStr,tOpenCity.getId());
+        // 添加机场/动车站点
+        JSONArray jsonArray = JSON.parseArray(sites);
+        int size = jsonArray.size();
+        for (int i = 0; i < size; i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            TOpenCitySite openCitySite = new TOpenCitySite();
+            openCitySite.setOpenCityId(tOpenCity.getId());
+            String string = jsonObject.getString("lonAndLat");
+            // 去除转义符
+            String unescaped = string.replaceAll("& #40;", "(").replaceAll("& #41;", ")");
+            // 提取括号中的内容
+            Pattern pattern = Pattern.compile("\\(([^)]+)\\)");
+            Matcher matcher = pattern.matcher(unescaped);
+            if (matcher.find()) {
+                String lonAndLat = matcher.group(1);
+                System.out.println("括号中的内容: " + lonAndLat);
+                // 使用逗号分割字符串
+                String[] parts = lonAndLat.split(",");
+                // 提取需要的部分
+                String lon = parts[0];
+                String lat = parts[1];
+                openCitySite.setLon(lon);
+                openCitySite.setLat(lat);
+            }
+            openCitySite.setFlag(1);
+            openCitySite.setName(jsonObject.getString("name"));
+            openCitySite.setInsertTime(DateUtil.parse(jsonObject.getString("time")+" 00:00:00","yyyy-MM-dd HH:mm:ss"));
+            tOpenCitySiteMapper.insert(openCitySite);
+        }
         return SUCCESS_TIP;
     }
 
@@ -224,7 +271,7 @@
      */
     @RequestMapping(value = "/update")
     @ResponseBody
-    public Object update(TOpenCity tOpenCity,@RequestParam String businessTypeStr,Integer areaId,Integer cityId,Integer provinceId) {
+    public Object update(TOpenCity tOpenCity,@RequestParam String businessTypeStr,Integer areaId,Integer cityId,Integer provinceId,String sites) {
         if (SinataUtil.isNotEmpty(areaId)){
             TRegion area = tRegionService.selectById(areaId);
             tOpenCity.setCode(area.getCode());
@@ -279,6 +326,61 @@
         tOpenCityBusinessService.update(business,new EntityWrapper<TOpenCityBusiness>().eq("openCityId",tOpenCity.getId()));
         //添加经营业务
         testJSONStrToJSONArray(businessTypeStr,tOpenCity.getId());
+//        TOpenCitySite openCitySite = new TOpenCitySite();
+//        // 删除站点
+//        tOpenCitySiteMapper.update(openCitySite,new EntityWrapper<TOpenCitySite>().eq("openCityId",tOpenCity.getId()));
+        List<TOpenCitySite> openCityId = tOpenCitySiteMapper.selectList(new EntityWrapper<TOpenCitySite>()
+                .eq("openCityId", tOpenCity.getId()));
+        for (TOpenCitySite openCitySite : openCityId) {
+            openCitySite.setFlag(3);
+            tOpenCitySiteMapper.updateById(openCitySite);
+        }
+        // 添加站点
+        // 添加机场/动车站点
+        JSONArray jsonArray = JSON.parseArray(sites);
+        int size = jsonArray.size();
+        for (int i = 0; i < size; i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            String string = jsonObject.getString("lonAndLat");
+            // 去除转义符
+            String unescaped = string.replaceAll("& #40;", "(").replaceAll("& #41;", ")");
+            // 提取括号中的内容
+            Pattern pattern = Pattern.compile("\\(([^)]+)\\)");
+            Matcher matcher = pattern.matcher(unescaped);
+            String lon = "";
+            String lat = "";
+            if (matcher.find()) {
+                String lonAndLat = matcher.group(1);
+                System.out.println("括号中的内容: " + lonAndLat);
+                // 使用逗号分割字符串
+                String[] parts = lonAndLat.split(",");
+                // 提取需要的部分
+                lon = parts[0];
+                lat = parts[1];
+            }
+            if (SinataUtil.isNotEmpty(jsonObject.getInteger("busId")) && jsonObject.getInteger("busId") != 0){
+                // 修改
+                TOpenCitySite openCitySite1 = tOpenCitySiteMapper.selectById(jsonObject.getInteger("busId"));
+                openCitySite1.setLon(lon);
+                openCitySite1.setLat(lat);
+                openCitySite1.setName(jsonObject.getString("name"));
+                openCitySite1.setFlag(2);
+                openCitySite1.setType(jsonObject.getInteger("siteType"));
+                tOpenCitySiteMapper.updateById(openCitySite1);
+            }else{
+                // 新增
+                TOpenCitySite openCitySite3 = new TOpenCitySite();
+                openCitySite3.setOpenCityId(tOpenCity.getId());
+                openCitySite3.setLon(lon);
+                openCitySite3.setLat(lat);
+                openCitySite3.setFlag(1);
+                openCitySite3.setName(jsonObject.getString("name"));
+                openCitySite3.setType(jsonObject.getInteger("siteType"));
+                openCitySite3.setInsertTime(DateUtil.parse(jsonObject.getString("time")+" 00:00:00","yyyy-MM-dd HH:mm:ss"));
+                tOpenCitySiteMapper.insert(openCitySite3);
+            }
+
+        }
         return SUCCESS_TIP;
     }
 
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderTapeController.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderTapeController.java
index d2e1bc9..6400ecb 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderTapeController.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TOrderTapeController.java
@@ -77,6 +77,16 @@
     }
 
     /**
+     * 删除行程录音管理
+     */
+    @RequestMapping(value = "/getDetailById")
+    @ResponseBody
+    public Object getDetailById(@RequestParam Integer tOrderTapeId) {
+        TOrderTape tOrderTape = tOrderTapeService.selectById(tOrderTapeId);
+        return ResultUtil.success(tOrderTape);
+    }
+
+    /**
      * 批量删除行程录音管理
      */
     @RequestMapping(value = "/deleteBatch")
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/MyQrCodeUtil.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/MyQrCodeUtil.java
new file mode 100644
index 0000000..e09b0c8
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/MyQrCodeUtil.java
@@ -0,0 +1,93 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import org.springframework.util.StringUtils;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+public class MyQrCodeUtil {
+    //CODE_WIDTH:二维码宽度,单位像素
+    private static final int CODE_WIDTH = 400;
+    //CODE_HEIGHT:二维码高度,单位像素
+    private static final int CODE_HEIGHT = 400;
+    //FRONT_COLOR:二维码前景色,0x000000 表示黑色
+    private static final int FRONT_COLOR = 0x000000;
+    //BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色
+    //演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白
+    private static final int BACKGROUND_COLOR = 0xFFFFFF;
+    public static BufferedImage createCodeToFile(String content) {
+        try {
+            content = content.trim();
+            //核心代码-生成二维码
+            BufferedImage bufferedImage = getBufferedImage(content);
+
+            return bufferedImage;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    /**
+     * 生成二维码并输出到输出流, 通常用于输出到网页上进行显示,输出到网页与输出到磁盘上的文件中,区别在于最后一句 ImageIO.write
+     * write(RenderedImage im,String formatName,File output):写到文件中
+     * write(RenderedImage im,String formatName,OutputStream output):输出到输出流中
+     * @param content  :二维码内容
+     * @param outputStream :输出流,比如 HttpServletResponse 的 getOutputStream
+     */
+    public static void createCodeToOutputStream(String content, OutputStream outputStream) {
+        try {
+            if (!StringUtils.hasLength(content)) {
+                return;
+            }
+            content = content.trim();
+            //核心代码-生成二维码
+            BufferedImage bufferedImage = getBufferedImage(content);
+            //区别就是这一句,输出到输出流中,如果第三个参数是 File,则输出到文件中
+            ImageIO.write(bufferedImage, "png", outputStream);
+            System.out.println("二维码图片生成到输出流成功...");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    //核心代码-生成二维码
+    private static BufferedImage getBufferedImage(String content) throws WriterException {
+        //com.google.zxing.EncodeHintType:编码提示类型,枚举类型
+        Map<EncodeHintType, Object> hints = new HashMap();
+        //EncodeHintType.CHARACTER_SET:设置字符编码类型
+        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+        //EncodeHintType.ERROR_CORRECTION:设置误差校正
+        //ErrorCorrectionLevel:误差校正等级,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction
+        //不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
+        //EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近
+        hints.put(EncodeHintType.MARGIN, 1);
+        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
+        BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);
+        BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);
+        for (int x = 0; x < CODE_WIDTH; x++) {
+            for (int y = 0; y < CODE_HEIGHT; y++) {
+                bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);
+            }
+        }
+        return bufferedImage;
+    }
+
+    public static void main(String[] args) {
+        String param = "{\n" +
+                "    \"scan_type\": 1,\n" +
+                "    \"space_id\": 2,\n" +
+                "    \"sutu_id\": 3\n" +
+                "}";
+        createCodeToFile(param);
+    }
+
+}
\ No newline at end of file
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/QRCodeUtil.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/QRCodeUtil.java
new file mode 100644
index 0000000..4bb509d
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/QRCodeUtil.java
@@ -0,0 +1,50 @@
+package com.stylefeng.guns.modular.system.controller.util;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+
+import java.awt.image.BufferedImage;
+import java.util.Hashtable;
+
+/**
+ * @author chengst
+ * @date 2019/11/4
+ **/
+public class QRCodeUtil {
+
+    private final static String CHARSET = "utf-8";
+
+    private final static int QRSIZEE = 300;
+
+    // 二维码颜色
+    private static final int BLACK = 0xFF000000;
+    // 二维码颜色
+    private static final int WHITE = 0xFFFFFFFF;
+
+    public static BufferedImage createImage(String content){
+        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+        hints.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix = null;
+        try {
+            bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRSIZEE, QRSIZEE,hints);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        int width = bitMatrix.getWidth();
+        int height = bitMatrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
+            }
+        }
+        return image;
+    }
+}
+
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TActivityGeneralizationMapper.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TActivityGeneralizationMapper.java
index c0d5b9e..1c8da2a 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TActivityGeneralizationMapper.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TActivityGeneralizationMapper.java
@@ -1,8 +1,14 @@
 package com.stylefeng.guns.modular.system.dao;
 
 import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.baomidou.mybatisplus.plugins.Page;
 import com.stylefeng.guns.modular.system.model.TActivityGeneralization;
 import com.stylefeng.guns.modular.system.model.TOrderTape;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -12,6 +18,13 @@
  * @author 吕雪
  * @since 2020-06-09
  */
+@Mapper
 public interface TActivityGeneralizationMapper extends BaseMapper<TActivityGeneralization> {
 
+    List<Map<String, Object>> getList(@Param("page") Page<Map<String, Object>> page,
+                                      @Param("beginTime")String beginTime,
+                                      @Param("endTime") String endTime,
+                                      @Param("activityName")String activityName,
+                                      @Param("state")Integer state);
+
 }
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCitySiteMapper.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCitySiteMapper.java
new file mode 100644
index 0000000..901a74e
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOpenCitySiteMapper.java
@@ -0,0 +1,19 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.TOpenCitySite;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 开通城市表 Mapper 接口
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+@Mapper
+public interface TOpenCitySiteMapper extends BaseMapper<TOpenCitySite> {
+
+
+}
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TActivityGeneralizationMapper.xml b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TActivityGeneralizationMapper.xml
index 472d027..8a15dec 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TActivityGeneralizationMapper.xml
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TActivityGeneralizationMapper.xml
@@ -20,5 +20,23 @@
     <sql id="Base_Column_List">
         id, activityName, participateCount, startTime, endTime, couponId, userGrantCount, monthUseCount, useExplain, isDelete
     </sql>
+    <select id="getList" resultType="java.util.Map">
+        select a.id,a.insertTime,a.activityName,CONCAT(DATE_FORMAT(a.startTime, '%Y-%m-%d')," — ",DATE_FORMAT(a.endTime, '%Y-%m-%d')) as `time`,
+               a.qrCode,
+        a.participateCount,a.state,IFNULL(b.count, 0) AS `count`
+        from t_activity_generalization a
+        LEFT join (SELECT userId,couponActivityId, activityType,COUNT(*) AS `count` FROM t_user_coupon_record where activityType = 5 GROUP BY userId) b
+        ON a.id = b.couponActivityId
+        WHERE a.isDelete = 1
+        <if test="beginTime != null and beginTime !='' and endTime != null and endTime != ''">
+            and (a.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
+        </if>
+        <if test="activityName != null and activityName !=''">
+            and a.activityName like CONCAT('%',#{activityName},'%')
+        </if>
+        <if test="state != null">
+            and a.state=#{state}
+        </if>
+    </select>
 
 </mapper>
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCitySiteMapper.xml b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCitySiteMapper.xml
new file mode 100644
index 0000000..3f0be14
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOpenCitySiteMapper.xml
@@ -0,0 +1,7 @@
+<?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.TOpenCitySiteMapper">
+
+
+
+</mapper>
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TActivityGeneralization.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TActivityGeneralization.java
index 1912fd3..f6c7423 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TActivityGeneralization.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TActivityGeneralization.java
@@ -33,6 +33,25 @@
     @ApiModelProperty(value = "最多参与人数")
     @TableField(value = "participateCount")
     private Integer participateCount;
+    @ApiModelProperty(value = "状态 1=已开启 2=未开启 3=已结束 4=暂停")
+    @TableField(value = "state")
+    private Integer state;
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    @ApiModelProperty(value = "添加时间")
+    @TableField(value = "insertTime")
+    private Date insertTime;
+
+    @ApiModelProperty(value = "二维码链接")
+    @TableField(value = "qrCode")
+    private String qrCode;
 
     @ApiModelProperty(value = "开始时间")
     @TableField(value = "startTime")
@@ -62,6 +81,20 @@
     @TableField(value = "isDelete")
     private Integer isDelete;
 
+    public Integer getState() {
+        return state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+    public String getQrCode() {
+        return qrCode;
+    }
+
+    public void setQrCode(String qrCode) {
+        this.qrCode = qrCode;
+    }
     public Integer getId() {
         return id;
     }
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCitySite.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCitySite.java
new file mode 100644
index 0000000..ee9d1b6
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOpenCitySite.java
@@ -0,0 +1,161 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.activerecord.Model;
+import com.baomidou.mybatisplus.annotations.DataSource;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import io.swagger.models.auth.In;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 开通城市表
+ * </p>
+ *
+ * @author 吕雪
+ * @since 2020-06-02
+ */
+
+@TableName("t_open_city_site")
+public class TOpenCitySite extends Model<TOpenCitySite> {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TOpenCitySite that = (TOpenCitySite) o;
+        return Objects.equals(id, that.id) && Objects.equals(lon, that.lon) && Objects.equals(lat, that.lat) && Objects.equals(name, that.name) && Objects.equals(insertTime, that.insertTime) && Objects.equals(openCityId, that.openCityId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, lon, lat, name, insertTime, openCityId);
+    }
+
+    public String getInsertTime1() {
+
+        return insertTime1;
+    }
+
+    public void setInsertTime1(String insertTime1) {
+        this.insertTime1 = insertTime1;
+    }
+
+    @Override
+    public String toString() {
+        return "TOpenCitySite{" +
+                "id=" + id +
+                ", lon='" + lon + '\'' +
+                ", lat='" + lat + '\'' +
+                ", name='" + name + '\'' +
+                ", insertTime=" + insertTime +
+                ", openCityId=" + openCityId +
+                '}';
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getLon() {
+        return lon;
+    }
+
+    public void setLon(String lon) {
+        this.lon = lon;
+    }
+
+    public String getLat() {
+        return lat;
+    }
+
+    public void setLat(String lat) {
+        this.lat = lat;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Date getInsertTime() {
+        return insertTime;
+    }
+
+    public void setInsertTime(Date insertTime) {
+        this.insertTime = insertTime;
+    }
+
+    public Integer getOpenCityId() {
+        return openCityId;
+    }
+
+    public void setOpenCityId(Integer openCityId) {
+        this.openCityId = openCityId;
+    }
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 经度
+     */
+    private String lon;
+    /**
+     * 纬度
+     */
+    private String lat;
+
+    public Integer getFlag() {
+        return flag;
+    }
+
+    public void setFlag(Integer flag) {
+        this.flag = flag;
+    }
+
+    private Integer flag;
+    /**
+     * 类型 1机场2站点
+     */
+    private Integer type;
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    /**
+     * 站点名称
+     */
+    private String name;
+    private Date insertTime;
+    @TableField(exist = false)
+    private String insertTime1;
+    private Integer openCityId;
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITActivityGeneralizationService.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITActivityGeneralizationService.java
index fbf97d9..d828f25 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITActivityGeneralizationService.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITActivityGeneralizationService.java
@@ -1,8 +1,12 @@
 package com.stylefeng.guns.modular.system.service;
 
+import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.service.IService;
 import com.stylefeng.guns.modular.system.model.TActivityGeneralization;
 import com.stylefeng.guns.modular.system.model.TOrderTape;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -14,4 +18,7 @@
  */
 public interface ITActivityGeneralizationService extends IService<TActivityGeneralization> {
 
+    List<Map<String, Object>> getList(Page<Map<String, Object>> page, String beginTime, String endTime, String activityName, Integer state);
+
+
 }
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TActivityGeneralizationServiceImpl.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TActivityGeneralizationServiceImpl.java
index 075af69..b3cdce8 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TActivityGeneralizationServiceImpl.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TActivityGeneralizationServiceImpl.java
@@ -1,5 +1,6 @@
 package com.stylefeng.guns.modular.system.service.impl;
 
+import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.stylefeng.guns.modular.system.dao.TActivityGeneralizationMapper;
 import com.stylefeng.guns.modular.system.dao.TOrderTapeMapper;
@@ -8,6 +9,9 @@
 import com.stylefeng.guns.modular.system.service.ITActivityGeneralizationService;
 import com.stylefeng.guns.modular.system.service.ITOrderTapeService;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -20,4 +24,10 @@
 @Service
 public class TActivityGeneralizationServiceImpl extends ServiceImpl<TActivityGeneralizationMapper, TActivityGeneralization> implements ITActivityGeneralizationService {
 
+    @Override
+    public List<Map<String, Object>> getList(Page<Map<String, Object>> page,
+                                             String beginTime, String endTime,
+                                             String activityName, Integer state) {
+        return this.baseMapper.getList(page,beginTime,endTime,activityName,state);
+    }
 }
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java
index 8f17281..c01beb4 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapElectricFenceUtil.java
@@ -34,7 +34,7 @@
     @Autowired
     private IGDInterfaceService gdInterfaceService;
 
-    private String key = "ca723c3c8a78962a7751129ae035dc9d";
+    private String key = "8fc6a7da12d64696e9727605d81f72de";
 
     private JSONArray jsonArray = new JSONArray();
 
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java
index 5845ae2..29522dc 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GDMapGeocodingUtil.java
@@ -20,7 +20,7 @@
 @Component
 public class GDMapGeocodingUtil {
 
-    private String key = "ca723c3c8a78962a7751129ae035dc9d";
+    private String key = "8fc6a7da12d64696e9727605d81f72de";
 
     @Autowired
     private RestTemplate restTemplate;
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDeMapUtil.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDeMapUtil.java
index 89d066f..e88224c 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDeMapUtil.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GaoDeMapUtil.java
@@ -35,7 +35,7 @@
 
         try {
             // 拼接请求高德的url
-            String url = "http://restapi.amap.com/v3/geocode/geo?address=" + address + "&output=JSON&key=" + "ca723c3c8a78962a7751129ae035dc9d";
+            String url = "http://restapi.amap.com/v3/geocode/geo?address=" + address + "&output=JSON&key=" + "8fc6a7da12d64696e9727605d81f72de";
             // 请求高德接口
             String result = sendHttpGet(url);
             JSONObject resultJOSN = JSONObject.parseObject(result);
diff --git a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java
index 7aed067..4c8a9de 100644
--- a/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java
+++ b/ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/OssUploadUtil.java
@@ -36,4 +36,22 @@
 			}
 		return fileName;
 	}
+
+	public static String ossUpload(MultipartFile file) throws IOException{
+		//CommonsMultipartFile file = (CommonsMultipartFile)multipartFile;
+		String fileName = "";
+		if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){
+			InputStream content = file.getInputStream();//获得指定文件的输入流
+			ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata
+			meta.setContentLength(file.getSize());  // 必须设置ContentLength
+			String originalFilename = file.getOriginalFilename();
+			fileName =  UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length());
+			ossClient.putObject(bucketName,"img/"+fileName,content,meta);// 上传Object.
+			if(fileName != null && !"".equals(fileName)){
+				System.out.println(fileName);
+				fileName = oss_domain+"img/"+fileName;
+			}
+		}
+		return fileName;
+	}
 }
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/addHtml.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/addHtml.html
new file mode 100644
index 0000000..a721136
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/addHtml.html
@@ -0,0 +1,167 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="ibox-title">
+            <h5>添加推广活动</h5>
+        </div>
+        <div class="ibox-content" id="activityGeneralizationInfoForm">
+            <div class="row row-lg">
+                <div class="col-sm-12">
+                    <input hidden id="areaId" value="">
+
+                    <div class="col-sm-12" style="cursor: pointer;text-align: right;">
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >活动名称:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="activityName" name="activityName" type="text" maxlength="40" style="height: 30px;width: 300px" class="form-control"  placeholder="请输入活动名称" required="required">
+                                </div>
+                            </div>
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >最多可参与人数:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="participateCount" name="participateCount" type="number" max="1000000" min="1" class="form-control" style="height: 30px;width: 300px" placeholder="请输入最多可参与人数" required="required">
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >活动时间:</label>
+                                </div>
+                                <div class="initialLevel col-sm-6 control-label form-group"  >
+                                    <input type="text" id="startTime"  name="startTime" class="form-control" style="max-width:400px !important;display: initial !important;" placeholder="请选择活动时间"/>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >优惠券:</label>
+                                </div>
+                                <div class="initialLevel col-sm-3 control-label form-group"  >
+                                    <button type="button" class="btn btn-primary " onclick="GeneralizationInfoDlg.toSelectCouponOpt()" id="selectCoupon">
+                                        <i class="fa fa-plus"></i>&nbsp;选择优惠券
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-12 control-label form-group"  >
+                                <div class="initialLevel col-sm-12 control-label form-group"  >
+                                    <div class="col-sm-10">
+                                        <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                            <table class="table table-striped table-bordered table-hover table-condensed">
+                                                <thead>
+                                                <tr>
+                                                    <th style="width: 300px;">添加时间</th>
+                                                    <th style="width: 300px;">优惠券类型</th>
+                                                    <th style="width: 300px;">优惠金额</th>
+                                                    <th style="width: 300px;">有效期</th>
+                                                    <th style="width: 300px;">领取人数</th>
+                                                    <th style="width: 300px;">操作</th>
+                                                </tr>
+                                                </thead>
+                                                <tbody id="site">
+                                                </tbody>
+                                            </table>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >每个人发放:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="userGrantCount" name="userGrantCount" type="number" maxlength="11" style="height: 30px;width: 300px" class="form-control" required="required">
+                                </div>
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >张</label>
+                                </div>
+                            </div>
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >每个月可用:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="monthUseCount" name="monthUseCount" type="number" maxlength="11" class="form-control" style="height: 30px;width: 300px" required="required">
+                                </div>
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >张</label>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >使用说明:</label>
+                                </div>
+                                <div class="text-area-container initialLevel col-sm-9 control-label form-group"  >
+                                    <textarea type="text/plain" name="useExplain" id="useExplain" class="form-control" style="width:100%;height:150px;"></textarea>
+                                    <div id="charCount" class="char-count">0/300</div>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10" style="text-align: center">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="GeneralizationInfoDlg.addSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="GeneralizationInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/generalization/generalization_info.js"></script>
+<script src="${ctxPath}/static/modular/system/generalization/sysCouponRecord.js"></script>
+<style type="text/css">
+    #useExplain {
+        width: 100%;
+        height: 100px; /* 根据需要调整高度 */
+        resize: none; /* 禁止用户调整文本域大小 */
+    }
+
+    .char-count {
+        position: absolute;
+        bottom: 5px; /* 根据需要调整距离底部的位置 */
+        right: 10px; /* 根据需要调整距离右侧的位置 */
+        font-size: 12px; /* 根据需要调整字体大小 */
+    }
+</style>
+<script>
+    laydate.render({
+        elem: '#startTime'
+        ,type: 'date'
+        ,range: true
+        ,min: 'new Date()' //最小值今天
+    });
+
+    var textarea = document.getElementById('useExplain');
+    var charCount = document.getElementById('charCount');
+    var maxLength = 300; // 设置最大字数限制
+
+</script>
+@}
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/editHtml.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/editHtml.html
new file mode 100644
index 0000000..450b050
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/editHtml.html
@@ -0,0 +1,194 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="ibox-title">
+            <h5>添加推广活动</h5>
+        </div>
+        <div class="ibox-content" id="activityGeneralizationInfoForm">
+            <div class="row row-lg">
+                <div class="col-sm-12">
+                    <input hidden id="id" value="${item.id}">
+
+                    <div class="col-sm-12" style="cursor: pointer;text-align: right;">
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >活动名称:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="activityName" name="activityName" value="${item.activityName}" type="text" maxlength="40" style="height: 30px;width: 300px" class="form-control"  placeholder="请输入活动名称" required="required">
+                                </div>
+                            </div>
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >最多可参与人数:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="participateCount" name="participateCount" value="${item.participateCount}" type="number" max="1000000" min="1" class="form-control" style="height: 30px;width: 300px" placeholder="请输入最多可参与人数" required="required">
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >活动时间:</label>
+                                </div>
+                                <div class="initialLevel col-sm-6 control-label form-group"  >
+                                    <input type="text" id="startTime"  name="startTime" value="${item.startTime}" class="form-control" style="max-width:400px !important;display: initial !important;" placeholder="请选择活动时间"/>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >优惠券:</label>
+                                </div>
+                                <div class="initialLevel col-sm-3 control-label form-group"  >
+                                    <button type="button" class="btn btn-primary " onclick="GeneralizationInfoDlg.toSelectCouponOpt()" id="selectCoupon">
+                                        <i class="fa fa-plus"></i>&nbsp;选择优惠券
+                                    </button>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-12 control-label form-group"  >
+                                <div class="initialLevel col-sm-12 control-label form-group"  >
+                                    <div class="col-sm-10">
+                                        <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                            <table class="table table-striped table-bordered table-hover table-condensed">
+                                                <thead>
+                                                <tr>
+                                                    <th style="width: 300px;">添加时间</th>
+                                                    <th style="width: 300px;">优惠券类型</th>
+                                                    <th style="width: 300px;">优惠金额</th>
+                                                    <th style="width: 300px;">有效期</th>
+                                                    <th style="width: 300px;">领取人数</th>
+                                                    <th style="width: 300px;">操作</th>
+                                                </tr>
+                                                </thead>
+                                                <tbody id="site">
+                                                    @for(obj in siteList){
+                                                    <tr class="siteClass">
+                                                        <td><input type="hidden" name="id" value="${obj.id}">
+                                                            <input type="hidden" id="insertTime" name="insertTime" value="${obj.insertTime}">${obj.insertTime}</td>
+                                                        @if(obj.couponUseType == 0){
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="0">通用券</td>
+                                                        @}else if(obj.couponUseType == 1){
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="1">专车券</td>
+                                                        @}else if(obj.couponUseType == 2){
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="2">出租券</td>
+                                                        @}else if(obj.couponUseType == 3){
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="3">直通车出行券</td>
+                                                        @}else{
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="7">接送机出行券</td>
+                                                        @}
+                                                        <td><input type="hidden" id="money" name="money" value="${obj.money}">${obj.money}</td>
+                                                        <td><input type="hidden" id="effective" name="effective" value="${obj.effective}">${obj.effective}天</td>
+                                                        <td><input type="hidden" id="receive" name="receive">-</td>
+                                                        <td><button onclick="deleteSub(this)">移除</button></td></td>
+                                                    </tr>
+                                                    @}
+                                                </tbody>
+                                            </table>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >每个人发放:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="userGrantCount" name="userGrantCount" value="${item.userGrantCount}" type="number" maxlength="11" style="height: 30px;width: 300px" class="form-control" required="required">
+                                </div>
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >张</label>
+                                </div>
+                            </div>
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >每个月可用:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="monthUseCount" name="monthUseCount" value="${item.monthUseCount}" type="number" maxlength="11" class="form-control" style="height: 30px;width: 300px" required="required">
+                                </div>
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >张</label>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >使用说明:</label>
+                                </div>
+                                <div class="text-area-container initialLevel col-sm-9 control-label form-group"  >
+                                    <textarea type="text/plain" name="useExplain" id="useExplain" class="form-control" style="width:100%;height:150px;">${item.useExplain}</textarea>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10" style="text-align: center">
+                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="GeneralizationInfoDlg.editSubmit()"/>
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="GeneralizationInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/generalization/generalization_info.js"></script>
+<script src="${ctxPath}/static/modular/system/generalization/sysCouponRecord.js"></script>
+<style type="text/css">
+    #useExplain {
+        width: 100%;
+        height: 100px; /* 根据需要调整高度 */
+        resize: none; /* 禁止用户调整文本域大小 */
+    }
+
+    .char-count {
+        position: absolute;
+        bottom: 5px; /* 根据需要调整距离底部的位置 */
+        right: 10px; /* 根据需要调整距离右侧的位置 */
+        font-size: 12px; /* 根据需要调整字体大小 */
+    }
+</style>
+<script>
+    laydate.render({
+        elem: '#startTime'
+        ,type: 'date'
+        ,range: true
+        ,min: 'new Date()' //最小值今天
+    });
+    $("#startTime").val("${startTime} - ${endTime}")
+
+    var textarea = document.getElementById('useExplain');
+    var charCount = document.getElementById('charCount');
+    var maxLength = 300; // 设置最大字数限制
+
+    $(function() {
+        var button = document.getElementById('selectCoupon');
+        button.disabled = true;
+    })
+
+
+</script>
+@}
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/generalization.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/generalization.html
new file mode 100644
index 0000000..bf0935a
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/generalization.html
@@ -0,0 +1,55 @@
+@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="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#NameCon id="activityName" name="活动名称" />
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="state" name="状态" >
+                                    <option value="">全部</option>
+                                    <option value="1">已开启</option>
+                                    <option value="2">未开启</option>
+                                    <option value="3">已过期</option>
+                                    <option value="4">暂停</option>
+                                </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="Generalization.search()"/>
+                                <#button name="重置" icon="fa-trash" clickFun="Generalization.resetSearch()" space="true"/>
+                            </div>
+                        </div>
+                        <div class="hidden-xs" id="GeneralizationTableToolbar" role="group">
+                            @if(shiro.hasPermission("/generalization/add")){
+                                <#button name="添加" icon="fa-plus" clickFun="Generalization.openAddGeneralization()"/>
+                            @}
+                            @if(shiro.hasPermission("/generalization/updateStatus")){
+                                <#button name="启动/暂停" icon="" clickFun="Generalization.updateStatus()" space="true"/>
+                            @}
+
+                        </div>
+                        <#table id="GeneralizationTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/generalization/generalization.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/generalization_detail.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/generalization_detail.html
new file mode 100644
index 0000000..eeba9c5
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/generalization_detail.html
@@ -0,0 +1,180 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="ibox-title">
+            <h5>推广活动详情</h5>
+        </div>
+        <div class="ibox-content" id="activityGeneralizationInfoForm">
+            <div class="row row-lg">
+                <div class="col-sm-12">
+                    <input hidden id="id" value="${item.id}">
+
+                    <div class="col-sm-12" style="cursor: pointer;text-align: right;">
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >活动名称:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="activityName" name="activityName" value="${item.activityName}" type="text" maxlength="40" style="height: 30px;width: 300px" class="form-control"  disabled>
+                                </div>
+                            </div>
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >最多可参与人数:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="participateCount" name="participateCount" value="${item.participateCount}" type="number" max="1000000" min="1" class="form-control" style="height: 30px;width: 300px" disabled>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >活动时间:</label>
+                                </div>
+                                <div class="initialLevel col-sm-6 control-label form-group"  >
+                                    <input type="text" id="startTime"  name="startTime" value="${item.startTime}" class="form-control" style="max-width:400px !important;display: initial !important;" disabled/>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >优惠券:</label>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-12 control-label form-group"  >
+                                <div class="initialLevel col-sm-12 control-label form-group"  >
+                                    <div class="col-sm-10">
+                                        <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                                            <table class="table table-striped table-bordered table-hover table-condensed">
+                                                <thead>
+                                                <tr>
+                                                    <th style="width: 300px;">添加时间</th>
+                                                    <th style="width: 300px;">优惠券类型</th>
+                                                    <th style="width: 300px;">优惠金额</th>
+                                                    <th style="width: 300px;">有效期</th>
+                                                    <th style="width: 300px;">领取人数</th>
+                                                </tr>
+                                                </thead>
+                                                <tbody id="site">
+                                                    @for(obj in siteList){
+                                                    <tr class="siteClass">
+                                                        <td><input type="hidden" name="id" value="${obj.id}">
+                                                            <input type="hidden" id="insertTime" name="insertTime" value="${obj.insertTime}">${obj.insertTime}</td>
+                                                        @if(obj.couponUseType == 0){
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="0">通用券</td>
+                                                        @}else if(obj.couponUseType == 1){
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="1">专车券</td>
+                                                        @}else if(obj.couponUseType == 2){
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="2">出租券</td>
+                                                        @}else if(obj.couponUseType == 3){
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="3">直通车出行券</td>
+                                                        @}else{
+                                                        <td><input type="hidden" id="couponUseType" name="couponUseType" value="7">接送机出行券</td>
+                                                        @}
+                                                        <td><input type="hidden" id="money" name="money" value="${obj.money}">${obj.money}</td>
+                                                        <td><input type="hidden" id="effective" name="effective" value="${obj.effective}">${obj.effective}天</td>
+                                                        <td><input type="hidden" id="receive" name="receive" >-</td>
+                                                    </tr>
+                                                    @}
+                                                </tbody>
+                                            </table>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >每个人发放:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="userGrantCount" name="userGrantCount" value="${item.userGrantCount}" type="number" maxlength="11" style="height: 30px;width: 300px" class="form-control" disabled>
+                                </div>
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >张</label>
+                                </div>
+                            </div>
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >每个月可用:</label>
+                                </div>
+                                <div class="initialLevel col-sm-4 control-label form-group"  >
+                                    <input id="monthUseCount" name="monthUseCount" value="${item.monthUseCount}" type="number" maxlength="11" class="form-control" style="height: 30px;width: 300px" disabled>
+                                </div>
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >张</label>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="initialLevel col-sm-12 control-label form-group"  >
+                            <div class="initialLevel col-sm-6 control-label form-group"  >
+                                <div class="initialLevel col-sm-2 control-label form-group"  >
+                                    <label class="control-label" >使用说明:</label>
+                                </div>
+                                <div class="text-area-container initialLevel col-sm-9 control-label form-group"  >
+                                    <textarea type="text/plain" name="useExplain" id="useExplain" class="form-control" style="width:100%;height:150px;"  disabled>${item.useExplain}</textarea>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-10" style="text-align: center">
+                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="GeneralizationInfoDlg.close()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/generalization/generalization_info.js"></script>
+<script src="${ctxPath}/static/modular/system/generalization/sysCouponRecord.js"></script>
+<style type="text/css">
+    #useExplain {
+        width: 100%;
+        height: 100px; /* 根据需要调整高度 */
+        resize: none; /* 禁止用户调整文本域大小 */
+    }
+
+    .char-count {
+        position: absolute;
+        bottom: 5px; /* 根据需要调整距离底部的位置 */
+        right: 10px; /* 根据需要调整距离右侧的位置 */
+        font-size: 12px; /* 根据需要调整字体大小 */
+    }
+</style>
+<script>
+    laydate.render({
+        elem: '#startTime'
+        ,type: 'date'
+        ,range: true
+        ,min: 'new Date()' //最小值今天
+    });
+    $("#startTime").val("${startTime} - ${endTime}")
+
+    var textarea = document.getElementById('useExplain');
+    var charCount = document.getElementById('charCount');
+    var maxLength = 300; // 设置最大字数限制
+
+</script>
+@}
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/qrCodeHtml.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/qrCodeHtml.html
new file mode 100644
index 0000000..58d948d
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/qrCodeHtml.html
@@ -0,0 +1,35 @@
+@layout("/common/_container.html"){
+<style>
+    .newWidth, .single-line{
+        max-width:150px !important;display: initial !important;
+    }
+</style>
+<div class="ibox float-e-margins">
+    <div class="ibox-content">
+        <div class="ibox-content" id="activityGeneralizationInfoForm">
+            <div class="row row-lg">
+                <div class="col-sm-12">
+                    <div class="col-sm-12" style="cursor: pointer;text-align: right;">
+                        <div class="initialLevel col-sm-12 control-label form-group" style="text-align: center;"  >
+                            <img src="${qrCode}" id="qrCode" style="height: 250px;width: 250px" disabled="disabled"/>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="row btn-group-m-t">
+                <div class="col-sm-12" style="text-align: center">
+                    <#button btnCss="info" name="下载二维码" id="ensure" icon="fa-check" clickFun="Generalization.downQrCode()"/>
+                </div>
+            </div>
+        </div>
+
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/generalization/generalization.js"></script>
+<script src="${ctxPath}/static/modular/system/generalization/generalization_info.js"></script>
+<script src="${ctxPath}/static/modular/system/generalization/sysCouponRecord.js"></script>
+<script>
+
+</script>
+@}
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/sysCouponRecord.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/sysCouponRecord.html
new file mode 100644
index 0000000..4da1a72
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/generalization/sysCouponRecord.html
@@ -0,0 +1,47 @@
+@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="createTime" name="添加时间" isTime="false"/>
+                            </div>
+                            <div class="col-sm-3">
+                                <#SelectCon id="couponUseType" name="优惠券类型" >
+                                <option value="">全部</option>
+                                <option value="0">通用券</option>
+                                <option value="1">专车券</option>
+                                <option value="2">出租券</option>
+                                <option value="3">直通车出行券</option>
+                                <option value="7">接送机出行券</option>
+                            </#SelectCon>
+                            </div>
+                            <div class="col-sm-3">
+                                <#button name="搜索" icon="fa-search" clickFun="SysCouponRecord.search()"/>
+                                <#button name="重置" icon="fa-search" clickFun="SysCouponRecord.resetSearch()"/>
+                                <#button btnCss="info" name="确定" id="ensure" icon="fa-check" clickFun="SysCouponRecord.selectCouponOpt()" space="true"/>
+                                <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="SysCouponRecord.close()" space="true"/>
+
+                            </div>
+                        </div>
+                        <#table id="SysCouponRecordTable"/>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="${ctxPath}/static/modular/system/generalization/sysCouponRecord.js"></script>
+<script>
+    laydate.render({
+        elem: '#createTime'
+        ,range: true
+    });
+</script>
+@}
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_add.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_add.html
index 5210187..10d5678 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_add.html
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/sysCouponRecord/sysCouponRecord_add.html
@@ -21,6 +21,7 @@
                         <option value="1">专车券</option>
                         <!--<option value="2">出租车券</option>-->
                         <option value="3">直通车券</option>
+                        <option value="7">接送机券</option>
                         <option value="0">通用券</option>
                     </#select>
                     <#input id="money" name="金额" underline="true" placeholder="最多4位数字"/>
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html
index 8e863cf..257228e 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html
@@ -68,7 +68,7 @@
             <div class="row">
                 <div class="col-sm-11">
                     <div class="col-sm-2 control-label">
-                        <input type="checkbox" class="js-switch1" id="isOpen" onchange="isOpen(this.checked)"/>
+                        <input type="checkbox" class="js-switch1" id="isOpen" value="0" onchange="isOpen(this.checked)"/>
                     </div>
                     <div class="col-sm-3 control-label" hidden id="sortByDiv">
                         <input type="number" class="form-control newWidth" id="sortBy" name="sortBy" placeholder="请设置排序值">&nbsp;<span style="color: #0d8ddb">(注:排序值越大,排序越靠前)</span>
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_add.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_add.html
index bea9b39..6a95b87 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_add.html
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_add.html
@@ -1,4 +1,6 @@
 @layout("/common/_container.html"){
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
+
 <div class="ibox float-e-margins">
     <div class="ibox-content">
         <div class="form-horizontal" id="openCityForm">
@@ -64,13 +66,29 @@
 
                     <div class="form-group">
                         <label class="col-sm-3 control-label">机场/动车站点:</label>
+                        <div class="col-sm-2" >
+                            <input class="form-control"  style="width: 250px;" type="text" id="address" onchange="TOpenCityInfoDlg.searchByStationName(this,1)">
+                        </div>
                         <div class="col-sm-3" >
-                            <#input id="businessSort" name=" " value="" />
+                            <#input id="siteName" name="站点名称" value="" />
+                        </div>
+                        <div class="col-sm-3">
+                            <select class="form-control" id="siteType">
+                                <option value="">选择站点类型</option>
+                                <option value="1">机场</option>
+                                <option value="2">动车</option>
+                            </select>
                         </div>
                         <div class="col-sm-2">
-                            <#button btnCss="info" name="添加站点" id="ensure" icon="fa-check" clickFun="addBusinessType()"/>
+                            <#button btnCss="info" name="添加站点" id="ensure" icon="fa-check" clickFun="addSite()"/>
                         </div>
                     </div>
+    <div class="col-sm-10" style="margin-left: 397px;width: 70%;" >
+        <!-- 创建地图容器-->
+        <div id="container" style="height: 500px;" ></div>
+    </div>
+    <div hidden id="longitude"></div>
+    <div hidden id="latitude"></div>
                     <div class="form-group">
                         <label class="col-sm-3 control-label">已添加站点列表:</label>
                         <div class="col-sm-9">
@@ -79,8 +97,9 @@
                                     <thead>
                                     <tr>
                                         <th style="width: 300px;">添加时间</th>
-                                        <th style="width: 300px;">经营业务</th>
-                                        <th style="width: 300px;">排序</th>
+                                        <th style="width: 300px;">站点名称</th>
+                                        <th style="width: 300px;">经纬度</th>
+                                        <th style="width: 300px;">站点类型</th>
                                         <th style="width: 100px;">操作</th>
                                     </tr>
                                     </thead>
@@ -104,4 +123,7 @@
     </div>
 </div>
 <script src="${ctxPath}/static/modular/system/tOpenCity/tOpenCity_info.js"></script>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css">
+<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>-->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js"></script>
 @}
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_edit.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_edit.html
index 94c2fb5..a4f4f5c 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_edit.html
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOpenCity/tOpenCity_edit.html
@@ -1,4 +1,5 @@
 @layout("/common/_container.html"){
+<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=77b37f0753049c4e712ea79a24e0719c"></script>
 <div class="ibox float-e-margins">
     <div class="ibox-content">
         <div class="form-horizontal" id="openCityForm">
@@ -77,7 +78,67 @@
                             </div>
                         </div>
                     </div>
+    <div class="form-group">
+        <label class="col-sm-3 control-label">机场/动车站点:</label>
+        <div class="col-sm-2" >
+            <input class="form-control"  style="width: 250px;" type="text" id="address" onchange="TOpenCityInfoDlg.searchByStationName(this,1)">
+        </div>
+        <div class="col-sm-3" >
+            <#input id="siteName" name="站点名称" value="" />
+        </div>
+        <div class="col-sm-3">
+            <select class="form-control" id="siteType">
+                <option value="">选择站点类型</option>
+                <option value="1">机场</option>
+                <option value="2">动车</option>
+            </select>
+        </div>
+        <div class="col-sm-2">
+            <#button btnCss="info" name="添加站点" id="ensure" icon="fa-check" clickFun="addSite()"/>
+        </div>
+    </div>
+    <div class="col-sm-10" style="margin-left: 397px;width: 70%;" >
+        <!-- 创建地图容器-->
+        <div id="container" style="height: 500px;" ></div>
+    </div>
+    <div hidden id="longitude"></div>
+    <div hidden id="latitude"></div>
+    <div class="form-group">
+        <label class="col-sm-3 control-label">已添加站点列表:</label>
+        <div class="col-sm-9">
+            <div style="height: 200px; border: 1px solid #e5e6e7;overflow-y: auto;">
+                <table class="table table-striped table-bordered table-hover table-condensed">
+                    <thead>
+                    <tr>
+                        <th style="width: 300px;">添加时间</th>
+                        <th style="width: 300px;">站点名称</th>
+                        <th style="width: 300px;">经纬度</th>
+                        <th style="width: 300px;">站点类型</th>
+                        <th style="width: 100px;">操作</th>
+                    </tr>
+                    </thead>
+                    <tbody id="site">
+                    @for(obj in siteList){
+                    <tr class="siteClass">
+                        <td>
+                            <input type="hidden" id="busId" name="busId" value="${obj.id}">
+                            <input type="hidden" id="time" name="time" value="${obj.insertTime1}">${obj.insertTime1}</td>
+                        <td><input type="hidden" id="name" name="name" value="${obj.name}">${obj.name}</td>
+                        <td><input type="hidden" id="lonAndLat" name="lonAndLat" value="(${obj.lon},${obj.lat})">(${obj.lon},${obj.lat})</td>
+                        @if(obj.type == 1){
+                        <td><input type="hidden" id="siteType" name="siteType" value="1">机场</td>
+                        @}else{
+                        <td><input type="hidden" id="siteType" name="siteType" value="2">动车</td>
+                        @}
 
+                        <td><button onclick="deleteSub(this)">移除</button></td></td>
+                    </tr>
+                    @}
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>
                 </div>
             </div>
 
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html
index aaa036f..65f4350 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html
@@ -126,9 +126,11 @@
                     <h2 class="h3Class" style="font-weight: 700;">行程录音</h2>
                 </div>
                 <div class="col-sm-10">
-                    <audio id="audio" src="http://www.w3capi.com/upload/audio/audio_example.mp3" controls muted data-enabled="false">
-                        <!--                    <source src="${item.routeRecord}" type="audio/mpeg">-->
-                    </audio>
+                    @if(isNotEmpty(routeRecordList)){
+                        @for(obj in routeRecordList){
+                            <audio id="audio" src="${obj.routeRecord}" controls muted data-enabled="false"></audio>
+                        @}
+                    @}
                 </div>
             </div>
 
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html
index 9ec61d7..cdcef51 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html
@@ -110,9 +110,11 @@
                     <h2 class="h3Class" style="font-weight: 700;">行程录音</h2>
                 </div>
                 <div class="col-sm-10">
-                    <audio id="audio" src="http://www.w3capi.com/upload/audio/audio_example.mp3" controls muted data-enabled="false">
-                        <!--                    <source src="${item.routeRecord}" type="audio/mpeg">-->
-                    </audio>
+                    @if(isNotEmpty(routeRecordList)){
+                        @for(obj in routeRecordList){
+                            <audio id="audio" src="${obj.routeRecord}" controls muted data-enabled="false"></audio>
+                        @}
+                    @}
                 </div>
             </div>
 
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTape/tOrderTape.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTape/tOrderTape.html
index 41f4ff5..5a40553 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTape/tOrderTape.html
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTape/tOrderTape.html
@@ -36,7 +36,8 @@
                             @}
                         </div>
                         <#table id="TOrderTapeTable"/>
-                    </div>
+                    <audio id="recording" src="" style="display: none;"></audio>
+                </div>
                 </div>
             </div>
         </div>
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_orderDetail.html b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_orderDetail.html
index 13110b2..3902d33 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_orderDetail.html
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_orderDetail.html
@@ -110,9 +110,11 @@
                     <h2 class="h3Class" style="font-weight: 700;">行程录音</h2>
                 </div>
                 <div class="col-sm-10">
-                    <audio id="audio" src="http://www.w3capi.com/upload/audio/audio_example.mp3" controls muted data-enabled="false">
-                        <!--                    <source src="${item.routeRecord}" type="audio/mpeg">-->
-                    </audio>
+                    @if(isNotEmpty(routeRecordList)){
+                        @for(obj in routeRecordList){
+                            <audio id="audio" src="${obj.routeRecord}" controls muted data-enabled="false"></audio>
+                        @}
+                    @}
                 </div>
             </div>
 
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/generalization.js b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/generalization.js
new file mode 100644
index 0000000..fc076a2
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/generalization.js
@@ -0,0 +1,236 @@
+/**
+ * 管理初始化
+ */
+var Generalization = {
+    id: "GeneralizationTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+Generalization.initColumn = function () {
+    return [
+            {field: 'selectItem', radio: true},
+            {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
+            {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '活动名称', field: 'activityName', visible: true, align: 'center', valign: 'middle'},
+            {title: '活动时间', field: 'time', visible: true, align: 'center', valign: 'middle'},
+            {title: '最多可参与人数', field: 'participateCount', visible: true, align: 'center', valign: 'middle'},
+            {title: '当前参与人数', field: 'count', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    return '<a href="#"  style="color:cornflowerblue">'+row.count+'</a>' +'&nbsp;' +'&nbsp;'+'&nbsp;'+'&nbsp;'+'&nbsp;'+
+                        '<a href="#" onclick="Generalization.activityRecord('+row.id+')" style="color:cornflowerblue">查看领取记录</a>' +'&nbsp;'
+                }
+            },
+            {title: '当前状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==1){
+                        return "已开启";
+                    }else if(value==2){
+                        return "未开启";
+                    }else if(value==3){
+                        return "已结束";
+                    }else if(value==4){
+                        return "已暂停";
+                    }
+                }
+            },
+            {title: '操作', visible: true, align: 'center', valign: 'middle',width:'16%',
+                formatter: function (value, row) {
+                    if(row.state==1){
+                        return '<a href="#" onclick="Generalization.openQrCodeGeneralization('+row.id+')" style="color:cornflowerblue">二维码</a>' +'&nbsp;' +
+                            '<a href="#" onclick="Generalization.openGeneralizationDetail('+row.id+')" style="color:cornflowerblue">详情</a>' +'&nbsp;' +
+                            '<a href="#" onclick="Generalization.openUpdateGeneralization('+row.id+')" style="color:cornflowerblue">编辑</a>' +'&nbsp;' +
+                            '<a href="#" onclick="Generalization.delete('+row.id+')" style="color:cornflowerblue">删除</a>'
+                    }else{
+                        return '<a href="#" onclick="Generalization.openQrCodeGeneralization('+row.id+')" style="color:cornflowerblue">二维码</a>' +'&nbsp;' +
+                            '<a href="#" onclick="Generalization.openGeneralizationDetail('+row.id+')" style="color:cornflowerblue">详情</a>' +'&nbsp;' +
+                            '<a href="#" onclick="Generalization.delete('+row.id+')" style="color:cornflowerblue">删除</a>'
+                    }
+                }
+            }
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+Generalization.check = function (type) {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        //验证类型null删除,1=审核,2=编辑,3=启动/暂停
+        if(type==null){
+            Generalization.seItem = selected[0];
+            return true;
+        }else if(type==3 && selected[0].state==3){
+            Feng.info("当前状态不能暂停/启动!");
+            return false;
+        }
+        Generalization.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 点击添加
+ */
+Generalization.openAddGeneralization = function () {
+    var index = layer.open({
+        type: 2,
+        title: '添加推广活动',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/generalization/addHtml'
+    });
+    this.layerIndex = index;
+};
+/**
+ * 打开编辑
+ */
+Generalization.openUpdateGeneralization = function (id) {
+    console.log("111222211==="+id);
+    var index = layer.open({
+        type: 2,
+        title: '编辑推广活动',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/generalization/editHtml/' + id
+    });
+    this.layerIndex = index;
+};
+/**
+ * 打开二维码
+ */
+Generalization.openQrCodeGeneralization = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '推广二维码',
+        area: ['50%', '50%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/generalization/qrCodeHtml/' + id
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 下载二维码
+ */
+Generalization.downQrCode = function () {
+    var imgElement = document.getElementById('qrCode');
+    var imgURL = imgElement.src;
+    console.log(imgURL)
+    // var downloadLink = document.createElement('a');
+    // downloadLink.href = imgURL;
+    // downloadLink.download = '二维码.png'; // 自定义下载文件名
+    // // 将链接添加到文档中(可以是隐藏的)
+    // document.body.appendChild(downloadLink);
+    // // 触发点击
+    // downloadLink.click();
+    // // 清理,可选
+    // document.body.removeChild(downloadLink);
+    // GeneralizationInfoDlg.close();
+
+    var ajax = new $ax(Feng.ctxPath + "/generalization/downQrcode", function(data){
+        Feng.success("下载成功!");
+        GeneralizationInfoDlg.close();
+    },function(data){
+        Feng.error("下载失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("imgURL",imgURL);
+    ajax.start();
+
+};
+
+/**
+ * 打开查看详情
+ */
+Generalization.openGeneralizationDetail = function (id) {
+    var index = layer.open({
+        type: 2,
+        title: '详情',
+        area: ['100%', '100%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/generalization/generalization_detail/' + id
+    });
+    this.layerIndex = index;
+};
+
+/**
+ * 删除
+ */
+Generalization.delete = function (id) {
+    var ajax = new $ax(Feng.ctxPath + "/generalization/delete", function (data) {
+        Feng.success("删除成功!");
+        Generalization.table.refresh();
+    }, function (data) {
+        Feng.error("删除失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("tActivityGeneralizationId",id);
+    ajax.start();
+};
+
+/**
+ * 启动/暂停
+ */
+Generalization.updateStatus = function () {
+    if (this.check(3)) {
+        var ajax = new $ax(Feng.ctxPath + "/generalization/updateStatus", function (data) {
+            Feng.success("启动/暂停成功!");
+            Generalization.table.refresh();
+        }, function (data) {
+            Feng.error("启动/暂停失败!" + data.responseJSON.message + "!");
+        });
+        ajax.set("id",this.seItem.id);
+        ajax.set("status",this.seItem.state==4?1:4);
+        ajax.start();
+    }
+};
+/**
+ * 领取记录
+ */
+Generalization.receiveRecord= function () {
+    if (this.check()) {
+        var index = layer.open({
+            type: 2,
+            title: '领取记录',
+            area: ['100%', '100%'], //宽高
+            fix: false, //不固定
+            maxmin: true,
+            content: Feng.ctxPath + '/generalization/receiveRecord?activityId='+ Generalization.seItem.id
+        });
+        this.layerIndex = index;
+    }
+};
+
+/**
+ * 查询列表
+ */
+Generalization.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['activityName'] = $("#activityName").val();
+    queryData['state'] = $("#state").val();
+    Generalization.table.refresh({query: queryData});
+};
+Generalization.resetSearch = function () {
+    $("#createTime").val("");
+    $("#activityName").val("");
+    $("#state").val("");
+    Generalization.search();
+};
+$(function () {
+    var defaultColunms = Generalization.initColumn();
+    var table = new BSTable(Generalization.id, "/generalization/list", defaultColunms);
+    table.setPaginationType("server");
+    Generalization.table = table.init();
+});
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/generalization_info.js b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/generalization_info.js
new file mode 100644
index 0000000..6f1154a
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/generalization_info.js
@@ -0,0 +1,358 @@
+/**
+ * 初始化详情对话框
+ */
+var GeneralizationInfoDlg = {
+    GeneralizationInfoData : {},
+    validateFields: {
+        activityName: {
+            validators: {
+                notEmpty: {
+                    message: '请输入活动名称'
+                }
+            }
+        },
+        participateCount: {
+            validators: {
+                notEmpty: {
+                    message: '请输入最多参与人数'
+                }
+            }
+        },
+        startTime: {
+            validators: {
+                notEmpty: {
+                    message: '请选择活动时间'
+                }
+            }
+        },
+        userGrantCount: {
+            validators: {
+                notEmpty: {
+                    message: '请输入发放数量'
+                }
+            }
+        },
+        monthUseCount: {
+            validators: {
+                notEmpty: {
+                    message: '请输入每月可用数量'
+                }
+            }
+        },
+    }
+};
+
+/**
+ * 验证数据是否为空
+ */
+GeneralizationInfoDlg.validate = function () {
+    $('#activityGeneralizationInfoForm').data("bootstrapValidator").resetForm();
+    $('#activityGeneralizationInfoForm').bootstrapValidator('validate');
+    return $("#activityGeneralizationInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+GeneralizationInfoDlg.clearData = function() {
+    this.generalizationInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+GeneralizationInfoDlg.set = function(key, val) {
+    this.generalizationInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+    return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+GeneralizationInfoDlg.get = function(key) {
+    return $("#" + key).val();
+}
+
+/**
+ * 关闭此对话框
+ */
+GeneralizationInfoDlg.close = function() {
+    parent.layer.close(window.parent.Generalization.layerIndex);
+}
+
+/**
+ * 收集数据
+ */
+GeneralizationInfoDlg.collectData = function() {
+    this
+    .set('id')
+    .set('activityName')
+    .set('participateCount')
+    .set('startTime')
+    .set('endTime')
+    .set('couponId')
+    .set('userGrantCount')
+    .set('monthUseCount')
+    .set('useExplain')
+    .set('state')
+    .set('qrCode')
+    .set('insertTime');
+}
+
+/**
+ * 提交添加
+ */
+GeneralizationInfoDlg.addSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var couponId=null;
+    $(".siteClass").each(function () {
+        couponId = $(this).find("input[name*='id']").val()
+    });
+
+    var startTime1 = $("#startTime").val();
+    var time = startTime1.split(" - ");
+    var startTime = time[0] + " 00:00:00";
+    var endTime = time[1] + " 23:59:59";
+
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/generalization/add", function(data){
+        Feng.success("添加成功!");
+        window.parent.Generalization.table.refresh();
+        GeneralizationInfoDlg.close();
+    },function(data){
+        Feng.error("添加失败!" + data.responseJSON.message + "!");
+    });
+    this.set('couponId',couponId);
+    this.set('startTime',startTime);
+    this.set('endTime',endTime);
+    ajax.set(this.generalizationInfoData);
+    ajax.start();
+}
+
+/**
+ * 提交修改
+ */
+GeneralizationInfoDlg.editSubmit = function() {
+
+    this.clearData();
+    this.collectData();
+    if(!this.validate()){
+        return ;
+    }
+    var couponId=null;
+    $(".siteClass").each(function () {
+        couponId = $(this).find("input[name*='id']").val()
+    });
+
+    var startTime1 = $("#startTime").val();
+    console.log(startTime1)
+    var time = startTime1.split(" - ");
+    var startTime = time[0] + " 00:00:00";
+    var endTime = time[1] + " 23:59:59";
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/generalization/update", function(data){
+        Feng.success("修改成功!");
+        window.parent.Generalization.table.refresh();
+        GeneralizationInfoDlg.close();
+    },function(data){
+        Feng.error("修改失败!" + data.responseJSON.message + "!");
+    });
+    console.log(this.generalizationInfoData)
+    this.set('couponId',couponId);
+    this.set('startTime',startTime);
+    this.set('endTime',endTime);
+    ajax.set(this.generalizationInfoData);
+    ajax.start();
+}
+/**
+ * 立即处理
+ */
+GeneralizationInfoDlg.immediately = function(){
+
+    this.clearData();
+    this.collectData();
+
+    var remark = $("#remark").val();
+    if (remark.length > 250){
+        Feng.info("备注不能超过250个字");
+        return;
+    }
+    var state = $("input[name='state']:checked").val();
+    //提交信息
+    var ajax = new $ax(Feng.ctxPath + "/userActivity/immediately", function(data){
+        Feng.success("处理成功!");
+        window.parent.Generalization.table.refresh();
+        GeneralizationInfoDlg.close();
+    },function(data){
+        Feng.error("处理失败!" + data.responseJSON.message + "!");
+    });
+    ajax.set("id",$("#id").val());
+    ajax.set("state",state);
+    ajax.set("remark",$("#remark").val());
+    ajax.start();
+}
+
+/**
+ * 跳转到选择优惠券页面
+ */
+GeneralizationInfoDlg.toSelectCouponOpt = function () {
+    var index = layer.open({
+        type: 2,
+        title: '选择优惠券',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/generalization/sysCouponRecord'
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 选择优惠券后数据回显
+ * @param id
+ * @param couponUseType
+ * @param couponType
+ * @param money
+ */
+GeneralizationInfoDlg.selectCouponOpt9=function(id,insertTime,couponUseType,money,effective,receive){
+    if(receive == null || receive == "" || receive == undefined){
+        receive = "-";
+    }
+
+    // 0="通用券" 1="专车券" 2="出租券" 3="直通车出行券" 7="接送机出行券"
+    var type = "";
+    if(couponUseType == 0){
+        type = '<td><input type="hidden" id="couponUseType" name="couponUseType" value="'+couponUseType+'">通用券</td>';
+    }else if(couponUseType == 1){
+        type = '<td><input type="hidden" id="couponUseType" name="couponUseType" value="'+couponUseType+'">专车券</td>';
+    }else if(couponUseType == 2){
+        type = '<td><input type="hidden" id="couponUseType" name="couponUseType" value="'+couponUseType+'">出租券</td>';
+    }else if(couponUseType == 3){
+        type = '<td><input type="hidden" id="couponUseType" name="couponUseType" value="'+couponUseType+'">直通车出行券</td>';
+    }else{
+        type = '<td><input type="hidden" id="couponUseType" name="couponUseType" value="'+couponUseType+'">接送机出行券</td>';
+    }
+
+    var str = '<tr class="siteClass">' +
+        '<td><input type="hidden" id="id" name="id" value="'+id+'">' +
+        '<input type="hidden" id="insertTime" name="insertTime" value="'+insertTime+'">' + insertTime + '</td>' +
+        type +
+        '<td><input type="hidden" id="money" name="money" value="'+money+'">' + money + '</td>' +
+        '<td><input type="hidden" id="effective" name="effective" value="'+effective+'">' + effective + "天"+'</td>' +
+        '<td><input type="hidden" id="receive" name="receive" value="'+receive+'">' + receive + '</td>' +
+        // '</tr>';
+        '<td><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#site").append(str);
+    var button = document.getElementById('selectCoupon');
+    button.disabled = true;
+}
+
+
+/**
+ * 跳转到选择优惠券页面
+ */
+GeneralizationInfoDlg.toSelectCouponOpt1 = function () {
+    var index = layer.open({
+        type: 2,
+        title: '选择优惠券',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userActivity/sysCouponRecord1'
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 选择优惠券后数据回显
+ * @param id
+ * @param couponUseType
+ * @param couponType
+ * @param money
+ */
+GeneralizationInfoDlg.selectCouponOpt1=function(id,couponUseType,couponType,money,name){
+    $("#content3Num2").val(couponUseType==0?"通用券":couponUseType==1?"专车券":couponUseType==2?"出租券":"直通车出行券");
+    $("#content3Num3").val(couponType==1?"抵扣":"满减");
+    $("#content3Num4").val(money);
+    $("#content3CouponId").val(id);
+    $("#content3Num1").val(name);
+}
+/**
+ * 跳转到选择优惠券页面
+ */
+GeneralizationInfoDlg.toSelectRedOpt = function () {
+    var index = layer.open({
+        type: 2,
+        title: '选择红包',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userActivity/sysRedPacketRecord'
+    });
+    this.layerIndex = index;
+}
+
+/**
+ * 选择优惠券后数据回显
+ * @param id
+ * @param couponUseType
+ * @param couponType
+ * @param money
+ */
+GeneralizationInfoDlg.selectRedOpt=function(id,type,totalMoney,money,startMoney,endMoney,effective){
+    $("#content6Num1").val(type==1?"固定金额":"随机金额");
+    $("#content6Num3").val(type==1?money:startMoney+"-"+endMoney);
+    $("#content6Num4").val(effective);
+    $("#content6RedId").val(id);
+    $("#content6Num2").val(totalMoney);
+}
+/**
+ * 跳转添加充值送优惠券页面
+ */
+GeneralizationInfoDlg.toAddRegistOpt = function () {
+    var index = layer.open({
+        type: 2,
+        title: '充值赠送优惠券',
+        area: ['90%', '80%'], //宽高
+        fix: false, //不固定
+        maxmin: true,
+        content: Feng.ctxPath + '/userActivity/addRegist'
+    });
+    this.layerIndex = index;
+}
+GeneralizationInfoDlg.addRegistOpt = function (num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,num11,id1,id2,id3,id4) {
+    var str = '<tr class="timeClass">' +
+        '<td><input type="hidden" id="id1" name="id1" value="'+id1+'"><input type="hidden" id="num1" name="num1" value="'+num1+'">' + num1 + '</td>' +
+        '<td><input type="hidden" id="id2" name="id2" value="'+id2+'"><input type="hidden" id="num10" name="num10" value="'+num10+'">' + num10 + '</td>' +
+        '<td><input type="hidden" id="num11" name="num11" value="'+num11+'">' + num11 + '</td>' +
+        '<td><input type="hidden" id="id3" name="id3" value="'+id3+'"><input type="hidden" id="num3" name="num3" value="'+num3+'">' + num3 + '</td>' +
+        '<td><input type="hidden" id="id4" name="id4" value="'+id4+'"><input type="hidden" id="num2" name="num2" value="'+num2+'">' + num2 + '</td>' +
+        '<td><input type="hidden" id="num5" name="num5" value="'+num5+'">' + num5 + '</td>' +
+        '<td><input type="hidden" id="num4" name="num4" value="'+num4+'">' + num4 + '</td>' +
+        '<td><input type="hidden" id="num7" name="num7" value="'+num7+'">' + num7 + '</td>' +
+        '<td><input type="hidden" id="num6" name="num6" value="'+num6+'">' + num6 + '</td>' +
+        '<td><input type="hidden" id="num9" name="num9" value="'+num9+'">' + num9 + '</td>' +
+        '<td><input type="hidden" id="num8" name="num8" value="'+num8+'">' + num8 + '</td>' +
+        '<td><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#coun").append(str);
+}
+function deleteSub(e) {
+    $(e).parent().parent().remove();
+    var button = document.getElementById('selectCoupon');
+    button.disabled = false;
+}
+
+$(function() {
+    Feng.initValidator("activityGeneralizationInfoForm", GeneralizationInfoDlg.validateFields);
+});
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/sysCouponRecord.js b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/sysCouponRecord.js
new file mode 100644
index 0000000..65c4df1
--- /dev/null
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/generalization/sysCouponRecord.js
@@ -0,0 +1,162 @@
+/**
+ * 管理初始化
+ */
+var SysCouponRecord = {
+    id: "SysCouponRecordTable",	//表格id
+    seItem: null,		//选中的条目
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+SysCouponRecord.initColumn = function () {
+    return [
+            {field: 'selectItem', radio: true},
+            {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle',width:'8%'},
+            {title: '添加时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'},
+            {title: '优惠券类型', field: 'couponUseType', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                    if(value==0){
+                        return "通用券";
+                    }else if(value==1){
+                        return "专车券";
+                    }else if(value==2){
+                        return "出租券";
+                    }else if(value==3){
+                        return "直通车出行券";
+                    }else if(value==7){
+                        return "接送机出行券";
+                    }else{
+                        return "";
+                    }
+                }
+            },
+            {title: '优惠金额', field: 'money', visible: true, align: 'center', valign: 'middle'},
+            {title: '有效期', field: 'effective', visible: true, align: 'center', valign: 'middle',
+                formatter: function (value, row) {
+                   return value+"天";
+                }
+            },
+            {title: '领取人数', field: 'receive', visible: true, align: 'center', valign: 'middle'},
+    ];
+};
+
+/**
+ * 检查是否选中
+ */
+SysCouponRecord.check = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if(selected.length == 0){
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }else{
+        SysCouponRecord.seItem = selected[0];
+        return true;
+    }
+};
+
+/**
+ * 关闭选择用户页面
+ */
+SysCouponRecord.close = function () {
+    parent.layer.close(window.parent.GeneralizationInfoDlg.layerIndex);
+}
+SysCouponRecord.close1 = function () {
+    parent.layer.close(window.parent.RegistInfoDlg.layerIndex);
+}
+
+/**
+ * 确认选择
+ */
+SysCouponRecord.selectCouponOpt = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    var id = selected[0].id;
+    var insertTime = selected[0].insertTime;
+
+    var couponUseType = selected[0].couponUseType;
+    var couponType = selected[0].couponType;
+    var money = selected[0].money;
+    var name = selected[0].name;
+    var effective = selected[0].effective;
+    var receive = selected[0].receive;
+    if ("" == id || null == id || undefined == id){
+        Feng.info("请先选中表格中的某一记录!");
+        return ;
+    }
+    var obj = $("#obj").val();
+    window.parent.GeneralizationInfoDlg.selectCouponOpt9(id,insertTime,couponUseType,money,effective,receive);
+    SysCouponRecord.close();
+}
+
+
+/**
+ * 确认选择
+ */
+SysCouponRecord.selectCouponOpt1 = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    var id = selected[0].id;
+    var couponUseType = selected[0].couponUseType;
+    var couponType = selected[0].couponType;
+    var money = selected[0].money;
+    var name = selected[0].name;
+    if ("" == id || null == id || undefined == id){
+        Feng.info("请先选中表格中的某一记录!");
+        return ;
+    }
+    var obj = $("#obj").val();
+    window.parent.GeneralizationInfoDlg.selectCouponOpt1(id,couponUseType,couponType,money,name);
+    SysCouponRecord.close();
+}
+/**
+ * 确认选择
+ */
+SysCouponRecord.selectCouponOpt2 = function () {
+    var selected = $('#' + this.id).bootstrapTable('getSelections');
+    if (selected.length == 0) {
+        Feng.info("请先选中表格中的某一记录!");
+        return false;
+    }
+    var id = selected[0].id;
+    var money = selected[0].money;
+    var couponUseType = selected[0].couponUseType;
+    if ("" == id || null == id || undefined == id){
+        Feng.info("请先选中表格中的某一记录!");
+        return ;
+    }
+    var obj = $("#obj").val();
+    window.parent.RegistInfoDlg.selectCouponOpt(id,money,couponUseType);
+    parent.layer.close(window.parent.RegistInfoDlg.layerIndex);
+}
+/**
+ * 查询列表
+ */
+SysCouponRecord.search = function () {
+    var queryData = {};
+    queryData['createTime'] = $("#createTime").val();
+    queryData['couponUseType'] = $("#couponUseType").val();
+    SysCouponRecord.table.refresh({query: queryData});
+};
+SysCouponRecord.resetSearch = function () {
+    $("#createTime").val("");
+    $("#couponUseType").val("");
+    SysCouponRecord.search();
+};
+$(function () {
+    var defaultColunms = SysCouponRecord.initColumn();
+    var table = new BSTable(SysCouponRecord.id, "/sysCouponRecord/list", defaultColunms);
+    table.setPaginationType("server");
+    var queryData = {};
+    queryData['couponUseType'] = $("#couponUseType").val();
+    table.setQueryParams(queryData);
+    SysCouponRecord.table = table.init();
+});
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord.js b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord.js
index 821d8c2..86a2057 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord.js
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/sysCouponRecord/sysCouponRecord.js
@@ -28,6 +28,8 @@
                         return "出租券";
                     }else if(value==3){
                         return "直通车出行券";
+                    }else if(value==7){
+                        return "接送机出行券";
                     }else{
                         return "";
                     }
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity_info.js b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity_info.js
index 7fa11db..50ec3a7 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity_info.js
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOpenCity/tOpenCity_info.js
@@ -112,6 +112,16 @@
             sort:$(this).find("input[name*='sort']").val(),
         })
     });
+    var subArr1=[];
+    $(".siteClass").each(function () {
+        subArr1.push({
+            busId:$(this).find("input[name*='busId']").val(),
+            time:$(this).find("input[name*='time']").val(),
+            name:$(this).find("input[name*='name']").val(),
+            lonAndLat:$(this).find("input[name*='lonAndLat']").val(),
+            siteType:$(this).find("input[name*='siteType']").val(),
+        })
+    });
     if(subArr.length <= 0){
         Feng.error("请选择经营业务");
         return;
@@ -137,6 +147,7 @@
     });
     ajax.set(this.tOpenCityInfoData);
     ajax.set("businessTypeStr",JSON.stringify(subArr));
+    ajax.set("sites",JSON.stringify(subArr1));
     ajax.set("areaName",provinceValue);
     ajax.set("cityName",cityValue);
     ajax.set("provinceName",areaValue);
@@ -165,6 +176,16 @@
             sort:$(this).find("input[name*='sort']").val(),
         })
     });
+    var subArr1=[];
+    $(".siteClass").each(function () {
+        subArr1.push({
+            busId:$(this).find("input[name*='busId']").val(),
+            time:$(this).find("input[name*='time']").val(),
+            name:$(this).find("input[name*='name']").val(),
+            lonAndLat:$(this).find("input[name*='lonAndLat']").val(),
+            siteType:$(this).find("input[name*='siteType']").val(),
+        })
+    });
     if(subArr.length <= 0){
         Feng.error("请选择经营业务");
         return;
@@ -190,6 +211,7 @@
     });
     ajax.set(this.tOpenCityInfoData);
     ajax.set("businessTypeStr",JSON.stringify(subArr));
+    ajax.set("sites",JSON.stringify(subArr1));
     ajax.set("areaName",provinceValue);
     ajax.set("cityName",cityValue);
     ajax.set("provinceName",areaValue);
@@ -286,7 +308,52 @@
         '<td><input type="hidden" id="sort" name="sort" value="'+businessSort+'">' + businessSort + '</td><td><button onclick="deleteSub(this)">移除</button></td></tr>';
     $("#coun").append(str);
 }
+function addSite(){
 
+    var siteName=$("#siteName").val();
+    var siteType=$("#siteType").val();
+    var type = siteType;
+    if ("" == siteName){
+        Feng.info("站点名称不能为空");
+        return;
+    }
+    if ("" == siteType){
+        Feng.info("请选择站点类型");
+        return;
+    }
+    if (siteType == 1){
+        siteType = "机场"
+    }else{
+        siteType = "动车"
+    }
+    //获取所有的值
+    var subArr=[];
+    $(".siteClass").each(function () {
+
+        subArr.push({
+            name:$(this).find("input[name*='name']").val(),
+            time:$(this).find("input[name*='time']").val(),
+        })
+    });
+    for(var i=0;i<subArr.length;i++){
+        var name = subArr[i].name;
+        if (name == siteName) {
+            Feng.info("站点名称已存在,请重新填写");
+            return;
+        }
+    }
+    var lon = $("#longitude").val();
+    var lat = $("#latitude").val();
+    var lonAndLat = "("+lon+","+lat+")";
+    var str = '<tr class="siteClass">' +
+        '<td><input type="hidden" id="busId" name="busId" value="0">' +
+        '<input type="hidden" id="time" name="time" value="'+getNowFormatDate()+'">' + getNowFormatDate() + '</td>' +
+        '<td><input type="hidden" id="name" name="name" value="'+siteName+'">' + siteName + '</td>' +
+        '<td><input type="hidden" id="lonAndLat" name="lonAndLat" value="'+lonAndLat+'">' + lonAndLat + '</td>' +
+        '<td><input type="hidden" id="siteType" name="siteType" value="'+type+'">' + siteType + '</td>' +
+        '<td><button onclick="deleteSub(this)">移除</button></td></tr>';
+    $("#site").append(str);
+}
 function deleteSub(e) {
     $(e).parent().parent().remove();
 }
@@ -306,4 +373,101 @@
     }
     var currentdate = year + seperator1 + month + seperator1 + strDate;
     return currentdate;
+}
+var  map = new AMap.Map('container', {
+    resizeEnable: true, // 允许缩放
+    zoom: 15        // 设置地图的缩放级别,0 - 20
+});
+var marker;
+//搜索地图
+TOpenCityInfoDlg.searchByStationName  = function(e,type){
+    var keyword="";
+    if(type==2){
+        keyword = $(e).parent().prev().find("input").val();
+    }else {
+        if($("#address").val()!=null && $("#address").val()!=''){
+            keyword = $("#address").val();
+        }
+    }
+    type=1;
+    AMap.plugin('AMap.Geocoder', function() {
+        var geocoder = new AMap.Geocoder();
+        console.log(geocoder)
+        console.log(keyword)
+        geocoder.getLocation(keyword, function(status, result) {
+            console.log(status,result)
+            if (status === 'complete' && result.info === 'OK') {
+                // 经纬度
+                var lng = result.geocodes[0].location.lng;
+                var lat = result.geocodes[0].location.lat;
+                $("#longitude").val(lng)
+                $("#latitude").val(lat)
+                // 地图实例
+                map = new AMap.Map('container', {
+                    resizeEnable: true, // 允许缩放
+                    center: [lng, lat], // 设置地图的中心点
+                    zoom: 15        // 设置地图的缩放级别,0 - 20
+                });
+                //地图画点
+                //addMarker(lng,lat);
+                if(type==1 || type==2){
+                    showInfoClick();
+                    if(lng == null){
+                    }else{
+                        addMarker(lng,lat);
+                    }
+                }else{
+                    addMarker(lng,lat);
+                }
+            } else {
+                console.log('定位失败!');
+            }
+        });
+    });
+
+}
+//地图点击事件
+function showInfoClick(){
+    map.on('click', function (e) {
+        addMarker(e.lnglat.getLng(),e.lnglat.getLat());
+    });
+}
+//删除点
+function removeMarkers(){
+    if(marker!=null){
+        map.remove(marker);
+    }
+
+}
+// 实例化点标记
+function addMarker(lon,lat) {
+    removeMarkers();
+    marker = new AMap.Marker({
+        map: map,
+        position: new AMap.LngLat(lon, lat),   // 经纬度
+    });
+    //加经纬度
+    $("#lon").val(lon);
+    $("#lat").val(lat);
+    var lnglatXY = [lon, lat];//地图上所标点的坐标
+    AMap.service('AMap.Geocoder',function() {//回调函数
+        geocoder = new AMap.Geocoder({
+        });
+        geocoder.getAddress(lnglatXY, function (status, result) {
+            if (status === 'complete' && result.info === 'OK') {
+                //获得了有效的地址信息:
+                //即,result.regeocode.formattedAddress
+                // alert(result.regeocode.formattedAddress)
+                //document.getElementById("address").value=result.regeocode.formattedAddress;//将获取到的地址信息赋值给文本框,保存进数据库
+
+                var address = result.regeocode.formattedAddress;
+                var city = result.regeocode.addressComponent.city;
+                var province = result.regeocode.addressComponent.province;
+                var district = result.regeocode.addressComponent.district;
+                $("#address").val(address);
+            } else {
+                //获取地址失败
+            }
+        });
+    })
 }
\ No newline at end of file
diff --git a/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOrderTape/tOrderTape.js b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOrderTape/tOrderTape.js
index 2e92e94..cc4e089 100644
--- a/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOrderTape/tOrderTape.js
+++ b/ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOrderTape/tOrderTape.js
@@ -78,9 +78,14 @@
         },
         {title: '操作', visible: true, align: 'center', valign: 'middle',width:'16%',
             formatter: function (value, row) {
-                return '<a href="#" onclick="TOrderTape.orderDetail('+row.orderId+','+row.orderType+')" style="color:cornflowerblue">查看订单</a>' +'&nbsp;' +
-                    '<a href="#" onclick="TOrderTape.openTCharteredServiceDetail('+row.id+')" style="color:cornflowerblue">播放录音</a>' +'&nbsp;' +
-                    '<a href="#" onclick="TOrderTape.delete('+row.id+')" style="color:cornflowerblue">删除</a>'
+                if(row.state == 1) {
+                    return '<a href="#" onclick="TOrderTape.orderDetail('+row.orderId+','+row.orderType+')" style="color:cornflowerblue">查看订单</a>' +'&nbsp;' +
+                        '<a href="#" onclick="TOrderTape.playAudio('+row.id+')" style="color:cornflowerblue">播放录音</a>' +'&nbsp;' +
+                        '<a href="#" onclick="TOrderTape.delete('+row.id+')" style="color:cornflowerblue">删除</a>'
+                }else {
+                    return '<a href="#" onclick="TOrderTape.orderDetail('+row.orderId+','+row.orderType+')" style="color:cornflowerblue">查看订单</a>' +'&nbsp;' +
+                        '<a href="#" onclick="TOrderTape.delete('+row.id+')" style="color:cornflowerblue">删除</a>'
+                }
             }
         }
     ];
@@ -100,6 +105,23 @@
     }
 };
 
+TOrderTape.playAudio = function (id) {
+    var ajax = new $ax(Feng.ctxPath + "/tOrderTape/getDetailById", function (data) {
+        console.log(data.data)
+        var audio = document.getElementById('recording');
+        audio.setAttribute("src", data.data.fileLink);
+        if (audio.paused) {
+            audio.play(); // 播放录音
+        } else {
+            audio.pause(); // 如果正在播放,则暂停
+        }
+    }, function (data) {
+        console.log(data);
+    });
+    ajax.set("tOrderTapeId", id);
+    ajax.start();
+};
+
 /**
  * 打开查看订单详情
  */

--
Gitblit v1.7.1