瀏覽代碼

Merge remote-tracking branch 'origin/master'

yjwang 3 天之前
父節點
當前提交
26df024d99

+ 15 - 2
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -38,8 +38,8 @@ import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.FsSubOrderResultVO;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
-import com.fs.qw.service.IQwAppContactWayService;
-import com.fs.qw.service.IQwExternalContactTransferLogService;
+import com.fs.qw.domain.QwCompany;
+import com.fs.qw.service.*;
 import com.fs.qwApi.service.QwApiService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
@@ -144,6 +144,19 @@ public class Task {
     ITencentCloudCosService tencentCloudCosService;
     @Autowired
     private ConfigUtil configUtil;
+    @Autowired
+    private IQwCompanyService qwCompanyService;
+    @Autowired
+    private IQwUserService qwUserService;
+
+    public void addQwUserName(){
+        QwCompany qwCompany = new QwCompany();
+        List<QwCompany> companyList = qwCompanyService.selectQwCompanyList(qwCompany);
+        for (QwCompany company : companyList) {
+            qwUserService.syncQwUserName(company.getCorpId());
+        }
+    }
+
     public void videoTranscode() throws Exception
     {
 

+ 13 - 0
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -775,6 +775,14 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         sopLogs.setCorpId(logVo.getCorpId());
         sopLogs.setLogType(ruleTimeVO.getType());
         sopLogs.setTakeRecords(0);
+        try {
+            if(StringUtils.isNotEmpty(logVo.getUserId())){
+                String[] split = logVo.getUserId().split("\\|");
+                sopLogs.setQwUserKey(Long.parseLong(split[0]));
+            }
+        }catch (Exception e){
+            log.error("设置qwUserId异常", e);
+        }
 
         if (isOfficial == 1) {
 
@@ -1840,6 +1848,11 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         sopLogs.setExternalUserName(externalContact.getName());
         sopLogs.setFsUserId(finishLog.getUserId() != null ? finishLog.getUserId() : null );
         sopLogs.setUserLogsId("-");
+        try {
+            sopLogs.setQwUserKey(finishLog.getQwUserId());
+        }catch (Exception e){
+            log.error("设置qwUserId异常", e);
+        }
         // 解析模板设置
         List<QwSopCourseFinishTempSetting.Setting> settings = parseSettings(finishTemp.getSetting());
         if (settings == null) {

+ 5 - 3
fs-service/src/main/java/com/fs/core/config/WxMaConfiguration.java

@@ -65,9 +65,11 @@ public class WxMaConfiguration {
                 if (appid.equals(courseMaConfig.getAppid())) {
                     continue;
                 }
-                WxMaConfig.Config wxMaConfig = new WxMaConfig.Config();
-                BeanUtils.copyProperties(courseMaConfig, wxMaConfig);
-                c.add(wxMaConfig);
+                if (courseMaConfig.getType().equals("1")){
+                    WxMaConfig.Config wxMaConfig = new WxMaConfig.Config();
+                    BeanUtils.copyProperties(courseMaConfig, wxMaConfig);
+                    c.add(wxMaConfig);
+                }
             }
         }
         wx.setConfigs(c);

+ 3 - 1
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java

@@ -220,7 +220,9 @@ public interface FsUserCourseMapper
             "<if test = ' maps.isShow !=null '> " +
             "and c.is_show = #{maps.isShow} " +
             "</if>" +
-
+            "<if test ='maps.companyIdsList != null and maps.companyIdsList.length !=0 '> " +
+            " and <foreach collection='maps.companyIdsList'  item='item' index='index'  open='( 1=2 ' separator='' close=')'> or find_in_set(  #{item} , REGEXP_REPLACE ( c.company_ids, '[\"\\\\[\\\\]]', '' ) )  </foreach> " +
+            "</if> " +
             " order by c.sort,c.course_id  "+
             "</script>"})
     List<FsUserCourseListPVO> selectFsUserCourseListCompanyPVO(@Param("maps")FsUserCourseParam fsUserCourse);

+ 6 - 0
fs-service/src/main/java/com/fs/course/param/FsUserCourseParam.java

@@ -1,5 +1,6 @@
 package com.fs.course.param;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fs.common.annotation.Excel;
 import lombok.Data;
 
@@ -137,4 +138,9 @@ public class FsUserCourseParam {
     private Integer isPrivate; //是否私域
 
     private Long companyId;
+
+    private String companyIds;
+
+    @TableField(exist = false)
+    private Long[] companyIdsList;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/qw/vo/QwUserVO.java

@@ -74,6 +74,7 @@ public class QwUserVO {
     private Integer ipadStatus;
     private Long serverId;
     private Integer serverStatus;
+    private Integer sendMsgType;
 
     /**
      * 是否自动发课 00、禁用,01、启用

+ 4 - 0
fs-service/src/main/java/com/fs/sop/domain/QwSopLogs.java

@@ -87,6 +87,10 @@ public class QwSopLogs implements Serializable {
     private Integer sort;
     private Long ms;
     private Long qwUserKey;
+
+    /**
+     * 官方群发的限制 1官方+补发   2官方+一对一通连
+     */
     @TableField(exist = false)
     private Integer takeRecords;
 

+ 10 - 2
fs-service/src/main/java/com/fs/sop/service/impl/SopUserLogsInfoServiceImpl.java

@@ -834,7 +834,11 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
                 setting.setVideoId(param.getVideoId());
                 setting.setCourseId(param.getCourseId());
                 setting.setCourseType(param.getCourseType());
-
+                try {
+                    sopLogs.setQwUserKey(Long.valueOf(qwUserId));
+                }catch (Exception e){
+                    log.error("设置qwUserId异常", e);
+                }
                 sopLogs.setContentJson(JSON.toJSONString(setting));
 
                 sopLogsList.add(sopLogs);
@@ -1025,7 +1029,11 @@ public class SopUserLogsInfoServiceImpl implements ISopUserLogsInfoService {
             setting.setVideoId(param.getVideoId());
             setting.setCourseId(param.getCourseId());
             setting.setCourseType(param.getCourseType());
-
+            try {
+                sopLogs.setQwUserKey(qwUser.getId());
+            }catch (Exception e){
+                log.error("设置qwUserId异常", e);
+            }
             sopLogs.setContentJson(JSON.toJSONString(setting));
 
             sopLogsList.add(sopLogs);

+ 2 - 2
fs-service/src/main/resources/application-config-druid-xfk.yml

@@ -42,8 +42,8 @@ wx:
       port: 6379
       timeout: 2000
     configs:
-      - appId: wx5d516e5b575bae3c # 第一个公众号的appid  //公众号名称:成都九州在线互联网医院
-        secret: c911f6671909a81337c6a15cf45e57fc # 公众号的appsecret
+      - appId: wx47ccce1e1779bcc4 # 第一个公众号的appid  //公众号名称:首研生物
+        secret: 792adec2a722d57bfdfaa0953ed2b5ed # 公众号的appsecret
         token: PPKOdAlCoMO # 接口配置里的Token值
         aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
 aifabu:  #爱链接

+ 58 - 5
fs-service/src/main/resources/mapper/sop/QwSopLogsMapper.xml

@@ -27,6 +27,8 @@
         <result property="fsUserId"    column="fs_user_id"    />
         <result property="takeRecords"    column="take_records"    />
         <result property="sort"    column="sort"    />
+        <result property="qwUserKey"    column="qw_user_key"    />
+        <result property="userLogsId"    column="user_logs_id"    />
     </resultMap>
 
     <sql id="selectQwSopLogsVo">
@@ -98,6 +100,8 @@
             <if test="data.fsUserId != null">fs_user_id,</if>
             <if test="data.takeRecords != null">take_records,</if>
             <if test="data.sort != null">sort,</if>
+            <if test="data.userLogsId != null">user_logs_id,</if>
+            <if test="data.qwUserKey != null">qw_user_key,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="data.qwUserid != null">#{data.qwUserid},</if>
@@ -120,6 +124,8 @@
             <if test="data.fsUserId != null">#{data.fsUserId},</if>
             <if test="data.takeRecords != null">#{data.takeRecords},</if>
             <if test="data.sort != null">#{data.sort},</if>
+            <if test="data.userLogsId != null">#{data.userLogsId},</if>
+            <if test="data.qwUserKey != null">#{data.qwUserKey},</if>
         </trim>
     </insert>
 
@@ -141,6 +147,7 @@
             <if test="data.remark != null ">remark = #{data.remark},</if>
             <if test="data.fsUserId != null ">fs_user_id = #{data.fsUserId},</if>
             <if test="data.sort != null ">sort = #{data.sort},</if>
+            <if test="data.qwUserKey != null ">qw_user_key = #{data.qwUserKey},</if>
         </trim>
         where id = #{data.id}
     </update>
@@ -219,11 +226,49 @@
         <foreach collection="list" item="item">
             WHEN id = #{item.id} THEN #{item.sendStatus}
         </foreach>
+        else send_status
         END,
         msg_id = CASE
         <foreach collection="list" item="item">
-            WHEN id = #{item.id} THEN #{item.msgId}
+            WHEN id = #{item.id} AND #{item.msgId} IS NOT NULL THEN #{item.msgId}
         </foreach>
+        ELSE msg_id
+        END,
+        send_type = CASE
+        <foreach collection="list" item="item">
+            WHEN id = #{item.id} AND #{item.sendType} IS NOT NULL THEN #{item.sendType}
+        </foreach>
+        ELSE send_type
+        END,
+        send_time = CASE
+        <foreach collection="list" item="item">
+            WHEN id = #{item.id} AND #{item.sendTime} IS NOT NULL THEN #{item.sendTime}
+        </foreach>
+        ELSE send_time
+        END,
+        receiving_status = CASE
+        <foreach collection="list" item="item">
+            WHEN id = #{item.id} AND #{item.receivingStatus} IS NOT NULL THEN #{item.receivingStatus}
+        </foreach>
+        ELSE receiving_status
+        END,
+        qw_user_key = CASE
+        <foreach collection="list" item="item">
+            WHEN id = #{item.id} AND #{item.qwUserKey} IS NOT NULL THEN #{item.qwUserKey}
+        </foreach>
+        ELSE qw_user_key
+        END,
+        remark = CASE
+        <foreach collection="list" item="item">
+            WHEN id = #{item.id} AND #{item.remark} IS NOT NULL THEN #{item.remark}
+        </foreach>
+        ELSE remark
+        END,
+        sort = CASE
+        <foreach collection="list" item="item">
+            WHEN id = #{item.id} AND #{item.sort} IS NOT NULL THEN #{item.sort}
+        </foreach>
+        ELSE sort
         END,
         real_send_time = NOW()
         WHERE id IN
@@ -254,6 +299,12 @@
         </foreach>
         ELSE send_time
         END,
+        qw_user_key = CASE
+        <foreach collection="list" item="item">
+            WHEN id = #{item.id} AND #{item.qwUserKey} IS NOT NULL THEN #{item.qwUserKey}
+        </foreach>
+        ELSE qw_user_key
+        END,
         receiving_status = CASE
         <foreach collection="list" item="item">
             WHEN id = #{item.id} AND #{item.receivingStatus} IS NOT NULL THEN #{item.receivingStatus}
@@ -528,7 +579,7 @@
         qw_userid, external_user_id,external_id, external_user_name, log_type,
         content_json, send_status, send_time, real_send_time, send_type,
         company_id, receiving_status, msg_id, sop_id, remark,
-        corp_id, customer_id, fs_user_id,sort
+        corp_id, customer_id,fs_user_id,sort,qw_user_key
         )
         VALUES
         <foreach collection="qwSopLogs" item="log" separator=",">
@@ -551,7 +602,8 @@
             #{log.corpId},
             #{log.customerId},
             #{log.fsUserId},
-            #{log.sort}
+            #{log.sort},
+            #{log.qwUserKey}
             )
         </foreach>
     </insert>
@@ -562,7 +614,7 @@
         qw_userid, external_user_id,external_id, external_user_name, log_type,
         content_json, send_status, send_time, real_send_time, send_type,
         company_id, receiving_status, msg_id, sop_id, remark,
-        corp_id, customer_id, fs_user_id, expiration_time,sort,user_logs_id,take_records
+        corp_id, customer_id, fs_user_id, expiration_time,sort,user_logs_id,take_records,qw_user_key
         )
         VALUES
         <foreach collection="qwSopLogs" item="log" separator=",">
@@ -588,7 +640,8 @@
             #{log.expirationTime},
             #{log.sort},
             #{log.userLogsId},
-            #{log.takeRecords}
+            #{log.takeRecords},
+            #{log.qwUserKey}
             )
         </foreach>
     </insert>

