接送机,录音修改,改派订单,接送机订单,人脸识别异常记录部分
14个文件已修改
15个文件已添加
1891 ■■■■■ 已修改文件
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderTransferController.java 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverFacialFailMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTransferMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverFacialFailMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTransferMapper.xml 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriver.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverFacialFail.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharteredCar.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTransfer.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverFacialFailService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderTransferService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverFacialFailServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderTransferServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel.html 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverFacialFail/tDriverFacialFail.html 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverFacialFail/tDriverFacialFail_add.html 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverFacialFail/tDriverFacialFail_edit.html 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar.html 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer.html 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_add.html 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_orderDetail.html 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_trajectory.html 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOrderTransfer/tOrderTransfer.js 379 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOrderTransfer/tOrderTransfer_info.js 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderTransferController.java
New file
@@ -0,0 +1,229 @@
package com.stylefeng.guns.modular.system.controller.specialTrain;
import com.alibaba.fastjson.JSONArray;
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.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.ITDriverService;
import com.stylefeng.guns.modular.system.service.ITOrderPositionService;
import com.stylefeng.guns.modular.system.service.ITOrderTransferService;
import com.stylefeng.guns.modular.system.service.ITServerCarmodelService;
import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
import com.stylefeng.guns.modular.system.util.PushMinistryOfTransportUtil;
import com.stylefeng.guns.modular.system.util.PushURL;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;
/**
 * 接送机订单控制器
 *
 * @author fengshuonan
 * @Date 2020-09-02 17:28:59
 */
@Controller
@RequestMapping("/tOrderTransfer")
public class TOrderTransferController extends BaseController {
    private String PREFIX = "/system/tOrderTransfer/";
    @Autowired
    private ITOrderTransferService tOrderTransferService;
    @Autowired
    private ITServerCarmodelService tServerCarmodelService;
    @Autowired
    private ITOrderPositionService tOrderPositionService;
    @Autowired
    private ITDriverService tDriverService;
    @Autowired
    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
    @Resource
    private OrderCancelMapper orderCancelMapper;
    @Value("${pushMinistryOfTransport}")
    private boolean pushMinistryOfTransport;
    @Value("${filePath}")
    private String filePath;
    /**
     * 跳转到接送机订单首页
     */
    @RequestMapping("")
    public String index(Model model) {
        //服务接送机车型
        List<TServerCarmodel> carmodelList = tServerCarmodelService.selectList(new EntityWrapper<TServerCarmodel>().eq("type", 1).eq("state", 1));
        model.addAttribute("carmodelList",carmodelList);
        return PREFIX + "tOrderTransfer.html";
    }
    /**
     * 跳转到修改接送机订单
     */
    @RequestMapping("/tOrderTransfer_orderDetail/{tOrderTransferId}")
    public String tOrderTransferUpdate(@PathVariable Integer tOrderTransferId, Model model) {
        Map<String, Object> item = tOrderTransferService.getTransferOrderDetailById(tOrderTransferId);
        model.addAttribute("item",item);
        return PREFIX + "tOrderTransfer_orderDetail.html";
    }
    /**
     * 跳转到出租车订单轨迹页面
     */
    @RequestMapping("/tOrderTransfer_trajectory/{tOrderTransferId}")
    public String tOrderTaxi_trajectory(@PathVariable Integer tOrderTransferId, Model model) {
        model.addAttribute("tOrderTransferId",tOrderTransferId);
        return PREFIX + "tOrderTransfer_trajectory.html";
    }
    /**
     * 获取接送机订单列表
     */
    @RequestMapping(value = "/list")
    @ResponseBody
    public Object list(String insertTime,
                       String orderNum,
                       Integer orderSource,
                       String userName,
                       String userPhone,
                       String passengers,
                       String passengersPhone,
                       Integer serverCarModelId,
                       String driver,
                       Integer state) {
        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(tOrderTransferService.getTransferOrderList(page,beginTime,endTime,ShiroKit.getUser().getRoleType(),ShiroKit.getUser().getObjectId(),orderNum,orderSource,userName,userPhone,passengers,passengersPhone,serverCarModelId,driver,state));
        return super.packForBT(page);
    }
    private ResultUtil resultUtil;
    /**
     * 获取订单轨迹
     * @param orderDetailId
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/getOrderTrack", method = RequestMethod.POST)
    public ResultUtil getOrderTrack(String orderDetailId){
        if(ToolUtil.isNotEmpty(orderDetailId)){
            try {
//                List<TOrderPosition> list = tOrderPositionService.selectList(new EntityWrapper<TOrderPosition>().eq("orderType", 1).eq("orderId", orderDetailId).orderBy("insertTime"));
                /*if(list.size() == 0){
                    return ResultUtil.error("该订单没有运行轨迹");
                }*/
                //将数据存储到文件中
                File file = new File(filePath + orderDetailId + "_1.txt");
                if(!file.exists()){
                    return ResultUtil.success(new ArrayList<>());
                }
                //读取文件(字符流)
                BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
                //循环取出数据
                String str = null;
                StringBuffer sb = new StringBuffer();
                while ((str = in.readLine()) != null) {
                    sb.append(str);
                }
                List<TOrderPosition> list = JSONArray.parseArray(sb.toString(), TOrderPosition.class);
                resultUtil = ResultUtil.success(list);
            }catch (Exception e){
                e.printStackTrace();
                resultUtil = ResultUtil.runErr();
            }
        }else {
            resultUtil = ResultUtil.paranErr();
        }
        return resultUtil;
    }
    /**
     * 取消接送机订单
     */
    @RequestMapping(value = "/cancel")
    @ResponseBody
    public Object cancel(@RequestParam Integer tOrderTransferId) {
        TOrderTransfer tOrderTransfer = tOrderTransferService.selectById(tOrderTransferId);
        //修改之前司机状态 -- 空闲
        if(null != tOrderTransfer.getDriverId()){
            TDriver driver = tDriverService.selectById(tOrderTransfer.getDriverId());
            driver.setState(2);
            tDriverService.updateById(driver);
        }
        tOrderTransfer.setState(10);
        tOrderTransferService.updateById(tOrderTransfer);
        OrderCancel orderCancel = new OrderCancel();
        orderCancel.setOrderId(tOrderTransferId);
        orderCancel.setOrderType(1);
        orderCancel.setReason("平台取消订单");
        orderCancel.setRemark("平台取消订单");
        orderCancel.setUserType(2);
        orderCancel.setState(2);
        orderCancel.setInsertTime(new Date());
        orderCancelMapper.insert(orderCancel);
        //增加推送
        Map<String,String> map = new HashMap<>();
        map.put("id", tOrderTransfer.getId().toString());
        map.put("orderType", "1");
        String result = HttpRequestUtil.postRequest(PushURL.cancel_order_url, map);
        System.out.println("接送机取消:【orderId="+tOrderTransfer.getId().toString()+"】,调用接口:"+result);
        new Thread(new Runnable() {
            @Override
            public void run() {
                if(pushMinistryOfTransport){//上传数据
                    pushMinistryOfTransportUtil.orderCancel(tOrderTransferId);
                }
            }
        }).start();
        return SUCCESS_TIP;
    }
    /**
     * 删除接送机订单
     */
    @RequestMapping(value = "/delete")
    @ResponseBody
    public Object delete(@RequestParam Integer tOrderTransferId) {
        TOrderTransfer tOrderTransfer = tOrderTransferService.selectById(tOrderTransferId);
        tOrderTransfer.setIsDelete(2);
        tOrderTransferService.updateById(tOrderTransfer);
        return SUCCESS_TIP;
    }
}
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
@@ -125,10 +125,10 @@
            loginFailures.put(username, f);
        }
        if(f > 5 && (System.currentTimeMillis() - t) <= (30 * 60 * 1000)){
            model.addAttribute("tips", "登录次数过多,请等30分钟再试!");
            return "/login.html";
        }
