Forráskód Böngészése

销售账号-可以设置 用语音回还是文本/优化直播间删除的直播websockt报错/优化苹果app登录和微信一键登录 合并不了账号 导致有俩个账号积分不合并的问题(仅今正)

三七 6 napja
szülő
commit
5ce927ba7c

+ 57 - 20
fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java

@@ -135,7 +135,9 @@ public class WebSocketServer {
 
         Live live = liveService.selectLiveByLiveId(liveId);
         if (live == null) {
-            throw new BaseException("未找到直播间");
+            log.warn("WebSocket连接拒绝: 直播间不存在, liveId={}, userId={}", liveId, userId);
+            closeSession(session, 4004, "未找到直播间");
+            return;
         }
         long companyId = -1L;
         long companyUserId = -1L;
@@ -168,7 +170,9 @@ public class WebSocketServer {
                 }
             }
             if (Objects.isNull(fsUser)) {
-                throw new BaseException("用户信息错误");
+                log.warn("WebSocket连接拒绝: 用户信息错误, liveId={}, userId={}", liveId, userId);
+                closeSession(session, 4003, "用户信息错误");
+                return;
             }
 
             LiveWatchUser liveWatchUserVO = liveWatchUserService.join(fsUser,liveId, userId, location);
@@ -334,7 +338,9 @@ public class WebSocketServer {
     //关闭连接时调用
     @OnClose
     public void onClose(Session session) {
+
         Map<String, Object> userProperties = session.getUserProperties();
+
         // 获取公司ID和销售ID
         long companyId = -1L;
         long companyUserId = -1L;
@@ -349,10 +355,17 @@ public class WebSocketServer {
         long userId = (long) userProperties.get("userId");
         long userType = (long) userProperties.get("userType");
 
-        ConcurrentHashMap<Long, Session> room = getRoom(liveId);
-        List<Session> adminRoom = getAdminRoom(liveId);
+
+        log.info("关闭连接: sessionId={}, uri={}, liveId={}, userId={}, userType={}, companyId={}, companyUserId={}",
+                session.getId(), session.getRequestURI(), liveId, userId, userType, companyId, companyUserId);
+
+        ConcurrentHashMap<Long, Session> room = rooms.get(liveId);
+        List<Session> adminRoom = adminRooms.get(liveId);
         if (userType == 0) {
-            // 缓存用户信息,过期时间4小时
+            if (room == null || !room.containsKey(userId)) {
+                log.info("连接未成功建立,跳过清理: liveId={}, userId={}", liveId, userId);
+                return;
+            }
             String userCacheKey = "fs:user:" + userId;
             FsUserScrm fsUser = redisCache.getCacheObject(userCacheKey);
             if (fsUser == null) {
@@ -362,7 +375,12 @@ public class WebSocketServer {
                 }
             }
             if (Objects.isNull(fsUser)) {
-                throw new BaseException("用户信息错误");
+                log.error("用户信息错误: userId={}", userId);
+                room.remove(userId);
+                if (room.isEmpty()) {
+                    rooms.remove(liveId);
+                }
+                return;
             }
             // 计算并更新用户在线时长
             room.remove(userId);
@@ -377,11 +395,9 @@ public class WebSocketServer {
             String onlineUsersSetKey = ONLINE_USERS_SET_KEY + liveId;
             redisCache.redisTemplate.opsForSet().remove(onlineUsersSetKey, String.valueOf(userId));
 
-            LiveWatchUser liveWatchUserVO = liveWatchUserService.close(fsUser,liveId, userId);
+            LiveWatchUser liveWatchUserVO = liveWatchUserService.close(fsUser, liveId, userId);
 
-
-            // 下线消息采样10%进入队列
-            if (random.nextDouble() < ENTRY_EXIT_SAMPLE_RATE) {
+            if (random.nextDouble() < ENTRY_EXIT_SAMPLE_RATE && liveWatchUserVO != null) {
                 SendMsgVo sendMsgVo = new SendMsgVo();
                 sendMsgVo.setLiveId(liveId);
                 sendMsgVo.setUserId(userId);
@@ -396,14 +412,15 @@ public class WebSocketServer {
             }
 
         } else {
-            adminRoom.remove(session);
-            // 如果admin房间为空,关闭并清理执行器
-            if (adminRoom.isEmpty()) {
-                ExecutorService executor = adminExecutors.remove(liveId);
-                if (executor != null) {
-                    executor.shutdown();
+            if (adminRoom != null) {
+                adminRoom.remove(session);
+                if (adminRoom.isEmpty()) {
+                    ExecutorService executor = adminExecutors.remove(liveId);
+                    if (executor != null) {
+                        executor.shutdown();
+                    }
+                    adminRooms.remove(liveId);
                 }
-                adminRooms.remove(liveId);
             }
         }
 
@@ -809,10 +826,30 @@ public class WebSocketServer {
     @OnError
     public void onError(Session session, Throwable throwable) {
 
+        log.error("WebSocket发生错误: sessionId={}, error={}",
+                session != null ? session.getId() : "null",
+                throwable != null ? throwable.getMessage() : "null", throwable);
+
+//        try {
+//            this.onClose(session);
+//        } catch (Exception e) {
+//            log.error("webSocket 错误处理失败", e.getMessage());
+//        }
+    }
+
+    private void closeSession(Session session, int code, String reason) {
         try {
-            this.onClose(session);
+            if (session != null && session.isOpen()) {
+                CloseReason.CloseCode closeCode;
+                try {
+                    closeCode = CloseReason.CloseCodes.getCloseCode(code);
+                } catch (Exception e) {
+                    closeCode = CloseReason.CloseCodes.NORMAL_CLOSURE;
+                }
+                session.close(new CloseReason(closeCode, reason != null ? reason : ""));
+            }
         } catch (Exception e) {
-            log.error("webSocket 错误处理失败", e);
+            log.error("关闭WebSocket会话失败: sessionId={}, error={}", session != null ? session.getId() : "null", e.getMessage());
         }
     }
 
@@ -1709,7 +1746,7 @@ public class WebSocketServer {
                 return priorityCompare;
             }
             // 相同优先级按序列号排序(FIFO)
-            return Long.compare(this.sequence, other.sequence);
+            return java.lang.Long.compare(this.sequence, other.sequence);
         }
     }
 

+ 2 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyUser.java

@@ -214,6 +214,8 @@ public class CompanyUser extends BaseEntity
      */
     private Long cidServerId;
 
+    private Long isCustomerVoice;
+
     public String getFsUserId() {
         return fsUserId;
     }

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -92,8 +92,10 @@ public interface CompanyUserMapper
 
 
     CompanyUser selectUserByUserName(@Param("userName")String userName);
+
     @Select("select count(1) from company_user where user_name=#{userName}")
     int checkUserName(String userName);
+
     @Update("update company_user set password=#{password} where user_id=#{userId}")
     int resetUserPwdByUserId( @Param("userId")Long userId, @Param("password") String encryptPassword);
 

+ 2 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyUserQwListVO.java

@@ -160,5 +160,7 @@ public class CompanyUserQwListVO extends BaseEntity {
      */
     private Long accountId;
 
+    private Integer isCustomerVoice;
+
 
 }

+ 21 - 9
fs-service/src/main/java/com/fs/fastGpt/service/impl/AiHookServiceImpl.java

@@ -400,7 +400,8 @@ public class AiHookServiceImpl implements AiHookService {
             return R.ok();
         }
         log.info("数据:{}", qwUserId);
-        QwUser user = qwUserMapper.selectQwUserById(qwUserId);
+//        QwUser user = qwUserMapper.selectQwUserById(qwUserId);
+        QwUser user = qwUserMapper.selectQwUserByIdCompanyUser(qwUserId);
         //查询接收人
         if(user==null){
             log.error("查询接收人为空");
@@ -673,10 +674,15 @@ public class AiHookServiceImpl implements AiHookService {
                             sendAiMsg(content,sender,uid,serverId);
                         }
                     } else {
-                        if (type==16){
-                            sendAiVoiceMsg(content,sender,uid,serverId,user);
-                        }else {
-                            sendAiMsg(content,sender,uid,serverId);
+
+                        if (type == 16) {
+                            if (user.getIsCustomerVoice() != null && user.getIsCustomerVoice() == 1) {
+                                sendAiVoiceMsg(content, sender, uid, serverId, user);
+                            } else {
+                                sendAiMsg(content,sender,uid,serverId);
+                            }
+                        } else {
+                            sendAiMsg(content, sender, uid, serverId);
                         }
                     }
 
@@ -705,11 +711,17 @@ public class AiHookServiceImpl implements AiHookService {
                                 sendAiMsg(msg,sender,uid,serverId);
                             }
                         } else {
-                            if (type==16){
-                                sendAiVoiceMsg(msg,sender,uid,serverId,user);
-                            }else {
-                                sendAiMsg(msg,sender,uid,serverId);
+
+                            if (type == 16) {
+                                if (user.getIsCustomerVoice() != null && user.getIsCustomerVoice() == 1) {
+                                    sendAiVoiceMsg(content, sender, uid, serverId, user);
+                                } else {
+                                    sendAiMsg(content,sender,uid,serverId);
+                                }
+                            } else {
+                                sendAiMsg(content, sender, uid, serverId);
                             }
+
                         }
                         try {
                             Thread.sleep(10000);

+ 3 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java

@@ -486,6 +486,9 @@ public interface FsStoreOrderScrmMapper
             "<if test = 'maps.status != null and maps.status != \"\"     '> " +
             "and o.status =#{maps.status} " +
             "</if>" +
+            "<if test = 'maps.orderType != null and maps.orderType != \"\"     '> " +
+            "and o.order_type =#{maps.orderType} " +
+            "</if>" +
             "<if test = 'maps.keyword != null and  maps.keyword !=\"\"    '> " +
             "and o.order_code like CONCAT('%',#{maps.keyword},'%') " +
             "</if>" +

+ 1 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsMyStoreOrderQueryParam.java

@@ -10,6 +10,7 @@ import java.io.Serializable;
 public class FsMyStoreOrderQueryParam extends BaseQueryParam implements Serializable
 {
     private String status;
+    private String orderType;
     private Long userId;
     private Long companyId;
     private Long companyUserId;

+ 1 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreAfterSalesQueryParam.java

@@ -10,6 +10,7 @@ public class FsStoreAfterSalesQueryParam extends BaseQueryParam implements Seria
 {
 
     private Integer status;
+    private String orderType;
     private Long userId;
     private Long liveId;
 

+ 3 - 0
fs-service/src/main/java/com/fs/qw/domain/QwUser.java

@@ -116,4 +116,7 @@ public class QwUser extends BaseEntity
 
     //根据ai状态判断是否启用
     private Integer aiStatus;
+
+    @TableField(exist = false)
+    private Integer isCustomerVoice;
 }

+ 6 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java

@@ -38,6 +38,12 @@ public interface QwUserMapper extends BaseMapper<QwUser>
      */
     public QwUser selectQwUserById(Long id);
 
+    @Select("SELECT q.*,c.is_customer_voice FROM qw_user q " +
+            "left join company_user c   " +
+            "on q.company_user_id=c.user_id " +
+            "where q.id=#{id} ")
+    public QwUser selectQwUserByIdCompanyUser(@Param("id")Long id);
+
     @Select("select qw_user_id from qw_user where qw_user_name = #{qwUserName} and corp_id = #{corpId}")
     public List<String> selectQwUserByQwUserName (@Param("qwUserName") String qwUserName,@Param("corpId") String corpId);
 

+ 7 - 2
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -46,6 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="bindCompanyUserId"    column="bind_company_user_id"    />
         <result property="unionId"    column="union_id"    />
         <result property="cidServerId" column="cid_server_id"/>
+        <result property="isCustomerVoice" column="is_customer_voice"/>
         <association property="dept"    column="dept_id" javaType="CompanyDept" resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
     </resultMap>
@@ -101,6 +102,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         u.is_need_register_member,u.is_allowed_all_register,
         u.avatar,u.address_id,
         u.qw_user_id,
+        u.is_customer_voice,
         u.doctor_id,
         d.dept_name,
         d.leader,
@@ -314,6 +316,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="addressId != null">address_id,</if>
             <if test="domain != null">domain,</if>
             <if test="isAudit != null">`is_audit`,</if>
+            <if test="isCustomerVoice != null">`is_customer_voice`,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyId != null">#{companyId},</if>
@@ -347,6 +350,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="addressId != null">#{addressId},</if>
             <if test="domain != null">#{domain},</if>
             <if test="isAudit != null">#{isAudit},</if>
+            <if test="isCustomerVoice != null">#{isCustomerVoice},</if>
         </trim>
     </insert>
     <insert id="insertQwIpadTotal">
@@ -394,6 +398,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorId != null">`doctor_id` = #{doctorId},</if>
             <if test="unionId != null">`union_id` = #{unionId},</if>
             <if test="cidServerId != null">`cid_server_id` = #{cidServerId},</if>
+            <if test="isCustomerVoice != null">`is_customer_voice` = #{isCustomerVoice},</if>
         </trim>
         where user_id = #{userId}
     </update>
@@ -458,7 +463,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectUserByUserName" parameterType="String" resultMap="CompanyUserResult">
         <include refid="selectUserVo"/>
-        where u.user_name = #{userName}
+        where user_name = #{userName}
     </select>
 
     <select id="selectCompanyQwUserByIds" resultType="com.fs.company.vo.CompanyQwUserByIdsVo">
@@ -522,7 +527,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                u.create_time,u.id_card, u.remark,u.user_type,u.open_id,u.qr_code_weixin,u.qr_code_wecom,u.jpush_id,u.domain,u.is_audit,u.address_id,
                d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
                r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,
-               u.is_need_register_member, u.is_allowed_all_register,u.doctor_id,u.union_id,u.cid_server_id
+               u.is_need_register_member, u.is_allowed_all_register,u.doctor_id,u.union_id,u.cid_server_id,u.is_customer_voice
         from company_user u
                  left join company_dept d on u.dept_id = d.dept_id
                  left join company_user_role ur on u.user_id = ur.user_id

+ 3 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreAfterSalesScrmMapper.xml

@@ -124,6 +124,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="maps.userId != null">
             and a1.user_id = #{maps.userId}
         </if>
+        <if test = "maps.orderType != null">
+            and a2.order_type = #{maps.orderType}
+        </if>
         order by a1.create_time desc
     </select>
 

+ 68 - 2
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -327,7 +327,8 @@ public class AppLoginController extends AppBaseController{
                     userMap.setLoginDevice(param.getLoginDevice()!=null ? param.getLoginDevice() : null);
                     userService.updateFsUser(userMap);
                     user=appleUser;
-                }else {
+                }
+                else {
                     user = new FsUser();
                     user.setLoginDevice(param.getLoginDevice()!=null ? param.getLoginDevice() : null);
                     user.setSource(param.getSource()!=null ? param.getSource() : null);
@@ -512,7 +513,7 @@ public class AppLoginController extends AppBaseController{
             }
 
             if (user == null) {
-                if( flag){
+                if(flag){
                     user = new FsUser();
                     user.setLoginDevice(param.getLoginDevice()!=null ? param.getLoginDevice() : null);
                     user.setSource(param.getSource()!=null ? param.getSource() : null);
@@ -591,6 +592,11 @@ public class AppLoginController extends AppBaseController{
     @ApiOperation("绑定手机号")
     @PostMapping("/setIPhoneNumber")
     public R setIPhoneNumber(@Validated @RequestBody FsUserEditPhoneParam param) {
+        if (!StringUtil.isNullOrEmpty(param.getUnionId()) && CloudHostUtils.hasCloudHostName("今正科技") ){
+            // 管app的 苹果登录和微信登录 俩个没有一点关系 ,账号合并不了的bug,暂时设计成 按照手机号来匹配,因为今正要强制绑定手机号(不然没有绑定关系)
+            return notTsTSetPhone(param);
+        }
+
         FsUser userMap = findUserByPhone(param.getPhone());
         if (userMap != null) {
             if (StringUtils.isNotEmpty(userMap.getAppleKey()) && !param.getAppleKey().equals(userMap.getAppleKey())) {
@@ -679,6 +685,66 @@ public class AppLoginController extends AppBaseController{
         return userService.updatePasswordByPhone(password,encryptPhone);
     }
 
+
+    public R notTsTSetPhone(FsUserEditPhoneParam param){
+        logger.info("fcj 绑定手机号入参:{}", param);
+        FsUser user = userService.selectFsUserByUnionid(param.getUnionId());
+        if (user==null){
+            return R.error("用户数据不存在");
+        }
+        FsUser userMap = findUserByPhone(param.getPhone());
+        //绑定的手机号已存在用户的情况,将微信登录的时候创建的新号的UnionId移动到老号中,删除新号(将两个号合并)
+        if (userMap!=null){
+            if (userMap.getUserId().equals(user.getUserId())) {
+                user.setPhone(param.getPhone());
+                user.setLoginDevice(param.getLoginDevice());
+                user.setSource(param.getSource());
+                String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+                user.setLastIp(ipAddr);
+                userService.updateFsUser(user);
+                return generateTokenAndReturn(user);
+            }
+            if (StringUtils.isNotEmpty(userMap.getUnionId())&&!userMap.getUnionId().equals(user.getUnionId())){
+                return R.error("该手机号已绑定其他微信");
+            }
+            //如果存在手机号也有用户,微信也有用户,保留创建时间比较久的用户
+            FsUser keepUser;
+            FsUser deleteUser;
+            if (userMap.getCreateTime().before(user.getCreateTime())){
+                keepUser = userMap;
+                deleteUser = user;
+            }else {
+                keepUser = user;
+                deleteUser = userMap;
+            }
+            keepUser.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
+            keepUser.setSource(param.getSource());
+            keepUser.setUnionId(user.getUnionId());
+            keepUser.setPhone(param.getPhone());
+            String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+            keepUser.setLastIp(ipAddr);
+            if (userService.updateFsUser(keepUser)>0){
+                userService.realDeleteFsUserByUserId(deleteUser.getUserId());
+                return generateTokenAndReturn(keepUser);
+            }
+            return R.error("绑定手机号失败");
+        }
+        user.setPhone(param.getPhone());
+        user.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null );
+        user.setSource(param.getSource()!= null ? param.getSource() : null);
+        userMap = new FsUser();
+        userMap.setLoginDevice(param.getLoginDevice());
+        userMap.setSource(param.getSource());
+        userMap.setUserId(user.getUserId());
+        userMap.setPhone(param.getPhone());
+        String ipAddr = IpUtils.getIpAddr(ServletUtils.getRequest());
+        userMap.setLastIp(ipAddr);
+        if (userService.updateFsUser(userMap)>0){
+            return generateTokenAndReturn(user);
+        }
+        return R.error("绑定手机号失败");
+    }
+
     @ApiOperation("绑定手机号")
     @PostMapping("/setPhone")
     @Transactional(rollbackFor = Exception.class)

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/CompanyUserScrmController.java

@@ -115,7 +115,7 @@ public class CompanyUserScrmController extends AppBaseController {
             return R.ok().put("companyUserToken", Md5Utils.hash(companyUser.getUserId().toString()));
         } catch (Exception e){
 
-            return R.error("操作异常");
+            return R.error("操作异常"+e.getMessage());
         }
     }
     @Login

+ 7 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

@@ -111,9 +111,15 @@ public class ProductScrmController extends AppBaseController {
 
     @ApiOperation("获取商品列表")
     @GetMapping("/getProducts")
-    public R getProducts(FsStoreProductQueryParam param, HttpServletRequest request){
+    public R getProducts(FsStoreProductQueryParam param, HttpServletRequest request,
+                         @RequestHeader(value = "AppId", required = false) String AppId){
         PageHelper.startPage(param.getPage(), param.getPageSize());
         param.setIsDisplay(1);
+
+        if (AppId != null && !AppId.isEmpty()) {
+            param.setAppId(AppId);
+        }
+
         List<FsStoreProductListQueryVO> productList=productService.selectFsStoreProductListQuery(param);
         // 检查列表中活动商品是否已过期,过期则即时同步库存+重置
         checkAndHandleExpiredActivities(productList);