提交 dfd860d6 作者: 洪东保

定时任务逻辑-不需要判断智能体是否授权

父级 e0d46a2c
...@@ -148,18 +148,18 @@ public class CmeetingJob { ...@@ -148,18 +148,18 @@ public class CmeetingJob {
Map<String, String> widTidRelations = userIdRelations.stream().collect(Collectors.toMap(UserId::getWid, UserId::getTid)); Map<String, String> widTidRelations = userIdRelations.stream().collect(Collectors.toMap(UserId::getWid, UserId::getTid));
Map<String, String> tidWidRelations = userIdRelations.stream().collect(Collectors.toMap(UserId::getTid, UserId::getWid)); Map<String, String> tidWidRelations = userIdRelations.stream().collect(Collectors.toMap(UserId::getTid, UserId::getWid));
//查出企微的人员信息 //查出企微的人员信息
List<WeComUser> weComUserList = weComService.list(); // List<WeComUser> weComUserList = weComService.list();
Map<String, WeComUser> weComUserMap = weComUserList.stream().collect(Collectors.toMap(WeComUser::getUserId, Function.identity())); // Map<String, WeComUser> weComUserMap = weComUserList.stream().collect(Collectors.toMap(WeComUser::getUserId, Function.identity()));
//智能体授权人员 // //智能体授权人员
List<UserDTO> accessUserIds = tencentMeetingService.getAccessUserIds(widTidRelations); // List<UserDTO> accessUserIds = tencentMeetingService.getAccessUserIds(widTidRelations);
if (CollectionUtils.isEmpty(accessUserIds)) { // if (CollectionUtils.isEmpty(accessUserIds)) {
log.info("无生成纪要权限的人员"); // log.info("无生成纪要权限的人员");
return; // return;
} else { // } else {
log.info("生成纪要权限人员:->{}", accessUserIds.toString()); // log.info("生成纪要权限人员:->{}", accessUserIds.toString());
} // }
List<TencentMeetingVO.RecordFile> meetingFiles = tencentMeetingService.getMeetingFiles(accessUserIds, weComUserMap); List<TencentMeetingVO.RecordFile> meetingFiles = tencentMeetingService.getMeetingFiles();
if (meetingFiles == null || meetingFiles.isEmpty()) { if (meetingFiles == null || meetingFiles.isEmpty()) {
log.info("没有录制文件需要处理"); log.info("没有录制文件需要处理");
......
...@@ -132,71 +132,6 @@ public class FileProcessTask { ...@@ -132,71 +132,6 @@ public class FileProcessTask {
return; return;
} }
String meetingDate = meetingInfo.getStartTime().toLocalDate().format(DateTimeFormatter.ISO_LOCAL_DATE); String meetingDate = meetingInfo.getStartTime().toLocalDate().format(DateTimeFormatter.ISO_LOCAL_DATE);
//下面再查一遍会议信息的意义是,为了获取会议中的子会议Id,如果是周期会议,需要保存下来(重要)
// MeetingsApi.ApiV1MeetingsMeetingIdGetRequest meetingRequest =
// new MeetingsApi.ApiV1MeetingsMeetingIdGetRequest.Builder(meetingId)
// .operatorId(tencentAdminUserId)
// .operatorIdType("1")
// .instanceid("0")
// .build();
// MeetingsApi.ApiV1MeetingsMeetingIdGetResponse meetingResponse =
// client.meetings().v1MeetingsMeetingIdGet(meetingRequest, new JWTAuthenticator.Builder()
// .nonce(BigInteger.valueOf(Math.abs((new SecureRandom()).nextInt())))
// .timestamp(String.valueOf(System.currentTimeMillis() / 1000L)));
// V1MeetingsMeetingIdGet200Response meetingResponseData = meetingResponse.getData();
// List<V1MeetingsMeetingIdGet200ResponseMeetingInfoListInner> meetingInfoList = meetingResponseData.getMeetingInfoList();
// V1MeetingsMeetingIdGet200ResponseMeetingInfoListInner meetingItem = meetingInfoList.get(0);
// //会议类型
// //0:一次性会议
// //1:周期性会议
// Long meetingType = meetingItem.getMeetingType();
// if(meetingType.intValue() == 1){
// //如果是周期会议,获取子会议的ID,用于查询参会人员
// List<V1MeetingsMeetingIdGet200ResponseMeetingInfoListInnerSubMeetingsInner> subMeetings = meetingItem.getSubMeetings();
// //如果主持人突然取消了后续的所有周期会议,subMeetings列表会返回null
// if(!CollectionUtils.isEmpty(subMeetings)){
// LocalDate meetingStartDate = meetingInfo.getStartTime().toLocalDate();
//// long meetingDayStartTimeStamp = meetingStartDate.atStartOfDay().atZone(ZoneId.systemDefault()).toEpochSecond();
//// long meetingDayEndTimeStamp = meetingStartDate.plusDays(1).atStartOfDay().atZone(ZoneId.systemDefault()).toEpochSecond();
// Optional<V1MeetingsMeetingIdGet200ResponseMeetingInfoListInnerSubMeetingsInner> subMeeting = subMeetings.stream().filter(item ->
// Instant.ofEpochSecond(Long.valueOf(item.getStartTime())).atZone(ZoneId.systemDefault()).toLocalDate().equals(meetingStartDate))
// .findFirst();
// if(!subMeeting.isPresent()){
// log.error("账户级周期会议"+meetingId+"未知子会议ID");
// retryCount++;
// continue;
//// processLogService.log(meeting.getMeetingId(),subMeetingId,"周期会议"+meetingId+"未知子会议ID");
// //会议详情查不到历史的子会议id了,需要到用户已结束会议列表查一下
//// MeetingsApi.ApiV1HistoryMeetingsUseridGetRequest completedMeetingRequest =
//// new MeetingsApi.ApiV1HistoryMeetingsUseridGetRequest.Builder(tencentAdminUserId)
//// .pageSize("20")
//// .page("1")
//// .meetingCode(meetingInfo.getMeetingCode())
//// .startTime(String.valueOf(meetingDayStartTimeStamp))
//// .endTime(String.valueOf(meetingDayEndTimeStamp))
//// .build();
//// MeetingsApi.ApiV1HistoryMeetingsUseridGetResponse completedMeetingResponse =
//// client.meetings().v1HistoryMeetingsUseridGet(completedMeetingRequest, new JWTAuthenticator.Builder()
//// .nonce(BigInteger.valueOf(Math.abs((new SecureRandom()).nextInt())))
//// .timestamp(String.valueOf(System.currentTimeMillis() / 1000L)));
////
//// V1HistoryMeetingsUseridGet200Response completedMeetingData = completedMeetingResponse.getData();
//// List<V1HistoryMeetingsUseridGet200ResponseMeetingInfoListInner> completedMeetingList = completedMeetingData.getMeetingInfoList();
//// if(CollectionUtils.isEmpty(completedMeetingList)){
//// log.error("账户级周期会议"+meetingId+"未知子会议ID");
//// retryCount++;
//// continue;
//// }
//// subMeetingId = completedMeetingList.get(0).getSubMeetingId();
// }else{
// subMeetingId = subMeeting.get().getSubMeetingId();
// }
// }else{
// subMeetingId = meetingItem.getCurrentSubMeetingId();
// log.info("周期会议"+meetingId+"的子会议列表为空,获取当前子会议号");
//// processLogService.log(meeting.getMeetingId(),subMeetingId,"周期会议"+meetingId+"的子会议列表为空,获取当前子会议号");
// }
// }
// 获取参会成员明细 // 获取参会成员明细
V1MeetingsMeetingIdParticipantsGet200Response participantsData = TencentMeetingApiUtil.ApiV1MeetingsMeetingIdParticipantsGetRequest(meetingId, subMeetingId); V1MeetingsMeetingIdParticipantsGet200Response participantsData = TencentMeetingApiUtil.ApiV1MeetingsMeetingIdParticipantsGetRequest(meetingId, subMeetingId);
...@@ -228,6 +163,7 @@ public class FileProcessTask { ...@@ -228,6 +163,7 @@ public class FileProcessTask {
if (template == null) { if (template == null) {
throw new RobotBaseException("未找到模板!"); throw new RobotBaseException("未找到模板!");
} }
log.info("使用模版: {}", template.getName());
List<EmailPush.Attachment> attachments = new ArrayList<>(); List<EmailPush.Attachment> attachments = new ArrayList<>();
String hostUid = meetingInfo.getHostUid(); String hostUid = meetingInfo.getHostUid();
String toUserCode = tidWidRelations.get(meetingInfo.getHostUid()); String toUserCode = tidWidRelations.get(meetingInfo.getHostUid());
......
...@@ -15,7 +15,8 @@ public interface TencentMeetingService extends IService<TencentMeetingUser> { ...@@ -15,7 +15,8 @@ public interface TencentMeetingService extends IService<TencentMeetingUser> {
void doUsers(); void doUsers();
List<TencentMeetingVO.RecordFile> getMeetingFiles(List<UserDTO> accessUserIds,Map<String, WeComUser> weComUserMap); List<TencentMeetingVO.RecordFile> getMeetingFiles();
// List<TencentMeetingVO.RecordFile> getMeetingFiles(List<UserDTO> accessUserIds, Map<String, WeComUser> weComUserMap);
List<UserDTO> getAccessUserIds(Map<String,String> userIdRelations); List<UserDTO> getAccessUserIds(Map<String,String> userIdRelations);
......
...@@ -132,7 +132,7 @@ public class MeetingInfoServiceImpl extends ServiceImpl<MeetingInfoMapper, Meeti ...@@ -132,7 +132,7 @@ public class MeetingInfoServiceImpl extends ServiceImpl<MeetingInfoMapper, Meeti
.between(vo.getStartTime() != null, MeetingInfo::getStartTime, vo.getStartTime(), vo.getEndTime()) .between(vo.getStartTime() != null, MeetingInfo::getStartTime, vo.getStartTime(), vo.getEndTime())
.orderByDesc(MeetingInfo::getStartTime) .orderByDesc(MeetingInfo::getStartTime)
.select(MeetingInfo::getId, MeetingInfo::getMeetingId, MeetingInfo::getSubject, MeetingInfo::getHost, MeetingInfo::getHostUid, .select(MeetingInfo::getId, MeetingInfo::getMeetingId, MeetingInfo::getSubject, MeetingInfo::getHost, MeetingInfo::getHostUid,
MeetingInfo::getStartTime, MeetingInfo::getEndTime, MeetingInfo::getIsGenerated, MeetingInfo::getIsPushed, MeetingInfo::getReprocess, MeetingInfo::getClear); MeetingInfo::getStartTime, MeetingInfo::getEndTime, MeetingInfo::getIsGenerated, MeetingInfo::getIsPushed, MeetingInfo::getReprocess, MeetingInfo::getClear, MeetingInfo::getStatus);
Page<MeetingInfo> meetingInfoPage = mapper.selectPage(new Page<>(vo.getCurrent(), vo.getSize()), queryWrapper); Page<MeetingInfo> meetingInfoPage = mapper.selectPage(new Page<>(vo.getCurrent(), vo.getSize()), queryWrapper);
if (CollUtil.isNotEmpty(meetingInfoPage.getRecords())) { if (CollUtil.isNotEmpty(meetingInfoPage.getRecords())) {
List<MeetingInfo> records = meetingInfoPage.getRecords(); List<MeetingInfo> records = meetingInfoPage.getRecords();
......
...@@ -442,7 +442,7 @@ public class MeetingRecordTemplateServiceImpl extends ServiceImpl<MeetingRecordT ...@@ -442,7 +442,7 @@ public class MeetingRecordTemplateServiceImpl extends ServiceImpl<MeetingRecordT
String deptPathByUserId = sysUserSyncService.getDeptPathByUserId(userId); String deptPathByUserId = sysUserSyncService.getDeptPathByUserId(userId);
List<String> parentDeptIdList = Arrays.asList(deptPathByUserId.split("/")); List<String> parentDeptIdList = Arrays.asList(deptPathByUserId.split("/"));
List<MeetTypeDto> list = this.getMeetTypeList(userId, parentDeptIdList, "custom"); List<MeetTypeDto> list = this.getMeetTypeList(userId, parentDeptIdList, "custom");
System.out.println("用户拥有的模板:" + JSON.toJSONString(list)); // System.out.println("用户拥有的模板:" + JSON.toJSONString(list));
// 获取制定会议类型下的模板 // 获取制定会议类型下的模板
for (MeetTypeDto meetTypeDto : list) { for (MeetTypeDto meetTypeDto : list) {
for (Long aLong : meetType) { for (Long aLong : meetType) {
......
package com.cmeeting.service.impl; package com.cmeeting.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cmeeting.ad.entity.SysUserSync;
import com.cmeeting.constant.MeetingState; import com.cmeeting.constant.MeetingState;
import com.cmeeting.dto.UserDTO; import com.cmeeting.dto.UserDTO;
import com.cmeeting.log.service.ProcessLogService; import com.cmeeting.log.service.ProcessLogService;
import com.cmeeting.mapper.primary.AuthMapper; import com.cmeeting.mapper.primary.*;
import com.cmeeting.mapper.primary.MeetingInfoMapper;
import com.cmeeting.mapper.primary.TecentMeetingMapper;
import com.cmeeting.mapper.primary.SysUserSyncMapper;
import com.cmeeting.pojo.*; import com.cmeeting.pojo.*;
import com.cmeeting.service.ModulePermissionService; import com.cmeeting.service.ModulePermissionService;
import com.cmeeting.service.SysUserSyncService; import com.cmeeting.service.SysUserSyncService;
...@@ -69,6 +68,11 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper, ...@@ -69,6 +68,11 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
private ModulePermissionService modulePermissionService; private ModulePermissionService modulePermissionService;
@Resource @Resource
private SysUserSyncService sysUserSyncService; private SysUserSyncService sysUserSyncService;
@Resource
private UserIdMapper userIdMapper;
@Resource
private WeComUserMapper weComUserMapper;
private static final String HMAC_ALGORITHM = "HmacSHA256"; private static final String HMAC_ALGORITHM = "HmacSHA256";
private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
...@@ -119,13 +123,10 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper, ...@@ -119,13 +123,10 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
/** /**
* 获取会议信息以及会议对应的转录文件信息 * 获取会议信息以及会议对应的转录文件信息
*
* @param accessUserIds 允许生成会议纪要的人员
* @param weComUserMap 企微可见范围内现有的人员
* @return * @return
*/ */
@Override @Override
public List<TencentMeetingVO.RecordFile> getMeetingFiles(List<UserDTO> accessUserIds, Map<String, WeComUser> weComUserMap) { public List<TencentMeetingVO.RecordFile> getMeetingFiles() {
List<TencentMeetingVO.RecordFile> meetingFiles = new ArrayList<>(); List<TencentMeetingVO.RecordFile> meetingFiles = new ArrayList<>();
List<MeetingInfo> meetingSaveList = new ArrayList<>(); List<MeetingInfo> meetingSaveList = new ArrayList<>();
// 查询近searchDays天的会议录制列表 // 查询近searchDays天的会议录制列表
...@@ -250,39 +251,37 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper, ...@@ -250,39 +251,37 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
} }
} }
} }
//判断是否有权限生成纪要
boolean generateAccess = false; //1. 企业微信授权,然后通过企业微信创建会议绑定上腾讯会议ID成功 则为企业微信授权
boolean emailPushAccess; UserId temp = userIdMapper.selectOne(new LambdaQueryWrapper<UserId>().eq(UserId::getTid, hostId));
String finalHostId = hostId; if (temp == null) {
UserDTO userDTO = accessUserIds.stream().filter(item -> item.getTid().equals(finalHostId)).findFirst().get(); throw new RuntimeException("企业微信未授权!");
String userId = weComUserMap.get(userDTO.getWid()).getUserId();
// 1. 智能体需要授权
String finalHostId1 = hostId;
generateAccess = accessUserIds.stream().anyMatch(item -> item.getTid().equals(finalHostId1));
log.info("用户: {}, 智能体是否授权: {}", userId, generateAccess);
String email = userDTO.getEmail();
// 2. 腾讯会议和企业微信信息同步过并且绑定关系
// 3. 用户在超管授权了的人员里面
// 3. 用户自己没有关闭会议纪要功能
// 满足以上所有则emailGenerateAccess为ture
if (generateAccess) {
generateAccess = generateAccess && weComUserMap.containsKey(userDTO.getWid());
log.info("用户: {}, uid是否绑定企业微信: {}", userId, generateAccess);
}
if (generateAccess) {
List<SysUserSyncCategory> categoryList = sysUserSyncService.getCategoryListByUserId(userId);
List<String> deptIds = categoryList.stream().map(SysUserSyncCategory::getDeptId).collect(Collectors.toList());
generateAccess = generateAccess && modulePermissionService.checkAdminPermission(deptIds, userId);
log.info("用户: {}, 超管是否授权给用户: {}", userId, generateAccess);
} }
if (generateAccess) { String userId = temp.getWid();
generateAccess = generateAccess && modulePermissionService.personalStatus(userId); log.info("用户: {}, uid是否绑定企业微信: {}", userId, true);
log.info("用户: {}, 个人是否开启纪要功能: {}", userId, generateAccess);
// 2. 会议助手后台页面(用户权限调整)-授权用户清单中包括
List<SysUserSyncCategory> categoryList = sysUserSyncService.getCategoryListByUserId(userId);
List<String> deptIds = categoryList.stream().map(SysUserSyncCategory::getDeptId).collect(Collectors.toList());
if (!modulePermissionService.checkAdminPermission(deptIds, userId)) {
throw new RuntimeException("该用户未授权会议纪要功能!");
} }
// 是否推送邮箱 log.info("用户: {}, 超管是否授权给用户: {}", userId, true);
emailPushAccess = generateAccess && (weComUserMap.containsKey(userDTO.getWid()) ? weComUserMap.get(userDTO.getWid()).getEmailPushAccess() : Boolean.FALSE);
// 3. 用户或超管取消个人纪要功能权限
boolean generateAccess = modulePermissionService.personalStatus(userId);
log.info("用户: {}, 个人是否开启纪要功能: {}", userId, generateAccess);
// 4. 个人是否取消推送邮箱功能
//emailPushAccess = generateAccess && (weComUserMap.containsKey(userDTO.getWid()) ? weComUserMap.get(userDTO.getWid()).getEmailPushAccess() : Boolean.FALSE);
WeComUser weComUser = weComUserMapper.selectOne(new LambdaQueryWrapper<WeComUser>().eq(WeComUser::getUserId, userId));
boolean emailPushAccess = generateAccess && weComUser.getEmailPushAccess();
log.info("用户: {},是否推送邮箱: {}", userId, emailPushAccess); log.info("用户: {},是否推送邮箱: {}", userId, emailPushAccess);
// 5. 查询个人邮箱
SysUserSync sysUserSync = sysUserSyncMapper.selectOne(new LambdaQueryWrapper<SysUserSync>().eq(SysUserSync::getUserId, userId));
String email = sysUserSync.getEmail() != null ? sysUserSync.getEmail() : "";
// 查询会议开始和结束时间 // 查询会议开始和结束时间
MeetingInfo startAndEndTimeByMeetingId = TencentMeetingApiUtil.getStartAndEndTimeByMeetingId(meetingId); MeetingInfo startAndEndTimeByMeetingId = TencentMeetingApiUtil.getStartAndEndTimeByMeetingId(meetingId);
//会议基本信息保存 //会议基本信息保存
......
...@@ -141,6 +141,8 @@ ...@@ -141,6 +141,8 @@
<logger name="com.cmeeting.mapper.primary" level="TRACE"/> <logger name="com.cmeeting.mapper.primary" level="TRACE"/>
<logger name="com.cmeeting.mapper.secondary" level="TRACE"/> <logger name="com.cmeeting.mapper.secondary" level="TRACE"/>
<logger name="com.deepoove.poi.render.processor" level="WARN"/>
<!-- 日志总开关 --> <!-- 日志总开关 -->
<root level="info"> <root level="info">
<appender-ref ref="CONSOLE"/> <appender-ref ref="CONSOLE"/>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论