提交 ba5806a3 作者: 洪东保

meetingRecordId;

父级 c6787ec7
...@@ -268,6 +268,7 @@ public class MeetingInfoController { ...@@ -268,6 +268,7 @@ public class MeetingInfoController {
EmailPush emailPushBuilder = EmailPush.builder() EmailPush emailPushBuilder = EmailPush.builder()
.toEmail(meetingInfo.getEmail()) .toEmail(meetingInfo.getEmail())
.meetingId(meetingInfo.getMeetingId()) .meetingId(meetingInfo.getMeetingId())
.meetingRecordId(meetingInfo.getMeetingRecordId())
.attachments(attachments) .attachments(attachments)
.subject(meetingInfo.getSubject()) .subject(meetingInfo.getSubject())
.meetingInstanceId(meetingInfo.getId()) .meetingInstanceId(meetingInfo.getId())
......
...@@ -91,6 +91,7 @@ public class EmailSender { ...@@ -91,6 +91,7 @@ public class EmailSender {
Boolean isSent = false; Boolean isSent = false;
String toEmail = "test".equals(environment) ? testReceiver : emailPushBuilder.getToEmail(); String toEmail = "test".equals(environment) ? testReceiver : emailPushBuilder.getToEmail();
String subject = emailPushBuilder.getSubject(); String subject = emailPushBuilder.getSubject();
String meetingRecordId = emailPushBuilder.getMeetingRecordId();
String meetingId = emailPushBuilder.getMeetingId(); String meetingId = emailPushBuilder.getMeetingId();
String subMeetingId = emailPushBuilder.getSubMeetingId(); String subMeetingId = emailPushBuilder.getSubMeetingId();
Integer meetingInstanceId = emailPushBuilder.getMeetingInstanceId(); Integer meetingInstanceId = emailPushBuilder.getMeetingInstanceId();
...@@ -191,7 +192,7 @@ public class EmailSender { ...@@ -191,7 +192,7 @@ public class EmailSender {
.buildRequest() .buildRequest()
.post(); .post();
log.info("邮件已成功发送: meetingId->{}, subMeetingId->{}", meetingId, subMeetingId); log.info("邮件已成功发送: meetingRecordId->{}", meetingRecordId);
isSent = true; isSent = true;
} catch (Exception e) { } catch (Exception e) {
retryCount.getAndIncrement(); retryCount.getAndIncrement();
......
...@@ -35,7 +35,7 @@ import java.util.concurrent.atomic.AtomicInteger; ...@@ -35,7 +35,7 @@ import java.util.concurrent.atomic.AtomicInteger;
@Slf4j @Slf4j
@Service @Service
public class EmailPushTask { public class EmailPushTask {
private List<String> recordFileIdList; private String meetingRecordId;
private String meetingId; private String meetingId;
private String subMeetingId; private String subMeetingId;
private String savePath; private String savePath;
...@@ -54,8 +54,7 @@ public class EmailPushTask { ...@@ -54,8 +54,7 @@ public class EmailPushTask {
// 实际处理逻辑 // 实际处理逻辑
public void process() { public void process() {
String join = String.join(",", recordFileIdList); String key = "meet_process-" + meetingRecordId;
String key = "meet_process" + meetingId + "_" + (subMeetingId == null ? "" : subMeetingId) + "_" + join;
if (!redisUtils.setnx(key, 1, 120)) { if (!redisUtils.setnx(key, 1, 120)) {
log.warn("key already exists in redis!, key: {}", key); log.warn("key already exists in redis!, key: {}", key);
return; return;
...@@ -65,9 +64,7 @@ public class EmailPushTask { ...@@ -65,9 +64,7 @@ public class EmailPushTask {
Boolean isSuccess = false; Boolean isSuccess = false;
AtomicInteger retryCount = new AtomicInteger(0); AtomicInteger retryCount = new AtomicInteger(0);
MeetingInfo meetingInfo = meetingInfoMapper.selectOne(new LambdaQueryWrapper<MeetingInfo>() MeetingInfo meetingInfo = meetingInfoMapper.selectOne(new LambdaQueryWrapper<MeetingInfo>()
.eq(MeetingInfo::getMeetingId,meetingId) .eq(MeetingInfo::getMeetingRecordId, meetingRecordId));
.eq(subMeetingId != null, MeetingInfo::getSubMeetingId, subMeetingId)
.eq(MeetingInfo::getRecordFileId, join));
if (meetingInfo.getIsPushed()) { if (meetingInfo.getIsPushed()) {
log.warn("邮件已推送, meetingId: {}", meetingId); log.warn("邮件已推送, meetingId: {}", meetingId);
return; return;
...@@ -127,6 +124,7 @@ public class EmailPushTask { ...@@ -127,6 +124,7 @@ public class EmailPushTask {
EmailPush emailPushBuilder = EmailPush.builder() EmailPush emailPushBuilder = EmailPush.builder()
.toEmail(meetingInfo.getEmail()) .toEmail(meetingInfo.getEmail())
.meetingId(meetingId) .meetingId(meetingId)
.meetingRecordId(meetingRecordId)
.attachments(attachments) .attachments(attachments)
.subject(meetingInfo.getSubject()) .subject(meetingInfo.getSubject())
.meetingInstanceId(meetingInfo.getId()) .meetingInstanceId(meetingInfo.getId())
...@@ -172,9 +170,7 @@ public class EmailPushTask { ...@@ -172,9 +170,7 @@ public class EmailPushTask {
if (isSuccess != null) { if (isSuccess != null) {
meetingInfoMapper.update(meetingInfo, meetingInfoMapper.update(meetingInfo,
new LambdaUpdateWrapper<MeetingInfo>() new LambdaUpdateWrapper<MeetingInfo>()
.eq(MeetingInfo::getMeetingId,meetingId) .eq(MeetingInfo::getMeetingRecordId, meetingRecordId)
.eq(subMeetingId != null, MeetingInfo::getSubMeetingId, subMeetingId)
.eq(MeetingInfo::getRecordFileId, join)
.set(MeetingInfo::getIsPushed,isSuccess) .set(MeetingInfo::getIsPushed,isSuccess)
.set(MeetingInfo::getStatus, isSuccess ? MeetingState.PUSH_SUCCESS.getCode() : MeetingState.PUSH_ERROR.getCode()) .set(MeetingInfo::getStatus, isSuccess ? MeetingState.PUSH_SUCCESS.getCode() : MeetingState.PUSH_ERROR.getCode())
.set(MeetingInfo::getPushRetry, Boolean.TRUE) .set(MeetingInfo::getPushRetry, Boolean.TRUE)
...@@ -221,12 +217,12 @@ public class EmailPushTask { ...@@ -221,12 +217,12 @@ public class EmailPushTask {
} }
public EmailPushTask(List<String> recordFileIdList, String meetingId, String subMeetingId, String savePath, Map<String, Object> metadata, public EmailPushTask(String meetingRecordId, String meetingId, String subMeetingId, String savePath, Map<String, Object> metadata,
MeetingInfoMapper meetingInfoMapper, MinioUtils minioUtils, RedisUtils redisUtils, EmailSender emailSender, MeetingInfoMapper meetingInfoMapper, MinioUtils minioUtils, RedisUtils redisUtils, EmailSender emailSender,
MeetingRecordTemplateMapper meetingRecordTemplateMapper, Map<String,String> tidWidRelations, String aesKey) { MeetingRecordTemplateMapper meetingRecordTemplateMapper, Map<String,String> tidWidRelations, String aesKey) {
this.recordFileIdList = recordFileIdList;
this.savePath = savePath; this.savePath = savePath;
this.metadata = metadata; this.metadata = metadata;
this.meetingRecordId = meetingRecordId;
this.meetingId = meetingId; this.meetingId = meetingId;
this.subMeetingId = subMeetingId; this.subMeetingId = subMeetingId;
this.meetingInfoMapper = meetingInfoMapper; this.meetingInfoMapper = meetingInfoMapper;
......
...@@ -69,6 +69,7 @@ import java.util.stream.Collectors; ...@@ -69,6 +69,7 @@ import java.util.stream.Collectors;
@Service @Service
public class FileProcessTask { public class FileProcessTask {
private List<String> recordFileIdList; private List<String> recordFileIdList;
private String meetingRecordId;
private String meetingId; private String meetingId;
private String subMeetingId; private String subMeetingId;
private String savePath; private String savePath;
...@@ -109,8 +110,7 @@ public class FileProcessTask { ...@@ -109,8 +110,7 @@ public class FileProcessTask {
// 实际处理逻辑 // 实际处理逻辑
public void process() { public void process() {
boolean isSuccess = false; boolean isSuccess = false;
String join = String.join(",", recordFileIdList); String key = "meet_process-" + meetingRecordId;
String key = "meet_process" + meetingId + "_" + (subMeetingId == null ? "" : subMeetingId) + "_" + join;
if (!redisUtils.setnx(key, 1, 240)) { if (!redisUtils.setnx(key, 1, 240)) {
log.warn("key already exists in redis!, key: {}", key); log.warn("key already exists in redis!, key: {}", key);
return; return;
...@@ -122,9 +122,7 @@ public class FileProcessTask { ...@@ -122,9 +122,7 @@ public class FileProcessTask {
try { try {
//已保存的会议信息 //已保存的会议信息
MeetingInfo meetingInfo = meetingInfoMapper.selectOne(new LambdaQueryWrapper<MeetingInfo>() MeetingInfo meetingInfo = meetingInfoMapper.selectOne(new LambdaQueryWrapper<MeetingInfo>()
.eq(MeetingInfo::getMeetingId,meetingId) .eq(MeetingInfo::getMeetingRecordId, meetingRecordId));
.eq(MeetingInfo::getRecordFileId, join)
.eq(subMeetingId != null, MeetingInfo::getSubMeetingId, subMeetingId));
if (meetingInfo.getIsGenerated()) { if (meetingInfo.getIsGenerated()) {
log.warn("Generating is down, meetingId: {}, subMeetingId: {}", meetingInfo.getMeetingId(), meetingInfo.getSubMeetingId()); log.warn("Generating is down, meetingId: {}, subMeetingId: {}", meetingInfo.getMeetingId(), meetingInfo.getSubMeetingId());
return; return;
...@@ -201,6 +199,7 @@ public class FileProcessTask { ...@@ -201,6 +199,7 @@ public class FileProcessTask {
EmailPush emailPushBuilder = EmailPush.builder() EmailPush emailPushBuilder = EmailPush.builder()
.toEmail(meetingInfo.getEmail()) .toEmail(meetingInfo.getEmail())
.meetingId(meetingId) .meetingId(meetingId)
.meetingRecordId(meetingRecordId)
.attachments(attachments) .attachments(attachments)
.subject(meetingInfo.getSubject()) .subject(meetingInfo.getSubject())
.meetingInstanceId(meetingInfo.getId()) .meetingInstanceId(meetingInfo.getId())
...@@ -225,16 +224,12 @@ public class FileProcessTask { ...@@ -225,16 +224,12 @@ public class FileProcessTask {
if (finalRetry) { if (finalRetry) {
meetingInfoMapper.update(null, meetingInfoMapper.update(null,
new LambdaUpdateWrapper<MeetingInfo>() new LambdaUpdateWrapper<MeetingInfo>()
.eq(MeetingInfo::getMeetingId,meetingId) .eq(MeetingInfo::getMeetingRecordId, meetingRecordId)
.eq(MeetingInfo::getRecordFileId,join)
.eq(subMeetingId != null,MeetingInfo::getSubMeetingId,subMeetingId)
.set(MeetingInfo::getGenerateRetry,Boolean.TRUE)); .set(MeetingInfo::getGenerateRetry,Boolean.TRUE));
} else { } else {
meetingInfoMapper.update(null, meetingInfoMapper.update(null,
new LambdaUpdateWrapper<MeetingInfo>() new LambdaUpdateWrapper<MeetingInfo>()
.eq(MeetingInfo::getMeetingId,meetingId) .eq(MeetingInfo::getMeetingRecordId, meetingRecordId)
.eq(MeetingInfo::getRecordFileId,join)
.eq(subMeetingId != null,MeetingInfo::getSubMeetingId,subMeetingId)
.set(MeetingInfo::getStatus, status != null ? status : MeetingState.GENERATE_ERROR.getCode()) .set(MeetingInfo::getStatus, status != null ? status : MeetingState.GENERATE_ERROR.getCode())
); );
} }
...@@ -413,11 +408,10 @@ public class FileProcessTask { ...@@ -413,11 +408,10 @@ public class FileProcessTask {
} finally { } finally {
meetingInfoMapper.update(meetingInfo, meetingInfoMapper.update(meetingInfo,
new LambdaUpdateWrapper<MeetingInfo>() new LambdaUpdateWrapper<MeetingInfo>()
.eq(MeetingInfo::getMeetingId, meetingId) .eq(MeetingInfo::getMeetingRecordId, meetingInfo.getMeetingRecordId())
.eq(subMeetingId != null, MeetingInfo::getSubMeetingId, subMeetingId) .set(MeetingInfo::getRecordContent,recordContentPath)
.set(MeetingInfo::getRecordContent, recordContentPath) .set(MeetingInfo::getRecordXml,recordXmlPath)
.set(MeetingInfo::getRecordXml, recordXmlPath) .set(MeetingInfo::getParticipantUsers,meetingInfo.getParticipantUsers())
.set(MeetingInfo::getParticipantUsers, meetingInfo.getParticipantUsers())
.set(MeetingInfo::getIsGenerated, success) .set(MeetingInfo::getIsGenerated, success)
.set(MeetingInfo::getTemplateId, meetingRecordTemplate.getId()) .set(MeetingInfo::getTemplateId, meetingRecordTemplate.getId())
.set(MeetingInfo::getTransDocId, meetingInfo.getTransDocId()) .set(MeetingInfo::getTransDocId, meetingInfo.getTransDocId())
...@@ -449,8 +443,7 @@ public class FileProcessTask { ...@@ -449,8 +443,7 @@ public class FileProcessTask {
meetingInfoMapper.update(null, meetingInfoMapper.update(null,
new LambdaUpdateWrapper<MeetingInfo>() new LambdaUpdateWrapper<MeetingInfo>()
.eq(MeetingInfo::getMeetingId, meetingId) .eq(MeetingInfo::getMeetingRecordId, meetingRecordId)
.eq(subMeetingId != null, MeetingInfo::getSubMeetingId, subMeetingId)
.set(MeetingInfo::getIsPushed, isPushed) .set(MeetingInfo::getIsPushed, isPushed)
.set(MeetingInfo::getStatus, isPushed ? MeetingState.PUSH_SUCCESS.getCode() : MeetingState.PUSH_ERROR.getCode()) .set(MeetingInfo::getStatus, isPushed ? MeetingState.PUSH_SUCCESS.getCode() : MeetingState.PUSH_ERROR.getCode())
); );
...@@ -538,7 +531,7 @@ public class FileProcessTask { ...@@ -538,7 +531,7 @@ public class FileProcessTask {
} }
public FileProcessTask(List<String> recordFileIdList, String meetingId, String subMeetingId, String savePath, Map<String, Object> metadata, public FileProcessTask(List<String> recordFileIdList, String meetingRecordId, String meetingId, String subMeetingId, String savePath, Map<String, Object> metadata,
MeetingInfoMapper meetingInfoMapper, MinioUtils minioUtils, RedisUtils redisUtils, EmailSender emailSender, MeetingInfoMapper meetingInfoMapper, MinioUtils minioUtils, RedisUtils redisUtils, EmailSender emailSender,
MeetingRecordTemplateMapper meetingRecordTemplateMapper, MeetingRecordTemplateService meetingRecordTemplateService, MeetTypeService meetTypeService, UserIdMapper userIdMapper, MeetingRecordTemplateMapper meetingRecordTemplateMapper, MeetingRecordTemplateService meetingRecordTemplateService, MeetTypeService meetTypeService, UserIdMapper userIdMapper,
String llmApiAddr, String llmModel, String llmToken, Integer llmMaxTokens, Boolean finalRetry, ProcessLogService processLogService, List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers, Map<String, String> tidWidRelations, String llmApiAddr, String llmModel, String llmToken, Integer llmMaxTokens, Boolean finalRetry, ProcessLogService processLogService, List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers, Map<String, String> tidWidRelations,
...@@ -547,6 +540,7 @@ public class FileProcessTask { ...@@ -547,6 +540,7 @@ public class FileProcessTask {
this.recordFileIdList = recordFileIdList; this.recordFileIdList = recordFileIdList;
this.savePath = savePath; this.savePath = savePath;
this.metadata = metadata; this.metadata = metadata;
this.meetingRecordId = meetingRecordId;
this.meetingId = meetingId; this.meetingId = meetingId;
this.subMeetingId = subMeetingId; this.subMeetingId = subMeetingId;
this.meetingInfoMapper = meetingInfoMapper; this.meetingInfoMapper = meetingInfoMapper;
......
...@@ -92,6 +92,7 @@ public class FileProcessProducer { ...@@ -92,6 +92,7 @@ public class FileProcessProducer {
// 为每个URL创建任务 // 为每个URL创建任务
FileProcessTask task = new FileProcessTask( FileProcessTask task = new FileProcessTask(
recordFile.getRecordFileIdList(), recordFile.getRecordFileIdList(),
recordFile.getMeetingRecordId(),
recordFile.getMeetingId(), recordFile.getMeetingId(),
recordFile.getSubMeetingId(), recordFile.getSubMeetingId(),
baseSavePath, baseSavePath,
...@@ -139,7 +140,7 @@ public class FileProcessProducer { ...@@ -139,7 +140,7 @@ public class FileProcessProducer {
for (TencentMeetingVO.RecordFile recordFile : recordFiles) { for (TencentMeetingVO.RecordFile recordFile : recordFiles) {
// 为每个URL创建任务 // 为每个URL创建任务
EmailPushTask task = new EmailPushTask( EmailPushTask task = new EmailPushTask(
recordFile.getRecordFileIdList(), recordFile.getMeetingRecordId(),
recordFile.getMeetingId(), recordFile.getMeetingId(),
recordFile.getSubMeetingId(), recordFile.getSubMeetingId(),
baseSavePath, baseSavePath,
......
...@@ -235,7 +235,7 @@ public class MeetingInfoServiceImpl extends ServiceImpl<MeetingInfoMapper, Meeti ...@@ -235,7 +235,7 @@ public class MeetingInfoServiceImpl extends ServiceImpl<MeetingInfoMapper, Meeti
saveResult(processedResult, recordTextBuffer.toString().getBytes(StandardCharsets.UTF_8), meetingInfo, meetingRecordTemplate); saveResult(processedResult, recordTextBuffer.toString().getBytes(StandardCharsets.UTF_8), meetingInfo, meetingRecordTemplate);
meetingInfoMapper.update(null, meetingInfoMapper.update(null,
new LambdaUpdateWrapper<MeetingInfo>() new LambdaUpdateWrapper<MeetingInfo>()
.eq(MeetingInfo::getMeetingId,meetingId) .eq(MeetingInfo::getMeetingRecordId, meetingInfo.getMeetingRecordId())
.eq(subMeetingId != null,MeetingInfo::getSubMeetingId,subMeetingId) .eq(subMeetingId != null,MeetingInfo::getSubMeetingId,subMeetingId)
.set(MeetingInfo::getRecordXml,meetingInfo.getRecordXml()) .set(MeetingInfo::getRecordXml,meetingInfo.getRecordXml())
.set(MeetingInfo::getTemplateId, meetingRecordTemplate.getId()) .set(MeetingInfo::getTemplateId, meetingRecordTemplate.getId())
......
...@@ -170,6 +170,7 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper, ...@@ -170,6 +170,7 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
log.info("【会议定时检索】转录文件的meetingId->{},recordFileId->{}", meeting.getMeetingId(), meeting.getMeetingRecordId()); log.info("【会议定时检索】转录文件的meetingId->{},recordFileId->{}", meeting.getMeetingId(), meeting.getMeetingRecordId());
//查询会议详情 //查询会议详情
String meetingId = meeting.getMeetingId(); String meetingId = meeting.getMeetingId();
String meetingRecordId = meeting.getMeetingRecordId();
String subMeetingId = null; String subMeetingId = null;
LocalDateTime mediaStartTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.valueOf(meeting.getMediaStartTime())), ZoneId.systemDefault()); LocalDateTime mediaStartTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.valueOf(meeting.getMediaStartTime())), ZoneId.systemDefault());
String hostId = ""; String hostId = "";
...@@ -201,15 +202,8 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper, ...@@ -201,15 +202,8 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
Set<String> set1 = new HashSet<>(recordFileIdList); Set<String> set1 = new HashSet<>(recordFileIdList);
//如果数据库中已有相同会议id的记录,跳过同步 //如果数据库中已有相同会议id的记录,跳过同步
String finalSubMeetingId = subMeetingId; if(meetingIds.stream().noneMatch(item->Objects.equals(item.getMeetingRecordId(), meetingRecordId))){
if(meetingIds.stream().noneMatch log.info("【会议检索】新的会议记录MeetingRecordId->:{}, meetingId->{}, recordIds: {}", meetingRecordId,meeting.getMeetingId(), String.join(",", recordFileIdList));
(
item->item.getMeetingId().equals(meetingId)
&& Objects.equals(item.getSubMeetingId(), finalSubMeetingId)
&& new HashSet<>(Arrays.asList(item.getRecordFileId().split(","))).containsAll(set1)
)
){
log.info("【会议检索】新的会议记录meetingId->{}, subId: {} ,recordIds: {}",meeting.getMeetingId(), finalSubMeetingId, String.join(",", recordFileIdList));
String hostName; String hostName;
//优先使用会议列表中已有的主持人字段 //优先使用会议列表中已有的主持人字段
...@@ -285,7 +279,10 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper, ...@@ -285,7 +279,10 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
// 查询会议开始和结束时间 // 查询会议开始和结束时间
MeetingInfo startAndEndTimeByMeetingId = TencentMeetingApiUtil.getStartAndEndTimeByMeetingId(meetingId); MeetingInfo startAndEndTimeByMeetingId = TencentMeetingApiUtil.getStartAndEndTimeByMeetingId(meetingId);
//会议基本信息保存 //会议基本信息保存
MeetingInfo meetingItem = MeetingInfo.builder().meetingId(meetingId).meetingCode(meeting.getMeetingCode()) MeetingInfo meetingItem = MeetingInfo.builder()
.meetingRecordId(meetingRecordId)
.meetingId(meetingId)
.meetingCode(meeting.getMeetingCode())
.subject(meeting.getSubject()) .subject(meeting.getSubject())
.startTime(startAndEndTimeByMeetingId != null ? startAndEndTimeByMeetingId.getStartTime() : mediaStartTime) .startTime(startAndEndTimeByMeetingId != null ? startAndEndTimeByMeetingId.getStartTime() : mediaStartTime)
.endTime(startAndEndTimeByMeetingId != null ? startAndEndTimeByMeetingId.getEndTime() : null) .endTime(startAndEndTimeByMeetingId != null ? startAndEndTimeByMeetingId.getEndTime() : null)
......
...@@ -34,6 +34,7 @@ public class EmailPush { ...@@ -34,6 +34,7 @@ public class EmailPush {
/** /**
* 会议id号 * 会议id号
*/ */
private String meetingRecordId;
private String meetingId; private String meetingId;
private String subMeetingId; private String subMeetingId;
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
</foreach> </foreach>
</insert> </insert>
<select id="getAllMeetingIds" resultType="com.cmeeting.vo.TencentMeetingVO$SimpleMeetingInfo"> <select id="getAllMeetingIds" resultType="com.cmeeting.vo.TencentMeetingVO$SimpleMeetingInfo">
select meeting_id,sub_meeting_id,record_file_id from cmt_meeting_info select meeting_id,meeting_record_id,sub_meeting_id,record_file_id from cmt_meeting_info order by sync_time limit 10000;
</select> </select>
<select id="statistics" resultType="java.util.LinkedHashMap"> <select id="statistics" resultType="java.util.LinkedHashMap">
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论