src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
@@ -17,7 +17,6 @@ import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.annotations.Param; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -572,6 +571,15 @@ } /** * 会员列表-医生设置 */ @GetMapping("doctorStateChange/{id}") @ControllerEndpoint(operation = " 会员列表-医生设置", exceptionMessage = "操作失败") public FebsResponse doctorStateChange(@NotNull(message = "{required}") @PathVariable Long id) { return mallMemberService.doctorStateChange(id); } /** * 会员列表-推销员设置 */ @GetMapping("upSale/{id}") 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.NotNull; @Data @ApiModel(value = "ApiDoctorAuthDeleteDto", description = "参数接收类") public class ApiDoctorAuthDeleteDto { @NotNull(message = "ID不能为空") @ApiModelProperty(value = "绑定记录ID") private Long id; } src/main/java/cc/mrbird/febs/mall/dto/ApiDoctorBindDto.java
New file @@ -0,0 +1,21 @@ package cc.mrbird.febs.mall.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiDoctorBindDto", description = "参数接收类") public class ApiDoctorBindDto { @NotBlank(message = "医生邀请码不能为空") @ApiModelProperty(value = "医生邀请码") private String inviteId; @NotNull(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/mapper/MallMemberMapper.java
@@ -3,7 +3,6 @@ import cc.mrbird.febs.mall.dto.AgentDto; import cc.mrbird.febs.mall.dto.AgentLevelDto; import cc.mrbird.febs.mall.dto.RankAwardDto; import cc.mrbird.febs.mall.dto.RankListDto; import cc.mrbird.febs.mall.entity.AppVersion; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.vo.*; @@ -13,6 +12,7 @@ import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** @@ -91,4 +91,5 @@ IPage<MallMember> getsalemanRuleList(Page<MallMember> page, @Param("record")MallMember mallMember); void updateReferrerId(@Param("id")Long id); void updateLastLoginTime(@Param("id")Long id,@Param("lastLoginTime") Date lastLoginTime); } src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
@@ -127,6 +127,9 @@ FebsResponse agentVerifyUpdate(AdminAgentVerifyVo adminAgentVerifyVo); FebsResponse doctorStateChange(Long id); FebsResponse upCoupon(Long id); FebsResponse downCoupon(Long id); 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/AdminMallMemberServiceImpl.java
@@ -3,16 +3,12 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.enumerates.AgentLevelEnum; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.entity.MallNewsInfo; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IAdminMallMemberService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; @@ -33,7 +29,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.xmlbeans.impl.store.Query; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -320,6 +315,17 @@ } @Override public FebsResponse doctorStateChange(Long id) { MallMember mallMember = this.baseMapper.selectById(id); if(ObjectUtil.isEmpty(mallMember)){ throw new FebsException("请刷新页面"); } mallMember.setDoctorState(mallMember.getDoctorState() == 1 ? 0 : 1); this.baseMapper.updateById(mallMember); return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse upCoupon(Long id) { MallMember mallMember = this.baseMapper.selectById(id); if(ObjectUtil.isEmpty(mallMember)){ 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}") @@ -1096,10 +1097,12 @@ MallMember member = this.baseMapper.selectById(loginUser.getId()); MallMember mallMember = new MallMember(); mallMember.setId(member.getId()); mallMember.setLastLoginTime(new Date()); this.baseMapper.updateById(mallMember); // MallMember mallMember = new MallMember(); // mallMember.setId(member.getId()); // mallMember.setLastLoginTime(new Date()); // this.baseMapper.updateById(mallMember); this.baseMapper.updateLastLoginTime(member.getId(),new Date()); DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.UNALIVE_COUPON.getType(), DataDictionaryEnum.UNALIVE_COUPON.getCode()); if (dic == null || StrUtil.isBlank(dic.getValue())) { @@ -1327,6 +1330,161 @@ 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()) .eq(MallDoctor::getMemberId, mallMember.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.setBindAge(mallStoreMember.getAge()); Long storeId = mallStoreMember.getStoreId(); Long storeItemId = mallStoreMember.getStoreItemId(); MallStore mallStore = mallStoreMapper.selectById(storeId); MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId); mallDoctor.setBindInfo(mallStore.getName()+"-"+mallStoreItem.getCode()); 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()); MallMember mallMember = this.baseMapper.selectById(mallDoctor.getMemberId()); apiDoctorListVo.setName(mallMember.getName()); 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; } src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -442,4 +442,12 @@ where id = #{id} </update> <update id="updateLastLoginTime"> update mall_member set last_login_time = #{lastLoginTime} where id = #{id} </update> </mapper> src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
@@ -97,6 +97,14 @@ <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="isSalesmanSwitch"> {{# } }} </script> <script type="text/html" id="isDoctorSwitch"> {{# if(d.doctorState === 1) { }} <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="isDoctorSwitch"> {{# } else { }} <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="isDoctorSwitch"> {{# } }} </script> <style> .layui-form-onswitch { background-color: #5FB878 !important; @@ -249,6 +257,21 @@ } }) form.on('switch(isDoctorSwitch)', function (data) { if (data.elem.checked) { doctorStateChange(data.value); } else { doctorStateChange(data.value); } }) function doctorStateChange(id) { febs.get(ctx + 'admin/mallMember/doctorStateChange/' + id, null, function () { febs.alert.success('操作成功'); $query.click(); }); } function upSale(id) { febs.get(ctx + 'admin/mallMember/upSale/' + id, null, function () { febs.alert.success('操作成功'); @@ -295,6 +318,7 @@ {field: 'referrerName', title: '推荐人', minWidth: 100,align:'left'}, {field: 'levelName', title: '会员等级', minWidth: 100,align:'left'}, // {field: 'referrerName', title: '推荐人', minWidth: 100,align:'left'}, {field: 'doctorState', title: '医生设置', templet: '#isDoctorSwitch', minWidth: 100,align:'center'}, {field: 'isSalesman', title: '推销员设置', templet: '#isSalesmanSwitch', minWidth: 100,align:'center'}, // {field: 'director', title: '总监', templet:'#switchDirector', minWidth: 100}, // {field: 'accountType', title: '账号类型',