Bläddra i källkod

推送json字符串修改

bmmx 1 år sedan
förälder
incheckning
9b321231b9

+ 6 - 0
src/main/java/com/om/controller/admin/BrushFileController.java

@@ -60,6 +60,12 @@ public class BrushFileController {
         return brushFileService.updateStatus(id,status);
     }
 
+    @PostMapping("push")
+    @ApiOperation("推送ECU刷写文件")
+    public Result pushBrush(@RequestParam("id") Integer id){
+        return brushFileService.pushBrush(id);
+    }
+
 
 
 

+ 1 - 1
src/main/java/com/om/controller/admin/ClientController.java

@@ -9,7 +9,7 @@ import com.om.service.IClientService;
 import com.om.utils.Result;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.apache.catalina.LifecycleState;
+
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;

+ 34 - 0
src/main/java/com/om/entity/dto/BrushInfo.java

@@ -0,0 +1,34 @@
+package com.om.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class BrushInfo implements Serializable {
+
+    @ApiModelProperty(value = "刷写文件名称")
+    private String brushFileName;
+
+    @ApiModelProperty(value = "文件大小")
+    private long fileSize;
+
+    @ApiModelProperty(value = "下载路径")
+    private String url;
+
+    @ApiModelProperty(value = "创建时间")
+    private long createTime;
+
+
+    @ApiModelProperty("版本描述集合")
+    private List<Describe> describeList;
+}

+ 2 - 1
src/main/java/com/om/entity/dto/PushInfo.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+
 @Data
 @NoArgsConstructor
 public class PushInfo {
@@ -17,5 +18,5 @@ public class PushInfo {
 
 
     @ApiModelProperty("通用json字符串")
-    private JSONObject json;
+    private String json;
 }

+ 3 - 0
src/main/java/com/om/entity/po/BrushFile.java

@@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import java.io.Serializable;
+import java.util.List;
+
+import com.om.entity.dto.Describe;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 3 - 0
src/main/java/com/om/service/IBrushFileService.java

@@ -34,4 +34,7 @@ public interface IBrushFileService extends IService<BrushFile> {
     Result updateStatus(Integer id, Integer status);
 
     Result createBrush(BrushAddDTO dto);
+
+    Result pushBrush(Integer id);
+
 }

+ 3 - 6
src/main/java/com/om/service/impl/AppServiceImpl.java

@@ -14,10 +14,7 @@ import com.om.mapper.AppMapper;
 import com.om.mapper.ClientMapper;
 import com.om.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.om.utils.CommonUtil;
-import com.om.utils.PushUtil;
-import com.om.utils.Result;
-import com.om.utils.UserContext;
+import com.om.utils.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -217,8 +214,8 @@ public class AppServiceImpl extends ServiceImpl<AppMapper, App> implements IAppS
         }
         PushInfo pushInfo = new PushInfo();
         pushInfo.setPushInfoType(3);
-        pushInfo.setJson(JSONUtil.createObj().append("message","有VCI固件更新"));
-
+        String jsonString = GsonUtils.toJsonString(JSONUtil.createObj().set("message","有VCI固件更新"));
+        pushInfo.setJson(jsonString);
         String clientNums = byId.getClientNums();
         String[] clientNumList = clientNums.substring(1, clientNums.length() - 1).split(",");
         String[] tokens = new String[clientNumList.length];

+ 8 - 1
src/main/java/com/om/service/impl/AppsServiceImpl.java

@@ -2,8 +2,11 @@ package com.om.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import com.om.entity.dto.*;
 import com.om.entity.po.Apps;
 import com.om.entity.po.AppsClients;
@@ -18,6 +21,7 @@ import com.om.service.IAppsDescService;
 import com.om.service.IAppsService;
 import com.om.service.IClientService;
 import com.om.utils.*;
+import lombok.SneakyThrows;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -108,6 +112,7 @@ public class AppsServiceImpl extends ServiceImpl<AppsMapper, Apps> implements IA
         return Result.ok().message("没有APP更新").result(24001);
     }
 
+    @SneakyThrows
     @Override
     public Result push(Integer id) {
         //根据id查询
@@ -158,7 +163,8 @@ public class AppsServiceImpl extends ServiceImpl<AppsMapper, Apps> implements IA
                 }
             }
             //调用工具类
