Sfoglia il codice sorgente

1、更改微信授权登录业务逻辑
2、新增处理用户与小程序的绑定接口

yfh 2 mesi fa
parent
commit
dd6bed6c31

+ 25 - 5
fs-admin/src/test/java/com/fs/course/controller/AdHtmlClickLogServiceImplTest.java

@@ -1,29 +1,49 @@
 package com.fs.course.controller;
 
 
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fs.FSAdminApplication;
+import com.fs.common.utils.ParseUtils;
 import com.fs.course.param.InternetTrafficParam;
 import com.fs.course.service.IFsCourseTrafficLogService;
+import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.store.domain.FsUser;
+import com.fs.store.service.IFsUserService;
+import com.fs.store.vo.FSUserVO;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 @RunWith(org.springframework.test.context.junit4.SpringRunner.class)
+@ActiveProfiles("druid-zkzh-test")
 @SpringBootTest(classes = FSAdminApplication.class)
 @Slf4j
 public class AdHtmlClickLogServiceImplTest {
     @Autowired
     private IFsCourseTrafficLogService fsCourseTrafficLogService;
-
+    @Autowired
+    private IFsUserService fsUserService;
+    @Autowired
+    private IFsCourseWatchLogService fsCourseWatchLogService;
     @Test
     public void test(){
-//        InternetTrafficParam internetTrafficParam = new InternetTrafficParam();
-//        internetTrafficParam.setAccount("1");
-//        fsCourseTrafficLogService.updateTrafficStatus(internetTrafficParam);
-        fsCourseTrafficLogService.sumTrafficlog();
+        FsUser fsUser =new FsUser();
+        fsUser.setUserId(177063L);
+        List<FSUserVO> list = fsUserService.selectFsUserVOListByProject(fsUser);
+        for (FSUserVO vo : list){
+            vo.setPhone(ParseUtils.parsePhone(vo.getPhone()));
+            Long watchCourseCount = fsCourseWatchLogService.selectFsCourseWatchLogCount(vo.getUserId(),vo.getProjectId());
+            if (ObjectUtils.isNotEmpty(watchCourseCount)){
+                vo.setWatchCourseCount(watchCourseCount);
+            }
+        }
+        System.out.println(list);
+//        fsCourseTrafficLogService.sumTrafficlog();
     }
 }

+ 161 - 40
fs-company-app/src/main/java/com/fs/app/controller/WxH5MpController.java

@@ -1,14 +1,25 @@
 package com.fs.app.controller;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.hutool.core.date.DateTime;
 import com.fs.app.param.FsUserLoginByMpParam;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.fs.his.domain.FsUserWx;
+import com.fs.his.service.IFsUserWxService;
 import com.fs.qw.mapper.QwExternalContactMapper;
 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 io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -29,6 +40,7 @@ import javax.validation.Valid;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 @Api("会员-h5-微信相关接口")
