From 82d77490b23df66b120c16e2986d1ccaca1ca314 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Tue, 08 Apr 2025 11:03:04 +0800
Subject: [PATCH] feat(mall): 添加医生绑定和授权相关功能

---
 src/main/java/cc/mrbird/febs/mall/entity/MallDoctor.java                     |   27 ++++
 src/main/java/cc/mrbird/febs/mall/vo/ApiDoctorListVo.java                    |   36 ++++++
 src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java                       |    3 
 src/main/java/cc/mrbird/febs/mall/entity/MallMember.java                     |    4 
 src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorAuthDeleteDto.java            |   16 ++
 src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java    |   42 ++++++
 src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorBindDto.java                  |   20 +++
 src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorListDto.java                  |   13 ++
 src/main/java/cc/mrbird/febs/mall/mapper/MallDoctorMapper.java               |    7 +
 src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java         |    8 +
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java |  146 ++++++++++++++++++++++++
 11 files changed, 317 insertions(+), 5 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
index e588d9c..819e3fa 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
@@ -3,9 +3,11 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.mall.dto.*;
 import cc.mrbird.febs.mall.entity.MallMember;
-import cc.mrbird.febs.mall.entity.MallMemberCoupon;
 import cc.mrbird.febs.mall.entity.MallMemberPayment;
-import cc.mrbird.febs.mall.service.*;
+import cc.mrbird.febs.mall.service.IApiMallAgentService;
+import cc.mrbird.febs.mall.service.IApiMallMemberService;
+import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
+import cc.mrbird.febs.mall.service.IMallMemberWithdrawService;
 import cc.mrbird.febs.mall.vo.*;
 import cc.mrbird.febs.vip.service.IMallVipBenefitsService;
 import io.swagger.annotations.Api;
@@ -17,7 +19,6 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import javax.validation.Valid;
 import java.util.Map;
 
 /**
@@ -325,4 +326,39 @@
     public FebsResponse bindResult(@RequestBody @Validated BindResultDto bindResultDto) {
         return memberService.bindResult(bindResultDto);
     }
+
+    @ApiOperation(value = "去授权")
+    @PostMapping(value = "/bindDoctor")
+    public FebsResponse bindDoctor(@RequestBody @Validated ApiDoctorBindDto dto) {
+        return memberService.bindDoctor(dto);
+    }
+
+    @ApiOperation(value = "我的检测用户")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiDoctorListVo.class)
+    })
+    @PostMapping(value = "/doctorList")
+    public FebsResponse doctorList(@RequestBody ApiDoctorListDto dto) {
+
+        return memberService.doctorList(dto);
+    }
+
+    @ApiOperation(value = "我的授权记录")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiDoctorListVo.class)
+    })
+    @PostMapping(value = "/authList")
+    public FebsResponse authList() {
+
+        return memberService.authList();
+    }
+
+    @ApiOperation(value = "我的授权记录-删除")
+    @PostMapping(value = "/authDel")
+    public FebsResponse authDel(@RequestBody @Validated ApiDoctorAuthDeleteDto dto) {
+
+        return memberService.authDel(dto);
+    }
+
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorAuthDeleteDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorAuthDeleteDto.java
new file mode 100644
index 0000000..8dd0ff0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorAuthDeleteDto.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "ApiDoctorAuthDeleteDto", description = "参数接收类")
+public class ApiDoctorAuthDeleteDto {
+
+    @NotBlank(message = "ID不能为空")
+    @ApiModelProperty(value = "绑定记录ID")
+    private Long id;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorBindDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorBindDto.java
new file mode 100644
index 0000000..4214adb
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorBindDto.java
@@ -0,0 +1,20 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "ApiDoctorBindDto", description = "参数接收类")
+public class ApiDoctorBindDto {
+
+    @NotBlank(message = "医生邀请码不能为空")
+    @ApiModelProperty(value = "医生邀请码")
+    private String inviteId;
+
+    @NotBlank(message = "绑定记录不能为空")
+    @ApiModelProperty(value = "绑定记录ID")
+    private Long storeMemberId;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorListDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorListDto.java
new file mode 100644
index 0000000..b5e0c11
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorListDto.java
@@ -0,0 +1,13 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiDoctorListDto", description = "参数接收类")
+public class ApiDoctorListDto {
+
+    @ApiModelProperty(value = "绑定人电话")
+    private String phone;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallDoctor.java b/src/main/java/cc/mrbird/febs/mall/entity/MallDoctor.java
new file mode 100644
index 0000000..c36d5be
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallDoctor.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("mall_doctor")
+public class MallDoctor extends BaseEntity {
+    /**
+     *
+     `member_id` bigint(20) DEFAULT NULL,
+     `store_member_id` bigint(20) DEFAULT NULL,
+     `bind_member_id` bigint(20) DEFAULT NULL,
+     `bind_phone` varchar(100) DEFAULT NULL,
+     `bind_name` varchar(100) DEFAULT NULL,
+     `bind_info` varchar(150) DEFAULT NULL,
+     `bind_age` int(11) DEFAULT NULL,
+     */
+    private Long memberId;
+    private Long storeMemberId;
+    private Long bindMemberId;
+    private String bindPhone;
+    private String bindName;
+    private String bindInfo;
+    private Integer bindAge;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
index b2a5544..9641bde 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
@@ -1,7 +1,5 @@
 package cc.mrbird.febs.mall.entity;
 
