瀏覽代碼

会员关联项目

Long 1 月之前
父節點
當前提交
82d7df1715

+ 3 - 1
fs-service-system/src/main/java/com/fs/course/param/newfs/FsUserCourseBeMemberParam.java

@@ -24,5 +24,7 @@ public class FsUserCourseBeMemberParam implements Serializable {
     @ApiModelProperty(value = "标签ids,数组格式")
     private String[] tagIds;
 
-
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "课程归属项目id")
+    private Long projectId;
 }

+ 5 - 1
fs-service-system/src/main/java/com/fs/store/domain/FsUserCompanyUser.java

@@ -2,9 +2,9 @@ package com.fs.store.domain;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import com.fs.common.core.domain.BaseEntity;
 import lombok.EqualsAndHashCode;
 
 /**
@@ -40,5 +40,9 @@ public class FsUserCompanyUser extends BaseEntity{
     @ApiModelProperty(value = "重粉所属销售,多个用逗号隔开")
     private String repeatCompanyUserName;
 
+    /**
+     * 项目ID
+     */
+    private Long projectId;
 
 }

+ 32 - 1
fs-service-system/src/main/java/com/fs/store/service/IFsUserCompanyUserService.java

@@ -1,9 +1,10 @@
 package com.fs.store.service;
 
-import java.util.List;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.store.domain.FsUserCompanyUser;
 
+import java.util.List;
+
 /**
  * 微信用户和销售关系Service接口
  * 
@@ -58,4 +59,34 @@ public interface IFsUserCompanyUserService extends IService<FsUserCompanyUser>{
      * @return 结果
      */
     int deleteFsUserCompanyUserById(Long id);
+
+    /**
+     * 根据用户ID和项目ID查询微信用户与销售的关系
+     * @param userId            用户ID
+     * @param projectId   项目ID
+     * @return FsUserCompanyUser
+     */
+    FsUserCompanyUser selectByUserIdAndProjectId(Long userId, Long projectId);
+
+    /**
+     * 查询是否已绑定关系
+     * @param userId            用户ID
+     * @param companyUserId     销售ID
+     * @return  boolean
+     */
+    boolean hasBind(Long userId, Long companyUserId);
+
+    /**
+     * 获取当前销售的所有重粉会员
+     * @param userId 销售ID
+     * @return  list
+     */
+    List<FsUserCompanyUser> selectRepeatUser(Long userId);
+
+    /**
+     * 获取会员的重粉的所属销售
+     * @param userIds   会员ID集合
+     * @return  list
+     */
+    List<FsUserCompanyUser> selectRepeatCompanyUserName(List<Long> userIds);
 }

+ 54 - 4
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserCompanyUserServiceImpl.java

@@ -1,12 +1,14 @@
 package com.fs.store.service.impl;
 
-import java.util.List;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.fs.store.mapper.FsUserCompanyUserMapper;
 import com.fs.store.domain.FsUserCompanyUser;
+import com.fs.store.mapper.FsUserCompanyUserMapper;
 import com.fs.store.service.IFsUserCompanyUserService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * 微信用户和销售关系Service业务层处理
@@ -88,4 +90,52 @@ public class FsUserCompanyUserServiceImpl extends ServiceImpl<FsUserCompanyUserM
     {
         return baseMapper.deleteFsUserCompanyUserById(id);
     }
+
+    /**
+     * 根据用户ID和项目ID查询微信用户与销售的关系
+     * @param userId            用户ID
+     * @param projectId   项目ID
+     * @return FsUserCompanyUser
+     */
+    @Override
+    public FsUserCompanyUser selectByUserIdAndProjectId(Long userId, Long projectId) {
+        LambdaQueryWrapper<FsUserCompanyUser> queryWrapper = Wrappers.<FsUserCompanyUser>lambdaQuery()
+                .eq(FsUserCompanyUser::getUserId, userId)
+                .eq(FsUserCompanyUser::getProjectId, projectId);
+        return getOne(queryWrapper);
+    }
+
+    /**
+     * 查询是否已绑定关系
+     * @param userId            用户ID
+     * @param companyUserId     销售ID
+     * @return  boolean
+     */
+    @Override
+    public boolean hasBind(Long userId, Long companyUserId) {
+        LambdaQueryWrapper<FsUserCompanyUser> queryWrapper = Wrappers.<FsUserCompanyUser>lambdaQuery()
+                .eq(FsUserCompanyUser::getUserId, userId)
+                .eq(FsUserCompanyUser::getCompanyUserId, companyUserId);
+        return count(queryWrapper) > 0;
+    }
+
+    /**
+     * 获取当前销售的所有重粉会员
+     * @param userId 销售ID
+     * @return list
+     */
+    @Override
+    public List<FsUserCompanyUser> selectRepeatUser(Long userId) {
+        return baseMapper.selectRepeatUser(userId);
+    }
+
+    /**
+     * 获取会员的重粉的所属销售
+     * @param userIds   会员ID集合
+     * @return  list
+     */
+    @Override
+    public List<FsUserCompanyUser> selectRepeatCompanyUserName(List<Long> userIds) {
+        return baseMapper.selectRepeatCompanyUserName(userIds);
+    }
 }

