对接天易GPS相关接口-车辆使用的GPS设备,安装,定位,查询

对接天易

 使用GPS安装,我们使用两种方式:天易派工安装和自己安装两种;

天易安装,安装他们的要求进行填写需要的参数,一个派工单可以填入多辆车,一辆车可以安装多个GPS,同一个类型的10个以内就行;

此次对接的天易接口:

1.天易派工申请接口;

2.根据工单号查询工单信息;

3.根据设备号查询设备实时位置与设备状态信息;

4.根据设备号与时间查询设备历史轨迹信息;

5.查询账户车辆信息;

天易的这五个接口,访问方式不同,有get有post,传参方式也不同,这点在对接时是感觉不太好的;

package com.yifenqi.tianyi.config;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 天易请求关键参数
 * 
 * @author zhangshiwei
 * @time 2018年8月6日下午5:30:24
 */
@Data
@AllArgsConstructor
public class TyProperty {

    /**
     * 天易--有关派单的服务器地址
     */
    private String tianyiOrderPath;

    /**
     * 天易--拉车账号
     */
    private String carAccount;

    /**
     * 天易--有关GPS设备的服务器地址
     */
    private String tianyiGpsPath;

    /**
     * 天易--登陆账号
     */
    private String userAccount;

    /**
     * 天易--密钥
     */
    private String token;

    /**
     * 天易--签名,规则为userAccount_token(做md5加密小写),请联系天易分配
     */
    private String sign;

}
 

package com.yifenqi.tianyi.config;

import java.util.List;

import com.github.myoss.phoenix.core.lang.dto.Result;
import com.yifenqi.tianyi.dto.GpsInfoRequestDto;
import com.yifenqi.tianyi.dto.HistoryTrajectoryRequestDto;
import com.yifenqi.tianyi.dto.SelectOrderInfoRequestDto;
import com.yifenqi.tianyi.dto.TerminalDataDto;
import com.yifenqi.tianyi.gps.TyGpsUtils;
import com.yifenqi.tianyi.gps.dto.CarInfoDto;
import com.yifenqi.tianyi.gps.dto.GpsInfoDto;
import com.yifenqi.tianyi.gps.dto.VehicleHistoryInfoDto;
import com.yifenqi.tianyi.order.TyOrderUtils;
import com.yifenqi.tianyi.order.dto.GpsOrderApplyRequestDto;

import lombok.Data;

/**
 * 天易接口调用
 * 
 * @author zhangshiwei
 * @time 2018年8月6日下午5:40:35
 */
@Data
public class TyClient {

    private static TyProperty tyProperty;

    public TyClient(TyProperty tyProperty) {
        TyClient.tyProperty = tyProperty;
    }

    public static TyProperty getTyProperty() {
        return tyProperty;
    }

    /**
     * 发起天易派单请求
     * 
     * @param requestDto 派单请求信息
     * @return 成功时返回的工单号
     */
    public Result<String> gpsOrderApply(GpsOrderApplyRequestDto requestDto) {
        return TyOrderUtils.gpsOrderApply(tyProperty, requestDto);
    }

    /**
     * 查询工单信息
     * 
     * @param requestDto 工单号
     * @return 成功则返回此工单含有的设备信息list
     */
    public Result<TerminalDataDto> queryOrderInfo(SelectOrderInfoRequestDto requestDto) {
        return TyOrderUtils.queryOrderInfo(tyProperty, requestDto);
    }

    /**
     * 查询设备实时位置信息list
     * 
     * @param requestDto 设备号(可以多个)
     * @return 设备位置信息lsit
     */
    public Result<List<GpsInfoDto>> queryGpsInfoList(GpsInfoRequestDto requestDto) {
        return TyGpsUtils.queryGpsInfoList(tyProperty, requestDto);
    }

    /**
     * 查询车辆历史轨迹信息
     * 
     * @param requestDto 设备号(只能一个),开始时间,结束时间
     * @return 车辆历史轨迹信息list
     */
    public Result<List<VehicleHistoryInfoDto>> queryHistoryTrajectory(HistoryTrajectoryRequestDto requestDto) {
        return TyGpsUtils.queryHistoryTrajectory(tyProperty, requestDto);
    }

    /**
     * 查询账户车辆信息
     * 
     * @return 车辆信息list
     */
    public Result<List<CarInfoDto>> queryCarInfoList() {
        return TyGpsUtils.queryCarInfoList(tyProperty);
    }

}
 

package com.yifenqi.tianyi.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnProperty(prefix = "portal.tianyi", value = "enabled", matchIfMissing = false)
public class TyConfig {

    @Bean(name = "portal.tianyi.config")
    @Autowired
    public TyProperty tyProperty(@Value("${portal.tianyi.config.order.path}") String tianyiOrderPath,
                                 @Value("${portal.tianyi.config.carAccount}") String carAccount,
                                 @Value("${portal.tianyi.config.gps.path}") String tianyiGpsPath,
                                 @Value("${portal.tianyi.config.userAccount}") String userAccount,
                                 @Value("${portal.tianyi.config.token}") String token,
                                 @Value("${portal.tianyi.config.sign}") String sign) {
        return new TyProperty(tianyiOrderPath, carAccount, tianyiGpsPath, userAccount, token, sign);
    }

    @Bean(name = "portal.tianyi.client")
    @Autowired
    public TyClient TyClient(@Qualifier("portal.tianyi.config") TyProperty tyProperty) {
        return new TyClient(tyProperty);
    }
}
 

还有spring.factroies中的配置config全路径

文件结构:

我一开始写的虽然也能实现功能,但是接口很乱,经过一位大神的指点,就改成了这样,一目了然!

package com.yifenqi.tianyi.common;

import lombok.Data;

/**
 * 天易返回信息基础信息
 * 
 * @author zhangshiwei
 * @time 2018年8月6日下午4:46:17
 */
@Data
public class TyBaseResponseDto {

    /**
     * 调用返回值,0调用成功,1参数错误,2用户鉴权失败,9其他错误
     */
    private String result;

    /**
     * 调用失败提示信息,成功时没有
     */
    private String message;

}
 