-            pushInfo.setJson(JSONUtil.parseObj(appInfo));
+            String jsonString = GsonUtils.toJsonString(appInfo);
+            pushInfo.setJson(jsonString);
             try {
                 pushUtil.sendAndroidListcastJSON(tokens,pushInfo);
             } catch (Exception e) {
@@ -168,4 +174,5 @@ public class AppsServiceImpl extends ServiceImpl<AppsMapper, Apps> implements IA
 
         return Result.ok();
     }
+
 }

+ 64 - 4
src/main/java/com/om/service/impl/BrushFileServiceImpl.java

@@ -1,11 +1,9 @@
 package com.om.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.om.entity.dto.AppBrushFileDTO;
-import com.om.entity.dto.BlushQueryPageDTO;
-import com.om.entity.dto.BrushAddDTO;
-import com.om.entity.dto.GuidDTO;
+import com.om.entity.dto.*;
 import com.om.entity.po.*;
 import com.om.entity.vo.*;
 import com.om.exception.BadReqException;
@@ -62,6 +60,9 @@ public class BrushFileServiceImpl extends ServiceImpl<BrushFileMapper, BrushFile
     @Resource
     private IBrandService brandService;
 
+    @Resource
+    private PushUtil pushUtil;
+
     @Override
     public Result getBrushFileList(AppBrushFileDTO dto) {
         if (BeanUtil.isEmpty(dto)){
@@ -277,4 +278,63 @@ public class BrushFileServiceImpl extends ServiceImpl<BrushFileMapper, BrushFile
         brushClientService.saveBatch(clients);
         return Result.ok();
     }
+
+    @Override
+    public Result pushBrush(Integer id) {
+        BrushFile brushFile = this.getById(id);
+        if (BeanUtil.isEmpty(brushFile)) {
+            throw new BadReqException("该ECU刷写文件不存在");
+        }
+
+        PushInfo pushInfo = new PushInfo();
+        pushInfo.setPushInfoType(5);
+
+        BrushInfo brushInfo = new BrushInfo();
+        brushInfo.setBrushFileName(brushFile.getBrushFileName());
+        brushInfo.setCreateTime(brushFile.getCreateTime().toInstant(ZoneOffset.of("+8")).toEpochMilli());
+        brushInfo.setUrl(brushFile.getUrl());
+        brushInfo.setFileSize((long) (Double.valueOf(brushFile.getFileSize())*1024*1024));
+
+        List<BrushDescription> brushDescriptions = brushDescriptionService.lambdaQuery()
+                .eq(BrushDescription::getBrushId, brushFile.getId())
+                .list();
+        List<Describe> describeList = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(brushDescriptions)){
+            for (BrushDescription brushDescription : brushDescriptions) {
+                Describe describe = new Describe();
+                describe.setDescription(brushDescription.getDescription());
+                describe.setLanguage(brushDescription.getLanguage());
+                describeList.add(describe);
+            }
+        }
+        brushInfo.setDescribeList(describeList);
+
+
+        List<BrushClient> brushClientList = brushClientService.lambdaQuery()
+                .eq(BrushClient::getBrushId, brushFile.getId())
+                .list();
+
+        if (CollectionUtil.isNotEmpty(brushClientList)) {
+            List<String> clientNums = brushClientList.stream().map(c -> c.getClientNum()).collect(Collectors.toList());
+            String[] tokens = new String[clientNums.size()];
+            for (String clientNum : clientNums) {
+                int i = 0;
+                Client client = clientService.lambdaQuery()
+                        .eq(Client::getNumber, clientNum)
+                        .one();
+                if (BeanUtil.isNotEmpty(client)) {
+                    tokens[i] = client.getDeviceToken();
+                    i++;
+                }
+            }
+            //调用工具类
+            pushInfo.setJson(GsonUtils.toJsonString(brushInfo));
+            try {
+                pushUtil.sendAndroidListcastJSON(tokens,pushInfo);
+            } catch (Exception e) {
+                throw new BizException("推送失败!!!");
+            }
+        }
+        return Result.ok();
+    }
 }

+ 2 - 1
src/main/java/com/om/service/impl/DiagnosisVersionInfoServiceImpl.java

@@ -455,7 +455,8 @@ public class DiagnosisVersionInfoServiceImpl extends ServiceImpl<DiagnosisVersio
                 }
             }
             //调用工具类
