KKSU
2025-04-08 82d77490b23df66b120c16e2986d1ccaca1ca314
feat(mall): 添加医生绑定和授权相关功能

- 新增医生绑定接口和相关服务
- 实现医生列表查询和授权记录查询功能
- 添加授权记录删除接口
- 在会员实体中增加医生状态字段
- 新增医生信息相关实体和 mapper
6 files added
5 files modified
322 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java 42 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorAuthDeleteDto.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorBindDto.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorListDto.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallDoctor.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMember.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallDoctorMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 146 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiDoctorListVo.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java 3 ●●●●● patch | view | raw | blame | history
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);
    }
}
src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorAuthDeleteDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorBindDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorListDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/entity/MallDoctor.java
New file
@@ -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;
}
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;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallDoctorMapper.java
New file
@@ -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> {
}
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);
}
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 = "爱和美医疗";
src/main/java/cc/mrbird/febs/mall/vo/ApiDoctorListVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -99,4 +99,7 @@
    @ApiModelProperty(value = "会员信息")
    private MallVipConfig vipInfo;
    @ApiModelProperty(value = "是否是医生")
    private Integer doctorState;
}