//        if(f > 5 && (System.currentTimeMillis() - t) <= (30 * 60 * 1000)){
//            model.addAttribute("tips", "登录次数过多,请等30分钟再试!");
//            return "/login.html";
//        }
        //验证验证码是否正确
        if (KaptchaUtil.getKaptchaOnOff()) {
            String kaptcha = super.getPara("kaptcha").trim();
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TDriverFacialFailMapper.java
New file
@@ -0,0 +1,22 @@
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.TCarModel;
import com.stylefeng.guns.modular.system.model.TDriverFacialFail;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * 人脸识别失败记录表 Mapper 接口
 * </p>
 *
 * @author 吕雪
 * @since 2020-06-05
 */
public interface TDriverFacialFailMapper extends BaseMapper<TDriverFacialFail> {
}
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TOrderTransferMapper.java
@@ -11,12 +11,36 @@
/**
 * <p>
 * 订单-专车 Mapper 接口
 * 订单-接送机 Mapper 接口
 * </p>
 *
 * @author 吕雪
 * @since 2020-09-02
 */
public interface TOrderTransferMapper extends BaseMapper<TOrderTransfer> {
    /**
     * 根据条件查询专车订单列表
     * @return
     */
    List<Map<String,Object>> getTransferOrderList(@Param("page") Page<Map<String, Object>> page,
                                                    @Param("beginTime") String beginTime,
                                                    @Param("endTime") String endTime,
                                                    @Param("roleType") Integer roleType,
                                                    @Param("nowUserId") Integer nowUserId,
                                                    @Param("orderNum") String orderNum,
                                                    @Param("orderSource") Integer orderSource,
                                                    @Param("userName") String userName,
                                                    @Param("userPhone") String userPhone,
                                                    @Param("passengers") String passengers,
                                                    @Param("passengersPhone") String passengersPhone,
                                                    @Param("serverCarModelId") Integer serverCarModelId,
                                                    @Param("driver") String driver,
                                                    @Param("state") Integer state);
    /**
     * 根据专车订单ID获取专车订单详情
     * @param orderId
     * @return
     */
    Map<String,Object> getTransferOrderDetailById(@Param("orderId") Integer orderId);
}
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TDriverFacialFailMapper.xml
New file
@@ -0,0 +1,21 @@
<?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.TDriverFacialFailMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.TDriverFacialFail">
        <id column="id" property="id" />
        <result column="driverId" property="driverId" />
        <result column="city" property="city" />
        <result column="cityCode" property="cityCode" />
        <result column="facialPicture" property="facialPicture" />
        <result column="createTime" property="createTime" />
        <result column="isDelete" property="isDelete" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, driverId, city, cityCode, facialPicture, createTime, isDelete
    </sql>
</mapper>
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderTransferMapper.xml
@@ -74,6 +74,94 @@
    <sql id="Base_Column_List">
        id, type, userId, driverId, carId, orderNum, placementLon, placementLat, placementAddress, startLon, startLat, endLon, startAddress, endLat, endAddress, boardingLon, boardingLat, boardingAddress, boardingTime, getoffLon, getoffLat, getoffAddress, getoffTime, mileage, payManner, payType, orderMoney, startMoney, mileageMoney, durationMoney, longDistanceMoney, parkMoney, roadTollMoney, redPacketMoney, couponMoney, redPacketId, couponId, discount, discountMoney, activityId, companyId, payMoney, substitute, passengers, passengersPhone, state, insertTime, travelTime, snatchOrderTime, setOutTime, arriveTime, startServiceTime, endServiceTime, orderType, orderSource, invoiceId, isReassign, reassignNotice, trackId, isDelete, oldState, telX, bindId, serverCarModelId
    </sql>
    <!--根据条件查询专车订单列表-->
    <select id="getTransferOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
        SELECT * FROM (SELECT ui.nickName as userName,ui.phone as userPhone,CONCAT(di.`name`,'-',di.phone) as driver,CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
        sc.`name` as serverCarModel,ot.* FROM t_order_transfer as ot
        LEFT JOIN t_user as ui on ui.id = ot.userId
        LEFT JOIN t_driver as di on di.id = ot.driverId
        LEFT JOIN t_car as ci on ci.id= ot.carId
        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId
        LEFT JOIN t_server_carmodel as sc on sc.id = ot.serverCarModelId
        ) as o
        <where>
            o.isDelete = 1 and o.type = 7
            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">
                AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59'))
            </if>
            <if test="orderNum != null and orderNum != ''">
                and o.orderNum  LIKE CONCAT('%',#{orderNum},'%')
            </if>
            <if test="orderSource != null and orderSource != ''">
                and o.orderSource = #{orderSource}
            </if>
            <if test="userName != null and userName != ''">
                and o.userName  LIKE CONCAT('%',#{userName},'%')
            </if>
            <if test="userPhone != null and userPhone != ''">
                and o.userPhone  LIKE CONCAT('%',#{userPhone},'%')
            </if>
            <if test="passengers != null and passengers != ''">
                and o.passengers  LIKE CONCAT('%',#{passengers},'%')
            </if>
            <if test="passengersPhone != null and passengersPhone != ''">
                and o.passengersPhone  LIKE CONCAT('%',#{passengersPhone},'%')
            </if>
            <if test="serverCarModelId != null and serverCarModelId != ''">
                and o.serverCarModelId  = #{serverCarModelId}
            </if>
            <if test="driver != null and driver != ''">
                and o.driver  LIKE CONCAT('%',#{driver},'%')
            </if>
            <if test="state != null and state != ''">
                and o.state = #{state}
            </if>
            <if test="roleType != null and roleType != '' and roleType == 2">
                and (o.companyId = #{nowUserId} or FIND_IN_SET(o.companyId,(SELECT GROUP_CONCAT(id) as ids FROM t_company where superiorId = #{nowUserId} GROUP BY superiorId)))
            </if>
            <if test="roleType != null and roleType != '' and roleType == 3">
                and o.companyId = #{nowUserId}
            </if>
        </where>
        order by o.id desc
    </select>
    <!--根据专车订单ID获取专车订单详情-->
    <select id="getTransferOrderDetailById" resultType="map">
        SELECT
            DATE_FORMAT(ot.insertTime,'%Y-%m-%d %H:%i') as insertTimeStr,
            DATE_FORMAT(ot.travelTime,'%Y-%m-%d %H:%i') as travelTimeStr,
            DATE_FORMAT(ot.boardingTime,'%Y-%m-%d %H:%i') as boardingTimeStr,
            DATE_FORMAT(ot.getoffTime,'%Y-%m-%d %H:%i') as getoffTimeStr,
            case when ot.orderSource = 1 then 'APP下单'
                 when ot.orderSource = 2 then '扫码下单'
                 when ot.orderSource = 3 then '小程序下单'
                 when ot.orderSource = 4 then '司机下单'
                 when ot.orderSource = 5 then '调度下单' else '' end orderSourceStr,
            ui.nickName as userName,ui.phone as userPhone,
            case when ot.payType = 1 then '微信'
                 when ot.payType = 2 then '支付宝'
                 when ot.payType = 3 then '余额' else '' end as payTypeStr,
            sc.`name` as serverCarModel,
            case when income1.type = 1 then income1.money else 0 end as platIncome,
            case when income1.type = 2 then income1.money else 0 end as companyIncome,
            case when income1.type = 3 then income1.money else 0 end as franchiseeIncome,
            IFNULL(income2.money,0) as driverIncome,
            CONCAT(di.`name`,'-',di.phone) as driver,
            CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
            cc.`name` as companyName,ot.*
        FROM t_order_transfer as ot
                 LEFT JOIN t_user as ui on ui.id = ot.userId
                 LEFT JOIN t_driver as di on di.id = ot.driverId
                 LEFT JOIN t_car as ci on ci.id= ot.carId
                 LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId
                 LEFT JOIN t_company as cc on cc.id = ot.companyId
                 LEFT JOIN t_server_carmodel as sc on sc.id = ot.serverCarModelId
                 LEFT JOIN (SELECT ii.money,ii.incomeId,cc.type FROM t_income as ii
                                                                         LEFT JOIN t_company as cc on ii.objectId = cc.id
                            where ii.userType = 1 and ii.type = 2 and ii.orderType = 7 GROUP BY ii.incomeId) as income1 on income1.incomeId = ot.id
                 LEFT JOIN (SELECT * FROM t_income where userType = 2 and type = 2 and orderType = 7 GROUP BY incomeId) as income2 on income2.incomeId = ot.id
        where ot.id = #{orderId}
    </select>
</mapper>
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriver.java
@@ -277,6 +277,45 @@
     */
    private Integer addObjectId;
    /**
     * 人脸识别失败次数 5次进行下线
     */
    private Integer failCount;
    /**
     * 是否需要进行人脸识别 1=是 0=否
     */
    private Integer isNeedFacial;
    /**
     * 上次人脸识别时间
     */
    private Date lastFacialTime;
    public Integer getFailCount() {
        return failCount;
    }
    public void setFailCount(Integer failCount) {
        this.failCount = failCount;
    }
    public Integer getIsNeedFacial() {
        return isNeedFacial;
    }
    public void setIsNeedFacial(Integer isNeedFacial) {
        this.isNeedFacial = isNeedFacial;
    }
    public Date getLastFacialTime() {
        return lastFacialTime;
    }
    public void setLastFacialTime(Date lastFacialTime) {
        this.lastFacialTime = lastFacialTime;
    }
    public BigDecimal getBalance() {
        return balance;
    }
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TDriverFacialFail.java
New file
@@ -0,0 +1,128 @@
package com.stylefeng.guns.modular.system.model;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import java.io.Serializable;
import java.util.Date;
/**
 * <p>
 * 司机人脸识别失败记录
 * </p>
 *
 * @author 吕雪
 * @since 2020-06-05
 */
@TableName("t_driver_facial_fail")
public class TDriverFacialFail extends Model<TDriverFacialFail> {
    private static final long serialVersionUID = 1L;
    /**
     * 主键id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 司机id
     */
    private Integer driverId;
    /**
     * 所属城市
     */
    private String city;
    /**
     * 城市code
     */
    private String cityCode;
    /**
     * 识别失败图片
     */
    private String facialPicture;
    /**
     * 识别时间
     */
    private String createTime;
    /**
     * 是否删除  1=否 2=是
     */
    private String isDelete;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getDriverId() {
        return driverId;
    }
    public void setDriverId(Integer driverId) {
        this.driverId = driverId;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getCityCode() {
        return cityCode;
    }
    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }
    public String getFacialPicture() {
        return facialPicture;
    }
    public void setFacialPicture(String facialPicture) {
        this.facialPicture = facialPicture;
    }
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public String getIsDelete() {
        return isDelete;
    }
    public void setIsDelete(String isDelete) {
        this.isDelete = isDelete;
    }
    @Override
    public String toString() {
        return "TDriverFacialFail{" +
                "id=" + id +
                ", driverId=" + driverId +
                ", city='" + city + '\'' +
                ", cityCode='" + cityCode + '\'' +
                ", facialPicture='" + facialPicture + '\'' +
                ", createTime='" + createTime + '\'' +
                ", isDelete='" + isDelete + '\'' +
                '}';
    }
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCharteredCar.java
@@ -1,5 +1,6 @@
package com.stylefeng.guns.modular.system.model;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableName;
@@ -38,7 +39,7 @@
    /**
     * 用车时长(天)
     */
    private Integer carTime;
    private BigDecimal carTime;
    /**
     * 服务车型id
     */
@@ -117,11 +118,11 @@
        this.traveltime = traveltime;
    }
    public Integer getCarTime() {
    public BigDecimal getCarTime() {
        return carTime;
    }
    public void setCarTime(Integer carTime) {
    public void setCarTime(BigDecimal carTime) {
        this.carTime = carTime;
    }
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderCrossCity.java
@@ -266,7 +266,29 @@
     * 移动小号绑定关系id
     */
    private String bindId;
    /**
     * 行程录音
     */
    private String routeRecord;
    /**
     * 录音时间
     */
    private Date recordTime;
    public Date getRecordTime() {
        return recordTime;
    }
    public void setRecordTime(Date recordTime) {
        this.recordTime = recordTime;
    }
    public String getRouteRecord() {
        return routeRecord;
    }
    public void setRouteRecord(String routeRecord) {
        this.routeRecord = routeRecord;
    }
    public Integer getOldState() {
        return oldState;
    }
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java
@@ -279,6 +279,29 @@
     */
    private Integer serverCarModelId;
    /**
     * 行程录音
     */
    private String routeRecord;
    /**
     * 录音时间
     */
    private Date recordTime;
    public Date getRecordTime() {
        return recordTime;
    }
    public void setRecordTime(Date recordTime) {
        this.recordTime = recordTime;
    }
    public String getRouteRecord() {
        return routeRecord;
    }
    public void setRouteRecord(String routeRecord) {
        this.routeRecord = routeRecord;
    }
    public Integer getId() {
        return id;
@@ -799,7 +822,7 @@
    @Override
    public String toString() {
        return "TOrderPrivateCar{" +
        return "TOrderTransfer{" +
        "id=" + id +
        ", type=" + type +
        ", userId=" + userId +
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderTransfer.java
@@ -279,7 +279,31 @@
     * 专车车型ID  关联t_server_carmodel表
     */
    private Integer serverCarModelId;
    /**
     * 行程录音
     */
    private String routeRecord;
    /**
     * 录音时间
     */
    private Date recordTime;
    public Date getRecordTime() {
        return recordTime;
    }
    public void setRecordTime(Date recordTime) {
        this.recordTime = recordTime;
    }
    public String getRouteRecord() {
        return routeRecord;
    }
    public void setRouteRecord(String routeRecord) {
        this.routeRecord = routeRecord;
    }
    public Integer getId() {
        return id;
@@ -800,7 +824,7 @@
    @Override
    public String toString() {
        return "TOrderPrivateCar{" +
        return "TOrderTransfer{" +
        "id=" + id +
        ", type=" + type +
        ", userId=" + userId +
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITDriverFacialFailService.java
New file
@@ -0,0 +1,16 @@
package com.stylefeng.guns.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.stylefeng.guns.modular.system.model.TDriverFacialFail;
/**
 * <p>
 * 人脸识别失败记录表 服务类
 * </p>
 *
 * @author 吕雪
 * @since 2020-06-05
 */
public interface ITDriverFacialFailService extends IService<TDriverFacialFail> {
}
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITOrderTransferService.java
@@ -1,8 +1,13 @@
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.TOrderPrivateCar;
import com.stylefeng.guns.modular.system.model.TOrderTransfer;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
 * <p>
@@ -14,4 +19,29 @@
 */
public interface ITOrderTransferService extends IService<TOrderTransfer> {
    /**
     * 根据条件查询专车订单列表
     * @return
     */
    List<Map<String,Object>> getTransferOrderList(@Param("page") Page<Map<String, Object>> page,
                                                    @Param("beginTime") String beginTime,
                                                    @Param("endTime") String endTime,
                                                    @Param("roleType") Integer roleType,
                                                    @Param("nowUserId") Integer nowUserId,
                                                    @Param("orderNum") String orderNum,
                                                    @Param("orderSource") Integer orderSource,
                                                    @Param("userName") String userName,
                                                    @Param("userPhone") String userPhone,
                                                    @Param("passengers") String passengers,
                                                    @Param("passengersPhone") String passengersPhone,
                                                    @Param("serverCarModelId") Integer serverCarModelId,
                                                    @Param("driver") String driver,
                                                    @Param("state") Integer state);
    /**
     * 根据专车订单ID获取专车订单详情
     * @param orderId
     * @return
     */
    Map<String,Object> getTransferOrderDetailById(@Param("orderId") Integer orderId);
}
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TDriverFacialFailServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.stylefeng.guns.modular.system.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.modular.system.dao.TDriverFacialFailMapper;
import com.stylefeng.guns.modular.system.model.TDriverFacialFail;
import com.stylefeng.guns.modular.system.service.ITDriverFacialFailService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 人脸识别失败记录表 服务实现类
 * </p>
 *
 * @author 吕雪
 * @since 2020-06-05
 */
@Service
public class TDriverFacialFailServiceImpl extends ServiceImpl<TDriverFacialFailMapper, TDriverFacialFail> implements ITDriverFacialFailService {
}
ManagementNTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderTransferServiceImpl.java
@@ -1,10 +1,14 @@
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.TOrderTransferMapper;
import com.stylefeng.guns.modular.system.model.TOrderTransfer;
import com.stylefeng.guns.modular.system.service.ITOrderTransferService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
 * <p>
@@ -16,5 +20,13 @@
 */
@Service
public class TOrderTransferServiceImpl extends ServiceImpl<TOrderTransferMapper, TOrderTransfer> implements ITOrderTransferService {
    @Override
    public List<Map<String, Object>> getTransferOrderList(Page<Map<String, Object>> page, String beginTime, String endTime, Integer roleType, Integer nowUserId, String orderNum, Integer orderSource, String userName, String userPhone, String passengers, String passengersPhone, Integer serverCarModelId, String driver, Integer state) {
        return this.baseMapper.getTransferOrderList(page, beginTime, endTime, roleType, nowUserId, orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, state);
    }
    @Override
    public Map<String, Object> getTransferOrderDetailById(Integer orderId) {
        return this.baseMapper.getTransferOrderDetailById(orderId);
    }
}
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tCarModel/tCarModel.html
@@ -16,19 +16,19 @@
                                <#NameCon id="name" name="名称" />
                            </div>
                            <div class="col-sm-3">
                                <#button name="搜索" icon="fa-search" clickFun="TCharteredService.search()"/>
                                <#button name="重置" icon="fa-trash" clickFun="TCharteredService.resetSearch()" space="true"/>
                                <#button name="搜索" icon="fa-search" clickFun="TCarModel.search()"/>
                                <#button name="重置" icon="fa-trash" clickFun="TCarModel.resetSearch()" space="true"/>
                            </div>
                        </div>
                        <div class="hidden-xs" id="TCarModelTableToolbar" role="group">
                            @if(shiro.hasPermission("/tCarModel/add")){
                                <#button name="添加" icon="fa-plus" clickFun="TCharteredService.openAddTCarModel()"/>
                                <#button name="添加" icon="fa-plus" clickFun="TCarModel.openAddTCarModel()"/>
                            @}
                            @if(shiro.hasPermission("/tCarModel/update")){
                                <#button name="编辑" icon="fa-edit" clickFun="TCharteredService.openTCarModelDetail()" space="true"/>
                                <#button name="编辑" icon="fa-edit" clickFun="TCarModel.openTCarModelDetail()" space="true"/>
                            @}
                            @if(shiro.hasPermission("/tCarModel/delete")){
                                <#button name="删除" icon="fa-remove" clickFun="TCharteredService.delete()" space="true"/>
                                <#button name="删除" icon="fa-remove" clickFun="TCarModel.delete()" space="true"/>
                            @}
                        </div>
                        <#table id="TCarModelTable"/>
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverFacialFail/tDriverFacialFail.html
New file
@@ -0,0 +1,45 @@
@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="phone" name="手机号"/>
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="name" name="名称" />
                            </div>
                            <div class="col-sm-3">
                                <#button name="搜索" icon="fa-search" clickFun="TDriverFacialFail.search()"/>
                                <#button name="重置" icon="fa-trash" clickFun="TDriverFacialFail.resetSearch()" space="true"/>
                            </div>
                        </div>
                        <div class="hidden-xs" id="TDriverFacialFailTableToolbar" role="group">
                            @if(shiro.hasPermission("/tDriverFacialFail/deleteBatch")){
                                <#button name="批量删除" icon="fa-remove" clickFun="TDriverFacialFail.deleteBatch()" space="true"/>
                            @}
                        </div>
                        <#table id="TDriverFacialFailTable"/>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="${ctxPath}/static/modular/system/tDriverFacialFail/tDriverFacialFail.js"></script>
<script>
    laydate.render({
        elem: '#createTime'
        ,range: true
    });
</script>
@}
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverFacialFail/tDriverFacialFail_add.html
New file
@@ -0,0 +1,38 @@
@layout("/common/_container.html"){
<div class="ibox float-e-margins">
    <div class="ibox-content">
        <div class="form-horizontal" id="driverFacialFailInfoForm">
            <div class="row">
                <div class="col-sm-11">
                    <#input id="name" name="类型名称" />
                    <#select id="seat" name="座位数:">
                        <option value="5">5座</option>
                        <option value="7">7座</option>
                    </#select>
                    <#select id="brandId" name="所属车辆品牌:" >
                        <option value="">选择所属车辆品牌</option>
                        @for(obj in brandList){
                        <option value="${obj.id}">${obj.name}</option>
                        @}
                    </#select>
                    <div class="form-group">
                        <label class="col-sm-3 control-label">备注:</label>
                        <div class="col-sm-9">
                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;"></textarea>
                        </div>
                    </div>
                </div>
            </div>
            <div class="row btn-group-m-t">
                <div class="col-sm-10 col-sm-offset-5">
                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TDriverFacialFailInfoDlg.addSubmit()"/>
                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TDriverFacialFailInfoDlg.close()"/>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="${ctxPath}/static/modular/system/tDriverFacialFail/tDriverFacialFail_info.js"></script>
@}
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tDriverFacialFail/tDriverFacialFail_edit.html
New file
@@ -0,0 +1,39 @@
@layout("/common/_container.html"){
<div class="ibox float-e-margins">
    <div class="ibox-content">
        <div class="form-horizontal" id="driverFacialFailInfoForm">
            <input type="hidden" id="id" name="id" value="${item.id}">
            <div class="row">
                <div class="col-sm-11">
                    <#input id="name" name="类型名称" value="${item.name}"/>
                    <#select id="seat" name="座位数:">
                        <option value="5" ${5 == item.seat ? 'selected=selected' : ''}>5座</option>
                        <option value="7" ${7 == item.seat ? 'selected=selected' : ''}>7座</option>
                    </#select>
                    <#select id="brandId" name="所属车辆品牌:" >
                        <option value="">选择所属车辆品牌</option>
                        @for(obj in brandList){
                        <option value="${obj.id}" ${obj.id == item.brandId ? 'selected=selected' : ''}>${obj.name}</option>
                        @}
                    </#select>
                    <div class="form-group">
                        <label class="col-sm-3 control-label">备注:</label>
                        <div class="col-sm-9">
                            <textarea type="text/plain" class="form-control" name="remark" id="remark" style="width:100%;height:150px;">${item.remark}</textarea>
                        </div>
                    </div>
                </div>
            </div>
            <div class="row btn-group-m-t">
                <div class="col-sm-10 col-sm-offset-5">
                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TDriverFacialFailInfoDlg.editSubmit()"/>
                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TDriverFacialFailInfoDlg.close()"/>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="${ctxPath}/static/modular/system/tDriverFacialFail/tDriverFacialFail_info.js"></script>
@}
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderCrossCity/tOrderCrossCity_detail.html
@@ -120,6 +120,18 @@
                    </div>
                </div>
            </div>
            <div class="row" style="margin-top: 30px;">
                <div class="col-sm-1">
                    <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>
                </div>
            </div>
        </div>
    </div>
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar.html
@@ -66,22 +66,22 @@
                                </#SelectCon>
                            </div>
                            <div class="col-sm-3">
                                <#button name="搜索" icon="fa-search" clickFun="TOrderPrivateCar.search()"/>
                                <#button name="重置" icon="fa-trash" clickFun="TOrderPrivateCar.resetSearch()" space="true"/>
                                <#button name="搜索" icon="fa-search" clickFun="TOrderTransfer.search()"/>
                                <#button name="重置" icon="fa-trash" clickFun="TOrderTransfer.resetSearch()" space="true"/>
                            </div>
                        </div>
                        <div class="hidden-xs" id="TOrderPrivateCarTableToolbar" role="group">
                            @if(shiro.hasPermission("/tOrderPrivateCar/orderDetail")){
                                <#button name="订单详情" icon="fa-plus" clickFun="TOrderPrivateCar.orderDetail()"/>
                                <#button name="订单详情" icon="fa-plus" clickFun="TOrderTransfer.orderDetail()"/>
                            @}
                            @if(shiro.hasPermission("/tOrderPrivateCar/cancelOrder")){
                                <#button name="取消订单" icon="fa-edit" clickFun="TOrderPrivateCar.cancelOrder()" space="true"/>
                                <#button name="取消订单" icon="fa-edit" clickFun="TOrderTransfer.cancelOrder()" space="true"/>
                            @}
                            @if(shiro.hasPermission("/tOrderPrivateCar/orderTrack")){
                                <#button name="订单轨迹" icon="fa-edit" clickFun="TOrderPrivateCar.trajectory()" space="true"/>
                                <#button name="订单轨迹" icon="fa-edit" clickFun="TOrderTransfer.trajectory()" space="true"/>
                            @}
                            @if(shiro.hasPermission("/tOrderPrivateCar/deleteOrder")){
                                <#button name="删除记录" icon="fa-remove" clickFun="TOrderPrivateCar.deleteOrder()" space="true"/>
                                <#button name="删除记录" icon="fa-remove" clickFun="TOrderTransfer.deleteOrder()" space="true"/>
                            @}
                        </div>
                        <#table id="TOrderPrivateCarTable"/>
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderPrivateCar/tOrderPrivateCar_orderDetail.html
@@ -105,6 +105,17 @@
                </div>
            </div>
            <div class="row" style="margin-top: 30px;">
                <div class="col-sm-1">
                    <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>
                </div>
            </div>
        </div>
    </div>
</div>
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer.html
New file
@@ -0,0 +1,101 @@
@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="orderNum" name="订单编号" />
                            </div>
                            <div class="col-sm-3">
                                <#SelectCon id="orderSource" name="订单来源" >
                                    <option value="">全部</option>
                                    <option value="1">APP下单</option>
                                    <option value="2">扫码下单</option>
                                    <option value="3">小程序下单</option>
                                    <option value="4">司机下单</option>
                                    <option value="5">调度下单</option>
                                </#SelectCon>
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="userName" name="下单用户昵称" />
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="userPhone" name="下单用户手机" />
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="passengers" name="乘车用户姓名" />
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="passengersPhone" name="乘车用户手机" />
                            </div>
                            <div class="col-sm-3">
                                <#SelectCon id="serverCarModelId" name="车型" >
                                    <option value="">全部</option>
                                    @for(obj in carmodelList){
                                    <option value="${obj.id}">${obj.name}</option>
                                    @}
                                </#SelectCon>
                            </div>
                            <div class="col-sm-3">
                                <#NameCon id="driver" 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>
                                    <option value="5">服务中</option>
                                    <option value="6">完成服务</option>
                                    <option value="7">待支付</option>
                                    <option value="8">待评价</option>
                                    <option value="9">已完成</option>
                                    <option value="10">已取消</option>
                                    <option value="11">改派中</option>
                                    <option value="12">取消待支付</option>
                                </#SelectCon>
                            </div>
                            <div class="col-sm-3">
                                <#button name="搜索" icon="fa-search" clickFun="TOrderTransfer.search()"/>
                                <#button name="重置" icon="fa-trash" clickFun="TOrderTransfer.resetSearch()" space="true"/>
                            </div>
                        </div>
                        <div class="hidden-xs" id="TOrderTransferTableToolbar" role="group">
                            @if(shiro.hasPermission("/tOrderTransfer/orderDetail")){
                                <#button name="订单详情" icon="fa-plus" clickFun="TOrderTransfer.orderDetail()"/>
                            @}
                            @if(shiro.hasPermission("/tOrderTransfer/cancelOrder")){
                                <#button name="取消订单" icon="fa-edit" clickFun="TOrderTransfer.cancelOrder()" space="true"/>
                            @}
                            @if(shiro.hasPermission("/tOrderTransfer/orderTrack")){
                                <#button name="订单轨迹" icon="fa-edit" clickFun="TOrderTransfer.trajectory()" space="true"/>
                            @}
                            @if(shiro.hasPermission("/tOrderTransfer/deleteOrder")){
                                <#button name="删除记录" icon="fa-remove" clickFun="TOrderTransfer.deleteOrder()" space="true"/>
                            @}
                        </div>
                        <#table id="TOrderTransferTable"/>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="${ctxPath}/static/modular/system/tOrderTransfer/tOrderTransfer.js"></script>
<script>
    laydate.render({
        elem: '#insertTime'
        ,range: true
    });
</script>
@}
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_add.html
New file
@@ -0,0 +1,89 @@
@layout("/common/_container.html"){
<div class="ibox float-e-margins">
    <div class="ibox-content">
        <div class="form-horizontal">
            <div class="row">
                <div class="col-sm-6 b-r">
                            <#input id="id" name="主键id" underline="true"/>
                            <#input id="type" name="类型(1=普通订单,2=摆渡订单)" underline="true"/>
                            <#input id="userId" name="用户id" underline="true"/>
                            <#input id="driverId" name="接单司机ID" underline="true"/>
                            <#input id="carId" name="车辆id" underline="true"/>
                            <#input id="orderNum" name="订单号" underline="true"/>
                            <#input id="placementLon" name="下单地点经度" underline="true"/>
                            <#input id="placementLat" name="下单地点纬度" underline="true"/>
                            <#input id="placementAddress" name="下单地点" underline="true"/>
                            <#input id="startLon" name="出发地经度值" underline="true"/>
                            <#input id="startLat" name="出发地纬度值" underline="true"/>
                            <#input id="endLon" name="目的地经度" underline="true"/>
                            <#input id="startAddress" name="出发地地点" underline="true"/>
                            <#input id="endLat" name="目的地纬度" underline="true"/>
                            <#input id="endAddress" name="目的地地点" underline="true"/>
                            <#input id="boardingLon" name="上车点经度" underline="true"/>
                            <#input id="boardingLat" name="上车点纬度" underline="true"/>
                            <#input id="boardingAddress" name="上车点" underline="true"/>
                            <#input id="boardingTime" name="上车时间" underline="true"/>
                            <#input id="getoffLon" name="下车点经度" underline="true"/>
                            <#input id="getoffLat" name="下车点纬度" underline="true"/>
                            <#input id="getoffAddress" name="下车地点" underline="true"/>
                            <#input id="getoffTime" name="下车时间" underline="true"/>
                            <#input id="mileage" name="行驶里程数(米)" underline="true"/>
                            <#input id="payManner" name="支付方式(1=未来平台支付,2=其他方式支付)" underline="true"/>
                            <#input id="payType" name="支付方式(1=微信,2=支付宝,3=其他)" underline="true"/>
                            <#input id="orderMoney" name="订单金额" underline="true"/>
                            <#input id="startMoney" name="起步价" underline="true"/>
                            <#input id="mileageMoney" name="里程费" underline="true"/>
                            <#input id="durationMoney" name="时长费" underline="true"/>
                            <#input id="longDistanceMoney" name="远途费" underline="true"/>
                            <#input id="parkMoney" name="停车费"/>
                </div>
                <div class="col-sm-6">
                            <#input id="roadTollMoney" name="过路费" underline="true"/>
                            <#input id="redPacketMoney" name="红包抵扣金额" underline="true"/>
                            <#input id="couponMoney" name="优惠券抵扣金额" underline="true"/>
                            <#input id="redPacketId" name="红包记录id" underline="true"/>
                            <#input id="couponId" name="优惠券id" underline="true"/>
                            <#input id="discount" name="折扣" underline="true"/>
                            <#input id="discountMoney" name="折扣优惠金额" underline="true"/>
                            <#input id="activityId" name="折扣活动id" underline="true"/>
                            <#input id="companyId" name="公司id" underline="true"/>
                            <#input id="payMoney" name="支付金额" underline="true"/>
                            <#input id="substitute" name="是否是代下单(0:否,1:是)" underline="true"/>
                            <#input id="passengers" name="乘车人" underline="true"/>
                            <#input id="passengersPhone" name="乘车人电话" underline="true"/>
                            <#input id="state" name="状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)" underline="true"/>
                            <#input id="insertTime" name="下单时间" underline="true"/>
                            <#input id="travelTime" name="出行时间" underline="true"/>
                            <#input id="snatchOrderTime" name="抢单时间" underline="true"/>
                            <#input id="setOutTime" name="司机点出发时间" underline="true"/>
                            <#input id="arriveTime" name="司机到达预约地点时间" underline="true"/>
                            <#input id="startServiceTime" name="开始服务时间" underline="true"/>
                            <#input id="endServiceTime" name="结束服务时间" underline="true"/>
                            <#input id="orderType" name="订单类型(1=普通,2=预约)" underline="true"/>
                            <#input id="orderSource" name="下单方式(1:APP下单,2:扫码下单,3:小程序下单,4:司机下单,5:调度下单)" underline="true"/>
                            <#input id="invoiceId" name="发票id" underline="true"/>
                            <#input id="isReassign" name="是否是改派单(1=否,2=是)" underline="true"/>
                            <#input id="reassignNotice" name="改派通知(0=没有改派,1=改派中,2=已改派)" underline="true"/>
                            <#input id="trackId" name="高德猎鹰上的轨迹id" underline="true"/>
                            <#input id="isDelete" name="是否删除  1=否 2=是" underline="true"/>
                            <#input id="oldState" name="状态(改派前订单状态)" underline="true"/>
                            <#input id="telX" name="移动小号" underline="true"/>
                            <#input id="bindId" name="移动小号绑定关系id" underline="true"/>
                            <#input id="serverCarModelId" name="接送机车型ID  关联t_server_carmodel表" underline="true"/>
                </div>
            </div>
            <div class="row btn-group-m-t">
                <div class="col-sm-10">
                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="TOrderTransferInfoDlg.addSubmit()"/>
                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="TOrderTransferInfoDlg.close()"/>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="${ctxPath}/static/modular/system/tOrderTransfer/tOrderTransfer_info.js"></script>
@}
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_orderDetail.html
New file
@@ -0,0 +1,136 @@
@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="${item.id}">
            <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">
                <div class="col-sm-6 b-r">
                    <#label id="insertTimeStr" name="下单时间" value="${item.insertTimeStr}"/>
                    <#label id="orderSourceStr" name="订单来源" value="${item.orderSourceStr}"/>
                    <#label id="userName" name="下单用户昵称" value="${item.userName}"/>
                    <#label id="passengers" name="乘车用户昵称" value="${item.passengers}"/>
                    <#label id="placementAddress" name="起点" value="${item.startAddress}"/>
                    <#label id="serverCarModel" name="选择车型" value="${item.serverCarModel}"/>
                    <#label id="car" name="接单车辆" value="${item.car}"/>
                    <#label id="boardingAddress" name="上车地点" value="${item.boardingAddress}"/>
                    <#label id="getoffAddress" name="下车地点" value="${item.getoffAddress}"/>
                </div>
                <div class="col-sm-6">
                    <#label id="orderNum" name="订单编号" value="${item.orderNum}"/>
                    <#label id="travelTimeStr" name="乘车时间" value="${item.travelTimeStr}"/>
                    <#label id="userPhone" name="下单用户手机号" value="${item.userPhone}"/>
                    <#label id="passengersPhone" name="乘车用户手机号" value="${item.passengersPhone}"/>
                    <#label id="endAddress" name="终点" value="${item.endAddress}"/>
                    <#label id="driver" name="接单司机" value="${item.driver}"/>
                    <#label id="companyName" name="车辆所属机构" value="${item.companyName}"/>
                    <#label id="boardingTimeStr" name="上车时间" value="${item.boardingTimeStr}"/>
                    <#label id="getoffTimeStr" name="下车时间" value="${item.getoffTimeStr}"/>
                </div>
            </div>
            <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">
                @if(isNotEmpty(item.orderMoney) && item.orderMoney > 0){
                    <div class="col-sm-6 b-r">
                        <#label id="orderMoney" name="订单总价" value="${item.orderMoney}元"/>
                        <#label id="travelMoney" name="行程费" value="${item.travelMoney}元"/>
                        <#label id="parkMoney" name="停车费" value="${item.parkMoney}元"/>
                        <#label id="roadTollMoney" name="过路费" value="${item.roadTollMoney}元"/>
                        <#label id="tipMoney" name="小费" value="${item.tipMoney}元"/>
                        @if(isNotEmpty(item.payMoney)){
                        <#label id="payMoney" name="实际支付费用" value="${item.payMoney}元"/>
                        @}else{
                        <#label id="payMoney" name="实际支付费用" value="0.00元"/>
                        @}
                        <#label id="payTypeStr" name="支付方式" value="${item.payTypeStr}"/>
                        <#label id="couponMoney" name="优惠券抵扣费用" value="${item.couponMoney}元"/>
                        <#label id="redPacketMoney" name="红包抵扣金额" value="${item.redPacketMoney}元"/>
                    </div>
                    <div class="col-sm-6">
                        <#label id="platIncome" name="平台收益" value="${item.platIncome}元"/>
                        <#label id="companyIncome" name="分公司收益" value="${item.companyIncome}元"/>
                        <#label id="franchiseeIncome" name="加盟商收益" value="${item.franchiseeIncome}元"/>
                        <#label id="driverIncome" name="司机收益" value="${item.driverIncome}元"/>
                    </div>
                @}else{
                <h4 style="margin-left: 10%">暂无费用明细</h4>
                @}
            </div>
            <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">
                <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 class="row" style="margin-top: 30px;">
                <div class="col-sm-1">
                    <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>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
<script src="https://webapi.amap.com/maps?v=1.4.8&key=e17d799b2506d05faf7f88320a266803"></script>
<script src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
<script src="${ctxPath}/static/modular/system/tOrderTransfer/tOrderTransfer_info.js"></script>
<script>
    $(function (){
        var myAudio = document.getElementById('audio');
        console.log(myAudio.dataset.enabled);
        if (myAudio.dataset.enabled === 'false') {
            console.log('audio is disabled');
            myAudio.pause();
        }
    })
</script>
@}
ManagementNTTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tOrderTransfer/tOrderTransfer_trajectory.html
New file
@@ -0,0 +1,52 @@
@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="${tOrderTransferId}">
            <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 src="https://webapi.amap.com/maps?v=1.4.8&key=e17d799b2506d05faf7f88320a266803"></script>
<script src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
<script src="${ctxPath}/static/modular/system/tOrderTransfer/tOrderTransfer_info.js"></script>
@}
ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOrderTransfer/tOrderTransfer.js
New file
@@ -0,0 +1,379 @@
/**
 * 接送机订单管理初始化
 */
var TOrderTransfer = {
    id: "TOrderTransferTable",    //表格id
    seItem: null,        //选中的条目
    table: null,
    layerIndex: -1
};
/**
 * 初始化表格的列
 */
TOrderTransfer.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',width:'8%',
            formatter: function (value, row) {
                var btn = "";
                if(row.insertTime != '' && row.insertTime != null) {
                    var time = row.insertTime.replace(" ",'<br>');
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.insertTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
                }
                return btn;
            }
        },
        {title: '订单编号', field: 'orderNum', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.orderNum != '' && row.orderNum != null) {
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderNum + '" onfocus="TUser.tooltip()">' + row.orderNum + '</p>']
                }
                return btn;
            }
        },
        {title: '订单来源', field: 'orderSource', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.orderSource != '' && row.orderSource != null) {
                    if (row.orderSource == 1){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="APP下单" onfocus="TUser.tooltip()">APP下单</p>']
                    } else if (row.orderSource == 2){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="扫码下单" onfocus="TUser.tooltip()">扫码下单</p>']
                    } else if (row.orderSource == 3){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="小程序下单" onfocus="TUser.tooltip()">小程序下单</p>']
                    } else if (row.orderSource == 4){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="司机下单" onfocus="TUser.tooltip()">司机下单</p>']
                    } else if (row.orderSource == 5){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="调度下单" onfocus="TUser.tooltip()">调度下单</p>']
                    }
                }
                return btn;
            }
        },
        {title: '乘车时间', field: 'travelTime', visible: true, align: 'center', valign: 'middle',width:'10%',
            formatter: function (value, row) {
                var btn = "";
                if(row.travelTime != '' && row.travelTime != null) {
                    var time = row.travelTime.replace(" ",'<br>');
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.travelTime + '" onfocus="TUser.tooltip()">' + time + '</p>']
                }
                return btn;
            }
        },
        {title: '用户id', field: 'userId', visible: false, align: 'center', valign: 'middle'},
        {title: '下单用<br/>户昵称', field: 'userName', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.userName != '' && row.userName != null) {
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userName + '" onfocus="TUser.tooltip()">' + row.userName + '</p>']
                }
                return btn;
            }
        },
        {title: '下单用<br/>户手机', field: 'userPhone', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.userPhone != '' && row.userPhone != null) {
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.userPhone + '" onfocus="TUser.tooltip()">' + row.userPhone + '</p>']
                }
                return btn;
            }
        },
        {title: '乘车用<br/>户姓名', field: 'passengers', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.passengers != '' && row.passengers != null) {
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.passengers + '" onfocus="TUser.tooltip()">' + row.passengers + '</p>']
                }
                return btn;
            }
        },
        {title: '乘车用<br/>户手机', field: 'passengersPhone', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.passengersPhone != '' && row.passengersPhone != null) {
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.passengersPhone + '" onfocus="TUser.tooltip()">' + row.passengersPhone + '</p>']
                }
                return btn;
            }
        },
        {title: '起点', field: 'startAddress', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.startAddress != '' && row.startAddress != null) {
                    var str = row.startAddress;
                    var str1 = "";
                    var arr = "";
                    for(var i=0,len=str.length/15;i<len;i++) {
                        str1 = str.substr(0,15);
                        str = str.replace(str1,'');
                        arr += str1 + "<br>";
                    }
                    arr = arr.substring(0,arr.length-4);
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.startAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
                }
                return btn;
            }
        },
        {title: '终点', field: 'endAddress', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.endAddress != '' && row.endAddress != null) {
                    var str = row.endAddress;
                    var str1 = "";
                    var arr = "";
                    for(var i=0,len=str.length/15;i<len;i++) {
                        str1 = str.substr(0,15);
                        str = str.replace(str1,'');
                        arr += str1 + "<br>";
                    }
                    arr = arr.substring(0,arr.length-4);
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.endAddress + '" onfocus="TUser.tooltip()">' + arr + '</p>']
                }
                return btn;
            }
        },
        {title: '选择车型', field: 'serverCarModel', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.serverCarModel != '' && row.serverCarModel != null) {
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.serverCarModel + '" onfocus="TUser.tooltip()">' + row.serverCarModel + '</p>']
                }
                return btn;
            }
        },
        {title: '接单司机', field: 'driver', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.driver != '' && row.driver != null) {
                    var driverName1 = row.driver.replace("-","<br>");
                    var driverName2 = row.driver.replace("-","&#10;");
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + driverName2 + '" onfocus="TUser.tooltip()">' + driverName1 + '</p>']
                }
                return btn;
            }
        },
        {title: '接单车辆', field: 'car', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.car != '' && row.car != null) {
                    var car1 = row.car.replace("-","<br>");
                    var car2 = row.car.replace("-","&#10;");
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + car2 + '" onfocus="TUser.tooltip()">' + car1 + '</p>']
                }
                return btn;
            }
        },
        {title: '订单金额', field: 'orderMoney', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.orderMoney != '' && row.orderMoney != null) {
                    btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="' + row.orderMoney + '" onfocus="TUser.tooltip()">' + row.orderMoney + '</p>']
                }
                return btn;
            }
        },
        {title: '状态', field: 'state', visible: true, align: 'center', valign: 'middle',
            formatter: function (value, row) {
                var btn = "";
                if(row.state != '' && row.state != null) {
                    if (row.state == 1){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待接单" onfocus="TUser.tooltip()">待接单</p>']
                    } else if (row.state == 2){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待出发" onfocus="TUser.tooltip()">待出发</p>']
                    } else if (row.state == 3){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待到达预约地点" onfocus="TUser.tooltip()">待到达预约地点</p>']
                    } else if (row.state == 4){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待乘客上车" onfocus="TUser.tooltip()">待乘客上车</p>']
                    } else if (row.state == 5){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="服务中" onfocus="TUser.tooltip()">服务中</p>']
                    } else if (row.state == 6){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="完成服务" onfocus="TUser.tooltip()">完成服务</p>']
                    } else if (row.state == 7){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待支付" onfocus="TUser.tooltip()">待支付</p>']
                    } else if (row.state == 8){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="待评价" onfocus="TUser.tooltip()">待评价</p>']
                    } else if (row.state == 9){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已完成" onfocus="TUser.tooltip()">已完成</p>']
                    } else if (row.state == 10){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="已取消" onfocus="TUser.tooltip()">已取消</p>']
                    } else if (row.state == 11){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="改派中" onfocus="TUser.tooltip()">改派中</p>']
                    } else if (row.state == 12){
                        btn = ['<p class="toolTip" style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;" title="取消待支付" onfocus="TUser.tooltip()">取消待支付</p>']
                    }
                }
                return btn;
            }
        }
    ];
};
/**
 * 检查是否选中
 */
