|  | @@ -586,6 +586,13 @@ public class QwSopLogsServiceImpl implements IQwSopLogsService
 | 
	
		
			
				|  |  |              List<QwSopLogsDoSendListTVO> logsByJsApi = qwSopLogsMapper.getQwSopLogsByJsApiAll(param);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            // 优先返回 sendType == 8 的第一条记录
 | 
	
		
			
				|  |  | +            List<QwSopLogsDoSendListTVO> result = logsByJsApi.stream()
 | 
	
		
			
				|  |  | +                    .filter(log -> log.getSendType() == 8)
 | 
	
		
			
				|  |  | +                    .findFirst()
 | 
	
		
			
				|  |  | +                    .map(Collections::singletonList) // 单元素不可变 List
 | 
	
		
			
				|  |  | +                    .orElse(logsByJsApi); // 如果没有匹配项,返回原列表
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              // 查询员工信息的id
 | 
	
		
			
				|  |  |              QwUser qwUser = qwExternalContactService.getQwUserByRedis(param.getCorpId().trim(),param.getQwUserId().trim());
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -600,119 +607,126 @@ public class QwSopLogsServiceImpl implements IQwSopLogsService
 | 
	
		
			
				|  |  |              contactHParam.setCorpId(param.getCorpId().trim());
 | 
	
		
			
				|  |  |              Long qwExternalContactId = qwExternalContactMapper.getQwExternalContactId(contactHParam);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            for (QwSopLogsDoSendListTVO log : logsByJsApi) {
 | 
	
		
			
				|  |  | +            for (QwSopLogsDoSendListTVO log : result) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  try {
 | 
	
		
			
				|  |  | -                    switch (log.getSendType()){
 | 
	
		
			
				|  |  | -                        case 3:
 | 
	
		
			
				|  |  | -                            try {
 | 
	
		
			
				|  |  | -                                // 使用现代的日期时间 API
 | 
	
		
			
				|  |  | -                                LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
 | 
	
		
			
				|  |  | -                                LocalDateTime expiryDateTime = sendTime.plusHours(12);
 | 
	
		
			
				|  |  | -                                LocalDateTime now = LocalDateTime.now();
 | 
	
		
			
				|  |  | +                    if (log.getSendType()==8){
 | 
	
		
			
				|  |  | +                        //(AI消息不做任何判断 直接入)切 只取了一条
 | 
	
		
			
				|  |  | +                        sendJsApiList.add(log);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                                // 判断是否过期
 | 
	
		
			
				|  |  | -                                if (now.isAfter(expiryDateTime)) {
 | 
	
		
			
				|  |  | -                                    // 作废消息
 | 
	
		
			
				|  |  | -                                    qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
 | 
	
		
			
				|  |  | -                                } else {
 | 
	
		
			
				|  |  | -                                    sendJsApiList.add(log);
 | 
	
		
			
				|  |  | +                    }else {
 | 
	
		
			
				|  |  | +                        switch (log.getSendType()) {
 | 
	
		
			
				|  |  | +                            case 3:
 | 
	
		
			
				|  |  | +                            case 7:
 | 
	
		
			
				|  |  | +                                try {
 | 
	
		
			
				|  |  | +                                    // 使用现代的日期时间 API
 | 
	
		
			
				|  |  | +                                    LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
 | 
	
		
			
				|  |  | +                                    LocalDateTime expiryDateTime = sendTime.plusHours(12);
 | 
	
		
			
				|  |  | +                                    LocalDateTime now = LocalDateTime.now();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                    // 判断是否过期
 | 
	
		
			
				|  |  | +                                    if (now.isAfter(expiryDateTime)) {
 | 
	
		
			
				|  |  | +                                        // 作废消息
 | 
	
		
			
				|  |  | +                                        qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
 | 
	
		
			
				|  |  | +                                    } else {
 | 
	
		
			
				|  |  | +                                        sendJsApiList.add(log);
 | 
	
		
			
				|  |  | +                                    }
 | 
	
		
			
				|  |  | +                                } catch (Exception e) {
 | 
	
		
			
				|  |  | +                                    // 记录错误日志
 | 
	
		
			
				|  |  | +                                    logger.error("Error processing log in logsByJsApiOver: {}", log.getId() + ":" + e);
 | 
	
		
			
				|  |  |                                  }
 | 
	
		
			
				|  |  | -                            } catch (Exception e) {
 | 
	
		
			
				|  |  | -                                // 记录错误日志
 | 
	
		
			
				|  |  | -                                logger.error("Error processing log in logsByJsApiOver: {}", log.getId()+":"+e);
 | 
	
		
			
				|  |  | -                            }
 | 
	
		
			
				|  |  | -                            break;
 | 
	
		
			
				|  |  | -                        case 6:
 | 
	
		
			
				|  |  | -                            sendJsApiList.add(log);
 | 
	
		
			
				|  |  | -                            break;
 | 
	
		
			
				|  |  | -                        default:
 | 
	
		
			
				|  |  | -                            QwSopTempSetting.Content content = JSON.parseObject(log.getContentJson(), QwSopTempSetting.Content.class);
 | 
	
		
			
				|  |  | -                            List<QwSopTempSetting.Content.Setting> setting = content.getSetting().stream().filter(e -> "9".equals(e.getContentType())).collect(Collectors.toList());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                            //有app的异步推送消息
 | 
	
		
			
				|  |  | -                            if (!setting.isEmpty()) {
 | 
	
		
			
				|  |  | -                                asyncSopTestService.asyncSendMsgBySopAppLinkNormal(setting, param.getExternalId());
 | 
	
		
			
				|  |  | -                            }
 | 
	
		
			
				|  |  | +                                break;
 | 
	
		
			
				|  |  | +                            case 6:
 | 
	
		
			
				|  |  | +                            case 9:
 | 
	
		
			
				|  |  | +                            case 10:
 | 
	
		
			
				|  |  | +                                sendJsApiList.add(log);
 | 
	
		
			
				|  |  | +                                break;
 | 
	
		
			
				|  |  | +                            default:
 | 
	
		
			
				|  |  | +                                QwSopTempSetting.Content content = JSON.parseObject(log.getContentJson(), QwSopTempSetting.Content.class);
 | 
	
		
			
				|  |  | +                                List<QwSopTempSetting.Content.Setting> setting = content.getSetting().stream().filter(e -> "9".equals(e.getContentType())).collect(Collectors.toList());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                            if (log.getExpiryTime() == null) {
 | 
	
		
			
				|  |  | -                                // 作废消息
 | 
	
		
			
				|  |  | -                                qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "SOP任务被删除");
 | 
	
		
			
				|  |  | -                            } else {
 | 
	
		
			
				|  |  | -                                Integer expiryTime = log.getExpiryTime();
 | 
	
		
			
				|  |  | -                                LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
 | 
	
		
			
				|  |  | -                                LocalDateTime expiryDateTime = sendTime.plusHours(expiryTime);
 | 
	
		
			
				|  |  | -                                LocalDateTime now = LocalDateTime.now();
 | 
	
		
			
				|  |  | +                                //有app的异步推送消息
 | 
	
		
			
				|  |  | +                                if (!setting.isEmpty()) {
 | 
	
		
			
				|  |  | +                                    asyncSopTestService.asyncSendMsgBySopAppLinkNormal(setting, param.getExternalId());
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                                // 判断是否过期
 | 
	
		
			
				|  |  | -                                if (now.isAfter(expiryDateTime)) {
 | 
	
		
			
				|  |  | +                                if (log.getExpiryTime() == null) {
 | 
	
		
			
				|  |  |                                      // 作废消息
 | 
	
		
			
				|  |  | -                                    qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
 | 
	
		
			
				|  |  | -                                }
 | 
	
		
			
				|  |  | -                                else {
 | 
	
		
			
				|  |  | -                                    switch (content.getType()) {
 | 
	
		
			
				|  |  | -                                        case 1:
 | 
	
		
			
				|  |  | -                                            // 普通消息,不做判断,加入发送列表
 | 
	
		
			
				|  |  | -                                            sendJsApiList.add(log);
 | 
	
		
			
				|  |  | -                                            break;
 | 
	
		
			
				|  |  | -                                        case 2:
 | 
	
		
			
				|  |  | -                                            // 课程消息,进行复杂的条件判断
 | 
	
		
			
				|  |  | -                                            FsCourseWatchLog watchLog = watchLogService.getWatchCourseLogVideoBySop(
 | 
	
		
			
				|  |  | -                                                    Long.valueOf(content.getVideoId()),
 | 
	
		
			
				|  |  | -                                                    String.valueOf(qwId),
 | 
	
		
			
				|  |  | -                                                    qwExternalContactId
 | 
	
		
			
				|  |  | -                                            );
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                                            Integer courseType = content.getCourseType();
 | 
	
		
			
				|  |  | -                                            String logId = log.getId();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                                            if (content.getCourseType()==null){
 | 
	
		
			
				|  |  | -                                                qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "模板未选消息类型,不发送");
 | 
	
		
			
				|  |  | -                                            }
 | 
	
		
			
				|  |  | -                                            if (watchLog != null) {
 | 
	
		
			
				|  |  | +                                    qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "SOP任务被删除");
 | 
	
		
			
				|  |  | +                                } else {
 | 
	
		
			
				|  |  | +                                    Integer expiryTime = log.getExpiryTime();
 | 
	
		
			
				|  |  | +                                    LocalDateTime sendTime = log.getSendTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
 | 
	
		
			
				|  |  | +                                    LocalDateTime expiryDateTime = sendTime.plusHours(expiryTime);
 | 
	
		
			
				|  |  | +                                    LocalDateTime now = LocalDateTime.now();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                                                //新逻辑
 | 
	
		
			
				|  |  | -                                                if (isCourseTypeValid(courseType, watchLog.getLogType())) {
 | 
	
		
			
				|  |  | -                                                    // 加入到发送列表中
 | 
	
		
			
				|  |  | -                                                    sendJsApiList.add(log);
 | 
	
		
			
				|  |  | -                                                } else {
 | 
	
		
			
				|  |  | -                                                    // 作废消息
 | 
	
		
			
				|  |  | -                                                    qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "看课状态未满足,不发送");
 | 
	
		
			
				|  |  | +                                    // 判断是否过期
 | 
	
		
			
				|  |  | +                                    if (now.isAfter(expiryDateTime)) {
 | 
	
		
			
				|  |  | +                                        // 作废消息
 | 
	
		
			
				|  |  | +                                        qwSopLogsService.updateQwSopLogsByWatchLogType(log.getId(), "已过期,不发送");
 | 
	
		
			
				|  |  | +                                    } else {
 | 
	
		
			
				|  |  | +                                        switch (content.getType()) {
 | 
	
		
			
				|  |  | +                                            case 1:
 | 
	
		
			
				|  |  | +                                                // 普通消息,不做判断,加入发送列表
 | 
	
		
			
				|  |  | +                                                sendJsApiList.add(log);
 | 
	
		
			
				|  |  | +                                                break;
 | 
	
		
			
				|  |  | +                                            case 2:
 | 
	
		
			
				|  |  | +                                                // 课程消息,进行复杂的条件判断
 | 
	
		
			
				|  |  | +                                                FsCourseWatchLog watchLog = watchLogService.getWatchCourseLogVideoBySop(
 | 
	
		
			
				|  |  | +                                                        Long.valueOf(content.getVideoId()),
 | 
	
		
			
				|  |  | +                                                        String.valueOf(qwId),
 | 
	
		
			
				|  |  | +                                                        qwExternalContactId
 | 
	
		
			
				|  |  | +                                                );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                                Integer courseType = content.getCourseType();
 | 
	
		
			
				|  |  | +                                                String logId = log.getId();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                                if (content.getCourseType() == null) {
 | 
	
		
			
				|  |  | +                                                    qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "模板未选消息类型,不发送");
 | 
	
		
			
				|  |  |                                                  }
 | 
	
		
			
				|  |  | +                                                if (watchLog != null) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                                    //新逻辑
 | 
	
		
			
				|  |  | +                                                    if (isCourseTypeValid(courseType, watchLog.getLogType())) {
 | 
	
		
			
				|  |  | +                                                        // 加入到发送列表中
 | 
	
		
			
				|  |  | +                                                        sendJsApiList.add(log);
 | 
	
		
			
				|  |  | +                                                    } else {
 | 
	
		
			
				|  |  | +                                                        // 作废消息
 | 
	
		
			
				|  |  | +                                                        qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "看课状态未满足,不发送");
 | 
	
		
			
				|  |  | +                                                    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                                            } else {
 | 
	
		
			
				|  |  | -                                                // 没有观看记录,只发普通消息
 | 
	
		
			
				|  |  | -                                                if (courseType == 0) {
 | 
	
		
			
				|  |  | -                                                    sendJsApiList.add(log);
 | 
	
		
			
				|  |  |                                                  } else {
 | 
	
		
			
				|  |  | -                                                    qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "无观看记录,不发送");
 | 
	
		
			
				|  |  | +                                                    // 没有观看记录,只发普通消息
 | 
	
		
			
				|  |  | +                                                    if (courseType == 0) {
 | 
	
		
			
				|  |  | +                                                        sendJsApiList.add(log);
 | 
	
		
			
				|  |  | +                                                    } else {
 | 
	
		
			
				|  |  | +                                                        qwSopLogsService.updateQwSopLogsByWatchLogType(logId, "无观看记录,不发送");
 | 
	
		
			
				|  |  | +                                                    }
 | 
	
		
			
				|  |  |                                                  }
 | 
	
		
			
				|  |  | -                                            }
 | 
	
		
			
				|  |  | -                                            break;
 | 
	
		
			
				|  |  | -                                        case 3:
 | 
	
		
			
				|  |  | -                                            // 订单消息,不做判断,加入发送列表
 | 
	
		
			
				|  |  | -                                            sendJsApiList.add(log);
 | 
	
		
			
				|  |  | -                                            break;
 | 
	
		
			
				|  |  | -                                        case 4:
 | 
	
		
			
				|  |  | -                                            // Ai消息,不加入序列单独处理
 | 
	
		
			
				|  |  | -                                            try {
 | 
	
		
			
				|  |  | -                                                logger.info("Ai触达消息 : {}", log.getId());
 | 
	
		
			
				|  |  | -                                                //  fastGptChatSessionService.sendAiTouch(log,param.getCorpId().trim());
 | 
	
		
			
				|  |  | -                                            }catch (Exception e){
 | 
	
		
			
				|  |  | -                                                logger.error("Ai消息 : {}", content.getType());
 | 
	
		
			
				|  |  | -                                            }
 | 
	
		
			
				|  |  | -                                            break;
 | 
	
		
			
				|  |  | -                                        default:
 | 
	
		
			
				|  |  | -                                            // 未知类型,记录警告
 | 
	
		
			
				|  |  | -                                            logger.error("Unknown content type logsByJsApi: {}", content.getType());
 | 
	
		
			
				|  |  | -                                            break;
 | 
	
		
			
				|  |  | +                                                break;
 | 
	
		
			
				|  |  | +                                            case 3:
 | 
	
		
			
				|  |  | +                                                // 订单消息,不做判断,加入发送列表
 | 
	
		
			
				|  |  | +                                                sendJsApiList.add(log);
 | 
	
		
			
				|  |  | +                                                break;
 | 
	
		
			
				|  |  | +                                            case 4:
 | 
	
		
			
				|  |  | +                                                // Ai消息,不加入序列单独处理
 | 
	
		
			
				|  |  | +                                                try {
 | 
	
		
			
				|  |  | +                                                    logger.info("Ai触达消息 : {}", log.getId());
 | 
	
		
			
				|  |  | +                                                    //  fastGptChatSessionService.sendAiTouch(log,param.getCorpId().trim());
 | 
	
		
			
				|  |  | +                                                } catch (Exception e) {
 | 
	
		
			
				|  |  | +                                                    logger.error("Ai消息 : {}", content.getType());
 | 
	
		
			
				|  |  | +                                                }
 | 
	
		
			
				|  |  | +                                                break;
 | 
	
		
			
				|  |  | +                                            default:
 | 
	
		
			
				|  |  | +                                                // 未知类型,记录警告
 | 
	
		
			
				|  |  | +                                                logger.error("Unknown content type logsByJsApi: {}", content.getType());
 | 
	
		
			
				|  |  | +                                                break;
 | 
	
		
			
				|  |  | +                                        }
 | 
	
		
			
				|  |  |                                      }
 | 
	
		
			
				|  |  |                                  }
 | 
	
		
			
				|  |  | -                            }
 | 
	
		
			
				|  |  | -                            break;
 | 
	
		
			
				|  |  | +                                break;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |                  } catch (Exception e) {
 | 
	
		
			
				|  |  |                      // 记录错误日志
 | 
	
		
			
				|  |  |                      logger.error("Error processing log in logsByJsApi: {}", log.getId()+" : " + e);
 |