-import cc.mrbird.febs.common.controller.BaseController;
-import cc.mrbird.febs.common.entity.BaseEntity;
 import cc.mrbird.febs.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -183,4 +181,6 @@
     private Date lastLoginTime;
 
     private Date vipLevelTime;
+    //是否是医生  0-否 1-是
+    private Integer doctorState;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallDoctorMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallDoctorMapper.java
new file mode 100644
index 0000000..0cd9d13
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallDoctorMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.MallDoctor;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface MallDoctorMapper extends BaseMapper<MallDoctor> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
index 48a2488..6539dfc 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
@@ -107,4 +107,12 @@
     FebsResponse bindList();
 
     FebsResponse bindResult(BindResultDto bindResultDto);
+
+    FebsResponse bindDoctor(ApiDoctorBindDto dto);
+
+    FebsResponse doctorList(ApiDoctorListDto dto);
+
+    FebsResponse authList();
+
+    FebsResponse authDel(ApiDoctorAuthDeleteDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
index 978c1d5..eecd7a2 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -88,6 +88,7 @@
     private final MallStoreMapper mallStoreMapper;
     private final MallStoreItemMapper mallStoreItemMapper;
     private final MallStoreMemberMapper mallStoreMemberMapper;
+    private final MallDoctorMapper mallDoctorMapper;
 
 
     @Value("${spring.profiles.active}")
@@ -1327,6 +1328,151 @@
         return new FebsResponse().success().data(data);
     }
 
