Selaa lähdekoodia

update:发送福袋,已经看课挂小黄车

ct 3 päivää sitten
vanhempi
commit
fce911041c

+ 22 - 0
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -15,6 +15,7 @@ import com.fs.config.ai.AiHostProper;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.domain.FsUserCourseVideo;
+import com.fs.course.domain.LuckyBagCollectRecord;
 import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.service.IFsCoursePlaySourceConfigService;
@@ -29,6 +30,7 @@ import com.fs.live.mapper.LiveWatchLogMapper;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.domain.QwUserVideo;
+import com.fs.qw.mapper.LuckyBagCollectRecordMapper;
 import com.fs.qw.mapper.QwExternalContactMapper;
 import com.fs.qw.mapper.QwUserMapper;
 import com.fs.qw.service.IQwUserService;
@@ -41,6 +43,7 @@ import com.fs.sop.service.impl.QwSopLogsServiceImpl;
 import com.fs.wxwork.dto.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.json.JSONObject;
 import org.springframework.stereotype.Service;
@@ -89,6 +92,7 @@ public class IpadSendServer {
     private final IFsCoursePlaySourceConfigService playSourceConfigService;
     private final FsUserMapper fsUserMapper;
     private final FsUserCourseVideoMapper fsUserCourseVideoMapper;
+    private final LuckyBagCollectRecordMapper luckyBagCollectRecordMapper;
 
 
     private static final List<String> PROJECT_NAMES = Arrays.asList("济南联志健康", "北京存在文化","宽益堂");
@@ -727,6 +731,12 @@ public class IpadSendServer {
                     // 语音
                     sendWxVideo(vo, content);
                     break;
+                case "14":
+                    // 记录福袋发送记录
+                    addLuckyBagCollectRecord(vo, content,qwSopLogs);
+                    // 福袋
+                    sendMiniProgram(vo, content, miniMap,qwUser.getCompanyId());
+                    break;
                 case "99":
                     // 群发
                     sendTxtAtMsg(vo);
@@ -741,6 +751,18 @@ public class IpadSendServer {
             content.setSendRemarks("发送失败:" + e.getMessage());
         }
     }
+    private void addLuckyBagCollectRecord(BaseVo vo,QwSopCourseFinishTempSetting.Setting content,QwSopLogs qwSopLogs) {
+        try {
+            // 写入福袋发放记录
+            LuckyBagCollectRecord luckyBagCollectRecord = luckyBagCollectRecordMapper.selectLuckyBagCollectRecordById(Long.valueOf(content.getBusinessId()));
+            luckyBagCollectRecord.setSendTime(new Date());
+            luckyBagCollectRecord.setCollectType("0");
+            luckyBagCollectRecordMapper.updateLuckyBagCollectRecord(luckyBagCollectRecord);
+
+        }catch (Exception e){
+            log.error("ID:" + qwSopLogs.getId() + "-添加福袋记录失败", e);
+        }
+    }
 
     public void loginOut(QwUser user) {
         ipadSendUtils.loginOut(user.getUid(), user.getServerId());

+ 4 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java

@@ -250,4 +250,8 @@ public interface IFsUserCourseVideoService extends IService<FsUserCourseVideo> {
     R createRoomMiniLinkByCourse(FsCourseLinkRoomNewParam param);
 
     void updateMediaPublishStatus(String vid);
+
+    R registerQwFsUserFinish(FsUserCourseVideoAddKfUParam param);
+
+    R registerQwFsUser(FsUserCourseVideoAddKfUParam param);
 }

+ 193 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.course.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -9,6 +10,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
@@ -52,6 +56,7 @@ import com.fs.his.config.AppConfig;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserIntegralLogs;
 import com.fs.his.domain.FsUserWx;
+import com.fs.his.mapper.FsPackageMapper;
 import com.fs.his.mapper.FsUserIntegralLogsMapper;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.param.WxSendRedPacketParam;
@@ -60,6 +65,7 @@ import com.fs.his.service.IFsUserIntegralLogsService;
 import com.fs.his.service.IFsUserService;
 import com.fs.his.service.IFsUserWxService;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.his.vo.FsPackageListVO;
 import com.fs.his.vo.OptionsVO;
 import com.fs.im.service.OpenIMService;
 import com.fs.qw.domain.*;
@@ -269,6 +275,12 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     @Autowired
     private IFsCourseLinkService linkService;
 
+    @Autowired
+    private FsDepVideoShowMapper fsDepVideoShowMapper;
+
+    @Autowired
+    private FsPackageMapper fsPackageMapper;
+
 
     /**
      * 查询课堂视频
@@ -2812,6 +2824,9 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         // 1、获取视频详情、问题详情
         ResponseResult<FsUserCourseVideoDetailsVO> videoDetails = this.getVideoDetails(param.getVideoId());
         FsUserCourseVideoDetailsVO courseVideoDetails = videoDetails.getData() != null ? videoDetails.getData() : null;
+        if(courseVideoDetails != null){
+            getGoodsAndShow(param.getVideoId(),courseVideoDetails);
+        }
 
         //课程logo
         if (param.getPeriodId() != null) {
@@ -2929,6 +2944,44 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         return ResponseResult.ok(vo);
     }
 
+    /**
+     * 小黄车商品和展示
+     */
+    private void getGoodsAndShow(Long videoId, FsUserCourseVideoDetailsVO vo) {
+        String show = fsDepVideoShowMapper.selectFsDepVideoShowByVideoId(videoId, null);
+        vo.setShowTreatment(ObjectUtil.isEmpty(show) ? "1" : show);
+
+        FsUserCourseVideo courseVideo = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(videoId);
+        String packageJson = courseVideo.getPackageJson();
+        if (StringUtils.isNotEmpty(packageJson)) {
+            List<String> packageIds = new ArrayList<>();
+            ObjectMapper objectMapper = new ObjectMapper();
+            JsonNode jsonNode = null;
+            try {
+                jsonNode = objectMapper.readTree(packageJson);
+            } catch (JsonProcessingException e) {
+                throw new RuntimeException(e);
+            }
+            if (jsonNode.isArray()) {
+                for (JsonNode node : jsonNode) {
+                    String packageId = node.path("packageId").asText();
+                    if (StringUtils.isNotEmpty(packageId)) {
+                        packageIds.add(packageId);
+                    }
+                }
+                List<FsPackageListVO> fsPackageListVOS = new ArrayList<>();
+                if (!packageIds.isEmpty()) {
+                    fsPackageListVOS = fsPackageMapper.selectFsPackagesByIds(packageIds);
+                }else {
+                    fsPackageListVOS = new ArrayList<>();
+                }
+                vo.setTreatmentPackage(fsPackageListVOS);
+            }
+        }else {
+            vo.setTreatmentPackage(new ArrayList<>());
+        }
+    }
+
     /**
      * @Description: 是否看课中断
      * @Param:
@@ -4533,6 +4586,146 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         }
     }
 
+    @Override
+    public R registerQwFsUserFinish(FsUserCourseVideoAddKfUParam param) {// 查询用户
+        FsUser fsUser = fsUserMapper.selectFsUserByUserId(param.getUserId());
+
+        // 不能反401 前端会絮乱
+        // 用户不存在唤起重新授权
+        if (fsUser == null) {
+            return R.error("用户不存在");
+        }
+//        if (StringUtils.isNotEmpty(fsUser.getNickName())
+//                &&fsUser.getNickName().equals("微信用户")) {
+//            return R.error(409, "请重新登录用户!");
+//        }
+        if (fsUser.getStatus() != null && fsUser.getStatus() == 0) {
+            return R.error("会员被停用,无权限,请联系客服!");
+        }
+
+        // 处理群聊逻辑
+        if (param.getChatId() != null && StringUtils.isNotEmpty(param.getChatId())) {
+            QwGroupChat qwGroupChat = qwGroupChatMapper.selectQwGroupChatByChatId(param.getChatId());
+            if (qwGroupChat == null) {
+                logger.error("群聊不存在,chatId: {}", param.getChatId());
+                return R.error("群聊不存在!");
+            }
+
+            SopUserLogsInfo sopUserLogsInfo = new SopUserLogsInfo();
+            sopUserLogsInfo.setChatId(param.getChatId());
+            List<QwGroupChatUser> qwGroupChatUsers = qwGroupChatUserMapper.selectByChatId(sopUserLogsInfo);
+
+            if (qwGroupChatUsers == null || qwGroupChatUsers.isEmpty()) {
+                logger.error("群聊用户为空,chatId: {}", param.getChatId());
+                return R.error("群聊用户为空!");
+            }
+
+            QwExternalContact qwExternalContact =
+                    qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
+                            .eq("user_id", qwGroupChat.getOwner())
+                            .eq("fs_user_id", param.getUserId())
+                            .eq("corp_id", param.getCorpId())
+                            .eq("status",0));
+            if(null == qwExternalContact){
+                try{
+                    //修改成通过昵称匹配
+                    qwExternalContact =
+                            qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
+                                    .eq("user_id", qwGroupChat.getOwner())
+                                    .eq("name", fsUser.getNickName())
+                                    .eq("corp_id", param.getCorpId())
+                                    .eq("status",0));
+                } catch(Exception e){
+                    log.error("群聊用户昵称匹配异常,参数user_id:{},name:{},corp_id:{}",qwGroupChat.getOwner(),fsUser.getNickName(),param.getCorpId(),e);
+                }
+
+            }
+
+            if (qwExternalContact == null) {
+                return R.error("未查询到客户!");
+            }
+
+            QwExternalContact finalQwExternalContact = qwExternalContact;
+            if(qwGroupChatUsers.stream().noneMatch(e -> e.getUserId().equals(finalQwExternalContact.getExternalUserId()))){
+                log.error("客户不在群:{},里面:{}", qwGroupChat.getChatId(), qwExternalContact.getExternalUserId());
+                return R.error("客户不在群!");
+            }
+
+            logger.info("外部联系人数据:{}", qwExternalContact);
+
+            // 如果群在里面
+            if (qwExternalContact.getFsUserId() != null) {
+                // 有客户有小程序id,但登录的小程序id和根据外部联系人id查出来的小程序id不一致
+//                if (!qwExternalContact.getFsUserId().equals(param.getUserId())) {
+//                    logger.error("已注册,但绑定的userId,不一致param.getUserId{},qwExternalContact.getFsUserId(){}",param.getUserId(),qwExternalContact.getFsUserId());
+//                    return R.error("已注册!");
+//                }
+            }else {
+                // 未绑定
+                return R.error( "客户未绑定用户");
+            }
+
+
+        }else {
+            Long qwExternalId = param.getQwExternalId();
+
+            if (qwExternalId == null) {
+                return R.error("外部联系人ID不能为空");
+            }
+
+            // 查询外部联系人
+            QwExternalContact externalContact = qwExternalContactMapper.selectQwExternalContactById(qwExternalId);
+
+            // 如果查不出来客户信息,加好友
+            if (externalContact == null) {
+                return R.error("未查询到企微客户信息!");
+            }
+
+            if (externalContact.getFsUserId() != null) {
+                // 有客户有小程序id,但登录的小程序id和根据外部联系人id查出来的小程序id不一致
+//                if (!externalContact.getFsUserId().equals(param.getUserId())) {
+//                    logger.error("已注册,但绑定的userId,不一致param.getUserId{},qwExternalContact.getFsUserId(){}",param.getUserId(),externalContact.getFsUserId());
+//                    return R.error("已注册!");
+//                }
+            }else {
+                // 未绑定
+                return R.error( "客户未绑定用户");
+            }
+        }
+
+        return R.ok();
+    }
+
+    @Override
+    public R registerQwFsUser(FsUserCourseVideoAddKfUParam param) {
+        logger.info("zyp \n【判断添加客服】:{}", param);
+
+        // 参数校验
+        if (param == null) {
+            return R.error("参数不能为空");
+        }
+
+        // 查询用户
+        FsUser fsUser = fsUserMapper.selectFsUserByUserId(param.getUserId());
+
+        // 用户不存在唤起重新授权
+        if (fsUser == null) {
+            return R.error(401, "用户不存在");
+        }
+
+        if (fsUser.getStatus() != null && fsUser.getStatus() == 0) {
+            return R.error("会员被停用,无权限,请联系客服!");
+        }
+
+        // 处理群聊逻辑
+        if (param.getChatId() != null) {
+            return handleGroupChatLogic(param,fsUser);
+        }
+
+        // 处理普通外部联系人逻辑
+        return handleExternalContactLogic(param, fsUser);
+    }
+
 
     public void uploadSingleTaskWithRetry(FsVideoResource videoResource,Integer type) {
         int maxRetry = 3;

+ 11 - 0
fs-service/src/main/java/com/fs/course/vo/newfs/FsUserCourseVideoDetailsVO.java

@@ -1,5 +1,6 @@
 package com.fs.course.vo.newfs;
 
+import com.fs.his.vo.FsPackageListVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -39,4 +40,14 @@ public class FsUserCourseVideoDetailsVO {
     @ApiModelProperty(value = "题库内容")
     private List<FsUserVideoQuestionVO> questionBankList;
 
+    /**
+     * 疗法包套餐
+     */
+    private List<FsPackageListVO> treatmentPackage;
+
+    /**
+     * 疗法包展示
+     */
+    private String showTreatment;
+
 }

+ 19 - 0
fs-user-app/src/main/java/com/fs/app/controller/CourseController.java

@@ -355,4 +355,23 @@ public class CourseController extends  AppBaseController{
         log.info("zyp \n【发放APP奖励】:{}",param);
         return courseVideoService.sendAppReward(param);
     }
+
+    @Login
+    @ApiOperation("判断是否注册")
+    @PostMapping("/registerQwFsUserFinish")
+    public R registerQwFsUserFinish(@RequestBody FsUserCourseVideoAddKfUParam param) {
+        Long userId = Long.parseLong(getUserId());
+        param.setUserId(userId);
+        return courseVideoService.registerQwFsUserFinish(param);
+    }
+
+
+    @Login
+    @ApiOperation("注册链接接口")
+    @PostMapping("/registerQwFsUser")
+    public R registerQwFsUser(@RequestBody FsUserCourseVideoAddKfUParam param) {
+        Long userId = Long.parseLong(getUserId());
+        param.setUserId(userId);
+        return courseVideoService.registerQwFsUser(param);
+    }
 }