package com.yifenqi.tianyi.common;

import org.springframework.util.StringUtils;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public enum TyGpsUrlEnum {

    /**
     * GPS安装派单申请
     */
    GPS_ORDER_APPLY("1", "/dispatch_intf/hxController?sendOrder", "%s%s", ""),

    /**
     * 查询工单情况
     */
    QUERY_GPS_ORDER_INFO("2", "/dispatch_intf/hxController?getOrderInfo", "%s%s", ""),

    /**
     * 查询车辆实时位置信息
     */
    QUERY_GPS_INFO_LIST("3", "/gps-intf/api/getTerminalInfo.html", "%s%s", "userAccount=%s&token=%s&sign=%s&imeis=%s"),

    /**
     * 查询车辆历史轨迹
     */
    QUERY_HISTORY_TRAJECTORY("4", "/gps-intf/api/getTerminalHis.html", "%s%s",
            "userAccount=%s&token=%s&sign=%s&imei=%s&beginTime=%s&endTime=%s"),

    /**
     * 查询用户车辆信息
     */
    QUERY_CAR_INFO_LIST("5", "/gps-intf/api/getTerminals.html", "%s%s", "userAccount=%s&token=%s&sign=%s");

    /**
     * 接口类型
     */
    private String code;

    /**
     * 请求地址host
     */
    private String host;

    /**
     * 请求地址host拼接方式
     */
    private String hostFormat;

    /**
     * 请求参数拼接方式
     */
    private String paramFormat;

    public static TyGpsUrlEnum getEnumByCode(String code) {
        if (StringUtils.isEmpty(code)) {
            return null;
        }
        for (TyGpsUrlEnum item : TyGpsUrlEnum.values()) {
            if (item.getCode().equals(code)) {
                return item;
            }
        }
        return null;
    }

}
 

package com.yifenqi.tianyi.common;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 查询工单情况Dto
 * 
 * @author zhangshiwei
 * @time 2018年7月27日上午13:33:01
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class TyResponseDto extends TyBaseResponseDto {

    /**
     * 天易返回的数据
     */
    private String data;

}
 

package com.yifenqi.tianyi.dto;

import lombok.Data;

/**
 * 查询账户车辆信息请求Dto
 * 
 * @author zhangshiwei
 * @time 2018年7月28日上午11:15:51
 */
@Data
public class CarInfoListRequestDto {

    /**
     * 登陆账号
     */
    private String userAccount;

    /**
     * 密钥
     */
    private String token;

    /**
     * 签名
     */
    private String sign;

    /**
     * 接口地址
     */
    private String carListInfoPath;

}
 

package com.yifenqi.tianyi.dto;

import lombok.Data;

/**
 * 查询设备位置信息Dto
 * 
 * @author zhangshiwei
 * @time 2018年7月27日上午16:15:51
 */
@Data
public class GpsInfoRequestDto {

    /**
     * 设备号,多个设备号用逗号隔开
     */
    private String  imies;

    /**
     * 渠道编号
     */
    private Integer channelId;

}
 

package com.yifenqi.tianyi.dto;

import java.util.Date;

import lombok.Data;

/**
 * 查询车辆历史轨迹信息请求Dto
 * 
 * @author zhangshiwei
 * @time 2018年7月28日下午12:38:42
 */
@Data
public class HistoryTrajectoryRequestDto {

    /**
     * 设备号,就一个!
     */
    private String  imie;

    /**
     * 开始时间
     */
    private Date    beginTimeDate;

    /**
     * 结束时间
     */
    private Date    endTimeDate;

    /**
     * 开始时间
     */
    private String  beginTimeString;

    /**
     * 结束时间
     */
    private String  endTimeString;

    /**
     * 渠道编号
     */
    private Integer channelId;
}
 

package com.yifenqi.tianyi.dto;

import lombok.Data;

/**
 * 查询工单情况Dto
 * 
 * @author zhangshiwei
 * @time 2018年7月27日上午13:33:01
 */
@Data
public class SelectOrderInfoRequestDto {

    /**
     * 工单号
     */
    private String  orderNo;

    /**
     * 渠道编号
     */
    private Integer channelId;

}
 

package com.yifenqi.tianyi.dto;

import java.util.List;

import com.yifenqi.tianyi.gps.dto.TerminalDto;

import lombok.Data;

/**
 * 天易返回的工单信息data
 * 
 * @author zhangshiwei
 * @time 2018年7月28日下午1:03:19
 */
@Data
public class TerminalDataDto {

    /**
     * 设备list
     */
    private List<TerminalDto> terminal;

    /**
     * 工单状态:1已派单,2已接单,3已完成,4退回客户
     */
    private String            status;

}
 

package com.yifenqi.tianyi.gps.dto;

import lombok.Data;

/**
 * 天易返回根据账户查询的车辆信息
 * 
 * @author zhangshiwei
 * @time 2018年7月28日下午12:41:01
 */
@Data
public class CarInfoDto {

    /**
     * 品牌
     */
    private String carType;
    /**
     * 车牌号
     */
    private String carNo;
    /**
     * 车架号
     */
    private String carVin;
    /**
     * 设备号
     */
    private String imei;
    /**
     * 名称
     */
    private String name;

}
 

package com.yifenqi.tianyi.gps.dto;

import lombok.Data;

/**
 * 天易返回的设备位置信息
 * 
 * @author zhangshiwei
 * @time 2018年7月28日下午1:04:11
 */
@Data
public class GpsInfoDto {

    /**
     * 数据接收时间,如2016/01/01 11:11:11
     */
    private String rtime;
    /**
     * GPS时间,如2016/01/01 11:11:11
     */
    private String gtime;
    /**
     * 车牌号
     */
    private String carNo;
    /**
     * 车架号
     */
    private String carVin;
    /**
     * 车型
     */
    private String carType;
    /**
     * 纬度
     */
    private String lat;
    /**
     * 经度
     */
    private String lng;
    /**
     * 速度(千米/小时)
     */
    private String spd;
    /**
     * 方向0~360,0为正北向
     */
    private String dir;
    /**
     * 定位类型,0基站定位,1GPS定位,2未定位
     */
    private String locateType;
    /**
     * 设备状态,0未启用,1正常
     */
    private String status;
    /**
     * 设备号
     */
    private String imei;

}
 