-            pushInfo.setJson(JSONUtil.parseObj(vehicleInfo));
+
+            pushInfo.setJson(GsonUtils.toJsonString(vehicleInfo));
             try {
                 pushUtil.sendAndroidListcastJSON(tokens,pushInfo);
             } catch (Exception e) {

+ 2 - 5
src/main/java/com/om/service/impl/ManualServiceImpl.java

@@ -15,10 +15,7 @@ import com.om.mapper.ManualMapper;
 import com.om.service.IClientService;
 import com.om.service.IManualService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.om.utils.AesUtil;
-import com.om.utils.JwtUtils;
-import com.om.utils.PushUtil;
-import com.om.utils.Result;
+import com.om.utils.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
@@ -104,7 +101,7 @@ public class ManualServiceImpl extends ServiceImpl<ManualMapper, Manual> impleme
         }
 
         maintenanceManualInfo.setDescribeList(describeList);
-        pushInfo.setJson(JSONUtil.parseObj(maintenanceManualInfo));
+        pushInfo.setJson(GsonUtils.toJsonString(maintenanceManualInfo));
 
         String clientCode = manual.getClientCode();
         if (StringUtils.isNotBlank(clientCode)){

+ 1 - 1
src/main/java/com/om/service/impl/VciInfoServiceImpl.java

@@ -332,7 +332,7 @@ public class VciInfoServiceImpl extends ServiceImpl<VciInfoMapper, VciInfo> impl
 */
 
         String json = "{}";
-        pushInfo.setJson(JSONUtil.createObj().append("message", "有vci固件升级了"));
+     //   pushInfo.setJson(JSONUtil.createObj().append("message", "有vci固件升级了"));
        // pushUtil.sendAndroidListcastJSON();
 
         return null;

+ 2 - 1
src/main/java/com/om/service/impl/WxscServiceImpl.java

@@ -155,7 +155,8 @@ public class WxscServiceImpl extends ServiceImpl<WxscMapper, Wxsc> implements IW
         }
 
         maintenanceManualInfo.setDescribeList(describeList);