+ 21 - 15
fs-user-course/src/main/java/com/fs/course/controller/WxCompanyUserController.java

@@ -101,11 +101,17 @@ public class WxCompanyUserController extends AppBaseController {
             this.logger.info(session.getSessionKey());
             this.logger.info(session.getOpenid());
             this.logger.info(session.getUnionid());
+            if (StringUtils.isEmpty(session.getOpenid())){
+                return R.error("登陆失败,openid未授权,请稍后再试!");
+            }
 
             // 手机号信息
             WxMaPhoneNumberInfo phoneNoInfo = null;
             if (param.getAuthType()==1){
                 phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
+                if (StringUtils.isEmpty(phoneNoInfo.getPhoneNumber())){
+                    return R.error("授权失败,请联系客服!");
+                }
             }
 
             FsUser user = getUserByAuthType(param, wxService, session, phoneNoInfo);
@@ -162,18 +168,18 @@ public class WxCompanyUserController extends AppBaseController {
      */
     private FsUser handleUserRegisterOrUpdate(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo, Company company, CompanyUser companyUser, String ip) {
         if (user == null) {
-            user = userService.selectFsUserByCourseMaOpenId(session.getOpenid());
-            if (user != null) {
-                // 修改
-                return updateUser(user, param, session, phoneNoInfo, company, companyUser);
-            } else {
-                // 新增
-                return createUser(param, session, phoneNoInfo, company, companyUser);
-            }
+//            user = userService.selectFsUserByCourseMaOpenId(session.getOpenid());
+//            if (user != null) {
+//                // 修改
+//                return updateUser(user, param, session, phoneNoInfo, company, companyUser);
+//            } else {
+//                // 新增
+            return createUser(param, session, phoneNoInfo, company, companyUser);
+//            }
         } else {
             // 已存在用户,更新信息
-            updateUserInfo(user, param, session, phoneNoInfo, ip);
-            return user;
+            return updateUser(user, param, session, phoneNoInfo, company, companyUser);
+//            return user;
         }
     }
 
@@ -231,13 +237,13 @@ public class WxCompanyUserController extends AppBaseController {
     private void updateUserInfo(FsUser user, LoginMaWxParam param, WxMaJscode2SessionResult session, WxMaPhoneNumberInfo phoneNoInfo, String ip) {
         FsUser userMap = new FsUser();
         userMap.setUserId(user.getUserId());
+        // userMap.setCourseMaOpenId(session.getOpenid());
+        userMap.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
         userMap.setUpdateTime(new DateTime());
+        userMap.setNickName(param.getNickname() != null ? param.getNickname() : user.getNickName());
+        userMap.setAvatar(param.getAvatar() != null ? param.getAvatar() : user.getAvatar());
         if (param.getAuthType() == 1 && phoneNoInfo != null) {
-            user.setPhone(phoneNoInfo.getPhoneNumber());
-        }
-        userMap.setLastIp(ip);
-        if (StringUtils.isNotEmpty(session.getUnionid())) {
-            userMap.setUnionId(session.getUnionid());
+            userMap.setPhone(phoneNoInfo.getPhoneNumber());
         }
         userService.updateFsUser(userMap);
     }

+ 120 - 0
fs-websocket/pom.xml

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>fs</artifactId>
+        <groupId>com.fs</groupId>
+        <version>1.1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>fs-websocket</artifactId>
+    <description>
+        WebSocket独立服务
+    </description>
+
+    <dependencies>
+        <!-- Spring Boot WebSocket -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+
+        <!-- Spring Boot Web -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <!-- FastJSON -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- Lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- Swagger -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+
+        <!-- swagger2-UI-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+
+        <!-- 显式添加swagger-annotations依赖,因为父项目中被排除了 -->
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+            <version>1.5.21</version>
+        </dependency>
+
+        <!-- 显式添加swagger-models依赖,因为父项目中被排除了 -->
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-models</artifactId>
+            <version>1.5.21</version>
+        </dependency>
+
+        <!-- 通用模块 -->
+        <dependency>
+            <groupId>com.fs</groupId>
+            <artifactId>fs-common</artifactId>
+            <!-- 排除 security -->
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-security</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- Spring Boot DevTools -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.1.0</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>
+            </plugin>
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>

+ 20 - 0
fs-websocket/src/main/java/com/fs/websocket/FsWebSocketServiceApplication.java

@@ -0,0 +1,20 @@
+package com.fs.websocket;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * WebSocket服务启动程序
+ *
+ * @author fs
+ */
+@SpringBootApplication(scanBasePackages = {"com.fs"}, exclude= {DataSourceAutoConfiguration.class})
+public class FsWebSocketServiceApplication extends SpringBootServletInitializer {
+
+    public static void main(String[] args) {
+        SpringApplication.run(FsWebSocketServiceApplication.class, args);
+        System.out.println("(*^_^*)WebSocket服务启动成功");
+    }
+}

+ 0 - 0
fs-user-app/src/main/java/com/fs/websocket/bean/SendMsgVO.java → fs-websocket/src/main/java/com/fs/websocket/bean/SendMsgVO.java


+ 1 - 1
fs-user-app/src/main/java/com/fs/app/config/WebSocketConfig.java → fs-websocket/src/main/java/com/fs/websocket/config/WebSocketConfig.java

@@ -1,4 +1,4 @@
-package com.fs.app.config;
+package com.fs.websocket.config;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;

+ 1 - 1
fs-user-app/src/main/java/com/fs/websocket/service/WebSocketServer.java → fs-websocket/src/main/java/com/fs/websocket/service/WebSocketServer.java

@@ -1,13 +1,13 @@
 package com.fs.websocket.service;
 
 import com.alibaba.fastjson.JSONObject;
-import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.StringUtils;
 import com.fs.websocket.bean.SendMsgVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
+
 import javax.websocket.*;
 import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;

+ 10 - 0
fs-websocket/src/main/resources/application.yml

@@ -0,0 +1,10 @@
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为8115
+  port: 8115
+
+# Spring配置
+spring:
+  profiles:
+    active: dev
+#    active: druid-sxjz

+ 8 - 0
pom.xml

@@ -234,6 +234,13 @@
                 <artifactId>fs-ipad-task</artifactId>
                 <version>${fs.version}</version>
             </dependency>
+
+            <!-- WebSocket服务-->
+            <dependency>
+                <groupId>com.fs</groupId>
+                <artifactId>fs-websocket</artifactId>
+                <version>${fs.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
@@ -268,6 +275,7 @@
         <module>fs-repeat-api</module>
         <module>fs-ipad-task</module>
         <module>fs-user-course</module>
+        <module>fs-websocket</module>
     </modules>
 
     <packaging>pom</packaging>