+ 55 - 0
fs-user-app/src/main/java/com/fs/app/controller/LuckyBagController.java

@@ -0,0 +1,55 @@
+package com.fs.app.controller;
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.R;
+import com.fs.his.domain.FsUser;
+import com.fs.his.param.FsReceiveLuckyBagParam;
+import com.fs.his.service.IFsUserService;
+import com.fs.qw.service.ILuckyBagService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @description: 福袋控制器 福袋信息 领取福袋
+ * @author: Xgb
+ * @createDate: 2025/11/20
+ * @version: 1.0
+ */
+@Api("福袋接口")
+@RestController
+@RequestMapping(value="/app/luckyBag")
+public class LuckyBagController extends  AppBaseController {
+
+
+    @Autowired
+    private ILuckyBagService luckyBagService;
+
+    @Autowired
+    private IFsUserService userService;
+
+    @ApiOperation("获取福袋详情信息")
+    @GetMapping("/getLuckyBagInfo")
+    public R getLuckyBagInfo(@RequestParam("recordId")Long recordId, HttpServletRequest request){
+        return luckyBagService.getLuckyBagInfoByRecordId(recordId);
+    }
+
+    @Login
+    @ApiOperation("领取福袋")
+    @PostMapping("/receiveLuckyBag")
+    public R receiveLuckyBag(@RequestBody FsReceiveLuckyBagParam param, HttpServletRequest request){
+
+        Long userId = Long.parseLong(getUserId());
+//        Long userId = param.getUserId();
+        FsUser user=userService.selectFsUserByUserId(userId);
+        param.setUserId(user.getUserId());
+        param.setUserName(user.getNickName());
+        return luckyBagService.receiveLuckyBag(param,user);
+
+    }
+
+
+}