package com.yifenqi.tianyi.gps.dto;

import lombok.Data;

/**
 * 查询工单信息时返回的此工单的设备信息
 * 
 * @author zhangshiwei
 * @time 2018年7月28日下午1:03:00
 */
@Data
public class TerminalDto {

    /**
     * 设备号
     */
    private String imei;
    /**
     * 设备类型
     */
    private String model;
    /**
     * 数据接收时间
     */
    private String receiveTime;
    /**
     * GPS时间
     */
    private String gpsTime;
    /**
     * 车牌号
     */
    private String carNo;
    /**
     * 车架号
     */
    private String carVin;
    /**
     * 车型
     */
    private String carBrand;
    /**
     * 纬度
     */
    private String lat;
    /**
     * 经度
     */
    private String lng;
    /**
     * 设备状态
     */
    private String status;
    /**
     * 运行状态
     */
    private String runStatus;

}
 

package com.yifenqi.tianyi.gps.dto;

import lombok.Data;

/**
 * 天易返回的车辆历史轨迹信息
 * 
 * @author zhangshiwei
 * @time 2018年7月28日下午12:42:02
 */
@Data
public class VehicleHistoryInfoDto {

    /**
     * GPS时间,如2016-01-01 11:11:11
     */
    private String gtime;
    /**
     * 经度
     */
    private String lng;
    /**
     * 纬度
     */
    private String lat;
    /**
     * 速度(千米/小时)
     */
    private String spd;
    /**
     * 方向0~360,0为正北向
     */
    private String dir;

}
 

package com.yifenqi.tianyi.gps;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.myoss.phoenix.core.lang.dto.Result;
import com.github.myoss.phoenix.core.lang.dto.TransformValue;
import com.yifenqi.common.RestUtils;
import com.yifenqi.tianyi.common.TyGpsUrlEnum;
import com.yifenqi.tianyi.common.TyResponseDto;
import com.yifenqi.tianyi.config.TyProperty;
import com.yifenqi.tianyi.dto.GpsInfoRequestDto;
import com.yifenqi.tianyi.dto.HistoryTrajectoryRequestDto;
import com.yifenqi.tianyi.gps.dto.CarInfoDto;
import com.yifenqi.tianyi.gps.dto.GpsInfoDto;
import com.yifenqi.tianyi.gps.dto.VehicleHistoryInfoDto;
import com.yifenqi.tianyi.utils.TyCheckUtils;

/**
 * 天易接口-GPS设备相关-工具类
 * 
 * @author zhangshiwei
 * @time 2018年8月6日下午5:49:27
 */
@SuppressWarnings("all")
public class TyGpsUtils {

    /**
     * 查询多个设备的实时位置信息
     * 
     * @param tyProperty 请求天易接口需要的关键参数
     * @param requestDto GPS设备号(多个设备号用逗号隔开,不能超过100个)
     * @return 每个GPS设备的实时位置信息
     */
    public static Result<List<GpsInfoDto>> queryGpsInfoList(TyProperty tyProperty, GpsInfoRequestDto requestDto) {
        Result<List<GpsInfoDto>> result = TyCheckUtils.checkTyProperty(tyProperty);
        String gpsInfoPath = String.format(TyGpsUrlEnum.QUERY_GPS_INFO_LIST.getHostFormat(),
                tyProperty.getTianyiGpsPath(), TyGpsUrlEnum.QUERY_GPS_INFO_LIST.getHost());

        String request = String.format(TyGpsUrlEnum.QUERY_GPS_INFO_LIST.getParamFormat(), tyProperty.getUserAccount(),
                tyProperty.getToken(), tyProperty.getSign(), requestDto.getImies());
        String response = RestUtils.postJson(new RestTemplate(), gpsInfoPath, request);
        TyResponseDto responseDto = JSONObject.parseObject(response, TyResponseDto.class);

        // 天易处理成功
        if (TyCheckUtils.checkTianyiResponseDto(responseDto.getResult())) {
            String data = responseDto.getData();
            List<GpsInfoDto> gpsInfoList = new ArrayList<>();
            if (StringUtils.isNotBlank(data)) {
                gpsInfoList = JSONArray.parseArray(data, GpsInfoDto.class);
            }
            result.setValue(gpsInfoList).setSuccess(true);
        } else {
            // 失败
            TransformValue.setErrorInfo(result, responseDto.getResult(), responseDto.getMessage());
        }
        return result;
    }

    /**
     * 查询车辆历史轨迹信息
     * 
     * @param tyProperty 请求天易接口需要的关键参数
     * @param requestDto GPS设备号(只能一个),开始时间,结束时间(前后不能超过一个月)
     * @return 此设备的历史位置信息
     */
    public static Result<List<VehicleHistoryInfoDto>> queryHistoryTrajectory(TyProperty tyProperty,
                                                                             HistoryTrajectoryRequestDto requestDto) {
        Result<List<VehicleHistoryInfoDto>> result = TyCheckUtils.checkTyProperty(tyProperty);

        String historyTrajectoryPath = String.format(TyGpsUrlEnum.QUERY_HISTORY_TRAJECTORY.getHostFormat(),
                tyProperty.getTianyiGpsPath(), TyGpsUrlEnum.QUERY_HISTORY_TRAJECTORY.getHost());
        String request = String.format(TyGpsUrlEnum.QUERY_HISTORY_TRAJECTORY.getParamFormat(),
                tyProperty.getUserAccount(), tyProperty.getToken(), tyProperty.getSign(), requestDto.getImie(),
                requestDto.getBeginTimeString(), requestDto.getEndTimeString());
        String response = RestUtils.postJson(new RestTemplate(), historyTrajectoryPath, request);
        TyResponseDto responseDto = JSONObject.parseObject(response, TyResponseDto.class);

        // 天易处理成功
        if (TyCheckUtils.checkTianyiResponseDto(responseDto.getResult())) {
            String data = responseDto.getData();
            List<VehicleHistoryInfoDto> historyInfoList = new ArrayList<>();
            if (StringUtils.isNotBlank(data)) {
                historyInfoList = JSONArray.parseArray(data, VehicleHistoryInfoDto.class);
            }
            result.setValue(historyInfoList).setSuccess(true);
        } else {
            // 失败
            TransformValue.setErrorInfo(result, responseDto.getResult(), responseDto.getMessage());
        }
        return result;
    }

