瀏覽代碼

add
服务号
手机验证码登录
密码和身份信息填写
fix
小程序和服务号统一登录

18339543638 5 月之前
父節點
當前提交
a6d6d7e256
共有 15 個文件被更改,包括 221 次插入15 次删除
  1. 45 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/controller/AppUserController.java
  2. 18 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizAppUserInfoDTO.java
  3. 12 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizPainAssessmentDTO.java
  4. 17 1
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/po/BizPainAssessmentPO.java
  5. 1 1
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IBizWxUserService.java
  6. 26 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IDoctorUserService.java
  7. 7 2
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizWxUserServiceImpl.java
  8. 45 0
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/DoctorUserServiceImpl.java
  9. 3 1
      tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/config/WxAppletOauth2UserOperator.java
  10. 3 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysUserRepository.java
  11. 14 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/vo/DoctorUserHospitalVO.java
  12. 18 0
      tr-modules/tr-module-system/src/main/resources/mapper/user/SysUserMapper.xml
  13. 6 10
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/config/handler/JsonbTypeHandler.java
  14. 5 0
      tr-test/src/main/resources/application-dev.yml
  15. 1 0
      tr-test/src/main/resources/application-doc.yml

+ 45 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/controller/AppUserController.java

@@ -0,0 +1,45 @@
+package cn.tr.module.smart.common.controller;
+
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.core.strategy.LoginUserStrategy;
+import cn.tr.module.smart.common.dto.BizAppUserInfoDTO;
+import cn.tr.module.smart.common.service.IDoctorUserService;
+import cn.tr.module.sys.user.vo.DoctorUserHospitalVO;
+import cn.tr.plugin.mybatis.base.BaseController;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author wangzl
+ * @description: TODO
+ * @date 2025/6/9 16:44
+ */
+@Api(tags = "医生用户")
+@RestController
+@RequestMapping("/common/doctor/user")
+@AllArgsConstructor
+public class AppUserController extends BaseController {
+    @Autowired
+    private IDoctorUserService appUserService;
+
+    @ApiOperationSupport(author = "lf", order = 1)
+    @ApiOperation(value = "首次登录初始化信息(密码、昵称等信息)", notes = "权限: 无")
+    @PostMapping("initInfo")
+    public CommonResult<Boolean> initInfo(@RequestBody BizAppUserInfoDTO source) {
+        appUserService.insertUserInfo(source);
+        return CommonResult.success(Boolean.TRUE);
+    }
+
+    @ApiOperationSupport(author = "lf", order = 1)
+    @ApiOperation(value = "当前用户所绑定的医院信息", notes = "权限: 无")
+    @PostMapping("hospitalList")
+    public CommonResult<List<DoctorUserHospitalVO>> hospitalList(){
+        return CommonResult.success(appUserService.stdSelectHospitalList(LoginUserStrategy.tr.getCurrentUserId()));
+    }
+}

+ 18 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizAppUserInfoDTO.java

@@ -0,0 +1,18 @@
+package cn.tr.module.smart.common.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("app用户信息")
+public class BizAppUserInfoDTO {
+    @ApiModelProperty("密码")
+    private String password;
+
+    @ApiModelProperty("头像")
+    private String avatar;
+
+    @ApiModelProperty("昵称")
+    private String nickname;
+}

+ 12 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/dto/BizPainAssessmentDTO.java

@@ -71,4 +71,16 @@ public class BizPainAssessmentDTO extends BaseDTO  {
     @ApiModelProperty(value = "手术id", position = 21)
     private String clinicId;
 
+    @ApiModelProperty("疼痛部位_正面")
+    private Map<String,Object> localDetailFront;
+
+    @ApiModelProperty("疼痛部位_正面base64图")
+    private String localDetailFrontImg;
+
+    @ApiModelProperty("疼痛部位_背部")
+    private Map<String,Object> localDetailTail;
+
+    @ApiModelProperty("疼痛部位_背部base64图")
+    private String localDetailTailImg;
+
 }

