Sfoglia il codice sorgente

模块创建,1.1-1.3接口完成提交

jyj 1 mese fa
parent
commit
ef6af18bee

+ 44 - 0
common-ecall-sdk/pom.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.fs</groupId>
+        <artifactId>fs</artifactId>
+        <version>1.1.0</version>
+    </parent>
+
+    <artifactId>common-ecall-sdk</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-web</artifactId>
+            </dependency>
+
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <optional>true</optional>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-configuration-processor</artifactId>
+                <optional>true</optional>
+            </dependency>
+
+            <dependency>
+                <groupId>commons-codec</groupId>
+                <artifactId>commons-codec</artifactId>
+            </dependency>
+        </dependencies>
+
+</project>

+ 34 - 0
common-ecall-sdk/src/main/java/com/fs/ecall/config/EcallProperties.java

@@ -0,0 +1,34 @@
+package com.fs.ecall.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "ecall")
+public class EcallProperties {
+    private String active;
+    private EnvConfig test;
+    private EnvConfig prod;
+
+    @Data
+    public static class EnvConfig {
+        private String appKey;
+        private String appSecret;
+        private UrlConfig url;
+    }
+
+    @Data
+    public static class UrlConfig {
+        private String membership;
+        private String terminate;
+        private String modifyPhone;
+    }
+
+
+
+    public EnvConfig getEnv() {
+        return "prod".equalsIgnoreCase(active) ? prod : test;
+    }
+}

+ 22 - 0
common-ecall-sdk/src/main/java/com/fs/ecall/domain/ECallResponse.java

@@ -0,0 +1,22 @@
+package com.fs.ecall.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 通用响应返回结果 [cite: 82, 119]
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ECallResponse {
+    /** 处理码:01-成功, 02-参数校验失败, 03-失败 [cite: 72, 73, 74, 76, 119] */
+    private String code;
+
+    /** 处理结果描述 [cite: 78, 119] */
+    private String message;
+
+}

+ 110 - 0
common-ecall-sdk/src/main/java/com/fs/ecall/domain/ECallWorkOrderRequest.java

@@ -0,0 +1,110 @@
+package com.fs.ecall.domain;
+
+import lombok.Data;
+
+/**
+ * 救援工单请求参数 [cite: 118]
+ */
+@Data
+public class ECallWorkOrderRequest {
+
+    /**
+     * 设备ID [cite: 117]
+     */
+    private String extenalId;
+
+    /**
+     * 渠道号 [cite: 117]
+     */
+    private String channelId;
+
+    /**
+     * 客户方系统唯一工单流水号 (必录) [cite: 118]
+     */
+    private String woNoOutside;
+
+    /**
+     * 事故—触发时间:yyyy-mm-dd HH:MM:SS (必录) [cite: 118]
+     */
+    private String accidentTriggerTime;
+
+    /**
+     * 事故—GPS类型:01-WGS84, 02-GCJ02, 03-BD [cite: 118]
+     */
+    private String accidentGpstype;
+
+    /**
+     * 事故—GPS:格式“经度,纬度” [cite: 118]
+     */
+    private String accidentGps;
+
+    /**
+     * 事故—触发方式:04-自动, 05-手动 (必录) [cite: 118]
+     */
+    private String accidentTriggerType;
+
+    /**
+     * 会员姓名 (必录) [cite: 118]
+     */
+    private String name;
+
+    /**
+     * 会员手机 (必录) [cite: 118]
+     */
+    private String phone;
+
+    /**
+     * 设备电话/报警电话 (必录) [cite: 118]
+     */
+    private String alertPhone;
+
+    /**
+     * 车牌号 (必录) [cite: 118]
+     */
+    private String vehicleNumber;
+
+    /**
+     * 车架号/VIN [cite: 118]
+     */
+    private String vin;
+
+    /**
+     * 紧急联系人姓名 (必录) [cite: 118]
+     */
+    private String emergencyContactPerson;
+
+    /**
+     * 紧急联系电话 (必录) [cite: 118]
+     */
+    private String emergencyContact;
+
+    /**
+     * 车辆颜色 [cite: 118]
+     */
+    private String vehicalColor;
+
+    /**
+     * 车辆类型 (必录) [cite: 118]
+     */
+    private String vihecleType;
+
+    /**
+     * 车辆动力类型 (必录) [cite: 118]
+     */
+    private String powerType;
+
+    /**
+     * 证件类型 [cite: 118]
+     */
+    private String certificateType;
+
+    /**
+     * 证件号码 [cite: 118]
+     */
+    private String certificateNumber;
+
+    /**
+     * 备注 [cite: 119]
+     */
+    private String note;
+}