    /**
     * 查询账户车辆信息
     * 
     * @param tyProperty 请求天易接口需要的关键参数
     * @return 成功则返回此账户的车辆信息list
     */
    public static Result<List<CarInfoDto>> queryCarInfoList(TyProperty tyProperty) {
        Result<List<CarInfoDto>> result = TyCheckUtils.checkTyProperty(tyProperty);
        String carListInfoPath = String.format(TyGpsUrlEnum.QUERY_CAR_INFO_LIST.getHostFormat(),
                tyProperty.getTianyiGpsPath(), TyGpsUrlEnum.QUERY_CAR_INFO_LIST.getHost());

        String request = String.format(TyGpsUrlEnum.QUERY_CAR_INFO_LIST.getParamFormat(), tyProperty.getUserAccount(),
                tyProperty.getToken(), tyProperty.getSign());
        String response = RestUtils.postJson(new RestTemplate(), carListInfoPath, request);
        TyResponseDto responseDto = JSONObject.parseObject(response, TyResponseDto.class);

        // 天易处理成功
        if (TyCheckUtils.checkTianyiResponseDto(responseDto.getResult())) {
            String data = responseDto.getData();
            List<CarInfoDto> carInfoList = new ArrayList<>();
            if (StringUtils.isNotBlank(data)) {
                carInfoList = JSONArray.parseArray(data, CarInfoDto.class);
            }
            result.setValue(carInfoList).setSuccess(true);
        } else {
            // 失败
            TransformValue.setErrorInfo(result, responseDto.getResult(), responseDto.getMessage());
        }
        return result;
    }
}
 

package com.yifenqi.tianyi.order.dto;

import lombok.Data;

/**
 * 天易安装GPS请求派单申请的汽车信息Dto
 * 
 * @author zhangshiwei
 * @time 2018年7月27日上午10:33:01
 */
@Data
public class CarOfGpsOrderDto {

    /**
     * 车主姓名
     */
    private String  ownerName;
    /**
     * 身份证号
     */
    private String  ownerCard;
    /**
     * 车型
     */
    private String  carBrand;
    /**
     * 车牌
     */
    private String  carNo;
    /**
     * 车架
     */
    private String  carVin;

    /**
     * 有线设备年期
     */
    private String  wiredPeriod;
    /**
     * 有线设备数量
     */
    private Integer wiredNum;

    /**
     * 无线设备年期
     */
    private String  wirelessPeriod;
    /**
     * 无线设备数量
     */
    private Integer wirelessNum;

}
 

package com.yifenqi.tianyi.order.dto;

import java.util.List;

import lombok.Data;

/**
 * 天易安装GPS请求派单申请Dto
 * 
 * @author zhangshiwei
 * @time 2018年7月27日上午10:30:01
 */
@Data
public class GpsOrderApplyRequestDto {

    /**
     * 申请编号
     */
    private String                 applyNo;
    /**
     * 现场联系人姓名
     */
    private String                 contactName;
    /**
     * 现场联系人手机号
     */
    private String                 contactPhone;
    /**
     * 派工联系人姓名
     */
    private String                 piccontactName;
    /**
     * 派工联系人电手机号
     */
    private String                 piccontactPhone;
    /**
     * 上门时间
     */
    private String                 installtime;
    /**
     * 拉车账号
     */
    private String                 carAccount;
    /**
     * 上门地址
     */
    private String                 addressCode;
    /**
     * 详细地址
     */
    private String                 addressDetail;
    /**
     * 备注
     */
    private String                 remark;
    /**
     * 车辆信息
     */
    private List<CarOfGpsOrderDto> car;

    

}
 

package com.yifenqi.tianyi.order.dto;

import com.yifenqi.tianyi.common.TyBaseResponseDto;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 天易安装GPS请求派单申请--天易返回的信息Dto
 * 
 * @author zhangshiwei
 * @time 2018年7月27日上午10:30:01
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class GpsOrderApplyResponseDto extends TyBaseResponseDto {

    /**
     * 调用成功时返回工单号
     */
    private String orderNo;

}
 

package com.yifenqi.tianyi.order;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.github.myoss.phoenix.core.lang.dto.Result;
import com.github.myoss.phoenix.core.lang.dto.TransformValue;
import com.yifenqi.common.RestUtils;
import com.yifenqi.tianyi.common.TyGpsUrlEnum;
import com.yifenqi.tianyi.common.TyResponseDto;
import com.yifenqi.tianyi.config.TyProperty;
import com.yifenqi.tianyi.dto.SelectOrderInfoRequestDto;
import com.yifenqi.tianyi.dto.TerminalDataDto;
import com.yifenqi.tianyi.order.dto.GpsOrderApplyRequestDto;
import com.yifenqi.tianyi.order.dto.GpsOrderApplyResponseDto;
import com.yifenqi.tianyi.utils.TyCheckUtils;

/**
 * 天易接口-GPS设备相关-工具类
 * 
 * @author zhangshiwei
 * @time 2018年8月6日下午5:49:48
 */
@SuppressWarnings("all")
public class TyOrderUtils {

