提交 57e13f4e 作者: zhaibin

双数据源设置

父级 cc9b6988
......@@ -247,6 +247,7 @@
<artifactId>jackson-module-parameter-names</artifactId>
<version>2.13.0</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -5,7 +5,6 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.cmeeting.mapper")
public class TencentMeetingCallbackApplication {
public static void main(String[] args) {
SpringApplication.run(TencentMeetingCallbackApplication.class, args);
......
package com.cmeeting;
import com.alibaba.fastjson2.JSON;
import com.cmeeting.mapper.primary.UserCompanyMapper;
import com.cmeeting.mapper.primary.UserIdMapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.tencentcloudapi.wemeet.Client;
......@@ -15,6 +18,7 @@ import com.tencentcloudapi.wemeet.service.meetings.api.MeetingsApi;
import com.util.meeting.MeetingMinutesGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
......@@ -45,6 +49,10 @@ public class TencentMeetingCallbackController {
.withAppId("211153201").withSdkId("28370276340")
.withSecret("BKOMDZVbvh0iT7k6UHsSizAWBCOVDtT6", "3Y1j0mzNp7KChKFJGyaEnZHLobFoAQ8eLwfaMx8nLbtXAerO")
.build();
@Autowired
private UserIdMapper userIdMapper;
@Autowired
private UserCompanyMapper userCompanyMapper;
/**
* 处理GET请求 - URL验证
......@@ -101,10 +109,33 @@ public class TencentMeetingCallbackController {
// 3. 解密data
String decryptedData = decryptData(encryptedData);
// System.out.println("Decrypted event data: " + decryptedData);
logger.info("Decrypted event data: {}", decryptedData);
// 4. 处理业务逻辑(可根据需要扩展)
//todo 调用AIGC接口 查询该用户是否有会议助手权限,如果有则执行,如果没有则直接返回
try {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(decryptedData);
JsonNode firstPayload = rootNode.path("payload").get(0);
String userId = firstPayload.path("operator").path("userid").asText();
} catch (Exception e) {
e.printStackTrace();
}
//todo 通过腾讯的userid查询到企业微信的userid
//todo 调用admin的find接口查询用户信息包括用户的部门id路径
//todo authList接口对应方法获取语音助手的权限的用户和部门列表
//todo 判断该用户是否在该列表中
processEvent(decryptedData);
......@@ -189,8 +220,6 @@ public class TencentMeetingCallbackController {
private void processEvent(String decryptedData) {
// 这里可以解析JSON并处理具体业务
// 示例: 打印事件数据
/* System.out.println("这是获取到的会议信息:");
System.out.println("Processing event: " + decryptedData);*/
logger.info("这是获取到的会议信息:");
logger.info("Processing event: {}", decryptedData);
String json = decryptedData;
......@@ -260,18 +289,13 @@ public class TencentMeetingCallbackController {
MeetingControlApi.ApiV1RealControlMeetingsMeetingIdAsrPutResponse response =
client.meeting_control().v1RealControlMeetingsMeetingIdAsrPut(request, authenticatorBuilder);
// response from `v1RealControlMeetingsMeetingIdAsrPut`: V1RealControlMeetingsMeetingIdAsrPut200Response
/* System.out.printf("Response from `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`: \nheader: %s\n%s\n",
response.getHeader(), response.getData());*/
logger.info("Response from `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`: \nheader: {}\n{}",
response.getHeader(), response.getData());
} catch (ClientException e) {
// System.out.printf("Error when calling `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`: %s\n", e);
logger.error("Error when calling `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`", e);
throw new RuntimeException(e);
} catch (ServiceException e) {
// System.out.printf("Error when calling `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`: %s\n", e);
logger.error("Error when calling `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`", e);
// System.out.printf("Full HTTP response: %s\n", new String(e.getApiResp().getRawBody()));
logger.error("Full HTTP response: {}", new String(e.getApiResp().getRawBody()));
throw new RuntimeException(e);
}
......@@ -282,7 +306,6 @@ public class TencentMeetingCallbackController {
String eventId = meetingId;
// 检查是否已处理
if (sendProcessedEvents.contains(eventId)) {
// System.out.println("忽略已处理事件: " + eventId);
logger.info("忽略已处理事件: {}", eventId);
return;
}
......@@ -293,8 +316,6 @@ public class TencentMeetingCallbackController {
} catch (Exception e) {
e.printStackTrace();
}
/*System.out.println("operatorId: " + operatorUserId);
System.out.println("meetingId: " + meetingId);*/
logger.info("operatorId: {}", operatorUserId);
logger.info("meetingId: {}", meetingId);
// 2.构造请求参数
......@@ -316,12 +337,9 @@ public class TencentMeetingCallbackController {
try {
ApiResponse response =
client.meetings().v1AsrDetailsGet(request, authenticatorBuilder);
/*System.out.printf("Response from `MeetingsApi.v1AsrDetailsGet`: \nheader: %s\n%s\n",
response.getHeader(), response.getRawBody());*/
logger.info("Response from `MeetingsApi.v1AsrDetailsGet`: \nheader: {}\n{}",
response.getHeader(), response.getRawBody());
String rawBodyString = new String(response.getRawBody(), StandardCharsets.UTF_8);
// System.out.println("Raw Body (string): " + rawBodyString);
logger.info("Raw Body (string): {}", rawBodyString);
try {
// 解析JSON获取下载URL
......@@ -332,7 +350,7 @@ public class TencentMeetingCallbackController {
String savePath = "D:/" + meetingId + ".docx"; // 或者 "D:\\downloaded_file.docx"
String targetPath = "D:/" + meetingId + "纪要" + ".docx";
// 下载文件
// System.out.println("开始下载文件到: " + savePath);
// System.out.println("开始下载文件到: " + savePath);
logger.info("开始下载文件到: {}", savePath);
try (java.io.BufferedInputStream in = new java.io.BufferedInputStream(new java.net.URL(downloadUrl).openStream());
java.io.FileOutputStream fileOutputStream = new java.io.FileOutputStream(savePath)) {
......@@ -341,7 +359,6 @@ public class TencentMeetingCallbackController {
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
fileOutputStream.write(dataBuffer, 0, bytesRead);
}
//System.out.println("文件下载完成,已保存到 " + savePath);
logger.info("文件下载完成,已保存到 {}", savePath);
/**
* 将文件传送给大模型处理
......@@ -366,40 +383,36 @@ public class TencentMeetingCallbackController {
/**
* 使用邮箱发送邮件
*/
//todo 调用腾讯会议API获得主持人的邮箱地址
// 1.获得主持人的腾讯会议userid
// 2.根据获得的腾讯会议userid获得员工的企业微信userid
// 3.根据企业微信userid查询员工表获得员工邮箱
String tid = operatorUserId;
String wid = userIdMapper.getWidByTid(tid);
String emailAddress = userCompanyMapper.selectEmailByUserId(wid);
Thread.sleep(10000);
EmailSender emailSender = new EmailSender();
//通过查询企业微信表获取到用户的企业微信userid
//在人事表中查询该用户对应的邮箱
String emailAddress = "";
//response.getRawBody()
boolean mailFlag = emailSender.sendEmailWithAttachment("1960771676@qq.com",
boolean mailFlag = emailSender.sendEmailWithAttachment(emailAddress,
targetPath,
"重要文件",
"您好:\n" +
"\n" +
" 附件为您本次会议的会议纪要,烦请下载查看,如需对会议纪要结果进行修改或查看历史会议,可点击下方链接。");
if (mailFlag) {
//System.out.println("邮件发送成功");
logger.info("邮件发送成功");
} else {
//System.out.println("邮件发送失败");
logger.error("邮件发送失败");
}
}
} catch (Exception e) {
//System.out.println("下载文件时出错: " + e.getMessage());
logger.error("下载文件时出错: {}",e.getMessage());
logger.error("下载文件时出错: {}", e.getMessage());
e.printStackTrace();
}
} catch (ClientException e) {
// System.out.printf("Error when calling `MeetingsApi.v1AsrDetailsGet`: %s\n", e);
logger.error("Error when calling `MeetingsApi.v1AsrDetailsGet`", e);
throw new RuntimeException(e);
} catch (ServiceException e) {
//System.out.printf("Error when calling `MeetingsApi.v1AsrDetailsGet`: %s\n", e);
logger.error("Error when calling `MeetingsApi.v1AsrDetailsGet`", e);
// System.out.printf("Full HTTP response: %s\n", new String(e.getApiResp().getRawBody()));
logger.error("Full HTTP response: {}", new String(e.getApiResp().getRawBody()));
throw new RuntimeException(e);
}
......
package com.cmeeting.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(
basePackages = "com.cmeeting.mapper.primary", // 主数据源的 Mapper 包路径
sqlSessionFactoryRef = "primarySqlSessionFactory"
)
public class PrimaryDataSourceConfig {
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary") // 绑定主数据源配置
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// 可额外配置 MyBatis 的 mapperLocations、typeAliases 等
factoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/primary/*.xml"));
return factoryBean.getObject();
}
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
\ No newline at end of file
package com.cmeeting.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(
basePackages = "com.cmeeting.mapper.secondary", // 次数据源的 Mapper 包路径
sqlSessionFactoryRef = "secondarySqlSessionFactory"
)
public class SecondaryDataSourceConfig {
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary") // 绑定次数据源配置
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// 可额外配置 MyBatis 的 mapperLocations、typeAliases 等
// 指定次数据源的 XML 映射文件路径
factoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/secondary/*.xml"));
return factoryBean.getObject();
}
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
\ No newline at end of file
package com.cmeeting.controller;
import com.azure.core.annotation.Get;
import com.cmeeting.mapper.TecentMeetingMapper;
import com.cmeeting.mapper.UserIdMapper;
import com.cmeeting.mapper.WeComUserMapper;
import com.cmeeting.mapper.primary.TecentMeetingMapper;
import com.cmeeting.mapper.primary.UserIdMapper;
import com.cmeeting.mapper.primary.WeComUserMapper;
import com.cmeeting.pojo.TencentMeetingUser;
import com.cmeeting.pojo.UserId;
import com.cmeeting.pojo.WeComUser;
......@@ -126,6 +125,7 @@ public class UnifiedController {
//将获取到的腾讯会议userid插入到该用户的Tid字段
//取消预约会议
}
//todo 待测试
@GetMapping("/sameNameInsertTid")
public void sameNameInsertTid() throws IOException {
......@@ -152,6 +152,7 @@ public class UnifiedController {
}
userIdMapper.insertUsers(userIds);
}
/**
* 通过企业微信接口取消预约会议
*
......@@ -258,7 +259,6 @@ public class UnifiedController {
System.out.printf("Full HTTP response: %s\n", new String(e.getApiResp().getRawBody()));
throw new RuntimeException(e);
}
}
/**
......
package com.cmeeting.mapper;
package com.cmeeting.mapper.primary;
import com.cmeeting.pojo.TencentMeetingUser;
import com.cmeeting.pojo.WeComUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......
package com.cmeeting.mapper;
package com.cmeeting.mapper.primary;
import org.apache.ibatis.annotations.Mapper;
......
package com.cmeeting.mapper.primary;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface UserCompanyMapper {
/**
* 根据 userId 查询 email
*
* @param userId 用户 ID
* @return 对应的 email(如果存在),否则返回 null
*/
String selectEmailByUserId(@Param("userId") String userId);
}
package com.cmeeting.mapper;
package com.cmeeting.mapper.primary;
import com.cmeeting.pojo.UserId;
import org.apache.ibatis.annotations.Mapper;
......@@ -12,4 +12,5 @@ public interface UserIdMapper {
void updateUser(UserId user);
String getWidByTid(String operatorUserId);
}
// mapper/UserMapper.java
package com.cmeeting.mapper;
package com.cmeeting.mapper.primary;
import com.cmeeting.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.context.annotation.Bean;
@Mapper
public interface UserMapper {
......
package com.cmeeting.mapper;
package com.cmeeting.mapper.primary;
import com.cmeeting.pojo.WeComUser;
import org.apache.ibatis.annotations.Mapper;
......
package com.cmeeting.pojo;
import lombok.Data;
@Data
public class UserCompany {
private Integer id; // 对应表中的 `id`
private String userName; // 对应表中的 `user_name`
private String phone; // 对应表中的 `phone`
private String email; // 对应表中的 `emaill`(注意拼写修正为 email)
private String address; // 对应表中的 `address`
private String userId; // 对应表中的 `user_id`
// 无参构造方法
public UserCompany() {
}
// 全参构造方法
public UserCompany(Integer id, String userName, String phone, String email, String address, String userId) {
this.id = id;
this.userName = userName;
this.phone = phone;
this.email = email;
this.address = address;
this.userId = userId;
}
@Override
public String toString() {
return "UserCompany{" +
"id=" + id +
", userName='" + userName + '\'' +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
", address='" + address + '\'' +
", userId='" + userId + '\'' +
'}';
}
}
\ No newline at end of file
package com.cmeeting.service.impl;
import com.cmeeting.mapper.TecentMeetingMapper;
import com.cmeeting.mapper.primary.TecentMeetingMapper;
import com.cmeeting.pojo.TencentMeetingUser;
import com.cmeeting.service.TecentMeetingService;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -2,11 +2,12 @@
package com.cmeeting.service.impl;
import com.cmeeting.dto.LoginDTO;
import com.cmeeting.mapper.UserMapper;
import com.cmeeting.mapper.primary.UserMapper;
import com.cmeeting.pojo.User;
import com.cmeeting.service.UserService;
import com.cmeeting.vo.LoginVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
......
package com.cmeeting.service.impl;
import com.cmeeting.mapper.WeComUserMapper;
import com.cmeeting.mapper.primary.WeComUserMapper;
import com.cmeeting.pojo.WeComUser;
import com.cmeeting.service.WeComService;
import org.springframework.beans.factory.annotation.Autowired;
......
package com.cmeeting.util;
import com.cmeeting.mapper.WeComUserMapper;
import com.cmeeting.mapper.primary.WeComUserMapper;
import com.cmeeting.pojo.WeComUser;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
......
......@@ -4,15 +4,28 @@ server.port=8080
tencent.meeting.token=QQZNb7xWQB47MpZF4C2DFAkv8
tencent.meeting.aesKey=agy6ALUePp34lljWz1uIQWa7yQq3dgxxQNmfaN9GROm
# application.yml
spring.datasource.url=jdbc:mysql://192.168.10.155:3306/cmeeting?useSSL=false&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=qizhi123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# spring.datasource.url=jdbc:mysql://192.168.10.155:3306/cmeeting?useSSL=false&characterEncoding=utf8
# spring.datasource.username=root
# spring.datasource.password=qizhi123
# spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# ?????primary?
spring.datasource.primary.jdbc-url=jdbc:mysql://192.168.10.155:3306/cmeeting?useSSL=false&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.primary.username=root
spring.datasource.primary.password=qizhi123
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
# ?????secondary?
spring.datasource.secondary.jdbc-url=jdbc:mysql://192.168.10.155:3306/user_admin?useSSL=false&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.secondary.username=root
spring.datasource.secondary.password=qizhi123
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
# MyBatis ??
mybatis.mapper-locations=classpath:mapper/*.xml
# mybatis.mapper-locations=classpath:mapper/primary/*.xml
mybatis.type-aliases-package=com.cmeeting.pojo\
#??????
# ??????
mybatis.configuration.map-underscore-to-camel-case: true
logging.level.com.zaxxer.hikari=INFO
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cmeeting.mapper.TecentMeetingMapper">
<mapper namespace="com.cmeeting.mapper.primary.TecentMeetingMapper">
<insert id="batchInsertUsers" parameterType="list">
INSERT INTO user_tencentmeeting (
user_name,
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cmeeting.mapper.primary.UserCompanyMapper">
<!-- 根据 userId 查询 email -->
<select id="selectEmailByUserId" parameterType="string" resultType="string">
SELECT email
FROM user_company
WHERE user_id = #{userId}
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cmeeting.mapper.UserIdMapper">
<mapper namespace="com.cmeeting.mapper.primary.UserIdMapper">
<!-- 批量插入用户ID信息 -->
<insert id="insertUsers" parameterType="List">
INSERT INTO userid (
......@@ -25,5 +25,8 @@
<select id="getUsers" resultType="com.cmeeting.pojo.UserId">
select * from userid
</select>
<select id="getWidByTid" resultType="java.lang.String">
select Wid from userid WHERE Tid = #{operatorUserId}
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cmeeting.mapper.UserMapper">
<mapper namespace="com.cmeeting.mapper.primary.UserMapper">
<select id="findByUsername" resultType="com.cmeeting.pojo.User">
SELECT * FROM user WHERE username = #{username}
</select>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cmeeting.mapper.WeComUserMapper">
<mapper namespace="com.cmeeting.mapper.primary.WeComUserMapper">
<select id="selectById" resultType="com.cmeeting.pojo.WeComUser">
SELECT id, user_name as userName, user_id as userId, isepeat_name as isRepeatName
FROM user_wecom
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cmeeting.mapper.primary.UserCompanyMapper">
<!-- 根据 userId 查询 email -->
<select id="selectEmailByUserId" parameterType="string" resultType="string">
SELECT email
FROM user_company
WHERE user_id = #{userId}
</select>
</mapper>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论