Jelajahi Sumber

28:多个小程序、公众号关联不同的销售端

Long 1 Minggu lalu
induk
melakukan
3a9ba7d955

+ 9 - 0
fs-service/src/main/java/com/fs/company/domain/Company.java

@@ -102,6 +102,15 @@ public class Company extends BaseEntity
     @TableField(exist = false)
     private List<String> rules;
 
+    /**
+     * 点播配置-公众号appId
+     */
+    private String courseMaAppId;
+    /**
+     * 点播配置-小程序appId
+     */
+    private String courseMiniAppId;
+
 //    public String getDoctorIds() {
 //        return doctorIds;
 //    }

+ 42 - 7
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1,18 +1,23 @@
 package com.fs.course.service.impl;
 
-import cn.hutool.core.util.NumberUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.BeanCopyUtils;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.date.DateUtil;
+import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
+import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.*;
@@ -29,11 +34,13 @@ import com.fs.course.vo.FsUserCourseVideoVO;
 import com.fs.course.vo.newfs.*;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserIntegralLogs;
+import com.fs.his.domain.FsUserWx;
 import com.fs.his.mapper.FsUserIntegralLogsMapper;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.service.IFsUserService;
+import com.fs.his.service.IFsUserWxService;
 import com.fs.his.vo.OptionsVO;
 import com.fs.qw.domain.QwCompany;
 import com.fs.qw.domain.QwExternalContact;
@@ -64,7 +71,6 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
-import java.time.LocalTime;
 import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -172,6 +178,10 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
     private IQwExternalContactService qwExternalContactService;
     @Autowired
     private IQwCompanyService iQwCompanyService;
+    @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
+    private IFsUserWxService fsUserWxService;
 
 
     /**
@@ -841,11 +851,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
         // 准备发送红包参数
         WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
-        packetParam.setOpenId(user.getMpOpenId());
-        // 来源是小程序切换openId
-        if (param.getSource() == 2) {
-            packetParam.setOpenId(user.getCourseMaOpenId());
-        }
+        packetParam.setOpenId(getOpenId(user.getUserId(), param.getCompanyId(), param.getSource()));
         packetParam.setAmount(amount);
         packetParam.setSource(param.getSource());
         packetParam.setRedPacketMode(config.getRedPacketMode());
@@ -890,6 +896,35 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         }
     }
 
+    /**
+     * 获取用户openId
+     *
+     * @param userId    用户ID
+     * @param companyId 公司ID
+     * @param source    来源 1公众号 2小程序
+     * @return openId
+     */
+    private String getOpenId(Long userId, Long companyId, Integer source) {
+        Company company = companyMapper.selectCompanyById(companyId);
+        String appId = source == 1 ? company.getCourseMaAppId() : company.getCourseMiniAppId();
+
+        // 公司配置为空时获取默认配置
+        if (StringUtils.isBlank(appId)) {
+            String json = configService.selectConfigByKey("course.config");
+            CourseConfig config = JSON.parseObject(json, CourseConfig.class);
+            appId = source == 1 ? config.getMpAppId() : config.getMiniprogramAppid();
+        }
+
+        // 查询openId
+        Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery().eq(FsUserWx::getFsUserId, userId).eq(FsUserWx::getAppId, appId);
+        FsUserWx fsUserWx = fsUserWxService.getOne(queryWrapper);
+        if (Objects.isNull(fsUserWx)) {
+            throw new CustomException("获取openId失败");
+        }
+
+        return fsUserWx.getOpenId();
+    }
+
     /**
      * 发放积分奖励
      *

+ 40 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserWx.java

@@ -0,0 +1,40 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@TableName("fs_user_wx")
+public class FsUserWx {
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /**
+     * 用户ID
+     */
+    private Long fsUserId;
+    /**
+     * 小程序/公众号appId
+     */
+    private String appId;
+    /**
+     * 微信unionId
+     */
+    private String unionId;
+    /**
+     * 微信openId
+     */
+    private String openId;
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+    /**
+     * 修改时间
+     */
+    private LocalDateTime updateTime;
+}

+ 7 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserWxMapper.java

@@ -0,0 +1,7 @@
+package com.fs.his.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsUserWx;
+
+public interface FsUserWxMapper extends BaseMapper<FsUserWx> {
+}

+ 7 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserWxService.java

@@ -0,0 +1,7 @@
+package com.fs.his.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsUserWx;
+
+public interface IFsUserWxService extends IService<FsUserWx> {
+}

+ 13 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserWxServiceImpl.java

@@ -0,0 +1,13 @@
+package com.fs.his.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.his.domain.FsUserWx;
+import com.fs.his.mapper.FsUserWxMapper;
+import com.fs.his.service.IFsUserWxService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+public class FsUserWxServiceImpl extends ServiceImpl<FsUserWxMapper, FsUserWx> implements IFsUserWxService {
+}

+ 11 - 1
fs-service/src/main/resources/mapper/company/CompanyMapper.xml

@@ -33,10 +33,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="doctorIds"    column="doctor_ids"    />
         <result property="restartTime"    column="restart_time"    />
         <result property="packageCateIds"    column="package_cate_ids"    />
+        <result property="courseMaAppId"    column="course_ma_app_id"    />
+        <result property="courseMiniAppId"    column="course_mini_app_id"    />
     </resultMap>
 
     <sql id="selectCompanyVo">