TOrderTransfer.check = function () {
    var selected = $('#' + this.id).bootstrapTable('getSelections');
    if(selected.length == 0){
        Feng.info("请先选中表格中的某一记录!");
        return false;
    }else{
        TOrderTransfer.seItem = selected[0];
        return true;
    }
};
/**
 * 打开查看接送机订单详情
 */
TOrderTransfer.orderDetail = function () {
    if (this.check()) {
        var index = layer.open({
            type: 2,
            title: '接送机订单详情',
            area: ['100%', '100%'], //宽高
            fix: false, //不固定
            maxmin: true,
            content: Feng.ctxPath + '/tOrderTransfer/tOrderTransfer_orderDetail/' + TOrderTransfer.seItem.id
        });
        this.layerIndex = index;
    }
};
/**
 * 取消订单
 */
TOrderTransfer.cancelOrder = function(){
    if (this.check()) {
        var nickname = TOrderTransfer.seItem.orderNum;
        if (nickname == "" || nickname == null || nickname == undefined) {
            nickname = "该订单";
        } else {
            nickname = "【" + nickname + "】";
        }
        if (TOrderTransfer.seItem.state == 7 || TOrderTransfer.seItem.state == 8 || TOrderTransfer.seItem.state == 9 || TOrderTransfer.seItem.state == 10 ) {
            swal("取消失败", "【待评价】【已完成】【已取消】状态下不能执行此操作", "warning");
            return;
        }
        swal({
            title: "您是否确认取消订单" + nickname + "?",
            text: "请谨慎操作,取消后数据无法恢复!",
            type: "warning",
            showCancelButton: true,
            confirmButtonColor: "#DD6B55",
            confirmButtonText: "取消订单",
            closeOnConfirm: false
        }, function () {
            var ajax = new $ax(Feng.ctxPath + "/tOrderTransfer/cancel", function (data) {
                layer.msg("加载中...",{
                    icon:16,
                    time:-1
                });
                swal("取消订单成功", "您已经成功取消了" + nickname + "。", "success");
                TOrderTransfer.table.refresh();
                layer.closeAll()
            }, function (data) {
                swal("取消订单失败", data.responseJSON.message + "!", "warning");
                layer.closeAll()
            });
            ajax.set("tOrderTransferId", TOrderTransfer.seItem.id);
            ajax.start();
        });
    }
}
/**
 * 订单轨迹
 */