+ 16 - 26
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -2,7 +2,6 @@ package com.fs.store.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.common.constant.HttpStatus;
 import com.fs.common.core.domain.R;
@@ -42,13 +41,13 @@ import com.fs.store.dto.FsUserTransferParamDTO;
 import com.fs.store.enums.BillDetailEnum;
 import com.fs.store.mapper.FsStoreOrderMapper;
 import com.fs.store.mapper.FsStoreProductAttrValueMapper;
-import com.fs.store.mapper.FsUserCompanyUserMapper;
 import com.fs.store.mapper.FsUserMapper;
 import com.fs.store.param.SelectCusListPageParam;
 import com.fs.store.param.h5.CourseAnalysisParam;
 import com.fs.store.param.h5.FsUserPageListParam;
 import com.fs.store.param.h5.UserStatisticsCommonParam;
 import com.fs.store.service.IFsUserBillService;
+import com.fs.store.service.IFsUserCompanyUserService;
 import com.fs.store.service.IFsUserService;
 import com.fs.store.service.cache.IFsUserCourseCountCacheService;
 import com.fs.store.vo.FSUserVO;
@@ -123,7 +122,7 @@ public class FsUserServiceImpl implements IFsUserService
     private IQwExternalContactCacheService qwExternalContactCacheService;
 
     @Autowired
-    private FsUserCompanyUserMapper fsUserCompanyUserMapper;
+    private IFsUserCompanyUserService userCompanyUserService;
 
     @Autowired
     private ICompanyTagService companyTagService;
@@ -481,12 +480,12 @@ public class FsUserServiceImpl implements IFsUserService
         List<FsUserPageListVO> fsUserPageListVOS = fsUserMapper.selectFsUserPageList(param);
 
         // 获取当前销售所有重粉会员