    /**
     * 发起天易派单请求
     * 
     * @param tyProperty 请求天易接口需要的关键参数
     * @param requestDto 请求派工参数
     * @return 成功则返回工单号
     */
    public static Result<String> gpsOrderApply(TyProperty tyProperty, GpsOrderApplyRequestDto requestDto) {
        Result<String> result = TyCheckUtils.checkTyProperty(tyProperty);

        // 拉车账号
        requestDto.setCarAccount(tyProperty.getCarAccount());
        // 请求地址
        String applyPath = String.format(TyGpsUrlEnum.GPS_ORDER_APPLY.getHostFormat(), tyProperty.getTianyiOrderPath(),
                TyGpsUrlEnum.GPS_ORDER_APPLY.getHost());

        String request = JSON.toJSONString(requestDto);

        // 向天易发出请求
        String response = RestUtils.postJson(new RestTemplate(), applyPath, request);
        GpsOrderApplyResponseDto responseDto = JSONObject.parseObject(response, GpsOrderApplyResponseDto.class);

        return TyCheckUtils.checkTianyiResponseDto(responseDto.getResult()) ? result.setValue(responseDto.getOrderNo())
                : result.setErrorCode(responseDto.getResult()).setErrorMsg(responseDto.getMessage());
    }

    /**
     * 查询工单信息
     * 
     * @param tyProperty 请求天易接口需要的关键参数
     * @param requestDto 工单号
     * @return 成功则返回此工单含有的设备信息list
     */
    public static Result<TerminalDataDto> queryOrderInfo(TyProperty tyProperty, SelectOrderInfoRequestDto requestDto) {
        Result<TerminalDataDto> result = TyCheckUtils.checkTyProperty(tyProperty);

        String selectOrderInfoPath = String.format(TyGpsUrlEnum.QUERY_GPS_ORDER_INFO.getHostFormat(),
                tyProperty.getTianyiOrderPath(), TyGpsUrlEnum.QUERY_GPS_ORDER_INFO.getHost());

        Map<String, String> parameterMap = new HashMap<>();
        parameterMap.put("orderNo", requestDto.getOrderNo());

        // 向天易发出请求
        String response = RestUtils.getForString(new RestTemplate(), selectOrderInfoPath, parameterMap);
        TyResponseDto responseDto = JSONObject.parseObject(response, TyResponseDto.class);

        // 天易处理成功
        if (TyCheckUtils.checkTianyiResponseDto(responseDto.getResult())) {
            String data = responseDto.getData();
            TerminalDataDto terminalDataDto = new TerminalDataDto();
            if (StringUtils.isNotBlank(data)) {
                terminalDataDto = JSONObject.parseObject(data, TerminalDataDto.class);
            }
            result.setValue(terminalDataDto).setSuccess(true);
        } else {
            // 失败
            TransformValue.setErrorInfo(result, responseDto.getResult(), responseDto.getMessage());
        }
        return result;
    }
}
 

package com.yifenqi.tianyi.utils;

import com.github.myoss.phoenix.core.lang.dto.Result;
import com.github.myoss.phoenix.core.lang.dto.TransformValue;
import com.yifenqi.bank.constants.CodeMsgEnum;
import com.yifenqi.constant.CommonConstant;
import com.yifenqi.tianyi.config.TyProperty;

/**
 * 天易校验工具类
 * 
 * @author zhangshiwei
 * @time 2018年8月7日上午10:23:27
 */
public class TyCheckUtils {

    /**
     * @param result 天易返回信息
     * @return 为0则调用成功
     */
    public static Boolean checkTianyiResponseDto(String result) {
        return result.equals(CommonConstant.TIANYI_SUCCESS_CODE) ? true : false;
    }

    @SuppressWarnings("all")
    public static Result checkTyProperty(TyProperty tyProperty) {
        Result result = new Result();
        if (null == tyProperty) {
            return TransformValue.setErrorInfo(result, CodeMsgEnum.VALUE_IS_BLANK.getCode(), "tyProperty为null!");
        }
        return result;
    }

}
 

最后,调用其他接口的一个通用工具类,可以是get或post方式:

package com.yifenqi.common;

import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.client.RestClientResponseException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

