From 14fcda5bc8f77d6013ff057b10b19f3529a938bd Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期四, 18 九月 2025 09:00:59 +0800
Subject: [PATCH] AI对接

---
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/H5AICallbackController.java     |   64 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysInspectionMapper.java            |   13 +
 ruoyi-system/src/main/resources/mapper/system/TSysInspectionMapper.xml                  |   18 +
 ruoyi-admin/src/test/java/com/ruoyi/web/test/BaseTest.java                              |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysAiConfigMapper.java              |   16 +
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java          |   28 --
 ruoyi-system/src/main/java/com/ruoyi/system/model/TSysAiConfig.java                     |   54 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/model/TSysInspection.java                   |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysInspectionVO.java                    |   15 +
 ruoyi-system/src/main/resources/mapper/system/TSysAiConfigMapper.xml                    |   20 +
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysInspectionController.java   |   63 +++++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysAiConfigController.java     |   20 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysInspectionServiceImpl.java |   31 ++
 ruoyi-system/src/main/java/com/ruoyi/system/utils/util/RsaSimpleUtil.java               |  105 +++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/query/TSysInspectionQuery.java              |   15 +
 generator/src/test/java/com/xizang/CodeGeneratorTests.java                              |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TSysInspectionService.java          |   10 
 ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java                     |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TSysAiConfigService.java            |   16 +
 ruoyi-system/src/main/java/com/ruoyi/system/utils/util/AesSimpleUtil.java               |   55 +++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java        |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/util/H5AIUtil.java                    |   47 ++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAiConfigController.java      |   20 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAiConfigServiceImpl.java   |   20 +
 24 files changed, 624 insertions(+), 30 deletions(-)

diff --git a/generator/src/test/java/com/xizang/CodeGeneratorTests.java b/generator/src/test/java/com/xizang/CodeGeneratorTests.java
index f5c8687..f95e7af 100644
--- a/generator/src/test/java/com/xizang/CodeGeneratorTests.java
+++ b/generator/src/test/java/com/xizang/CodeGeneratorTests.java
@@ -144,7 +144,7 @@
 //         strategy.setTablePrefix(pc.getModuleName() + "");
 //        strategy.setLikeTable(new LikeTable("room"));
         //strategy.setLikeTable(new LikeTable("member"));
-        strategy.setLikeTable(new LikeTable("t_sys_obs_config"));// 生成表名
+        strategy.setLikeTable(new LikeTable("t_sys_ai_config"));// 生成表名
 //        strategy.setLikeTable(new LikeTable("t_hotel"));// 生成表名
 //        strategy.setLikeTable(new LikeTable("t_scan_message"));// 生成表名
 //        strategy.setNotLikeTable(new LikeTable("hotel_info"));// 不生成表名
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAiConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAiConfigController.java
new file mode 100644
index 0000000..c360e85
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAiConfigController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.web.controller.api;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * AI应用配置 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-09-17
+ */
+@RestController
+@RequestMapping("/t-sys-ai-config")
+public class TSysAiConfigController {
+
+}
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index e49d32b..d5cf97c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -53,7 +53,7 @@
      */
     @ApiOperation(value = "获取用户列表")
     @PostMapping("/list")
