liujie
2025-07-31 9495425698ee25afa66e648a26404c0b7181ce4e
推广收益
5个文件已修改
7个文件已添加
2004 ■■■■■ 已修改文件
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tAbnormalOrder_orderDetail.html 512 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tOrderPrivateCar_add.html 487 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tOrderPrivateCar_trajectory.html 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js 312 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TPromotionOrderCarController.java
New file
@@ -0,0 +1,179 @@
package com.stylefeng.guns.modular.system.controller.specialTrain;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.stylefeng.guns.core.base.controller.BaseController;
import com.stylefeng.guns.core.beetl.ShiroExtUtil;
import com.stylefeng.guns.core.common.constant.factory.PageFactory;
import com.stylefeng.guns.core.util.DateUtil;
import com.stylefeng.guns.core.util.SinataUtil;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.*;
/**
 * 快车订单控制器
 *
 * @author fengshuonan
 * @Date 2020-09-02 17:28:59
 */
@Controller
@RequestMapping("/promotionInfo")
public class TPromotionOrderCarController extends BaseController {
    private String PREFIX = "/system/tPromotionOrderCar/";
    @Autowired
    private ITOrderPrivateCarService tOrderPrivateCarService;
    @Autowired
    private ShiroExtUtil shiroExtUtil;
    /**
     * 跳转到快车订单首页
     */
    @RequestMapping("")
    public String index(Model model) {
        return PREFIX + "tPromotionOrder.html";
    }
    /**
     * 获取快车订单列表
     */
    @RequestMapping(value = "/list")
    @ResponseBody
    public Object list(String insertTime,
                       String orderNum,
                       String userName,
                       String name,
                       String driverName){
        String beginTime = null;
        String endTime = null;
        if (SinataUtil.isNotEmpty(insertTime)) {
            String[] timeArray = insertTime.split(" - ");
            beginTime = timeArray[0];
            endTime = timeArray[1];
        }
        Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
        page.setRecords(tOrderPrivateCarService.promotionInfo(page, beginTime, endTime, orderNum, userName, name, driverName, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId()));
        return super.packForBT(page);
    }
    @GetMapping("/export")
    @ResponseBody
    public void export(String insertTime,
                       String orderNum,
                       String userName,
                       String name,
                       String driverName, HttpServletRequest request, HttpServletResponse response) {
        try {
            String beginTime = null;
            String endTime = null;
            if (SinataUtil.isNotEmpty(insertTime)) {
                String[] timeArray = insertTime.split(" - ");
                beginTime = timeArray[0];
                endTime = timeArray[1];
            }
            List<Map<String, Object>> list=new ArrayList<>();
            list =  tOrderPrivateCarService.promotionInfoExport(null, beginTime, endTime, orderNum, userName, name, driverName, shiroExtUtil.getUser().getRoleType(), shiroExtUtil.getUser().getObjectId());
            // 表格数据【封装】
            List<List<String>> dataList = new ArrayList<>();
            //第一行显示【封装】
            List<String> twoList = new ArrayList<String>();
            twoList.add("总计:");
            twoList.add(String.valueOf(list.size())+"条");
            dataList.add(twoList);
            // 列【封装】
            List<String> shellList = new ArrayList<String>();
            shellList.add("活动名称");
            shellList.add("司机名称");
            shellList.add("下级用户");
            shellList.add("订单编号");
            shellList.add("订单金额");
            shellList.add("司机推广收益");
            shellList.add("收益时间");
            for (Map<String,Object> object : list){
                // 详细数据列【封装】
                shellList = new ArrayList<String>();
                if(SinataUtil.isNotEmpty(object.get("name"))){
                    shellList.add(object.get("name").toString());
                }else{
                    shellList.add("-");
                }
                if(SinataUtil.isNotEmpty(object.get("driverName"))){
                    shellList.add(object.get("driverName").toString());
                }else{
                    shellList.add("-");
                }
                if(SinataUtil.isNotEmpty(object.get("userName"))){
                    shellList.add(object.get("userName").toString());
                }else{
                    shellList.add("-");
                }
                if(SinataUtil.isNotEmpty(object.get("orderNum"))){
                    shellList.add(object.get("orderNum").toString());
                }else{
                    shellList.add("-");
                }
                if(SinataUtil.isNotEmpty(object.get("money"))){
                    shellList.add(object.get("money").toString());
                }else{
                    shellList.add("-");
                }
                if(SinataUtil.isNotEmpty(object.get("promotionMoney"))){
                    shellList.add(object.get("promotionMoney").toString());
                }else{
                    shellList.add("-");
                }
                if(SinataUtil.isNotEmpty(object.get("successTime"))){
                    shellList.add(DateUtil.formatDate(DateUtil.parse(object.get("successTime").toString(),"YYYY-MM-dd HH:mm:ss.S"), "YYYY-MM-dd HH:mm:ss"));
                }else{
                    shellList.add("-");
                }
                dataList.add(shellList);
            }
            try {
                // 调用工具类进行导出
                ExcelExportUtil.easySheet("推广收益明细导出记录"+DateUtil.formatDate(new Date(), "YYYYMMddHHmmss"), "推广收益明细导出记录", dataList,request, response);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderPrivateCarMapper.java
@@ -70,4 +70,8 @@
    List<Map<String,Object>> getSurcharge(@Param("id") Object id,@Param("orderType") Integer orderType);
    List<Map<String, Object>> promotionInfo(@Param("page") Page<Map<String, Object>> page, @Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("orderNum") String orderNum, @Param("userName") String userName, @Param("name") String name, @Param("driverName") String driverName, @Param("roleType") Integer roleType, @Param("objectId") Integer objectId);
    List<Map<String, Object>> promotionInfoExport(@Param("beginTime") String beginTime, @Param("endTime") String endTime, @Param("orderNum") String orderNum, @Param("userName") String userName, @Param("name") String name, @Param("driverName") String driverName, @Param("roleType") Integer roleType, @Param("objectId") Integer objectId);
}
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml
@@ -259,4 +259,171 @@
        SELECT  IFNULL(amount,0) amount,b.`name`  FROM  t_order_additional_fee a   LEFT JOIN t_additional_fee b ON a.additionalFeeId=b.id  WHERE a.orderId=#{id} AND a.orderType=#{orderType} AND a.id>1 AND amount>0
    </select>
    <select id="promotionInfo" resultType="java.util.Map">
select  * from (
        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
        from t_order_private_car t1
        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
        LEFT JOIN t_user t4 ON t1.userId = t4.id
        where t1.promotionActivityId is not null
        <if test="orderNum != null and orderNum != ''">
            and t1.orderNum  =#{orderNum}
        </if>
        <if test="beginTime != null and endTime != null">
            and t1.successTime  between #{beginTime} and #{endTime}
        </if>
        <if test="userName != null and userName != ''">
            and t4.nickName  like CONCAT('%',#{userName},'%')
        </if>
        <if test="name != null and name != ''">
            and t2.activityTitle  like CONCAT('%',#{name},'%')
        </if>
        <if test="driverName != null and driverName != ''">
            and t3.name  like CONCAT('%',#{driverName},'%')
        </if>
        <if test="roleType != null and roleType != '' and roleType != 1">
            and t1.companyId = #{objectId}
        </if>
        union all
        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
        from t_order_taxi t1
        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
        LEFT JOIN t_user t4 ON t1.userId = t4.id
        where t1.promotionActivityId is not null
        <if test="orderNum != null and orderNum != ''">
            and t1.orderNum  =#{orderNum}
        </if>
        <if test="beginTime != null and endTime != null">
            and t1.successTime  between #{beginTime} and #{endTime}
        </if>
        <if test="userName != null and userName != ''">
            and t4.nickName  like CONCAT('%',#{userName},'%')
        </if>
        <if test="name != null and name != ''">
            and t2.activityTitle  like CONCAT('%',#{name},'%')
        </if>
        <if test="driverName != null and driverName != ''">
            and t3.name  like CONCAT('%',#{driverName},'%')
        </if>
        <if test="roleType != null and roleType != '' and roleType != 1">
            and t1.companyId = #{objectId}
        </if>
        union all
        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
        from t_order_cross_city t1
        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
        LEFT JOIN t_user t4 ON t1.userId = t4.id
        where t1.promotionActivityId is not null
        <if test="orderNum != null and orderNum != ''">
            and t1.orderNum  =#{orderNum}
        </if>
        <if test="beginTime != null and endTime != null">
            and t1.successTime  between #{beginTime} and #{endTime}
        </if>
        <if test="userName != null and userName != ''">
            and t4.nickName  like CONCAT('%',#{userName},'%')
        </if>
        <if test="name != null and name != ''">
            and t2.activityTitle  like CONCAT('%',#{name},'%')
        </if>
        <if test="driverName != null and driverName != ''">
            and t3.name  like CONCAT('%',#{driverName},'%')
        </if>
        <if test="roleType != null and roleType != '' and roleType != 1">
            and t1.companyId = #{objectId}
        </if>
        ) as t5 order by t5.successTime desc
    </select>
    <select id="promotionInfoExport" resultType="java.util.Map">
        select  * from (
        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
        from t_order_private_car t1
        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
        LEFT JOIN t_user t4 ON t1.userId = t4.id
        where t1.promotionActivityId is not null
        <if test="orderNum != null and orderNum != ''">
            and t1.orderNum  =#{orderNum}
        </if>
        <if test="beginTime != null and endTime != null">
            and t1.successTime  between #{beginTime} and #{endTime}
        </if>
        <if test="userName != null and userName != ''">
            and t4.nickName  like CONCAT('%',#{userName},'%')
        </if>
        <if test="name != null and name != ''">
            and t2.activityTitle  like CONCAT('%',#{name},'%')
        </if>
        <if test="driverName != null and driverName != ''">
            and t3.name  like CONCAT('%',#{driverName},'%')
        </if>
        <if test="roleType != null and roleType != '' and roleType != 1">
            and t1.companyId = #{objectId}
        </if>
        union all
        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
        from t_order_taxi t1
        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
        LEFT JOIN t_user t4 ON t1.userId = t4.id
        where t1.promotionActivityId is not null
        <if test="orderNum != null and orderNum != ''">
            and t1.orderNum  =#{orderNum}
        </if>
        <if test="beginTime != null and endTime != null">
            and t1.successTime  between #{beginTime} and #{endTime}
        </if>
        <if test="userName != null and userName != ''">
            and t4.nickName  like CONCAT('%',#{userName},'%')
        </if>
        <if test="name != null and name != ''">
            and t2.activityTitle  like CONCAT('%',#{name},'%')
        </if>
        <if test="driverName != null and driverName != ''">
            and t3.name  like CONCAT('%',#{driverName},'%')
        </if>
        <if test="roleType != null and roleType != '' and roleType != 1">
            and t1.companyId = #{objectId}
        </if>
        union all
        select t1.orderNum,t1.promotionMoney,t1.successTime,t1.payMoney money,t2.activityTitle name,t3.name driverName,t4.nickName userName
        from t_order_cross_city t1
        LEFT JOIN t_driver_promotion_activity t2 ON t1.promotionActivityId = t2.id
        LEFT JOIN t_driver t3 ON t1.promotionDriverId = t3.id
        LEFT JOIN t_user t4 ON t1.userId = t4.id
        where t1.promotionActivityId is not null
        <if test="orderNum != null and orderNum != ''">
            and t1.orderNum  =#{orderNum}
        </if>
        <if test="beginTime != null and endTime != null">
            and t1.successTime  between #{beginTime} and #{endTime}
        </if>
        <if test="userName != null and userName != ''">
            and t4.nickName  like CONCAT('%',#{userName},'%')
        </if>
        <if test="name != null and name != ''">
            and t2.activityTitle  like CONCAT('%',#{name},'%')
        </if>
        <if test="driverName != null and driverName != ''">
            and t3.name  like CONCAT('%',#{driverName},'%')
        </if>
        <if test="roleType != null and roleType != '' and roleType != 1">
            and t1.companyId = #{objectId}
        </if>
        ) as t5 order by t5.successTime desc
    </select>
</mapper>
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderPrivateCarService.java
@@ -70,4 +70,9 @@
    List<Map<String,Object>> getSurcharge(Object id,Integer orderType);
    List<Map<String, Object>> promotionInfo(Page<Map<String, Object>> page, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId);
    List<Map<String, Object>> promotionInfoExport(Object o, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId);
}
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java
@@ -113,4 +113,14 @@
    public List<Map<String, Object>> getSurcharge(Object id, Integer orderType) {
        return this.baseMapper.getSurcharge(id,orderType);
    }
    @Override
    public List<Map<String, Object>> promotionInfo(Page<Map<String, Object>> page, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId) {
        return this.baseMapper.promotionInfo(page, beginTime, endTime, orderNum, userName, name, driverName, roleType, objectId);
    }
    @Override
    public List<Map<String, Object>> promotionInfoExport(Object o, String beginTime, String endTime, String orderNum, String userName, String name, String driverName, Integer roleType, Integer objectId) {
        return this.baseMapper.promotionInfoExport(beginTime, endTime, orderNum, userName, name, driverName, roleType, objectId);
    }
}
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tAbnormalOrder_orderDetail.html
New file
@@ -0,0 +1,512 @@
@layout("/common/_container.html"){
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>处理异常订单</title>
    <style>
        body {
            background: #888;
            margin: 0;
            padding: 0;
        }
        .container {
            background: #fff;
            margin: 20px auto;
            padding: 20px 30px;
            border-radius: 10px;
            max-width: 98vw;
            min-width: 1200px;
        }
        .title {
            font-size: 20px;
            font-weight: bold;
            margin-bottom: 20px;
        }
        .order-table {
            width: 100%;
            border-collapse: collapse;
            margin-bottom: 30px;
        }
        .order-table th,
        .order-table td {
            border: 1px solid #e0e0e0;
            padding: 8px 6px;
            text-align: center;
            font-size: 13px;
        }
        .order-table th {
            background: #f8f8f8;
            font-weight: 600;
        }
        .section-title {
            font-size: 16px;
            font-weight: bold;
            margin: 30px 0 10px 0;
        }
        .desc-row {
            margin-bottom: 10px;
        }
        .desc-label {
            font-weight: bold;
            margin-right: 10px;
        }
        .img-list {
            display: flex;
            gap: 20px;
            margin: 10px 0 20px 0;
        }
        .img-list img {
            width: 120px;
            height: 80px;
            object-fit: cover;
            border-radius: 6px;
            border: 1px solid #ccc;
        }
        .order-link {
            color: #1976d2;
            text-decoration: underline;
            cursor: pointer;
        }
        input[type="radio"] {
    accent-color: #1976d2;
    width: 18px;
    height: 18px;
    vertical-align: middle;
    margin-right: 4px;
}
.radio-group label {
    margin-right: 18px;
    font-size: 15px;
    cursor: pointer;
}
#duty-selector {
    display: flex;
    margin-bottom: 18px;
    border: 1px solid #ccc;
    border-radius: 4px;
    overflow: hidden;
    width: fit-content;
}
.duty-btn {
    flex: 1 1 0;
    padding: 12px 32px;
    border: none;
    background: #fff;
    color: #222;
    font-size: 16px;
    cursor: pointer;
    outline: none;
    border-right: 1px solid #ccc;
    transition: background 0.2s, color 0.2s;
    height: 62px;
    line-height: 24px;
}
.duty-btn:last-child {
    border-right: none;
}
.duty-btn.active {
    background: #1976d2;
    color: #fff;
    font-weight: bold;
}
    .action-btn {
        min-width: 140px;
        height: 48px;
        background: #1976d2;
        color: #fff;
        border: none;
        border-radius: 5px;
        font-size: 16px;
        font-weight: bold;
        margin-right: 18px;
        cursor: pointer;
        transition: background 0.2s, box-shadow 0.2s;
        box-shadow: 0 2px 6px rgba(25, 118, 210, 0.08);
    }
    .action-btn:last-child {
        margin-right: 0;
    }
    .action-btn:hover {
        background: #1565c0;
    }
    #action-btns {
        margin-top: 32px;
        display: flex;
        align-items: center;
    }
    </style>
</head>
<body>
     <input type="hidden" id="orderNum"  name ="orderNum" value="${item.orderNum}"/>
     <input type="hidden" id="state"  name ="state" value="${item.abnormalStatus}"/>
     <input type="hidden" id="show"  name ="show" value="${show}"/>
     <input type="hidden" id="type" name ="type" value="${type}"/>
     <input type="hidden" id="orderId" name ="orderId" value="${item.id}"/>
     <input type="hidden" id="payMoney" name ="payMoney" value="${item.payMoney}"/>
     <div class="ibox float-e-margins">
        <div class="title">处理异常订单</div>
        <div class="section-title">订单信息</div>
        <table class="order-table">
            <thead>
                <tr>
                    <th>下单时间</th>
                    <th>订单编号</th>
                    <th>订单来源</th>
                    <th>乘车时间</th>
                    <th>下单用户昵称</th>
                    <th>下单用户手机</th>
                    <th>乘车用户姓名</th>
                    <th>乘车用户手机</th>
                    <th>起点</th>
                    <th>终点</th>
                    <th>选择车型</th>
                    <th>接单司机</th>
                    <th>接单车辆</th>
                    <th>订单金额</th>
                    <th>状态</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>${item.insertTimeStr}</td>
                    <td>${item.orderNum}</td>
                    <td>${item.orderSource}</td>
                    <td>${item.travelTimeStr}</td>
                    <td>${item.userName}</td>
                    <td>${item.userPhone}</td>
                    <td>${item.passengers}</td>
                    <td>${item.passengersPhone}</td>
                    <td>${item.boardingAddress}</td>
                    <td>${item.getoffAddress}</td>
                    <td>${item.serverCarModel}</td>
                    <td>${item.driver}</td>
                    <td>${item.car}</td>
                    <td>${item.orderMoney}</td>
                    <!--            1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付-->
                    <td>
                        @if(item.state==1) {
                        待接单
                        @}else if(item.state==2){
                        待出发
                        @}else if(item.state==3){
                        待到达预约地点
                        @}else if(item.state==4){
                        待乘客上车
                        @}else if(item.state==5){
                        服务中
                        @}else if(item.state==6){
                        完成服务
                        @}else if(item.state==7){
                        待支付
                        @}else if(item.state==8){
                        待评价
                        @}else if(item.state==9){
                        已完成
                        @}else if(item.state==10){
                        已取消
                        @}else if(item.state==11){
                        改派中
                        @}else if(item.state==12){
                        取消待支付
                        @}else{
                        未知
                        @}
                    </td>
                    <td><a class="order-link" onclick="viewOrderInfo()">查看订单详情</a></td>
                </tr>
            </tbody>
        </table>
        <div class="section-title">乘客反馈情况</div>
        <div class="desc-row">
            <span class="desc-label"> ${item.abnormalIntro}</span>
        </div>
        <div class="img-list">
            <!--       逗号拼接的图片 -->
            @for(item in abnormalImg) {
            <img src="${item}" alt="图片" />
            @}
        </div>
        <!-- 你可以根据实际图片地址替换上面src -->
         <div class="section-title" id="s1">处理状态:
            @if(item.abnormalStatus==1){
             未处理  <button id="saveBtn1" class="action-btn" onclick="saveBtn1()">立即处理</button>
             @}else{
             已处理
             @}
         </div>
        <!-- 其他内容可根据实际需求继续补充 -->
         <div id="s2">
        <div class="section-title">选择责任方</div>
        <div id="duty-selector">
            <button type="button" class="duty-btn active" data-type="platformAll">平台全责</button>
            <button type="button" class="duty-btn" data-type="driverAll">司机全责</button>
            <button type="button" class="duty-btn" data-type="passengerAll">乘客全责</button>
            <button type="button" class="duty-btn" data-type="platformPart">平台部分责任</button>
            <button type="button" class="duty-btn" data-type="driverPart">司机部分责任</button>
        </div>
        <div id="duty-content" style="margin-top:20px;">
            <!-- 内容区域,JS填充 -->
        </div>
        <!-- 处理备注区域 -->
        <div class="section-title" style="margin-top:32px;">处理备注</div>
        <textarea name="handleRemark" rows="4" style="width:90%;max-width:900px;min-width:300px;padding:10px;font-size:15px;border:1px solid #ccc;border-radius:4px;resize:vertical;"></textarea>
        <div id="action-btns">
            <button id="saveBtn" class="action-btn" onclick="save()" style="display:none;">确认处理</button>
            <button id="closeBtn" class="action-btn" style="display:none;">关闭</button>
        </div>
         </div>
    </div>
</body>
<script>
    const dutyContent = document.getElementById('duty-content');
    const btns = document.querySelectorAll('.duty-btn');
    const responsibilityType = '${item.responsibilityType}';
    const orderNum = '${item.orderNum}';
    const isReadonly = responsibilityType && responsibilityType !== 'null' && responsibilityType !== '';
    const typeMap = {1:'platformAll',2:'driverAll',3:'passengerAll',4:'platformPart',5:'driverPart'};
    const reverseTypeMap = {'platformAll':1,'driverAll':2,'passengerAll':3,'platformPart':4,'driverPart':5};
    function renderContent(type, readonly) {
        let html = '';
        if (type === 'platformAll') {
            html = `
                <div>
                    <div class="radio-group">超时是否启用备用金支付:
                        <label><input type="radio" name="ybj" checked disabled>是</label>
                        <label><input type="radio" name="ybj" disabled>否</label>
                    </div>
                    <div class="radio-group">超时是否生成追偿支付单:
                          <label><input type="radio" name="zcpay"  disabled>是</label>
                         <label><input type="radio" name="zcpay" checked disabled>否</label>
                        </div>
                </div>
            `;
        } else if (type === 'driverAll') {
            html = `
                <div style="margin-top:10px;">修改订单金额为: 0</div>
            `;
        } else if (type === 'passengerAll') {
            html = `
                <div>超时是否启用备用金支付:
                    <label><input type="radio" name="ybj" checked disabled>是</label>
                    <label><input type="radio" name="ybj" disabled>否</label>
                </div>
                <div>超时是否生成追偿支付单:
                    <label><input type="radio" name="zcpay" checked disabled>是</label>
                    <label><input type="radio" name="zcpay" disabled>否</label>
                </div>
            `;
        } else if (type === 'platformPart' || type === 'driverPart') {
            html = `
                <div>超时是否启用备用金支付:
                    <label><input type="radio" name="ybj" checked disabled>是</label>
                    <label><input type="radio" name="ybj" disabled>否</label>
                </div>
                <div>超时是否生成追偿支付单:
                    <label><input type="radio" name="zcpay" checked disabled>是</label>
                    <label><input type="radio" name="zcpay" disabled>否</label>
                </div>
                <div style="margin-top:10px;">
                    修改订单金额为:<input type="number" id="money" name="money" style="width:100px;"  value="${money}"> 元(需小于等于原订单金额)
                </div>
            `;
        }
        dutyContent.innerHTML = html;
    }
    function setReadonlyMode() {
      btns.forEach(btn => {
        btn.classList.remove('active');
        btn.disabled = true;
        if (btn.dataset.type === typeMap[responsibilityType]) {
          btn.classList.add('active');
        }else {
            btn.style.display = 'none';
        }
      });
      renderContent(typeMap[responsibilityType], true);
      document.querySelector('textarea[name=handleRemark]').disabled = true;
      document.getElementById('saveBtn').style.display = 'none';
      document.getElementById('closeBtn').style.display = '';
    }
    function setEditMode() {
      btns.forEach(btn => btn.disabled = false);
      btns.forEach(btn => btn.classList.remove('active'));
      btns[0].classList.add('active');
      renderContent('platformAll', false);
      document.querySelector('textarea[name=handleRemark]').disabled = false;
      document.getElementById('saveBtn').style.display = '';
      document.getElementById('closeBtn').style.display = 'none';
    }
    function saveBtn1() {
        $("#s1").hide();
        $("#s2").show();
    }
    window.onload = function() {
      if (isReadonly) {
        setReadonlyMode();
      } else {
        setEditMode();
      }
    };
    btns.forEach(btn => {
      btn.onclick = function () {
        if (isReadonly) return;
        btns.forEach(b => b.classList.remove('active'));
        btn.classList.add('active');
        renderContent(btn.dataset.type, false);
      }
    });
     function save() {
        let selectedBtn = document.querySelector('.duty-btn.active');
         let responsibilityTypeVal = reverseTypeMap[selectedBtn.dataset.type];
         let remark = document.querySelector('textarea[name=handleRemark]').value;
        // 取money
         let money = $("#money").val();
         let payMoney = $("#payMoney").val();
         let type = document.querySelector('input[name=type]').value;
         let orderNum = document.querySelector('input[name=orderNum]').value;
         console.log(responsibilityTypeVal,money,payMoney)
         if(responsibilityTypeVal>3 && money>payMoney){
             Feng.error("需小于等于原订单金额!");
             return;
         }
        //提交信息
        var ajax = new $ax(Feng.ctxPath + "/abnormal/save", function(data){
            Feng.success("操作成功!");
                // 尝试关闭当前窗口或弹窗
                if(window.parent && window.parent !== window && window.parent.layer) {
                    // layer弹窗
                    var index = window.parent.layer.getFrameIndex(window.name);
                    window.parent.layer.close(index);
                } else if(window.opener) {
                    window.close();
                } else if(window.top && window.top.closeDialog) {
                    window.top.closeDialog();
                } else {
                    window.close();
                }
        },function(data){
            Feng.error("操作失败!");
        });
        ajax.set("responsibilityTypeVal",responsibilityTypeVal);
        ajax.set("remark",remark);
        ajax.set("money",money);
        ajax.set("type",type);
        ajax.set("orderNum",orderNum);
        ajax.start();
    };
    document.getElementById('closeBtn').onclick = function() {
      // 尝试关闭当前窗口或弹窗
      if(window.parent && window.parent !== window && window.parent.layer) {
        // layer弹窗
        var index = window.parent.layer.getFrameIndex(window.name);
        window.parent.layer.close(index);
      } else if(window.opener) {
        window.close();
      } else if(window.top && window.top.closeDialog) {
        window.top.closeDialog();
      } else {
        window.close();
      }
    };
//     进来就加载
    $(function() {
        var state = $("#state").val();
        var show = $("#show").val();
        if(state==1 && show==0){
            $("#s2").hide();
        }
        if(show==1){
            $("#s2").show();
            $("#s1").hide();
        }
    })
    function viewOrderInfo(){
        var type = $("#type").val();
        var orderId = $("#orderId").val();
        if(type==1){
            var index = layer.open({
                type: 2,
                title: '快车订单详情',
                area: ['100%', '100%'], //宽高
                fix: false, //不固定
                maxmin: true,
                content: Feng.ctxPath + '/tOrderPrivateCar/tOrderPrivateCar_orderDetail/' +orderId
            });
            this.layerIndex = index;
        }
        if(type==2){
            var index = layer.open({
                type: 2,
                title: '跨城出行订单详情',
                area: ['100%', '100%'], //宽高
                fix: false, //不固定
                maxmin: true,
                content: Feng.ctxPath + '/tOrderCrossCity/tOrderCrossCity_detail/' + orderId
            });
            this.layerIndex = index;
        }
        if(type==3){
            var index = layer.open({
                type: 2,
                title: '出租车订单详情',
                area: ['100%', '100%'], //宽高
                fix: false, //不固定
                maxmin: true,
                content: Feng.ctxPath + '/tOrderTaxi/tOrderTaxi_update/' + orderId
            });
            this.layerIndex = index;
        }
    }
</script>
</html>
@}
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tOrderPrivateCar_add.html
New file
@@ -0,0 +1,487 @@
@layout("/common/_container.html"){
<div class="ibox float-e-margins">
    <div class="ibox-content">
        <div class="form-horizontal">
            <input type="hidden" id="html" value="2">
            <input type="hidden" id="type" value="2">
            <div class="row">
                <div class="form-group">
                    <label class="control-label col-sm-2">起点:</label>
                    <div class="col-sm-3">
                        <input class="form-control" id="startAddress" autocomplete="off" onclick="TOrderPrivateCarInfoDlg.startAddress()">
                        <input type="hidden" id="startLon">
                        <input type="hidden" id="startLat">
                    </div>
                </div>
                <div class="form-group" id="startAddressModel" hidden>
                    <label class="control-label col-sm-2"></label>
                    <div class="col-sm-6" style="margin-left: 15px;height: 500px" id="startAddressBody">
                    </div>
                </div>
                <div class="form-group">
                    <label class="control-label col-sm-2">终点:</label>
                    <div class="col-sm-3">
                        <input class="form-control" id="endAddress" autocomplete="off" onclick="TOrderPrivateCarInfoDlg.endAddress()">
                        <input type="hidden" id="endLon">
                        <input type="hidden" id="endLat">
                    </div>
                </div>
                <div class="form-group" id="endAddressModel" hidden>
                    <label class="control-label col-sm-2"></label>
                    <div class="col-sm-6" style="margin-left: 15px;height: 500px" id="endAddressBody">
                    </div>
                </div>
                <div class="form-group">
                    <label class="control-label col-sm-2">用车时间:</label>
                    <div class="col-sm-3">
                        <input class="form-control"  autocomplete="off" id="travelTime">
                    </div>
                </div>
                <div class="form-group">
                    <label class="control-label col-sm-2">乘车人姓名:</label>
                    <div class="col-sm-3">
                        <input class="form-control" id="passengers">
                    </div>
                </div>
                <div class="form-group">
                    <label class="control-label col-sm-2">乘车人手机号:</label>
                    <div class="col-sm-3">
                        <input class="form-control" id="passengersPhone">
                    </div>
                </div>
                <div class="form-group">
                    <label class="control-label col-sm-2">车型:</label>
                    <div class="col-sm-3">
                        <select class="form-control " id="serverCarModelId">
                            @for(carModel in carModelList){
                            <option value="${carModel.id}">${carModel.name}</option>
                            @}
                        </select>
                    </div>
                </div>
            </div>
            <div class="row btn-group-m-t">
                <div class="col-sm-10">
                    <#button btnCss="info" name="保存" id="ensure" icon="fa-check"
                    clickFun="TOrderPrivateCarInfoDlg.addSubmit()"/>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="${ctxPath}/static/modular/system/tOrderPrivateCar/tOrderPrivateCar_info.js"></script>
<script type="text/javascript">
    window._AMapSecurityConfig = {
        securityJsCode: '44c5ee9ad584605d91ca69bfac32c761',
    }
</script>
<script type="text/javascript"
        src="https://webapi.amap.com/maps?v=1.4.10&key=d3bde6afb050067e1a765a8d1d1f4c54&plugin=AMap.Autocomplete,AMap.PlaceSearch"></script>
<script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
<script>
    laydate.render({
        elem: '#travelTime'
        , type: 'datetime'
        ,trigger: 'click' //采用click弹出
        , min:  new Date().toString()
    });
</script>
<script type="text/javascript">
    //起点地图加载
    var marker, map = new AMap.Map("startAddressBody", {
        resizeEnable: true,
        zoom: 15,
        zooms: [3, 20]
    }); //定位标注当前位置
    map.plugin('AMap.Geolocation', function () {
        geolocation = new AMap.Geolocation({
            enableHighAccuracy: true, //是否使用高精度定位,默认:true
            timeout: 10000, //超过10秒后停止定位,默认:无穷大
            maximumAge: 0, //定位结果缓存0毫秒,默认:0
            convert: true, //自动偏移坐标,偏移后的坐标为高德坐标,默认:true
            showButton: true, //显示定位按钮,默认:true
            showMarker: true, //定位成功后在定位到的位置显示点标记,默认:true
            showCircle: true, //定位成功后用圆圈表示定位精度范围,默认:true
            panToLocation: true, //定位成功后将定位到的位置作为地图中心点,默认:true
            buttonPosition: 'LB', //定位按钮的停靠位置  LB左下角、  RB右下角
            buttonOffset: new AMap.Pixel(10, 20), //定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
            zoomToAccuracy: true, //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
        });
        map.addControl(geolocation);
        geolocation.getCurrentPosition();
        AMap.event.addListener(geolocation, 'complete', onComplete);
        //返回定位信息
        AMap.event.addListener(geolocation, 'error', onError);
        //返回定位出错信息
    }); //解析定位结果
    var city;
    map.on('click', function (e) {
        if (marker != null) {
            marker.setMap(null);
        }
        //添加标记点
        $("#startLon").val(e.lnglat.getLng());
        $("#startLat").val(e.lnglat.getLat());
         marker = new AMap.Marker({
            map: map,
            position: new AMap.LngLat(e.lnglat.getLng(), e.lnglat.getLat()),   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
        });
        regeoCode(e.lnglat.getLng(),e.lnglat.getLat());
    });
    var infoWindow = new AMap.InfoWindow({
        autoMove: true,
        offset: {
            x: 0,
            y: -30
        }
    }); //回调函数
    //根据经纬度获取详细地址
    function regeoCode(lon,lat) {
        var lnglat = [];
        lnglat.push(lon);
        lnglat.push(lat);
        map.add(marker);
        marker.setPosition(lnglat);
        AMap.service('AMap.Geocoder', function() {
            geocoder = new AMap.Geocoder({});
            geocoder.getAddress(lnglat, function (status, result) {
                if (status === 'complete' && result.regeocode) {
                    var address = result.regeocode.formattedAddress;
                    $("#startAddress").val(address);
                } else {
                    Feng.error('根据经纬度查询地址失败【' + result + '】')
                    return
                }
                var data={
                    "name":result.regeocode.addressComponent.neighborhood,
                    "location":{
                        "lat":lat,
                        "lng":lon
                    },
                    "address":address,
                    "tel":"",
                    "type":result.regeocode.addressComponent.neighborhoodType
                };
                infoWindow.setContent(createContent(data));
                infoWindow.open(map, marker.getPosition());
            });
        })
    }
    function onComplete(data) {
        var str = [];
        city = data.addressComponent.citycode;
        str.push('定位结果:' + data.position);
        str.push('定位类别:' + data.location_type);
        if (data.accuracy) {
            str.push('精度:' + data.accuracy + ' 米');
        }
        //如为IP精确定位结果则没有精度信息
        str.push('是否经过偏移:' + (data.isConverted ? '是' : '否'));
        var lnglatXY = [data.position.getLng(), data.position.getLat()];
        //地图上所标点的坐标
        AMap.service('AMap.Geocoder', function () {
            //回调函数
            geocoder = new AMap.Geocoder({});
            geocoder.getAddress(lnglatXY, function (status, result) {
                if (status === 'complete' && result.info === 'OK') {
                    //获得了有效的地址信息:                    //即,result.regeocode.formattedAddress
//                     console.log(result.regeocode.formattedAddress);
                    var address = result.regeocode.formattedAddress;
                    str.push('详细地址:' + address);
                    // todo 不弹出信息框
                    // alert(str.join(' | '));
                } else {
                    // alert(str.join(' | ')); //获取地址失败
                }
            });
        })
    } //解析定位错误信息
    function onError(data) {
        alert('定位失败,原因:' + data.message);
    }
    //输入搜索点信息
    var autoOptions = {
        city: city, //在规定城市搜索、默认全国
        input: "startAddress"
    };
    var auto = new AMap.Autocomplete(autoOptions);
    var placeSearch = new AMap.PlaceSearch({
        pageSize: 5, // 单页显示结果条数
        pageIndex: 1, // 页码
        children: 0, //不展示子节点数据
        city: city, // 兴趣点城市
        citylimit: true, //是否强制限制在设置的城市内搜索
        panel: "panel", // 结果列表将在此容器中进行展示。
        autoFitView: true, // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
        extensions: 'base', //返回基本地址信息  */
        map: map // 展现结果的地图实例
    }); //构造地点查询类
    AMap.event.addListener(auto, "select", select); //注册监听,当选中某条记录时会触发
    function select(e) {
        placeSearch.setCity(e.poi.adcode);
        placeSearch.search(e.poi.name); //关键字查询查询        //设置搜索位置定点标注
        if (e.poi && e.poi.location) {
            map.setZoom(15);
            map.setCenter(e.poi.location);
            var id = e.poi.id; //详情查询
            placeSearch.getDetails(id, function (status, result) {
                if (status === 'complete' && result.info === 'OK') {
                    placeSearch_CallBack(result);
                }
            });
        }
    }
    function placeSearch_CallBack(data) {
        if (marker != null) {
            marker.setMap(null);
        }
        var poiArr = data.poiList.pois; //添加marker
          marker = new AMap.Marker({
            map: map,
            position: poiArr[0].location
        });
        map.add(marker);
        marker.setPosition(marker.getPosition());
        infoWindow.setContent(createContent(poiArr[0]));
        infoWindow.open(map, marker.getPosition());
    }
    function createContent(poi) {
        console.log(poi);
        //信息窗体内容
        $("#startAddress").val(poi.address);
        $("#startLon").val(poi.location.lng);
        $("#startLat").val(poi.location.lat);
        $("#areaCode").val(poi.adcode);
        var s = [];
        s.push("<b>名称:" + poi.name + "</b>");
        s.push("地址:" + poi.address);
        s.push("电话:" + poi.tel);
        s.push("类型:" + poi.type);
        return s.join("<br>");
    }
</script>
<script>
    //终点地图加载
    var marker1, mapp = new AMap.Map("endAddressBody", {
        resizeEnable: true,
        zoom: 15,
        zooms: [3, 20]
    }); //定位标注当前位置
    mapp.plugin('AMap.Geolocation', function () {
        geolocation = new AMap.Geolocation({
            enableHighAccuracy: true, //是否使用高精度定位,默认:true
            timeout: 10000, //超过10秒后停止定位,默认:无穷大
            maximumAge: 0, //定位结果缓存0毫秒,默认:0
            convert: true, //自动偏移坐标,偏移后的坐标为高德坐标,默认:true
            showButton: true, //显示定位按钮,默认:true
            showMarker: true, //定位成功后在定位到的位置显示点标记,默认:true
            showCircle: true, //定位成功后用圆圈表示定位精度范围,默认:true
            panToLocation: true, //定位成功后将定位到的位置作为地图中心点,默认:true
            buttonPosition: 'LB', //定位按钮的停靠位置  LB左下角、  RB右下角
            buttonOffset: new AMap.Pixel(10, 20), //定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
            zoomToAccuracy: true, //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
        });
        mapp.addControl(geolocation);
        geolocation.getCurrentPosition();
        AMap.event.addListener(geolocation, 'complete', onComplete);
        //返回定位信息
        AMap.event.addListener(geolocation, 'error', onError);
        //返回定位出错信息
    }); //解析定位结果
    var cityy;
    mapp.on('click', function (e) {
        if (marker1 != null) {
            marker1.setMap(null);
        }
        //添加标记点
        $("#startLon").val(e.lnglat.getLng());
        $("#startLat").val(e.lnglat.getLat());
        marker1 = new AMap.Marker({
            map: mapp,
            position: new AMap.LngLat(e.lnglat.getLng(), e.lnglat.getLat()),   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
        });
        regeoCode1(e.lnglat.getLng(),e.lnglat.getLat());
    });
    var infoWindow = new AMap.InfoWindow({
        autoMove: true,
        offset: {
            x: 0,
            y: -30
        }
    }); //回调函数
    //根据经纬度获取详细地址
    function regeoCode1(lon,lat) {
        var lnglat = [];
        lnglat.push(lon);
        lnglat.push(lat);
        mapp.add(marker1);
        marker1.setPosition(lnglat);
        AMap.service('AMap.Geocoder', function() {
            geocoder = new AMap.Geocoder({});
            geocoder.getAddress(lnglat, function (status, result) {
                if (status === 'complete' && result.regeocode) {
                    var address = result.regeocode.formattedAddress;
                    $("#endAddress").val(address);
                } else {
                    Feng.error('根据经纬度查询地址失败【' + result + '】')
                    return
                }
                var data={
                    "name":result.regeocode.addressComponent.neighborhood,
                    "location":{
                        "lat":lat,
                        "lng":lon
                    },
                    "address":address,
                    "tel":"",
                    "type":result.regeocode.addressComponent.neighborhoodType
                };
                infoWindow.setContent(createContentt(data));
                infoWindow.open(mapp, marker1.getPosition());
            });
        })
    }
    function onComplete(data) {
        var str = [];
        cityy = data.addressComponent.citycode;
        str.push('定位结果:' + data.position);
        str.push('定位类别:' + data.location_type);
        if (data.accuracy) {
            str.push('精度:' + data.accuracy + ' 米');
        }
        //如为IP精确定位结果则没有精度信息
        str.push('是否经过偏移:' + (data.isConverted ? '是' : '否'));
        var lnglatXY = [data.position.getLng(), data.position.getLat()];
        //地图上所标点的坐标
        AMap.service('AMap.Geocoder', function () {
            //回调函数
            geocoder = new AMap.Geocoder({});
            geocoder.getAddress(lnglatXY, function (status, result) {
                if (status === 'complete' && result.info === 'OK') {
                    //获得了有效的地址信息:                    //即,result.regeocode.formattedAddress
                    //                     console.log(result.regeocode.formattedAddress);
                    var address = result.regeocode.formattedAddress;
                    str.push('详细地址:' + address);
// todo 不弹出信息框
// alert(str.join(' | '));
                } else {
// alert(str.join(' | ')); //获取地址失败
                }
            });
        })
    } //解析定位错误信息
    function onError(data) {
        alert('定位失败,原因:' + data.message);
    }
    //输入搜索点信息
    var autoOptionss = {
        city: cityy, //在规定城市搜索、默认全国
        input: "endAddress"
    };
    var autoo = new AMap.Autocomplete(autoOptionss);
    var placeSearchh = new AMap.PlaceSearch({
        pageSize: 5, // 单页显示结果条数
        pageIndex: 1, // 页码
        children: 0, //不展示子节点数据
        city: city, // 兴趣点城市
        citylimit: true, //是否强制限制在设置的城市内搜索
        panel: "panel", // 结果列表将在此容器中进行展示。
        autoFitView: true, // 是否自动调整地图视野使绘制的 Marker点都处于视口的可见范围
        extensions: 'base', //返回基本地址信息  */
        map: mapp // 展现结果的地图实例
    }); //构造地点查询类
    AMap.event.addListener(autoo, "select", selectt); //注册监听,当选中某条记录时会触发
    function selectt(e) {
        placeSearchh.setCity(e.poi.adcode);
        placeSearchh.search(e.poi.name); //关键字查询查询        //设置搜索位置定点标注
        if (e.poi && e.poi.location) {
            mapp.setZoom(15);
            mapp.setCenter(e.poi.location);
            var id = e.poi.id; //详情查询
            placeSearchh.getDetails(id, function (status, result) {
                if (status === 'complete' && result.info === 'OK') {
                    placeSearch_CallBackk(result);
                }
            });
        }
    }
    function placeSearch_CallBackk(data) {
        if (marker1 != null) {
            marker1.setMap(null);
        }
        var poiArr = data.poiList.pois; //添加marker
        marker1 = new AMap.Marker({
            map: mapp,
            position: poiArr[0].location
        });
        mapp.add(marker1);
        marker1.setPosition(marker1.getPosition());
        infoWindow.setContent(createContentt(poiArr[0]));
        infoWindow.open(mapp, marker1.getPosition());
    }
    function createContentt(poi) {
        console.log(poi);
        //信息窗体内容
        $("#endAddress").val(poi.address);
        $("#endLon").val(poi.location.lng);
        $("#endLat").val(poi.location.lat);
        $("#areaCode").val(poi.adcode);
        var ss = [];
        ss.push("<b>名称:" + poi.name + "</b>");
        ss.push("地址:" + poi.address);
        ss.push("电话:" + poi.tel);
        ss.push("类型:" + poi.type);
        return ss.join("<br>");
    }
</script>
@}
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tOrderPrivateCar_trajectory.html
New file
@@ -0,0 +1,57 @@
@layout("/common/_container.html"){
<style type="text/css">
    html, body, #container {
        height: 100%;
        width: 100%;
    }
    .input-card .btn{
        margin-right: 1.2rem;
        width: 9rem;
    }
    .input-card .btn:last-child{
        margin-right: 0;
    }
</style>
<div class="ibox float-e-margins">
    <div class="ibox-content">
        <div class="form-horizontal">
            <input type="hidden" id="id" name="id" value="${tOrderPrivateCarId}">
            <div class="row" style="margin-top: 30px;">
                <div class="col-sm-4">
                    <h2 class="h3Class" style="font-weight: 700;">线路轨迹</h2>
                </div>
            </div>
            <div class="row" style="margin-top: 30px;">
                <div class="col-sm-10">
                    <div class="form-horizontal" id="container" style="margin-left: 50px;width: 100%; height: 500px;"></div>
                    <div class="input-card" style="margin-left: 50px;">
                        <h4>轨迹回放控制</h4>
                        <div class="input-item">
                            <input type="button" class="btn" value="开始动画" id="start" onclick="startAnimation()"/>
                            <input type="button" class="btn" value="暂停动画" id="pause" onclick="pauseAnimation()"/>
                            <input type="button" class="btn" value="继续动画" id="resume" onclick="resumeAnimation()"/>
                            <input type="button" class="btn" value="停止动画" id="stop" onclick="stopAnimation()"/>
                        </div>
                        <div class="input-item">
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
<script type="text/javascript">
    window._AMapSecurityConfig = {
        securityJsCode: '44c5ee9ad584605d91ca69bfac32c761',
    }
</script>
<script src="https://webapi.amap.com/maps?v=1.4.8&key=d3bde6afb050067e1a765a8d1d1f4c54"></script>
<script src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
<script src="${ctxPath}/static/modular/system/tOrderPrivateCar/tOrderPrivateCar_info.js"></script>
@}
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tPromotionOrderCar/tPromotionOrder.html
New file
@@ -0,0 +1,50 @@
@layout("/common/_container.html"){
<div class="row">
    <div class="col-sm-12">
        <div class="ibox float-e-margins">
            <div class="ibox-title">
                <h5>推广收益明细</h5>
            </div>
            <div class="ibox-content">
                <div class="row row-lg">
                    <div class="col-sm-12">
                        <div class="row">
                            <div class="col-sm-3">
                                <#TimeCon id="insertTime" name="收益时间" isTime="false"/>
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="name" name="活动名称" />
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="driverName" name="司机名称" />
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="userName" name="用户名称" />
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="orderNum" name="订单编号" />
                            </div>
                            <div class="col-sm-3">
                                <#button name="搜索" icon="fa-search" clickFun="TAbnormalOrder.search()"/>
                                <#button name="重置" icon="fa-trash" clickFun="TAbnormalOrder.resetSearch()" space="true"/>
                            </div>
                        </div>
                        <div class="hidden-xs" id="TOrderPrivateCarTableToolbar" role="group">
                            <#button name="导出Excel" icon="" clickFun="TAbnormalOrder.exportExcel()" space="true"/>
                        </div>
                        <#table id="TOrderPrivateCarTable"/>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="${ctxPath}/static/modular/system/tPromotionOrderCar/tPromotionOrder.js"></script>
<script>
    laydate.render({
        elem: '#insertTime'
        ,range: true
    });
</script>
@}
ManagementQYTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tSysReformist/tSysReformist.html
@@ -43,7 +43,7 @@
                    <div>
                        <div style="float: left;">
                            <label class="lab checked" onclick="checkedLable(this)" tag="pushOrderSettings">推单设置</label>
                            <label class="lab" onclick="checkedLable(this)" tag="driverPayDays">司机分账账期设置</label>
<!--                            <label class="lab" onclick="checkedLable(this)" tag="driverPayDays">司机分账账期设置</label>-->
                            <label class="lab" onclick="checkedLable(this)" tag="cancelOrderSettings">取消订单设置</label>
                            <label class="lab" onclick="checkedLable(this)" tag="cancelTheReservationOrderSetting">预约单取消设置</label>
                            <label class="lab" onclick="checkedLable(this)" tag="spellOrderSetting">拼单派单设置</label>
ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tAbnormalOrderCar_info.js
New file
@@ -0,0 +1,312 @@
/**
 * 初始化快车订单详情对话框
 */
var TOrderPrivateCarInfoDlg = {
    tOrderPrivateCarInfoData: {}
};
/**
 * 清除数据
 */
TOrderPrivateCarInfoDlg.clearData = function () {
    this.tOrderPrivateCarInfoData = {};
}
/**
 * 设置对话框中的数据
 *
 * @param key 数据的名称
 * @param val 数据的具体值
 */
TOrderPrivateCarInfoDlg.set = function (key, val) {
    this.tOrderPrivateCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
    return this;
}
/**
 * 设置对话框中的数据
 *
 * @param key 数据的名称
 * @param val 数据的具体值
 */
TOrderPrivateCarInfoDlg.get = function (key) {
    return $("#" + key).val();
}
/**
 * 关闭此对话框
 */
TOrderPrivateCarInfoDlg.close = function () {
    parent.layer.close(window.parent.TOrderPrivateCar.layerIndex);
}
/**
 * 收集数据
 */
TOrderPrivateCarInfoDlg.collectData = function () {
    this
        .set('id')
        .set('type')
        .set('userId')
        .set('driverId')
        .set('carId')
        .set('orderNum')
        .set('placementLon')
        .set('placementLat')
        .set('placementAddress')
        .set('startLon')
        .set('startLat')
        .set('endLon')
        .set('startAddress')
        .set('endLat')
        .set('endAddress')
        .set('boardingLon')
        .set('boardingLat')
        .set('boardingAddress')
        .set('boardingTime')
        .set('getoffLon')
        .set('getoffLat')
        .set('getoffAddress')
        .set('getoffTime')
        .set('mileage')
        .set('payManner')
        .set('payType')
        .set('orderMoney')
        .set('startMoney')
        .set('mileageMoney')
        .set('durationMoney')
        .set('longDistanceMoney')
        .set('parkMoney')
        .set('roadTollMoney')
        .set('redPacketMoney')
        .set('couponMoney')
        .set('redPacketId')
        .set('couponId')
        .set('discount')
        .set('discountMoney')
        .set('activityId')
        .set('companyId')
        .set('payMoney')
        .set('substitute')
        .set('passengers')
        .set('passengersPhone')
        .set('state')
        .set('insertTime')
        .set('travelTime')
        .set('snatchOrderTime')
        .set('setOutTime')
        .set('arriveTime')
        .set('startServiceTime')
        .set('endServiceTime')
        .set('orderType')
        .set('orderSource')
        .set('invoiceId')
        .set('isReassign')
        .set('reassignNotice')
        .set('trackId')
        .set('isDelete')
        .set('oldState')
        .set('telX')
        .set('bindId')
        .set('serverCarModelId');
}
/**
 * 提交添加
 */
TOrderPrivateCarInfoDlg.addSubmit = function () {
    this.clearData();
    this.collectData();
    if ($("#startAddress").val() === ""){
        Feng.error("请输入起点");
        return false;
    }
    if ($("#endAddress").val() === ""){
        Feng.error("请输入终点");
        return false;
    }
    if ($("#travelTime").val() === ""){
        Feng.error("请选择用车时间");
        return false;
    }
    if ($("#passengers").val() === ""){
        Feng.error("请输入乘车人姓名");
        return false;
    }
    if ($("#passengersPhone").val() === ""){
        Feng.error("请输入乘车人手机号");
        return false;
    }
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/add", function (data) {
        Feng.success("添加成功!");
        window.parent.TOrderPrivateCar.table.refresh();
        TOrderPrivateCarInfoDlg.close();
    }, function (data) {
        Feng.error("添加失败!" + data.responseJSON.message + "!");
    });
    ajax.set(this.tOrderPrivateCarInfoData);
    ajax.start();
}
TOrderPrivateCarInfoDlg.save = function (){
        const selectedBtn = document.querySelector('.duty-btn.active');
        const responsibilityTypeVal = reverseTypeMap[selectedBtn.dataset.type];
        const remark = document.querySelector('textarea[name=handleRemark]').value;
        // 取money
        const money = document.querySelector('input[name=money]').value;
        const type = document.querySelector('input[name=type]').value;
        const orderNum = document.querySelector('input[name=orderNum]').value;
        console.log(type,orderNum)
        //提交信息
        var ajax = new $ax(Feng.ctxPath + "/abnormal/save", function(data){
            Feng.success("操作成功!");
        },function(data){
            Feng.error("操作失败!");
        });
        ajax.set("responsibilityTypeVal",responsibilityTypeVal);
        ajax.set("remark",remark);
        ajax.set("money",money);
        ajax.set("type",type);
        ajax.set("orderNum",orderNum);
        ajax.start();
}
/**
 * 提交修改
 */
TOrderPrivateCarInfoDlg.editSubmit = function () {
    this.clearData();
    this.collectData();
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/update", function (data) {
        Feng.success("修改成功!");
        window.parent.TOrderPrivateCar.table.refresh();
        TOrderPrivateCarInfoDlg.close();
    }, function (data) {
        Feng.error("修改失败!" + data.responseJSON.message + "!");
    });
    ajax.set(this.tOrderPrivateCarInfoData);
    ajax.start();
}
var map = new AMap.Map("container", {
    resizeEnable: true,
    zoom: 14
});
$(function () {
    var type = $("#type").val();
    if (type != 2) {
        getTrajectory();
    }
});
function getTrajectory() {
    $.ajax({
        url: Feng.ctxPath + '/tOrderPrivateCar/getOrderTrack',
        type: 'POST',
        data: {
            orderDetailId: $("#id").val()
        },
        success: function (res) {
            if (res.status == 200) {
                var data = res.data;
                if (data.length > 0) {
                    orderTrack(data);
                }
                /*else{
                                    Feng.error("当前订单没有轨迹");
                                }*/
            } else {
                Feng.error(res.msg);
            }
        }
    });
}
var marker, lineArr = [];
function orderTrack(data) {
    for (var i in data) {
        var waypoints = [];
        var lon = parseFloat(data[i].lon);
        var lat = parseFloat(data[i].lat);
        waypoints.push(lon);
        waypoints.push(lat);
        lineArr.push(waypoints);
    }
    marker = new AMap.Marker({
        map: map,
        position: lineArr[0],
        icon: "https://webapi.amap.com/images/car.png",
        offset: new AMap.Pixel(-26, -13),
        autoRotation: true,
        angle: -90,
    });
    // 绘制轨迹
    var polyline = new AMap.Polyline({
        map: map,
        path: lineArr,
        showDir: true,
        strokeColor: "#28F",  //线颜色
        // strokeOpacity: 1,     //线透明度
        strokeWeight: 6,      //线宽
        // strokeStyle: "solid"  //线样式
    });
    var passedPolyline = new AMap.Polyline({
        map: map,
        // path: lineArr,
        strokeColor: "#AF5",  //线颜色
        // strokeOpacity: 1,     //线透明度
        strokeWeight: 6,      //线宽
        // strokeStyle: "solid"  //线样式
    });
    marker.on('moving', function (e) {
        passedPolyline.setPath(e.passedPath);
    });
    map.setFitView();
}
function startAnimation() {
    marker.moveAlong(lineArr, 200);
}
function pauseAnimation() {
    marker.pauseMove();
}
function resumeAnimation() {
    marker.resumeMove();
}
function stopAnimation() {
    marker.stopMove();
}
/**
 * 选择起点
 */
TOrderPrivateCarInfoDlg.startAddress = function () {
    $("#startAddressModel").show();
};
/**
 * 选择终点
 */
TOrderPrivateCarInfoDlg.endAddress = function () {
    $("#endAddressModel").show();
};
ManagementQYTTravel/guns-admin/src/main/webapp/static/modular/system/tPromotionOrderCar/tPromotionOrder.js
New file
@@ -0,0 +1,219 @@
/**
 * 快车订单管理初始化
 */
var TAbnormalOrder = {
    id: "TOrderPrivateCarTable",    //表格id
    seItem: null,        //选中的条目
    table: null,
    layerIndex: -1
};
/**
 * 初始化表格的列
 */
TAbnormalOrder.initColumn = function () {
    return [
        {field: 'selectItem', radio: true},
        {title: '主键id', field: 'id', visible: false, align: 'center', valign: 'middle'},
        {title: '活动名称', field: 'name', visible: true, align: 'center', valign: 'middle',width:'8%',
        },
        {title: '司机名称', field: 'driverName', visible: true, align: 'center', valign: 'middle',
        },
        {title: '下级用户', field: 'userName', visible: true, align: 'center', valign: 'middle',
        },
        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
        },
        {title: '订单金额', field: 'money', visible: false, align: 'center', valign: 'middle'},
        {title: '司机推广收益', field: 'promotionMoney', visible: true, align: 'center', valign: 'middle',
        },
        {title: '收益时间', field: 'successTime', visible: true, align: 'center', valign: 'middle',
        }
    ];
};
/**
 * 检查是否选中
 */
TAbnormalOrder.check = function () {
    var selected = $('#' + this.id).bootstrapTable('getSelections');
    if(selected.length == 0){
        Feng.info("请先选中表格中的某一记录!");
        return false;
    }else{
        TAbnormalOrder.seItem = selected[0];
        return true;
    }
};
/**
 * 添加快车订单
 */
TAbnormalOrder.addOrder =function(){
    var index = layer.open({
        type: 2,
        title: '添加快车订单',
        area: ['100%', '100%'], //宽高
        fix: false, //不固定
        maxmin: true,
        content: Feng.ctxPath + '/tOrderPrivateCar/tOrderPrivateCar_addOrder'
    });
    this.layerIndex = index;
};
/**
 * 打开查看快车订单详情
 */
TAbnormalOrder.orderDetail = function () {
    if (this.check()) {
        var index = layer.open({
            type: 2,
            title: '异常订单详情',
            area: ['100%', '100%'], //宽高
            fix: false, //不固定
            maxmin: true,
            content: Feng.ctxPath + '/abnormal/tOrderPrivateCar_orderDetail?tOrderPrivateCarId=' + TAbnormalOrder.seItem.id+'&type='+$("#type").val()
        });
        this.layerIndex = index;
    }
};
TAbnormalOrder.orderDetail1 = function () {
    if (this.check()) {
        let abnormalStatus = TAbnormalOrder.seItem.abnormalStatus
        if(abnormalStatus==2){
            Feng.info("此异常订单已处理")
            return;
        }
        console.log(abnormalStatus)
        var index = layer.open({
            type: 2,
            title: '异常订单详情',
            area: ['100%', '100%'], //宽高
            fix: false, //不固定
            maxmin: true,
            content: Feng.ctxPath + '/abnormal/tOrderPrivateCar_orderDetail1?tOrderPrivateCarId=' + TAbnormalOrder.seItem.id+'&type='+$("#type").val()
        });
        this.layerIndex = index;
    }
};
/**
 * 订单轨迹
 */
TAbnormalOrder.trajectory = function(){
    if (this.check()) {
        var index = layer.open({
            type: 2,
            title: '快车订单轨迹',
            area: ['100%', '100%'], //宽高
            fix: false, //不固定
            maxmin: true,
            content: Feng.ctxPath + '/tOrderPrivateCar/tOrderPrivateCar_trajectory/' + TAbnormalOrder.seItem.id
        });
        this.layerIndex = index;
    }
}
/**
 * 删除快车订单
 */
TAbnormalOrder.deleteOrder = function () {
    if (this.check()) {
        var orderNum = TAbnormalOrder.seItem.orderNum;
        if (orderNum == "" || orderNum == null || orderNum == undefined) {
            orderNum = "该订单";
        } else {
            orderNum = "【" + orderNum + "】";
        }
        if (TAbnormalOrder.seItem.state != 10) {
            swal("删除失败", "【已取消】状态下才能执行此操作", "warning");
            return;
        }
        swal({
            title: "您是否确认删除" + orderNum + "?",
            text: "请谨慎操作,删除后数据无法恢复!",
            type: "warning",
            showCancelButton: true,
            confirmButtonColor: "#DD6B55",
            confirmButtonText: "删除",
            closeOnConfirm: false
        }, function () {
            var ajax = new $ax(Feng.ctxPath + "/tOrderPrivateCar/delete", function (data) {
                swal("删除成功", "您已经删除了" + orderNum + "。", "success");
                TAbnormalOrder.table.refresh();
            }, function (data) {
                swal("删除失败", data.responseJSON.message + "!", "warning");
            });
            ajax.set("tOrderPrivateCarId", TAbnormalOrder.seItem.id);
            ajax.start();
        });
    }
};
/**
 * 查询快车订单列表
 */
TAbnormalOrder.search = function () {
    var queryData = {};
    queryData['insertTime'] = $("#insertTime").val();
    queryData['name'] = $("#name").val();
    queryData['driverName'] = $("#driverName").val();
    queryData['userName'] = $("#userName").val();
    queryData['orderNum'] = $("#orderNum").val();
    TAbnormalOrder.table.refresh({query: queryData});
};
TAbnormalOrder.exportExcel=function (){
    let p = "";
    let insertTime = $('#insertTime').val();
    let name = $('#name').val();
    let driverName = $('#driverName').val();
    let userName = $('#userName').val();
    let orderNum = $('#orderNum').val();
    if(null != insertTime && '' != insertTime){
        p += "insertTime=" + insertTime + "&";
    }
    if(null != name && '' != name){
        p += "name=" + name + "&";
    }
    if(null != driverName && '' != driverName){
        p += "driverName=" + driverName + "&";
    }
    if(null != userName && '' != userName){
        p += "userName=" + userName + "&" ;
    }
    if(null != orderNum && '' != orderNum){
        p += "orderNum=" + orderNum + "&" ;
    }
    if('' != p){
        p = "?" + p.substring(0, p.length - 1);
    }
    console.log('p['+p+']')
    window.location.href = Feng.ctxPath + '/promotionInfo/export' + p;
}
TAbnormalOrder.resetSearch = function () {
    $("#insertTime").val("");
    $("#name").val("");
    $("#driverName").val("");
    $("#userName").val("");
    $("#orderNum").val("");
    TAbnormalOrder.search();
};
$(function () {
    var defaultColunms = TAbnormalOrder.initColumn();
    var table = new BSTable(TAbnormalOrder.id, "/promotionInfo/list", defaultColunms);
    table.setPaginationType("server");
    TAbnormalOrder.table = table.init();
});