import com.yifenqi.constant.CommonConstant;
import com.yifenqi.exception.BizRuntimeException;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * Rest API工具类
 *
 * @author jerry.chen 2017年7月31日 下午8:24:50
 */
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class RestUtils {
    /**
     * 自定义发送HTTP请求
     *
     * @param restTemplate RestTemplate
     * @param contentType Internet Media Type,互联网媒体类型
     * @param uri 请求的uri,uri中可以包含占位符{0}, {1}, {n}
     * @param method 请求方法类型
     * @param requestBody 请求的内容
     * @param responseType 返回的数据类型
     * @param <T> 数据类型class的泛形
     * @return 请求结果
     */
    public static <T> T exchange(RestTemplate restTemplate, MediaType contentType, URI uri, HttpMethod method,
                                 Object requestBody, Class<T> responseType) {
        HttpHeaders httpHeaders = new HttpHeaders();
        if (contentType != null) {
            httpHeaders.setContentType(contentType);
        }
        HttpEntity<?> httpEntity = new HttpEntity<>(requestBody, httpHeaders);
        long startTimeMillis = System.currentTimeMillis();
        log.info("requestUrl: {}, requestMethod: {}, requestBody: {}", uri, method, requestBody);
        try {
            SslUtils.ignoreSsl();
        } catch (Exception se) {
            log.error("SslUtils.ignoreSsl exception :{}", se);
        }
        try {
            ResponseEntity<T> responseEntity = restTemplate.exchange(uri, method, httpEntity, responseType);
            T responseBody = responseEntity.getBody();
            long endTimeMillis = System.currentTimeMillis();
            long totalTimeMillis = endTimeMillis - startTimeMillis;
            log.info("costTime: {}, responseBody: {}", totalTimeMillis, responseBody);
            return responseBody;
        } catch (Exception e) {
            long endTimeMillis = System.currentTimeMillis();
            long costTime = endTimeMillis - startTimeMillis;
            if (e instanceof RestClientResponseException) {
                RestClientResponseException exception = (RestClientResponseException) e;
                String exceptionBody = exception.getResponseBodyAsString(); // 打印出发送http请求的错误信息,帮助追踪错误源
                if (log.isInfoEnabled()) {
                    log.warn("requestUrl: {}, requestMethod: {}, costTime: {}, exceptionBody: {}", uri, method,
                            costTime, exceptionBody);
                } else {
                    log.warn("requestUrl: {}, requestMethod: {}, costTime: {}, requestBody: {}, exceptionBody: {}", uri,
                            method, costTime, requestBody, exceptionBody);
                }
            } else {
                if (log.isInfoEnabled()) {
                    log.warn("requestUrl: {}, requestMethod: {}, costTime: {}", uri, method, costTime);
                } else {
                    log.warn("requestUrl: {}, requestMethod: {}, costTime: {}, requestBody: {}", uri, method, costTime,
                            requestBody);
                }
            }
            throw e;
        }
    }

    /**
     * 自定义发送HTTP请求
     *
     * @param restTemplate RestTemplate
     * @param contentType Internet Media Type,互联网媒体类型
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param method 请求方法类型
     * @param requestBody 请求的内容
     * @param responseType 返回的数据类型
     * @param <T> 数据类型class的泛形
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static <T> T exchange(RestTemplate restTemplate, MediaType contentType, String url, HttpMethod method,
                                 Object requestBody, Class<T> responseType, Object... uriVariables) {
        URI expanded = restTemplate.getUriTemplateHandler().expand(url, uriVariables);
        return exchange(restTemplate, contentType, expanded, method, requestBody, responseType);
    }

    /**
     * 以POST方法发送HTTP请求,请求的内容为JSON
     *
     * @param restTemplate RestTemplate
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param requestBody 请求的内容
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static String postJson(RestTemplate restTemplate, String url, String requestBody, Object... uriVariables) {
        return exchange(restTemplate, MediaType.APPLICATION_JSON_UTF8, url, HttpMethod.POST, requestBody, String.class,
                uriVariables);
    }

    /**
     * 以POST方法发送HTTP请求,请求的内容为form数据格式
     *
     * @param restTemplate RestTemplate
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param requestBody 请求的内容
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static String postForm(RestTemplate restTemplate, String url,
                                  LinkedMultiValueMap<String, String> requestBody, Object... uriVariables) {
        return exchange(restTemplate, MediaType.APPLICATION_FORM_URLENCODED, url, HttpMethod.POST, requestBody,
                String.class, uriVariables);
    }

    /**
     * 以GET方法发送HTTP请求,并在请求的url中添加动态参数 {@code parameterMap}
     *
     * @param restTemplate RestTemplate
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param parameterMap 请求的参数,将会添加到url中
     * @param responseType 返回的数据类型
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static <T> T getForObject(RestTemplate restTemplate, String url, Map<String, String> parameterMap,
                                     Class<T> responseType, Object... uriVariables) {
        URI uri = uriBuild2(url, parameterMap, uriVariables).toUri();
        return exchange(restTemplate, null, uri, HttpMethod.GET, null, responseType);
    }

    /**
     * 以GET方法发送HTTP请求,并在请求的url中添加动态参数 {@code parameterMap},返回的数据是字符串类型
     *
     * @param restTemplate RestTemplate
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param parameterMap 请求的参数,将会添加到url中
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static String getForString(RestTemplate restTemplate, String url, Map<String, String> parameterMap,
                                      Object... uriVariables) {
        return getForObject(restTemplate, url, parameterMap, String.class, uriVariables);
    }

    /**
     * 以GET方法发送HTTP请求,返回的数据是字符串类型
     *
     * @param restTemplate RestTemplate
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static String getForString(RestTemplate restTemplate, String url, Object... uriVariables) {
        return exchange(restTemplate, null, url, HttpMethod.GET, null, String.class, uriVariables);
    }

    /**
     * 以GET方法发送HTTP请求,并在请求的url中添加动态参数 {@code parameterMap}
     *
     * @param restTemplate RestTemplate
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param parameterMap 请求的参数,将会添加到url中
     * @param responseType 返回的数据类型
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static <T> T getForObject(RestTemplate restTemplate, String url,
                                     LinkedMultiValueMap<String, String> parameterMap, Class<T> responseType,
                                     Object... uriVariables) {
        URI uri = uriBuild(url, parameterMap, uriVariables).toUri();
        return exchange(restTemplate, null, uri, HttpMethod.GET, null, responseType);
    }

    /**
     * 以GET方法发送HTTP请求,并在请求的url中添加动态参数 {@code parameterMap},返回的数据是字符串类型
     *
     * @param restTemplate RestTemplate
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param parameterMap 请求的参数,将会添加到url中
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static String getForString(RestTemplate restTemplate, String url,
                                      LinkedMultiValueMap<String, String> parameterMap, Object... uriVariables) {
        return getForObject(restTemplate, url, parameterMap, String.class, uriVariables);
    }

    /**
     * 将集合对象转换成 application/x-www-form-urlencoded 表单数据格式
     * 
     * @param form FORM表单数据
     * @return FORM表单数据被编码成: key1=value1&key1=value2&key2=value3
     */
    public static StringBuilder writeForm(Map<String, List<String>> form) {
        StringBuilder builder = new StringBuilder();
        String encode = CommonConstant.DEFAULT_CHARSET.name();
        for (Iterator<String> nameIterator = form.keySet().iterator(); nameIterator.hasNext();) {
            String name = nameIterator.next();
            for (Iterator<String> valueIterator = form.get(name).iterator(); valueIterator.hasNext();) {
                String value = valueIterator.next();
                try {
                    builder.append(URLEncoder.encode(name, encode));
                    if (value != null) {
                        builder.append('=');
                        builder.append(URLEncoder.encode(value, encode));
                        if (valueIterator.hasNext()) {
                            builder.append('&');
                        }
                    }
                } catch (UnsupportedEncodingException e) {
                    throw new BizRuntimeException(e);
                }
            }
            if (nameIterator.hasNext()) {
                builder.append('&');
            }
        }
        return builder;
    }

    /**
     * 将集合对象转换成 application/x-www-form-urlencoded 表单数据格式
     * 
     * @param form FORM表单数据
     * @return FORM表单数据被编码成: key1=value1&key1=value2&key2=value3
     */
    public static StringBuilder writeForm2(Map<String, String> form) {
        StringBuilder builder = new StringBuilder();
        String encode = CommonConstant.DEFAULT_CHARSET.name();
        for (Iterator<Entry<String, String>> entryIterator = form.entrySet().iterator(); entryIterator.hasNext();) {
            Entry<String, String> next = entryIterator.next();
            String name = next.getKey();
            String value = next.getValue();
            if (value != null) {
                try {
                    builder.append(URLEncoder.encode(name, encode));
                    builder.append('=');
                    builder.append(URLEncoder.encode(value, encode));
                } catch (UnsupportedEncodingException e) {
                    throw new BizRuntimeException(e);
                }
            }
            if (entryIterator.hasNext()) {
                builder.append('&');
            }
        }
        return builder;
    }

    /**
     * 构造和编码URI
     *
     * @param url 原始url
     * @param parameterMap 请求的参数,将会添加到url中
     * @param uriVariables uri中占位符的参数值
     * @return 替换后的URI
     */
    public static UriComponents uriBuild(String url, Map<String, List<String>> parameterMap, Object... uriVariables) {
        UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(url);
        if (MapUtils.isNotEmpty(parameterMap)) {
            for (Entry<String, List<String>> entry : parameterMap.entrySet()) {
                String key = entry.getKey();
                List<String> values = entry.getValue();
                for (String value : values) {
                    uriComponentsBuilder.queryParam(key, value);
                }
            }
        }
        return ArrayUtils.isNotEmpty(uriVariables) ? uriComponentsBuilder.buildAndExpand(uriVariables)
                : uriComponentsBuilder.build();
    }

    /**
     * 构造和编码URI
     *
     * @param url 原始url
     * @param parameterMap 请求的参数,将会添加到url中
     * @param uriVariables uri中占位符的参数值
     * @return 替换后的URI
     */
    public static UriComponents uriBuild2(String url, Map<String, String> parameterMap, Object... uriVariables) {
        UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(url);
        if (MapUtils.isNotEmpty(parameterMap)) {
            for (Entry<String, String> entry : parameterMap.entrySet()) {
                uriComponentsBuilder.queryParam(entry.getKey(), entry.getValue());
            }
        }
        return ArrayUtils.isNotEmpty(uriVariables) ? uriComponentsBuilder.buildAndExpand(uriVariables)
                : uriComponentsBuilder.build();
    }

    /**
     * 以POST方法发送HTTP请求,请求的内容为JSON --- 包含包头信息
     *
     * @param restTemplate RestTemplate
     * @param httpHeaders 包头信息
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param requestBody 请求的内容
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static String postJsonWithHeaders(RestTemplate restTemplate, HttpHeaders httpHeaders, String url,
                                             String requestBody, Object... uriVariables) {
        return exchangeWithHeaders(restTemplate, httpHeaders, MediaType.APPLICATION_JSON_UTF8, url, HttpMethod.POST,
                requestBody, String.class, uriVariables);
    }

    /**
     * 自定义发送HTTP请求 --- 包含包头信息
     *
     * @param restTemplate RestTemplate
     * @param httpHeaders 包头信息
     * @param contentType Internet Media Type,互联网媒体类型
     * @param url 请求的url,url中可以包含占位符{0}, {1}, {n}
     * @param method 请求方法类型
     * @param requestBody 请求的内容
     * @param responseType 返回的数据类型
     * @param <T> 数据类型class的泛形
     * @param uriVariables url中占位符的参数值
     * @return 请求结果
     */
    public static <T> T exchangeWithHeaders(RestTemplate restTemplate, HttpHeaders httpHeaders, MediaType contentType,
                                            String url, HttpMethod method, Object requestBody, Class<T> responseType,
                                            Object... uriVariables) {
        URI expanded = restTemplate.getUriTemplateHandler().expand(url, uriVariables);
        return exchangeWithHeaders(restTemplate, httpHeaders, contentType, expanded, method, requestBody, responseType);
    }

    /**
     * 自定义发送HTTP请求--加上包头信息httpHeaders
     *
     * @param restTemplate RestTemplate
     * @param httpHeaders 包头信息
     * @param contentType Internet Media Type,互联网媒体类型
     * @param uri 请求的uri,uri中可以包含占位符{0}, {1}, {n}
     * @param method 请求方法类型
     * @param requestBody 请求的内容
     * @param responseType 返回的数据类型
     * @param <T> 数据类型class的泛形
     * @return 请求结果
     */
    public static <T> T exchangeWithHeaders(RestTemplate restTemplate, HttpHeaders httpHeaders, MediaType contentType,
                                            URI uri, HttpMethod method, Object requestBody, Class<T> responseType) {
        if (contentType != null) {
            httpHeaders.setContentType(contentType);
        }
        HttpEntity<?> httpEntity = new HttpEntity<>(requestBody, httpHeaders);
        long startTimeMillis = System.currentTimeMillis();
        log.info("requestUrl: {}, requestMethod: {}, requestBody: {}", uri, method, requestBody);
        try {
            SslUtils.ignoreSsl();
        } catch (Exception se) {
            log.error("SslUtils.ignoreSsl exception :{}", se);
        }
        try {
            ResponseEntity<T> responseEntity = restTemplate.exchange(uri, method, httpEntity, responseType);
            T responseBody = responseEntity.getBody();
            long endTimeMillis = System.currentTimeMillis();
            long totalTimeMillis = endTimeMillis - startTimeMillis;
            log.info("costTime: {}, responseBody: {}", totalTimeMillis, responseBody);
            return responseBody;
        } catch (Exception e) {
            long endTimeMillis = System.currentTimeMillis();
            long costTime = endTimeMillis - startTimeMillis;
            if (e instanceof RestClientResponseException) {
                RestClientResponseException exception = (RestClientResponseException) e;
                String exceptionBody = exception.getResponseBodyAsString(); // 打印出发送http请求的错误信息,帮助追踪错误源
                if (log.isInfoEnabled()) {
                    log.warn("requestUrl: {}, requestMethod: {}, costTime: {}, exceptionBody: {}", uri, method,
                            costTime, exceptionBody);
                } else {
                    log.warn("requestUrl: {}, requestMethod: {}, costTime: {}, requestBody: {}, exceptionBody: {}", uri,
                            method, costTime, requestBody, exceptionBody);
                }
            } else {
                if (log.isInfoEnabled()) {
                    log.warn("requestUrl: {}, requestMethod: {}, costTime: {}", uri, method, costTime);
                } else {
                    log.warn("requestUrl: {}, requestMethod: {}, costTime: {}, requestBody: {}", uri, method, costTime,
                            requestBody);
                }
            }
            throw e;
        }
    }
}
 