+ 63 - 1
fs-user-app/src/main/java/com/fs/app/controller/WxMpController.java

@@ -46,7 +46,7 @@ import java.util.concurrent.TimeUnit;
 
 @RestController
 @RequestMapping("/app/wx/mp")
-public class WxMpController {
+public class WxMpController extends AppBaseController{
   Logger logger= LoggerFactory.getLogger(getClass());
   @Autowired
   private WxMpService wxMpService;
@@ -197,6 +197,68 @@ public class WxMpController {
 
     }
 
+  @ApiOperation("课程短链公众号登录")
+  @PostMapping("/mpByLogin")
+  @Transactional
+  public R mpByLogin( @RequestBody FsUserLoginByMpParam param) {
+
+    if (StringUtils.isBlank(param.getCode())) {
+      return R.error("code不存在");
+    }
+    try{
+      wxMpService.switchoverTo("wxd59797042932c49a");
+      WxOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.getOAuth2Service().getAccessToken(param.getCode());
+      WxOAuth2UserInfo wxMpUser = wxMpService.getOAuth2Service().getUserInfo(wxMpOAuth2AccessToken, null);
+      WxMpUserService wxMpUserService = wxMpService.getUserService();
+      WxMpUser userInfo = wxMpUserService.userInfo(wxMpUser.getOpenid());
+//      if (!userInfo.getSubscribe()){
+//        return R.error("请关注公众号进行登录");
+//      }
+      FsUser user=userService.selectFsUserByUnionid(wxMpUser.getUnionId());
+      if(user!=null){
+        FsUser userMap=new FsUser();
+        userMap.setUserId(user.getUserId());
+        userMap.setNickName(wxMpUser.getNickname());
+        userMap.setAvatar(wxMpUser.getHeadImgUrl());
+        userMap.setMpOpenId(wxMpUser.getOpenid());
+        userMap.setUpdateTime(new DateTime());
+        userService.updateFsUser(userMap);
+      }
+      else{
+        //写入
+//        String code=genCode();
+        user=new FsUser();
+//        user.setPhone(code);
+        user.setNickName(wxMpUser.getNickname());
+        user.setAvatar(wxMpUser.getHeadImgUrl());
+        user.setStatus(1);
+        user.setSex(wxMpUser.getSex());
+        user.setMpOpenId(wxMpUser.getOpenid());
+        user.setUnionId(wxMpUser.getUnionId());
+        user.setCreateTime(new Date());
+        userService.insertFsUser(user);
+      }
+      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);
+      logger.info("zyp \n 【点播公众号登录】:{}",user.getUserId());
+      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());
+      }
+    }
+
+  }
+
+
 
 
 

