提交 6fa90851 作者: duanxincheng

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

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