+    /**
+     * 绑定医生接口的实现方法
+     *
+     * @param dto 包含绑定医生所需信息的数据传输对象
+     * @return 返回操作结果的响应对象
+     * @throws FebsException 如果绑定操作失败,抛出此异常
+     */
+    @Override
+    public FebsResponse bindDoctor(ApiDoctorBindDto dto) {
+
+        // 获取当前登录用户的ID
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        // 从DTO中提取邀请ID和门店会员ID
+        String inviteId = dto.getInviteId();
+        Long storeMemberId = dto.getStoreMemberId();
+
+        // 根据门店会员ID查询门店会员信息
+        MallStoreMember mallStoreMember = mallStoreMemberMapper.selectById(storeMemberId);
+        // 如果门店会员信息为空,抛出异常
+        if(null == mallStoreMember){
+            throw new FebsException("当前检测记录无法绑定!");
+        }
+        // 如果门店会员的会员ID与当前登录用户ID不匹配,抛出异常
+        if(mallStoreMember.getMemberId() != memberId){
+            throw new FebsException("当前检测记录无法绑定!");
+        }
+
+        // 根据邀请ID查询会员信息
+        MallMember mallMember = this.baseMapper.selectInfoByInviteId(inviteId);
+        // 如果会员的医生状态不是1,抛出异常
+        if(1 != mallMember.getDoctorState()){
+            throw new FebsException("无法绑定!");
+        }
+
+        // 查询与当前门店会员ID关联的医生列表
+        List<MallDoctor> mallDoctors = mallDoctorMapper.selectList(new LambdaQueryWrapper<MallDoctor>().eq(MallDoctor::getStoreMemberId, mallStoreMember.getId()));
+        // 如果医生列表为空,创建新的医生对象并设置相关信息,然后插入数据库
+        if(CollUtil.isEmpty(mallDoctors)){
+            MallDoctor mallDoctor = new MallDoctor();
+            mallDoctor.setMemberId(mallMember.getId());
+            mallDoctor.setStoreMemberId(mallStoreMember.getId());
+            mallDoctor.setBindMemberId(mallStoreMember.getMemberId());
+            mallDoctor.setBindPhone(mallStoreMember.getPhone());
+            mallDoctor.setBindName(mallStoreMember.getName());
+            mallDoctor.setBindInfo(mallStoreMember.getAccount());
+            mallDoctor.setBindAge(mallStoreMember.getAge());
+            mallDoctorMapper.insert(mallDoctor);
+        }
+
+        // 返回操作成功的响应
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    /**
+     * 获取医生列表接口的实现
+     * 根据登录用户信息和查询条件,返回相应的医生列表
+     *
+     * @param dto 包含查询条件的数据传输对象
+     * @return 返回包含医生列表的响应对象
+     */
+    @Override
+    public FebsResponse doctorList(ApiDoctorListDto dto) {
+        // 获取当前登录用户的ID
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        // 初始化用于存储医生信息的集合
+        ArrayList<ApiDoctorListVo> apiDoctorListVos = new ArrayList<>();
+
+        // 创建查询条件包装器
+        LambdaQueryWrapper<MallDoctor> objectQueryWrapper = new LambdaQueryWrapper<>();
+        // 根据传入的手机号进行模糊查询
+        if(StrUtil.isNotEmpty(dto.getPhone())){
+            objectQueryWrapper.like(MallDoctor::getBindPhone,dto.getPhone());
+        }
+        // 根据会员ID进行精确查询
+        objectQueryWrapper.eq(MallDoctor::getMemberId,memberId);
+        // 按创建时间降序排序
+        objectQueryWrapper.orderByDesc(MallDoctor::getCreatedTime);
+
+        // 执行查询,获取医生列表
+        List<MallDoctor> mallDoctors = mallDoctorMapper.selectList(objectQueryWrapper);
+        // 如果查询结果不为空,则遍历查询结果,封装医生信息
+        if(CollUtil.isNotEmpty(mallDoctors)){
+            for(MallDoctor mallDoctor : mallDoctors){
+                ApiDoctorListVo apiDoctorListVo = new ApiDoctorListVo();
+                apiDoctorListVo.setId(mallDoctor.getId());
+                apiDoctorListVo.setStoreMemberId(mallDoctor.getStoreMemberId());
+                apiDoctorListVo.setName(mallDoctor.getBindName());
+                apiDoctorListVo.setPhone(mallDoctor.getBindPhone());
+                apiDoctorListVo.setBindAge(mallDoctor.getBindAge());
+                apiDoctorListVo.setBindInfo(mallDoctor.getBindInfo());
+                apiDoctorListVo.setCreatedTime(mallDoctor.getCreatedTime());
+                // 将封装好的医生信息添加到集合中
+                apiDoctorListVos.add(apiDoctorListVo);
+            }
+        }
+        // 返回包含医生列表的响应对象
+        return new FebsResponse().success().data(apiDoctorListVos);
+    }
+
+    @Override
+    public FebsResponse authList() {
+        // 获取当前登录用户的ID
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        // 初始化用于存储医生信息的集合
+        ArrayList<ApiDoctorListVo> apiDoctorListVos = new ArrayList<>();
+        // 创建查询条件包装器
+        LambdaQueryWrapper<MallDoctor> objectQueryWrapper = new LambdaQueryWrapper<>();
+        // 根据会员ID进行精确查询
+        objectQueryWrapper.eq(MallDoctor::getBindMemberId,memberId);
+        // 按创建时间降序排序
+        objectQueryWrapper.orderByDesc(MallDoctor::getCreatedTime);
+        // 执行查询,获取医生列表
+        List<MallDoctor> mallDoctors = mallDoctorMapper.selectList(objectQueryWrapper);
+        // 如果查询结果不为空,则遍历查询结果,封装医生信息
+        if(CollUtil.isNotEmpty(mallDoctors)){
+            for(MallDoctor mallDoctor : mallDoctors){
+                ApiDoctorListVo apiDoctorListVo = new ApiDoctorListVo();
+                apiDoctorListVo.setId(mallDoctor.getId());
+                apiDoctorListVo.setStoreMemberId(mallDoctor.getStoreMemberId());
+                apiDoctorListVo.setName(mallDoctor.getBindName());
+                apiDoctorListVo.setPhone(mallDoctor.getBindPhone());
+                apiDoctorListVo.setBindAge(mallDoctor.getBindAge());
+                apiDoctorListVo.setBindInfo(mallDoctor.getBindInfo());
+                apiDoctorListVo.setCreatedTime(mallDoctor.getCreatedTime());
+                // 将封装好的医生信息添加到集合中
+                apiDoctorListVos.add(apiDoctorListVo);
+            }
+        }
+        // 返回包含医生列表的响应对象
+        return new FebsResponse().success().data(apiDoctorListVos);
+    }
+
+    @Override
+    public FebsResponse authDel(ApiDoctorAuthDeleteDto dto) {
+        // 获取当前登录用户的ID
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+
+        MallDoctor mallDoctor = mallDoctorMapper.selectById(dto.getId());
+        if(memberId != mallDoctor.getBindMemberId()){
+            throw new FebsException("当前授权无法删除!");
+        }
+        mallDoctorMapper.deleteById(dto.getId());
+        return new FebsResponse().success().message("操作成功");
+    }
+
     public static void main(String[] args) {
         Long userld = 16425L;
         String shopAccount = "爱和美医疗";
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ApiDoctorListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiDoctorListVo.java
new file mode 100644
index 0000000..95884e4
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiDoctorListVo.java
@@ -0,0 +1,36 @@
+package cc.mrbird.febs.mall.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(value = "ApiDoctorListVo", description = "信息返回类")
+public class ApiDoctorListVo {
+
+    @ApiModelProperty(value = "ID")
+    private Long id;
+
+    @ApiModelProperty(value = "绑定记录ID")
+    private Long storeMemberId;
+
+    @ApiModelProperty(value = "绑定人")
+    private String name;
+
+    @ApiModelProperty(value = "绑定人电话")
+    private String phone;
+
+    @ApiModelProperty(value = "年龄")
+    private Integer bindAge;
+
+    @ApiModelProperty(value = "绑定的信息")
+    private String bindInfo;
+
+    @ApiModelProperty(value = "绑定时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
index 59c4080..e483f7c 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -99,4 +99,7 @@
 
     @ApiModelProperty(value = "会员信息")
     private MallVipConfig vipInfo;
+
+    @ApiModelProperty(value = "是否是医生")
+    private Integer doctorState;
 }

--
Gitblit v1.9.1