+ 83 - 0
common-ecall-sdk/src/main/java/com/fs/ecall/domain/MemberMembershipRequest.java

@@ -0,0 +1,83 @@
+package com.fs.ecall.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 会员备案激活/更新请求参数 [cite: 47]
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MemberMembershipRequest {
+
+    /** 设备ID:设备上的设备编号 (必录) [cite: 47] */
+    private String extenalId;
+
+    /** 套餐编号:参见文档第4章节 (必录) [cite: 47] */
+    private String serviceComber;
+
+    /** 服务生效日期:格式例 2099-12-31 00:00:00 (必录) [cite: 47] */
+    private String serviceStartdate;
+
+    /** 服务截止日期:格式例 2099-12-31 00:00:00 (必录) [cite: 47] */
+    private String serviceStopdate;
+
+    /** 渠道号:参见文档第5章节 (必录) [cite: 47] */
+    private String channelId;
+
+    /** 车主姓名 (必录) [cite: 47] */
+    private String name;
+
+    /** 车主手机 (必录) [cite: 47] */
+    private String phone;
+
+    /** 车机电话:需与车主手机一致,修改需调专项接口 (必录) [cite: 47] */
+    private String vehicalPhone;
+
+    /** 车架号/VIN [cite: 47] */
+    private String vin;
+
+    /** 车辆品牌 [cite: 47] */
+    private String vehicleBrand;
+
+    /** 车系代码 [cite: 47] */
+    private String vehicalSeriesCode;
+
+    /** 车系名称 [cite: 47] */
+    private String vehicalSeries;
+
+    /** 紧急联系人信息 (必录) [cite: 47] */
+    private List<EmergencyContact> memberEmerge;
+
+    /** 车辆类型:01大型客车, 02中型, 03小型微型... 参见3.1章节 (必录) [cite: 47, 121] */
+    private String vehicalType;
+
+    /** 车辆颜色 [cite: 48] */
+    private String vehicalColor;
+
+    /** 车辆动力类型:01燃油, 02电动, 03混动 (必录) [cite: 48, 122] */
+    private String powerType;
+
+    /** 备注 [cite: 48] */
+    private String remark;
+
+    /** 证件类型 [cite: 48] */
+    private String certificateType;
+
+    /** 证件号码 [cite: 48] */
+    private String certificateNumber;
+
+    @Data
+    public static class EmergencyContact {
+        /** 紧急联系人姓名 [cite: 54, 55] */
+        private String name;
+        /** 紧急联系人手机号 [cite: 56, 57] */
+        private String phone;
+    }
+}

+ 30 - 0
common-ecall-sdk/src/main/java/com/fs/ecall/domain/MemberTerminateRequest.java

@@ -0,0 +1,30 @@
+package com.fs.ecall.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 修正后的终止服务实体类 (DTO)
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MemberTerminateRequest implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 设备ID (必填)
+     */
+    private String extenalId;
+
+    /**
+     * 渠道号 (必填)
+     */
+    private String channelId;
+}

+ 37 - 0
common-ecall-sdk/src/main/java/com/fs/ecall/domain/ModifyTboxPhoneRequest.java

@@ -0,0 +1,37 @@
+package com.fs.ecall.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ModifyTboxPhoneRequest implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 设备ID (必填)
+     * 注意:文档拼写为 extenalId
+     */
+    private String extenalId;
+
+    /**
+     * 渠道号 (必填)
+     */
+    private String channelId;
+
+    /**
+     * 旧设备电话
+     */
+    private String oldVehicalPhone;
+    /**
+     * 原设备电话
+     */
+    private String newVehicalPhone;
+}

