提交 9c63e432 作者: 洪东保

cmeeting独立部署:

 1. 删除与其他服务相关无用代码
 2. 新增cimc服务配置
父级 c38ab7e6
package com.cmeeting;
import com.azure.core.credential.TokenRequestContext;
import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import okhttp3.*;
import java.io.IOException;
public class GraphApiWithOkHttp {
static String CLIENT_ID = "d65aa91b-05f4-42b2-902f-4d82ea5a2b93";
static String TENANT_ID = "74cc8acf-aacc-4514-9bbb-dc27ce3096bb"; // or "common" for multi-tenant apps
static String CLIENT_SECRET = "~N98Q~83v6dViQFIofwr0fRn4J5VEZ2tvwOz.bPX";
private static final String USER_EMAIL = "biinizhai321@outlook.com"; // 发送邮件的用户
public static void main(String[] args) throws IOException {
/**中集:
* c06fe7cf-2a89-4099-9805-ce03031938f8
* wsu8Q~GxYxPLf2akioQZDRG8NR1EzCAHIAQRVc6u
* 18653b3e-03c7-499e-8baf-42ef06a814ef
*/
ClientSecretCredential credential = new ClientSecretCredentialBuilder()
.clientId(CLIENT_ID)
.clientSecret(CLIENT_SECRET)
.tenantId(TENANT_ID)
.build();
// 1. 获取 Access Token
String token = credential.getToken(
new TokenRequestContext()
.addScopes("https://graph.microsoft.com/.default"))
.block().getToken();
System.out.println("获取到的令牌: " + token);
String token1 ="EwBYBMl6BAAUBKgm8k1UswUNwklmy2v7U/S+1fEAAUa0jd3QNQBdqTy9ZwEaLPqqapU5zHFRz4XvGqbI7jN7x01mEvBtCSFgYtNiSOEb5s1UwLxl6HwlHFqfJsqDsoCicvnlqCWjsaR/4wPZgXxd+pBhHRSPl+tJcSzz2NJB+dy81wHcSaU4bRxCIgoU7MtrW2ak9DhGisnK4/vxHkzxuIjHe9IDOZBzwzAtTZhycWRoAtuQrC1iu/kuKGJaU9noNjsOwfHUaXRz68g6niSdPT8P6zOa2vlOHjhXh478ms1PhqKeTkS+nkTurT2Gc5qRJviICiiAlK4BlxV70tOA6xEtl2ApXOrfFr+rlv4pASmPewtbdkTHnpP3H0R9L0kQZgAAEF4HO14XaFxPCdIqniVBvSkgA75wLsTuUZragTXGu71SV7ccLi26nZ+9KZlulf8dAlj/NEdheqtdEHb+BOLknQoXFEJ0UNj6PLkczzHfV3Yr5zlXJICwb3yI9vrFTUCb555ux/P904vXCY900UNgX81gBIYJQIJtOCURDAcHWtxyWvfNlkr17fKgnX5KdDyec6JK9tgzPi62LlqhDcoR/W/4MTCZhfJRlZgdYkI52pQSbDJItR6W7xfZguXPgKRHVcZJTzlybtOW0kbrfv96CKrryKzGeRjZyEcov1U3VjAoBUllgi3+LdIFK86aojMuBP+v5PvRq81qZS2q5roIRJD5zydu1selrpwhrZjm2nupDxHGjvfj2TVZJlz1zGYsVYrSRz2+st+2UbZagR1fbPRX2GilTfDyN05HV//LrfdrddbffMImxY2M8D9iQZFSjBYSFa20S9Vs9/yj08M9ljwiJifHGjX2o/arR63SWe3pbga26EC+j8JaBemhAhPsu91xW4o7+j/xEUadXR2NDbuogMq+MeINKe3PqAAFeTva1ZWZF5p3oGVIQKL4pcQFA9xEwopoN+vSeHDuAOvTFQ/4PukxicJdFTiaZquGeQMF0sLFvLdddpvS3Xaf17fPxjMUlMGcjYQ8gK5XG5wzjR8Up4MZZyX3xiK/hccGOp5pwi8WAN5cVmTKZOSXTkHUGEQT4rcGUYTPduHYMjjrVpzffpnmqfO92VA7a7fuYqXKp3NPikv17s6PTVr6b4+24AP8u3MEhDHU2YjaMuFR3jBUYLxtm443Gn58MC7oYrmQIVN2VYJrxADgStqpE+3nUCyKajmF0q5U+LUI1cCYnOKgmAkrpN71qlB9GeQLLQDJytG2sg64NG/h3CN1SseudSYtmqM3XUURSsztB9dNL7xmHQAcEBYMVjec5N5jHLhIs48rxAqI/WAJ/2RFKWgJIeCUJ8v4oQYEI9lAlWgReVhrjcNxRsbuVDFFwU7cTSeY9bJzxSX5kWJ8TXr/Q/SELEViUVCz10Cw/sOtm4urke538R4yXlR1wfMk3S86xlOfc3HJ6Iz7hi1h2fovWA9T1ceFWQM=";
// 2. 使用 OkHttp 发送邮件
sendEmail(token);
}
// 使用 Graph API 发送邮件
private static void sendEmail(String accessToken) throws IOException {
OkHttpClient client = new OkHttpClient();
// 构建邮件内容 (JSON 格式)
String emailJson = "{\n" +
" \"message\": {\n" +
" \"subject\": \"Test Email\",\n" +
" \"body\": {\n" +
" \"contentType\": \"Text\",\n" +
" \"content\": \"This is a test email.\"\n" +
" },\n" +
" \"toRecipients\": [\n" +
" {\n" +
" \"emailAddress\": {\n" +
" \"address\": \"binzhai321@outlook.com\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
// 构建请求
Request request = new Request.Builder()
.url("https://graph.microsoft.com/v1.0/users/" + USER_EMAIL + "/sendMail")
.post(RequestBody.create(MediaType.parse("application/json"), emailJson))
.addHeader("authorization", "Bearer " + accessToken)
.addHeader("Content-Type", "application/json")
.build();
// 发送请求
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println("Email sent successfully!");
} else {
System.err.println("Failed to send email: " + response.code() + " - " + response.message());
System.err.println(response.body().string()); // 打印错误详情
}
}
}
}
......@@ -72,15 +72,6 @@ public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticat
"AbstractUserDetailsAuthenticationProvider.badCredentials",
"Bad credentials"));
}
String presentedPassword = authentication.getCredentials().toString();
// 密码验证在login接口做过了
// if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) {
// logger.debug("Authentication failed: password does not match stored value");
// throw new BadCredentialsException(messages.getMessage(
// "AbstractUserDetailsAuthenticationProvider.badCredentials",
// "Bad credentials"));
// }
}
protected void doAfterPropertiesSet() {
......
package com.cmeeting.ad.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @author liuzhenmeng
* @date 2024/2/4 17:05
*/
@Data
@Component
@ConfigurationProperties(prefix = "robot.custom")
public class CustomWhiteConfigProperties {
/**
* 接口白名单
*/
private List<String> whiteTables = new ArrayList<>();
}
......@@ -41,16 +41,8 @@ public class RobotWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private RobotJwtAuthenticationTokenFilter robotJwtAuthenticationTokenFilter;
@Autowired
private CustomWhiteConfigProperties customWhiteConfigProperties;
@Autowired
private CustomUserDetailsService customUserDetailsService;
@Autowired
private RobotWhiteConfigProperties configProperties;
/**
* 解决 无法直接注入 AuthenticationManager
*
......@@ -87,11 +79,6 @@ public class RobotWebSecurityConfig extends WebSecurityConfigurerAdapter {
*/
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
List<String> whiteTables = configProperties.getWhiteTables();
String[] api = ArrayUtil.toArray(whiteTables, String.class);
List<String> customWhiteTables = customWhiteConfigProperties.getWhiteTables();
String[] customApi = ArrayUtil.toArray(customWhiteTables, String.class);
httpSecurity
// 由于使用的是JWT,我们这里不需要csrf
.csrf().disable()
......@@ -100,8 +87,8 @@ public class RobotWebSecurityConfig extends WebSecurityConfigurerAdapter {
// 过滤请求
.authorizeRequests()
// 对于登录login 图标 要允许匿名访问
.antMatchers(customApi).access("@robotJwtCustomTokenFilter.checkToken(request)")
.antMatchers(api).anonymous()
// .antMatchers(customApi).access("@robotJwtCustomTokenFilter.checkToken(request)")
// .antMatchers(api).anonymous()
.antMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css",
"/**/*.js", "/**/*.map")
.permitAll()
......
package com.cmeeting.ad.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @author 张伟
* @date 2021/2/2 17:47
*/
@Data
@Component
@ConfigurationProperties(prefix = "robot.white")
public class RobotWhiteConfigProperties {
/**
* 接口白名单
*/
private List<String> whiteTables = new ArrayList<>();
private List<String> whiteSignUrls = new ArrayList<>();
}
package com.cmeeting.ad.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 租户平台设置关联表(RelPlatformSettingTenant)实体类
*
* @author makejava
* @since 2023-06-12 10:03:26
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("rel_platform_setting_tenant")
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RelPlatformSettingTenant implements Serializable {
private static final long serialVersionUID = -89908876679147553L;
private String id;
private String tenantId;
/**
* 菜单id
*/
private String platformSettingId;
private Integer isDel;
private Date createTime;
private String createUser;
private Date updateTime;
private String updateUser;
}
......@@ -48,7 +48,6 @@ public class RobotSecurityUser implements UserDetails {
@JsonIgnore
private Collection<? extends GrantedAuthority> authorities;
private SysPlatformSetting sysPlatformSetting;
private String nick;
private String picture;
......
package com.cmeeting.ad.entity;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* @author: 王长伟
*/
@Getter
@Setter
public class RoleTree implements Serializable {
private static final long serialVersionUID = 1L;
private List<String> tenantCenter = new ArrayList<>();
private List<String> interactCenter = new ArrayList<>();
private List<String> knowledgeCenter = new ArrayList<>();
private List<String> llmCenter = new ArrayList<>();
private List<String> statisticsCenter = new ArrayList<>();
private List<String> securityCenter = new ArrayList<>();
private List<String> robotCenter = new ArrayList<>();
private List<String> staffCenter = new ArrayList<>();
private List<String> processCenter = new ArrayList<>();
}
package com.cmeeting.ad.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* <p>
* 菜单权限表
* </p>
*
* @author robot
* @since 2019-04-21
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_menu")
public class SysMenu extends Model<SysMenu> {
private static final long serialVersionUID = 1L;
/**
* 菜单ID
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Integer id;
/**
* 菜单名称
*/
private String name;
/**
* 菜单权限标识
*/
private String perms;
/**
* 前端path / 即跳转路由
*/
private String path;
/**
* 菜单组件
*/
private String component;
/**
* 父菜单ID
*/
private Integer parentId;
/**
* 图标
*/
private String icon;
/**
* 是否为外链
*/
private Boolean isAdmin;
/**
* 排序
*/
private Integer sort;
/**
* 菜单类型 (类型 1:目录 2:菜单 3:按钮)
*/
private Integer type;
/**
* 所属大功能模块
*/
private String parentSystem;
/**
* 在租户菜单是否展示 新增
*/
private Integer isShow;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(fill = FieldFill.INSERT)
@TableLogic
private Integer isDel;
/**
* 非数据库字段
* 父菜单名称
*/
@TableField(exist = false)
private String parentName;
/**
* 非数据库字段
* 菜单等级
*/
@TableField(exist = false)
private Integer level;
/**
* 非数据库字段
* 子菜单
*/
@TableField(exist = false)
private List<SysMenu> children;
@TableField(exist = false)
private String parentPath;
@TableField(exist = false)
private String key;
@TableField(exist = false)
private String title;
public String getTitle() {
return name;
}
@Override
public boolean equals(Object o) {
return Objects.hash(id) == o.hashCode();
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
package com.cmeeting.ad.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 平台设置表(SysPlatformSetting)实体类
*
* @author makejava
* @since 2023-06-12 11:43:45
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_platform_setting")
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SysPlatformSetting implements Serializable {
private static final long serialVersionUID = -86441288874834748L;
/**
* 主键id
*/
private String id;
/**
* 是否使用机器人 0:false 1:true, 默认为1
*/
private Integer robot;
/**
* 是否使用数字人 0:false 1:true, 默认为1
*/
private Integer digitalPerson;
/**
* 是否使用客服系统 0:false 1:true ,默认为1
*/
private Integer moduleKefu;
/**
* 是否使用大语言模型 0:false 1:true ,默认为1
*/
private Integer largeLanguage;
/**
* 是否使用工单系统 0:false 1:true , 默认为1
*/
private Integer moduleTicket;
/**
* 是否使用问答知识点 0:false 1:true, 默认为1
*/
private Integer qaKnowledge;
/**
* 是否使用知识导图 0:false 1:true, 默认为1
*/
private Integer atlasKnowledge;
/**
* 是否使用多轮对话 0:false 1:true ,默认为1
*/
private Integer dialogKnowledge;
/**
* 是否使用文档知识点 0:false 1:true , 默认为1
*/
private Integer docKnowledge;
/**
* logo登录标签地址
*/
private String loginLogoUrl;
/**
* logo首页标签地址
*/
private String indexLogoUrl;
/**
* 背景图片地址
*/
private String backgroundUrl;
/**
* 推广图片地址
*/
private String advertiseUrl;
/**
* 底部信息
*/
private String bottomInfo;
/**
* 创建时间;创建时间
*/
private Date createTime;
/**
* 更新时间;更新时间
*/
private Date updateTime;
/**
* 创建人;创建人id
*/
private String createUser;
/**
* 更新人;更新人id
*/
private String updateUser;
/**
* 删除标识;0正常,1删除,默认为0
*/
private Integer isDel;
private Integer isAdmin;
private String agreement;
}
package com.cmeeting.ad.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 租户表
* </p>
*
* @author robot
* @since 2019-08-10
*/
@Getter
@Setter
public class SysTenant implements Serializable {
/**
* 租户id
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
private String kefuId;
/**
* 租户名称
*/
private String name;
/**
* 删除标记
*/
@TableField(fill = FieldFill.INSERT)
@TableLogic
private Boolean isDel;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private String createUser;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateUser;
/**
* 有效期
*/
private String validity;
/**
* 0纯网页 11企业微信第三方应用 12企业微信自建 21钉钉第三方应用 22钉钉自建 3 teams
*/
// private Integer tenantType;
/**
* 启用状态(0: 启用, 1: 禁用)
*/
private String status;
/**
* 备注
*/
private String remarks;
/**
* 机器人数量
*/
private Integer robotNums;
/**
* 知识点数量上限
*/
private Integer qaNums;
private Integer atlasNums;
private Integer dialogNums;
private Integer docNums;
private Integer formNums;
private Integer userNums;
private Integer regulatorsNums;
/**
* 知创建租户的系统用户名称
*/
private String userName;
/**
* 语言
*/
private String language;
@TableField(exist = false)
private Boolean expired;
}
package com.cmeeting.ad.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.cmeeting.ad.entity.RobotSecurityUser;
import com.cmeeting.ad.entity.SysUserSync;
import com.cmeeting.ad.service.CustomUserDetailsService;
import com.cmeeting.constant.UserAdminRouteConstant;
import com.cmeeting.constant.UserTypeConstant;
import com.cmeeting.util.HttpClientUtils;
import com.cmeeting.util.UserAdminConfig;
import com.cmeeting.util.UserAdminTokenUtil;
import com.cmeeting.service.SysUserSyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
......@@ -24,7 +21,7 @@ import javax.annotation.Resource;
@Service
public class DetailsServiceImpl implements CustomUserDetailsService {
@Resource
private UserAdminConfig userAdminConfig;
private SysUserSyncService sysUserSyncService;
/**
* @return 用户基本信息
......@@ -34,14 +31,11 @@ public class DetailsServiceImpl implements CustomUserDetailsService {
public UserDetails loadUser(String uid, String tenantId, String role) {
RobotSecurityUser user = new RobotSecurityUser();
user.setUserType(UserTypeConstant.SYNC);
String url = userAdminConfig.getUserAdminDomain() + UserAdminRouteConstant.SyncUser.INFO + "?id=" + uid + "&tenantId=" + tenantId;
JSONObject jsonObject = HttpClientUtils.httpGet(url, UserAdminTokenUtil.getUserAdminToken());
JSONObject data = jsonObject.getJSONObject("data");
user.setId(data.getString("userId"));
user.setUserId(Long.valueOf(data.getString("userId")));
user.setUsername(data.getString("name"));
user.setNick(data.getString("nickName"));
user.setTenantId(data.getString("tenantId"));
SysUserSync one = sysUserSyncService.getById(uid);
user.setId(one.getUserId());
user.setUserId(Long.valueOf(one.getUserId()));
user.setUsername(one.getName());
user.setNick(one.getName());
user.setRole(role);
return user;
}
......
......@@ -3,20 +3,19 @@ package com.cmeeting.ad.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cmeeting.ad.entity.*;
import com.cmeeting.ad.util.SecurityUtil;
import com.cmeeting.ad.entity.RobotSecurityUser;
import com.cmeeting.ad.entity.SysUserSync;
import com.cmeeting.ad.service.ILdapService;
import com.cmeeting.ad.service.UserService;
import com.cmeeting.ad.util.JwtUtil;
import com.cmeeting.ad.vo.ApplicationUserVO;
import com.cmeeting.ad.vo.UserVo;
import com.cmeeting.constant.RecordTemplateConstant;
import com.cmeeting.exception.RobotBaseException;
import com.cmeeting.mapper.primary.AuthMapper;
import com.cmeeting.ad.service.ILdapService;
import com.cmeeting.ad.service.UserService;
import com.cmeeting.ad.util.JwtUtil;
import com.cmeeting.constant.UserAdminRouteConstant;
import com.cmeeting.mapper.primary.SysUserSyncMapper;
import com.cmeeting.pojo.CoreModulePermissions;
import com.cmeeting.util.*;
import com.cmeeting.ad.vo.ApplicationUserVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
......@@ -28,8 +27,14 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.time.*;
import java.util.*;
import java.time.Duration;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@Service
......
......@@ -10,7 +10,6 @@ import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......
......@@ -11,40 +11,15 @@ public interface CimcConstants {
String GET_TEST_POSITION = "https://apipoc1.cimc.com/env-101/por-101/hrapi/hrms/cimc_org_position_wbs_standard.service?p_user=USER&p_password=PASSWORD&apikey=API_KEY&p_page_num=PAGE_NUM";
//获取员工标准信息
String GET_TEST_EMPLOYEE = "https://apipoc1.cimc.com/env-101/por-101/hrapi/hrms/cimc_lbr_employee_wbs_standard.service?p_user=USER&p_password=PASSWORD&apikey=API_KEY&p_include_dismission=1&p_page_num=PAGE_NUM";
//获取IWORK获取访问token
String GET_TEST_TOKEN = "https://apipoc1.cimc.com/env-101/por-101/hrapi/iWorkapi/v1/token?apikey=API_KEY";
String TEST_IWORK_LOGIN = "https://apipoc1.cimc.com/env-101/por-101/hrapi/iWorkapi/ticket/TICKET?access_token=TOKEN&apikey=API_KEY";
//2. API地址(集团本地节点-生产)
String GET_ORGANIZATION = "https://cchqapi.cimc.com/por-11/hrapi/hrms/cimc_org_unit_wbs_standard.service?p_user=USER&p_password=PASSWORD&apikey=API_KEY&p_page_num=PAGE_NUM";
String GET_POSITION = "https://cchqapi.cimc.com/por-11/hrapi/hrms/cimc_org_position_wbs_standard.service?p_user=USER&p_password=PASSWORD&apikey=API_KEY&p_page_num=PAGE_NUM";
String GET_EMPLOYEE = "https://cchqapi.cimc.com/por-11/hrapi/hrms/cimc_lbr_employee_wbs_standard.service?p_user=USER&p_password=PASSWORD&apikey=API_KEY&p_page_num=PAGE_NUM";
String GET_TOKEN = "https://cchqapi.cimc.com/por-11/hrapi/iWorkapi/v1/token?apikey=API_KEY";
String IWORK_LOGIN = "https://cchqapi.cimc.com/por-11/hrapi/iWorkapi/ticket/TICKET?access_token=TOKEN&apikey=API_KEY";
//3. API地址(AWS节点-生产)
String GET_AWS_ORGANIZATION = "https://awsapi.cimc.cn/env-101/por-10/hrapi/hrms/cimc_org_unit_wbs_standard.service?p_user=USER&p_password=PASSWORD&apikey=API_KEY&p_page_num=PAGE_NUM";
String GET_AWS_POSITION = "https://awsapi.cimc.cn/env-101/por-10/hrapi/hrms/cimc_org_position_wbs_standard.service?p_user=USER&p_password=PASSWORD&apikey=API_KEY&p_page_num=PAGE_NUM";
String GET_AWS_EMPLOYEE = "https://awsapi.cimc.cn/env-101/por-10/hrapi/hrms/cimc_lbr_employee_wbs_standard.service?p_user=USER&p_password=PASSWORD&apikey=API_KEY&p_page_num=PAGE_NUM";
String GET_AWS_TOKEN = "https://awsapi.cimc.cn/env-101/por-10/hrapi/iWorkapi/v1/token?apikey=API_KEY";
String AWS_IWORK_LOGIN = "https://awsapi.cimc.cn/env-101/por-10/hrapi/iWorkapi/ticket/TICKET?access_token=TOKEN&apikey=API_KEY";
//门户登录
String POST_TEST_LOGIN = "https://apipoc1.cimc.com/env-101/por-101/cimcoatest/test/APIUserService"; //参数 apikey systemid token
String POST_LOGIN = "https://awsapi.cimc.cn/env-101/por-10/cimcoaprd/oa_prd/APIUserService";
String BPM_POST_FORM_TEST = "https://apipoc1.cimc.com/env-101/por-101/ekp/bpm/addReview";
String BPM_POST_FORM_PROD = "https://awsapi.cimc.cn/env-101/por-10/ekp/bpm/addReview";
String ALTER_USER = "USER";
String ALTER_PASSWORD = "PASSWORD";
String ALTER_API_KEY = "API_KEY";
String ALTER_DISMISSION = "DISMISSION";
String ALTER_PAGE_NUM = "PAGE_NUM";
String ALTER_TOKEN = "TOKEN";
String ALTER_TICKET = "TICKET";
String EMPTY = "";
}
......@@ -9,7 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
......
......@@ -358,7 +358,13 @@ public class CmeetingJob {
*/
@Scheduled(cron = "0 0 6 * * ? ")
public void pullAllDate() {
if (isDev) {
return;
}
log.info("同步用户开始");
long l = System.currentTimeMillis();
cimcService.pullCimcData();
log.info("同步用户结束,耗时: {}ms", System.currentTimeMillis() - l);
}
......
......@@ -4,15 +4,12 @@ import cn.chatbot.meeting.LLMConfig;
import cn.chatbot.meeting.LLMResult;
import cn.chatbot.meeting.MeetingProcess;
import cn.chatbot.openai.completion.chat.ChatCompletionRequest;
import cn.chatbot.openai.completion.chat.ChatMessage;
import cn.chatbot.openai.completion.chat.ChatMessageRole;
import cn.chatbot.openai.completion.chat.Message;
import cn.chatbot.openai.service.LLMService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
......@@ -20,9 +17,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cmeeting.constant.KnowledgePlatformRouteConstant;
import com.cmeeting.constant.MeetingState;
import com.cmeeting.constant.RecordTemplateConstant;
import com.cmeeting.dto.DocResultDto;
import com.cmeeting.dto.MeetTypeDto;
import com.cmeeting.dto.UserDTO;
import com.cmeeting.email.EmailSender;
import com.cmeeting.exception.RobotBaseException;
......@@ -41,14 +36,8 @@ import com.deepoove.poi.XWPFTemplate;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.tencentcloudapi.wemeet.Client;
import com.tencentcloudapi.wemeet.core.authenticator.AuthenticatorBuilder;
import com.tencentcloudapi.wemeet.core.authenticator.JWTAuthenticator;
import com.tencentcloudapi.wemeet.service.meetings.api.MeetingsApi;
import com.tencentcloudapi.wemeet.service.meetings.model.*;
import com.tencentcloudapi.wemeet.service.records.api.RecordsApi;
import com.tencentcloudapi.wemeet.service.records.model.V1AddressesRecordFileIdGet200Response;
import com.tencentcloudapi.wemeet.service.records.model.V1AddressesRecordFileIdGet200ResponseAiMeetingTranscriptsInner;
import com.tencentcloudapi.wemeet.service.meetings.model.V1MeetingsMeetingIdParticipantsGet200Response;
import com.tencentcloudapi.wemeet.service.meetings.model.V1MeetingsMeetingIdParticipantsGet200ResponseParticipantsInner;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
......@@ -64,10 +53,8 @@ import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.text.MessageFormat;
import java.time.format.DateTimeFormatter;
import java.util.*;
......@@ -321,42 +308,6 @@ public class FileProcessTask {
log.info("线程结束, 耗时: {} ms", System.currentTimeMillis() - l);
}
private byte[] downloadFile(String url) {
// 实现文件下载逻辑
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
try {
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
return response.body().bytes();
} catch (Exception e) {
throw new RuntimeException("下载文件失败", e);
}
}
private String getRecordTextContent(byte[] fileData) {
// 定义文件路径和文件名
String fullPath = savePath + (System.currentTimeMillis() / 1000L) + ".docx";
// 将字节内容写入本地文件
try (FileOutputStream fos = new FileOutputStream(fullPath)) {
fos.write(fileData);
log.info("DOCX transcript saved to: {}", fullPath);
} catch (IOException e) {
log.error("Error saving DOCX transcript to file: {}", e.getMessage(), e);
}
XWPFDocument document;
try {
FileInputStream fis = new FileInputStream(fullPath);
document = new XWPFDocument(fis);
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
XWPFWordExtractor extractor = new XWPFWordExtractor(document);
String textContent = extractor.getText();
log.info("DOCX content as string:\n{}", textContent);
return textContent;
}
/**
* 提供会议转录文件和会议主题,判断会议类型
*
......@@ -426,10 +377,6 @@ public class FileProcessTask {
return type;
}
private String formatMessage(String pattern, Object... args) {
return MessageFormat.format(pattern, args);
}
/**
* 大模型生成纪要xml
*
......@@ -621,35 +568,6 @@ public class FileProcessTask {
);
}
private String convertXmlToJSON(String xml) {
String json;
try {
XmlMapper xmlMapper = new XmlMapper();
JsonNode rootNode = xmlMapper.readTree(xml.getBytes());
// 正确获取节点和属性的方式
List<Map> list = new ArrayList<>();
Iterator<String> iterator = rootNode.fieldNames();
while (iterator.hasNext()) {
String tagName = iterator.next();
JsonNode subNode = rootNode.path(tagName);
String displayName = subNode.path("label").asText();
String content = subNode.path("").asText();
list.add(new HashMap() {{
put("key", tagName + "/" + displayName);
put("value", content);
}});
}
// 构建JSON对象
ObjectMapper jsonMapper = new ObjectMapper();
json = jsonMapper.writeValueAsString(list);
} catch (IOException e) {
log.error(e.getMessage());
throw new RuntimeException(e.getMessage());
}
return json;
}
private String call_llm(String apiAddr, String model, String token, List<Message> messages, int maxTokens) {
LLMService service = new LLMService(token, apiAddr);
StringBuilder stringBuilder = new StringBuilder();
......@@ -736,7 +654,7 @@ public class FileProcessTask {
MeetingInfoMapper meetingInfoMapper, MinioUtils minioUtils, RedisUtils redisUtils, EmailSender emailSender,
MeetingRecordTemplateMapper meetingRecordTemplateMapper, MeetingRecordTemplateService meetingRecordTemplateService, MeetTypeService meetTypeService, UserIdMapper userIdMapper,
String llmApiAddr, Boolean finalRetry, ProcessLogService processLogService, List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers, Map<String, String> tidWidRelations,
UserAdminConfig userAdminConfig, String adminToken, String applicationId, String fileDownloadPath, String permTenantId,
UserAdminConfig userAdminConfig, String applicationId, String fileDownloadPath, String permTenantId,
String aesKey) {
this.recordFileIdList = recordFileIdList;
this.savePath = savePath;
......@@ -757,7 +675,6 @@ public class FileProcessTask {
this.authorizedUsers = authorizedUsers;
this.tidWidRelations = tidWidRelations;
this.userAdminConfig = userAdminConfig;
this.adminToken = adminToken;
this.applicationId = applicationId;
this.fileDownloadPath = fileDownloadPath;
this.permTenantId = permTenantId;
......
......@@ -15,7 +15,6 @@ public class ProcessLogServiceImpl extends ServiceImpl<ProcessLogMapper, Process
@Override
public boolean log(String meetingId, String subMeetingId, String message) {
ProcessLog processLog = ProcessLog.builder().meetingId(meetingId).subMeetingId(subMeetingId).message(message).operateTime(LocalDateTime.now()).build();
boolean save = save(processLog);
return save;
return save(processLog);
}
}
......@@ -9,5 +9,11 @@ import java.util.List;
@Mapper
public interface AuthMapper {
/**
* 智能体权限查询
* @param targetId
* @param tenantId
* @return
*/
List<CoreModulePermissions> getAuthByTargetId(@Param("targetId") String targetId, @Param("tenantId") String tenantId);
}
//package com.cmeeting.mapper.secondary;
//
//import com.baomidou.mybatisplus.core.mapper.BaseMapper;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.cmeeting.pojo.ShareUser;
//import org.apache.ibatis.annotations.Param;
//
//import java.util.List;
//
///**
// * (ShareUser)表数据库访问层
// *
// * @author makejava
// * @since 2025-01-16 14:50:16
// */
//public interface ShareUserMapper extends BaseMapper<ShareUser> {
//
//}
......@@ -2,7 +2,6 @@ package com.cmeeting.mapper.primary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cmeeting.pojo.TencentMeetingUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
......
package com.cmeeting.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import lombok.experimental.Accessors;
import java.util.Date;
......@@ -14,6 +15,11 @@ import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("core_module_permissions")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CoreModulePermissions {
/**
* 主键ID
......
package com.cmeeting.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* (ShareUser)实体类
*
* @author makejava
* @since 2025-01-16 14:50:14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("share_user")
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ShareUser implements Serializable {
private static final long serialVersionUID = -15064516326494187L;
/**
* 单个用户id或者分类id
*/
private String relId;
/**
* 0 分类 1用户
*/
private Integer type;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
/**
* 0-正常,1-删除
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
private boolean isDel;
/**
* 用户创建人
*/
private String createUser;
/**
* 更新者
*/
private String updateUser;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date updateTime;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;
/**
* 租户id
*/
private String tenantId;
}
package com.cmeeting.pojo;
import lombok.Data;
@Data
public class TencentMeetingRecord {
/**
* 主键ID
*/
private Integer id;
/**
* 会议id
*/
private String meetingId;
/**
* 用户ID
*/
private String userId;
/**
* 是否是重名用户(1:重名, 0:不重名)
*/
private String isrepeatName;
}
// pojo/User.java
package com.cmeeting.pojo;
import lombok.Data;
@Data
public class User {
private Long id;
private String username;
private String password;
private String salt;
// 其他字段...
public User() {
}
public User(Long id, String username, String password, String salt) {
this.id = id;
this.username = username;
this.password = password;
this.salt = salt;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", salt='" + salt + '\'' +
'}';
}
}
\ No newline at end of file
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
......@@ -8,11 +8,9 @@ import com.cmeeting.log.service.ProcessLogService;
import com.cmeeting.mapper.primary.MeetingInfoMapper;
import com.cmeeting.mapper.primary.MeetingRecordTemplateMapper;
import com.cmeeting.mapper.primary.UserIdMapper;
import com.cmeeting.pojo.UserId;
import com.cmeeting.util.MinioUtils;
import com.cmeeting.util.RedisUtils;
import com.cmeeting.util.UserAdminConfig;
import com.cmeeting.util.UserAdminTokenUtil;
import com.cmeeting.vo.TencentMeetingVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -83,7 +81,6 @@ public class FileProcessProducer {
*/
public void submitBatchTasks(List<TencentMeetingVO.RecordFile> recordFiles, List<UserDTO.TemplateAuthorizedUserDTO> authorizedUsers, Map<String, String> tidWidRelations, Boolean finalRetry) {
List<Future<?>> futures = new ArrayList<>();
String adminToken = UserAdminTokenUtil.getUserAdminToken();
log.info("待处理会议数量: {}", recordFiles.size());
for (TencentMeetingVO.RecordFile recordFile : recordFiles) {
// 为每个URL创建任务
......@@ -107,7 +104,6 @@ public class FileProcessProducer {
authorizedUsers,
tidWidRelations,
userAdminConfig,
adminToken,
applicationId,
fileDownloadPath,
permTenantId,
......
......@@ -21,17 +21,13 @@ import java.util.List;
@Slf4j
@Component
public class CimcUtil implements CimcConstants {
@Value("${cimc.loginApiKey-test}")
public String loginApiKey = "faBqIHbXOtDIbguxJ7F55QhL04jIRekJ";//生产 Jj8UONm74FRxOSMnlIN95pVVUJf5Nn2D 测试 faBqIHbXOtDIbguxJ7F55QhL04jIRekJ
@Value("${cimc.loginApiKey-prod}")
public String prodLoginApiKey = "Jj8UONm74FRxOSMnlIN95pVVUJf5Nn2D";//生产 Jj8UONm74FRxOSMnlIN95pVVUJf5Nn2D 测试 faBqIHbXOtDIbguxJ7F55QhL04jIRekJ
@Value("${cimc.username}")
public String username;
@Value("${cimc.password}")
public String password;
@Value("${cimc.apiKey}")
public String apiKey;//同步apiKey
public String apiKey;
@Value("${cimc.userinfo-environment}")
public String userInfoEnvironment;
......
package com.cmeeting.util;
import com.alibaba.fastjson.JSONObject;
import com.cmeeting.constant.UserAdminRouteConstant;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
/**
* @author a
*/
@Component
public class UserAdminTokenUtil {
@Resource
private RedisUtils redisUtils;
@Resource
private UserAdminConfig userAdminConfig;
@Value("${userAdmin.appId}")
private String appId;
@Value("${userAdmin.secret}")
private String secret;
private String getAccessToken() {
String key = "user_admin_token_" + appId;
Object o = redisUtils.get(key);
if (o != null) {
return o.toString();
}
String url = userAdminConfig.getUserAdminDomain() + UserAdminRouteConstant.ACCESS_TOKEN;
JSONObject body = new JSONObject();
body.put("appId", appId);
body.put("secret", secret);
JSONObject object = HttpClientUtils.httpPost(url, body, null);
if (object != null && object.getInteger("code") == 0) {
String data = object.getString("data");
redisUtils.set(key, data, 7000);
return data;
} else {
throw new RuntimeException("获取accessToken失败");
}
}
private static UserAdminTokenUtil util;
@PostConstruct
public void init() {
util = this;
}
public static String getUserAdminToken() {
return util.getAccessToken();
}
}
......@@ -146,12 +146,8 @@ userAdmin:
jwt:
header: Authorization
customHeader: 'Custom-Auth-Token'
applicationId: 'Application-Id'
tokenHead: 'Bearer '
openingUp-header: 'aigc-open-auth-token'
expireTime: 36000
customExpireTime: 36000 # 5天
permission:
applicationId: ${PERMISSION_APPLiCATION_ID}
......@@ -178,3 +174,10 @@ statistics:
toEmails:
- user:
email: hongdongbao@chatbot.cn
# 同步组织架构信息用 HR账号密码
cimc:
username: cimc_AIGC
password: 4A6BEB75A7017F4BC4D381C2CBB0E6FB
apiKey: Jj8UONm74FRxOSMnlIN95pVVUJf5Nn2D
userinfo-environment: test
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论