CREATE TABLE `t_vehicle_gps` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `gps_install_type` char(2) DEFAULT NULL COMMENT 'GPS安装方式:1-车务安装;2-天易派单',
  `gps_apply_code` varchar(32) DEFAULT NULL COMMENT 'gps派单申请编号 或 车务安装编号',
  `vehicle_code` varchar(32) DEFAULT NULL COMMENT '汽车编号',
  `imei` varchar(32) DEFAULT NULL COMMENT 'gps设备编号',
  `model` varchar(32) DEFAULT NULL COMMENT '设备类型:1-有线,2-无线',
  `period` varchar(32) DEFAULT NULL COMMENT '设备年限',
  `receive_time` varchar(32) DEFAULT NULL COMMENT '数据接收时间',
  `gps_time` varchar(32) DEFAULT NULL COMMENT 'GPS时间',
  `lat` varchar(32) DEFAULT NULL COMMENT '纬度',
  `lng` varchar(32) DEFAULT NULL COMMENT '经度',
  `status` char(1) DEFAULT NULL COMMENT '设备状态: 1正常,2不正常',
  `run_status` char(1) DEFAULT NULL COMMENT '运行状态: 1未启用,2静止,3行驶,4离线,5休眠',
  `is_deleted` char(1) NOT NULL DEFAULT 'N' COMMENT '是否删除',
  `creator` varchar(32) NOT NULL COMMENT '创建者',
  `modifier` varchar(32) NOT NULL COMMENT '修改者',
  `gmt_created` datetime NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8 COMMENT='车辆GPS信息表';

