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