+ 17 - 1
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/po/BizPainAssessmentPO.java

@@ -1,6 +1,8 @@
 package cn.tr.module.smart.common.po;
 
-import cn.tr.plugin.mybatis.pojo.TenantPO;   
+import cn.tr.plugin.mybatis.config.handler.JsonbTypeHandler;
+import cn.tr.plugin.mybatis.pojo.TenantPO;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
@@ -84,4 +86,18 @@ public class BizPainAssessmentPO extends TenantPO {
     @ApiModelProperty(value = "手术ID" ,position = 16)
     private String clinicId;
 
+    @ApiModelProperty("疼痛部位_正面")
+    @TableField(typeHandler = JsonbTypeHandler.class)
+    private Map<String,Object> localDetailFront;
+
+    @ApiModelProperty("疼痛部位_正面base64图")
+    private String localDetailFrontImg;
+
+    @ApiModelProperty("疼痛部位_背部")
+    @TableField(typeHandler = JsonbTypeHandler.class)
+    private Map<String,Object> localDetailTail;
+
+    @ApiModelProperty("疼痛部位_背部base64图")
+    private String localDetailTailImg;
+
 }

+ 1 - 1
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IBizWxUserService.java

@@ -61,7 +61,7 @@ public interface IBizWxUserService{
     int removeBizWxUserByIds(Collection<String> ids);
 
 
-    BizWxUserDTO getUserByOpenidAndAppid(String openid, String appId);
+    BizWxUserDTO getUserByOpenidAndAppid(String openid, String appId,String unionId);
 
     /**
      * 切换登录医院

+ 26 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IDoctorUserService.java

@@ -0,0 +1,26 @@
+package cn.tr.module.smart.common.service;
+
+import cn.tr.module.smart.common.dto.BizAppUserInfoDTO;
+import cn.tr.module.sys.user.vo.DoctorUserHospitalVO;
+
+import java.util.List;
+
+public interface IDoctorUserService {
+    /**
+     * 新增用户信息
+     * <p>
+     * 将用户信息持久化到数据库中,通常用于用户注册或创建新用户场景
+     *
+     * @param source 用户信息数据传输对象,包含用户的基本信息
+     *               <ul>
+     *                 <li>不能为null</li>
+     *                 <li>需要包含必要的用户字段信息</li>
+     *               </ul>
+     * @throws IllegalArgumentException 如果参数不合法
+     *
+     * @see BizAppUserInfoDTO
+     */
+    void insertUserInfo(BizAppUserInfoDTO source);
+
+    List<DoctorUserHospitalVO> stdSelectHospitalList(String currentUserId);
+}

+ 7 - 2
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizWxUserServiceImpl.java

