From 3c8f10a7a4ef78c20bee0b433cba38857437cfe7 Mon Sep 17 00:00:00 2001 From: tianyongbao Date: Sun, 19 Oct 2025 12:34:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=B0=E5=9B=BE=E5=AE=9E=E6=97=B6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E8=AE=BE=E5=A4=87=E4=BD=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../intc-iot/src/main/resources/bootstrap.yml | 9 ++ intc-modules/intc-tdengine/pom.xml | 25 +--- .../controller/DataDemoController.java | 31 ----- .../controller/TdEngineController.java | 55 ++++----- .../tdengine/domain/DeviceSensorData.java | 20 ++++ .../intc/tdengine/domain/RealTimeDataT.java | 22 ---- .../intc/tdengine/mapper/DataDemoMapper.java | 20 ---- .../intc/tdengine/mapper/TdEngineMapper.java | 52 ++++++-- .../tdengine/service/DataDemoService.java | 112 ------------------ .../tdengine/service/TdEngineService.java | 55 +++------ .../src/main/resources/bootstrap.yml | 12 +- .../db/migration/V20230315173120__empty.sql | 0 .../mapper/tdengine/DataDemoMapper.xml | 21 ---- .../mapper/tdengine/TdEngineMapper.xml | 89 +++++++------- .../weixin/controller/WeChatController.java | 96 +++++++++------ 15 files changed, 220 insertions(+), 399 deletions(-) delete mode 100644 intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/DataDemoController.java create mode 100644 intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/domain/DeviceSensorData.java delete mode 100644 intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/domain/RealTimeDataT.java delete mode 100644 intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/DataDemoMapper.java delete mode 100644 intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/DataDemoService.java delete mode 100644 intc-modules/intc-tdengine/src/main/resources/db/migration/V20230315173120__empty.sql delete mode 100644 intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/DataDemoMapper.xml diff --git a/intc-modules/intc-iot/src/main/resources/bootstrap.yml b/intc-modules/intc-iot/src/main/resources/bootstrap.yml index 7375f36..a2bad30 100644 --- a/intc-modules/intc-iot/src/main/resources/bootstrap.yml +++ b/intc-modules/intc-iot/src/main/resources/bootstrap.yml @@ -39,6 +39,15 @@ spring: # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + +# 管理端点配置 +management: + health: + db: + enabled: false # 临时禁用数据库健康检查 + endpoint: + health: + show-details: always # 用于服务监控可在线查看日志,该配置用于生产环境 logging: file: diff --git a/intc-modules/intc-tdengine/pom.xml b/intc-modules/intc-tdengine/pom.xml index ff7979b..9e2b9e1 100644 --- a/intc-modules/intc-tdengine/pom.xml +++ b/intc-modules/intc-tdengine/pom.xml @@ -44,12 +44,6 @@ org.springframework.boot spring-boot-starter-security - - - io.springfox - springfox-swagger-ui - ${swagger.fox.version} - @@ -87,27 +81,10 @@ intc-common-swagger - - - org.flywaydb - flyway-core - com.taosdata.jdbc taos-jdbcdriver - 3.0.2 - - - com.intc - intc-api-tdengine - 3.6.3 - compile - - - com.intc - intc-api-iot-basics - 3.6.3 - compile + 2.0.38 diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/DataDemoController.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/DataDemoController.java deleted file mode 100644 index 1cc6c2f..0000000 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/DataDemoController.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.intc.tdengine.controller; - - -import com.intc.common.core.web.controller.BaseController; -import com.intc.tdengine.service.DataDemoService; -import io.swagger.annotations.Api; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * TDEngine监控数据信息Controller - * - * @author YaphetS - * @date 2023-03-13 - */ -@Api(tags="TDEngine监控数据") -@RestController -@RequestMapping("/data/demo") -public class DataDemoController extends BaseController -{ - @Autowired - private DataDemoService dataService; - - @GetMapping("/send") - public String send(){ - dataService.dataDemo(); - return "SUCESS"; - } -} diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/TdEngineController.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/TdEngineController.java index bdb430e..f8fb096 100644 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/TdEngineController.java +++ b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/TdEngineController.java @@ -1,16 +1,13 @@ package com.intc.tdengine.controller; -import com.intc.api.tdengine.domain.DataAvdVo; -import com.intc.api.tdengine.domain.DataDto; -import com.intc.api.tdengine.domain.RealDataVo; + import com.intc.common.core.web.controller.BaseController; +import com.intc.common.core.web.domain.AjaxResult; +import com.intc.tdengine.domain.DeviceSensorData; import com.intc.tdengine.service.TdEngineService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; @@ -30,31 +27,29 @@ public class TdEngineController extends BaseController @Resource private TdEngineService tdEngineService; + @GetMapping("/getLastData") + public List getLastData() + { + return tdEngineService.getLastData(); + } + /** - * 查询TDEngine监控数据列表 + * 批量插入设备传感器数据 */ - @ApiOperation(value="按类型查询对应点最新数据的平均值和最大最小值") - @PostMapping("/selectMaxMinAvgData") - public DataAvdVo selectMaxMinAvgData(@RequestParam(value = "tagTypeId") String tagTypeId) + @PostMapping("/batchInsert") + @ApiOperation(value = "批量插入设备传感器数据", notes = "批量插入TDEngine监控数据") + public AjaxResult batchInsertData(@RequestBody List dataList) { - return tdEngineService.selectMaxMinAvgData(tagTypeId); - } - @ApiOperation(value="按类型查询对应点最新数据的平均值和最大最小值") - @PostMapping("/selectDataListToMap") - public Map selectDataListToMap(DataDto dataDto) - { - return tdEngineService.selectDataListToMap(dataDto); - } - @ApiOperation(value="查询最新数据") - @PostMapping("/getLastData") - public RealDataVo getLastData(@RequestParam(value = "tagId") String tagId) - { - return tdEngineService.getLastData(tagId); - } - @ApiOperation(value="查询历史数据") - @PostMapping("/getHistoryData") - public List getHistoryData(@RequestParam(value = "tagId") String tagId, @RequestParam(value = "startTime") String startTime, @RequestParam(value = "endTime") String endTime) - { - return tdEngineService.getHistoryData(tagId,startTime,endTime); + if (dataList == null || dataList.isEmpty()) { + return AjaxResult.error("数据列表不能为空"); + } + try { + tdEngineService.batchInsertDeviceSensorData(dataList); + return AjaxResult.success("成功插入 " + dataList.size() + " 条数据"); + } catch (Exception e) { + logger.error("批量插入数据失败", e); + return AjaxResult.error("批量插入数据失败: " + e.getMessage()); + } } + } diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/domain/DeviceSensorData.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/domain/DeviceSensorData.java new file mode 100644 index 0000000..7b8f103 --- /dev/null +++ b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/domain/DeviceSensorData.java @@ -0,0 +1,20 @@ +package com.intc.tdengine.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@NoArgsConstructor // 生成无参构造方法 +@AllArgsConstructor // 生成全参构造方法 +public class DeviceSensorData { + + // 测量字段(随时间变化的数值) + private String time; // 时序主键时间戳 + private String createTime; // 数据创建时间 + private Double longitude; // 经度 + private Double latitude; // 纬度 + // 标签字段(元数据,不随时间频繁变化) + private String deviceId; // 设备序列号 +} diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/domain/RealTimeDataT.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/domain/RealTimeDataT.java deleted file mode 100644 index 910f5d9..0000000 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/domain/RealTimeDataT.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.intc.tdengine.domain; - -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -/** - * @author 22024089 - */ -@Data -public class RealTimeDataT implements Serializable { - - private String tagId; - private String buildingId; - private String valueType; - private String tagShowType; - private String deviceId; - private String tagTypeId; - private Date dataTime; - private String val; -} diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/DataDemoMapper.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/DataDemoMapper.java deleted file mode 100644 index 8e19a59..0000000 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/DataDemoMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.intc.tdengine.mapper; - - -import com.intc.tdengine.domain.RealTimeDataT; - -/** - * @author 22024089 - */ -public interface DataDemoMapper { - /** - * 新增实时数据 - * - * @param realTimeData 实时数据信息 - * @return 结果 - */ - - public int insertRealTimeDataT(RealTimeDataT realTimeData); - - public int createTableT(RealTimeDataT realTimeData); -} diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/TdEngineMapper.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/TdEngineMapper.java index abecd53..c525b17 100644 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/TdEngineMapper.java +++ b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/TdEngineMapper.java @@ -1,8 +1,7 @@ package com.intc.tdengine.mapper; -import com.intc.api.tdengine.domain.DataAvdVo; -import com.intc.api.tdengine.domain.DataDto; -import com.intc.api.tdengine.domain.RealDataVo; + +import com.intc.tdengine.domain.DeviceSensorData; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -15,17 +14,50 @@ import java.util.List; */ public interface TdEngineMapper { + /** - * 点类型统计信息 + * 删除数据库 * - * @param tagTypeId 点类型ID - * @return 点类型统计信息 + * @return 结果 */ - public DataAvdVo selectMaxMinAvgData(String tagTypeId); + void dropDB(); - RealDataVo getLastData(String tagId); + /** + * 创建数据库 + * + * @return 结果 + */ + void createDB(); + + /** + * 创建超级表 + * + * @return 结果 + */ + void createSuperTable(); + + /** + * 创建子表 + * + * @param deviceSensorData 数据信息 + * @return 结果 + */ + void createTable(DeviceSensorData deviceSensorData); + + /** + * 获取最新数据 + * + * @return 结果 + */ + List getLastData(); + + /** + * 批量插入数据 + * + * @param dataList 数据列表 + * @return 影响行数 + */ + int batchInsertDeviceSensorData(@Param("dataList") List dataList); - List selectDataList(DataDto dataDto); - List getHistoryDataList(@Param("tagId") String tagId,@Param("startTime") String startTime,@Param("endTime") String endTime); } diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/DataDemoService.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/DataDemoService.java deleted file mode 100644 index 35f8f33..0000000 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/DataDemoService.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.intc.tdengine.service; - - -import com.intc.api.basics.RemoteDeviceService; -import com.intc.api.basics.domain.TagBasicInfoApiDto; -import com.intc.api.basics.domain.TagBasicInfoApiVo; -import com.intc.common.core.utils.DateUtils; -import com.intc.common.core.utils.LocalDateUtils; -import com.intc.tdengine.domain.RealTimeDataT; -import com.intc.tdengine.mapper.DataDemoMapper; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Random; - -/** - * 设备实时状态Service业务层处理 - * - * @author tianyongbao - * @date 2023-03-10 - */ -@Service -public class DataDemoService -{ - @Resource - private RemoteDeviceService remoteDeviceService; - @Resource - private DataDemoMapper dataDemoMapper; - public void dataDemo(){ - TagBasicInfoApiDto tagBasicInfoApiDto = new TagBasicInfoApiDto(); - tagBasicInfoApiDto.setIsShow("1"); - long time = DateUtils.parseDate(DateUtils.dateTimeNow("yyyy-MM-dd HH:00:00")).getTime(); - List tagBasicInfoVos = remoteDeviceService.tagListAll(tagBasicInfoApiDto).getData(); - for (TagBasicInfoApiVo tagBasicInfoVo : tagBasicInfoVos) { - for (int i = 0; i < 48; i++) { - String data="20"; - Double num=20.0; - if("1".equals(tagBasicInfoVo.getValueType())){ - data=String.valueOf((int) (Math.random()*99)/50); - - }else if("2".equals(tagBasicInfoVo.getValueType())){ - /**氧气浓度*/ - if(14==tagBasicInfoVo.getTagTypeId()){ - num=num+new Random().nextDouble()*2; - num=num-new Random().nextDouble()*2; - } /**温度*/ - else if(16==tagBasicInfoVo.getTagTypeId()){ - num=num+new Random().nextDouble()*2; - }/**湿度*/ - else if(15==tagBasicInfoVo.getTagTypeId()){ - num=45.0; - num=num-new Random().nextDouble()*2; - }/**甲烷*/ - else if(23==tagBasicInfoVo.getTagTypeId()){ - num=0.0; - }/**硫化氢*/ - else if(22==tagBasicInfoVo.getTagTypeId()){ - num=0.0; - } - /**位移*/ - else if(4==tagBasicInfoVo.getTagTypeId()){ - num=9.0; - } - /**沉降*/ - else if(5==tagBasicInfoVo.getTagTypeId()){ - num=9.0; - } - /**压力*/ - else if(7==tagBasicInfoVo.getTagTypeId()){ - num=50.0; - } - /**流量*/ - else if(8==tagBasicInfoVo.getTagTypeId()){ - num=50.0; - }else{ - num=25.0; - num=num-new Random().nextDouble()*2; - } - num=(double) Math.round(num * 100) / 100; - data= String.valueOf(num); - } - -// num=num+new Random().nextDouble()*5; - - RealTimeDataT realTimeData = new RealTimeDataT(); - realTimeData.setTagId(String.valueOf(tagBasicInfoVo.getId())); - - realTimeData.setDeviceId(tagBasicInfoVo.getDeviceId()); - realTimeData.setBuildingId(tagBasicInfoVo.getBuildingId()); - realTimeData.setTagTypeId(String.valueOf(tagBasicInfoVo.getTagTypeId())); - realTimeData.setValueType(tagBasicInfoVo.getValueType()); - realTimeData.setTagShowType(tagBasicInfoVo.getIsShow()); - realTimeData.setDataTime(LocalDateUtils.LocalDateTimetoDate(LocalDateTime.now().minusMinutes(i*30),null)); - realTimeData.setVal(data); - if(i==0){ - dataDemoMapper.createTableT(realTimeData); - } - dataDemoMapper.insertRealTimeDataT(realTimeData); - - } - } - } - - public static void main(String[] args) { - for (int i = 0; i < 100; i++) { - System.out.println(String.valueOf((int) (Math.random()*99)/50)); - } - - } -} diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/TdEngineService.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/TdEngineService.java index d3a25d9..8c0225f 100644 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/TdEngineService.java +++ b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/TdEngineService.java @@ -1,8 +1,6 @@ package com.intc.tdengine.service; -import com.intc.api.tdengine.domain.DataAvdVo; -import com.intc.api.tdengine.domain.DataDto; -import com.intc.api.tdengine.domain.RealDataVo; +import com.intc.tdengine.domain.DeviceSensorData; import com.intc.tdengine.mapper.TdEngineMapper; import org.springframework.stereotype.Service; @@ -23,44 +21,19 @@ import java.util.Map; public class TdEngineService { @Resource private TdEngineMapper tdEngineMapper; - public DataAvdVo selectMaxMinAvgData(String tagTypeId){ - DataAvdVo dataAvdVo=new DataAvdVo(); - try { - dataAvdVo= tdEngineMapper.selectMaxMinAvgData(tagTypeId); - } catch (Exception e) { - } - return dataAvdVo; - } - - public RealDataVo getLastData(String tagId) { - RealDataVo lastData=null; - try { - lastData = tdEngineMapper.getLastData(tagId); - }catch (Exception e){ - lastData=new RealDataVo(); - - } - return lastData; - } - - public Map selectDataListToMap(DataDto dataDto) { - Map map=new HashMap<>(); - List dataVoList=tdEngineMapper.selectDataList(dataDto); - if(dataVoList!=null&&dataVoList.size()>0){ - for (RealDataVo realDataVo : dataVoList) { - map.put(realDataVo.getTagId(),realDataVo.getVal()); - } - } - return map; - } - - public List getHistoryData(String tagId, String startTime, String endTime) { - List list=new ArrayList<>(); - try { - list=tdEngineMapper.getHistoryDataList(tagId,startTime,endTime); - }catch (Exception e){ - - } + public List getLastData() { + List list = new ArrayList<>(); + list = tdEngineMapper.getLastData(); return list; } + + /** + * 批量插入数据 + * + * @param dataList 数据列表 + * @return 影响行数 + */ + public void batchInsertDeviceSensorData(List dataList) { + tdEngineMapper.batchInsertDeviceSensorData(dataList); + } } diff --git a/intc-modules/intc-tdengine/src/main/resources/bootstrap.yml b/intc-modules/intc-tdengine/src/main/resources/bootstrap.yml index 11e6613..cb31f5e 100644 --- a/intc-modules/intc-tdengine/src/main/resources/bootstrap.yml +++ b/intc-modules/intc-tdengine/src/main/resources/bootstrap.yml @@ -14,13 +14,17 @@ spring: nacos: discovery: namespace: intc - # 服务注册地址 - server-addr: 101.126.95.100:8858 - group: dev + username: nacos + password: ZmNDMacAng + # 配置中心地址 + server-addr: 172.16.0.4:8858 + group: intc config: namespace: intc + username: nacos + password: ZmNDMacAng # 配置中心地址 - server-addr: 101.126.95.100:8858 + server-addr: 172.16.0.4:8858 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/intc-modules/intc-tdengine/src/main/resources/db/migration/V20230315173120__empty.sql b/intc-modules/intc-tdengine/src/main/resources/db/migration/V20230315173120__empty.sql deleted file mode 100644 index e69de29..0000000 diff --git a/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/DataDemoMapper.xml b/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/DataDemoMapper.xml deleted file mode 100644 index 957a080..0000000 --- a/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/DataDemoMapper.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - create table if not exists - pg_d.t${tagId} - USING pg_d.pg_monitor_data(buildingId,valueType,tagId,deviceId,tagShowType,tagTypeId) - TAGS (#{buildingId}, #{valueType}, #{tagId}, #{deviceId}, #{tagShowType}, #{tagTypeId}) - - - insert into pg_d.t${tagId} VALUES (#{dataTime},NOW, #{val}); - - - create table if not exists - pg_d.pg_monitor_data(time timestamp,createTime timestamp, val nchar(100)) - tags(buildingId nchar(100),valueType nchar(10), tagId nchar(100),deviceId nchar(100),tagShowType nchar(50),tagTypeId nchar(100)) - - diff --git a/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/TdEngineMapper.xml b/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/TdEngineMapper.xml index 0ade46d..b68f995 100644 --- a/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/TdEngineMapper.xml +++ b/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/TdEngineMapper.xml @@ -3,55 +3,52 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - + select last_row(time,createTime,longitude,latitude),deviceId from bds.sensor_data time>=now-1d - AND tagid=#{tagId} - AND deviceid=#{deviceId} - AND buildingId=#{buildingId} - AND tagTypeId=#{tagTypeId} - - group by tagid - - + + + insert into + + `bds`.t_#{data.deviceId} + + using bds.sensor_data + + tags(#{data.deviceId}) + + (time, createTime, longitude, latitude) values (#{data.time}, ${data.createTime}, ${data.longitude}, ${data.latitude}) + + + + + + create table if not exists + + `bds`.t_#{deviceId} + + using bds.sensor_data + + tags(#{deviceId}) + diff --git a/intc-modules/intc-weixin/src/main/java/com/intc/weixin/controller/WeChatController.java b/intc-modules/intc-weixin/src/main/java/com/intc/weixin/controller/WeChatController.java index ce442d6..322f5b1 100644 --- a/intc-modules/intc-weixin/src/main/java/com/intc/weixin/controller/WeChatController.java +++ b/intc-modules/intc-weixin/src/main/java/com/intc/weixin/controller/WeChatController.java @@ -1,58 +1,78 @@ package com.intc.weixin.controller; -import com.intc.weixin.utils.CheckUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; +import com.intc.common.core.web.domain.AjaxResult; +import com.intc.weixin.entity.WxUser; +import com.intc.weixin.service.WxUserService; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.UnsupportedEncodingException; +import com.intc.weixin.entity.WxOpenDataDTO; +import com.intc.weixin.utils.ThirdSessionHolder; /** - * 业务模块 - * - * @author tianyongbao - * @date 2025/1/8 - */ - -/** - * 服务器验证 + * 微信小程序接口 * * @author tianyongbao * @date 2025/1/8 */ @RestController @AllArgsConstructor -@RequestMapping("/api") -@Api(tags = "对接微信模块") +@RequestMapping("/weixin/api") +@Api(tags = "微信小程序接口") public class WeChatController { - /** - * 功能描述: 签名校验 - */ - @GetMapping("/wx") - @ApiOperation(value = "签名校验", notes = "签名校验") - public void login(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException { - request.setCharacterEncoding("UTF-8"); - String signature = request.getParameter("signature"); - String timestamp = request.getParameter("timestamp"); - String nonce = request.getParameter("nonce"); - String echostr = request.getParameter("echostr"); - PrintWriter out = null; + private final WxUserService wxUserService; + + @PostMapping("/ma/wxuser/login") + @ApiOperation(value = "微信小程序登录", notes = "通过 appId + jsCode 进行登录,返回 thirdSession") + public AjaxResult loginMini(@RequestParam("appId") String appId, + @RequestParam("jsCode") String jsCode) { + if (StringUtils.isBlank(appId) || StringUtils.isBlank(jsCode)) { + return AjaxResult.error("appId 或 jsCode 不能为空"); + } try { - out = response.getWriter(); - if (CheckUtil.checkSignature(signature, timestamp, nonce)) { - out.write(echostr); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - out.close(); + WxUser wxUser = wxUserService.loginMa(appId, jsCode); + return AjaxResult.success(wxUser); + } catch (WxErrorException e) { + return AjaxResult.error(e.getMessage()); + } catch (Exception e) { + return AjaxResult.error("登录失败,请稍后重试"); + } + } + + @PostMapping("/ma/wxuser/decrypt-save") + @ApiOperation(value = "小程序用户信息解密并保存", notes = "通过 encryptedData + iv 解密用户信息,并保存到数据库") + public AjaxResult decryptAndSaveMaUser(@RequestParam("appId") String appId, + @RequestParam("encryptedData") String encryptedData, + @RequestParam("iv") String iv, + @RequestParam(value = "rawData", required = false) String rawData, + @RequestParam(value = "signature", required = false) String signature) { + if (StringUtils.isBlank(appId) || StringUtils.isBlank(encryptedData) || StringUtils.isBlank(iv)) { + return AjaxResult.error("appId、encryptedData 或 iv 不能为空"); + } + try { + // 从 ThirdSession 中获取用户ID与会话密钥 + String userId = ThirdSessionHolder.getWxUserId(); + String sessionKey = ThirdSessionHolder.getThirdSession().getSessionKey(); + + WxOpenDataDTO dto = new WxOpenDataDTO(); + dto.setAppId(appId); + dto.setUserId(userId); + dto.setEncryptedData(encryptedData); + dto.setIv(iv); + dto.setRawData(rawData); + dto.setSignature(signature); + dto.setSessionKey(sessionKey); + + WxUser wxUser = wxUserService.saveOrUptateWxUser(dto); + return AjaxResult.success(wxUser); + } catch (Exception e) { + return AjaxResult.error("解密失败或保存异常,请稍后重试"); } } }