-        select company_id,follow_doctor_ids,doctor_ids, company_name,manager, company_mobile, company_address, create_time, update_time, status, start_time, limit_time, money ,tui_money, voice_api_id,company_type,user_id,app_id,app_key,remark,link_name,limit_user_count,is_del,voice_caller_number,oms_code,restart_time,package_cate_ids from company
+        select company_id,follow_doctor_ids,doctor_ids, company_name,manager, company_mobile, company_address, create_time, update_time, status, start_time, limit_time, money ,tui_money, voice_api_id,company_type,user_id,app_id,app_key,remark,link_name,limit_user_count,is_del,voice_caller_number,oms_code,restart_time,package_cate_ids,course_ma_app_id,course_mini_app_id from company
     </sql>
 
     <select id="selectCompanyList" parameterType="Company" resultMap="CompanyResult">
@@ -51,6 +53,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="voiceApiId != null "> and voice_api_id = #{voiceApiId}</if>
             <if test="restartTime != null "> and restart_time = #{restartTime}</if>
             <if test="packageCateIds != null "> and package_cate_ids = #{packageCateIds}</if>
+            <if test="courseMaAppId != null "> and course_ma_app_id = #{courseMaAppId}</if>
+            <if test="courseMiniAppId != null "> and course_mini_app_id = #{courseMiniAppId}</if>
         </where>
     </select>
 
@@ -87,6 +91,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorIds != null">doctor_ids,</if>
             <if test="restartTime != null">restart_time,</if>
             <if test="packageCateIds != null">package_cate_ids,</if>
+            <if test="courseMaAppId != null">course_ma_app_id,</if>
+            <if test="courseMiniAppId != null">course_mini_app_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyName != null">#{companyName},</if>
@@ -114,6 +120,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorIds != null">#{doctorIds},</if>
             <if test="restartTime != null">#{restartTime},</if>
             <if test="packageCateIds != null">#{packageCateIds},</if>
+            <if test="courseMaAppId != null">#{courseMaAppId},</if>
+            <if test="courseMiniAppId != null">#{courseMiniAppId},</if>
          </trim>
     </insert>
 
@@ -146,6 +154,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorIds != null">doctor_ids = #{doctorIds},</if>
             <if test="restartTime != null">restart_time = #{restartTime},</if>
             <if test="packageCateIds != null">package_cate_ids = #{packageCateIds},</if>
+            <if test="courseMaAppId != null">course_ma_app_id = #{courseMaAppId},</if>
+            <if test="courseMiniAppId != null">course_mini_app_id = #{courseMiniAppId},</if>
         </trim>
         where company_id = #{companyId}
     </update>

+ 7 - 0
fs-service/src/main/resources/mapper/his/FsUserWxMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.his.mapper.FsUserWxMapper">
+
+</mapper>

+ 19 - 9
fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java

@@ -18,12 +18,10 @@ import com.fs.core.config.WxMaConfiguration;
 import com.fs.core.config.WxMpConfiguration;
 import com.fs.course.config.CourseMaConfig;
 import com.fs.his.config.FsSysConfig;
-import com.fs.his.domain.FsAgreementConfig;
-import com.fs.his.domain.FsStoreSysConfig;
-import com.fs.his.domain.FsUser;
-import com.fs.his.domain.FsUserLoginLog;
+import com.fs.his.domain.*;
 import com.fs.his.mapper.FsUserLoginLogMapper;
 import com.fs.his.service.IFsUserService;
+import com.fs.his.service.IFsUserWxService;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
@@ -44,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -77,7 +76,8 @@ public class WxUserController extends AppBaseController{
 
     @Autowired
     private WxMpService wxMpService;
-
+    @Autowired
+    private IFsUserWxService userWxService;
 
 
 
@@ -198,24 +198,24 @@ public class WxUserController extends AppBaseController{
         }
         CourseMaConfig courseMaConfig = courseMaConfigs.get(0);
         return handleCourseLogin(param,
-                () -> WxMaConfiguration.getMaService(courseMaConfig.getAppid()),
+                courseMaConfig.getAppid(),
                 courseMaConfig.getName());
     }
 
     /**
      * 公共登录处理方法
      * @param param 登录参数
-     * @param wxServiceSupplier 微信服务提供函数(差异化点1:不同方式获取WxMaService)
+     * @param appId appId(差异化点1:不同方式获取WxMaService)
      * @param logName 日志名称(差异化点2:不同场景标识)
      */
-    private R handleCourseLogin(LoginParam param, Supplier<WxMaService> wxServiceSupplier, String logName) {
+    private R handleCourseLogin(LoginParam param, String appId, String logName) {
         if (StringUtils.isBlank(param.getCode())) {
             return R.error("code不存在");
         }
 
         try {
             // 通过函数式接口获取不同的微信服务实例
-            final WxMaService wxService = wxServiceSupplier.get();
+            final WxMaService wxService = WxMaConfiguration.getMaService(appId);
             WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
             this.logger.info("获取{} Session:{}", logName, session);
 
@@ -243,6 +243,16 @@ public class WxUserController extends AppBaseController{
                 isNewUser = true;
             }
 
+            // 保存用户openId
+            FsUserWx wx = new FsUserWx();
+            wx.setFsUserId(user.getUserId());
+            wx.setAppId(appId);
+            wx.setOpenId(session.getOpenid());
+            wx.setUnionId(session.getUnionid());
+            wx.setCreateTime(LocalDateTime.now());
+            wx.setUpdateTime(LocalDateTime.now());
+            userWxService.saveOrUpdate(wx);
+
             // 生成Token
             String token = jwtUtils.generateToken(user.getUserId());
             Map<String,Object> map = new HashMap<>();