@@ -116,9 +116,14 @@ public class BizWxUserServiceImpl implements IBizWxUserService {
 
 
     @Override
-    public BizWxUserDTO getUserByOpenidAndAppid(String openid, String appId) {
+    public BizWxUserDTO getUserByOpenidAndAppid(String openid, String appId,String unionId) {
         LambdaQueryWrapper<BizWxUserPO> queryWrapper = new LambdaQueryWrapper<BizWxUserPO>()
-                .eq(BizWxUserPO::getOpenId, openid).eq(BizWxUserPO::getAppId, appId);
+                .nested(
+                        i->i.eq(BizWxUserPO::getOpenId, openid)
+                                .eq(BizWxUserPO::getAppId, appId))
+                .or()
+                .eq(StrUtil.isNotBlank(unionId),BizWxUserPO::getUnionId,unionId)
+                ;
         BizWxUserPO bizWxUserPO = baseRepository.selectOne(queryWrapper);
         return BizWxUserMapper.INSTANCE.convertDto(bizWxUserPO);
     }

+ 45 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/DoctorUserServiceImpl.java

@@ -0,0 +1,45 @@
+package cn.tr.module.smart.common.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.core.strategy.LoginUserStrategy;
+import cn.tr.core.utils.PswUtils;
+import cn.tr.module.smart.common.dto.BizAppUserInfoDTO;
+import cn.tr.module.smart.common.service.IDoctorUserService;
+import cn.tr.module.sys.user.vo.DoctorUserHospitalVO;
+import cn.tr.module.sys.user.po.SysUserPO;
+import cn.tr.module.sys.user.repository.SysUserRepository;
+import cn.tr.module.sys.user.repository.SysUserTenantRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+@Service
+public class DoctorUserServiceImpl  implements IDoctorUserService {
+    private SysUserRepository userRepository;
+    private SysUserTenantRepository userTenantRepository;
+    @Override
+    public void insertUserInfo(BizAppUserInfoDTO source) {
+        String currentUserId = LoginUserStrategy.tr.getCurrentUserId();
+        SysUserPO sysUserPO = userRepository.selectById(currentUserId);
+        if(ObjectUtil.isNull(sysUserPO)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"用户不存在");
+        }
+        if (StrUtil.isNotEmpty(source.getPassword())&&StrUtil.isNotEmpty(sysUserPO.getPassword())){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"用户已设置完密码,请在用户中心修改密码");
+        }
+        if(StrUtil.isNotEmpty(source.getPassword())){
+            sysUserPO.setPassword(PswUtils.encryptPassword(source.getPassword()));
+        }
+        sysUserPO.setNickname(source.getNickname());
+        sysUserPO.setAvatar(source.getAvatar());
+        userRepository.updateById(sysUserPO);
+    }
+
+    @Override
+    public List<DoctorUserHospitalVO> stdSelectHospitalList(String currentUserId) {
+        return userRepository.stdSelectHospitalList(currentUserId);
+    }
+}

+ 3 - 1
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/wx/config/WxAppletOauth2UserOperator.java

@@ -97,8 +97,9 @@ public class WxAppletOauth2UserOperator extends AbstractOAuth2PswUserOperator {
         }
 
         String openid = sessionInfo.getOpenid();
+        String unionid = sessionInfo.getUnionid();
         //根据openid查询用户信息 (通过数据库进行查询)
