diff --git a/cloud-modules/cloud-modules-breakdown/pom.xml b/cloud-modules/cloud-modules-breakdown/pom.xml
new file mode 100644
index 0000000..28d6889
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/pom.xml
@@ -0,0 +1,106 @@
+
+
+
+ com.muyu
+ cloud-modules
+ 3.6.3
+
+ 4.0.0
+
+ cloud-modules-breakdown
+
+
+ cloud-modules-breakdown故障模块
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ com.mysql
+ mysql-connector-j
+
+
+
+
+ com.muyu
+ cloud-common-datasource
+
+
+
+
+ com.muyu
+ cloud-common-datascope
+
+
+
+
+ com.muyu
+ cloud-common-log
+
+
+
+
+ com.muyu
+ cloud-common-api-doc
+
+
+
+
+ com.muyu
+ cloud-common-xxl
+
+
+
+ com.muyu
+ cloud-common-rabbit
+
+
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+
+
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/CloudBreakdownApplication.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/CloudBreakdownApplication.java
new file mode 100644
index 0000000..2c6ae9a
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/CloudBreakdownApplication.java
@@ -0,0 +1,21 @@
+package com.muyu.breakdown;
+
+import com.muyu.common.security.annotation.EnableCustomConfig;
+import com.muyu.common.security.annotation.EnableMyFeignClients;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 系统模块
+ *
+ * @author muyu
+ */
+@EnableCustomConfig
+//@EnableCustomSwagger2
+@EnableMyFeignClients
+@SpringBootApplication
+public class CloudBreakdownApplication {
+ public static void main (String[] args) {
+ SpringApplication.run(CloudBreakdownApplication.class, args);
+ }
+}
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/controller/SysCarFaultController.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/controller/SysCarFaultController.java
new file mode 100644
index 0000000..a8c8b6c
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/controller/SysCarFaultController.java
@@ -0,0 +1,106 @@
+package com.muyu.breakdown.controller;
+
+import com.muyu.breakdown.domain.SysCarFault;
+import com.muyu.breakdown.service.SysCarFaultService;
+import com.muyu.common.core.domain.Result;
+import com.muyu.common.core.utils.poi.ExcelUtil;
+import com.muyu.common.core.web.controller.BaseController;
+import com.muyu.common.core.web.page.TableDataInfo;
+import com.muyu.common.security.annotation.RequiresPermissions;
+import com.muyu.common.security.utils.SecurityUtils;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/20 11:00
+ */
+@RestController
+@RequestMapping("/breakdown")
+public class SysCarFaultController extends BaseController
+{
+ @Resource
+ private SysCarFaultService sysCarFaultService;
+
+ /**
+ * 查询车辆故障管理列表
+ */
+ @RequiresPermissions("breakdown:breakdown:list")
+ @GetMapping("/list")
+ public Result> list(SysCarFault sysCarFault)
+ {
+ startPage();
+ List list = sysCarFaultService.selectSysCarFaultList(sysCarFault);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出车辆故障管理列表
+ */
+ @RequiresPermissions("breakdown:breakdown:export")
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, SysCarFault sysCarFault)
+ {
+ List list = sysCarFaultService.selectSysCarFaultList(sysCarFault);
+ ExcelUtil util = new ExcelUtil(SysCarFault.class);
+ util.exportExcel(response, list, "车辆故障管理数据");
+ }
+
+ /**
+ * 获取车辆故障管理详细信息
+ */
+ @RequiresPermissions("breakdown:breakdown:query")
+ @GetMapping(value = "/{id}")
+ public Result> getInfo(@PathVariable("id") Long id)
+ {
+ return success(sysCarFaultService.selectSysCarFaultById(id));
+ }
+
+ /**
+ * 新增车辆故障管理
+ */
+ @RequiresPermissions("breakdown:breakdown:add")
+ @PostMapping
+ public Result add(
+ @Validated @RequestBody SysCarFault sysCarFault)
+ {
+ if (sysCarFaultService.checkIdUnique(sysCarFault)) {
+ return error("新增 车辆故障管理 '" + sysCarFault + "'失败,车辆故障管理已存在");
+ }
+ sysCarFault.setCreateBy(SecurityUtils.getUsername());
+ return toAjax(sysCarFaultService.save(sysCarFault));
+ }
+
+ /**
+ * 修改车辆故障管理
+ */
+ @RequiresPermissions("breakdown:breakdown:edit")
+ @PutMapping
+ public Result edit(
+ @Validated @RequestBody SysCarFault sysCarFault)
+ {
+ if (!sysCarFaultService.checkIdUnique(sysCarFault)) {
+ return error("修改 车辆故障管理 '" + sysCarFault + "'失败,车辆故障管理不存在");
+ }
+ sysCarFault.setUpdateBy(SecurityUtils.getUsername());
+ return toAjax(sysCarFaultService.updateById(sysCarFault));
+ }
+
+ /**
+ * 删除车辆故障管理
+ */
+ @RequiresPermissions("breakdown:breakdown:remove")
+ @DeleteMapping("/{ids}")
+ public Result remove(@PathVariable("ids") Long[] ids)
+ {
+ sysCarFaultService.removeBatchByIds(Arrays.asList(ids));
+ return success();
+ }
+}
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFault.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFault.java
new file mode 100644
index 0000000..7abee76
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFault.java
@@ -0,0 +1,116 @@
+package com.muyu.breakdown.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.muyu.common.core.annotation.Excel;
+import com.muyu.common.core.web.domain.BaseEntity;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * @ClassDescription: 车辆故障管理对象
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/20 10:56
+ */
+@Data
+@Setter
+@Getter
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_car_fault")
+public class SysCarFault extends BaseEntity{
+ private static final long serialVersionUID = 1L;
+
+ /** 参数主键 */
+ @TableId( type = IdType.AUTO)
+ private Long id;
+
+ /** 故障码编码 */
+ @Excel(name = "故障码编码")
+ private String faultCode;
+
+ /** 故障名 */
+ @Excel(name = "故障名")
+ private String faultName;
+
+ /** 故障类型 */
+ @Excel(name = "故障类型")
+ private Long typeId;
+
+ /** 车辆VIN码 */
+ @Excel(name = "车辆VIN码")
+ private String carVin;
+
+ /** 故障标签 */
+ @Excel(name = "故障标签")
+ private String faultLabel;
+
+ /** 故障组 */
+ @Excel(name = "故障组")
+ private String faultGroup;
+
+ /** 故障位 */
+ @Excel(name = "故障位")
+ private String faultBit;
+
+ /** 故障值 */
+ @Excel(name = "故障值")
+ private String faultValue;
+
+ /** 故障级别 (0.低 ,2.中 ,3.高) */
+ @Excel(name = "故障级别 (0.低 ,2.中 ,3.高)")
+ private Long faultRank;
+
+ /** 故障描述信息 */
+ @Excel(name = "故障描述信息")
+ private String faultDesc;
+
+ /** 故障最小阈值 */
+ @Excel(name = "故障最小阈值")
+ private String faultMinThreshold;
+
+ /** 故障最大阈值 */
+ @Excel(name = "故障最大阈值")
+ private String faultMaxThreshold;
+
+ /** 启用状态(1.待处理 2.处理中 3.已处理 4.忽略) */
+ @Excel(name = "启用状态(1.待处理 2.处理中 3.已处理 4.忽略)")
+ private Long status;
+
+ /** 是否警告(0.开启 1.禁止) */
+ @Excel(name = "是否警告(0.开启 1.禁止)")
+ private Long warnStatus;
+
+
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+ .append("id", getId())
+ .append("faultCode", getFaultCode())
+ .append("faultName", getFaultName())
+ .append("typeId", getTypeId())
+ .append("carVin", getCarVin())
+ .append("faultLabel", getFaultLabel())
+ .append("faultGroup", getFaultGroup())
+ .append("faultBit", getFaultBit())
+ .append("faultValue", getFaultValue())
+ .append("faultRank", getFaultRank())
+ .append("faultDesc", getFaultDesc())
+ .append("faultMinThreshold", getFaultMinThreshold())
+ .append("faultMaxThreshold", getFaultMaxThreshold())
+ .append("status", getStatus())
+ .append("warnStatus", getWarnStatus())
+ .append("remark", getRemark())
+ .append("createBy", getCreateBy())
+ .append("createTime", getCreateTime())
+ .append("updateBy", getUpdateBy())
+ .append("updateTime", getUpdateTime())
+ .toString();
+ }
+}
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFaultType.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFaultType.java
new file mode 100644
index 0000000..cc04b83
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFaultType.java
@@ -0,0 +1,24 @@
+package com.muyu.breakdown.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.muyu.common.core.web.domain.BaseEntity;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/20 11:34
+ */
+@Data
+@Setter
+@Getter
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("sys_car_fault_type")
+public class SysCarFaultType {
+ private Long faultTypeId;
+ private String faultTypeName;
+}
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/mapper/SysCarFaultMapper.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/mapper/SysCarFaultMapper.java
new file mode 100644
index 0000000..49eb807
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/mapper/SysCarFaultMapper.java
@@ -0,0 +1,16 @@
+package com.muyu.breakdown.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.muyu.breakdown.domain.SysCarFault;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @ClassDescription: 车辆故障管理Mapper接口
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/20 10:57
+ */
+@Mapper
+public interface SysCarFaultMapper extends BaseMapper{
+
+}
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/SysCarFaultService.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/SysCarFaultService.java
new file mode 100644
index 0000000..604c27d
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/SysCarFaultService.java
@@ -0,0 +1,38 @@
+package com.muyu.breakdown.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.muyu.breakdown.domain.SysCarFault;
+
+import java.util.List;
+
+/**
+ * @ClassDescription: 车辆故障管理Service接口
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/20 10:57
+ */
+public interface SysCarFaultService extends IService {
+ /**
+ * 精确查询车辆故障管理
+ *
+ * @param id 车辆故障管理主键
+ * @return 车辆故障管理
+ */
+ public SysCarFault selectSysCarFaultById(Long id);
+
+ /**
+ * 查询车辆故障管理列表
+ *
+ * @param sysCarFault 车辆故障管理
+ * @return 车辆故障管理集合
+ */
+ public List selectSysCarFaultList(SysCarFault sysCarFault);
+
+ /**
+ * 判断 车辆故障管理 id是否唯一
+ * @param sysCarFault 车辆故障管理
+ * @return 结果
+ */
+ Boolean checkIdUnique(SysCarFault sysCarFault);
+
+}
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/impl/SysCarFaultServiceImpl.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/impl/SysCarFaultServiceImpl.java
new file mode 100644
index 0000000..717933a
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/impl/SysCarFaultServiceImpl.java
@@ -0,0 +1,75 @@
+package com.muyu.breakdown.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.muyu.breakdown.domain.SysCarFault;
+import com.muyu.breakdown.mapper.SysCarFaultMapper;
+import com.muyu.breakdown.service.SysCarFaultService;
+import com.muyu.common.core.utils.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+
+import java.util.List;
+
+/**
+ * @ClassDescription: 车辆故障管理Service业务层处理
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/20 10:58
+ */
+@Service
+public class SysCarFaultServiceImpl
+ extends ServiceImpl
+ implements SysCarFaultService {
+
+ /**
+ * 精确查询车辆故障管理
+ *
+ * @param id 车辆故障管理主键
+ * @return 车辆故障管理
+ */
+ @Override
+ public SysCarFault selectSysCarFaultById(Long id)
+ {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ Assert.notNull(id, "id不可为空");
+ queryWrapper.eq(SysCarFault::getId, id);
+ return this.getOne(queryWrapper);
+ }
+
+
+ /**
+ * 查询车辆故障管理列表
+ *
+ * @param sysCarFault 车辆故障管理
+ * @return 车辆故障管理
+ */
+ @Override
+ public List selectSysCarFaultList(SysCarFault sysCarFault)
+ {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ if (StringUtils.isNotEmpty(sysCarFault.getFaultCode())){
+ queryWrapper.eq(SysCarFault::getFaultCode, sysCarFault.getFaultCode());
+ }
+ if (StringUtils.isNotEmpty(sysCarFault.getFaultBit())){
+ queryWrapper.eq(SysCarFault::getFaultBit, sysCarFault.getFaultBit());
+ }
+ if (sysCarFault.getFaultRank()!=null){
+ queryWrapper.eq(SysCarFault::getFaultRank, sysCarFault.getFaultRank());
+ }
+ return this.list(queryWrapper);
+ }
+
+ /**
+ * 唯一 判断
+ * @param sysCarFault 车辆故障管理
+ * @return 车辆故障管理
+ */
+ @Override
+ public Boolean checkIdUnique(SysCarFault sysCarFault) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(SysCarFault::getId, sysCarFault.getId());
+ return this.count(queryWrapper) > 0;
+ }
+
+}
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/banner.txt b/cloud-modules/cloud-modules-breakdown/src/main/resources/banner.txt
new file mode 100644
index 0000000..0dd5eee
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/banner.txt
@@ -0,0 +1,2 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-breakdown/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..9ce45cb
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/bootstrap.yml
@@ -0,0 +1,60 @@
+# Tomcat
+server:
+ port: 9702
+
+# nacos线上地址
+nacos:
+ addr: 47.101.53.251:8848
+ user-name: nacos
+ password: nacos
+ namespace: four
+# SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all
+# Spring
+spring:
+ amqp:
+ deserialization:
+ trust:
+ all: true
+ main:
+ allow-bean-definition-overriding: true
+ application:
+ # 应用名称
+ name: cloud-breakdown
+ profiles:
+ # 环境配置
+ active: dev
+ cloud:
+ nacos:
+ discovery:
+ # 服务注册地址
+ server-addr: ${nacos.addr}
+ # nacos用户名
+ username: ${nacos.user-name}
+ # nacos密码
+ password: ${nacos.password}
+ # 命名空间
+ namespace: ${nacos.namespace}
+ config:
+ # 服务注册地址
+ server-addr: ${nacos.addr}
+ # nacos用户名
+ username: ${nacos.user-name}
+ # nacos密码
+ password: ${nacos.password}
+ # 命名空间
+ namespace: ${nacos.namespace}
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ # 系统共享配置
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ # 系统环境Config共享配置
+ - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ # xxl-job 配置文件
+ - application-xxl-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ # rabbit 配置文件
+ - application-rabbit-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+logging:
+ level:
+ com.muyu.breakdown.mapper: DEBUG
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/dev.xml b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/dev.xml
new file mode 100644
index 0000000..34cd186
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/dev.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+ ${log.pattern}
+
+
+
+
+
+ ${log.path}/info.log
+
+
+
+ ${log.path}/info.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+ ${log.path}/error.log
+
+
+
+ ${log.path}/error.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/prod.xml b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/prod.xml
new file mode 100644
index 0000000..1193d09
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/prod.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+ ${log.sky.pattern}
+
+
+
+
+
+ ${log.path}/info.log
+
+
+
+ ${log.path}/info.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+ ${log.path}/error.log
+
+
+
+ ${log.path}/error.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+
+
+ ${log.sky.pattern}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/test.xml b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/test.xml
new file mode 100644
index 0000000..1193d09
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/test.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+ ${log.sky.pattern}
+
+
+
+
+
+ ${log.path}/info.log
+
+
+
+ ${log.path}/info.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+ ${log.path}/error.log
+
+
+
+ ${log.path}/error.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+
+
+ ${log.sky.pattern}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/mapper/breakdown/SysCarFaultMapper.xml b/cloud-modules/cloud-modules-breakdown/src/main/resources/mapper/breakdown/SysCarFaultMapper.xml
new file mode 100644
index 0000000..4b3f17d
--- /dev/null
+++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/mapper/breakdown/SysCarFaultMapper.xml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, fault_code, fault_name, type_id, car_vin, fault_label, fault_group, fault_bit, fault_value, fault_rank, fault_desc, fault_min_threshold, fault_max_threshold, status, warn_status, remark, create_by, create_time, update_by, update_time from sys_car_fault
+
+
+
+
+
+
+
+ insert into sys_car_fault
+
+ fault_code,
+ fault_name,
+ type_id,
+ car_vin,
+ fault_label,
+ fault_group,
+ fault_bit,
+ fault_value,
+ fault_rank,
+ fault_desc,
+ fault_min_threshold,
+ fault_max_threshold,
+ status,
+ warn_status,
+ remark,
+ create_by,
+ create_time,
+ update_by,
+ update_time,
+
+
+ #{faultCode},
+ #{faultName},
+ #{typeId},
+ #{carVin},
+ #{faultLabel},
+ #{faultGroup},
+ #{faultBit},
+ #{faultValue},
+ #{faultRank},
+ #{faultDesc},
+ #{faultMinThreshold},
+ #{faultMaxThreshold},
+ #{status},
+ #{warnStatus},
+ #{remark},
+ #{createBy},
+ #{createTime},
+ #{updateBy},
+ #{updateTime},
+
+
+
+
+ update sys_car_fault
+
+ fault_code = #{faultCode},
+ fault_name = #{faultName},
+ type_id = #{typeId},
+ car_vin = #{carVin},
+ fault_label = #{faultLabel},
+ fault_group = #{faultGroup},
+ fault_bit = #{faultBit},
+ fault_value = #{faultValue},
+ fault_rank = #{faultRank},
+ fault_desc = #{faultDesc},
+ fault_min_threshold = #{faultMinThreshold},
+ fault_max_threshold = #{faultMaxThreshold},
+ status = #{status},
+ warn_status = #{warnStatus},
+ remark = #{remark},
+ create_by = #{createBy},
+ create_time = #{createTime},
+ update_by = #{updateBy},
+ update_time = #{updateTime},
+
+ where id = #{id}
+
+
+
+ delete from sys_car_fault where id = #{id}
+
+
+
+ delete from sys_car_fault where id in
+
+ #{id}
+
+
+
diff --git a/cloud-modules/cloud-modules-wechat/pom.xml b/cloud-modules/cloud-modules-wechat/pom.xml
new file mode 100644
index 0000000..8d94920
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/pom.xml
@@ -0,0 +1,59 @@
+
+
+ 4.0.0
+
+
+ com.muyu
+ cloud-modules
+ 3.6.3
+
+ cloud-modules-wechat
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.9.3
+
+
+ com.thoughtworks.xstream
+ xstream
+ 1.4.20
+
+
+ org.projectlombok
+ lombok
+ 1.18.34
+
+
+ org.springframework.boot
+ spring-boot-starter
+ 3.3.2
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 3.3.2
+
+
+
+ org.dom4j
+ dom4j
+ 2.1.3
+
+
+ com.alibaba.fastjson2
+ fastjson2
+ 2.0.43
+
+
+
diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/CloudWeChatApplication.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/CloudWeChatApplication.java
new file mode 100644
index 0000000..61c9d69
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/CloudWeChatApplication.java
@@ -0,0 +1,18 @@
+package com.muyu.wechat;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/19 14:26
+ */
+@SpringBootApplication
+public class CloudWeChatApplication {
+ public static void main (String[] args) {
+ SpringApplication.run(CloudWeChatApplication.class, args);
+ }
+}
diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/controller/WxTestController.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/controller/WxTestController.java
new file mode 100644
index 0000000..bfce459
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/controller/WxTestController.java
@@ -0,0 +1,155 @@
+package com.muyu.wechat.controller;
+
+
+import com.muyu.wechat.domain.Message;
+import com.muyu.wechat.message.Article;
+import com.muyu.wechat.message.NewMessage;
+import com.muyu.wechat.util.TokenUtil;
+import com.thoughtworks.xstream.XStream;
+import io.micrometer.common.util.StringUtils;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.http.HttpServletRequest;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/19 20:26
+ */
+@RestController
+public class WxTestController {
+
+
+ @PostMapping("/")
+ public String receiveMessage(HttpServletRequest request) {
+ ServletInputStream inputStream = null;
+ HashMap map = new HashMap<>();
+ try {
+ inputStream = request.getInputStream();
+ SAXReader saxReader = new SAXReader();
+ //读取request输入流,获得Document对象
+ Document document = saxReader.read(inputStream);
+ //获得root结点
+ Element rootElement = document.getRootElement();
+ //获取所有的子节点
+ List elements = rootElement.elements();
+ for (Element element : elements) {
+ map.put(element.getName(), element.getStringValue());
+ }
+
+
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } catch (DocumentException e) {
+ throw new RuntimeException(e);
+ }
+ System.out.println(map);
+ //回复消息
+ String message = "";
+ if ("图文".equals(map.get("Content"))) {
+ message = getReplyNewsMessage(map);
+ } else {
+ message = getReplyMessage(map);
+
+ }
+ return message;
+ }
+
+ /**
+ * 获得回复的消息内容
+ *
+ * @param map
+ * @return
+ */
+ private String getReplyMessage(HashMap map) {
+ Message message = new Message();
+ message.setToUserName(map.get("FromUserName"));
+ message.setFromUserName(map.get("ToUserName"));
+// message.setMsgType(map.get("MsgType"));
+ message.setMsgType("text");
+ message.setCreateTime(System.currentTimeMillis() / 1000);
+ message.setContent("自动回复:您好");
+ //XStream将java对象转换为xml字符串
+ XStream xStream = new XStream();
+ xStream.processAnnotations(Message.class);
+ String xml = xStream.toXML(message);
+ return xml;
+ }
+
+
+ @GetMapping("/")
+ public String check(@RequestParam("signature") String signature, @RequestParam("timestamp") String timestamp,
+ @RequestParam("nonce") String nonce, @RequestParam("echostr") String echostr) {
+
+ //1.将token、timestamp、nonce三个参数进行字典排序
+ String token = "asdasd";
+ List list = Arrays.asList(token, timestamp, nonce);
+ //排序
+ Collections.sort(list);
+ //2.将三个参数字符串拼接成一个字符串进行sha1加密
+ StringBuilder stringBuilder = new StringBuilder();
+ for (String s : list) {
+ stringBuilder.append(s);
+ }
+ //加密
+ try {
+ MessageDigest instance = MessageDigest.getInstance("sha1");
+ //使用sha1进行加密,获得byte数组
+ byte[] digest = instance.digest(stringBuilder.toString().getBytes());
+ StringBuilder sum = new StringBuilder();
+ for (byte b : digest) {
+ sum.append(Integer.toHexString((b >> 4) & 15));
+ sum.append(Integer.toHexString(b & 15));
+ }
+ //3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
+ if (!StringUtils.isEmpty(signature) && signature.equals(sum.toString())) {
+ return echostr;
+ }
+
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ }
+ return null;
+ }
+
+ @PostMapping("/test")
+ public void test() {
+ String accessToken = TokenUtil.getAccessToken();
+ System.out.println(accessToken);
+ }
+
+ private String getReplyNewsMessage(Map map) {
+ NewMessage newsMessage = new NewMessage();
+ newsMessage.setToUserName(map.get("FromUserName"));
+ newsMessage.setFromUserName(map.get("ToUserName"));
+ newsMessage.setMsgType("news");
+ newsMessage.setCreateTime(System.currentTimeMillis() / 1000);
+ newsMessage.setArticleCount(1);
+ List articles = new ArrayList<>();
+ Article article = new Article();
+ article.setTitle("oneone哦恩恩");
+ article.setDescription("详细描述--------------信息");
+ article.setUrl("https://www.baidu.com");
+ article.setPicUrl("http://mmbiz.qpic.cn/mmbiz_jpg/RiaWwmABEMmkFKQMeQZLLYaxknlzE9CxSozVSH42iaXiaQcia5hPPUicuNYbS8dG99zsMZ1ic266ialM42Mbn8SkN54kA/0");
+ articles.add(article);
+ newsMessage.setArticles(articles);
+ //XStream将java对象转换为xml字符串
+ XStream xStream = new XStream();
+ xStream.processAnnotations(NewMessage.class);
+ String xml = xStream.toXML(newsMessage);
+ return xml;
+ }
+}
diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/AccessToken.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/AccessToken.java
new file mode 100644
index 0000000..f7d4d77
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/AccessToken.java
@@ -0,0 +1,23 @@
+package com.muyu.wechat.domain;
+
+import lombok.Data;
+
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/19 20:26
+ */
+@Data
+public class AccessToken {
+
+
+ private String access_token;
+
+ private Long expires_in;
+
+ public void setExpiresTime(Long expiresIn) {
+ this.expires_in = System.currentTimeMillis() + expiresIn * 1000;
+ }
+
+}
diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/Message.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/Message.java
new file mode 100644
index 0000000..069961b
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/Message.java
@@ -0,0 +1,29 @@
+package com.muyu.wechat.domain;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.Data;
+
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/19 20:26
+ */
+@Data
+@XStreamAlias("xml")
+public class Message {
+ @XStreamAlias("ToUserName")
+ private String toUserName;
+
+ @XStreamAlias("FromUserName")
+ private String fromUserName;
+
+ @XStreamAlias("CreateTime")
+ private Long createTime;
+
+ @XStreamAlias("MsgType")
+ private String msgType;
+
+ @XStreamAlias("Content")
+ private String content;
+}
diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/Article.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/Article.java
new file mode 100644
index 0000000..873df00
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/Article.java
@@ -0,0 +1,28 @@
+package com.muyu.wechat.message;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/19 20:26
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@XStreamAlias("item")
+public class Article {
+ @XStreamAlias("Title")
+ private String title;
+ @XStreamAlias("Description")
+ private String description;
+ @XStreamAlias("PicUrl")
+ private String picUrl;
+ @XStreamAlias("Url")
+ private String url;
+
+}
diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/NewMessage.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/NewMessage.java
new file mode 100644
index 0000000..9b49422
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/NewMessage.java
@@ -0,0 +1,34 @@
+package com.muyu.wechat.message;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/19 20:26
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@XStreamAlias("xml")
+public class NewMessage {
+ @XStreamAlias("ToUserName")
+ private String toUserName;
+ @XStreamAlias("FromUserName")
+ private String fromUserName;
+ @XStreamAlias("CreateTime")
+ private long createTime;
+ @XStreamAlias("MsgType")
+ private String msgType;
+ @XStreamAlias("ArticleCount")
+ private int articleCount;
+ @XStreamAlias("Articles")
+ private List articles;
+
+}
diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/OkHttpUtils.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/OkHttpUtils.java
new file mode 100644
index 0000000..f330aa8
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/OkHttpUtils.java
@@ -0,0 +1,41 @@
+package com.muyu.wechat.util;
+
+import okhttp3.*;
+
+import java.io.IOException;
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/19 20:26
+ */
+public class OkHttpUtils {
+
+ private static final OkHttpClient client = new OkHttpClient();
+
+ public static String sendGetRequest(String urlString) {
+ Request request = new Request.Builder()
+ .url(urlString)
+ .build();
+ try (Response response = client.newCall(request).execute()) {
+ return response.body().string();
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public static String sendPostRequest(String urlString, String params) {
+ RequestBody requestBody = RequestBody.create(params, MediaType.parse("application/json; charset=utf-8"));
+ Request request = new Request.Builder()
+ .url(urlString)
+ .post(requestBody)
+ .build();
+ try (Response response = client.newCall(request).execute()) {
+ return response.body().string();
+ } catch (IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+}
diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/TokenUtil.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/TokenUtil.java
new file mode 100644
index 0000000..d4ff742
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/TokenUtil.java
@@ -0,0 +1,40 @@
+package com.muyu.wechat.util;
+
+import com.alibaba.fastjson2.JSON;
+
+import com.muyu.wechat.domain.AccessToken;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @ClassDescription:
+ * @JdkVersion: 1.8
+ * @Author: YZL
+ * @Created: 2024/9/19 20:26
+ */
+@Component
+public class TokenUtil {
+ private final static String APP_ID = "wx1d843111e24945c4";
+
+ private final static String APP_SECRET = "f625fc9e03e6bb5f4959b51f0650f1a8";
+
+ private static AccessToken accessToken = new AccessToken();
+
+
+ public static void getToken() {
+ String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", APP_ID, APP_SECRET);
+ String request = OkHttpUtils.sendGetRequest(url);
+ AccessToken wechatToken = JSON.parseObject(request, AccessToken.class);
+ if (wechatToken != null) {
+ accessToken.setExpiresTime(wechatToken.getExpires_in());
+ accessToken.setAccess_token(wechatToken.getAccess_token());
+ }
+ }
+
+ public static String getAccessToken() {
+ getToken();
+ return accessToken.getAccess_token();
+ }
+
+}
diff --git a/cloud-modules/cloud-modules-wechat/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-wechat/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..d3e045e
--- /dev/null
+++ b/cloud-modules/cloud-modules-wechat/src/main/resources/bootstrap.yml
@@ -0,0 +1,3 @@
+# Tomcat
+server:
+ port: 12000
diff --git a/cloud-modules/pom.xml b/cloud-modules/pom.xml
index ef8c5a8..5dd66e7 100644
--- a/cloud-modules/pom.xml
+++ b/cloud-modules/pom.xml
@@ -15,6 +15,8 @@
cloud-modules-template
cloud-modules-fence
cloud-modules-car
+ cloud-modules-wechat
+ cloud-modules-breakdown
cloud-car