CREATE TABLE `t_vehicle_gps_apply` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `gps_install_type` char(2) DEFAULT NULL COMMENT 'GPS安装方式:1-车务安装;2-天易派单',
  `gps_apply_code` varchar(32) DEFAULT NULL COMMENT '派单申请编号 或 车务安装编号',
  `contact_name` varchar(32) DEFAULT NULL COMMENT '现场联系人姓名(不超过50字)',
  `contact_phone` varchar(11) DEFAULT NULL COMMENT '现场联系人手机号(11位)',
  `piccontact_name` varchar(32) DEFAULT NULL COMMENT '派工联系人姓名(不超过50字)',
  `piccontact_phone` varchar(11) DEFAULT NULL COMMENT '派工联系人电手机号(11位)',
  `install_time` datetime DEFAULT NULL COMMENT '上门时间',
  `car_account` varchar(32) DEFAULT NULL COMMENT '拉车账号',
  `province_code` varchar(32) DEFAULT NULL COMMENT '省份code',
  `city_code` varchar(32) DEFAULT NULL COMMENT '城市code',
  `district_code` varchar(32) DEFAULT NULL COMMENT '县区code',
  `address_code` varchar(6) DEFAULT NULL COMMENT '上门地址(取district行政代码code)',
  `address_detail` varchar(128) DEFAULT NULL COMMENT '详细地址',
  `remark` varchar(256) DEFAULT NULL COMMENT '备注',
  `wired_num` int(10) DEFAULT NULL COMMENT '有线设备数量(设备数量不超过10个)',
  `wired_period` varchar(32) DEFAULT NULL COMMENT '有线设备年限',
  `wireless_num` int(10) DEFAULT NULL COMMENT '无限设备数量(设备数量不超过10个)',
  `wireless_period` varchar(32) DEFAULT NULL COMMENT '无线设备年限',
  `tianyi_result` varchar(10) DEFAULT NULL COMMENT '天易调用返回值,0调用成功,1参数错误,2用户鉴权失败,9其他错误',
  `tianyi_message` varchar(32) DEFAULT NULL COMMENT '天易调用失败提示信息,成功时没有',
  `tianyi_order_no` varchar(32) DEFAULT NULL COMMENT '天易调用成功返回工单号',
  `status` char(1) DEFAULT NULL COMMENT '订单状态: 1已派单,2已接单,3已完成,4退回客户',
  `is_deleted` char(1) NOT NULL DEFAULT 'N' COMMENT '是否删除',
  `creator` varchar(32) NOT NULL COMMENT '创建者',
  `modifier` varchar(32) NOT NULL COMMENT '修改者',
  `gmt_created` datetime NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=86 DEFAULT CHARSET=utf8 COMMENT='车辆GPS派单申请表';

除了天易安装的GPS保存一个派单信息,自己安装的GPS也可以生成一个工单信息,只是派单编号的生成规则不要相同以示区别,这样,在GPS查询时,就可以得到一个结果:一辆车,有多个安装派单,每个派单有多个GPS设备;

遇到的问题:

    测试时,在remark备注栏,随便输入了一个参数"asdfdf胜'多负少",天易报错:系统错误,一开始没有找到错误在哪里,后来排查才发现,参数中有个单引号',这个字段在入库时,sql就会报错了!

目前存在问题:

    使用天易派工安装GPS时,填写了一定必要信息后,天易接单,返回一个工单号,知道他们安装完成,在那边将工单修改为已完成状态,录入了GPS设备号,我才能根据工单号查询工单信息,但是,目前的表结构无法将工单与车辆直接关联,目前的业务需求是一辆车发起一个派单,在查询时,只能将所有已接单状态的天易派单的工单都跑一遍,根据工单号去查询,天易会返回工单的状态还有其含有的设备信息list,再将这些GPS设备信息,根据VIN码与车辆关联入库;可以在工单表加一个字段,存车辆编号,这样,在GPS查询时,就可以直接查询这辆车的天易安装的已接单的工单,再查询工单信息,不用跑那么多数据,如果是多辆车,那就把多辆车的编号用逗号隔开存入,查询时就用当前车辆编号in那个字段,可以得到当前车辆对应的已接单的天易派单工单号.

猜你喜欢

转载自blog.csdn.net/weixin_41564440/article/details/82143838
GPS