-        BizWxUserDTO wxUser = wxUserService.getUserByOpenidAndAppid(openid, appId);
+        BizWxUserDTO wxUser = wxUserService.getUserByOpenidAndAppid(openid, appId,unionid);
         if (wxUser == null) {
             wxUser = new BizWxUserDTO();
             wxUser.setId(IdUtil.getSnowflake().nextIdStr());
@@ -115,6 +116,7 @@ public class WxAppletOauth2UserOperator extends AbstractOAuth2PswUserOperator {
             }
             wxUserService.insertBizWxUser(wxUser);
         } else {
+            wxUser.setUnionId(unionid);
             wxUser.setLastLoginIp(ip);
             wxUser.setLastLoginTime(loginTime);
             wxUser.setLastLoginAddress(cityInfo);

+ 3 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/repository/SysUserRepository.java

@@ -4,6 +4,7 @@ import cn.tr.module.sys.user.dto.SysUserListQueryDTO;
 import cn.tr.module.sys.user.dto.SysUserQueryDTO;
 import cn.tr.module.sys.user.dto.SysUserSmallDTO;
 import cn.tr.module.sys.user.po.SysUserPO;
+import cn.tr.module.sys.user.vo.DoctorUserHospitalVO;
 import cn.tr.module.sys.user.vo.SysUserVO;
 import cn.tr.plugin.mybatis.base.RecoverMapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -32,4 +33,6 @@ public interface SysUserRepository extends RecoverMapper<SysUserPO> {
     List<SysUserSmallDTO> stdSelectList(@Param("query") SysUserListQueryDTO query);
 
     List<SysUserVO> selectStdSysUserList(@Param("query") SysUserQueryDTO query);
+
+    List<DoctorUserHospitalVO> stdSelectHospitalList(@Param("currentId") String currentUserId);
 }

+ 14 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/vo/DoctorUserHospitalVO.java

@@ -0,0 +1,14 @@
+package cn.tr.module.sys.user.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DoctorUserHospitalVO {
+    @ApiModelProperty("医院id")
+    private String tenantId;
+    @ApiModelProperty("医院名称")
+    private String name;
+    @ApiModelProperty("状态 user_normal:正常, user_ban:被禁登录, user_check:审核中, user_check_fail:审核失败")
+    private String status;
+}

+ 18 - 0
tr-modules/tr-module-system/src/main/resources/mapper/user/SysUserMapper.xml

@@ -139,4 +139,22 @@
         su.sort
         order by su.sort,su.create_time asc
     </select>
+
+
+    <resultMap id="stdUserHospital" type="cn.tr.module.sys.user.vo.DoctorUserHospitalVO">
+        <result property="tenantId" column="tenant_id"/>
+        <result property="name" column="name"/>
+        <result property="status" column="status"/>
+    </resultMap>
+
+    <select id="stdSelectHospitalList" resultMap="stdUserHospital">
+        select
+        st.id as tenant_id,
+        sut.status as status,
+        st.name as name
+        from sys_user as su
+        join sys_user_tenant as sut on sut.user_id=su.id
+        join sys_tenant as st on st.id=sut.tenant_id
+        where su.id=#{currentUserId}
+    </select>
 </mapper>

+ 6 - 10
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/config/handler/JsonbTypeHandler.java

@@ -14,14 +14,10 @@ import java.sql.SQLException;
 
 @MappedJdbcTypes(JdbcType.OTHER)
 @MappedTypes(Object.class)
-public class JsonbTypeHandler<T> extends BaseTypeHandler<Object> {
+public class JsonbTypeHandler extends BaseTypeHandler<Object> {
 
     private static final ObjectMapper mapper = new ObjectMapper();
-    private final Class<T> type;
 
-    public JsonbTypeHandler(Class<T> type) {
-        this.type = type;
-    }
     @Override
     public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
         try {
@@ -35,26 +31,26 @@ public class JsonbTypeHandler<T> extends BaseTypeHandler<Object> {
     }
 
     @Override
-    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
+    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
         return parseJson(rs.getString(columnName));
     }
 
     @Override
-    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
         return parseJson(rs.getString(columnIndex));
     }
 
     @Override
-    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
         return parseJson(cs.getString(columnIndex));
     }
 
-    private T parseJson(String json) throws SQLException {
+    private Object parseJson(String json) throws SQLException {
         if (json == null) {
             return null;
         }
         try {
-            return mapper.readValue(json, type);
+            return mapper.readValue(json, Object.class);
         } catch (JsonProcessingException e) {
             throw new SQLException("Error parsing JSONB string", e);
         }

+ 5 - 0
tr-test/src/main/resources/application-dev.yml

@@ -41,6 +41,11 @@ wx:
         token: smart #微信小程序消息服务器配置的token
         aesKey: 4ywJtjRvvpFONIVN8GxPhSpi2eQraoIDZgUwn8Jmm2C #微信小程序消息服务器配置的EncodingAESKey
         msgDataFormat: JSON
+      - appid: wxf51eb892af67a9f6
+        secret: 016d9f879d40ade7a4f094f39a49f8d7  #微信小程序的Secret
+        token: smart #微信小程序消息服务器配置的token
+        aesKey: 1elyDzYtcnefWgXzhjpMWb9tm1c3ArChNLVWlIp2Oe3 #微信小程序消息服务器配置的EncodingAESKey
+        msgDataFormat: xml
 
 
 # 添加Coze配置

+ 1 - 0
tr-test/src/main/resources/application-doc.yml

@@ -36,6 +36,7 @@ knife4j:
         api-rule: package
         api-rule-resources:
           - cn.tr.module.smart.app
+          - cn.tr.module.smart.common
       tianai:
         group-name: 图片验证码
         api-rule: package