@@ -42,6 +54,8 @@ public class WxH5MpController {
 
     @Autowired
     private IFsUserService userService;
+    @Autowired
+    private IFsUserWxService fsUserWxService;
 
     @Autowired
     JwtUtils jwtUtils;
@@ -52,58 +66,120 @@ public class WxH5MpController {
     FsCourseWatchLogMapper fsCourseWatchLogMapper;
     @Autowired
     QwExternalContactMapper qwExternalContactMapper;
+    @Autowired
+    ICompanyService companyService;
+    @Autowired
+    private IFsUserCompanyUserService userCompanyUserService;
 
+    @Autowired
+    private ICompanyUserService companyUserService;
 
     @ApiOperation("微信授权登录成为会员")
     @PostMapping("/loginByMp")
     public R loginByMp(@Valid @RequestBody FsUserLoginByMpParam param) {
+        log.info("=====================进入小程序授权登录, 入参: {}", param);
+
+        // 参数校验
+        if (StringUtils.isBlank(param.getCode())) {
+            return R.error("code不存在");
+        }
+
+        // 公司状态校验
+        Company company = companyService.selectCompanyById(param.getCompanyId());
+        if (company == null || company.getStatus() == 0) {
+            return R.error("注册失败团队已停用,或不存在!");
+        }
+
+        // 客服状态校验
+        CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
+        if (companyUser == null || "1".equals(companyUser.getStatus())) {
+            return R.error("注册失败客服已停用,或不存在!");
+        }
+
         try {
-            //获取微信用户信息
+            // 获取微信用户信息
             WxOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(param.getCode());
             WxOAuth2UserInfo wxMpUser = wxMpService.getOAuth2Service().getUserInfo(wxMpOAuth2AccessToken, null);
-//            FsUser user = userService.selectFsUserByUnionid(wxMpUser.getUnionId());
-            FsUser user;
-            if(StringUtils.isNotEmpty(wxMpUser.getUnionId())) {
-                user = userService.selectFsUserByUnionId(wxMpUser.getUnionId());
-            } else {
-                user = userService.selectFsUserByMpOpenId(wxMpUser.getOpenid());
-            }
-            if (user != null) {
-                //修改
-                FsUser userMap = new FsUser();
-                userMap.setUserId(user.getUserId());
-                userMap.setMpOpenId(wxMpUser.getOpenid());
-                userMap.setUnionId(wxMpUser.getUnionId());
-                userMap.setUpdateTime(new DateTime());
-                userMap.setNickname(wxMpUser.getNickname());
-                userMap.setAvatar(wxMpUser.getHeadImgUrl());
-                userService.updateFsUser(userMap);
-            } else {
-                //新增
-                user = new FsUser();
-                user.setNickname(wxMpUser.getNickname());
-                user.setAvatar(wxMpUser.getHeadImgUrl());
-                user.setStatus(1);
-                user.setMpOpenId(wxMpUser.getOpenid());
-                user.setUnionId(wxMpUser.getUnionId());
-                user.setCreateTime(new Date());
-                userService.insertFsUser(user);
+
+            // 处理用户信息
+            FsUser user = processUserInfo(wxMpUser, company);
+
+            // 处理用户与公司的关系
+            processUserCompanyRelationship(user, param, companyUser, company);
+
+            // 检查用户是否已绑定其他销售
+            FsUserCompanyUser userCompanyUser = userCompanyUserService.selectByUserIdAndProjectId(user.getUserId(), param.getProjectId());
+            if (Objects.nonNull(userCompanyUser) && !param.getCompanyUserId().equals(userCompanyUser.getCompanyUserId())){
+                return R.error(500, "该用户("+user.getUserId() + ")已成为其他销售会员");
             }
-            log.info("用户信息user: {}, 用户id: {}", user, user.getUserId());
-            String token = jwtUtils.generateToken(user.getUserId());
-            redisCache.setCacheObject("token:" + user.getUserId(), token, 604800, TimeUnit.SECONDS);
-            Map<String, Object> map = new HashMap<>();
-            map.put("token", token);
-            map.put("user", user);
-            return R.ok(map);
+
+            // 生成token并返回结果
+            return generateLoginResult(user);
         } catch (WxErrorException e) {
-            if (e.getError().getErrorCode() == 40163) {
-                return R.error(40163, e.getError().getErrorMsg());
-            } else {
-                return R.error("授权失败," + e.getMessage());
-            }
+            this.logger.error(e.getMessage(), e);
+            return R.error("授权失败," + e.getMessage());
         }
+    }
 
+    private FsUser processUserInfo(WxOAuth2UserInfo wxMpUser, Company company) {
+        FsUser user = userService.selectFsUserByUnionId(wxMpUser.getUnionId());
+
+        if (user != null) {
+            // 更新现有用户信息
+            FsUser userUpdate = new FsUser();
+            userUpdate.setUserId(user.getUserId());
+            userUpdate.setMpOpenId(wxMpUser.getOpenid());
+            userUpdate.setUnionId(wxMpUser.getUnionId());
+            userUpdate.setUpdateTime(new DateTime());
+            userUpdate.setNickname(wxMpUser.getNickname());
+            userUpdate.setAvatar(wxMpUser.getHeadImgUrl());
+            userService.updateFsUser(userUpdate);
+            return userUpdate;
+        } else {
+            // 创建新用户
+            FsUser newUser = new FsUser();
+            newUser.setNickname(wxMpUser.getNickname());
+            newUser.setAvatar(wxMpUser.getHeadImgUrl());
+            newUser.setStatus(1);
+            newUser.setMpOpenId(wxMpUser.getOpenid());
+            newUser.setUnionId(wxMpUser.getUnionId());
+            newUser.setCreateTime(new Date());
+            newUser.setStatus(company != null && company.getFsUserIsDefaultBlack() == 1 ? 0 : 1);
+            userService.insertFsUser(newUser);
+            return newUser;
+        }
+    }
+
+    private void processUserCompanyRelationship(FsUser user, FsUserLoginByMpParam param,
+                                                CompanyUser companyUser, Company company) {
+        if ((companyUser.getIsAllowedAllRegister() == null || companyUser.getIsAllowedAllRegister() == 1)
+                && companyUser.getIsNeedRegisterMember() != null && companyUser.getIsNeedRegisterMember() != 1) {
+            int defaultStatus = (company != null && company.getFsUserIsDefaultBlack() == 1) ? 0 : 1;
+            userCompanyUserService.bindRelationship(
+                    user.getUserId(),
+                    param.getProjectId(),
+                    companyUser.getCompanyId(),
+                    companyUser.getUserId(),
+                    defaultStatus
+            );
+        }
+    }
+
+    private R generateLoginResult(FsUser user) {
+        String token = jwtUtils.generateToken(user.getUserId());
+        redisCache.setCacheObject("token:" + user.getUserId(), token, 604800, TimeUnit.SECONDS);
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("token", token);
+        result.put("user", user);
+        return R.ok(result);
+    }
+
+    private R handleWxErrorException(WxErrorException e) {
+        if (e.getError().getErrorCode() == 40163) {
+            return R.error(40163, e.getError().getErrorMsg());
+        }
+        return R.error("授权失败," + e.getMessage());
     }
 
     @ApiOperation("单独返回用户头像和昵称的接口,不保存用户数据")
@@ -129,6 +205,51 @@ public class WxH5MpController {
         }
 
     }
+    @ApiOperation("处理用户与小程序的绑定")
+    @PostMapping("/handleFsUserWx")
+    public R handleFsUserWx(@RequestBody FsUserLoginByMpParam param) {
+        try {
+            final WxMaService wxService = WxMaConfiguration.getMaService(param.getAppId());
+            //获取微信用户信息
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
 
+            FsUser user = userService.selectFsUserById(param.getUserId());
+            handleFsUserWx(user, param, session);
+            return R.ok();
+        } catch (WxErrorException e) {
+            if (e.getError().getErrorCode() == 40163) {
+                return R.error(40163, e.getError().getErrorMsg());
+            } else {
+                return R.error("获取用户信息失败," + e.getMessage());
+            }
+        }
+
+    }
+    private void handleFsUserWx(FsUser user, FsUserLoginByMpParam param, WxMaJscode2SessionResult session) {
+        if (user == null) return;
+        // 尝试更新
+        boolean updated = fsUserWxService.lambdaUpdate()
+                .eq(FsUserWx::getFsUserId, user.getUserId())
+                .eq(FsUserWx::getAppId, param.getAppId())
+                .eq(FsUserWx::getOpenId, session.getOpenid())
+                .set(FsUserWx::getCompanyId, param.getCompanyId())
+                .set(FsUserWx::getUnionId, session.getUnionid() == null ? "" : session.getUnionid())
+                .set(FsUserWx::getUpdateTime, new Date())
+                .update();
+
+        // 如果更新失败(记录不存在),则插入
+        if (!updated) {
+            FsUserWx fsUserWx = new FsUserWx();
+            fsUserWx.setType(1);
+            fsUserWx.setFsUserId(user.getUserId());
+            fsUserWx.setCompanyId(param.getCompanyId());
+            fsUserWx.setAppId(param.getAppId());
+            fsUserWx.setOpenId(session.getOpenid());
+            fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
+            fsUserWx.setCreateTime(new Date());
+            fsUserWx.setUpdateTime(new Date());
+            fsUserWxService.save(fsUserWx);
+        }
+    }
 
 }

+ 28 - 0
fs-company-app/src/main/java/com/fs/app/param/FsUserLoginByMpParam.java

@@ -1,11 +1,39 @@
 package com.fs.app.param;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
 @Data
 public class FsUserLoginByMpParam implements Serializable {
+
     @NotBlank(message = "code参数缺失")
+    @ApiModelProperty(value = "小程序登陆code")
     private String code;
+
+    @NotNull(message = "公司id不能为空")
+    @ApiModelProperty(value = "公司id")
+    private Long companyId;
+
+    @NotNull(message = "销售id不能为空")
+    @ApiModelProperty(value = "销售id")
+    private Long companyUserId;
+
+    //    @NotBlank(message = "用户昵称不能为空")
+    @ApiModelProperty(value = "用户昵称")
+    private String nickname;
+
+    @NotNull(message = "项目id不能为空")
+    @ApiModelProperty(value = "课程归属项目id")
+    private Long projectId;
+
+    private String appId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
 }