+ 37 - 0
common-ecall-sdk/src/main/java/com/fs/ecall/service/IECallService.java

@@ -0,0 +1,37 @@
+package com.fs.ecall.service;
+
+import com.fs.ecall.domain.ECallResponse;
+import com.fs.ecall.domain.MemberMembershipRequest;
+import com.fs.ecall.domain.MemberTerminateRequest;
+import com.fs.ecall.domain.ModifyTboxPhoneRequest;
+
+/**
+ * 车联网 E-Call 会员管理服务接口 [cite: 3, 32]
+ */
+public interface IECallService {
+
+    /**
+     * 会员备案激活/更新
+     * 备注:首次绑定或修改绑定信息时调用
+     * * @param request 备案请求参数
+     * @return 远盟处理结果
+     */
+    ECallResponse saveOrUpdateMember(MemberMembershipRequest request);
+
+    /**
+     * 会员终止服务
+     * @param request
+     * @return
+     */
+    ECallResponse saveOrUpdateMember(MemberTerminateRequest request);
+
+
+    /**
+     * 1.3 修改设备电话接口
+     * @param request
+     * @return
+     */
+    ECallResponse modifyTboxPhone(ModifyTboxPhoneRequest request);
+
+
+}

+ 130 - 0
common-ecall-sdk/src/main/java/com/fs/ecall/service/impl/ECallServiceImpl.java