TOrderTransfer.trajectory = function(){
    if (this.check()) {
        var index = layer.open({
            type: 2,
            title: '接送机订单轨迹',
            area: ['100%', '100%'], //宽高
            fix: false, //不固定
            maxmin: true,
            content: Feng.ctxPath + '/tOrderTransfer/tOrderTransfer_trajectory/' + TOrderTransfer.seItem.id
        });
        this.layerIndex = index;
    }
}
/**
 * 删除接送机订单
 */
TOrderTransfer.deleteOrder = function () {
    if (this.check()) {
        var orderNum = TOrderTransfer.seItem.orderNum;
        if (orderNum == "" || orderNum == null || orderNum == undefined) {
            orderNum = "该订单";
        } else {
            orderNum = "【" + orderNum + "】";
        }
        if (TOrderTransfer.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 + "/tOrderTransfer/delete", function (data) {
                swal("删除成功", "您已经删除了" + orderNum + "。", "success");
                TOrderTransfer.table.refresh();
            }, function (data) {
                swal("删除失败", data.responseJSON.message + "!", "warning");
            });
            ajax.set("tOrderTransferId", TOrderTransfer.seItem.id);
            ajax.start();
        });
    }
};
/**
 * 查询接送机订单列表
 */
TOrderTransfer.search = function () {
    var queryData = {};
    queryData['insertTime'] = $("#insertTime").val();
    queryData['orderNum'] = $("#orderNum").val();
    queryData['orderSource'] = $("#orderSource").val();
    queryData['userName'] = $("#userName").val();
    queryData['userPhone'] = $("#userPhone").val();
    queryData['passengers'] = $("#passengers").val();
    queryData['passengersPhone'] = $("#passengersPhone").val();
    queryData['serverCarModelId'] = $("#serverCarModelId").val();
    queryData['driver'] = $("#driver").val();
    queryData['state'] = $("#state").val();
    TOrderTransfer.table.refresh({query: queryData});
};
TOrderTransfer.resetSearch = function () {
    $("#insertTime").val("");
    $("#orderNum").val("");
    $("#orderSource").val("");
    $("#userName").val("");
    $("#userPhone").val("");
    $("#passengers").val("");
    $("#passengersPhone").val("");
    $("#serverCarModelId").val("");
    $("#driver").val("");
    $("#state").val("");
    TOrderTransfer.search();
};
$(function () {
    var defaultColunms = TOrderTransfer.initColumn();
    var table = new BSTable(TOrderTransfer.id, "/tOrderTransfer/list", defaultColunms);
    table.setPaginationType("server");
    TOrderTransfer.table = table.init();
});
ManagementNTTravel/guns-admin/src/main/webapp/static/modular/system/tOrderTransfer/tOrderTransfer_info.js
New file
@@ -0,0 +1,248 @@
/**
 * 初始化专车订单详情对话框
 */