+ 83 - 0
fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java

@@ -8,6 +8,7 @@ import cn.hutool.core.date.DateTime;
 import com.alibaba.fastjson.JSON;
 import com.fs.app.annotation.Login;
 import com.fs.app.annotation.UserOperationLog;
+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;
@@ -460,4 +461,86 @@ public class WxUserController extends AppBaseController{
         return currentAppIds + "," + newAppId;
     }
 
+
+    @ApiOperation("处理用户与小程序的绑定")
+    @PostMapping("/handleFsUserWx")
+    public R handleFsUserWx(@RequestBody FsUserLoginByMpParam param) {
+
+        SysConfig sysConfig3 = sysConfigMapper.selectConfigByConfigKey("courseMa.config");
+        List<CourseMaConfig> courseMaConfigs = JSON.parseArray(sysConfig3.getConfigValue(), CourseMaConfig.class);
+        if (courseMaConfigs.isEmpty()){
+            return R.error("小程序配置为空");
+        }
+        // 根据appId匹配配置
+        CourseMaConfig matchedConfig = courseMaConfigs.stream()
+                .filter(config -> param.getAppId().equals(config.getAppid()))
+                .findFirst()
+                .orElse(null);
+
+        if (matchedConfig == null) {
+            return R.error("未找到匹配的小程序配置");
+        }
+        return handleCourseLogin1(param,
+                () -> WxMaConfiguration.getMaService(matchedConfig.getAppid()),
+                matchedConfig.getName());
+
+//    final WxMaService wxService = WxMaConfiguration.getMaService(param.getAppId());
+//    try {
+//      //获取微信用户信息
+//      WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+//
+//      FsUser user = userService.selectFsUserByUserId(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 R handleCourseLogin1(FsUserLoginByMpParam param, Supplier<WxMaService> wxServiceSupplier, String logName) {
+        if (StringUtils.isBlank(param.getCode())) {
+            return R.error("code不存在");
+        }
+
+        try {
+            // 通过函数式接口获取不同的微信服务实例
+            final WxMaService wxService = wxServiceSupplier.get();
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            this.logger.info("获取{} Session:{}", logName, session);
+
+            FsUser user = userService.selectFsUserByUserId(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());
+            }
+        }
+    }
+
+    @Autowired
+    private IFsUserWxService fsUserWxService;
+    /**
+     * 处理用户与小程序的绑定
+     */
+    private void handleFsUserWx(FsUser user, FsUserLoginByMpParam param, WxMaJscode2SessionResult session) {
+        if (user == null) return;
+        FsUserWx fsUserWx = new FsUserWx();
+        fsUserWx.setType(1);
+        fsUserWx.setFsUserId(user.getUserId());
+        fsUserWx.setAppId(param.getAppId());
+        fsUserWx.setOpenId(session.getOpenid());
+        fsUserWx.setUnionId(session.getUnionid() != null ? session.getUnionid() : null);
+        fsUserWx.setCreateTime(new Date());
+        fsUserWx.setUpdateTime(new Date());
+        fsUserWxService.saveOrUpdateByUniqueKey(fsUserWx);
+    }
+
 }