提交 c38ab7e6 作者: 洪东保

cmeeting独立部署:

 1. AD用户定时从中集API同步
 2. 所有表放在新库cmeeting中
 3. 删除所有tenantId相关参数
父级 7db8e145
package com.cmeeting;
import com.alibaba.fastjson2.JSON;
import com.cmeeting.email.EmailSender;
import com.cmeeting.mapper.tertiary.AuthMapper;
import com.cmeeting.mapper.primary.UserIdMapper;
import com.cmeeting.mapper.secondary.SysUserMapper;
import com.cmeeting.mapper.secondary.SysUserSysMapper;
import com.cmeeting.pojo.CoreModulePermissions;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.tencentcloudapi.wemeet.Client;
import com.tencentcloudapi.wemeet.core.authenticator.AuthenticatorBuilder;
import com.tencentcloudapi.wemeet.core.authenticator.JWTAuthenticator;
import com.tencentcloudapi.wemeet.core.exception.ClientException;
import com.tencentcloudapi.wemeet.core.exception.ServiceException;
import com.tencentcloudapi.wemeet.core.xhttp.ApiResponse;
import com.tencentcloudapi.wemeet.service.meeting_control.api.MeetingControlApi;
import com.tencentcloudapi.wemeet.service.meeting_control.model.V1RealControlMeetingsMeetingIdAsrPutRequest;
import com.tencentcloudapi.wemeet.service.meetings.api.MeetingsApi;
import com.util.meeting.MeetingMinutesGenerator;
import org.apache.commons.lang3.StringUtils;
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;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.*;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.stream.Collectors;
@RestController
@RequestMapping
public class TencentMeetingCallbackController {
private static final Logger logger = LoggerFactory.getLogger(TencentMeetingCallbackController.class);
/**
* *
* * 配置参数 - 从配置文件或环境变量获取
* * 用于校验腾讯会议的事件订阅
*/
//tencent.meeting.token
private final String token = "Jo6X4sZKhPFknSdBH8o6gXVOb";
//tencent.meeting.aesKey
private final String encodingAESKey = "AhES8VLIoktG4KGPqgKz6uUMtvs67JZWCuStmogMAwr";
// 1.构造 client 客户端(jwt 鉴权需要配置 appId sdkId secretID 和 secretKey)
Client client = new Client.Builder()
.withAppId("211153201").withSdkId("28370276340")
.withSecret("BKOMDZVbvh0iT7k6UHsSizAWBCOVDtT6", "3Y1j0mzNp7KChKFJGyaEnZHLobFoAQ8eLwfaMx8nLbtXAerO")
.build();
@Autowired
private UserIdMapper userIdMapper;
@Autowired
private SysUserMapper sysUserMapper;
@Autowired
private AuthMapper authMapper;
@Autowired
private SysUserSysMapper sysUserSysMapper;
//处理GET请求 - URL验证
@GetMapping
public ResponseEntity<String> verifyUrl(
@RequestParam("check_str") String checkStr,
@RequestHeader("timestamp") String timestamp,
@RequestHeader("nonce") String nonce,
@RequestHeader("signature") String signature) {
try {
// 1. URL解码
checkStr = URLDecoder.decode(checkStr, StandardCharsets.UTF_8.name());
// 2. 验证签名
if (!verifySignature(token, timestamp, nonce, checkStr, signature)) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Signature verification failed");
}
// 3. 解密check_str
String decryptedStr = decryptData(checkStr);
// 4. 返回明文(不能加引号或换行符)
return ResponseEntity.ok(decryptedStr);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error: " + e.getMessage());
}
}
//处理POST请求 -事件回调
@PostMapping(consumes = "application/json")
public ResponseEntity<String> handleEvent(
@RequestBody Map<String, String> requestBody,
@RequestHeader("timestamp") String timestamp,
@RequestHeader("nonce") String nonce,
@RequestHeader("signature") String signature) {
try {
// 1. 获取data字段
String encryptedData = requestBody.get("data");
if (encryptedData == null) {
return ResponseEntity.badRequest().body("Missing data field");
}
// 2. 验证签名
if (!verifySignature(token, timestamp, nonce, encryptedData, signature)) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Signature verification failed");
}
// 3. 解密data
String decryptedData = decryptData(encryptedData);
logger.info("Decrypted event data: {}", decryptedData);
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();
// 通过腾讯的userid查询到企业微信的userid
String wid = userIdMapper.getWidByTid(userId);
logger.info("该用户的工号id:{},", wid);
// 调用admin的find接口查询用户信息包括用户的部门id路径
String userDeptPath = sysUserMapper.getUserDeptPath(wid);
logger.info("该用户的部门路径:{},", userDeptPath);
List<String> deptPath = null;
if (userDeptPath != null && !userDeptPath.isEmpty()) {
// 使用split方法分割字符串,并过滤掉空字符串
deptPath = Arrays.stream(userDeptPath.split("/"))
.filter(s -> !s.isEmpty())
.collect(Collectors.toList());
}
logger.info("分割后的部门路径列表:{}", deptPath);
//通过智能体id查询该id下的部门和用户
String targetId = "1815393211829587968";//职能体id
String tenantId = "1806976109082972160";//租户id
List<CoreModulePermissions> auths = authMapper.getAuthByTargetId(targetId, tenantId);
// 创建两个集合分别存储type=0(部门)和type=1(员工)的数据
List<CoreModulePermissions> type0List = new ArrayList<>();
List<CoreModulePermissions> type1List = new ArrayList<>();
for (CoreModulePermissions auth : auths) {
if (auth.getType() == 0) {
type0List.add(auth);
} else if (auth.getType() == 1) {
type1List.add(auth);
}
// 如果type为null或其他值,这里会被忽略
}
// 检查权限
boolean hasPermission = false;
// 1. 先检查员工是否在type1List中
for (CoreModulePermissions empAuth : type1List) {
if (wid.equals(empAuth.getRelId())) {
hasPermission = true;
logger.info("员工{}在直接授权列表中", wid);
break;
}
}
// 2. 如果员工不在直接授权列表中,检查部门权限
if (!hasPermission && !deptPath.isEmpty()) {
for (CoreModulePermissions deptAuth : type0List) {
if (deptPath.contains(deptAuth.getRelId())) {
hasPermission = true;
logger.info("员工{}通过部门{}获得权限", wid, deptAuth.getRelId());
break;
}
}
}
if (hasPermission) {
processEvent(decryptedData);
}
} catch (Exception e) {
e.printStackTrace();
}
// 5. 返回成功响应(必须严格匹配)
return ResponseEntity.ok("successfully received callback");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error: " + e.getMessage());
}
}
//验证签名(SHA1)
private boolean verifySignature(String token, String timestamp, String nonce,
String data, String receivedSignature) throws Exception {
// 1. 按字典序排序
String[] arr = new String[]{token, timestamp, nonce, data};
Arrays.sort(arr);
// 2. 拼接字符串
String combined = String.join("", arr);
// 3. SHA1加密
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(combined.getBytes(StandardCharsets.UTF_8));
// 4. 转换为16进制字符串
StringBuilder hexStr = new StringBuilder();
for (byte b : digest) {
String hex = Integer.toHexString(b & 0xFF);
if (hex.length() == 1) {
hexStr.append('0');
}
hexStr.append(hex);
}
// 5. 比较签名
return hexStr.toString().equals(receivedSignature);
}
//AES解密数据
private String decryptData(String encryptedData) throws Exception {
// 1. Base64解码
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedData);
// 2. 处理AES密钥
byte[] aesKeyBytes = Base64.getDecoder().decode(encodingAESKey + "=");
byte[] ivBytes = Arrays.copyOfRange(aesKeyBytes, 0, 16);
// 3. 初始化Cipher
SecretKeySpec keySpec = new SecretKeySpec(aesKeyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
// 4. 解密
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
// 5. 处理PKCS5Padding补位
int pad = decryptedBytes[decryptedBytes.length - 1];
if (pad < 1 || pad > 32) {
pad = 0;
}
return new String(
Arrays.copyOfRange(decryptedBytes, 0, decryptedBytes.length - pad),
StandardCharsets.UTF_8
);
}
// 类成员变量记录已处理的事件
private final Set<String> startProcessedEvents = Collections.synchronizedSet(new HashSet<>());
private final Set<String> sendProcessedEvents = Collections.synchronizedSet(new HashSet<>());
//处理事件业务逻辑
private void processEvent(String decryptedData) {
// 这里可以解析JSON并处理具体业务
// 示例: 打印事件数据
logger.info("这是获取到的会议信息:");
logger.info("Processing event: {}", decryptedData);
String json = decryptedData;
try {
ObjectMapper mapper = new ObjectMapper();
// 解析JSON
java.util.Map<String, Object> jsonMap = mapper.readValue(json, java.util.Map.class);
// 1. 提取 event
String event = (String) jsonMap.get("event");
// 获取payload数组
java.util.List<java.util.Map<String, Object>> payload = (java.util.List<java.util.Map<String, Object>>) jsonMap.get("payload");
java.util.Map<String, Object> firstPayload = payload.get(0);
// 获取meeting_info信息
java.util.Map<String, Object> meetingInfo = (java.util.Map<String, Object>) firstPayload.get("meeting_info");
String meetingId = (String) meetingInfo.get("meeting_id");
Map<String, Object> operator = (Map<String, Object>) firstPayload.get("operator");
String operatorUserId = (String) operator.get("userid");
String instanceIdStr = (String) operator.get("instance_id");
Integer instanceId = Integer.parseInt(instanceIdStr);
//判断事件是否为开始会议
if ("meeting.started".equals(event)) {
try {
// 生成唯一事件ID(使用事件类型+会议ID+时间戳)
String eventId = meetingId;
// 检查是否已处理
if (startProcessedEvents.contains(eventId)) {
//System.out.println("忽略已处理事件: " + eventId);
logger.info("忽略已处理事件: {}", eventId);
return;
}
// 记录已处理事件
startProcessedEvents.add(eventId);
// 原有处理逻辑...
} catch (Exception e) {
e.printStackTrace();
}
//开启语音转写功能
//System.out.println("开启会议语音转写");
logger.info("开启会议语音转写");
ObjectMapper jsonMapper = new ObjectMapper();
ObjectNode jsonBody = jsonMapper.createObjectNode()
.put("operator_id", operatorUserId)
.put("operator_id_type", 1)
.put("instance_id", instanceId) // 自动识别为数字类型
.put("is_open", true)
.put("open_asr_view", 0);
String BODY_JSON = mapper.writeValueAsString(jsonBody);
V1RealControlMeetingsMeetingIdAsrPutRequest body = JSON.parseObject(BODY_JSON, V1RealControlMeetingsMeetingIdAsrPutRequest.class);
// 2.构造请求参数
MeetingControlApi.ApiV1RealControlMeetingsMeetingIdAsrPutRequest request =
new MeetingControlApi.ApiV1RealControlMeetingsMeetingIdAsrPutRequest.Builder(meetingId)
.body(body).build();
// 3.构造 JWT 鉴权器
// 随机数
BigInteger nonce = BigInteger.valueOf(Math.abs((new SecureRandom()).nextInt()));
// 当前时间戳
String timestamp = String.valueOf(System.currentTimeMillis() / 1000L);
AuthenticatorBuilder<JWTAuthenticator> authenticatorBuilder =
new JWTAuthenticator.Builder().nonce(nonce).timestamp(timestamp);
try {
MeetingControlApi.ApiV1RealControlMeetingsMeetingIdAsrPutResponse response =
client.meeting_control().v1RealControlMeetingsMeetingIdAsrPut(request, authenticatorBuilder);
// response from `v1RealControlMeetingsMeetingIdAsrPut`: V1RealControlMeetingsMeetingIdAsrPut200Response
logger.info("Response from `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`: \nheader: {}\n{}",
response.getHeader(), response.getData());
} catch (ClientException e) {
logger.error("Error when calling `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`", e);
throw new RuntimeException(e);
} catch (ServiceException e) {
logger.error("Error when calling `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`", e);
logger.error("Full HTTP response: {}", new String(e.getApiResp().getRawBody()));
throw new RuntimeException(e);
}
} else if ("meeting.end".equals(event)) {
try {
// 生成唯一事件ID(使用事件类型+会议ID+时间戳)
String eventId = meetingId;
// 检查是否已处理
if (sendProcessedEvents.contains(eventId)) {
logger.info("忽略已处理事件: {}", eventId);
return;
}
// 记录已处理事件
sendProcessedEvents.add(eventId);
// 原有处理逻辑...
} catch (Exception e) {
e.printStackTrace();
}
logger.info("operatorId: {}", operatorUserId);
logger.info("meetingId: {}", meetingId);
// 2.构造请求参数
MeetingsApi.ApiV1AsrDetailsGetRequest request =
new MeetingsApi.ApiV1AsrDetailsGetRequest.Builder()
.operatorIdType("1")
.operatorId(operatorUserId)
.meetingId(meetingId)
.fileType("1")
.build();
// 3.构造 JWT 鉴权器
// 随机数
BigInteger nonce = BigInteger.valueOf(Math.abs((new SecureRandom()).nextInt()));
// 当前时间戳
String timestamp = String.valueOf(System.currentTimeMillis() / 1000L);
AuthenticatorBuilder<JWTAuthenticator> authenticatorBuilder =
new JWTAuthenticator.Builder().nonce(nonce).timestamp(timestamp);
// 4.发送对应的请求
try {
ApiResponse response =
client.meetings().v1AsrDetailsGet(request, authenticatorBuilder);
logger.info("Response from `MeetingsApi.v1AsrDetailsGet`: \nheader: {}\n{}",
response.getHeader(), response.getRawBody());
String rawBodyString = new String(response.getRawBody(), StandardCharsets.UTF_8);
logger.info("Raw Body (string): {}", rawBodyString);
try {
// 解析JSON获取下载URL
com.fasterxml.jackson.databind.ObjectMapper resultmapper = new com.fasterxml.jackson.databind.ObjectMapper();
java.util.Map<String, Object> result = resultmapper.readValue(rawBodyString, java.util.Map.class);
String downloadUrl = ((java.util.List<String>) result.get("download_url")).get(0);
// 设置保存路径为D盘根目录
String savePath = "D:/" + meetingId + ".docx";
String targetPath = "D:/" + meetingId + "纪要" + ".docx";
// 下载文件
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)) {
byte[] dataBuffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
fileOutputStream.write(dataBuffer, 0, bytesRead);
}
logger.info("文件下载完成,已保存到 {}", savePath);
//将文件传送给大模型处理
try {
boolean success = MeetingMinutesGenerator.generateMinutesFromWord(
savePath,
targetPath,
"AKIAXFAXF62IWJXGLVEE.LnKInaahcMZG9zLsGMH3nTLOw3S3lK5Vcu0+ifnO",
"https://bedrock.chatbot.cn/llm/sse-invoke"
);
if (success) {
logger.info("会议纪要生成成功!");
}
} catch (IOException e) {
logger.error("错误: {}", e.getMessage());
}
//使用邮箱发送邮件
// 1.获得主持人的腾讯会议userid
// 2.根据获得的腾讯会议userid获得员工的企业微信userid
// 3.根据企业微信userid查询员工表获得员工邮箱
String tid = operatorUserId;
String wid = userIdMapper.getWidByTid(tid);
String tenantId = "1806976109082972160";
String emailAddress = sysUserSysMapper.getCompanyEmail(wid, tenantId);
if (StringUtils.isEmpty(emailAddress)) {
logger.info("用户:{}", wid, "没有企业邮箱");
return;
}
Thread.sleep(10000);
EmailSender emailSender = new EmailSender();
//response.getRawBody()
// boolean mailFlag = emailSender.sendEmailWithAttachment(emailAddress,
// targetPath,
// "重要文件",
// "您好:\n" +
// "\n" +
// " 附件为您本次会议的会议纪要,烦请下载查看,如需对会议纪要结果进行修改或查看历史会议,可点击下方链接。");
// if (mailFlag) {
// logger.info("邮件发送成功");
// } else {
// logger.error("邮件发送失败");
//package com.cmeeting;
//
//import com.alibaba.fastjson2.JSON;
//import com.cmeeting.email.EmailSender;
//import com.cmeeting.mapper.tertiary.AuthMapper;
//import com.cmeeting.mapper.primary.UserIdMapper;
//import com.cmeeting.mapper.tertiary.SysUserSyncMapper;
//import com.cmeeting.pojo.CoreModulePermissions;
//import com.fasterxml.jackson.databind.JsonNode;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.fasterxml.jackson.databind.node.ObjectNode;
//import com.tencentcloudapi.wemeet.Client;
//import com.tencentcloudapi.wemeet.core.authenticator.AuthenticatorBuilder;
//import com.tencentcloudapi.wemeet.core.authenticator.JWTAuthenticator;
//import com.tencentcloudapi.wemeet.core.exception.ClientException;
//import com.tencentcloudapi.wemeet.core.exception.ServiceException;
//import com.tencentcloudapi.wemeet.core.xhttp.ApiResponse;
//import com.tencentcloudapi.wemeet.service.meeting_control.api.MeetingControlApi;
//import com.tencentcloudapi.wemeet.service.meeting_control.model.V1RealControlMeetingsMeetingIdAsrPutRequest;
//import com.tencentcloudapi.wemeet.service.meetings.api.MeetingsApi;
//import com.util.meeting.MeetingMinutesGenerator;
//import org.apache.commons.lang3.StringUtils;
//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;
//
//import javax.crypto.Cipher;
//import javax.crypto.spec.IvParameterSpec;
//import javax.crypto.spec.SecretKeySpec;
//import java.io.IOException;
//import java.math.BigInteger;
//import java.security.MessageDigest;
//import java.security.SecureRandom;
//import java.util.*;
//import java.net.URLDecoder;
//import java.nio.charset.StandardCharsets;
//import java.util.Base64;
//import java.util.stream.Collectors;
//
//@RestController
//@RequestMapping
//public class TencentMeetingCallbackController {
// private static final Logger logger = LoggerFactory.getLogger(TencentMeetingCallbackController.class);
// /**
// * *
// * * 配置参数 - 从配置文件或环境变量获取
// * * 用于校验腾讯会议的事件订阅
// */
//
//
// //tencent.meeting.token
// private final String token = "Jo6X4sZKhPFknSdBH8o6gXVOb";
// //tencent.meeting.aesKey
// private final String encodingAESKey = "AhES8VLIoktG4KGPqgKz6uUMtvs67JZWCuStmogMAwr";
//
// // 1.构造 client 客户端(jwt 鉴权需要配置 appId sdkId secretID 和 secretKey)
// Client client = new Client.Builder()
// .withAppId("211153201").withSdkId("28370276340")
// .withSecret("BKOMDZVbvh0iT7k6UHsSizAWBCOVDtT6", "3Y1j0mzNp7KChKFJGyaEnZHLobFoAQ8eLwfaMx8nLbtXAerO")
// .build();
// @Autowired
// private UserIdMapper userIdMapper;
// @Autowired
// private AuthMapper authMapper;
// @Autowired
// private SysUserSyncMapper sysUserSysMapper;
//
// //处理GET请求 - URL验证
// @GetMapping
// public ResponseEntity<String> verifyUrl(
// @RequestParam("check_str") String checkStr,
// @RequestHeader("timestamp") String timestamp,
// @RequestHeader("nonce") String nonce,
// @RequestHeader("signature") String signature) {
//
// try {
// // 1. URL解码
// checkStr = URLDecoder.decode(checkStr, StandardCharsets.UTF_8.name());
//
// // 2. 验证签名
// if (!verifySignature(token, timestamp, nonce, checkStr, signature)) {
// return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Signature verification failed");
// }
//
// // 3. 解密check_str
// String decryptedStr = decryptData(checkStr);
//
// // 4. 返回明文(不能加引号或换行符)
// return ResponseEntity.ok(decryptedStr);
//
// } catch (Exception e) {
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body("Error: " + e.getMessage());
// }
// }
//
// //处理POST请求 -事件回调
// @PostMapping(consumes = "application/json")
//
// public ResponseEntity<String> handleEvent(
// @RequestBody Map<String, String> requestBody,
// @RequestHeader("timestamp") String timestamp,
// @RequestHeader("nonce") String nonce,
// @RequestHeader("signature") String signature) {
//
// try {
// // 1. 获取data字段
// String encryptedData = requestBody.get("data");
// if (encryptedData == null) {
// return ResponseEntity.badRequest().body("Missing data field");
// }
//
// // 2. 验证签名
// if (!verifySignature(token, timestamp, nonce, encryptedData, signature)) {
// return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Signature verification failed");
// }
//
// // 3. 解密data
// String decryptedData = decryptData(encryptedData);
// logger.info("Decrypted event data: {}", decryptedData);
// 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();
// // 通过腾讯的userid查询到企业微信的userid
// String wid = userIdMapper.getWidByTid(userId);
// logger.info("该用户的工号id:{},", wid);
// // 调用admin的find接口查询用户信息包括用户的部门id路径
// String userDeptPath = "";
//// sysUserMapper.getUserDeptPath(wid);
// logger.info("该用户的部门路径:{},", userDeptPath);
// List<String> deptPath = null;
// if (userDeptPath != null && !userDeptPath.isEmpty()) {
// // 使用split方法分割字符串,并过滤掉空字符串
// deptPath = Arrays.stream(userDeptPath.split("/"))
// .filter(s -> !s.isEmpty())
// .collect(Collectors.toList());
// }
// logger.info("分割后的部门路径列表:{}", deptPath);
// //通过智能体id查询该id下的部门和用户
// String targetId = "1815393211829587968";//职能体id
// String tenantId = "1806976109082972160";//租户id
// List<CoreModulePermissions> auths = authMapper.getAuthByTargetId(targetId, tenantId);
// // 创建两个集合分别存储type=0(部门)和type=1(员工)的数据
// List<CoreModulePermissions> type0List = new ArrayList<>();
// List<CoreModulePermissions> type1List = new ArrayList<>();
//
// for (CoreModulePermissions auth : auths) {
// if (auth.getType() == 0) {
// type0List.add(auth);
// } else if (auth.getType() == 1) {
// type1List.add(auth);
// }
// // 如果type为null或其他值,这里会被忽略
// }
// // 检查权限
// boolean hasPermission = false;
// // 1. 先检查员工是否在type1List中
// for (CoreModulePermissions empAuth : type1List) {
// if (wid.equals(empAuth.getRelId())) {
// hasPermission = true;
// logger.info("员工{}在直接授权列表中", wid);
// break;
// }
// }
// // 2. 如果员工不在直接授权列表中,检查部门权限
// if (!hasPermission && !deptPath.isEmpty()) {
// for (CoreModulePermissions deptAuth : type0List) {
// if (deptPath.contains(deptAuth.getRelId())) {
// hasPermission = true;
// logger.info("员工{}通过部门{}获得权限", wid, deptAuth.getRelId());
// break;
// }
// }
// }
// if (hasPermission) {
// processEvent(decryptedData);
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// // 5. 返回成功响应(必须严格匹配)
// return ResponseEntity.ok("successfully received callback");
// } catch (Exception e) {
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body("Error: " + e.getMessage());
// }
// }
//
//
// //验证签名(SHA1)
//
//
// private boolean verifySignature(String token, String timestamp, String nonce,
// String data, String receivedSignature) throws Exception {
// // 1. 按字典序排序
// String[] arr = new String[]{token, timestamp, nonce, data};
// Arrays.sort(arr);
//
// // 2. 拼接字符串
// String combined = String.join("", arr);
//
// // 3. SHA1加密
// MessageDigest md = MessageDigest.getInstance("SHA-1");
// byte[] digest = md.digest(combined.getBytes(StandardCharsets.UTF_8));
//
// // 4. 转换为16进制字符串
// StringBuilder hexStr = new StringBuilder();
// for (byte b : digest) {
// String hex = Integer.toHexString(b & 0xFF);
// if (hex.length() == 1) {
// hexStr.append('0');
// }
// hexStr.append(hex);
// }
//
// // 5. 比较签名
// return hexStr.toString().equals(receivedSignature);
// }
//
// //AES解密数据
// private String decryptData(String encryptedData) throws Exception {
// // 1. Base64解码
// byte[] encryptedBytes = Base64.getDecoder().decode(encryptedData);
//
// // 2. 处理AES密钥
// byte[] aesKeyBytes = Base64.getDecoder().decode(encodingAESKey + "=");
// byte[] ivBytes = Arrays.copyOfRange(aesKeyBytes, 0, 16);
//
// // 3. 初始化Cipher
// SecretKeySpec keySpec = new SecretKeySpec(aesKeyBytes, "AES");
// IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
// Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
//
// // 4. 解密
// byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
//
// // 5. 处理PKCS5Padding补位
// int pad = decryptedBytes[decryptedBytes.length - 1];
// if (pad < 1 || pad > 32) {
// pad = 0;
// }
//
// return new String(
// Arrays.copyOfRange(decryptedBytes, 0, decryptedBytes.length - pad),
// StandardCharsets.UTF_8
// );
// }
//
// // 类成员变量记录已处理的事件
// private final Set<String> startProcessedEvents = Collections.synchronizedSet(new HashSet<>());
// private final Set<String> sendProcessedEvents = Collections.synchronizedSet(new HashSet<>());
//
// //处理事件业务逻辑
// private void processEvent(String decryptedData) {
// // 这里可以解析JSON并处理具体业务
// // 示例: 打印事件数据
// logger.info("这是获取到的会议信息:");
// logger.info("Processing event: {}", decryptedData);
// String json = decryptedData;
// try {
// ObjectMapper mapper = new ObjectMapper();
//
// // 解析JSON
// java.util.Map<String, Object> jsonMap = mapper.readValue(json, java.util.Map.class);
//
// // 1. 提取 event
// String event = (String) jsonMap.get("event");
// // 获取payload数组
// java.util.List<java.util.Map<String, Object>> payload = (java.util.List<java.util.Map<String, Object>>) jsonMap.get("payload");
// java.util.Map<String, Object> firstPayload = payload.get(0);
// // 获取meeting_info信息
// java.util.Map<String, Object> meetingInfo = (java.util.Map<String, Object>) firstPayload.get("meeting_info");
// String meetingId = (String) meetingInfo.get("meeting_id");
// Map<String, Object> operator = (Map<String, Object>) firstPayload.get("operator");
// String operatorUserId = (String) operator.get("userid");
// String instanceIdStr = (String) operator.get("instance_id");
// Integer instanceId = Integer.parseInt(instanceIdStr);
//
// //判断事件是否为开始会议
// if ("meeting.started".equals(event)) {
//
// try {
// // 生成唯一事件ID(使用事件类型+会议ID+时间戳)
// String eventId = meetingId;
// // 检查是否已处理
// if (startProcessedEvents.contains(eventId)) {
// //System.out.println("忽略已处理事件: " + eventId);
// logger.info("忽略已处理事件: {}", eventId);
// return;
// }
// // 记录已处理事件
// startProcessedEvents.add(eventId);
//
// // 原有处理逻辑...
// } catch (Exception e) {
// e.printStackTrace();
// }
// //开启语音转写功能
// //System.out.println("开启会议语音转写");
// logger.info("开启会议语音转写");
// ObjectMapper jsonMapper = new ObjectMapper();
// ObjectNode jsonBody = jsonMapper.createObjectNode()
// .put("operator_id", operatorUserId)
// .put("operator_id_type", 1)
// .put("instance_id", instanceId) // 自动识别为数字类型
// .put("is_open", true)
// .put("open_asr_view", 0);
// String BODY_JSON = mapper.writeValueAsString(jsonBody);
// V1RealControlMeetingsMeetingIdAsrPutRequest body = JSON.parseObject(BODY_JSON, V1RealControlMeetingsMeetingIdAsrPutRequest.class);
//
// // 2.构造请求参数
// MeetingControlApi.ApiV1RealControlMeetingsMeetingIdAsrPutRequest request =
// new MeetingControlApi.ApiV1RealControlMeetingsMeetingIdAsrPutRequest.Builder(meetingId)
// .body(body).build();
// // 3.构造 JWT 鉴权器
// // 随机数
// BigInteger nonce = BigInteger.valueOf(Math.abs((new SecureRandom()).nextInt()));
// // 当前时间戳
// String timestamp = String.valueOf(System.currentTimeMillis() / 1000L);
// AuthenticatorBuilder<JWTAuthenticator> authenticatorBuilder =
// new JWTAuthenticator.Builder().nonce(nonce).timestamp(timestamp);
// try {
// MeetingControlApi.ApiV1RealControlMeetingsMeetingIdAsrPutResponse response =
// client.meeting_control().v1RealControlMeetingsMeetingIdAsrPut(request, authenticatorBuilder);
// // response from `v1RealControlMeetingsMeetingIdAsrPut`: V1RealControlMeetingsMeetingIdAsrPut200Response
// logger.info("Response from `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`: \nheader: {}\n{}",
// response.getHeader(), response.getData());
// } catch (ClientException e) {
// logger.error("Error when calling `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`", e);
// throw new RuntimeException(e);
// } catch (ServiceException e) {
// logger.error("Error when calling `MeetingControlApi.v1RealControlMeetingsMeetingIdAsrPut`", e);
// logger.error("Full HTTP response: {}", new String(e.getApiResp().getRawBody()));
// throw new RuntimeException(e);
// }
// } else if ("meeting.end".equals(event)) {
//
// try {
// // 生成唯一事件ID(使用事件类型+会议ID+时间戳)
// String eventId = meetingId;
// // 检查是否已处理
// if (sendProcessedEvents.contains(eventId)) {
// logger.info("忽略已处理事件: {}", eventId);
// return;
// }
// // 记录已处理事件
// sendProcessedEvents.add(eventId);
//
// // 原有处理逻辑...
// } catch (Exception e) {
// e.printStackTrace();
// }
// logger.info("operatorId: {}", operatorUserId);
// logger.info("meetingId: {}", meetingId);
// // 2.构造请求参数
// MeetingsApi.ApiV1AsrDetailsGetRequest request =
// new MeetingsApi.ApiV1AsrDetailsGetRequest.Builder()
// .operatorIdType("1")
// .operatorId(operatorUserId)
// .meetingId(meetingId)
// .fileType("1")
// .build();
// // 3.构造 JWT 鉴权器
// // 随机数
// BigInteger nonce = BigInteger.valueOf(Math.abs((new SecureRandom()).nextInt()));
// // 当前时间戳
// String timestamp = String.valueOf(System.currentTimeMillis() / 1000L);
// AuthenticatorBuilder<JWTAuthenticator> authenticatorBuilder =
// new JWTAuthenticator.Builder().nonce(nonce).timestamp(timestamp);
// // 4.发送对应的请求
// try {
// ApiResponse response =
// client.meetings().v1AsrDetailsGet(request, authenticatorBuilder);
// logger.info("Response from `MeetingsApi.v1AsrDetailsGet`: \nheader: {}\n{}",
// response.getHeader(), response.getRawBody());
// String rawBodyString = new String(response.getRawBody(), StandardCharsets.UTF_8);
// logger.info("Raw Body (string): {}", rawBodyString);
// try {
// // 解析JSON获取下载URL
// com.fasterxml.jackson.databind.ObjectMapper resultmapper = new com.fasterxml.jackson.databind.ObjectMapper();
// java.util.Map<String, Object> result = resultmapper.readValue(rawBodyString, java.util.Map.class);
// String downloadUrl = ((java.util.List<String>) result.get("download_url")).get(0);
// // 设置保存路径为D盘根目录
// String savePath = "D:/" + meetingId + ".docx";
// String targetPath = "D:/" + meetingId + "纪要" + ".docx";
// // 下载文件
// 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)) {
// byte[] dataBuffer = new byte[1024];
// int bytesRead;
// while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
// fileOutputStream.write(dataBuffer, 0, bytesRead);
// }
}
} catch (Exception e) {
logger.error("下载文件时出错: {}", e.getMessage());
e.printStackTrace();
}
} catch (ClientException e) {
logger.error("Error when calling `MeetingsApi.v1AsrDetailsGet`", e);
throw new RuntimeException(e);
} catch (ServiceException e) {
logger.error("Error when calling `MeetingsApi.v1AsrDetailsGet`", e);
logger.error("Full HTTP response: {}", new String(e.getApiResp().getRawBody()));
throw new RuntimeException(e);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// logger.info("文件下载完成,已保存到 {}", savePath);
// //将文件传送给大模型处理
// try {
// boolean success = MeetingMinutesGenerator.generateMinutesFromWord(
// savePath,
// targetPath,
// "AKIAXFAXF62IWJXGLVEE.LnKInaahcMZG9zLsGMH3nTLOw3S3lK5Vcu0+ifnO",
// "https://bedrock.chatbot.cn/llm/sse-invoke"
// );
//
// if (success) {
// logger.info("会议纪要生成成功!");
// }
// } catch (IOException e) {
// logger.error("错误: {}", e.getMessage());
// }
// //使用邮箱发送邮件
// // 1.获得主持人的腾讯会议userid
// // 2.根据获得的腾讯会议userid获得员工的企业微信userid
// // 3.根据企业微信userid查询员工表获得员工邮箱
// String tid = operatorUserId;
// String wid = userIdMapper.getWidByTid(tid);
// String tenantId = "1806976109082972160";
// String emailAddress = sysUserSysMapper.getCompanyEmail(wid, tenantId);
// if (StringUtils.isEmpty(emailAddress)) {
// logger.info("用户:{}", wid, "没有企业邮箱");
// return;
// }
// Thread.sleep(10000);
// EmailSender emailSender = new EmailSender();
// //response.getRawBody()
//// boolean mailFlag = emailSender.sendEmailWithAttachment(emailAddress,
//// targetPath,
//// "重要文件",
//// "您好:\n" +
//// "\n" +
//// " 附件为您本次会议的会议纪要,烦请下载查看,如需对会议纪要结果进行修改或查看历史会议,可点击下方链接。");
//// if (mailFlag) {
//// logger.info("邮件发送成功");
//// } else {
//// logger.error("邮件发送失败");
//// }
// }
// } catch (Exception e) {
// logger.error("下载文件时出错: {}", e.getMessage());
// e.printStackTrace();
// }
// } catch (ClientException e) {
// logger.error("Error when calling `MeetingsApi.v1AsrDetailsGet`", e);
// throw new RuntimeException(e);
// } catch (ServiceException e) {
// logger.error("Error when calling `MeetingsApi.v1AsrDetailsGet`", e);
// logger.error("Full HTTP response: {}", new String(e.getApiResp().getRawBody()));
// throw new RuntimeException(e);
// }
// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//
//}
package com.cmeeting.ad.controller;
import com.cmeeting.ad.service.UserService;
import com.cmeeting.ad.vo.ApplicationUserVO;
import com.cmeeting.ad.vo.UserVo;
import com.cmeeting.util.IPUtils;
import com.cmeeting.util.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@RestController
@RequestMapping("/admin")
public class UserAdminController {
@Autowired
private UserService userService;
/**
* 授权查询接口
* @param search
* @param type
* @param userType
* @param categoryId
* @param authType
* @return
*/
@GetMapping("/user/list")
public R list(String search, @RequestParam Integer type, @RequestParam Integer userType,
String categoryId, Integer authType) {
return R.ok(userService.list(search, type, userType, categoryId, authType));
}
}
\ No newline at end of file
......@@ -39,18 +39,10 @@ public class SysUserSync implements Serializable {
*/
private String name;
/**
* 姓
*/
private String lastName;
/**
* 部门id(用户同步的时候没有给这个值为默认分类)
*/
private String deptId;
/**
* 名
*/
private String firstName;
/**
* 别名
*/
private String nickName;
......@@ -67,127 +59,9 @@ public class SysUserSync implements Serializable {
*/
private String email;
/**
* 公司邮箱
*/
private String companyEmail;
/**
* 部门
*/
private String department;
/**
* 分机号
*/
private String extensionNumber;
/**
* 工位
*/
private String workStation;
/**
* 人员类型
*/
private String type;
/**
* 国家
*/
private String country;
/**
* 城市
*/
private String city;
/**
* 地区
*/
private String area;
/**
* 直属上级
*/
private String directlySubordinateSuperior;
/**
* 虚线上级
*/
private String dottedLineSuperior;
/**
* 职务
*/
private String position;
/**
* 职级
*/
private String rank;
/**
* 人员状态
*/
private String state;
/**
* 入职日期
*/
private String entryDate;
/**
* 入职类型
*/
private String entryType;
/**
* 试用期
*/
private String probationPeriod;
/**
* 转正日期
*/
private String probationCompletionDate;
/**
* 转正状态
*/
private String probationCompletionType;
/**
* 出生日期
*/
private String birthDate;
/**
* 籍贯
*/
private String nativePlace;
/**
* 民族
*/
private String nationality;
/**
* 婚姻状况
*/
private String maritalStatus;
/**
* 政治面貌
*/
private String politicalOutlook;
/**
* 首次参加工作日期
*/
private String firstWorkDate;
/**
* 用户信息
*/
private Object allFieldParam;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* 租户id
*/
private String tenantId;
@TableField(exist = false)
private String path;
@TableField(exist = false)
private String deptName;
}
package com.cmeeting.ad.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cmeeting.ad.entity.SysTenant;
/**
* <p>
* 租户表 服务类
* </p>
*
* @author robot
* @since 2019-08-10
*/
public interface ISysTenantService extends IService<SysTenant> {
}
// service/UserService.java
package com.cmeeting.ad.service;
import com.cmeeting.ad.entity.RoleTree;
import com.cmeeting.ad.entity.SysMenu;
import com.cmeeting.ad.vo.ApplicationUserVO;
import com.cmeeting.ad.vo.UserVo;
import com.cmeeting.util.R;
import java.util.List;
public interface UserService {
R login(String agentId, String data, String ip);
String auth(String userId, String nick, String role);
Object list(String search, Integer type, Integer userType, String categoryId, Integer authType);
Object tokenAuth(ApplicationUserVO.LoginDecrypt vo);
Object emailAuth(UserVo.Auth vo);
......
package com.cmeeting.ad.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cmeeting.ad.entity.SysTenant;
import com.cmeeting.mapper.tertiary.SysTenantMapper;
import com.cmeeting.ad.service.ISysTenantService;
import org.springframework.stereotype.Service;
/**
* <p>
* 租户表 服务实现类
* </p>
*
* @author robot
* @since 2019-08-10
*/
@Service
public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant> implements ISysTenantService {
}
......@@ -8,13 +8,12 @@ import com.cmeeting.ad.util.SecurityUtil;
import com.cmeeting.ad.vo.UserVo;
import com.cmeeting.constant.RecordTemplateConstant;
import com.cmeeting.exception.RobotBaseException;
import com.cmeeting.mapper.tertiary.AuthMapper;
import com.cmeeting.mapper.primary.AuthMapper;
import com.cmeeting.ad.service.ILdapService;
import com.cmeeting.ad.service.ISysTenantService;
import com.cmeeting.ad.service.UserService;
import com.cmeeting.ad.util.JwtUtil;
import com.cmeeting.constant.UserAdminRouteConstant;
import com.cmeeting.mapper.secondary.SysUserSysMapper;
import com.cmeeting.mapper.primary.SysUserSyncMapper;
import com.cmeeting.pojo.CoreModulePermissions;
import com.cmeeting.util.*;
import com.cmeeting.ad.vo.ApplicationUserVO;
......@@ -58,17 +57,13 @@ public class UserServiceImpl implements UserService {
@Resource
private RedisUtils redisUtils;
@Resource
private ISysTenantService iTenantService;
@Resource
private JwtUtil jwtUtil;
@Resource
private SysUserSysMapper sysUserSysMapper;
private SysUserSyncMapper sysUserSysMapper;
@Resource
private AuthMapper authMapper;
@Resource
private SysUserSysMapper sysUserSyncMapper;
@Value("${isDev}")
private Boolean isDev;
private SysUserSyncMapper sysUserSyncMapper;
@Override
public R login(String agentId, String data, String ip) {
......@@ -81,11 +76,9 @@ public class UserServiceImpl implements UserService {
@Override
public String auth(String userId, String nick, String role) {
HashMap<String, String> stringStringHashMap = new HashMap<>();
SysTenant sysTenant = iTenantService.getById(permissionTenantId);
stringStringHashMap.put("userId", userId);
stringStringHashMap.put("tenantId", permissionTenantId);
stringStringHashMap.put("role", role);
stringStringHashMap.put("language", sysTenant.getLanguage());
stringStringHashMap.put("nick", nick);
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userId, permissionTenantId);
usernamePasswordAuthenticationToken.setDetails(stringStringHashMap);
......@@ -98,25 +91,6 @@ public class UserServiceImpl implements UserService {
return token;
}
@Override
public Object list(String search, Integer type, Integer userType, String categoryId, Integer authType) {
String url = userAdminConfig.getUserAdminDomain() + UserAdminRouteConstant.SysUser.FIND_NAME;
JSONObject body = new JSONObject();
body.put("tenantId", SecurityUtil.getTenantId());
body.put("type", userType);
body.put("categoryId", categoryId);
body.put("search", search);
// 模糊查询
body.put("searchType", 1);
// + "?search=" + UrlEncoderUtil.encode(search.trim())
// + "&type=" + type
// + "&userType=2"
// + "&categoryId=" + categoryId
// + "&targetId=" + targetId;
System.out.println(url);
JSONObject object = HttpClientUtils.httpPost(url, body, UserAdminTokenUtil.getUserAdminToken());
return object;
}
@Override
public Object tokenAuth(ApplicationUserVO.LoginDecrypt vo) {
......@@ -140,11 +114,10 @@ public class UserServiceImpl implements UserService {
List<String> deptPath = new ArrayList<>();
for (CoreModulePermissions authDept : authDepts) {
String deptId = authDept.getRelId();
String tenantId = authDept.getTenantId();
getDeptPath(deptPath, deptId, tenantId);
getDeptPath(deptPath, deptId);
}
//已被授权部门下的userid
List<String> accessUserIds = !CollectionUtils.isEmpty(deptPath) ? sysUserSyncMapper.getUsersByDept(deptPath, permissionTenantId) : new ArrayList<>();
List<String> accessUserIds = !CollectionUtils.isEmpty(deptPath) ? sysUserSyncMapper.getUsersByDept(deptPath) : new ArrayList<>();
if (!accessUserIds.contains(userId)) {
throw new RobotBaseException("您暂无权限");
}
......@@ -167,10 +140,8 @@ public class UserServiceImpl implements UserService {
// }
long expireTimeStamp = Duration.between(now, expireDate).getSeconds();
HashMap<String, String> stringStringHashMap = new HashMap<>();
SysTenant sysTenant = iTenantService.getById(permissionTenantId);
stringStringHashMap.put("userId", userId);
stringStringHashMap.put("tenantId", permissionTenantId);
stringStringHashMap.put("language", sysTenant.getLanguage());
stringStringHashMap.put("nick", nick);
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userId, permissionTenantId);
usernamePasswordAuthenticationToken.setDetails(stringStringHashMap);
......@@ -187,9 +158,7 @@ public class UserServiceImpl implements UserService {
String username = login.getUsername().trim();
boolean auth = iLdapService.authenticate(username, login.getPassword().trim());
if (auth) {
// if(true){
SysUserSync sysUserSync = sysUserSysMapper.selectOne(new LambdaQueryWrapper<SysUserSync>()
.eq(SysUserSync::getTenantId, permissionTenantId)
.eq(SysUserSync::getUserId, username));
if(StringUtils.isEmpty(adminWhiteUsers) || !Arrays.asList(adminWhiteUsers.split(",")).contains(username)){
throw new RobotBaseException("尊敬的用户 ["+sysUserSync.getName()+"],您的账户"+username+"未被授权访问此系统,请联系系统管理员。");
......@@ -205,13 +174,12 @@ public class UserServiceImpl implements UserService {
*
* @param deptPath
* @param deptId
* @param tenantId
*/
private void getDeptPath(List<String> deptPath, String deptId, String tenantId) {
private void getDeptPath(List<String> deptPath, String deptId) {
if (!deptPath.contains(deptId)) {
deptPath.add(deptId);
}
List<String> subDeptIds = sysUserSyncMapper.getSubDeptId(deptId, tenantId);
List<String> subDeptIds = sysUserSyncMapper.getSubDeptId(deptId);
if (CollectionUtils.isEmpty(subDeptIds)) {
return;
}
......@@ -220,7 +188,7 @@ public class UserServiceImpl implements UserService {
//部门id去重
if (!deptPath.contains(subDeptId)) {
deptPath.add(subDeptId);
getDeptPath(deptPath, subDeptId, tenantId);
getDeptPath(deptPath, subDeptId);
}
}
......
package com.cmeeting.config;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
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 javax.sql.DataSource;
// 从数据源配置
@Configuration
@MapperScan(basePackages = "com.cmeeting.mapper.secondary", sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveDataSourceConfig {
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/secondary/*.xml"));
return bean.getObject();
}
@Bean(name = "slaveSqlSessionTemplate")
public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
//package com.cmeeting.config;
//
//import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
//import org.apache.ibatis.session.SqlSessionFactory;
//import org.mybatis.spring.SqlSessionTemplate;
//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 javax.sql.DataSource;
//
//// 从数据源配置
//@Configuration
//@MapperScan(basePackages = "com.cmeeting.mapper.secondary", sqlSessionFactoryRef = "slaveSqlSessionFactory")
//public class SlaveDataSourceConfig {
//
// @Bean(name = "slaveDataSource")
// @ConfigurationProperties(prefix = "spring.datasource.slave")
// public DataSource slaveDataSource() {
// return DataSourceBuilder.create().build();
// }
//
// @Bean(name = "slaveSqlSessionFactory")
// public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
// MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
// bean.setDataSource(dataSource);
// bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/secondary/*.xml"));
// return bean.getObject();
// }
//
// @Bean(name = "slaveSqlSessionTemplate")
// public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
// return new SqlSessionTemplate(sqlSessionFactory);
// }
//}
package com.cmeeting.config;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
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 javax.sql.DataSource;
// 从数据源配置
@Configuration
@MapperScan(basePackages = "com.cmeeting.mapper.tertiary", sqlSessionFactoryRef = "tertiarySqlSessionFactory")
public class TertiaryDataSourceConfig {
@Bean(name = "tertiaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.tertiary")
public DataSource tertiaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "tertiarySqlSessionFactory")
public SqlSessionFactory tertiarySqlSessionFactory(@Qualifier("tertiaryDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/tertiary/*.xml"));
return bean.getObject();
}
@Bean(name = "tertiarySqlSessionTemplate")
public SqlSessionTemplate tertiarySqlSessionTemplate(@Qualifier("tertiarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
//package com.cmeeting.config;
//
//import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
//import org.apache.ibatis.session.SqlSessionFactory;
//import org.mybatis.spring.SqlSessionTemplate;
//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 javax.sql.DataSource;
//
//// 从数据源配置
//@Configuration
//@MapperScan(basePackages = "com.cmeeting.mapper.tertiary", sqlSessionFactoryRef = "tertiarySqlSessionFactory")
//public class TertiaryDataSourceConfig {
//
// @Bean(name = "tertiaryDataSource")
// @ConfigurationProperties(prefix = "spring.datasource.tertiary")
// public DataSource tertiaryDataSource() {
// return DataSourceBuilder.create().build();
// }
//
// @Bean(name = "tertiarySqlSessionFactory")
// public SqlSessionFactory tertiarySqlSessionFactory(@Qualifier("tertiaryDataSource") DataSource dataSource) throws Exception {
// MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
// bean.setDataSource(dataSource);
// bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/tertiary/*.xml"));
// return bean.getObject();
// }
//
// @Bean(name = "tertiarySqlSessionTemplate")
// public SqlSessionTemplate tertiarySqlSessionTemplate(@Qualifier("tertiarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
// return new SqlSessionTemplate(sqlSessionFactory);
// }
//}
package com.cmeeting.constant;
/**
* CIMC api 常量类
*/
public interface CimcConstants {
//API地址(测试)
//1. 获取组织标准信息
String GET_TEST_ORGANIZATION = "https://apipoc1.cimc.com/env-101/por-101/hrapi/hrms/cimc_org_unit_wbs_standard.service?p_user=USER&p_password=PASSWORD&apikey=API_KEY&p_page_num=PAGE_NUM";
//获取岗位标准信息
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 = "";
}
package com.cmeeting.controller;
import com.cmeeting.dto.CimcOrganization;
import com.cmeeting.util.CimcUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/cimc")
public class CimcController {
@Resource
private CimcUtil cimcUtil;
/**
* 测试服务器能否访问中集AD
*/
@GetMapping("/testSSL")
public void testSSL() {
cimcUtil.testSSLTimeout(1, CimcOrganization.class);
}
}
......@@ -28,7 +28,7 @@ public class SysUseSyncController {
}
@GetMapping("/list")
public R list(@RequestParam String categoryId, @RequestParam Integer current, @RequestParam Integer size, String search) {
return R.ok(iSysUserSyncService.selectPage(current, size, categoryId, tenantId, search));
return R.ok(iSysUserSyncService.selectPage(current, size, categoryId, search));
}
}
package com.cmeeting.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* (CimcEmployee)实体类
*
* @author makejava
* @since 2023-11-11 18:57:51
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CimcEmployee implements Serializable {
private static final long serialVersionUID = 622198806836696239L;
private String id;
/**
* 员工id
*/
private String employeeId;
/**
* 办公电话
*/
private String officePhone;
/**
* 本地住址
*/
private String cityAddress;
/**
* 出生日期
*/
private Date bornDate;
/**
* 第二外语
*/
private String firstForeignLanguage;
/**
* 第二外语水平
*/
private String firstForeignLevel;
/**
* 第一外语
*/
private String secondForeignLanguage;
/**
* 第一外语水平
*/
private String secondForeignLevel;
/**
* 电子邮件
*/
private String email;
/**
* 岗位名称
*/
private String positionName;
/**
* 岗位编码
*/
private String masterPositionId;
/**
* 岗位编制性质
*/
private String positionEmpType;
/**
* 工种
*/
private String positionType;
/**
* 公司工号
*/
private String companyCode;
/**
* 公司ID
*/
private String companyId;
/**
* 公司名称
*/
private String companyName;
/**
* 国籍
*/
private String nationality;
/**
* 户口类型
*/
private String homeTownTypeName;
/**
* 户口所在地
*/
private String homeTown;
/**
* 婚姻状况
*/
private String marriageStatus;
/**
* 籍贯
*/
private Object nativePlace;
/**
* 集团工号
*/
private String employeeCode;
/**
* 家庭地址
*/
private String homeAddress;
/**
* 家庭电话
*/
private String homePhone;
/**
* 驾照
*/
private String drivelicenseName;
/**
* 兼职岗位
*/
private String assignPosition;
/**
* 兼职岗位ID
*/
private String assignPositionId;
/**
* 紧急联系人
*/
private String fireConnectPerson;
/**
* 紧急联系人电话
*/
private String firePhone;
/**
* 进入集团日期
*/
private Date joinGroupDate;
/**
* 离职备注
*/
private Object dismissionMemo;
/**
* 离职操作日期
*/
private Date dismissonCreationDate;
/**
* 离职类型
*/
private String dismissionType;
/**
* 离职前部门
*/
private String dismissionUnitName;
/**
* 离职前岗位
*/
private String dismissionPositionName;
/**
* 离职前岗位编制性质
*/
private String dismissionEmployeeType;
/**
* 离职前工种
*/
private String dismissionPositionType;
/**
* 离职前职能
*/
private String dismissionJobFunction;
/**
* 离职前状态
*/
private Object dismissionBeforeStatus;
/**
* 离职去向
*/
private Object dismissionToPlace;
/**
* 离职日期
*/
private Date dismissionDate;
/**
* 离职原因
*/
private String dismissionReason;
/**
* 民族
*/
private String nativeplace;
/**
* 母语
*/
private String matherLanguage;
/**
* 迁本地户口日期
*/
private Date toCityDate;
/**
* 入党日期
*/
private Date joinPartyDate;
/**
* 入职日期
*/
private Date joinDate;
/**
* 身份证失效日期
*/
private Date certificateDateTo;
/**
* 实际转正日期
*/
private Date formulaDate;
/**
* 试用结束日期
*/
private Date trialBeginDate;
/**
* 试用开始日期
*/
private Date trialEndDate;
/**
* 首次工作日期
*/
private Date firstWorkDate;
/**
* 所属产业
*/
private String propertyName;
/**
* 性别
*/
private String sexName;
/**
* 姓名
*/
private String employeeName;
/**
* 最高学位
*/
private String degree;
/**
* 血型
*/
private String bloodType;
/**
* 一级部门
*/
private String branchUnitName;
/**
* 移动电话号码
*/
private String mobil;
/**
* 英文名
*/
private String eName;
/**
* 员工类型
*/
private String empType;
/**
* 员工状态
*/
private String curStatusName;
/**
* 政治面貌
*/
private String politicsStatus;
/**
* 证件编号
*/
private String certificateId;
/**
* 证件类型
*/
private String certificateType;
/**
* 职能
*/
private String jobFunction;
/**
* 组织编码
*/
private String unitId;
/**
* 组织名称
*/
private String unitName;
/**
* 最高学历
*/
private String graduate;
/**
* 学校
*/
private String collegeName;
/**
* 专业
*/
private String specialName;
/**
* 招聘来源id
*/
private String govRecruitSource;
/**
* 招聘来源名称
*/
private String recruitSource;
/**
* 创建者
*/
private String createdBy;
/**
* 创建日期
*/
private Date creationDate;
/**
* 最后更新者
*/
private String lastUpdatedBy;
/**
* 最后更新日期
*/
private Date lastUpdateDate;
}
package com.cmeeting.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* 中集·组织·标准信息(CimcOrganization)实体类
*
* @author makejava
* @since 2023-11-11 17:06:35
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CimcOrganization implements Serializable {
private static final long serialVersionUID = -81161130857632176L;
private String id;
/**
* 组织id
*/
private String unitId;
/**
* 组织名称
*/
private String unitName;
/**
* 父组织id
*/
private String parentId;
/**
* 组织管理岗位名称
*/
private String managerPositionName;
/**
* 组织级别id
*/
private String levelId;
/**
* 组织级别名称
*/
private String levelName;
/**
* 组织描述
*/
private String unitDescription;
/**
* 公司id
*/
private String companyId;
/**
* 公司名称
*/
private String companyName;
/**
* 顺序号
*/
private String searchIndex;
/**
* 是否公司管理层
*/
private String isMgmtUnit;
/**
* 干部管理权责
*/
private String isOwnedUnit;
/**
* 创建者id
*/
private String createdBy;
/**
* 创建日期
*/
private Date creationDate;
/**
* 最后修改者
*/
private String lastUpdatedBy;
/**
* 最后修改日期
*/
private Date lastUpdateDate;
/**
* 组织管理岗位ID
*/
private String managerPosition;
}
package com.cmeeting.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* 中集岗位标准信息(CimcPost)实体类
*
* @author makejava
* @since 2023-11-11 17:06:41
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CimcPost implements Serializable {
private static final long serialVersionUID = -26027491730988650L;
private String id;
/**
* 岗位id
*/
private String positionId;
/**
* 岗位名称
*/
private String positionName;
/**
* 上级岗位id
*/
private String responseToId;
/**
* 公司id
*/
private String companyId;
/**
* 公司名称
*/
private String companyName;
/**
* 组织id
*/
private String unitId;
/**
* 组织名称
*/
private String unitName;
/**
* 岗位描述
*/
private Object positionDescription;
/**
* 定编人数
*/
private String plannedHolderNum;
/**
* 在编人数
*/
private String currentHolderNum;
/**
* 岗位编制性质
*/
private String positionType;
/**
* 职族
*/
private String zhizuId;
/**
* 职类
*/
private String zhileiId;
/**
* 职层
*/
private String zhicengId;
/**
* 集团职能
*/
private String zhinengId;
/**
* 集团工种
*/
private String gongzhongId;
/**
* 板块职能
*/
private String bkZhinengId;
/**
* 板块工种
*/
private String bkGongzhongId;
/**
* 创建者id
*/
private String createdBy;
/**
* 创建日期
*/
private Date creationDate;
/**
* 最后修改者
*/
private String lastUpdatedBy;
/**
* 最后修改日期
*/
private Date lastUpdateDate;
}
package com.cmeeting.job;
import cn.hutool.core.collection.CollUtil;
import com.azure.core.credential.AccessToken;
import com.azure.core.credential.TokenRequestContext;
import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cmeeting.config.StatisticsEmailPushProperties;
import com.cmeeting.constant.MeetingState;
import com.cmeeting.dto.UserDTO;
import com.cmeeting.email.EmailSender;
import com.cmeeting.exception.RobotBaseException;
import com.cmeeting.mapper.primary.UserIdMapper;
import com.cmeeting.pojo.MeetingInfo;
import com.cmeeting.pojo.UserId;
import com.cmeeting.pojo.WeComUser;
import com.cmeeting.service.*;
import com.cmeeting.service.impl.CimcService;
import com.cmeeting.util.RedisUtils;
import com.cmeeting.vo.EmailPush;
import com.cmeeting.vo.StatisticsEmailPush;
import com.cmeeting.vo.TencentMeetingVO;
import com.microsoft.graph.authentication.TokenCredentialAuthProvider;
import com.microsoft.graph.models.*;
import com.microsoft.graph.requests.AttachmentCollectionPage;
import com.microsoft.graph.requests.AttachmentCollectionResponse;
import com.microsoft.graph.requests.GraphServiceClient;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Request;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
......@@ -71,6 +52,9 @@ public class CmeetingJob {
private MeetingRecordTemplateService meetingRecordTemplateService;
@Resource
private UserIdMapper userIdMapper;
@Resource
private CimcService cimcService;
@Value("${isDev}")
private Boolean isDev;
@Resource
......@@ -78,20 +62,6 @@ public class CmeetingJob {
@Resource
private EmailSender emailSender;
// @PostConstruct
public void weComUserInit() {
weComUserSync();
}
// @PostConstruct
public void tencentUserInit() {
TencentUserSync();
}
// @PostConstruct
public void userBindInit() {
userBind();
}
/**
* 企微人员定时同步
......@@ -101,7 +71,7 @@ public class CmeetingJob {
if (isDev) {
return;
}
if (!redisUtils.setnx("weComUserSync", "weComUserSync", 20 * 60 * 60)){
if (!redisUtils.setnx("weComUserSync", "weComUserSync", 20 * 60 * 60)) {
return;
}
try {
......@@ -125,7 +95,7 @@ public class CmeetingJob {
if (isDev) {
return;
}
if (!redisUtils.setnx("TencentUserSync", "TencentUserSync", 20 * 60 * 60)){
if (!redisUtils.setnx("TencentUserSync", "TencentUserSync", 20 * 60 * 60)) {
return;
}
try {
......@@ -149,7 +119,7 @@ public class CmeetingJob {
if (isDev) {
return;
}
if (!redisUtils.setnx("userBind", "userBind", 20 * 60 * 60)){
if (!redisUtils.setnx("userBind", "userBind", 20 * 60 * 60)) {
return;
}
try {
......@@ -172,7 +142,7 @@ public class CmeetingJob {
if (isDev) {
return;
}
if (!redisUtils.setnx("Scheduled-All", "Scheduled-All", 18 * 60)){
if (!redisUtils.setnx("Scheduled-All", "Scheduled-All", 18 * 60)) {
return;
}
try {
......@@ -204,7 +174,7 @@ public class CmeetingJob {
// 提交处理任务
producer.submitBatchTasks(meetingFiles, authorizedUsers, tidWidRelations, Boolean.FALSE);
} catch (Exception e){
} catch (Exception e) {
e.printStackTrace();
} finally {
redisUtils.del("Scheduled-All");
......@@ -215,12 +185,12 @@ public class CmeetingJob {
/**
* 定时扫描早于一小时之前的,所有未重试过的会议,重新生成纪要
*/
@Scheduled(fixedRate = 30 * 60 * 1000,initialDelay = 10 * 60 * 1000)
@Scheduled(fixedRate = 30 * 60 * 1000, initialDelay = 10 * 60 * 1000)
public void meetingMinutesRetry() {
if (isDev) {
return;
}
if (!redisUtils.setnx("Scheduled-retry", "Scheduled-retry", 28 * 60)){
if (!redisUtils.setnx("Scheduled-retry", "Scheduled-retry", 28 * 60)) {
return;
}
try {
......@@ -231,11 +201,11 @@ public class CmeetingJob {
// 不能用status筛选,因为可能线程执行一般服务终止,status状态没变
List<MeetingInfo> meetingInfoList =
meetingInfoService.list(new LambdaQueryWrapper<MeetingInfo>()
.eq(MeetingInfo::getEmailPushAccess,Boolean.TRUE)
.eq(MeetingInfo::getEmailGenerateAccess,Boolean.TRUE)
.eq(MeetingInfo::getIsGenerated,Boolean.FALSE)
.eq(MeetingInfo::getGenerateRetry,Boolean.FALSE)
.le(MeetingInfo::getSyncTime,LocalDateTime.now().minusHours(1))
.eq(MeetingInfo::getEmailPushAccess, Boolean.TRUE)
.eq(MeetingInfo::getEmailGenerateAccess, Boolean.TRUE)
.eq(MeetingInfo::getIsGenerated, Boolean.FALSE)
.eq(MeetingInfo::getGenerateRetry, Boolean.FALSE)
.le(MeetingInfo::getSyncTime, LocalDateTime.now().minusHours(1))
);
if (meetingInfoList == null || meetingInfoList.isEmpty()) {
......@@ -271,12 +241,12 @@ public class CmeetingJob {
/**
* 定时扫描早于一小时之前的,所有邮件推送未重试过的会议,重新推送邮件
*/
@Scheduled(fixedRate = 10 * 60 * 1000,initialDelay = 1 * 60 * 1000)
@Scheduled(fixedRate = 10 * 60 * 1000, initialDelay = 1 * 60 * 1000)
public void emailPushRetry() {
if (isDev) {
return;
}
if (!redisUtils.setnx("Scheduled-email-retry", "Scheduled-email-retry", 28 * 60)){
if (!redisUtils.setnx("Scheduled-email-retry", "Scheduled-email-retry", 28 * 60)) {
return;
}
try {
......@@ -285,11 +255,11 @@ public class CmeetingJob {
//查出所有早于一小时前的,邮件推送失败且未重试过的会议
List<MeetingInfo> meetingInfoList =
meetingInfoService.list(new LambdaQueryWrapper<MeetingInfo>()
.eq(MeetingInfo::getEmailPushAccess,Boolean.TRUE)
.eq(MeetingInfo::getIsGenerated,Boolean.TRUE)
.eq(MeetingInfo::getIsPushed,Boolean.FALSE)
.eq(MeetingInfo::getPushRetry,Boolean.FALSE)
.le(MeetingInfo::getSyncTime,LocalDateTime.now().minusHours(1))
.eq(MeetingInfo::getEmailPushAccess, Boolean.TRUE)
.eq(MeetingInfo::getIsGenerated, Boolean.TRUE)
.eq(MeetingInfo::getIsPushed, Boolean.FALSE)
.eq(MeetingInfo::getPushRetry, Boolean.FALSE)
.le(MeetingInfo::getSyncTime, LocalDateTime.now().minusHours(1))
);
if (meetingInfoList == null || meetingInfoList.isEmpty()) {
......@@ -326,12 +296,13 @@ public class CmeetingJob {
@Value(value = "${tencent.base-save-path}")
private String savePath;
@Scheduled(cron = "50 59 7,9,11,13,15,17,19,21,23 * * ?")
public void emailStatisticsPush() {
if (isDev) {
return;
}
if (!redisUtils.setnx("emailStatisticsPush", "emailStatisticsPush", 60 * 60)){
if (!redisUtils.setnx("emailStatisticsPush", "emailStatisticsPush", 60 * 60)) {
return;
}
log.info("推送统计邮件开始!");
......@@ -381,4 +352,14 @@ public class CmeetingJob {
log.info("推送统计邮件完成!");
}
/**
* 每天6点执行一次
*/
@Scheduled(cron = "0 0 6 * * ? ")
public void pullAllDate() {
cimcService.pullCimcData();
}
}
package com.cmeeting.mapper.tertiary;
package com.cmeeting.mapper.primary;
import com.cmeeting.pojo.CoreModulePermissions;
import org.apache.ibatis.annotations.Mapper;
......
//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> {
//
//}
package com.cmeeting.mapper.secondary;
package com.cmeeting.mapper.primary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cmeeting.pojo.SysUserSyncCategory;
......
package com.cmeeting.mapper.secondary;
package com.cmeeting.mapper.primary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
......@@ -15,31 +15,30 @@ import java.util.List;
import java.util.Map;
@Mapper
public interface SysUserSysMapper extends BaseMapper<SysUserSync> {
String getCompanyEmail(String wid, String tenantId);
public interface SysUserSyncMapper extends BaseMapper<SysUserSync> {
String getParentDeptId(@Param(value = "deptId")String deptId,@Param(value = "tenantId") String tenantId);
String getParentDeptId(@Param(value = "deptId")String deptId);
List<UserDTO> getUserEmail(@Param(value = "tenantId")String tenantId);
List<UserDTO> getUserEmail();
List<SysUserSync> getSimpleUserList(@Param(value = "tenantId")String tenantId);
List<SysUserSync> getSimpleUserList();
List<SysDept> getSimpleDeptList(@Param(value = "tenantId")String tenantId);
List<SysDept> getSimpleDeptList();
List<String> getSubDeptId(@Param(value = "deptId")String deptId,@Param(value = "tenantId")String tenantId);
List<String> getSubDeptId(@Param(value = "deptId")String deptId);
List<String> getUsersByDept(@Param(value = "deptIds") List<String> deptIds,@Param(value = "tenantId")String tenantId);
List<String> getUsersByDept(@Param(value = "deptIds") List<String> deptIds);
List<PermissionCheckedDTO.User> findName(@Param("deptIds") List<String> deptIds, @Param("categoryId") String categoryId, @Param("search") String search,
@Param("tenantId") String tenantId, @Param("userList") List<String> userList);
@Param("userList") List<String> userList);
List<PermissionCheckedDTO.User> findInUserIdsOrShareCateIds(@Param("userIds") List<String> userIds, @Param("shareCateIds") List<String> shareCateIds,
@Param("tenantId") String tenantId, @Param("search") String search);
@Param("search") String search);
List<PermissionCheckedDTO.User> findByParam(@Param("userIds") List<String> userIds, @Param("notInCateIds") List<String> notInCateIds, @Param("cateIds") List<String> shareCateIds,
@Param("tenantId") String tenantId, @Param("search") String search, @Param("categoryId") String categoryId);
@Param("search") String search, @Param("categoryId") String categoryId);
Page<SysUserSyncDTO> selectByDeptId(@Param("deptIds") List<String> deptIds, @Param("tenantId") String tenantId,
Page<SysUserSyncDTO> selectByDeptId(@Param("deptIds") List<String> deptIds,
@Param("page") Page page, @Param("search") String search);
/**
......@@ -50,7 +49,6 @@ public interface SysUserSysMapper extends BaseMapper<SysUserSync> {
* @return
*/
@MapKey("userId")
List<Map<String, String>> selectParamByUserIdList(@Param("tenantId") String tenantId,
@Param("searchValue") String searchValue,
List<Map<String, String>> selectParamByUserIdList(@Param("searchValue") String searchValue,
@Param("userIdList") List<String> userIdList);
}
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> {
}
package com.cmeeting.mapper.secondary;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface SysUserMapper {
String getUserDeptPath(@Param("userId") String userId);
}
package com.cmeeting.mapper.tertiary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cmeeting.ad.entity.SysTenant;
/**
* <p>
* 租户表 Mapper 接口
* </p>
*
* @author robot
* @since 2019-08-10
*/
public interface SysTenantMapper extends BaseMapper<SysTenant> {
}
......@@ -45,10 +45,6 @@ public class SysUserSyncCategory implements Serializable {
*/
private String nameEn;
/**
* 平台类型 QWX=企业微信, DD=钉钉,FS=飞书
*/
private String platformType;
/**
* 部门领导,多个领导用逗号隔开
*/
private String departmentLeader;
......@@ -61,16 +57,8 @@ public class SysUserSyncCategory implements Serializable {
*/
private Integer sortNo;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 租户id
*/
private String tenantId;
// private String tenantId;
@TableField(exist = false)
private List<SysUserSyncCategory> children;
}
package com.cmeeting.service;
import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cmeeting.dto.PermissionCheckedDTO;
import com.cmeeting.pojo.ShareUser;
import java.util.List;
/**
* (ShareUser)表服务接口
*
* @author makejava
* @since 2025-01-16 14:50:15
*/
public interface IShareUserService extends IService<ShareUser>{
PermissionCheckedDTO findName(String categoryId, String search, String tenantId, List<String> categoryList, List<String> userList);
}
//package com.cmeeting.service;
//
//import cn.hutool.core.lang.tree.Tree;
//import com.baomidou.mybatisplus.extension.service.IService;
//import com.cmeeting.dto.PermissionCheckedDTO;
//import com.cmeeting.pojo.ShareUser;
//
//import java.util.List;
//
///**
// * (ShareUser)表服务接口
// *
// * @author makejava
// * @since 2025-01-16 14:50:15
// */
//public interface IShareUserService extends IService<ShareUser>{
//
//
// PermissionCheckedDTO findName(String categoryId, String search, String tenantId, List<String> categoryList, List<String> userList);
//}
......@@ -35,11 +35,11 @@ public interface SysUserSyncService extends IService<SysUserSync> {
List<SysUserSyncCategory> getCategoryListByUserId(String userId);
PermissionCheckedDTO listByCategoryId(String categoryId, String search, String tenantId, List<String> categoryList, List<String> userList);
PermissionCheckedDTO listByCategoryId(String categoryId, String search, List<String> categoryList, List<String> userList);
List<PermissionCheckedDTO.User> findInUserIdsOrShareCateIds(List<String> userIds, List<String> shareCateIds, String tenantId, String search);
List<PermissionCheckedDTO.User> findInUserIdsOrShareCateIds(List<String> userIds, List<String> shareCateIds, String search);
List<PermissionCheckedDTO.User> findByParam(List<String> userIds, List<String> notInCateIds, List<String> shareCateIds, String tenantId, String search, String categoryId);
List<PermissionCheckedDTO.User> findByParam(List<String> userIds, List<String> notInCateIds, List<String> shareCateIds, String search, String categoryId);
Page<SysUserSyncDTO> selectPage(Integer current, Integer size, String categoryId, String tenantId, String search);
Page<SysUserSyncDTO> selectPage(Integer current, Integer size, String categoryId, String search);
}
package com.cmeeting.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cmeeting.ad.entity.SysUserSync;
import com.cmeeting.dto.CimcEmployee;
import com.cmeeting.dto.CimcOrganization;
import com.cmeeting.pojo.SysUserSyncCategory;
import com.cmeeting.service.ISysUserSyncCategoryService;
import com.cmeeting.service.SysUserSyncService;
import com.cmeeting.util.CimcUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class CimcService {
@Resource
private ISysUserSyncCategoryService iSysUserSyncCategoryService;
@Resource
private SysUserSyncService SysUserSyncService;
@Resource
private CimcUtil cimcUtil;
public void initCimcData(){
iSysUserSyncCategoryService.remove(new LambdaQueryWrapper<>());
SysUserSyncService.remove(new LambdaQueryWrapper<>());
}
@Transactional(rollbackFor = Exception.class)
public void pullCimcData() {
initCimcData();
int i = 1;
while (true) {
List<CimcOrganization> deptList = cimcUtil.getDataByClass(i, CimcOrganization.class);
if (deptList == null || deptList.size() == 0) {
log.info("该页没有数据, i: {}", i);
break;
}
log.info("获取到数据, size: {}", deptList.size());
List<SysUserSyncCategory> data = new ArrayList<>();
for (CimcOrganization organizations : deptList) {
SysUserSyncCategory o = new SysUserSyncCategory();
o.setName(organizations.getUnitName());
o.setDeptId(organizations.getUnitId());
o.setParentId(organizations.getParentId());
data.add(o);
}
iSysUserSyncCategoryService.saveBatch(data);
i++;
}
i = 1;
while (true) {
List<CimcEmployee> userList = cimcUtil.getDataByClass(i, CimcEmployee.class);
if (userList == null || userList.size() == 0) {
log.info("该页没有数据, i: {}", i);
break;
}
log.info("获取到数据, size: {}", userList.size());
List<SysUserSync> sysUserSyncs = new ArrayList<>();
for (CimcEmployee employee : userList) {
SysUserSync sysUserSync = SysUserSync.builder()
.userId(employee.getEmployeeCode()).name(employee.getEmployeeName()).deptId(employee.getUnitId())
.email(employee.getEmail()).department(employee.getUnitName()).build();
sysUserSyncs.add(sysUserSync);
}
SysUserSyncService.saveBatch(sysUserSyncs);
i++;
}
}
}
......@@ -31,7 +31,7 @@ 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.mapper.secondary.SysUserSysMapper;
import com.cmeeting.mapper.primary.SysUserSyncMapper;
import com.cmeeting.pojo.MeetingInfo;
import com.cmeeting.pojo.MeetingRecordTemplate;
import com.cmeeting.pojo.UserId;
......@@ -109,7 +109,7 @@ public class MeetingInfoServiceImpl extends ServiceImpl<MeetingInfoMapper, Meeti
@Resource
private UserIdMapper userIdMapper;
@Autowired
private SysUserSysMapper sysUserSysMapper;
private SysUserSyncMapper sysUserSysMapper;
@Value("${aec.key}")
public String aesKey;
......@@ -304,7 +304,7 @@ public class MeetingInfoServiceImpl extends ServiceImpl<MeetingInfoMapper, Meeti
}
// 获取用户信息
List<String> userIdList = statisticsList.stream().map(map -> map.get("userId")).collect(Collectors.toList());
List<Map<String, String>> userInfoList = sysUserSysMapper.selectParamByUserIdList(permissionTenantId, searchValue, userIdList);
List<Map<String, String>> userInfoList = sysUserSysMapper.selectParamByUserIdList(searchValue, userIdList);
for (Map<String, String> userInfo : userInfoList) {
String userId = userInfo.get("userId");
......
......@@ -24,7 +24,7 @@ import com.cmeeting.dto.RecordTemplateDto;
import com.cmeeting.dto.UserDTO;
import com.cmeeting.exception.RobotBaseException;
import com.cmeeting.mapper.primary.*;
import com.cmeeting.mapper.secondary.SysUserSysMapper;
import com.cmeeting.mapper.primary.SysUserSyncMapper;
import com.cmeeting.pojo.*;
import com.cmeeting.service.MeetTemplateEnableService;
import com.cmeeting.service.MeetingRecordTemplateService;
......@@ -58,7 +58,7 @@ public class MeetingRecordTemplateServiceImpl extends ServiceImpl<MeetingRecordT
@Resource
private RecordTemplatePermissionMapper permissionMapper;
@Resource
private SysUserSysMapper sysUserSysMapper;
private SysUserSyncMapper sysUserSysMapper;
@Autowired
private MeetTypeMapper meetTypeMapper;
@Resource
......@@ -123,7 +123,7 @@ public class MeetingRecordTemplateServiceImpl extends ServiceImpl<MeetingRecordT
resultList.addAll(customTemplateList);
List<MeetingRecordTemplate> records = getUsersByOffset(resultList, current, size);
if (!CollectionUtils.isEmpty(records)) {
List<SysUserSync> simpleUserList = sysUserSysMapper.getSimpleUserList(user.getTenantId());
List<SysUserSync> simpleUserList = sysUserSysMapper.getSimpleUserList();
Map<String, String> simpleUserMap = CollectionUtils.isEmpty(simpleUserList)
? new HashMap<>() : simpleUserList.stream().collect(Collectors.toMap(SysUserSync::getUserId, SysUserSync::getName));
for (MeetingRecordTemplate record : records) {
......@@ -202,9 +202,9 @@ public class MeetingRecordTemplateServiceImpl extends ServiceImpl<MeetingRecordT
List<String> deptPath = new ArrayList<>();
for (RecordTemplatePermission deptPermission : deptPermissions) {
String deptId = deptPermission.getRelId();
getDeptPath(deptPath, deptId, permissionTenantId);
getDeptPath(deptPath, deptId);
}
List<String> usersByDept = sysUserSysMapper.getUsersByDept(deptPath, permissionTenantId);
List<String> usersByDept = sysUserSysMapper.getUsersByDept(deptPath);
if (!CollectionUtils.isEmpty(usersByDept))
authorizedUsers.addAll(usersByDept);
}
......@@ -556,16 +556,16 @@ public class MeetingRecordTemplateServiceImpl extends ServiceImpl<MeetingRecordT
* @param deptPath
* @param deptId
*/
private void getDeptPath(List<String> deptPath, String deptId, String tenantId) {
private void getDeptPath(List<String> deptPath, String deptId) {
if (!deptPath.contains(deptId)) deptPath.add(deptId);
List<String> subDeptIds = sysUserSysMapper.getSubDeptId(deptId, tenantId);
List<String> subDeptIds = sysUserSysMapper.getSubDeptId(deptId);
if (CollectionUtils.isEmpty(subDeptIds)) return;
for (String subDeptId : subDeptIds) {
//部门id去重
if (!deptPath.contains(subDeptId)) {
deptPath.add(subDeptId);
getDeptPath(deptPath, subDeptId, tenantId);
getDeptPath(deptPath, subDeptId);
}
}
......
......@@ -2,32 +2,25 @@ package com.cmeeting.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cmeeting.ad.entity.RobotSecurityUser;
import com.cmeeting.ad.util.SecurityUtil;
import com.cmeeting.constant.CategoryConstant;
import com.cmeeting.constant.PermissionPruposeType;
import com.cmeeting.constant.RecordTemplateConstant;
import com.cmeeting.constant.UserTypeConstant;
import com.cmeeting.dto.PermissionCheckedDTO;
import com.cmeeting.exception.RobotBaseException;
import com.cmeeting.mapper.primary.ModulePermissionMapper;
import com.cmeeting.pojo.ModulePermission;
import com.cmeeting.service.IShareUserService;
import com.cmeeting.service.ModulePermissionService;
import com.cmeeting.mapper.primary.ModulePermissionMapper;
import com.cmeeting.service.SysUserSyncService;
import com.cmeeting.vo.AuthVO;
import com.cmeeting.vo.PermissionVO;
import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author Administrator
......@@ -40,8 +33,8 @@ public class ModulePermissionServiceImpl extends ServiceImpl<ModulePermissionMap
@Resource
private SysUserSyncService iSysUserSyncService;
@Resource
private IShareUserService iShareUserService;
// @Resource
// private IShareUserService iShareUserService;
@Override
public PermissionCheckedDTO permissionList(String search, String categoryId, Integer userType, Integer purpose, Integer targetId, List<String> categoryIdList, List<String> userIdList) {
......@@ -83,20 +76,21 @@ public class ModulePermissionServiceImpl extends ServiceImpl<ModulePermissionMap
@Override
public PermissionCheckedDTO permissionList(String search, String categoryId, Integer userType, Integer purpose, List<String> categoryList, List<String> userList) {
PermissionCheckedDTO dto = new PermissionCheckedDTO();
if (userType != null) {
if (userType == UserTypeConstant.SYNC) {
dto = iSysUserSyncService.listByCategoryId(categoryId, search, SecurityUtil.getTenantId(), categoryList, userList);
} else if (userType == UserTypeConstant.ADMIN) {
dto = iShareUserService.findName(categoryId, search, SecurityUtil.getTenantId(), categoryList, userList);
}
} else {
dto = iSysUserSyncService.listByCategoryId(categoryId, search, SecurityUtil.getTenantId(), categoryList, userList);
PermissionCheckedDTO dto1 = iShareUserService.findName(categoryId, search, SecurityUtil.getTenantId(), categoryList, userList);
dto.getUserList().addAll(dto1.getUserList());
dto.getCategoryList().addAll(dto1.getCategoryList());
}
return dto;
return iSysUserSyncService.listByCategoryId(categoryId, search, categoryList, userList);
// PermissionCheckedDTO dto = new PermissionCheckedDTO();
// if (userType != null) {
// if (userType == UserTypeConstant.SYNC) {
// dto = iSysUserSyncService.listByCategoryId(categoryId, search, categoryList, userList);
// } else if (userType == UserTypeConstant.ADMIN) {
// dto = iShareUserService.findName(categoryId, search, SecurityUtil.getTenantId(), categoryList, userList);
// }
// } else {
// dto = iSysUserSyncService.listByCategoryId(categoryId, search, categoryList, userList);
// PermissionCheckedDTO dto1 = iShareUserService.findName(categoryId, search, SecurityUtil.getTenantId(), categoryList, userList);
// dto.getUserList().addAll(dto1.getUserList());
// dto.getCategoryList().addAll(dto1.getCategoryList());
// }
// return dto;
}
@Override
......
......@@ -17,7 +17,7 @@ import com.cmeeting.ad.entity.SysUserSync;
import com.cmeeting.ad.util.SecurityUtil;
import com.cmeeting.exception.RobotBaseException;
import com.cmeeting.mapper.primary.RecordTemplatePermissionMapper;
import com.cmeeting.mapper.secondary.SysUserSysMapper;
import com.cmeeting.mapper.primary.SysUserSyncMapper;
import com.cmeeting.pojo.MeetingInfo;
import com.cmeeting.pojo.MeetingRecordTemplate;
import com.cmeeting.pojo.RecordTemplatePermission;
......@@ -61,7 +61,7 @@ public class RecordTemplatePermissionServiceImpl extends ServiceImpl<RecordTempl
@Resource
private MeetingInfoService meetingInfoService;
@Resource
private SysUserSysMapper sysUserSysMapper;
private SysUserSyncMapper sysUserSysMapper;
@Resource
private MinioUtils minioUtils;
@Value(value = "${llm.api-addr}")
......@@ -125,10 +125,10 @@ public class RecordTemplatePermissionServiceImpl extends ServiceImpl<RecordTempl
.eq(RecordTemplatePermission::getTemplateId,vo.getTemplateId()));
List<RecordTemplateVO.PermissionItem> permissionItems = new ArrayList<>();
if(!CollectionUtils.isEmpty(permissions)){
List<SysUserSync> simpleUserList = sysUserSysMapper.getSimpleUserList(user.getTenantId());
List<SysUserSync> simpleUserList = sysUserSysMapper.getSimpleUserList();
Map<String, String> simpleUserMap = CollectionUtils.isEmpty(simpleUserList)
? new HashMap<>() : simpleUserList.stream().collect(Collectors.toMap(SysUserSync::getUserId, SysUserSync::getName));
List<SysDept> simpleDeptList = sysUserSysMapper.getSimpleDeptList(user.getTenantId());
List<SysDept> simpleDeptList = sysUserSysMapper.getSimpleDeptList();
Map<String, String> simpleDeptMap = CollectionUtils.isEmpty(simpleDeptList)
? new HashMap<>() : simpleDeptList.stream().collect(Collectors.toMap(SysDept::getDeptId, SysDept::getName));
for (RecordTemplatePermission permission : permissions) {
......
package com.cmeeting.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cmeeting.constant.CategoryConstant;
import com.cmeeting.constant.UserTypeConstant;
import com.cmeeting.dto.PermissionCheckedDTO;
import com.cmeeting.mapper.secondary.ShareUserMapper;
import com.cmeeting.pojo.ShareUser;
import com.cmeeting.pojo.SysUserSyncCategory;
import com.cmeeting.service.IShareUserService;
import com.cmeeting.service.ISysUserSyncCategoryService;
import com.cmeeting.service.SysUserSyncService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* (ShareUser)表服务实现类
*
* @author makejava
* @since 2025-01-16 14:50:15
*/
@Slf4j
@Service
public class ShareUserServiceImpl extends ServiceImpl<ShareUserMapper, ShareUser> implements IShareUserService {
@Resource
private ISysUserSyncCategoryService iSysUserSyncCategoryService;
@Resource
private SysUserSyncService iSysUserSyncService;
@Override
public PermissionCheckedDTO findName(String categoryId, String search, String tenantId, List<String> categoryList, List<String> userList) {
PermissionCheckedDTO dto = new PermissionCheckedDTO();
List<ShareUser> shareUsers = baseMapper.selectList(new LambdaQueryWrapper<ShareUser>().eq(ShareUser::getTenantId, tenantId).select(ShareUser::getRelId, ShareUser::getType));
if (CollUtil.isNotEmpty(shareUsers)) {
//分享给租户的所有分享(直接间接)
List<SysUserSyncCategory> cateList = new ArrayList<>();
List<String> cateIds = shareUsers.stream().filter(e -> e.getType() == 0).map(ShareUser::getRelId).collect(Collectors.toList());
//查询超管的所有分类
List<SysUserSyncCategory> allCategoryIds = iSysUserSyncCategoryService.list(new LambdaQueryWrapper<SysUserSyncCategory>()
.eq(SysUserSyncCategory::getTenantId, "1").select(SysUserSyncCategory::getDeptId, SysUserSyncCategory::getParentId));
if (CollUtil.isNotEmpty(allCategoryIds)) {
Map<String, String> map = allCategoryIds.stream().collect(Collectors.toMap(SysUserSyncCategory::getDeptId, SysUserSyncCategory::getParentId));
for (SysUserSyncCategory category : allCategoryIds) {
String path = iSysUserSyncCategoryService.getPath(category.getDeptId(), map);
if (StrUtil.isNotBlank(path)) {
String[] split = path.split("/");
for (int i = split.length - 1; i >= 0; i--) {
if (StrUtil.isNotBlank(split[i]) && cateIds.contains(split[i])) {
cateList.add(category);
break;
}
}
}
}
}
List<String> shareCateIds = cateList.stream().map(SysUserSyncCategory::getDeptId).collect(Collectors.toList());
if (categoryList != null) {
categoryList.addAll(shareCateIds);
} else {
categoryList = shareCateIds;
}
List<String> noExitParentIds = new ArrayList<>();
List<String> childrenDeptIds = new ArrayList<>();
if (CategoryConstant.ROOT.equals(categoryId)) {
// 查询分类为ROOT即查询所有找不到parentId的分类
Set<String> map = cateList.stream().map(SysUserSyncCategory::getDeptId).collect(Collectors.toSet());
for (SysUserSyncCategory category : cateList) {
if (!map.contains(category.getParentId())) {
noExitParentIds.add(category.getDeptId());
}
}
} else if (StrUtil.isNotBlank(categoryId)) {
Map<String, List<String>> parentMap = cateList.stream().collect(Collectors.groupingBy(SysUserSyncCategory::getParentId, Collectors.mapping(SysUserSyncCategory::getDeptId, Collectors.toList())));
List<String> children = getChildren(parentMap, categoryId);
childrenDeptIds.add(categoryId);
childrenDeptIds.addAll(children);
}
List<SysUserSyncCategory> list = null;
if (CollUtil.isNotEmpty(categoryList)) {
list = iSysUserSyncCategoryService.list(new LambdaQueryWrapper<SysUserSyncCategory>()
.eq(SysUserSyncCategory::getTenantId, "1")
.in(StrUtil.isNotBlank(search) && StrUtil.isNotBlank(categoryId) && !CategoryConstant.ROOT.equals(categoryId) && CollUtil.isNotEmpty(childrenDeptIds), SysUserSyncCategory::getDeptId, childrenDeptIds)
.in(StrUtil.isBlank(search) && CategoryConstant.ROOT.equals(categoryId) && CollUtil.isNotEmpty(noExitParentIds), SysUserSyncCategory::getDeptId, noExitParentIds)
.eq(StrUtil.isBlank(search) && StrUtil.isNotBlank(categoryId) && !CategoryConstant.ROOT.equals(categoryId), SysUserSyncCategory::getParentId, categoryId)
.like(StrUtil.isNotBlank(search), SysUserSyncCategory::getName, search)
.in(SysUserSyncCategory::getDeptId, categoryList) // 指定分类以及分享的所有分享下
.select(SysUserSyncCategory::getDeptId, SysUserSyncCategory::getName)
.orderByAsc(SysUserSyncCategory::getId));
}
List<PermissionCheckedDTO.Category> cates = new ArrayList<>();
if (CollUtil.isNotEmpty(list)) {
list.forEach(ca -> {
PermissionCheckedDTO.Category category = new PermissionCheckedDTO.Category();
category.setId(ca.getDeptId());
category.setName(ca.getName());
category.setUserType(UserTypeConstant.ADMIN);
cates.add(category);
});
}
dto.setCategoryList(cates);
List<PermissionCheckedDTO.User> users = new ArrayList<>();
//所有直接分享的用户
List<String> userIds = shareUsers.stream().filter(e -> e.getType() == 1).map(ShareUser::getRelId).collect(Collectors.toList());
if (CategoryConstant.ROOT_ID.equals(categoryId)) {
if (CollUtil.isNotEmpty(userList)) {
userIds = userIds.stream().filter(userList::contains).collect(Collectors.toList());
}
if (StrUtil.isNotBlank(search)) {
users = iSysUserSyncService.findInUserIdsOrShareCateIds(userIds, shareCateIds, "1", search);
} else {
if (CollUtil.isNotEmpty(userIds)) {
users = iSysUserSyncService.findByParam(userIds, null, null, "1", search, null);
}
}
} else {
if (StrUtil.isNotBlank(search)) {
users = iSysUserSyncService.findByParam(userList, null, childrenDeptIds, "1", search, null);
} else {
users = iSysUserSyncService.findByParam(userList, null, null, "1", search, categoryId);
}
}
if (CollUtil.isNotEmpty(users)) {
for (PermissionCheckedDTO.User user : users) {
user.setUserType(UserTypeConstant.ADMIN);
}
}
dto.setUserList(users);
}
return dto;
}
private List<String> getChildren(Map<String, List<String>> collect, String deptId) {
List<String> ids = new ArrayList<>();
if (collect.containsKey(deptId)) {
List<String> strings = collect.get(deptId);
ids.addAll(strings);
for (String string : strings) {
ids.addAll(getChildren(collect, string));
}
}
return ids;
}
}
//package com.cmeeting.service.impl;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.cmeeting.constant.CategoryConstant;
//import com.cmeeting.constant.UserTypeConstant;
//import com.cmeeting.dto.PermissionCheckedDTO;
//import com.cmeeting.mapper.secondary.ShareUserMapper;
//import com.cmeeting.pojo.ShareUser;
//import com.cmeeting.pojo.SysUserSyncCategory;
//import com.cmeeting.service.IShareUserService;
//import com.cmeeting.service.ISysUserSyncCategoryService;
//import com.cmeeting.service.SysUserSyncService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//import java.util.stream.Collectors;
//
///**
// * (ShareUser)表服务实现类
// *
// * @author makejava
// * @since 2025-01-16 14:50:15
// */
//@Slf4j
//@Service
//public class ShareUserServiceImpl extends ServiceImpl<ShareUserMapper, ShareUser> implements IShareUserService {
//
// @Resource
// private ISysUserSyncCategoryService iSysUserSyncCategoryService;
// @Resource
// private SysUserSyncService iSysUserSyncService;
//
// @Override
// public PermissionCheckedDTO findName(String categoryId, String search, String tenantId, List<String> categoryList, List<String> userList) {
// PermissionCheckedDTO dto = new PermissionCheckedDTO();
//
// List<ShareUser> shareUsers = baseMapper.selectList(new LambdaQueryWrapper<ShareUser>().eq(ShareUser::getTenantId, tenantId).select(ShareUser::getRelId, ShareUser::getType));
//
// if (CollUtil.isNotEmpty(shareUsers)) {
// //分享给租户的所有分享(直接间接)
// List<SysUserSyncCategory> cateList = new ArrayList<>();
//
// List<String> cateIds = shareUsers.stream().filter(e -> e.getType() == 0).map(ShareUser::getRelId).collect(Collectors.toList());
// //查询超管的所有分类
// List<SysUserSyncCategory> allCategoryIds = iSysUserSyncCategoryService.list(new LambdaQueryWrapper<SysUserSyncCategory>()
// .select(SysUserSyncCategory::getDeptId, SysUserSyncCategory::getParentId));
//
// if (CollUtil.isNotEmpty(allCategoryIds)) {
// Map<String, String> map = allCategoryIds.stream().collect(Collectors.toMap(SysUserSyncCategory::getDeptId, SysUserSyncCategory::getParentId));
// for (SysUserSyncCategory category : allCategoryIds) {
// String path = iSysUserSyncCategoryService.getPath(category.getDeptId(), map);
// if (StrUtil.isNotBlank(path)) {
// String[] split = path.split("/");
// for (int i = split.length - 1; i >= 0; i--) {
// if (StrUtil.isNotBlank(split[i]) && cateIds.contains(split[i])) {
// cateList.add(category);
// break;
// }
// }
// }
// }
// }
// List<String> shareCateIds = cateList.stream().map(SysUserSyncCategory::getDeptId).collect(Collectors.toList());
// if (categoryList != null) {
// categoryList.addAll(shareCateIds);
// } else {
// categoryList = shareCateIds;
// }
//
// List<String> noExitParentIds = new ArrayList<>();
// List<String> childrenDeptIds = new ArrayList<>();
//
// if (CategoryConstant.ROOT.equals(categoryId)) {
// // 查询分类为ROOT即查询所有找不到parentId的分类
// Set<String> map = cateList.stream().map(SysUserSyncCategory::getDeptId).collect(Collectors.toSet());
// for (SysUserSyncCategory category : cateList) {
// if (!map.contains(category.getParentId())) {
// noExitParentIds.add(category.getDeptId());
// }
// }
// } else if (StrUtil.isNotBlank(categoryId)) {
// Map<String, List<String>> parentMap = cateList.stream().collect(Collectors.groupingBy(SysUserSyncCategory::getParentId, Collectors.mapping(SysUserSyncCategory::getDeptId, Collectors.toList())));
// List<String> children = getChildren(parentMap, categoryId);
// childrenDeptIds.add(categoryId);
// childrenDeptIds.addAll(children);
// }
// List<SysUserSyncCategory> list = null;
// if (CollUtil.isNotEmpty(categoryList)) {
// list = iSysUserSyncCategoryService.list(new LambdaQueryWrapper<SysUserSyncCategory>()
// .in(StrUtil.isNotBlank(search) && StrUtil.isNotBlank(categoryId) && !CategoryConstant.ROOT.equals(categoryId) && CollUtil.isNotEmpty(childrenDeptIds), SysUserSyncCategory::getDeptId, childrenDeptIds)
// .in(StrUtil.isBlank(search) && CategoryConstant.ROOT.equals(categoryId) && CollUtil.isNotEmpty(noExitParentIds), SysUserSyncCategory::getDeptId, noExitParentIds)
// .eq(StrUtil.isBlank(search) && StrUtil.isNotBlank(categoryId) && !CategoryConstant.ROOT.equals(categoryId), SysUserSyncCategory::getParentId, categoryId)
// .like(StrUtil.isNotBlank(search), SysUserSyncCategory::getName, search)
// .in(SysUserSyncCategory::getDeptId, categoryList) // 指定分类以及分享的所有分享下
// .select(SysUserSyncCategory::getDeptId, SysUserSyncCategory::getName)
// .orderByAsc(SysUserSyncCategory::getId));
// }
// List<PermissionCheckedDTO.Category> cates = new ArrayList<>();
// if (CollUtil.isNotEmpty(list)) {
// list.forEach(ca -> {
// PermissionCheckedDTO.Category category = new PermissionCheckedDTO.Category();
// category.setId(ca.getDeptId());
// category.setName(ca.getName());
// category.setUserType(UserTypeConstant.ADMIN);
// cates.add(category);
// });
// }
// dto.setCategoryList(cates);
//
// List<PermissionCheckedDTO.User> users = new ArrayList<>();
// //所有直接分享的用户
// List<String> userIds = shareUsers.stream().filter(e -> e.getType() == 1).map(ShareUser::getRelId).collect(Collectors.toList());
//
// if (CategoryConstant.ROOT_ID.equals(categoryId)) {
// if (CollUtil.isNotEmpty(userList)) {
// userIds = userIds.stream().filter(userList::contains).collect(Collectors.toList());
// }
// if (StrUtil.isNotBlank(search)) {
// users = iSysUserSyncService.findInUserIdsOrShareCateIds(userIds, shareCateIds, "1", search);
// } else {
// if (CollUtil.isNotEmpty(userIds)) {
// users = iSysUserSyncService.findByParam(userIds, null, null, "1", search, null);
// }
// }
// } else {
// if (StrUtil.isNotBlank(search)) {
// users = iSysUserSyncService.findByParam(userList, null, childrenDeptIds, "1", search, null);
// } else {
// users = iSysUserSyncService.findByParam(userList, null, null, "1", search, categoryId);
// }
// }
// if (CollUtil.isNotEmpty(users)) {
// for (PermissionCheckedDTO.User user : users) {
// user.setUserType(UserTypeConstant.ADMIN);
// }
// }
// dto.setUserList(users);
// }
// return dto;
// }
//
// private List<String> getChildren(Map<String, List<String>> collect, String deptId) {
// List<String> ids = new ArrayList<>();
// if (collect.containsKey(deptId)) {
// List<String> strings = collect.get(deptId);
// ids.addAll(strings);
// for (String string : strings) {
// ids.addAll(getChildren(collect, string));
// }
// }
// return ids;
// }
//
//
//}
......@@ -5,7 +5,7 @@ import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cmeeting.constant.CategoryConstant;
import com.cmeeting.mapper.secondary.SysUserSyncCategoryMapper;
import com.cmeeting.mapper.primary.SysUserSyncCategoryMapper;
import com.cmeeting.pojo.SysUserSyncCategory;
import com.cmeeting.service.ISysUserSyncCategoryService;
import com.cmeeting.util.CategoryTreeUtil;
......@@ -35,7 +35,7 @@ public class SysUserSyncCategoryServiceImpl extends ServiceImpl<SysUserSyncCateg
@Override
public List<Tree<String>> tree(String tenantId) {
List<SysUserSyncCategory> sysUserSyncCategories = baseMapper.selectList(new LambdaQueryWrapper<SysUserSyncCategory>().eq(SysUserSyncCategory::getTenantId, tenantId));
List<SysUserSyncCategory> sysUserSyncCategories = baseMapper.selectList(new LambdaQueryWrapper<>());
if(CollUtil.isNotEmpty(sysUserSyncCategories)){
Set<String> set = sysUserSyncCategories.stream().map(SysUserSyncCategory::getDeptId).collect(Collectors.toSet());
for (SysUserSyncCategory sysUserSyncCategory : sysUserSyncCategories) {
......
......@@ -5,7 +5,6 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cmeeting.ad.entity.RobotSecurityUser;
import com.cmeeting.ad.entity.SysUserSync;
import com.cmeeting.constant.CategoryConstant;
import com.cmeeting.constant.PermissionPruposeType;
......@@ -13,8 +12,8 @@ import com.cmeeting.constant.RecordTemplateConstant;
import com.cmeeting.constant.UserTypeConstant;
import com.cmeeting.dto.PermissionCheckedDTO;
import com.cmeeting.dto.SysUserSyncDTO;
import com.cmeeting.mapper.secondary.SysUserSyncCategoryMapper;
import com.cmeeting.mapper.secondary.SysUserSysMapper;
import com.cmeeting.mapper.primary.SysUserSyncCategoryMapper;
import com.cmeeting.mapper.primary.SysUserSyncMapper;
import com.cmeeting.pojo.ModulePermission;
import com.cmeeting.pojo.SysUserSyncCategory;
import com.cmeeting.service.ISysUserSyncCategoryService;
......@@ -23,9 +22,7 @@ import com.cmeeting.service.SysUserSyncService;
import com.cmeeting.util.CategoryTreeUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
......@@ -38,10 +35,10 @@ import java.util.stream.Collectors;
@Service
@Slf4j
public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUserSync> implements SysUserSyncService {
public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSyncMapper, SysUserSync> implements SysUserSyncService {
@Value(value = "${permission.tenantId}")
private String perTenantId;
// @Value(value = "${permission.tenantId}")
// private String perTenantId;
@Resource
private ISysUserSyncCategoryService iSysUserSyncCategoryService;
......@@ -69,7 +66,7 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
@Override
public String getDeptPathByUserId(String userId) {
SysUserSync sysUserSync = baseMapper.selectOne(new LambdaQueryWrapper<SysUserSync>()
.eq(SysUserSync::getTenantId, perTenantId).eq(SysUserSync::getUserId, userId)
.eq(SysUserSync::getUserId, userId)
.select(SysUserSync::getDeptId).last("limit 1"));
String deptId = sysUserSync.getDeptId();
return getDeptPath("/" + deptId, deptId);
......@@ -78,7 +75,7 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
@Override
public List<String> getDeptPathByUserIdAndInSet(String userId) {
List<SysUserSync> sysUserSyncs = baseMapper.selectList(new LambdaQueryWrapper<SysUserSync>()
.eq(SysUserSync::getTenantId, perTenantId).eq(SysUserSync::getUserId, userId)
.eq(SysUserSync::getUserId, userId)
.select(SysUserSync::getDeptId));
List<String> collect = sysUserSyncs.stream().map(SysUserSync::getDeptId).collect(Collectors.toList());
List<String> ret = new ArrayList<>();
......@@ -94,7 +91,7 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
* @param deptId
*/
private String getDeptPath(String deptPath, String deptId) {
String parentDeptId = baseMapper.getParentDeptId(deptId, perTenantId);
String parentDeptId = baseMapper.getParentDeptId(deptId);
if (StringUtils.isEmpty(parentDeptId)) return deptPath;
return getDeptPath("/" + parentDeptId + deptPath, parentDeptId);
......@@ -108,7 +105,7 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
*/
@Override
public List<SysUserSyncCategory> getCategoryListByUserId(String userId) {
SysUserSync sysUserSync = baseMapper.selectOne(new LambdaQueryWrapper<SysUserSync>().eq(SysUserSync::getTenantId, perTenantId).eq(SysUserSync::getUserId, userId));
SysUserSync sysUserSync = baseMapper.selectOne(new LambdaQueryWrapper<SysUserSync>().eq(SysUserSync::getUserId, userId));
String deptId = sysUserSync.getDeptId();
// 获取当前租户所有部门
......@@ -122,7 +119,6 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
return;
}
SysUserSyncCategory category = sysUserSyncCategoryMapper.selectOne(new LambdaQueryWrapper<SysUserSyncCategory>()
.eq(SysUserSyncCategory::getTenantId, perTenantId)
.eq(SysUserSyncCategory::getDeptId, deptId)
);
if (ObjectUtils.isEmpty(category)) {
......@@ -134,13 +130,13 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
@Override
public PermissionCheckedDTO listByCategoryId(String categoryId, String search, String tenantId, List<String> categoryList, List<String> userList) {
public PermissionCheckedDTO listByCategoryId(String categoryId, String search, List<String> categoryList, List<String> userList) {
PermissionCheckedDTO dto = new PermissionCheckedDTO();
// 顶层分类查询所有parentId不存在的分类及用户
List<String> noExitParentIds = new ArrayList<>();
List<String> childrenDeptIds = new ArrayList<>();
List<SysUserSyncCategory> categories = iSysUserSyncCategoryService.list(new LambdaQueryWrapper<SysUserSyncCategory>().eq(SysUserSyncCategory::getTenantId, tenantId));
List<SysUserSyncCategory> categories = iSysUserSyncCategoryService.list(new LambdaQueryWrapper<>());
if (CategoryConstant.ROOT.equals(categoryId)) {
// 查询分类为ROOT即查询所有找不到parentId的分类
Set<String> map = categories.stream().map(SysUserSyncCategory::getDeptId).collect(Collectors.toSet());
......@@ -156,7 +152,6 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
childrenDeptIds.addAll(children);
}
List<SysUserSyncCategory> list = iSysUserSyncCategoryService.list(new LambdaQueryWrapper<SysUserSyncCategory>()
.eq(SysUserSyncCategory::getTenantId, tenantId)
.in(StrUtil.isNotBlank(search) && StrUtil.isNotBlank(categoryId) && !CategoryConstant.ROOT.equals(categoryId) && CollUtil.isNotEmpty(childrenDeptIds), SysUserSyncCategory::getDeptId, childrenDeptIds)
.in(StrUtil.isBlank(search) && CategoryConstant.ROOT.equals(categoryId) && CollUtil.isNotEmpty(noExitParentIds), SysUserSyncCategory::getDeptId, noExitParentIds)
.eq(StrUtil.isBlank(search) && StrUtil.isNotBlank(categoryId) && !CategoryConstant.ROOT.equals(categoryId), SysUserSyncCategory::getParentId, categoryId)
......@@ -177,15 +172,14 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
List<PermissionCheckedDTO.User> users;
if (StrUtil.isNotBlank(search)) {
if (CategoryConstant.ROOT_ID.equals(categoryId)) {
users = baseMapper.findName(null, null, search, tenantId, null);
users = baseMapper.findName(null, null, search, null);
} else {
users = baseMapper.findName(childrenDeptIds, null, search, tenantId, null);
users = baseMapper.findName(childrenDeptIds, null, search, null);
}
} else {
List<String> deptIds = categories.stream().map(SysUserSyncCategory::getDeptId).collect(Collectors.toList());
if (CategoryConstant.ROOT_ID.equals(categoryId)) {
List<SysUserSync> sysUserSyncList = this.list(new LambdaQueryWrapper<SysUserSync>()
.eq(SysUserSync::getTenantId, tenantId)
.notIn(CollUtil.isNotEmpty(deptIds), SysUserSync::getDeptId, deptIds)
.select(SysUserSync::getUserId));
if (CollUtil.isNotEmpty(sysUserSyncList)) {
......@@ -193,12 +187,12 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
userList.addAll(sysUserSyncIdList);
}
if (CollUtil.isNotEmpty(userList)) {
users = baseMapper.findName(null, null, search, tenantId, userList);
users = baseMapper.findName(null, null, search, userList);
} else {
users = new ArrayList<>();
}
} else {
users = baseMapper.findName(null, categoryId, search, tenantId, userList);
users = baseMapper.findName(null, categoryId, search, userList);
}
}
if (CollUtil.isNotEmpty(users)) {
......@@ -211,29 +205,28 @@ public class SysUserSyncServiceImpl extends ServiceImpl<SysUserSysMapper, SysUse
}
@Override
public List<PermissionCheckedDTO.User> findInUserIdsOrShareCateIds(List<String> userIds, List<String> shareCateIds, String tenantId, String search) {
return baseMapper.findInUserIdsOrShareCateIds(userIds, shareCateIds, tenantId, search);
public List<PermissionCheckedDTO.User> findInUserIdsOrShareCateIds(List<String> userIds, List<String> shareCateIds, String search) {
return baseMapper.findInUserIdsOrShareCateIds(userIds, shareCateIds, search);
}
@Override
public List<PermissionCheckedDTO.User> findByParam(List<String> userIds, List<String> notInCateIds, List<String> shareCateIds, String tenantId, String search, String categoryId) {
return baseMapper.findByParam(userIds, notInCateIds, shareCateIds, tenantId, search, categoryId);
public List<PermissionCheckedDTO.User> findByParam(List<String> userIds, List<String> notInCateIds, List<String> shareCateIds, String search, String categoryId) {
return baseMapper.findByParam(userIds, notInCateIds, shareCateIds, search, categoryId);
}
@Override
public Page<SysUserSyncDTO> selectPage(Integer current, Integer size, String deptId, String tenantId, String search) {
public Page<SysUserSyncDTO> selectPage(Integer current, Integer size, String deptId, String search) {
Page page = new Page(current, size);
List<String> deptIds = new ArrayList<>();
if (StrUtil.isNotBlank(deptId) && !deptId.equals(CategoryTreeUtil.ALL)) {
deptIds.add(deptId);
List<SysUserSyncCategory> categoryList = iSysUserSyncCategoryService.list(new LambdaQueryWrapper<SysUserSyncCategory>()
.eq(SysUserSyncCategory::getTenantId, tenantId)
.select(SysUserSyncCategory::getDeptId, SysUserSyncCategory::getParentId));
Map<String, List<String>> collect = categoryList.stream()
.collect(Collectors.groupingBy(SysUserSyncCategory::getParentId, Collectors.mapping(SysUserSyncCategory::getDeptId, Collectors.toCollection(ArrayList::new))));
deptIds.addAll(getChildren(collect, deptId));
}
Page<SysUserSyncDTO> retPage = baseMapper.selectByDeptId(deptIds, tenantId, page, search);
Page<SysUserSyncDTO> retPage = baseMapper.selectByDeptId(deptIds, page, search);
List<SysUserSyncDTO> records = retPage.getRecords();
if (CollUtil.isNotEmpty(records)) {
List<ModulePermission> list = modulePermissionService.list(new LambdaQueryWrapper<ModulePermission>()
......
......@@ -4,10 +4,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cmeeting.constant.MeetingState;
import com.cmeeting.dto.UserDTO;
import com.cmeeting.log.service.ProcessLogService;
import com.cmeeting.mapper.tertiary.AuthMapper;
import com.cmeeting.mapper.primary.AuthMapper;
import com.cmeeting.mapper.primary.MeetingInfoMapper;
import com.cmeeting.mapper.primary.TecentMeetingMapper;
import com.cmeeting.mapper.secondary.SysUserSysMapper;
import com.cmeeting.mapper.primary.SysUserSyncMapper;
import com.cmeeting.pojo.*;
import com.cmeeting.service.ModulePermissionService;
import com.cmeeting.service.SysUserSyncService;
......@@ -60,7 +60,7 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
@Resource
private AuthMapper authMapper;
@Resource
private SysUserSysMapper sysUserSyncMapper;
private SysUserSyncMapper sysUserSyncMapper;
@Resource
private RedisUtils redisUtils;
@Resource
......@@ -355,17 +355,16 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
List<String> deptPath = new ArrayList<>();
for (CoreModulePermissions authDept : authDepts) {
String deptId = authDept.getRelId();
String tenantId = authDept.getTenantId();
getDeptPath(deptPath, deptId, tenantId);
getDeptPath(deptPath, deptId);
}
//已被授权部门下的userid
List<String> accessUserIds = !CollectionUtils.isEmpty(deptPath) ? sysUserSyncMapper.getUsersByDept(deptPath, permissionTenantId) : new ArrayList<>();
List<String> accessUserIds = !CollectionUtils.isEmpty(deptPath) ? sysUserSyncMapper.getUsersByDept(deptPath) : new ArrayList<>();
//2. 已被直接授权的人员追加进去
accessUserIds.addAll(auths.stream().filter(item -> item.getType().equals(1)).map(CoreModulePermissions::getRelId).collect(Collectors.toList()));
if (!CollectionUtils.isEmpty(accessUserIds)) {
//查出人员邮箱
List<UserDTO> userEmailList = sysUserSyncMapper.getUserEmail(permissionTenantId);
List<UserDTO> userEmailList = sysUserSyncMapper.getUserEmail();
Map<String, UserDTO> userEmailMap = CollectionUtils.isEmpty(userEmailList) ? new HashMap<>()
: userEmailList.stream().collect(Collectors.toMap(UserDTO::getWid, Function.identity(), (existing, replacement) -> existing));
......@@ -399,18 +398,17 @@ public class TencentMeetingServiceImpl extends ServiceImpl<TecentMeetingMapper,
*
* @param deptPath
* @param deptId
* @param tenantId
*/
private void getDeptPath(List<String> deptPath, String deptId, String tenantId) {
private void getDeptPath(List<String> deptPath, String deptId) {
if (!deptPath.contains(deptId)) deptPath.add(deptId);
List<String> subDeptIds = sysUserSyncMapper.getSubDeptId(deptId, tenantId);
List<String> subDeptIds = sysUserSyncMapper.getSubDeptId(deptId);
if (CollectionUtils.isEmpty(subDeptIds)) return;
for (String subDeptId : subDeptIds) {
//部门id去重
if (!deptPath.contains(subDeptId)) {
deptPath.add(subDeptId);
getDeptPath(deptPath, subDeptId, tenantId);
getDeptPath(deptPath, subDeptId);
}
}
......
......@@ -7,11 +7,10 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cmeeting.ad.entity.RobotSecurityUser;
import com.cmeeting.ad.util.SecurityUtil;
import com.cmeeting.dto.UserDTO;
import com.cmeeting.exception.RobotBaseException;
import com.cmeeting.mapper.primary.UserIdMapper;
import com.cmeeting.mapper.primary.WeComUserMapper;
import com.cmeeting.mapper.secondary.SysUserSysMapper;
import com.cmeeting.mapper.primary.SysUserSyncMapper;
import com.cmeeting.pojo.MeetingInfo;
import com.cmeeting.pojo.UserId;
import com.cmeeting.pojo.WeComUser;
......@@ -54,7 +53,7 @@ public class WeComServiceImpl extends ServiceImpl<WeComUserMapper, WeComUser> i
@Autowired
private UserIdMapper userIdMapper;
@Resource
private SysUserSysMapper sysUserSyncMapper;
private SysUserSyncMapper sysUserSyncMapper;
@Value(value = "${permission.tenantId}")
private String permissionTenantId;
......
......@@ -42,7 +42,6 @@ public class CategoryTreeUtil<T> {
extra.put("categoryId", category.getId());
extra.put("parentId", category.getParentId());
extra.put("sortNo", category.getSortNo());
extra.put("tenantId", category.getTenantId());
} else {
// TODO 新的分类
}
......
package com.cmeeting.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cmeeting.constant.CimcConstants;
import com.cmeeting.dto.CimcEmployee;
import com.cmeeting.dto.CimcOrganization;
import com.cmeeting.dto.CimcPost;
import com.cmeeting.exception.RobotBaseException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.net.URLEncoder;
import java.util.ArrayList;
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
@Value("${cimc.userinfo-environment}")
public String userInfoEnvironment;
public void testSSLTimeout(int pageNum, Class zClass) {
String uri = "";
if (CimcEmployee.class == zClass) {
if ("test".equals(userInfoEnvironment)) {
uri = GET_TEST_EMPLOYEE;
} else {
uri = GET_AWS_EMPLOYEE;
}
} else if (CimcOrganization.class == zClass) {
if ("test".equals(userInfoEnvironment)) {
uri = GET_TEST_ORGANIZATION;
} else {
uri = GET_AWS_ORGANIZATION;
}
} else if (CimcPost.class == zClass) {
if ("test".equals(userInfoEnvironment)) {
uri = GET_TEST_POSITION;
} else {
uri = GET_AWS_POSITION;
}
}
String url = uri.replace(ALTER_USER, URLEncoder.encode(username)).replace(ALTER_PASSWORD, URLEncoder.encode(password)).replace(ALTER_API_KEY, apiKey).replaceAll(ALTER_PAGE_NUM, String.valueOf(pageNum));
String res = SSLUtils.sendGetByHttpsAndTtimOut(url);
if (res.contains("You cannot consume this service")) {
log.error("同步信息失败,账号或apiKey无效");
}
if (res != null) {
log.info("res.length: {}", res.length());
if (res.length() < 1000) {
log.info("res: \n{}", res);
}
} else {
log.info("res is null");
}
}
public List getDataByClass(int pageNum, Class zClass) {
String recordsName = "";
String uri = "";
if (CimcEmployee.class == zClass) {
if ("test".equals(userInfoEnvironment)) {
uri = GET_TEST_EMPLOYEE;
} else {
uri = GET_AWS_EMPLOYEE;
}
recordsName = "employee_record";
} else if (CimcOrganization.class == zClass) {
if ("test".equals(userInfoEnvironment)) {
uri = GET_TEST_ORGANIZATION;
} else {
uri = GET_AWS_ORGANIZATION;
}
recordsName = "unit_record";
} else if (CimcPost.class == zClass) {
if ("test".equals(userInfoEnvironment)) {
uri = GET_TEST_POSITION;
} else {
uri = GET_AWS_POSITION;
}
recordsName = "position_record";
}
String url = uri.replace(ALTER_USER, URLEncoder.encode(username)).replace(ALTER_PASSWORD, URLEncoder.encode(password)).replace(ALTER_API_KEY, apiKey).replaceAll(ALTER_PAGE_NUM, String.valueOf(pageNum));
String res = SSLUtils.sendGetByHttpsAndTtimOut(url);
if (res.contains("You cannot consume this service")) {
throw new RobotBaseException("同步信息失败,账号或apiKey无效");
}
if (res.length() < 2000) {
log.error("res: {}", res);
}
JSONObject object = JSONObject.parseObject(res);
JSONObject envelope = (JSONObject) object.get("soap:Envelope");
JSONObject body = (JSONObject) envelope.get("soap:Body");
JSONObject records = null;
records = (JSONObject) body.get(recordsName);
if (records == null) {
return null;
}
JSONArray record = (JSONArray) records.get("record");
if (record == null) {
return null;
}
List<Object> objectList = new ArrayList<>();
// 提供的AD账号和密码对应一个租户
if (record.size() != 0) {
record.forEach(obj -> {
Object o = JSONObject.toJavaObject((JSONObject) obj, zClass);
objectList.add(o);
});
}
return objectList;
}
}
package com.cmeeting.util;
/**
* @author cf
* @date 2023/7/3下午 1:06
*/
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
@Slf4j
public class SSLUtils {
/**
* 忽略https证书验证
*
* @return
*/
public static SSLSocketFactory getSSLSocketFactory() {
try {
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());
return sslContext.getSocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static TrustManager[] getTrustManager() {
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
//检查客户端证书,若不信任该证书抛出异常,咱们自己就是客户端不用检查
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
//检查服务器的证书,若不信任该证书抛出异常,可以不检查默认都信任
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
//返回受信任的X509证书数组
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
return trustAllCerts;
}
public static String sendPostByHttps(String url, JSONObject data) {
log.info("https post: {}", url);
String result = HttpRequest.post(url)
.header("Content-Type", "application/json;charset=UTF-8")
.setSSLSocketFactory(SSLUtils.getSSLSocketFactory())
.body(data.toJSONString())
.execute().body();
return result;
}
public static String sendGetByHttps(String url) {
log.info("https get: {}", url);
String result = HttpRequest.get(url)
.setSSLSocketFactory(SSLUtils.getSSLSocketFactory())
.execute().body();
return result;
}
public static String sendGetByHttpsAndTtimOut(String url) {
log.info("https get: {}", url);
String result = HttpRequest.get(url)
.setSSLSocketFactory(SSLUtils.getSSLSocketFactory())
.timeout(60000)
.execute().body();
return result;
}
public static String sendXmlPostByHttps(String url, String data, String apiKey) {
log.info("Https Xml Post: {}", url);
log.info("Https Xml body: {}", data);
return HttpRequest.post(url)
.header("Content-Type", "text/xml")
.header("Accept", "application/xml")
.header("apikey", apiKey)
.setSSLSocketFactory(SSLUtils.getSSLSocketFactory())
.body(data).execute().body();
}
public static String sendPostByHttps(String url, String data, String apiKey) {
log.info("Https Url: {}", url);
log.info("Https body: {}", data);
String ret = HttpRequest.post(url)
.header("Content-Type", "application/json")
.header("apikey", apiKey)
.setSSLSocketFactory(SSLUtils.getSSLSocketFactory())
.body(data).execute().body();
log.info("Https ret: {}", ret);
return ret;
}
}
......@@ -47,17 +47,17 @@ spring:
username: root
password: qizhi123
driver-class-name: com.mysql.jdbc.Driver
# 从数据源
slave:
jdbc-url: jdbc:mysql://192.168.10.157:3306/zhongji-user?useSSL=false&characterEncoding=utf8&serverTimezone=UTC
username: root
password: qizhi123
driver-class-name: com.mysql.jdbc.Driver
tertiary:
jdbc-url: jdbc:mysql://192.168.10.157:3306/zhongji-aigc?useSSL=false&characterEncoding=utf8&serverTimezone=UTC
username: root
password: qizhi123
driver-class-name: com.mysql.jdbc.Driver
# # 从数据源
# slave:
# jdbc-url: jdbc:mysql://192.168.10.157:3306/zhongji-user?useSSL=false&characterEncoding=utf8&serverTimezone=UTC
# username: root
# password: qizhi123
# driver-class-name: com.mysql.jdbc.Driver
# tertiary:
# jdbc-url: jdbc:mysql://192.168.10.157:3306/zhongji-aigc?useSSL=false&characterEncoding=utf8&serverTimezone=UTC
# username: root
# password: qizhi123
# driver-class-name: com.mysql.jdbc.Driver
redis:
database: ${REDIS_DATABASE}
host: ${REDIS_ADDRESS}
......
<?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.tertiary.AuthMapper">
<mapper namespace="com.cmeeting.mapper.primary.AuthMapper">
<select id="getAuthByTargetId" resultType="com.cmeeting.pojo.CoreModulePermissions">
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.secondary.SysUserSysMapper">
<mapper namespace="com.cmeeting.mapper.primary.SysUserSyncMapper">
<select id="getCompanyEmail" resultType="java.lang.String">
SELECT company_email
FROM sys_user_sync
WHERE user_id = #{wid}
AND tenant_id = #{tenantId}
LIMIT 1
</select>
<select id="getParentDeptId" resultType="java.lang.String">
SELECT parent_id
FROM sys_user_sync_category
WHERE dept_id = #{deptId}
AND tenant_id = #{tenantId}
LIMIT 1
</select>
<select id="getSubDeptId" resultType="java.lang.String">
......@@ -30,80 +22,73 @@
</foreach>
</select>
<select id="getUserEmail" resultType="com.cmeeting.dto.UserDTO">
select t1.user_id as wId,IFNULL(t1.email,t1.company_email) as email
select t1.user_id as wId, IFNULL(t1.email, t1.company_email) as email
from sys_user_sync t1
where (t1.email is not null
or t1.company_email is not null)
AND t1.tenant_id = #{tenantId}
or t1.company_email is not null)
</select>
<select id="getSimpleUserList" resultType="com.cmeeting.ad.entity.SysUserSync">
select t1.user_id as userId,t1.name
select t1.user_id as userId, t1.name
from sys_user_sync t1
<where>
<if test="tenantId != null and tenantId != ''">
AND t1.tenant_id = #{tenantId}
</if>
</where>
group by t1.user_id
</select>
<select id="getSimpleDeptList" resultType="com.cmeeting.ad.entity.SysDept">
SELECT
susc.dept_id,
susc.`name`
FROM
sys_user_sync_category AS susc
WHERE
susc.tenant_id = #{tenantId}
SELECT susc.dept_id,
susc.`name`
FROM sys_user_sync_category AS susc
</select>
<select id="findName" resultType="com.cmeeting.dto.PermissionCheckedDTO$User">
select distinct t1.user_id as id,t1.name,t2.name as deptName
from sys_user_sync t1
left join sys_user_sync_category t2 on t1.dept_id = t2.dept_id and t1.tenant_id = t2.tenant_id
where t1.tenant_id = #{tenantId}
<if test="categoryId != null and categoryId != ''">
and t1.dept_id = #{categoryId}
</if>
<if test="deptIds!=null and deptIds.size > 0">
and t2.dept_id in
<foreach collection="deptIds" open="(" close=")" item="id" separator=",">#{id}</foreach>
</if>
<if test="userList != null and userList.size > 0">
and t1.user_id in
<foreach collection="userList" item="id" close=")" open="(" separator=",">
#{id}
</foreach>
</if>
<if test="search != null and search!=''">
and t1.name like concat('%',#{search},'%')
</if>
<where>
<if test="categoryId != null and categoryId != ''">
and t1.dept_id = #{categoryId}
</if>
<if test="deptIds!=null and deptIds.size > 0">
and t2.dept_id in
<foreach collection="deptIds" open="(" close=")" item="id" separator=",">#{id}</foreach>
</if>
<if test="userList != null and userList.size > 0">
and t1.user_id in
<foreach collection="userList" item="id" close=")" open="(" separator=",">
#{id}
</foreach>
</if>
<if test="search != null and search!=''">
and t1.name like concat('%',#{search},'%')
</if>
</where>
</select>
<select id="findInUserIdsOrShareCateIds" resultType="com.cmeeting.dto.PermissionCheckedDTO$User">
select distinct t1.user_id as id,t1.name,t2.name as deptName
from sys_user_sync t1
left join sys_user_sync_category t2 on t1.dept_id = t2.dept_id and t1.tenant_id = t2.tenant_id
where t1.tenant_id = #{tenantId}
and (
t1.user_id in
<foreach collection="userIds" item="id" close=")" open="(" separator=",">
#{id}
</foreach>
or
t1.dept_id in
<foreach collection="shareCateIds" item="id" close=")" open="(" separator=",">
#{id}
</foreach>
)
<if test="search != null and search!=''">
and t1.name like concat('%',#{search},'%')
</if>
<where>
(
t1.user_id in
<foreach collection="userIds" item="id" close=")" open="(" separator=",">
#{id}
</foreach>
or
t1.dept_id in
<foreach collection="shareCateIds" item="id" close=")" open="(" separator=",">
#{id}
</foreach>
)
<if test="search != null and search!=''">
and t1.name like concat('%',#{search},'%')
</if>
</where>
</select>
<select id="findByParam" resultType="com.cmeeting.dto.PermissionCheckedDTO$User">
select distinct t1.user_id as id,t1.name,t2.name as deptName
from sys_user_sync t1
left join sys_user_sync_category t2 on t1.dept_id = t2.dept_id and t1.tenant_id = t2.tenant_id
where t1.tenant_id = #{tenantId}
<where>
<if test="categoryId != null and categoryId!=''">
and t1.dept_id = #{categoryId}
</if>
......@@ -128,6 +113,7 @@
#{id}
</foreach>
</if>
</where>
</select>
<select id="selectByDeptId" resultType="com.cmeeting.dto.SysUserSyncDTO">
select DISTINCT t1.*
......@@ -140,27 +126,28 @@
#{id}
</foreach>
</if>
where t1.tenant_id = #{tenantId}
<if test="search!=null and search!=''">
and (t1.user_id like concat('%',#{search},'%') or t1.name like concat('%',#{search},'%') or t1.nick_name like concat('%',#{search},'%'))
</if>
<where>
<if test="search!=null and search!=''">
(t1.user_id like concat('%',#{search},'%') or t1.name like concat('%',#{search},'%') or t1.nick_name
like concat('%',#{search},'%'))
</if>
</where>
</select>
<select id="selectParamByUserIdList" resultType="java.util.LinkedHashMap">
SELECT
sys_user_sync_category.`name` as deptName,
sys_user_sync.`name`,
sys_user_sync.user_id as userId
sys_user_sync_category.`name` as deptName,
sys_user_sync.`name`,
sys_user_sync.user_id as userId
FROM
sys_user_sync,
sys_user_sync_category
sys_user_sync,
sys_user_sync_category
<where>
sys_user_sync.tenant_id = #{tenantId}
and sys_user_sync_category.tenant_id = #{tenantId}
and sys_user_sync.dept_id = sys_user_sync_category.dept_id
sys_user_sync.dept_id = sys_user_sync_category.dept_id
<if test="searchValue != null and searchValue != ''">
and (sys_user_sync.user_id like concat('%',#{searchValue},'%') or sys_user_sync.name like concat('%',#{searchValue},'%') or sys_user_sync_category.name like concat('%',#{searchValue},'%'))
and (sys_user_sync.user_id like concat('%',#{searchValue},'%') or sys_user_sync.name like
concat('%',#{searchValue},'%') or sys_user_sync_category.name like concat('%',#{searchValue},'%'))
</if>
<if test="userIdList.size() > 0">
and sys_user_sync.user_id in
......
<?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.secondary.SysUserMapper">
<select id="getUserDeptPath" resultType="java.lang.String">
SELECT t2.path
FROM sys_user t1
LEFT JOIN sys_user_category t2 ON t1.category_id = t2.id AND t2.is_del = 0
WHERE t1.id = #{userId} AND t1.is_del = 0
</select>
</mapper>
<?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.tertiary.SysTenantMapper">
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论