-        List<FsUserCompanyUser> fsUserCompanyUsers = fsUserCompanyUserMapper.selectRepeatUser(param.getUserId());
+        List<FsUserCompanyUser> fsUserCompanyUsers = userCompanyUserService.selectRepeatUser(param.getUserId());
 
         if(!fsUserCompanyUsers.isEmpty()){
             List<Long> userIds = fsUserCompanyUsers.stream().map(FsUserCompanyUser::getUserId).collect(Collectors.toList());
             // 获取会员所属的重粉销售
-            List<FsUserCompanyUser> repeatCompanyUserNames = fsUserCompanyUserMapper.selectRepeatCompanyUserName(userIds);
+            List<FsUserCompanyUser> repeatCompanyUserNames = userCompanyUserService.selectRepeatCompanyUserName(userIds);
             Map<Long, String> map = repeatCompanyUserNames.stream().collect(Collectors.toMap(FsUserCompanyUser::getUserId, FsUserCompanyUser::getRepeatCompanyUserName));
 
             for (FsUserPageListVO fsUserPageListVO : fsUserPageListVOS) {
@@ -898,11 +897,6 @@ public class FsUserServiceImpl implements IFsUserService
             return ResponseResult.fail(404,"当前用户信息不存在");
         }
 
-        // 逻辑调整:如果会员已经绑定了销售,直接提示,不添加重粉数据了-2025年6月16日14点53分
-        if (fsUser.getCompanyUserId() != null && !param.getCompanyUserId().equals(fsUser.getCompanyUserId())){
-            return ResponseResult.fail(406,"该用户已成为其他销售会员");
-        }
-
         //判断该销售是否存在
         CompanyUser companyUser = companyUserMapper.selectCompanyUserById(param.getCompanyUserId());
         if (Objects.isNull(companyUser)){
@@ -913,19 +907,18 @@ public class FsUserServiceImpl implements IFsUserService
             return ResponseResult.fail(407,"不允许注册会员,请联系管理员");
         }
 
-        // 添加关系表数据
-        FsUserCompanyUser fsUserCompanyUser = getFsUserCompanyUser(param, fsUser);
-        QueryWrapper<FsUserCompanyUser> queryWrapper = new QueryWrapper<FsUserCompanyUser>().eq("user_id", param.getUserId()).eq("company_user_id", param.getCompanyUserId());
-        Integer i = fsUserCompanyUserMapper.selectCount(queryWrapper);
-        if(i == 0) {
-            fsUserCompanyUserMapper.insertFsUserCompanyUser(fsUserCompanyUser);
+        // 逻辑调整:如果会员已经绑定了销售,直接提示,不添加重粉数据了-2025年6月16日14点53分
+        // 逻辑调整:会员与销售的绑定关系通过中间表关联 /20250625 17:13
+        FsUserCompanyUser userCompanyUser = userCompanyUserService.selectByUserIdAndProjectId(fsUser.getUserId(), param.getProjectId());
+        if (Objects.nonNull(userCompanyUser) && !userCompanyUser.getCompanyUserId().equals(param.getCompanyUserId())){
+            return ResponseResult.fail(406,"该用户已成为其他销售会员");
         }
 
-        // 关联销售
-        if(fsUser.getCompanyUserId() == null) {
-            fsUser.setCompanyId(param.getCompanyId());
-            fsUser.setCompanyUserId(param.getCompanyUserId());
+        // 添加关系表数据
+        if (Objects.isNull(userCompanyUser)){
+            userCompanyUserService.save(getFsUserCompanyUser(param));
         }
+
         // 特殊(需求设计:需要根据公司是否开启黑名单来设置会员初始化的状态)
         Company company = null;
         if(param.getCompanyId() != null) {
@@ -1000,14 +993,11 @@ public class FsUserServiceImpl implements IFsUserService
     }
 
     // 添加关系表数据
-    private static FsUserCompanyUser getFsUserCompanyUser(FsUserCourseBeMemberParam param, FsUser fsUser) {
+    private FsUserCompanyUser getFsUserCompanyUser(FsUserCourseBeMemberParam param) {
         FsUserCompanyUser fsUserCompanyUser = new FsUserCompanyUser();
         // 判断是否绑定了销售,如果已绑定,则需要标识为重粉,且放黑名单
-        if (fsUser.getCompanyUserId() != null && !fsUser.getCompanyUserId().equals(param.getCompanyUserId())) {
-            fsUserCompanyUser.setIsRepeatFans(1);
-        } else {
-            fsUserCompanyUser.setIsRepeatFans(0);
-        }
+        boolean hasBind = userCompanyUserService.hasBind(param.getUserId(), param.getCompanyUserId());
+        fsUserCompanyUser.setIsRepeatFans(hasBind ? 1 : 0);
         fsUserCompanyUser.setUserId(param.getUserId());
         fsUserCompanyUser.setCompanyId(param.getCompanyId());
         fsUserCompanyUser.setCompanyUserId(param.getCompanyUserId());

+ 6 - 0
fs-service-system/src/main/resources/db/upgrade/20250625会员关联项目.sql

@@ -0,0 +1,6 @@
+-- 微信用户和销售关系表添加项目ID
+alter table fs_user_company_user
+    add column project_id bigint comment '课程项目ID';
+
+alter table fs_user_company_user add constraint uk_user_project
+    unique (user_id, project_id);

+ 35 - 9
fs-user-app/src/main/java/com/fs/app/controller/WxCompanyUserController.java

@@ -3,9 +3,7 @@ package com.fs.app.controller;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
-import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.date.DateTime;
-import com.fs.app.annotation.Login;
 import com.fs.app.param.LoginMaWxParam;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
@@ -18,6 +16,8 @@ import com.fs.company.service.ICompanyDeptService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.store.domain.FsUser;
+import com.fs.store.domain.FsUserCompanyUser;
+import com.fs.store.service.IFsUserCompanyUserService;
 import com.fs.store.service.IFsUserService;
 import com.fs.wx.miniapp.config.WxMaConfiguration;
 import com.fs.wx.miniapp.config.WxMaProperties;
@@ -30,9 +30,14 @@ import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Date;
+import java.util.Objects;
 
 @Api("微信小程序相关接口")
 @RestController
@@ -61,10 +66,12 @@ public class WxCompanyUserController extends AppBaseController {
 
     @Autowired
     ICompanyService companyService;
+    @Autowired
+    private IFsUserCompanyUserService userCompanyUserService;
 
     @ApiOperation("小程序-授权登录")
     @PostMapping("/loginByMa")
-    public R login(@RequestBody LoginMaWxParam param) {
+    public R login(@Validated @RequestBody LoginMaWxParam param) {
         log.info("=====================进入小程序授权登录, 入参: {}", param);
         if (StringUtils.isBlank(param.getCode())) {
             return R.error("code不存在");
@@ -165,14 +172,16 @@ public class WxCompanyUserController extends AppBaseController {
                     userMap.setAvatar(param.getAvatar() != null ? param.getAvatar() : null);
                     userMap.setPhone(phoneNoInfo.getPhoneNumber());
                     // 逻辑调整:如果会员已经绑定了销售,直接提示,不让注册-2025年6月16日14点53分
-                    if (user.getCompanyUserId() != null && !param.getCompanyUserId().equals(user.getCompanyUserId())){
+                    FsUserCompanyUser userCompanyUser = userCompanyUserService.selectByUserIdAndProjectId(user.getUserId(), param.getProjectId());
+                    if (Objects.nonNull(userCompanyUser) && !param.getCompanyUserId().equals(userCompanyUser.getCompanyUserId())){
                         return R.error(406, "该用户已成为其他销售会员");
                     }
                     if(companyUser != null &&
                             (companyUser.getIsAllowedAllRegister() == null || companyUser.getIsAllowedAllRegister() == 1)
                             && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1){
-                        user.setCompanyId(param.getCompanyId());
-                        user.setCompanyUserId(param.getCompanyUserId());
+                        if (Objects.isNull(userCompanyUser)) {
+                            bindRelationship(user.getUserId(), param.getProjectId(), companyUser.getCompanyId(), companyUser.getUserId());
+                        }
                     }
                     userService.updateFsUser(userMap);
                 } else {
@@ -188,8 +197,7 @@ public class WxCompanyUserController extends AppBaseController {
                     if(companyUser != null &&
                             (companyUser.getIsAllowedAllRegister() == null || companyUser.getIsAllowedAllRegister() == 1)
                             && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1){
-                        user.setCompanyId(param.getCompanyId());
-                        user.setCompanyUserId(param.getCompanyUserId());
+                        bindRelationship(user.getUserId(), param.getProjectId(), companyUser.getCompanyId(), companyUser.getUserId());
                     }
                     userService.insertFsUser(user);
                 }
@@ -214,6 +222,24 @@ public class WxCompanyUserController extends AppBaseController {
         }
     }
 
+    /**
+     * 绑定用户、项目、销售关系
+     * @param userId            用户ID
+     * @param projectId         项目ID
+     * @param companyId         公司ID
+     * @param companyUserId     销售ID
+     */
+    private void bindRelationship(Long userId, Long projectId, Long companyId, Long companyUserId) {
+        FsUserCompanyUser userCompanyUser = new FsUserCompanyUser();
+        userCompanyUser.setUserId(userId);
+        userCompanyUser.setProjectId(projectId);
+        userCompanyUser.setCompanyId(companyId);
+        userCompanyUser.setCompanyUserId(companyUserId);
+        boolean hasBind = userCompanyUserService.hasBind(userId, companyUserId);
+        userCompanyUser.setIsRepeatFans(hasBind ? 1 : 0);
+        userCompanyUserService.insertFsUserCompanyUser(userCompanyUser);
+    }
+
 //    @Login(isMiniLogin = true)
 //    @ApiOperation("获取销售通过小程序登录后的用户信息")
 //    @GetMapping("/getMaUser")

+ 4 - 0
fs-user-app/src/main/java/com/fs/app/param/LoginMaWxParam.java

@@ -34,6 +34,10 @@ public class LoginMaWxParam implements Serializable {
     @ApiModelProperty(value = "用户头像")
     private String avatar;
 
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "课程归属项目id")
+    private Long projectId;
+
 //    @ApiModelProperty(value = "公司id,如果不是第一位销售,都需要传")
 //    private Long companyId;