@@ -0,0 +1,130 @@
+package com.fs.ecall.service.impl;
+
+import com.fs.ecall.config.EcallProperties;
+import com.fs.ecall.domain.ECallResponse;
+import com.fs.ecall.domain.MemberMembershipRequest;
+import com.fs.ecall.domain.MemberTerminateRequest;
+import com.fs.ecall.domain.ModifyTboxPhoneRequest;
+import com.fs.ecall.service.IECallService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.client.RestTemplate;
+
+@Slf4j
+@Service
+@ConfigurationProperties(prefix = "ecall")
+public class ECallServiceImpl implements IECallService {
+    private final RestTemplate restTemplate;
+    private final EcallProperties ecallProperties;
+
+
+    /**
+     * 会员备案更新接口
+     * @param restTemplate
+     * @param ecallProperties
+     */
+    public ECallServiceImpl(RestTemplate restTemplate, EcallProperties ecallProperties) {
+        this.restTemplate = restTemplate;
+        this.ecallProperties = ecallProperties;
+    }
+
+    @Override
+    public ECallResponse saveOrUpdateMember(MemberMembershipRequest request) {
+        EcallProperties.EnvConfig env = ecallProperties.getEnv();
+
+        // 1. 生成 Authorization: MD5(appkey + appsecret) -> UpperCase
+        String rawKey = env.getAppKey() + env.getAppSecret();
+        String authCode = DigestUtils.md5DigestAsHex(rawKey.getBytes()).toUpperCase();
+
+        // 2. 设置 HTTP Header
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.set("Authorization", authCode);
+
+
+
+        // 4. 构建 Entity 并发送 POST 请求
+        HttpEntity<MemberMembershipRequest> entity = new HttpEntity<>(request, headers);
+        String url = env.getUrl().getMembership();
+
+        try {
+            log.info("调用 E-Call 会员备案接口, URL: {}, ExtenalId: {}", url, request.getExtenalId());
+            return restTemplate.postForObject(url, entity, ECallResponse.class);
+        } catch (Exception e) {
+            log.error("E-Call 接口调用失败", e);
+            return  new ECallResponse("03", "系统异常: " + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 会员终止服务
+     * @param request
+     * @return
+     */
+
+    @Override
+    public ECallResponse saveOrUpdateMember(MemberTerminateRequest request) {
+        EcallProperties.EnvConfig env = ecallProperties.getEnv();
+
+        // 1. 生成 Authorization: MD5(appkey + appsecret) -> UpperCase
+        String rawKey = env.getAppKey() + env.getAppSecret();
+        String authCode = DigestUtils.md5DigestAsHex(rawKey.getBytes()).toUpperCase();
+
+        // 2. 设置 HTTP Header
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.set("Authorization", authCode);
+
+
+        // 4. 构建 Entity 并发送 POST 请求
+        HttpEntity<MemberTerminateRequest> entity = new HttpEntity<>(request, headers);
+        String url = env.getUrl().getTerminate();
+
+        try {
+            log.info("调用 E-Call 会员备案接口, URL: {}, ExtenalId: {}", url, request.getExtenalId());
+            return restTemplate.postForObject(url, entity, ECallResponse.class);
+        } catch (Exception e) {
+            log.error("E-Call 接口调用失败", e);
+            return  new ECallResponse("03", "系统异常: " + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 修改设备电话接口
+     * @param request
+     * @return
+     */
+    @Override
+    public ECallResponse modifyTboxPhone(ModifyTboxPhoneRequest request) {
+        EcallProperties.EnvConfig env = ecallProperties.getEnv();
+
+        // 1. 生成 Authorization: MD5(appkey + appsecret) -> UpperCase
+        String rawKey = env.getAppKey() + env.getAppSecret();
+        String authCode = DigestUtils.md5DigestAsHex(rawKey.getBytes()).toUpperCase();
+
+        // 2. 设置 HTTP Header
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.set("Authorization", authCode);
+
+
+        // 4. 构建 Entity 并发送 POST 请求
+        HttpEntity<ModifyTboxPhoneRequest> entity = new HttpEntity<>(request, headers);
+        String url = env.getUrl().getTerminate();
+
+        try {
+            log.info("调用 E-Call 会员备案接口, URL: {}, ExtenalId: {}", url, request.getExtenalId());
+            return restTemplate.postForObject(url, entity, ECallResponse.class);
+        } catch (Exception e) {
+            log.error("E-Call 接口调用失败", e);
+            return new ECallResponse("03", "系统异常: " + e.getMessage());
+        }
+    }
+}

+ 26 - 0
common-ecall-sdk/src/main/resources/application.yml

@@ -0,0 +1,26 @@
+ecall:
+  active: test
+  test:
+    app-key: "2ea1dc432bd244b2a8a917e695964370"
+    app-secret: "82c0bfa144d24965857e021427ebdd5a"
+    url:
+      membership: "https://release-votplateform.healthlinkiot.com/api/m/member/membershipnew"
+      terminate: "https://release-votplateform.healthlinkiot.com/api/m/member/membershipquit"
+      modify-phone: "https://release-votplateform.healthlinkiot.com/api/m/member/jike/membershiptbox"
+      extension: "http://release-votplateform.healthlinkiot.com:9000/api/m/member/membershipextension"
+      work-order: "http://release-votplateform.healthlinkiot.com:9000/api/w/workorder/ecall"
+    config:
+      package-no: "CB1000080"
+      channel-id: "BJS2631006Q026-PRE"
+  prod:
+    app-key: "PROD_KEY_HERE"
+    app-secret: "PROD_SECRET_HERE"
+    url:
+      membership: "https://votplatform.healthlinkiot.com/api/m/member/membershipnew"
+      terminate: "https://votplatform.healthlinkiot.com/api/m/member/membershipquit"
+      modify-phone: "https://votplatform.healthlinkiot.com/api/m/member/jike/membershiptbox"
+      extension: "https://votplatform.healthlinkiot.com/api/m/member/membershipextension"
+      work-order: "https://votplatform.healthlinkiot.com/api/w/workorder/ecall"
+    config:
+      package-no: "PROD_PACKAGE"
+      channel-id: "PROD_CHANNEL"

+ 1 - 0
pom.xml

@@ -233,6 +233,7 @@
         <module>fs-company</module>
         <module>fs-common-api</module>
         <module>fs-company-app</module>
+        <module>common-ecall-sdk</module>
     </modules>
 
     <packaging>pom</packaging>