提交 fb47d3e3 作者: duanxincheng

企微配置抽离

父级 59ea2b51
...@@ -99,22 +99,6 @@ public class CmeetingJob { ...@@ -99,22 +99,6 @@ public class CmeetingJob {
@Scheduled(fixedRate = 20 * 60 * 1000,initialDelay = 2 * 60 * 1000) @Scheduled(fixedRate = 20 * 60 * 1000,initialDelay = 2 * 60 * 1000)
// @Scheduled(fixedRate = 20 * 60 * 1000) // @Scheduled(fixedRate = 20 * 60 * 1000)
public void execute() { public void execute() {
// 定义时间格式化器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 往之前推两天
LocalDateTime beforeDay = now.minusDays(2);
// 转换为 Unix 时间戳(秒)并转为字符串
Long nowTimestamp = now.atZone(ZoneId.systemDefault()).toEpochSecond();
Long beforeDayTimestamp = beforeDay.atZone(ZoneId.systemDefault()).toEpochSecond();
//日志记录
log.info("起始时间: " + beforeDay.format(formatter) + " | Unix 时间戳: " + beforeDayTimestamp);
log.info("结束时间: " + now.format(formatter) + " | Unix 时间戳: " + nowTimestamp);
log.info("----------------------------------");
//查出企微id和腾会id的关联关系 //查出企微id和腾会id的关联关系
List<UserId> userIdRelations = userIdMapper.selectList(null); List<UserId> userIdRelations = userIdMapper.selectList(null);
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));
......
...@@ -65,6 +65,8 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,T ...@@ -65,6 +65,8 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,T
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'};
@Value(value = "${tencent.search-scope}")
private Integer searchDays;
@Value(value = "${tencent.appId}") @Value(value = "${tencent.appId}")
private String tencentAppId; private String tencentAppId;
@Value(value = "${tencent.sdkId}") @Value(value = "${tencent.sdkId}")
...@@ -101,223 +103,6 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,T ...@@ -101,223 +103,6 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,T
} }
// @Override
// public List<TencentMeetingVO.RecordFile> getMeetingFiles(List<UserDTO> accessUserIds) {
// Client client = new Client.Builder()
// .withAppId(tencentAppId).withSdkId(tencentSdkId)
// .withSecret(tencentSecretId,tencentSecretKey)
// .build();
//
// List<TencentMeetingVO.RecordFile> recordFileUrlList = new ArrayList<>();
// List<MeetingInfo> meetingSaveList = new ArrayList<>();
// // 查询近两天的会议录制列表
// try {
// ZonedDateTime now = ZonedDateTime.now();
// String startTime = String.valueOf(now.minusDays(2).toEpochSecond());
// String endTime = String.valueOf(now.toEpochSecond());
// AtomicInteger currentPage = new AtomicInteger(1);
// Long totalPage = 1L;
//
// //目前已存储的会议id
// List<String> meetingIds = meetingInfoMapper.getAllMeetingIds();
// while (currentPage.intValue() <= totalPage.intValue()){
// RecordsApi.ApiV1RecordsGetRequest request =
// new RecordsApi.ApiV1RecordsGetRequest.Builder()
// .operatorId(tencentAdminUserId)
// .operatorIdType("1")
// .startTime(startTime)
// .endTime(endTime)
// .pageSize("20")
// .page(String.valueOf(currentPage.getAndIncrement()))
// .mediaSetType("0")
// .build();
// RecordsApi.ApiV1RecordsGetResponse response =
// client.records().v1RecordsGet(request, new JWTAuthenticator.Builder()
// .nonce(BigInteger.valueOf(Math.abs((new SecureRandom()).nextInt())))
// .timestamp(String.valueOf(System.currentTimeMillis() / 1000L)));
// V1RecordsGet200Response data = response.getData();
// //设置总页数
// totalPage = data.getTotalPage();
// if (data != null && data.getRecordMeetings() != null && !data.getRecordMeetings().isEmpty()) {
// List<V1RecordsGet200ResponseRecordMeetingsInner> meetings = data.getRecordMeetings();
//
// //录制状态:
// //1:录制中
// //2:转码中
// //3:转码完成
// if(meetings.stream().allMatch(item->item.getState() != 3)){
// return null;
// }
// for (V1RecordsGet200ResponseRecordMeetingsInner meeting : meetings) {
// //会议没结束,跳过
// if(meeting.getState() != 3){
// processLogService.log(meeting.getMeetingId(),null,"会议未结束,跳过生成");
// continue;
// }
//
//
// log.info("【会议检索】转录文件的meetingId->{},recordFileId->{}",meeting.getMeetingId(),meeting.getMeetingRecordId());
//
// //查询会议详情
// String meetingId = meeting.getMeetingId();
// String subMeetingId = null;
// MeetingsApi.ApiV1MeetingsMeetingIdGetRequest meetingRequest =
// new MeetingsApi.ApiV1MeetingsMeetingIdGetRequest.Builder(meetingId)
// .operatorId(tencentAdminUserId)
// .operatorIdType("1")
// .instanceid("0")
// .build();
// try {
// 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();
// //尝试获取会议详情
// if(meetingInfoList != null && meetingInfoList.size() > 0){
// V1MeetingsMeetingIdGet200ResponseMeetingInfoListInner meetingInfo = meetingInfoList.get(0);
// //会议类型
// //0:一次性会议
// //1:周期性会议
// Long meetingType = meetingInfo.getMeetingType();
// if(meetingType.intValue() == 1){
// //如果是周期会议,获取子会议的ID,用于查询参会人员
// List<V1MeetingsMeetingIdGet200ResponseMeetingInfoListInnerSubMeetingsInner> subMeetings = meetingInfo.getSubMeetings();
// //如果主持人突然取消了后续的所有周期会议,subMeetings列表会返回null
// if(!CollectionUtils.isEmpty(subMeetings)){
// LocalDate meetingStartDate = Instant.ofEpochMilli(meeting.getMediaStartTime()).atZone(ZoneId.systemDefault()).toLocalDate();
// 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");
// processLogService.log(meeting.getMeetingId(),subMeetingId,"周期会议"+meetingId+"未知子会议ID");
// continue;
// }
// subMeetingId = subMeeting.get().getSubMeetingId();
// }else{
// subMeetingId = meetingInfo.getCurrentSubMeetingId();
// log.info("周期会议"+meetingId+"的子会议列表为空,获取当前子会议号");
// processLogService.log(meeting.getMeetingId(),subMeetingId,"周期会议"+meetingId+"的子会议列表为空,获取当前子会议号");
// }
// }
// //如果数据库中已有相同会议id的记录,跳过同步
// if(!meetingIds.contains(meetingId)){
// log.info("【会议检索】新的会议meetingId->{},开始持久化",meeting.getMeetingId());
// List<V1RecordsGet200ResponseRecordMeetingsInnerRecordFilesInner> recordFiles = meeting.getRecordFiles();
// //按转录文件时间升序,便于后续的内容拼接
// List<String> recordFileIdList = recordFiles.stream().sorted(Comparator.comparingLong(V1RecordsGet200ResponseRecordMeetingsInnerRecordFilesInner::getRecordStartTime))
// .map(V1RecordsGet200ResponseRecordMeetingsInnerRecordFilesInner::getRecordFileId).collect(Collectors.toList());
// TencentMeetingVO.RecordFile recordFileItem = TencentMeetingVO.RecordFile.builder()
// .recordFileIdList(recordFileIdList).meetingId(meetingId).subMeetingId(subMeetingId).build();
//
// // 获取参会成员明细
// MeetingsApi.ApiV1MeetingsMeetingIdParticipantsGetRequest participantsRequest =
// new MeetingsApi.ApiV1MeetingsMeetingIdParticipantsGetRequest
// .Builder(meetingId).subMeetingId(subMeetingId).operatorId(tencentAdminUserId).operatorIdType("1").build();
// AuthenticatorBuilder<JWTAuthenticator> participantsAuthenticatorBuilder =
// new JWTAuthenticator.Builder()
// .nonce(BigInteger.valueOf(Math.abs((new SecureRandom()).nextInt())))
// .timestamp(String.valueOf(System.currentTimeMillis() / 1000L));
// //主持人角色,以下角色都可以表示主持人
// //用户角色:
// //0:普通成员角色
// //1:创建者角色
// //2:主持人
// //3:创建者+主持人
// //4:游客
// //5:游客+主持人
// //6:联席主持人
// //7:创建者+联席主持人
// List<Long> hostRoleList = Arrays.asList(2L,3L,5L,6L,7L);
// MeetingsApi.ApiV1MeetingsMeetingIdParticipantsGetResponse participantsResponse =
// client.meetings().v1MeetingsMeetingIdParticipantsGet(participantsRequest, participantsAuthenticatorBuilder);
// V1MeetingsMeetingIdParticipantsGet200Response participantsData = participantsResponse.getData();
// List<V1MeetingsMeetingIdParticipantsGet200ResponseParticipantsInner> participants = participantsData.getParticipants();
// Optional<V1MeetingsMeetingIdParticipantsGet200ResponseParticipantsInner> host = participants.stream().filter(item -> hostRoleList.contains(item.getUserRole())).findFirst();
// String email;
// String hostId;
// String hostName;
// //判断主持人是否存在,如果主持人未参会,是查不到主持人的
// //如果主持人未参会,使用会议详情中的创建人作为主持人
// if(host.isPresent()) {
// hostId = host.get().getUserid();
// hostName = new String(Base64.getDecoder().decode(host.get().getUserName()));
// }else{
// //未找到主持人,读取会议详情中的创建人作为主持人
// List<V1MeetingsGet200ResponseMeetingInfoListInnerCurrentCoHostsInner> currentHosts = meetingInfo.getCurrentHosts();
// if(CollectionUtils.isEmpty(currentHosts)){
// log.error("未找到主持人,默认没有生成纪要权限");
// processLogService.log(meeting.getMeetingId(),subMeetingId,"未找到主持人,默认没有生成纪要权限");
// continue;
// }
// hostId = currentHosts.get(0).getUserid();
// hostName = tecentMeetingMapper.getUsernameByUserId(hostId);
// log.info("主持人会中缺席,默认会议创建人为主持人");
// processLogService.log(meeting.getMeetingId(),subMeetingId,"未找到主持人,默认会议创建人为主持人");
// }
// //判断是否有权限生成纪要
// boolean generateAccess = accessUserIds.stream().anyMatch(item -> item.getTid().equals(hostId));
// if(!generateAccess){
// log.error("【权限校验】主持人{}没有生成纪要权限,跳过生成",hostId);
// processLogService.log(meeting.getMeetingId(),subMeetingId,"【权限校验】主持人"+hostId+"没有生成纪要权限,跳过生成");
// continue;
// }
// log.info("【权限校验】主持人{}允许生成纪要",hostId);
// processLogService.log(meeting.getMeetingId(),subMeetingId,"【权限校验】主持人"+hostId+"允许生成纪要");
// UserDTO userDTO = accessUserIds.stream().filter(item -> item.getTid().equals(hostId)).findFirst().get();
// email = userDTO.getEmail();
//
// //会议基本信息保存
// MeetingInfo meetingItem = MeetingInfo.builder().meetingId(meetingId).meetingCode(meetingInfo.getMeetingCode())
// .subject(meetingInfo.getSubject())
// .startTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(Long.valueOf(meetingInfo.getStartTime())), ZoneId.systemDefault()))
// .endTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(Long.valueOf(meetingInfo.getEndTime())), ZoneId.systemDefault()))
// .isGenerated(Boolean.FALSE).emailPushAccess(Boolean.TRUE).isPushed(Boolean.FALSE).syncTime(LocalDateTime.now())
// .subMeetingId(subMeetingId).generateRetry(Boolean.FALSE).pushRetry(Boolean.FALSE)
// .host(hostName)
// .hostUid(hostId)
// .participantUsers(participants.stream()
// .map(item->new String(Base64.getDecoder().decode(item.getUserName()))).distinct().collect(Collectors.joining("、")))
// .recordFileId(recordFileIdList.stream().collect(Collectors.joining(",")))
// .email(email)
// .build();
// recordFileUrlList.add(recordFileItem);
// meetingSaveList.add(meetingItem);
// }
// }
// } catch (ClientException e) {
// throw new RuntimeException(e);
// } catch (ServiceException e) {
// throw new RuntimeException(e);
// }
// }
// }
// }
// if(meetingSaveList.size() > 0){
// Map<String, List<MeetingInfo>> meetingSaveMap = meetingSaveList.stream().collect(Collectors.groupingBy(
// item -> item.getMeetingId() + "_" +
// (item.getSubMeetingId() != null ? item.getSubMeetingId() : "null")));
// List<MeetingInfo> finalSaveList = new ArrayList<>();
// for (Map.Entry<String, List<MeetingInfo>> entry : meetingSaveMap.entrySet()) {
// MeetingInfo meetingInfo = entry.getValue().get(0);
// meetingInfo.setRecordFileId(entry.getValue().stream().map(MeetingInfo::getRecordFileId).collect(Collectors.joining(",")));
// finalSaveList.add(meetingInfo);
// }
// meetingInfoMapper.batchInsert(finalSaveList);
// }
// } catch (Exception e) {
// log.error(e.getMessage());
// StringWriter sw = new StringWriter();
// PrintWriter pw = new PrintWriter(sw);
// e.printStackTrace(pw);
// processLogService.log(null,null,sw.toString());
// throw new RuntimeException(e.getMessage());
// }
// return recordFileUrlList;
// }
@Override @Override
public List<TencentMeetingVO.RecordFile> getMeetingFiles(List<UserDTO> accessUserIds) { public List<TencentMeetingVO.RecordFile> getMeetingFiles(List<UserDTO> accessUserIds) {
Client client = new Client.Builder() Client client = new Client.Builder()
...@@ -328,10 +113,10 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,T ...@@ -328,10 +113,10 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,T
List<TencentMeetingVO.RecordFile> meetingFiles = new ArrayList<>(); List<TencentMeetingVO.RecordFile> meetingFiles = new ArrayList<>();
List<TencentMeetingVO.RecordFile> recordFileUrlList = new ArrayList<>(); List<TencentMeetingVO.RecordFile> recordFileUrlList = new ArrayList<>();
List<MeetingInfo> meetingSaveList = new ArrayList<>(); List<MeetingInfo> meetingSaveList = new ArrayList<>();
// 查询近天的会议录制列表 // 查询近searchDays天的会议录制列表
try { try {
ZonedDateTime now = ZonedDateTime.now(); ZonedDateTime now = ZonedDateTime.now();
long startTime = now.minusDays(2).toEpochSecond(); long startTime = now.minusDays(searchDays).toEpochSecond();
long endTime = now.toEpochSecond(); long endTime = now.toEpochSecond();
AtomicInteger currentPage = new AtomicInteger(1); AtomicInteger currentPage = new AtomicInteger(1);
......
...@@ -39,8 +39,10 @@ import java.util.stream.Collectors; ...@@ -39,8 +39,10 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
public class WeComServiceImpl extends ServiceImpl<WeComUserMapper, WeComUser> implements WeComService { public class WeComServiceImpl extends ServiceImpl<WeComUserMapper, WeComUser> implements WeComService {
private static final String CORP_ID = "wx34544d057db97ffd"; @Value(value = "${wechat.corp_id}")
private static final String CORP_SECRET = "7YLePWG7rJqkQFnAB4FeylqAXpmu7q5qv_NOeSGNbm0"; private String CORP_ID;
@Value(value = "${wechat.corp_secret}")
private String CORP_SECRET;
private static final String TOKEN_KEY = "ZHONGJI_WECOM_KEY"; private static final String TOKEN_KEY = "ZHONGJI_WECOM_KEY";
@Resource @Resource
...@@ -67,8 +69,6 @@ public class WeComServiceImpl extends ServiceImpl<WeComUserMapper, WeComUser> i ...@@ -67,8 +69,6 @@ public class WeComServiceImpl extends ServiceImpl<WeComUserMapper, WeComUser> i
JSONArray departmentList = getDepartmentList(); JSONArray departmentList = getDepartmentList();
Iterator<Object> iterator = departmentList.iterator(); Iterator<Object> iterator = departmentList.iterator();
List<WeComUser> users = new ArrayList<>(); List<WeComUser> users = new ArrayList<>();
// List<UserDTO> userEmailList = sysUserSyncMapper.getUserEmail(permissionTenantId);
// CollectionUtils.isEmpty(userEmailList) ? new HashMap<>() : userEmailList.
while (iterator.hasNext()){ while (iterator.hasNext()){
JSONObject department = (JSONObject) iterator.next(); JSONObject department = (JSONObject) iterator.next();
String departmentId = String.valueOf(department.get("id")); String departmentId = String.valueOf(department.get("id"));
...@@ -98,7 +98,6 @@ public class WeComServiceImpl extends ServiceImpl<WeComUserMapper, WeComUser> i ...@@ -98,7 +98,6 @@ public class WeComServiceImpl extends ServiceImpl<WeComUserMapper, WeComUser> i
return String.valueOf(redisUtils.get(TOKEN_KEY)); return String.valueOf(redisUtils.get(TOKEN_KEY));
} }
//获取token //获取token
// String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ww1fd8778458e9f1e8&corpsecret=uFRq9Xi8-dVY90LydXYBhjc91JnnfkPUR6lHDdeJ_fo";
String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + CORP_ID + "&corpsecret=" + CORP_SECRET; String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + CORP_ID + "&corpsecret=" + CORP_SECRET;
String accessToken; String accessToken;
OkHttpClient client = new OkHttpClient(); OkHttpClient client = new OkHttpClient();
......
...@@ -32,6 +32,11 @@ TENCENT_SECRETID: 0ks7u8cgQ8DGVtlYZeRA9TxZCjvUT3oL ...@@ -32,6 +32,11 @@ TENCENT_SECRETID: 0ks7u8cgQ8DGVtlYZeRA9TxZCjvUT3oL
TENCENT_SECRETKEY: gQU09rkJjiQfiGcUYdhiKq5Ol6LebXg4w7F7Ol0rwvvdv3Xy TENCENT_SECRETKEY: gQU09rkJjiQfiGcUYdhiKq5Ol6LebXg4w7F7Ol0rwvvdv3Xy
TENCENT_ADMIN_USERID: woaJARCQAAftcvU6GGoOn66rdSZ4IrOA TENCENT_ADMIN_USERID: woaJARCQAAftcvU6GGoOn66rdSZ4IrOA
############################################################## wechat
# prod
CORP_ID: wx34544d057db97ffd
CORP_SECRET: 7YLePWG7rJqkQFnAB4FeylqAXpmu7q5qv_NOeSGNbm0
############################################################## email ############################################################## email
EMAIL_SENDER: cmeeting_assistant@cimc.com EMAIL_SENDER: cmeeting_assistant@cimc.com
EMAIL_SENDER_PWD: scyou@xih45g6@xih4 EMAIL_SENDER_PWD: scyou@xih45g6@xih4
...@@ -96,6 +101,10 @@ minio.accessKey: ${MINIO_USERNAME} ...@@ -96,6 +101,10 @@ minio.accessKey: ${MINIO_USERNAME}
#访问的秘钥 #访问的秘钥
minio.secretKey: ${MINIO_PASSWORD} minio.secretKey: ${MINIO_PASSWORD}
wechat:
corp_id: ${CORP_ID}
corp_secret: ${CORP_SECRET}
tencent: tencent:
appId: ${TENCENT_APPID} appId: ${TENCENT_APPID}
sdkId: ${TENCENT_SDKID} sdkId: ${TENCENT_SDKID}
...@@ -105,7 +114,8 @@ tencent: ...@@ -105,7 +114,8 @@ tencent:
meeting: meeting:
token: QQZNb7xWQB47MpZF4C2DFAkv8 token: QQZNb7xWQB47MpZF4C2DFAkv8
aesKey: agy6ALUePp34lljWz1uIQWa7yQq3dgxxQNmfaN9GROm aesKey: agy6ALUePp34lljWz1uIQWa7yQq3dgxxQNmfaN9GROm
base-save-path: E:/save/ base-save-path: E:/save/ #会议纪要临时文件存储路径
search-scope: 2 #腾会转录文件拉取时间范围,查询过去n天的记录
email: email:
sender: ${EMAIL_SENDER} sender: ${EMAIL_SENDER}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论