var TOrderTransferInfoDlg = {
    tOrderTransferInfoData : {}
};
/**
 * 清除数据
 */
TOrderTransferInfoDlg.clearData = function() {
    this.tOrderTransferInfoData = {};
}
/**
 * 设置对话框中的数据
 *
 * @param key 数据的名称
 * @param val 数据的具体值
 */
TOrderTransferInfoDlg.set = function(key, val) {
    this.tOrderTransferInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
    return this;
}
/**
 * 设置对话框中的数据
 *
 * @param key 数据的名称
 * @param val 数据的具体值
 */
TOrderTransferInfoDlg.get = function(key) {
    return $("#" + key).val();
}
/**
 * 关闭此对话框
 */
TOrderTransferInfoDlg.close = function() {
    parent.layer.close(window.parent.TOrderTransfer.layerIndex);
}
/**
 * 收集数据
 */
TOrderTransferInfoDlg.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');
}
/**
 * 提交添加
 */
TOrderTransferInfoDlg.addSubmit = function() {
    this.clearData();
    this.collectData();
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tOrderTransfer/add", function(data){
        Feng.success("添加成功!");
        window.parent.TOrderTransfer.table.refresh();
        TOrderTransferInfoDlg.close();
    },function(data){
        Feng.error("添加失败!" + data.responseJSON.message + "!");
    });
    ajax.set(this.tOrderTransferInfoData);
    ajax.start();
}
/**
 * 提交修改
 */
TOrderTransferInfoDlg.editSubmit = function() {
    this.clearData();
    this.collectData();
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tOrderTransfer/update", function(data){
        Feng.success("修改成功!");
        window.parent.TOrderTransfer.table.refresh();
        TOrderTransferInfoDlg.close();
    },function(data){
        Feng.error("修改失败!" + data.responseJSON.message + "!");
    });
    ajax.set(this.tOrderTransferInfoData);
    ajax.start();
}
var map = new AMap.Map("container", {
    resizeEnable: true,
    zoom: 14
});
$(function() {
    getTrajectory();
});
function getTrajectory() {
    $.ajax({
        url: Feng.ctxPath + '/tOrderTransfer/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();
}