提交 6fa90851 作者: duanxincheng

定时纪要生成服务模板权限控制验证完成

父级 624eac0c
......@@ -53,6 +53,10 @@ public class UserDTO {
@NoArgsConstructor
public static class TemplateAuthorizedUserDTO {
/**
* 模板id
*/
private Integer recordTemplateId;
/**
* 模板
*/
private MeetingRecordTemplate recordTemplate;
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cmeeting.dto.UserDTO;
import com.cmeeting.mapper.primary.UserIdMapper;
import com.cmeeting.pojo.MeetingInfo;
import com.cmeeting.pojo.UserId;
import com.cmeeting.service.*;
import com.cmeeting.vo.TencentMeetingVO;
import lombok.extern.slf4j.Slf4j;
......@@ -13,11 +14,13 @@ import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@Component
@Slf4j
......@@ -32,6 +35,8 @@ public class CmeetingJob {
private FileProcessProducer producer;
@Autowired
private MeetingRecordTemplateService meetingRecordTemplateService;
@Resource
private UserIdMapper userIdMapper;
// @PostConstruct
// public void weComUserInit(){
......@@ -110,8 +115,12 @@ public class CmeetingJob {
log.info("结束时间: " + now.format(formatter) + " | Unix 时间戳: " + nowTimestamp);
log.info("----------------------------------");
//查出企微id和腾会id的关联关系
List<UserId> userIdRelations = userIdMapper.selectList(null);
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));
//智能体授权人员
List<UserDTO> accessUserIds = tencentMeetingService.getAccessUserIds();
List<UserDTO> accessUserIds = tencentMeetingService.getAccessUserIds(widTidRelations);
if (CollectionUtils.isEmpty(accessUserIds)) {
log.info("无生成纪要权限的人员");
return;
......@@ -126,11 +135,10 @@ public class CmeetingJob {
}
//获取模板授权的人员
// List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers = meetingRecordTemplateService.selectAuthorizedUsers();
List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers = new ArrayList<>();
List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers = meetingRecordTemplateService.selectAuthorizedUsers();
// 提交处理任务
producer.submitBatchTasks(meetingFiles,authorizedUsers,Boolean.FALSE);
producer.submitBatchTasks(meetingFiles,authorizedUsers,tidWidRelations,Boolean.FALSE);
}
......@@ -165,14 +173,15 @@ public class CmeetingJob {
meetingFiles.add(recordFile);
}
// List<UserDTO> accessUserIds = tecentMeetingService.getAccessUserIds();
//查出企微id和腾会id的关联关系
List<UserId> userIdRelations = userIdMapper.selectList(null);
Map<String,String> tidWidRelations = userIdRelations.stream().collect(Collectors.toMap(UserId::getTid,UserId::getWid));
//获取模板授权的人员
// List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers = meetingRecordTemplateService.selectAuthorizedUsers();
List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers = new ArrayList<>();
List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers = meetingRecordTemplateService.selectAuthorizedUsers();
// 提交处理任务
producer.submitBatchTasks(meetingFiles,authorizedUsers, Boolean.TRUE);
producer.submitBatchTasks(meetingFiles,authorizedUsers,tidWidRelations, Boolean.TRUE);
log.info("-------生成纪要重试定时任务结束--------");
} catch (Exception e) {
e.printStackTrace();
......
......@@ -87,6 +87,8 @@ public class FileProcessTask {
private ProcessLogService processLogService;
//获取模板授权的人员
private List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers;
//腾会id企微id对应关系
private Map<String,String> tidWidRelations;
// 实际处理逻辑
public void process() {
......@@ -244,35 +246,49 @@ public class FileProcessTask {
String choiceTemplateType = choiceTemplateType(meetingInfo.getSubject(),recordTextBuffer.toString());
log.info("choiceTemplateType->{}",choiceTemplateType);
//获取系统模板
MeetingRecordTemplate meetingRecordTemplate = meetingRecordTemplateMapper.selectById(1);
String processedResult = processWithClaude(recordTextBuffer.toString(),meetingDate,meetingRecordTemplate.getPrompt());
// 4. 保存结果
MeetingRecordTemplate meetingRecordTemplate2 = meetingRecordTemplateMapper.selectById(2);
String dataNetworkMinutesPath = saveResult(processedResult, recordTextBuffer.toString().getBytes(StandardCharsets.UTF_8), meetingInfo, meetingRecordTemplate);
List<MeetingRecordTemplate> recordTemplateList = meetingRecordTemplateMapper.selectList(
new LambdaQueryWrapper<MeetingRecordTemplate>().eq(MeetingRecordTemplate::getType,"system")
.eq(MeetingRecordTemplate::getIsDel,Boolean.FALSE));
Map<Integer, List<String>> authorizedUserMap = authorizedUsers.stream().collect(Collectors.toMap(item -> item.getRecordTemplateId(), item -> item.getUserIdList()));
List<EmailPush.Attachment> attachments = new ArrayList<>();
try(InputStream is = new FileInputStream(dataNetworkMinutesPath)){
byte[] meetingMinutesBytes = IOUtils.toByteArray(is);
EmailPush.Attachment attachment = EmailPush.Attachment.builder().name(meetingInfo.getSubject()+"会议纪要_数据网络中心").bytes(meetingMinutesBytes).build();
attachments.add(attachment);
// emailPush(meetingMinutesBytes, meetingInfo.getSubject(), meetingInfo.getEmail(), meetingInfo.getEmailPushAccess());
}catch (Exception e){
throw new RuntimeException(e);
}finally {
FileUtil.del(dataNetworkMinutesPath);
String hostUid = meetingInfo.getHostUid();
if(!tidWidRelations.containsKey(hostUid)){
log.info("用户{}暂未关联企微信息,无法生成纪要文件",hostUid);
processLogService.log(meetingId,subMeetingId,"用户"+hostUid+"暂未关联企微信息,无法生成纪要文件");
continue;
}
for (MeetingRecordTemplate template : recordTemplateList) {
//判断本次纪要有模板生成权限
if(!authorizedUserMap.containsKey(template.getId())){
log.info("模板{}暂未授权给任意对象",template.getName());
processLogService.log(meetingId,subMeetingId,"模板"+template.getName()+"暂未授权给任意对象");
continue;
}
List<String> authorizedUserIds = authorizedUserMap.get(template.getId());
if(!authorizedUserIds.contains(tidWidRelations.get(hostUid))){
log.info("用户{}暂无模板{}权限",hostUid,template.getName());
processLogService.log(meetingId,subMeetingId,"用户"+hostUid+"暂无模板"+template.getName()+"权限");
continue;
}else{
log.info("用户{}允许应用模板{}",hostUid,template.getName());
processLogService.log(meetingId,subMeetingId,"用户"+hostUid+"允许应用模板"+template.getName());
}
String processedResult2 = processWithClaude(recordTextBuffer.toString(),meetingDate,meetingRecordTemplate2.getPrompt());
String groupOfficeMinutesPath = saveResult(processedResult2, recordTextBuffer.toString().getBytes(StandardCharsets.UTF_8), meetingInfo, meetingRecordTemplate2);
try(InputStream is = new FileInputStream(groupOfficeMinutesPath)){
String processedResult = processWithClaude(recordTextBuffer.toString(),meetingDate,template.getPrompt());
String minutesPath = saveResult(processedResult, recordTextBuffer.toString().getBytes(StandardCharsets.UTF_8), meetingInfo, template);
try(InputStream is = new FileInputStream(minutesPath)){
byte[] meetingMinutesBytes = IOUtils.toByteArray(is);
EmailPush.Attachment attachment = EmailPush.Attachment.builder().name(meetingInfo.getSubject()+"会议纪要_集团办").bytes(meetingMinutesBytes).build();
EmailPush.Attachment attachment = EmailPush.Attachment.builder().name(meetingInfo.getSubject()+"会议纪要_"+template.getName()).bytes(meetingMinutesBytes).build();
attachments.add(attachment);
// emailPush(meetingMinutesBytes, meetingInfo.getSubject(), meetingInfo.getEmail(), meetingInfo.getEmailPushAccess());
}catch (Exception e){
throw new RuntimeException(e);
}finally {
FileUtil.del(groupOfficeMinutesPath);
FileUtil.del(minutesPath);
}
}
if(CollectionUtils.isEmpty(attachments)){
log.info("用户{}暂无任何模板权限,纪要生成失败",hostUid);
isSuccess = false;
continue;
}
EmailPush emailPushBuilder = EmailPush.builder().toEmail(meetingInfo.getEmail()).meetingId(meetingId).attachments(attachments).subject(meetingInfo.getSubject()).build();
emailPush(emailPushBuilder);
......@@ -610,7 +626,7 @@ public class FileProcessTask {
public FileProcessTask(List<String> recordFileIdList, String meetingId, String subMeetingId, String savePath, Map<String, Object> metadata, String tencentAppId,
String tencentSdkId, String tencentSecretId, String tencentSecretKey, String tencentAdminUserId,
MeetingInfoMapper meetingInfoMapper, MinioUtils minioUtils, EmailSender emailSender, MeetingRecordTemplateMapper meetingRecordTemplateMapper,
String llmApiAddr, Boolean finalRetry, ProcessLogService processLogService,List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers) {
String llmApiAddr, Boolean finalRetry, ProcessLogService processLogService,List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers,Map<String,String> tidWidRelations) {
this.recordFileIdList = recordFileIdList;
this.savePath = savePath;
this.metadata = metadata;
......@@ -629,5 +645,6 @@ public class FileProcessTask {
this.finalRetry = finalRetry;
this.processLogService = processLogService;
this.authorizedUsers = authorizedUsers;
this.tidWidRelations = tidWidRelations;
}
}
\ No newline at end of file
......@@ -20,6 +20,7 @@ import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
......@@ -61,10 +62,11 @@ public class FileProcessProducer {
* 批量提交生成纪要任务
* @param recordFiles 转录文件信息
* @param authorizedUsers 模板授权的人员
* @param tidWidRelations 腾会id企微id对应关系
* @param finalRetry 是否为最终重试
* @param finalRetry
*/
public void submitBatchTasks(List<TencentMeetingVO.RecordFile> recordFiles,List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers, Boolean finalRetry) {
public void submitBatchTasks(List<TencentMeetingVO.RecordFile> recordFiles, List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers, Map<String,String> tidWidRelations, Boolean finalRetry) {
List<Future<?>> futures = new ArrayList<>();
for (TencentMeetingVO.RecordFile recordFile : recordFiles) {
......@@ -87,7 +89,8 @@ public class FileProcessProducer {
llmApiAddr,
finalRetry,
processLogService,
authorizedUsers
authorizedUsers,
tidWidRelations
);
// 提交任务到线程池
......
......@@ -7,6 +7,7 @@ import com.cmeeting.pojo.UserId;
import com.cmeeting.vo.TencentMeetingVO;
import java.util.List;
import java.util.Map;
public interface TencentMeetingService extends IService<TencentMeetingUser> {
void batchInsert(List<TencentMeetingUser> users);
......@@ -15,7 +16,7 @@ public interface TencentMeetingService extends IService<TencentMeetingUser> {
List<TencentMeetingVO.RecordFile> getMeetingFiles(List<UserDTO> accessUserIds);
List<UserDTO> getAccessUserIds();
List<UserDTO> getAccessUserIds(Map<String,String> userIdRelations);
String getMeetingHost(String meetingCode);
......
......@@ -108,6 +108,7 @@ public class MeetingRecordTemplateServiceImpl extends ServiceImpl<MeetingRecordT
for (MeetingRecordTemplate template : meetingRecordTemplates) {
UserDTO.TemplateAuthorizedUserDTO resultItem = new UserDTO.TemplateAuthorizedUserDTO();
resultItem.setRecordTemplate(template);
resultItem.setRecordTemplateId(template.getId());
//该系统模板授权部门
List<RecordTemplatePermission> deptPermissions = permissions.stream().filter(item -> "1".equals(item.getRelType()) && template.getId().equals(item.getTemplateId())).collect(Collectors.toList());
//该系统模板授权人员
......
......@@ -6,12 +6,10 @@ import com.cmeeting.log.service.ProcessLogService;
import com.cmeeting.mapper.primary.AuthMapper;
import com.cmeeting.mapper.primary.MeetingInfoMapper;
import com.cmeeting.mapper.primary.TecentMeetingMapper;
import com.cmeeting.mapper.primary.UserIdMapper;
import com.cmeeting.mapper.secondary.SysUserSysMapper;
import com.cmeeting.pojo.CoreModulePermissions;
import com.cmeeting.pojo.MeetingInfo;
import com.cmeeting.pojo.TencentMeetingUser;
import com.cmeeting.pojo.UserId;
import com.cmeeting.service.TencentMeetingService;
import com.cmeeting.util.RedisUtils;
import com.cmeeting.util.SignatureUtil;
......@@ -60,8 +58,6 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,T
@Resource
private SysUserSysMapper sysUserSyncMapper;
@Resource
private UserIdMapper userIdMapper;
@Resource
private RedisUtils redisUtils;
@Resource
private ProcessLogService processLogService;
......@@ -545,10 +541,11 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,T
/**
* 获取有权限的人员
* @param userIdRelations
* @return
*/
@Override
public List<UserDTO> getAccessUserIds() {
public List<UserDTO> getAccessUserIds(Map<String,String> userIdRelations) {
try{
//权限控制
List<CoreModulePermissions> auths = authMapper.getAuthByTargetId(permissionApplicationId, permissionTenantId);
......@@ -570,14 +567,12 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,T
Map<String, String> userEmailMap = CollectionUtils.isEmpty(userEmailList) ? new HashMap<>()
: userEmailList.stream().collect(Collectors.toMap(UserDTO::getWid, UserDTO::getEmail));
//查出企微id和腾会id的关联关系
Map<String,String> userIds = userIdMapper.selectList(null).stream().collect(Collectors.toMap(UserId::getWid,UserId::getTid));
List<UserDTO> accessUsers = new ArrayList<>();
for (String accessUserId : accessUserIds) {
if(userIds.containsKey(accessUserId)){
if(userIdRelations.containsKey(accessUserId)){
UserDTO accessUser = new UserDTO();
accessUser.setWid(accessUserId);
accessUser.setTid(userIds.get(accessUserId));
accessUser.setTid(userIdRelations.get(accessUserId));
if(userEmailMap.containsKey(accessUserId))
accessUser.setEmail(userEmailMap.get(accessUserId));
accessUsers.add(accessUser);
......
......@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cmeeting.mapper.primary.MeetingInfoMapper">
<insert id="batchInsert" parameterType="list">
INSERT IGNORE INTO cmt_meeting_info (subject, meeting_id, meeting_code, host, participant_users, start_time,
INSERT IGNORE INTO cmt_meeting_info (subject, meeting_id, meeting_code, host, host_uid, participant_users, start_time,
end_time, is_generated, email_push_access, is_pushed, sync_time, sub_meeting_id, record_content, record_xml, generate_retry,
push_retry, record_file_id,email)
VALUES
......@@ -12,6 +12,7 @@
#{meeting.meetingId},
#{meeting.meetingCode},
#{meeting.host},
#{meeting.hostUid},
#{meeting.participantUsers},
#{meeting.startTime},
#{meeting.endTime},
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论