Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

zyp před 1 měsícem
rodič
revize
d26848d7cd

+ 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();
     }
 }

+ 2 - 2
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -2786,8 +2786,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         for(FsStoreCartQueryVO vo:carts){
             //单个价格不能为0
             BigDecimal price = vo.getPrice();
-            if (price==null || price.compareTo(BigDecimal.ZERO)<=0){
-                return R.error("商品单价不能0");
+            if (price==null || price.compareTo(BigDecimal.ZERO)<0){
+                return R.error("商品单价不能小于0");
             }
             //更新购物车表
             FsStoreCart storeCart = new FsStoreCart();

+ 156 - 52
fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java

@@ -1,5 +1,7 @@
 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;
@@ -10,10 +12,14 @@ 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;
@@ -34,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-微信相关接口(后面不需要这个接口了,再删除))")
@@ -63,68 +70,165 @@ public class WxH5MpController {
     ICompanyUserService companyUserService;
     @Autowired
     private IFsUserCompanyUserService userCompanyUserService;
-
+    @Autowired
+    private IFsUserWxService fsUserWxService;
 
     @ApiOperation("课程分享链接公众号登录")
     @PostMapping("/loginByMp")
-    public R loginByMp(@Valid @RequestBody FsUserLoginByMpParam param) throws WxErrorException {
-//        try {
-            //获取微信用户信息
+    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);
-            //1、特殊(需求设计:需要根据公司是否开启黑名单来设置会员初始化的状态)
-            Company company = null;
-            if(param.getCompanyId() != null){
-                company = companyService.selectCompanyById(param.getCompanyId());
-            }
-            // 根据销售后台设置的  是否需要单独注册会员 来判断是否需要设置销售的值
-            CompanyUser companyUser = companyUserService.selectCompanyUserById(param.getCompanyUserId());
 
-            FsUser user;
-            if(StringUtils.isNotEmpty(wxMpUser.getUnionId())) {
-                user = userService.selectFsUserByUnionId(wxMpUser.getUnionId());
-            } else {
-                user = userService.selectFsUserByMpOpenId(wxMpUser.getOpenid());
+            // 处理用户信息
+            FsUser user = processUserInfo(wxMpUser, company,companyUser);
+
+            // 处理用户与公司的关系
+            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() + ")已成为其他销售会员");
             }
-            if (user != null) {
-                //修改
-                FsUser userMap = new FsUser();
-                userMap.setUserId(user.getUserId());
-                userMap.setMpOpenId(wxMpUser.getOpenid());
-                userMap.setUnionId(wxMpUser.getUnionId());
-                userMap.setUpdateTime(new DateTime());
-                userMap.setAvatar(wxMpUser.getHeadImgUrl());
-                userMap.setNickname(wxMpUser.getNickname());
-                userService.updateFsUser(userMap);
+
+            // 生成token并返回结果
+            return generateLoginResult(user);
+        } catch (WxErrorException e) {
+            this.logger.error(e.getMessage(), e);
+            return R.error("授权失败," + e.getMessage());
+        }
+    }
+
+    private FsUser processUserInfo(WxOAuth2UserInfo wxMpUser, Company company,CompanyUser companyUser) {
+        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.setCompanyId(company.getCompanyId());
+            newUser.setCompanyUserId(companyUser.getUserId());
+            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("处理用户与小程序的绑定")
+    @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 {
-                //新增
-                user = new FsUser();
-                user.setNickname(wxMpUser.getNickname());
-                user.setAvatar(wxMpUser.getHeadImgUrl());
-                user.setMpOpenId(wxMpUser.getOpenid());
-                user.setUnionId(wxMpUser.getUnionId());
-                user.setCreateTime(new Date());
-                userService.insertFsUser(user);
-                if((companyUser.getIsAllowedAllRegister() == null || companyUser.getIsAllowedAllRegister() != 0) && companyUser.getIsNeedRegisterMember() != 1){
-                    int defaultStatus = (company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1;
-                    userCompanyUserService.bindRelationship(user.getUserId(), param.getProjectId(), companyUser.getCompanyId(), companyUser.getUserId(), defaultStatus);
-                }
+                return R.error("获取用户信息失败," + e.getMessage());
             }
-            log.error("用户信息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);
-//        } 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, user.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(user.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);
+        }
     }
 
 }

+ 7 - 0
fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByMpParam.java

@@ -23,4 +23,11 @@ public class FsUserLoginByMpParam implements Serializable {
     @NotNull(message = "项目ID不能为空")
     @ApiModelProperty(value = "项目ID")
     private Long projectId;
+
+    private String appId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
 }