-    @PreAuthorize("@ss.hasPermi('system:user')")
+//    @PreAuthorize("@ss.hasPermi('system:user')")
     public AjaxResult list(@RequestBody SysUserQuery query)
     {
         Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
@@ -66,8 +66,7 @@
 
     @ApiOperation(value = "获取用户列表-不分页")
     @PostMapping("/listNotPage")
-    @PreAuthorize("@ss.hasPermi('system:user')")
-
+//    @PreAuthorize("@ss.hasPermi('system:user')")
     public AjaxResult listNotPage()
     {
         List<SysUser> list = userService.selectList();
diff --git a/ruoyi-admin/src/test/java/com/ruoyi/web/test/BaseTest.java b/ruoyi-admin/src/test/java/com/ruoyi/web/test/BaseTest.java
index fac164a..53a9865 100644
--- a/ruoyi-admin/src/test/java/com/ruoyi/web/test/BaseTest.java
+++ b/ruoyi-admin/src/test/java/com/ruoyi/web/test/BaseTest.java
@@ -10,6 +10,7 @@
 //import com.ruoyi.system.mapper.SysRoleMenuMapper;
 //import com.ruoyi.system.service.ISysMenuService;
 //import com.ruoyi.system.service.ISysRoleService;
+//import com.ruoyi.system.utils.util.H5AIUtil;
 //import com.tencentcloudapi.cws.v20180312.models.Site;
 //import lombok.extern.slf4j.Slf4j;
 //import org.junit.jupiter.api.Test;
@@ -788,5 +789,12 @@
 //		roleMenuMapper.batchRoleMenu(sysRoleMenus2);
 //
 //	}
+//    @Autowired
+//    private H5AIUtil h5AIUtil;
+//    @Test
+//    public void test(){
+//        String accessToken = h5AIUtil.getAccessToken();
+//        System.err.println(accessToken);
+//    }
 //
 //}
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/H5AICallbackController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/H5AICallbackController.java
new file mode 100644
index 0000000..4f96978
--- /dev/null
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/H5AICallbackController.java
@@ -0,0 +1,64 @@
+package com.ruoyi.web.controller.api;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.framework.web.service.SysLoginService;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.model.TSysAiConfig;
+import com.ruoyi.system.service.TSysAiConfigService;
+import com.ruoyi.system.service.TSysAppUserService;
+import com.ruoyi.system.utils.util.AesSimpleUtil;
+import com.ruoyi.system.utils.util.RsaSimpleUtil;
+import com.ruoyi.system.utils.wx.model.WeixinProperties;
+import com.ruoyi.system.utils.wx.tools.WxAppletTools;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  微信小程序登录 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2024-08-06
+ */
+@Slf4j
+@RestController
+@RequestMapping("/aiCallback")
+public class H5AICallbackController {
+
+    @Autowired
+    private TSysAiConfigService sysAiConfigService;
+
+    @PostMapping("/reportReturn")
+    public String reportReturn(String encryptedJson, String signEncryptedJson) throws Exception {
+        TSysAiConfig sysAiConfig = sysAiConfigService.getById(1);
+        // 应用AES秘钥
+        String aesKey = sysAiConfig.getAesKey();
+        // 平台RSA公钥
+        String rsaPublicKey = sysAiConfig.getRsaPublicKey();
+
+        // 1. 先解密
+        String source = AesSimpleUtil.decrypt(encryptedJson, aesKey);
+        JSONObject jsonObject = JSONObject.parseObject(source);
+
+        // 2. 再验证签名
+        String signSource = String.format("%s_%s",
+                jsonObject.getString("thirdId"),
+                jsonObject.getString("time"));
+        boolean verify = RsaSimpleUtil.verify(signSource, signEncryptedJson, rsaPublicKey);
+        if (!verify) {
+            return "error";
+        }
+        // 3. 验证成功,则仅仅业务保存并返回success字符串
+        return "success";
+    }
+
+}
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysAiConfigController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysAiConfigController.java
new file mode 100644
index 0000000..c360e85
--- /dev/null
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysAiConfigController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.web.controller.api;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * AI应用配置 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-09-17
+ */
+@RestController
+@RequestMapping("/t-sys-ai-config")
+public class TSysAiConfigController {
+
+}
+
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysInspectionController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysInspectionController.java
new file mode 100644
index 0000000..fac9e6b
--- /dev/null
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysInspectionController.java
@@ -0,0 +1,63 @@
+package com.ruoyi.web.controller.api;
+
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.model.TSysInspection;
+import com.ruoyi.system.query.TSysInspectionQuery;
+import com.ruoyi.system.service.TSysInspectionService;
+import com.ruoyi.system.vo.TSysInspectionVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户检测信息 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-08-20
+ */
+@Api(tags = "用户检测信息管理")
+@RestController
+@RequestMapping("/t-sys-inspection")
+public class TSysInspectionController {
+
+    private final TSysInspectionService sysInspectionService;
+    private final TokenService tokenService;
+    @Autowired
+    public TSysInspectionController(TSysInspectionService sysInspectionService, TokenService tokenService) {
+        this.sysInspectionService = sysInspectionService;
+        this.tokenService = tokenService;
+    }
+
+    /**
+     * 获取用户检测信息管理管理列表
+     */
+    @ApiOperation(value = "获取用户检测信息管理分页列表")
+    @PostMapping(value = "/pageList")
+    public R<PageInfo<TSysInspectionVO>> pageList(@RequestBody TSysInspectionQuery query) {
+        String userId = tokenService.getLoginUserApplet().getUserId();
+        query.setAppUserId(userId);
+        return R.ok(sysInspectionService.pageList(query));
+    }
+    /**
+     * 查看用户检测信息管理详情
+     */
+    @ApiOperation(value = "查看用户检测信息管理详情")
+    @GetMapping(value = "/getDetailById")
+    public R<TSysInspection> getDetailById(@RequestParam String id) {
+        return R.ok(sysInspectionService.getById(id));
+    }
+
+}
+
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
index 8ee5c97..a7c591a 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
@@ -1,42 +1,20 @@
 package com.ruoyi.web.controller.api;
 
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.core.domain.entity.SysRole;
-import com.ruoyi.common.core.domain.entity.TSysUserResp;
-import com.ruoyi.common.core.domain.model.LoginBody;
-import com.ruoyi.common.core.domain.model.LoginUser;
-import com.ruoyi.common.core.domain.model.LoginUserApplet;
-import com.ruoyi.common.core.utils.HttpUtils;
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.framework.web.service.SysLoginService;
 import com.ruoyi.framework.web.service.TokenService;
-import com.ruoyi.system.model.TSysAppUser;
 import com.ruoyi.system.service.TSysAppUserService;
-import com.ruoyi.system.utils.wx.body.resp.Code2SessionRespBody;
-import com.ruoyi.system.utils.wx.body.resq.Code2SessionResqBody;
 import com.ruoyi.system.utils.wx.model.WeixinProperties;
-import com.ruoyi.system.utils.wx.pojo.AppletUserDecodeData;
-import com.ruoyi.system.utils.wx.pojo.AppletUserEncrypteData;
 import com.ruoyi.system.utils.wx.tools.WxAppletTools;
-import com.ruoyi.system.utils.wx.tools.WxUtils;
-import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 /**
  * <p>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
index 9155474..3d2fb69 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -166,4 +166,8 @@
      * 直播推送
      */
     public static final String LIVE_APPOINTMENT_PUSH = "live:appointmentPush:";
+    /**
+     * 直播推送
+     */
+    public static final String H5AI_ACCESS_TOKEN = "h5ai_accessToken:";
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysAiConfigMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysAiConfigMapper.java
new file mode 100644
index 0000000..d50d054
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysAiConfigMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.TSysAiConfig;
+
+/**
+ * <p>
+ * AI应用配置 Mapper 接口
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-09-17
+ */
+public interface TSysAiConfigMapper extends BaseMapper<TSysAiConfig> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysInspectionMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysInspectionMapper.java
index 743e69c..03a6e6c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysInspectionMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysInspectionMapper.java
@@ -1,7 +1,13 @@
 package com.ruoyi.system.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TSysInspection;
+import com.ruoyi.system.query.TSysInspectionQuery;
+import com.ruoyi.system.vo.TSysInspectionVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +19,11 @@
  */
 public interface TSysInspectionMapper extends BaseMapper<TSysInspection> {
 
+    /**
+     * 获取用户检测信息管理分页列表
+     *
+     * @param query 查询参数
+     * @return List<TSysInspectionVO>
+     */
+    List<TSysInspectionVO> pageList(@Param("query") TSysInspectionQuery query, @Param("pageInfo")PageInfo<TSysInspectionVO> pageInfo);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysAiConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysAiConfig.java
new file mode 100644
index 0000000..690b30a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysAiConfig.java
@@ -0,0 +1,54 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * AI应用配置
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-09-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_sys_ai_config")
+@ApiModel(value="TSysAiConfig对象", description="AI应用配置")
+public class TSysAiConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "应用ID")
+    @TableField("devId")
+    private String devId;
+
+    @ApiModelProperty(value = "应用秘钥")
+    @TableField("devSecret")
+    private String devSecret;
+
+    @ApiModelProperty(value = "应用RSA公钥")
+    @TableField("devRsaPublicKey")
+    private String devRsaPublicKey;
+
+    @ApiModelProperty(value = "平台RSA公钥")
+    @TableField("rsaPublicKey")
+    private String rsaPublicKey;
+
+    @ApiModelProperty(value = "应用aesKey")
+    @TableField("aesKey")
+    private String aesKey;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysInspection.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysInspection.java
index b738d84..dfdca23 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysInspection.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TSysInspection.java
@@ -112,4 +112,9 @@
     @ApiModelProperty(value = "风险疾病名称")
     @TableField("disease_risks")
     private String diseaseRisks;
+
+    @ApiModelProperty(value = "是否已支付 1=是 0=否")
+    @TableField("is_pay")
+    private Integer isPay;
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysInspectionQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysInspectionQuery.java
new file mode 100644
index 0000000..6d1ddcd
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TSysInspectionQuery.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "用户检测信息管理查询参数query")
+public class TSysInspectionQuery extends BasePage {
+
+    @ApiModelProperty(value = "用户id")
+    private String appUserId;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysAiConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysAiConfigService.java
new file mode 100644
index 0000000..50b213a
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysAiConfigService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.TSysAiConfig;
+
+/**
+ * <p>
+ * AI应用配置 服务类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-09-17
+ */
+public interface TSysAiConfigService extends IService<TSysAiConfig> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysInspectionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysInspectionService.java
index fb2aaaa..6cce613 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysInspectionService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TSysInspectionService.java
@@ -1,7 +1,10 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TSysInspection;
+import com.ruoyi.system.query.TSysInspectionQuery;
+import com.ruoyi.system.vo.TSysInspectionVO;
 
 /**
  * <p>
@@ -13,4 +16,11 @@
  */
 public interface TSysInspectionService extends IService<TSysInspection> {
 
+    /**
+     * 获取用户检测信息分页列表
+     *
+     * @param query 查询参数
+     * @return PageInfo<TSysInspection>
+     */
+    PageInfo<TSysInspectionVO> pageList(TSysInspectionQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAiConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAiConfigServiceImpl.java
new file mode 100644
index 0000000..0a7fc50
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAiConfigServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.TSysAiConfigMapper;
+import com.ruoyi.system.model.TSysAiConfig;
+import com.ruoyi.system.service.TSysAiConfigService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * AI应用配置 服务实现类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-09-17
+ */
+@Service
+public class TSysAiConfigServiceImpl extends ServiceImpl<TSysAiConfigMapper, TSysAiConfig> implements TSysAiConfigService {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysInspectionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysInspectionServiceImpl.java
index 941f3ed..154533f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysInspectionServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysInspectionServiceImpl.java
@@ -1,10 +1,22 @@
 package com.ruoyi.system.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.mapper.TCrmClinicMapper;
+import com.ruoyi.system.model.TCrmClinic;
 import com.ruoyi.system.model.TSysInspection;
 import com.ruoyi.system.mapper.TSysInspectionMapper;
+import com.ruoyi.system.query.TSysInspectionQuery;
 import com.ruoyi.system.service.TSysInspectionService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.vo.SysOperLogVO;
+import com.ruoyi.system.vo.TSysInspectionVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -17,4 +29,23 @@
 @Service
 public class TSysInspectionServiceImpl extends ServiceImpl<TSysInspectionMapper, TSysInspection> implements TSysInspectionService {
 
+    @Autowired
+    private TCrmClinicMapper crmClinicMapper;
+
+    @Override
+    public PageInfo<TSysInspectionVO> pageList(TSysInspectionQuery query) {
+        PageInfo<TSysInspectionVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
+        List<TSysInspectionVO> list = this.baseMapper.pageList(query,pageInfo);
+        if(CollectionUtils.isEmpty(list)){
+            return pageInfo;
+        }
+        List<String> clinicId = list.stream().map(TSysInspectionVO::getClinicId).collect(Collectors.toList());
+        List<TCrmClinic> crmClinics = crmClinicMapper.selectList(Wrappers.lambdaQuery(TCrmClinic.class)
+                .in(TCrmClinic::getId, clinicId));
+        for (TSysInspectionVO tSysInspectionVO : list) {
+            crmClinics.stream().filter(t -> t.getId().equals(tSysInspectionVO.getClinicId())).findFirst().ifPresent(t -> tSysInspectionVO.setClinicName(t.getClinicName()));
+        }
+        pageInfo.setRecords(list);
+        return pageInfo;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/AesSimpleUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/AesSimpleUtil.java
new file mode 100644
index 0000000..ba67e83
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/AesSimpleUtil.java
@@ -0,0 +1,55 @@
+package com.ruoyi.system.utils.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+/**
+ * aes工具类
+ *
+ * @author xuwenbing
+ * @date 2019-06-12
+ */
+public class AesSimpleUtil {
+    // 对于Java中AES的默认模式是:AES/ECB/PKCS5Padding
+    private static final String AES = "AES";
+
+    /**
+     * 加密
+     *
+     * @param source    源字符串
+     * @param keyBase64 keyBase64
+     * @return 加密的字符串
+     * @throws Exception
+     */
+    public static String encrypt(String source, String keyBase64) throws Exception {
+        // 获取secretKey
+        byte[] keyBytes = Base64.getDecoder().decode(keyBase64.getBytes(StandardCharsets.UTF_8));
+        SecretKeySpec secretKey = new SecretKeySpec(keyBytes, AES);
+        // 数据加密
+        Cipher cipher = Cipher.getInstance(AES);
+        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+        byte[] encryptBytes = cipher.doFinal(source.getBytes(StandardCharsets.UTF_8));
+        return Base64.getEncoder().encodeToString(encryptBytes);
+    }
+
+    /**
+     * 解密
+     *
+     * @param encrypted 加密的字符串
+     * @param keyBase64 keyBase64
+     * @return 源字符串
+     * @throws Exception
+     */
+    public static String decrypt(String encrypted, String keyBase64) throws Exception {
+        // 获取secretKey
+        byte[] keyBytes = Base64.getDecoder().decode(keyBase64.getBytes(StandardCharsets.UTF_8));
+        SecretKeySpec secretKey = new SecretKeySpec(keyBytes, AES);
+        // 数据解密
+        Cipher cipher = Cipher.getInstance(AES);
+        cipher.init(Cipher.DECRYPT_MODE, secretKey);
+        byte[] decryptBytes = cipher.doFinal(Base64.getDecoder().decode(encrypted));
+        return new String(decryptBytes, StandardCharsets.UTF_8);
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/H5AIUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/H5AIUtil.java
new file mode 100644
index 0000000..3ebd8a9
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/H5AIUtil.java
@@ -0,0 +1,47 @@
+package com.ruoyi.system.utils.util;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.exception.ServiceException;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.http.HttpUtils;
+import com.ruoyi.system.model.TSysAiConfig;
+import com.ruoyi.system.service.TSysAiConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Component
+public class H5AIUtil {
+
+    @Autowired
+    private TSysAiConfigService sysAiConfigService;
+    @Autowired
+    private RedisCache redisCache;
+
+    public static final String H5_AI_URL = "https://www.ai-tongue.com/backend/auth/invoker/pwd/signin";
+
+    public String getAccessToken() {
+        String accessToken = redisCache.getCacheObject(Constants.H5AI_ACCESS_TOKEN);
+        if(StringUtils.hasLength(accessToken)){
+            return accessToken;
+        }
+        TSysAiConfig sysAiConfig = sysAiConfigService.getById(1);
+        String result = HttpUtils.sendPost(H5_AI_URL, "devid="+sysAiConfig.getDevId()+"&devsecret="+sysAiConfig.getDevSecret());
+        log.info("获取access_token:{}", result);
+        JSONObject object = JSONObject.parseObject(result);
+        if(object.getInteger("code") != 0){
+            throw new ServiceException(object.getString("msg"));
+        }
+        JSONObject data = object.getJSONObject("data");
+        accessToken = data.getString("access_token");
+        Integer expiresIn = data.getInteger("expires_in");
+        redisCache.setCacheObject(Constants.H5AI_ACCESS_TOKEN, accessToken, expiresIn-20, TimeUnit.SECONDS);
+        return accessToken;
+    }
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/RsaSimpleUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/RsaSimpleUtil.java
new file mode 100644
index 0000000..053cf5c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/util/RsaSimpleUtil.java
@@ -0,0 +1,105 @@
+package com.ruoyi.system.utils.util;
+
+import javax.crypto.Cipher;
+import java.nio.charset.StandardCharsets;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+
+/**
+ * rsa工具类
+ *
+ * @author xuwenbing
+ * @date 2019-06-12
+ */
+public class RsaSimpleUtil {
+    private static final String RSA = "RSA";
+    private static final String MD5withRSA = "MD5withRSA";
+
+    /**
+     * 加密
+     *
+     * @param source
+     * @param publicKeyBase64
+     * @return
+     */
+    public static String encrypt(String source, String publicKeyBase64) throws Exception {
+        // 获取publicKey
+        byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyBase64.getBytes(StandardCharsets.UTF_8));
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+        PublicKey publicKey = keyFactory.generatePublic(keySpec);
+        // 数据加密
+        Cipher cipher = Cipher.getInstance(RSA);
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+        byte[] encryptBytes = cipher.doFinal(source.getBytes(StandardCharsets.UTF_8));
+        return Base64.getEncoder().encodeToString(encryptBytes);
+    }
+
+    /**
+     * 解密
+     *
+     * @param encrypted
+     * @param privateKeyBase64
+     * @return
+     */
+    public static String decrypt(String encrypted, String privateKeyBase64) throws Exception {
+        // 获取privateKey
+        byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyBase64.getBytes(StandardCharsets.UTF_8));
+        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
+        // 解密数据
+        Cipher cipher = Cipher.getInstance(RSA);
+        cipher.init(Cipher.DECRYPT_MODE, privateKey);
+        byte[] decryptBytes = cipher.doFinal(Base64.getDecoder().decode(encrypted));
+        return new String(decryptBytes, StandardCharsets.UTF_8);
+    }
+
+    /**
+     * 签名
+     *
+     * @param source
+     * @param privateKeyBase64
+     * @return
+     */
+    public static String sign(String source, String privateKeyBase64) throws Exception {
+        // 获取privateKey
+        byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyBase64.getBytes(StandardCharsets.UTF_8));
+        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
+        // 签名
+        Signature signature = Signature.getInstance(MD5withRSA);
+        signature.initSign(privateKey);
+        signature.update(source.getBytes(StandardCharsets.UTF_8));
+        byte[] signed = signature.sign();
+        return Base64.getEncoder().encodeToString(signed);
+    }
+
+    /**
+     * 验签
+     *
+     * @param source
+     * @param signed
+     * @param publicKeyBase64
+     * @return
+     */
+    public static boolean verify(String source, String signed, String publicKeyBase64) throws Exception {
+        // 获取publicKey
+        byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyBase64.getBytes(StandardCharsets.UTF_8));
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(RSA);
+        PublicKey publicKey = keyFactory.generatePublic(keySpec);
+        // 验签
+        Signature signature = Signature.getInstance(MD5withRSA);
+        signature.initVerify(publicKey);
+        signature.update(source.getBytes(StandardCharsets.UTF_8));
+        boolean verify = signature.verify(Base64.getDecoder().decode(signed));
+        return verify;
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysInspectionVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysInspectionVO.java
new file mode 100644
index 0000000..0a20df0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysInspectionVO.java
@@ -0,0 +1,15 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.system.model.TSysInspection;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "用户检测信息管理VO")
+public class TSysInspectionVO extends TSysInspection {
+
+    @ApiModelProperty(value = "诊所名称")
+    private String clinicName;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysAiConfigMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysAiConfigMapper.xml
new file mode 100644
index 0000000..6ac8ab9
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysAiConfigMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.TSysAiConfigMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TSysAiConfig">
+        <id column="id" property="id" />
+        <result column="devId" property="devId" />
+        <result column="devSecret" property="devSecret" />
+        <result column="devRsaPublicKey" property="devRsaPublicKey" />
+        <result column="rsaPublicKey" property="rsaPublicKey" />
+        <result column="aesKey" property="aesKey" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, devId, devSecret, devRsaPublicKey, rsaPublicKey,aesKey
+    </sql>
+
+</mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TSysInspectionMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TSysInspectionMapper.xml
index 94f9fb8..66164fc 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TSysInspectionMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TSysInspectionMapper.xml
@@ -26,6 +26,7 @@
         <result column="symptom_name" property="symptomName" />
         <result column="tongue_feature" property="tongueFeature" />
         <result column="disease_risks" property="diseaseRisks" />
+        <result column="is_pay" property="isPay" />
         <result column="create_time" property="createTime" />
         <result column="update_time" property="updateTime" />
         <result column="create_by" property="createBy" />
@@ -35,7 +36,22 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, app_user_id,clinic_id, inspection_info, team_code, team_name, device_code, device_name, person_name, person_sex, person_age, person_phone, person_height, person_weight, check_time, pdf_url, health_index, constitution_names, symptom_name, tongue_feature, disease_risks, create_time, update_time, create_by, update_by, disabled, create_id
+        id, app_user_id,clinic_id, inspection_info, team_code, team_name, device_code, device_name, person_name,
+          person_sex, person_age, person_phone, person_height, person_weight, check_time, pdf_url, health_index,
+          constitution_names, symptom_name, tongue_feature, disease_risks,is_pay, create_time, update_time,
+          create_by, update_by, disabled, create_id
     </sql>
+    <select id="pageList" resultType="com.ruoyi.system.vo.TSysInspectionVO">
+        SELECT
+        <include refid="Base_Column_List"/>
+            FROM t_sys_inspection
+        <where>
+            <if test="query.appUserId != null and query.appUserId != ''">
+                and app_user_id = #{query.appUserId}
+            </if>
+            AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
+        </where>
+        ORDER BY create_time DESC
+    </select>
 
 </mapper>

--
Gitblit v1.7.1