-        pushInfo.setJson(JSONUtil.parseObj(maintenanceManualInfo));
+
+        pushInfo.setJson(GsonUtils.toJsonString(maintenanceManualInfo));
 
         String clientCode = wxsc.getClientCode();
         if (StringUtils.isNotBlank(clientCode)){

+ 1 - 0
src/main/java/com/om/utils/FileSigner.java

@@ -12,6 +12,7 @@ import java.util.Base64;
 public class FileSigner {
 
     private static final String PRIVATE_KEY_PATH = "/usr/local/docker/opera/static/private_key.pem"; // 私钥文件路径
+   // private static final String PRIVATE_KEY_PATH = "B:\\WorkSpace\\PracticalRojects\\OperationSystem\\src\\main\\resources\\template\\static\\private_key.pem"; // 私钥文件路径
 
 
     public static MultipartFile sign(MultipartFile file) throws Exception {

+ 123 - 0
src/main/java/com/om/utils/GsonUtils.java

@@ -0,0 +1,123 @@
+package com.om.utils;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
+
+public class GsonUtils {
+
+    //线程安全的
+    private static final Gson GSON;
+    private static final Gson GSON_NULL; // 不过滤空值
+    static {
+        GSON = new GsonBuilder().enableComplexMapKeySerialization() //当Map的key为复杂对象时,需要开启该方法
+//                .serializeNulls() //当字段值为空或null时,依然对该字段进行转换
+//                .excludeFieldsWithoutExposeAnnotation()//打开Export注解,但打开了这个注解,副作用,要转换和不转换都要加注解
+                .setDateFormat("yyyy-MM-dd HH:mm:ss")//序列化日期格式  "yyyy-MM-dd"
+//                .setPrettyPrinting() //自动格式化换行
+                .disableHtmlEscaping() //防止特殊字符出现乱码
+                .create();
+        GSON_NULL = new GsonBuilder().enableComplexMapKeySerialization() //当Map的key为复杂对象时,需要开启该方法
+                .serializeNulls() //当字段值为空或null时,依然对该字段进行转换
+//                .excludeFieldsWithoutExposeAnnotation()//打开Export注解,但打开了这个注解,副作用,要转换和不转换都要加注解
+                .setDateFormat("yyyy-MM-dd HH:mm:ss")//序列化日期格式  "yyyy-MM-dd"
+//                .setPrettyPrinting() //自动格式化换行
+                .disableHtmlEscaping() //防止特殊字符出现乱码
+                .create();
+    }
+
+    //获取gson解析器
+    public static Gson getGson() {
+        return GSON;
+    }
+
+    //获取gson解析器 有空值 解析
+    public static Gson getWriteNullGson() {
+        return GSON_NULL;
+    }
+
+
+    /**
+     * 根据对象返回json  过滤空值字段
+     */
+    public static String toJsonString(Object object) {
+        return GSON.toJson(object);
+    }
+
+    /**
+     * 根据对象返回json  不过滤空值字段
+     */
+    public static String toJsonString(Object object, GsonSerializerFeature ser) {
+        if (ser == GsonSerializerFeature.WriteMapNullValue){
+            return GSON_NULL.toJson(object);
+        }
+        return GSON.toJson(object);
+    }
+
+
+    /**
+     * 将字符串转化对象
+     *
+     * @param json     源字符串
+     * @param classOfT 目标对象类型
+     * @param <T>
+     * @return
+     */
+    public static <T> T strToJavaBean(String json, Class<T> classOfT) {
+        return GSON.fromJson(json, classOfT);
+    }
+
+    /**
+     * 将json转化为对应的实体对象
+     * new TypeToken<List<T>>() {}.getType()
+     * new TypeToken<Map<String, T>>() {}.getType()
+     * new TypeToken<List<Map<String, T>>>() {}.getType()
+     */
+    public static <T> T fromJson(String json, Type typeOfT) {
+        return GSON.fromJson(json, typeOfT);
+    }
+
+    /**
+     * 转成list
+     * @param gsonString
+     * @param cls
+     * @return
+     */
+    public static <T> List<T> strToList(String gsonString, Class<T> cls) {
+        return GSON.fromJson(gsonString, new TypeToken<List<T>>() {
+        }.getType());
+    }
+
+    /**
+     * 转成list中有map的
+     * @param gsonString
+     * @return
+     */
+    public static <T> List<Map<String, T>> strToListMaps(String gsonString) {
+        return GSON.fromJson(gsonString, new TypeToken<List<Map<String, String>>>() {
+        }.getType());
+    }
+
+    /**
+     * 转成map
+     * @param gsonString
+     * @return
+     */
+    public static <T> Map<String, T> strToMaps(String gsonString) {
+        return GSON.fromJson(gsonString, new TypeToken<Map<String, T>>() {
+        }.getType());
+    }
+
+}
+
+ enum GsonSerializerFeature {
+    /**
+     * 过滤空字符串
+     */
+    WriteMapNullValue
+}

+ 3 - 2
src/main/java/com/om/utils/PushUtil.java

@@ -2,6 +2,7 @@ package com.om.utils;
 
 
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.om.entity.dto.AppInfo;
 import com.om.entity.dto.PushInfo;
 import org.springframework.beans.factory.annotation.Value;
@@ -24,8 +25,8 @@ public class PushUtil {
 
         listcast.setDeviceToken(tokens);
 
-        listcast.setCustomField(JSONUtil.toJsonStr(pushInfo));
-        System.out.println(JSONUtil.toJsonStr(pushInfo));
+        listcast.setCustomField(JSON.toJSONString(pushInfo));
+        System.out.println("pushinfo:"+JSON.toJSONString(pushInfo));
 
         listcast.goAppAfterOpen();
         listcast.setDisplayType(AndroidNotification.DisplayType.MESSAGE);

+ 28 - 0
src/main/resources/template/static/private_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCzwwZE2Ce7CgIF
+tsnZ5X8La6jEAtbTMmXheLHIMnL0njDpbT1DWAaGo73R1GIA2cQikpo7ql0PXsTh
+6lkWXhfBHC0kGzjIrFnN5lskrcupcL+Tx5W5Yj7DGl/axrCPYD/7uFcNdEU0V4hq
+YttL/RvrzmwiRaY820oeBWNWFdidFhlXtxKPszmHn9EkMXs+2zqoisepR0St4PCp
+iS0kyPNt2/9f+tNkKbIxpIf4VjFDKAZ7MqdS+CneX2OGVRdskYtQAVx1xQ97P1YP
+zQkEFBWcD+lNOf81b24plK1wBOzkXaaJDQxnoeTyunuvpcWyDGih2qiS0bQ67TCE
+7LEKG1v7AgMBAAECggEAB/6D0Fr2hVxgE6X52w1YNYdPpYvkxtambj0CVv9bWmKQ
+lUjs4QpQm/s7LVIvG4+Tp9/yKPYeFllmEw/rb1G257kbjtABGfeENOJqKjrqZDol
+4uoM0AY8+Us6eQ29+1pR7h1YDbqee0HrSKPl0b7LV5TB/VIwnuM3rBccQE9PZ0jp
+kEY6CLmKb4OOXMFE1LMwZq0bFbv/EsxX4l1A53bZ3mi7cz9oUs7D23YHqgY1kx/c
+ZgQj8EAXHdy5YsjdL/Q+Om4jW+EV/Vj6f3sm8UzaaUaJF5d2X/iqt3PdrRyqTE+E
+SMhnq+tpVpPB8OWfiUQ3aKOEX0/NvLfU62uJh/iWtQKBgQD0e2yY94DQwoR2tWbk
+4vPzwt+Ip7oDj7YAUeTurCBWJkA4n8qk8Ay20xjV9Y05BePt/hm3dSTJbdT1831j
+LEVbyIR1prYurGfXfhkbqsTI52wFhlKfF4oV1LInI4EQG5axB7PBIx+R+UYQsr79
+2HSAydRrkhAaVNNlp7CBopAyTQKBgQC8OwqL9ObmSKSb40BTKqtRzPx43E1IQCr3
+e5k9qWK2Bt0u4gSQddy3AzSYI2IxLA4/8Cj4naiRaajXdb8n/fFvMhQWSHQImpTt
+gqtp58x+A73mqhatrrDj2YLQstCYfk7VgaO9VsWVmXwaHuN+HusSU1qEQOfOSp+v
+9syjCm0bZwKBgQC9ZQgiEErYbnhTxf/p/O9jvWmR4e22aJRj9w1U4D9EvekudIt1
+7wjKcQpiZhF7RVbnvduKRdOzv8QkrPZL57XrfpEu23FzAtiHFga5ajd8M9t5BC/p
+U0ED3HwO2fBX3CeHCSJ10pHYcbWXpgFTgWXvh2tp0gNrgp8ptxiDtL3kWQKBgQC1
+vJuWPcKiHQkxqdx1cAExXaV2W94SIEJb6G4wZtbzwPTVS0v03pdX7DRfn+oyZ8Lq
+YMpuIGqc21M1lG4YAsuU/NkAGrxNglLAbyVpf3ClSp+Tki2LS9tmYqA3OC7GzUz4
+P88EBD+JDUQRRDmJj/iPHQOMJc6qEsrTbopt8KcfiQJ/CdqmJIHdmZUDgbBw+Frn
+kZFAeVYzBgP3cZBm2Xg+UbR/+tY2lhixkq8yYLFnC0jSjtB/3jaHrcv5ZCdxboru
++LVVTgxTGxwUc+29moB1sCfM7//AkQxBH/8J6/4zW6KUe753bT78eUT+Es/QpPtX
+5f8wXXk0XTkKsvsmyLQmpg==
+-----END PRIVATE KEY-----

+ 33 - 0
src/test/java/com/om/SubtractTest.java

@@ -0,0 +1,33 @@
+package com.om;
+
+
+import org.junit.jupiter.api.Assertions;
+
+import static org.junit.jupiter.api.Assertions.fail;
+
+
+public class SubtractTest {
+
+    public int subtract(int a , int b) {
+        return a - b;
+    }
+
+   // @Test
+    public void testSubtractBasicFunctionality() {
+        Assertions.assertEquals(5, subtract(5, 2));
+        Assertions.assertEquals(-1, subtract(2, 3));
+        Assertions.assertEquals(0, subtract(10, 10));
+        Assertions.assertEquals(-5, subtract(-2, 3));
+    }
+
+   // @Test
+    public void testSubtractAdditionalCases() {
+        Assertions.assertEquals(100, subtract(105, 5));
+        Assertions.assertEquals(-10, subtract(-5, 5));
+    }
+
+   // @Test
+    public void testFailMessage() {
+        fail("您的测试未通过,请检查用例本身是否存在问题!");
+    }
+}