From 8750c279ebfa8465091ad07338016744fdc7aa5d Mon Sep 17 00:00:00 2001 From: ls Date: Wed, 9 Jul 2025 23:32:49 +0800 Subject: [PATCH] cleanup code --- physical-base-core/pom.xml | 172 +- .../org/jeecg/common/util/DySmsHelper.java | 264 +- .../jeecg/common/util/YouBianCodeUtil.java | 4 +- .../dynamic/db/FreemarkerParseFactory.java | 6 +- .../jeecg/common/util/oss/OssBootUtil.java | 64 +- .../org/jeecg/config/WebMvcConfiguration.java | 14 +- .../org/jeecg/config/WebSocketConfig.java | 76 +- physical-launcher/pom.xml | 6 +- .../java/org/jeecg/PhysicalApplication.java | 4 +- .../modules/message/test/SendMessageTest.java | 284 +- .../physical-system-biz/pom.xml | 56 +- .../config/init/CodeGenerateDbConfig.java | 4 +- .../JimuDragExternalServiceImpl.java | 210 +- .../jimureport/JimuReportTokenService.java | 164 +- .../modules/cas/util/CasServiceUtil.java | 212 +- .../message/handle/impl/DdSendMsgHandle.java | 74 +- .../handle/impl/EmailSendMsgHandle.java | 438 +-- .../handle/impl/QywxSendMsgHandle.java | 74 +- .../system/cache/AuthStateRedisCache.java | 138 +- .../system/config/AuthStateConfiguration.java | 30 +- .../system/controller/LoginController.java | 272 +- .../controller/SysAnnouncementController.java | 32 +- .../system/controller/ThirdAppController.java | 1102 +++---- .../system/service/impl/SysBaseApiImpl.java | 102 +- .../impl/SysThirdAccountServiceImpl.java | 22 +- .../service/impl/SysUserServiceImpl.java | 70 +- .../impl/ThirdAppDingtalkServiceImpl.java | 2442 ++++++++-------- .../ThirdAppWechatEnterpriseServiceImpl.java | 2570 ++++++++--------- .../vo/thirdapp/JdtDepartmentTreeVo.java | 178 +- .../vo/thirdapp/JwDepartmentTreeVo.java | 178 +- pom.xml | 236 +- 31 files changed, 4754 insertions(+), 4744 deletions(-) diff --git a/physical-base-core/pom.xml b/physical-base-core/pom.xml index ada0d27..9bcd854 100644 --- a/physical-base-core/pom.xml +++ b/physical-base-core/pom.xml @@ -50,6 +50,12 @@ org.jeecgframework.boot jeecg-boot-common3 3.7.0 + + + * + io.netty + + @@ -67,14 +73,14 @@ spring-boot-starter-undertow - - org.springframework.boot - spring-boot-starter-websocket - - - org.springframework.boot - spring-boot-starter-mail - + + + + + + + + org.springframework.boot spring-boot-starter-aop @@ -89,10 +95,10 @@ spring-boot-starter-validation - - io.micrometer - micrometer-registry-prometheus - + + + + @@ -141,51 +147,51 @@ runtime - - com.microsoft.sqlserver - sqljdbc4 - ${sqljdbc4.version} - runtime - + + + + + + - - com.oracle - ojdbc6 - ${ojdbc6.version} - runtime - + + + + + + - - org.postgresql - postgresql - ${postgresql.version} - runtime - + + + + + + - - org.jeecgframework - kingbase8 - ${kingbase8.version} - runtime - + + + + + + - - com.dameng - Dm8JdbcDriver18 - ${dm8.version} - - - com.dameng - DmDialect-for-hibernate5.0 - ${dm8.version} - + + + + + + + + + + - - - - + + + + @@ -280,19 +286,19 @@ - - org.jeecgframework.boot - codegenerate - ${codegenerate.version} - + + + + + org.jeecgframework.boot3 autopoi-web ${autopoi-web.version} - - + + commons-codec @@ -318,32 +324,32 @@ - - com.aliyun - aliyun-java-sdk-dysmsapi - ${aliyun-java-sdk-dysmsapi.version} - + + + + + - - com.aliyun.oss - aliyun-sdk-oss - ${aliyun.oss.version} - + + + + + - - com.xkcoding.justauth - justauth-spring-boot-starter - - - org.springframework.boot - spring-boot-autoconfigure - - - org.springframework.boot - spring-boot-configuration-processor - - - + + + + + + + + + + + + + + com.squareup.okhttp3 okhttp @@ -370,8 +376,8 @@ org.jeecgframework.boot3 autopoi 3.7.0 - - + + com.deepoove diff --git a/physical-base-core/src/main/java/org/jeecg/common/util/DySmsHelper.java b/physical-base-core/src/main/java/org/jeecg/common/util/DySmsHelper.java index 74583f9..64c3c4c 100644 --- a/physical-base-core/src/main/java/org/jeecg/common/util/DySmsHelper.java +++ b/physical-base-core/src/main/java/org/jeecg/common/util/DySmsHelper.java @@ -1,133 +1,133 @@ -package org.jeecg.common.util; - -import com.alibaba.fastjson.JSONObject; -import com.aliyuncs.DefaultAcsClient; -import com.aliyuncs.IAcsClient; -import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; -import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; -import com.aliyuncs.exceptions.ClientException; -import com.aliyuncs.profile.DefaultProfile; -import com.aliyuncs.profile.IClientProfile; -import org.jeecg.common.constant.enums.DySmsEnum; -import org.jeecg.config.StaticConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Created on 17/6/7. - * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过 - * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可) - * 工程依赖了2个jar包(存放在工程的libs目录下) - * 1:aliyun-java-sdk-core.jar - * 2:aliyun-java-sdk-dysmsapi.jar - *

- * 备注:Demo工程编码采用UTF-8 - * 国际短信发送请勿参照此DEMO - * - * @author: jeecg-boot - */ -public class DySmsHelper { - - private final static Logger logger = LoggerFactory.getLogger(DySmsHelper.class); - - /** - * 产品名称:云通信短信API产品,开发者无需替换 - */ - static final String PRODUCT = "Dysmsapi"; - /** - * 产品域名,开发者无需替换 - */ - static final String DOMAIN = "dysmsapi.aliyuncs.com"; - - /** - * TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) - */ - static String accessKeyId; - static String accessKeySecret; - - public static void setAccessKeyId(String accessKeyId) { - DySmsHelper.accessKeyId = accessKeyId; - } - - public static void setAccessKeySecret(String accessKeySecret) { - DySmsHelper.accessKeySecret = accessKeySecret; - } - - public static String getAccessKeyId() { - return accessKeyId; - } - - public static String getAccessKeySecret() { - return accessKeySecret; - } - - - public static boolean sendSms(String phone, JSONObject templateParamJson, DySmsEnum dySmsEnum) throws ClientException { - //可自助调整超时时间 - System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); - System.setProperty("sun.net.client.defaultReadTimeout", "10000"); - - //update-begin-author:taoyan date:20200811 for:配置类数据获取 - StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class); - //logger.info("阿里大鱼短信秘钥 accessKeyId:" + staticConfig.getAccessKeyId()); - //logger.info("阿里大鱼短信秘钥 accessKeySecret:"+ staticConfig.getAccessKeySecret()); - setAccessKeyId(staticConfig.getAccessKeyId()); - setAccessKeySecret(staticConfig.getAccessKeySecret()); - //update-end-author:taoyan date:20200811 for:配置类数据获取 - - //初始化acsClient,暂不支持region化 - IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); - DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN); - IAcsClient acsClient = new DefaultAcsClient(profile); - - //验证json参数 - validateParam(templateParamJson, dySmsEnum); - - //组装请求对象-具体描述见控制台-文档部分内容 - SendSmsRequest request = new SendSmsRequest(); - //必填:待发送手机号 - request.setPhoneNumbers(phone); - //必填:短信签名-可在短信控制台中找到 - request.setSignName(dySmsEnum.getSignName()); - //必填:短信模板-可在短信控制台中找到 - request.setTemplateCode(dySmsEnum.getTemplateCode()); - //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 - request.setTemplateParam(templateParamJson.toJSONString()); - - //选填-上行短信扩展码(无特殊需求用户请忽略此字段) - //request.setSmsUpExtendCode("90997"); - - //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 - //request.setOutId("yourOutId"); - - boolean result = false; - - //hint 此处可能会抛出异常,注意catch - SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); - logger.info("短信接口返回的数据----------------"); - logger.info("{Code:" + sendSmsResponse.getCode() + ",Message:" + sendSmsResponse.getMessage() + ",RequestId:" + sendSmsResponse.getRequestId() + ",BizId:" + sendSmsResponse.getBizId() + "}"); - String ok = "OK"; - if (ok.equals(sendSmsResponse.getCode())) { - result = true; - } - return result; - - } - - private static void validateParam(JSONObject templateParamJson, DySmsEnum dySmsEnum) { - String keys = dySmsEnum.getKeys(); - String[] keyArr = keys.split(","); - for (String item : keyArr) { - if (!templateParamJson.containsKey(item)) { - throw new RuntimeException("模板缺少参数:" + item); - } - } - } - - -// public static void main(String[] args) throws ClientException, InterruptedException { -// JSONObject obj = new JSONObject(); -// obj.put("code", "1234"); -// sendSms("13800138000", obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE); +//package org.jeecg.common.util; +// +//import com.alibaba.fastjson.JSONObject; +//import com.aliyuncs.DefaultAcsClient; +//import com.aliyuncs.IAcsClient; +//import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +//import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +//import com.aliyuncs.exceptions.ClientException; +//import com.aliyuncs.profile.DefaultProfile; +//import com.aliyuncs.profile.IClientProfile; +//import org.jeecg.common.constant.enums.DySmsEnum; +//import org.jeecg.config.StaticConfig; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +///** +// * Created on 17/6/7. +// * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过 +// * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可) +// * 工程依赖了2个jar包(存放在工程的libs目录下) +// * 1:aliyun-java-sdk-core.jar +// * 2:aliyun-java-sdk-dysmsapi.jar +// *

+// * 备注:Demo工程编码采用UTF-8 +// * 国际短信发送请勿参照此DEMO +// * +// * @author: jeecg-boot +// */ +//public class DySmsHelper { +// +// private final static Logger logger = LoggerFactory.getLogger(DySmsHelper.class); +// +// /** +// * 产品名称:云通信短信API产品,开发者无需替换 +// */ +// static final String PRODUCT = "Dysmsapi"; +// /** +// * 产品域名,开发者无需替换 +// */ +// static final String DOMAIN = "dysmsapi.aliyuncs.com"; +// +// /** +// * TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找) +// */ +// static String accessKeyId; +// static String accessKeySecret; +// +// public static void setAccessKeyId(String accessKeyId) { +// DySmsHelper.accessKeyId = accessKeyId; // } -} +// +// public static void setAccessKeySecret(String accessKeySecret) { +// DySmsHelper.accessKeySecret = accessKeySecret; +// } +// +// public static String getAccessKeyId() { +// return accessKeyId; +// } +// +// public static String getAccessKeySecret() { +// return accessKeySecret; +// } +// +// +// public static boolean sendSms(String phone, JSONObject templateParamJson, DySmsEnum dySmsEnum) throws ClientException { +// //可自助调整超时时间 +// System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); +// System.setProperty("sun.net.client.defaultReadTimeout", "10000"); +// +// //update-begin-author:taoyan date:20200811 for:配置类数据获取 +// StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class); +// //logger.info("阿里大鱼短信秘钥 accessKeyId:" + staticConfig.getAccessKeyId()); +// //logger.info("阿里大鱼短信秘钥 accessKeySecret:"+ staticConfig.getAccessKeySecret()); +// setAccessKeyId(staticConfig.getAccessKeyId()); +// setAccessKeySecret(staticConfig.getAccessKeySecret()); +// //update-end-author:taoyan date:20200811 for:配置类数据获取 +// +// //初始化acsClient,暂不支持region化 +// IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); +// DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN); +// IAcsClient acsClient = new DefaultAcsClient(profile); +// +// //验证json参数 +// validateParam(templateParamJson, dySmsEnum); +// +// //组装请求对象-具体描述见控制台-文档部分内容 +// SendSmsRequest request = new SendSmsRequest(); +// //必填:待发送手机号 +// request.setPhoneNumbers(phone); +// //必填:短信签名-可在短信控制台中找到 +// request.setSignName(dySmsEnum.getSignName()); +// //必填:短信模板-可在短信控制台中找到 +// request.setTemplateCode(dySmsEnum.getTemplateCode()); +// //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 +// request.setTemplateParam(templateParamJson.toJSONString()); +// +// //选填-上行短信扩展码(无特殊需求用户请忽略此字段) +// //request.setSmsUpExtendCode("90997"); +// +// //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 +// //request.setOutId("yourOutId"); +// +// boolean result = false; +// +// //hint 此处可能会抛出异常,注意catch +// SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); +// logger.info("短信接口返回的数据----------------"); +// logger.info("{Code:" + sendSmsResponse.getCode() + ",Message:" + sendSmsResponse.getMessage() + ",RequestId:" + sendSmsResponse.getRequestId() + ",BizId:" + sendSmsResponse.getBizId() + "}"); +// String ok = "OK"; +// if (ok.equals(sendSmsResponse.getCode())) { +// result = true; +// } +// return result; +// +// } +// +// private static void validateParam(JSONObject templateParamJson, DySmsEnum dySmsEnum) { +// String keys = dySmsEnum.getKeys(); +// String[] keyArr = keys.split(","); +// for (String item : keyArr) { +// if (!templateParamJson.containsKey(item)) { +// throw new RuntimeException("模板缺少参数:" + item); +// } +// } +// } +// +// +//// public static void main(String[] args) throws ClientException, InterruptedException { +//// JSONObject obj = new JSONObject(); +//// obj.put("code", "1234"); +//// sendSms("13800138000", obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE); +//// } +//} diff --git a/physical-base-core/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java b/physical-base-core/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java index 049dd28..68bd9db 100644 --- a/physical-base-core/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java +++ b/physical-base-core/src/main/java/org/jeecg/common/util/YouBianCodeUtil.java @@ -1,6 +1,6 @@ package org.jeecg.common.util; -import io.netty.util.internal.StringUtil; +import org.apache.commons.lang3.StringUtils; /** * 流水号生成规则(按默认规则递增,数字从1-99开始递增,数字到99,递增字母;位数不够增加位数) @@ -158,7 +158,7 @@ public class YouBianCodeUtil { } public static String[] cutYouBianCode(String code) { - if (code == null || StringUtil.isNullOrEmpty(code)) { + if (code == null || StringUtils.isBlank(code)) { return null; } else { //获取标准长度为numLength+1,截取的数量为code.length/numLength+1 diff --git a/physical-base-core/src/main/java/org/jeecg/common/util/dynamic/db/FreemarkerParseFactory.java b/physical-base-core/src/main/java/org/jeecg/common/util/dynamic/db/FreemarkerParseFactory.java index 50ac8a6..908e8ad 100644 --- a/physical-base-core/src/main/java/org/jeecg/common/util/dynamic/db/FreemarkerParseFactory.java +++ b/physical-base-core/src/main/java/org/jeecg/common/util/dynamic/db/FreemarkerParseFactory.java @@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.DataBaseConstant; import org.jeecg.common.constant.SymbolConstant; -import org.jeecgframework.codegenerate.generate.util.SimpleFormat; +//import org.jeecgframework.codegenerate.generate.util.SimpleFormat; import java.io.StringWriter; import java.util.Map; @@ -102,7 +102,7 @@ public class FreemarkerParseFactory { if (paras.containsKey(MINI_DAO_FORMAT)) { throw new RuntimeException("DaoFormat 是 minidao 保留关键字,不允许使用 ,请更改参数定义!"); } - paras.put(MINI_DAO_FORMAT, new SimpleFormat()); + //paras.put(MINI_DAO_FORMAT, new SimpleFormat()); mytpl.process(paras, swriter); String sql = getSqlText(swriter.toString()); paras.remove(MINI_DAO_FORMAT); @@ -138,7 +138,7 @@ public class FreemarkerParseFactory { if (paras.containsKey(MINI_DAO_FORMAT)) { throw new RuntimeException("DaoFormat 是 minidao 保留关键字,不允许使用 ,请更改参数定义!"); } - paras.put(MINI_DAO_FORMAT, new SimpleFormat()); + //paras.put(MINI_DAO_FORMAT, new SimpleFormat()); mytpl.process(paras, swriter); String sql = getSqlText(swriter.toString(), keepSpace); paras.remove(MINI_DAO_FORMAT); diff --git a/physical-base-core/src/main/java/org/jeecg/common/util/oss/OssBootUtil.java b/physical-base-core/src/main/java/org/jeecg/common/util/oss/OssBootUtil.java index ae8645d..eab1706 100644 --- a/physical-base-core/src/main/java/org/jeecg/common/util/oss/OssBootUtil.java +++ b/physical-base-core/src/main/java/org/jeecg/common/util/oss/OssBootUtil.java @@ -1,11 +1,11 @@ package org.jeecg.common.util.oss; -import com.aliyun.oss.ClientConfiguration; -import com.aliyun.oss.OSSClient; -import com.aliyun.oss.common.auth.DefaultCredentialProvider; -import com.aliyun.oss.model.CannedAccessControlList; -import com.aliyun.oss.model.OSSObject; -import com.aliyun.oss.model.PutObjectResult; +//import com.aliyun.oss.ClientConfiguration; +//import com.aliyun.oss.OSSClient; +//import com.aliyun.oss.common.auth.DefaultCredentialProvider; +//import com.aliyun.oss.model.CannedAccessControlList; +//import com.aliyun.oss.model.OSSObject; +//import com.aliyun.oss.model.PutObjectResult; import lombok.extern.slf4j.Slf4j; import org.apache.commons.fileupload.FileItemStream; import org.jeecg.common.constant.CommonConstant; @@ -77,14 +77,14 @@ public class OssBootUtil { return bucketName; } - public static OSSClient getOssClient() { - return ossClient; - } + //public static OSSClient getOssClient() { + // return ossClient; + //} /** * oss 工具客户端 */ - private static OSSClient ossClient = null; + //private static OSSClient ossClient = null; /** * 上传文件至阿里云 OSS @@ -96,7 +96,7 @@ public class OssBootUtil { * @return oss 中的相对文件路径 */ public static String upload(MultipartFile file, String fileDir, String customBucket) throws Exception { - //update-begin-author:liusq date:20210809 for: 过滤上传文件类型 + /*//update-begin-author:liusq date:20210809 for: 过滤上传文件类型 SsrfFileTypeFilter.checkUploadFileType(file); //update-end-author:liusq date:20210809 for: 过滤上传文件类型 @@ -146,8 +146,8 @@ public class OssBootUtil { } catch (Exception e) { log.error(e.getMessage(), e); return null; - } - return filePath; + }*/ + return ""; } /** @@ -186,7 +186,7 @@ public class OssBootUtil { */ public static String upload(FileItemStream file, String fileDir) { String filePath = null; - initOss(endPoint, accessKeyId, accessKeySecret); + /*initOss(endPoint, accessKeyId, accessKeySecret); StringBuilder fileUrl = new StringBuilder(); try { String suffix = file.getName().substring(file.getName().lastIndexOf('.')); @@ -210,7 +210,7 @@ public class OssBootUtil { } catch (IOException e) { e.printStackTrace(); return null; - } + }*/ return filePath; } @@ -229,7 +229,7 @@ public class OssBootUtil { * @param url */ public static void deleteUrl(String url, String bucket) { - String newBucket = bucketName; + /* String newBucket = bucketName; if (oConvertUtils.isNotEmpty(bucket)) { newBucket = bucket; } @@ -242,7 +242,7 @@ public class OssBootUtil { //TODO 暂时不允许删除云存储的文件 //initOss(endPoint, accessKeyId, accessKeySecret); url = url.replace(bucketUrl, ""); - ossClient.deleteObject(newBucket, url); + ossClient.deleteObject(newBucket, url);*/ } /** @@ -251,7 +251,7 @@ public class OssBootUtil { * @param fileName */ public static void delete(String fileName) { - ossClient.deleteObject(bucketName, fileName); + //ossClient.deleteObject(bucketName, fileName); } /** @@ -263,7 +263,7 @@ public class OssBootUtil { */ public static InputStream getOssFile(String objectName, String bucket) { InputStream inputStream = null; - try { + /*try { String newBucket = bucketName; if (oConvertUtils.isNotEmpty(bucket)) { newBucket = bucket; @@ -276,7 +276,7 @@ public class OssBootUtil { inputStream = new BufferedInputStream(ossObject.getObjectContent()); } catch (Exception e) { log.info("文件获取失败" + e.getMessage()); - } + }*/ return inputStream; } @@ -298,7 +298,7 @@ public class OssBootUtil { * @return */ public static String getObjectUrl(String bucketName, String objectName, Date expires) { - initOss(endPoint, accessKeyId, accessKeySecret); + /* initOss(endPoint, accessKeyId, accessKeySecret); try { //update-begin---author:liusq Date:20220120 for:替换objectName前缀,防止key不一致导致获取不到文件---- objectName = OssBootUtil.replacePrefix(objectName, bucketName); @@ -312,7 +312,7 @@ public class OssBootUtil { } } catch (Exception e) { log.info("文件路径获取失败" + e.getMessage()); - } + }*/ return null; } @@ -321,14 +321,14 @@ public class OssBootUtil { * * @return */ - private static OSSClient initOss(String endpoint, String accessKeyId, String accessKeySecret) { - if (ossClient == null) { - ossClient = new OSSClient(endpoint, - new DefaultCredentialProvider(accessKeyId, accessKeySecret), - new ClientConfiguration()); - } - return ossClient; - } + //private static OSSClient initOss(String endpoint, String accessKeyId, String accessKeySecret) { + // if (ossClient == null) { + // ossClient = new OSSClient(endpoint, + // new DefaultCredentialProvider(accessKeyId, accessKeySecret), + // new ClientConfiguration()); + // } + // return ossClient; + //} /** @@ -340,7 +340,7 @@ public class OssBootUtil { */ public static String upload(InputStream stream, String relativePath) { String filePath = null; - String fileUrl = relativePath; + /*String fileUrl = relativePath; initOss(endPoint, accessKeyId, accessKeySecret); if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith(CommonConstant.STR_HTTP)) { filePath = staticDomain + SymbolConstant.SINGLE_SLASH + relativePath; @@ -352,7 +352,7 @@ public class OssBootUtil { ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); if (result != null) { log.info("------OSS文件上传成功------" + fileUrl); - } + }*/ return filePath; } diff --git a/physical-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java b/physical-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java index 9c68f09..65b72f9 100644 --- a/physical-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java +++ b/physical-base-core/src/main/java/org/jeecg/config/WebMvcConfiguration.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; -import io.micrometer.prometheus.PrometheusMeterRegistry; +//import io.micrometer.prometheus.PrometheusMeterRegistry; import jakarta.annotation.Resource; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ObjectProvider; @@ -54,8 +54,8 @@ public class WebMvcConfiguration implements WebMvcConfigurer { @Value("${spring.resource.static-locations:}") private String staticLocations; - @Autowired(required = false) - private PrometheusMeterRegistry prometheusMeterRegistry; + //@Autowired(required = false) + //private PrometheusMeterRegistry prometheusMeterRegistry; @Autowired private ObjectProvider builderProvider; @@ -158,10 +158,10 @@ public class WebMvcConfiguration implements WebMvcConfigurer { /** * 解决metrics端点不显示jvm信息的问题(zyf) */ - @Bean - InitializingBean forcePrometheusPostProcessor(BeanPostProcessor meterRegistryPostProcessor) { - return () -> meterRegistryPostProcessor.postProcessAfterInitialization(prometheusMeterRegistry, ""); - } + //@Bean + //InitializingBean forcePrometheusPostProcessor(BeanPostProcessor meterRegistryPostProcessor) { + // return () -> meterRegistryPostProcessor.postProcessAfterInitialization(prometheusMeterRegistry, ""); + //} // /** // * 注册拦截器【拦截器拦截参数,自动切换数据源——后期实现多租户切换数据源功能】 diff --git a/physical-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java b/physical-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java index 3f2bda9..ecef9e6 100644 --- a/physical-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java +++ b/physical-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java @@ -1,38 +1,38 @@ -package org.jeecg.config; - -import org.jeecg.config.filter.WebsocketFilter; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; - -/** - * @Description: WebSocketConfig - * @author: jeecg-boot - */ -@Configuration -public class WebSocketConfig { - /** - * 注入ServerEndpointExporter, - * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint - */ - @Bean - public ServerEndpointExporter serverEndpointExporter() { - return new ServerEndpointExporter(); - } - - @Bean - public WebsocketFilter websocketFilter() { - return new WebsocketFilter(); - } - - @Bean - public FilterRegistrationBean getFilterRegistrationBean() { - FilterRegistrationBean bean = new FilterRegistrationBean(); - bean.setFilter(websocketFilter()); - //TODO 临时注释掉,测试下线上socket总断的问题 - bean.addUrlPatterns("/taskCountSocket/*", "/websocket/*", "/eoaSocket/*", "/eoaNewChatSocket/*", "/newsWebsocket/*", "/vxeSocket/*"); - return bean; - } - -} +//package org.jeecg.config; +// +//import org.jeecg.config.filter.WebsocketFilter; +//import org.springframework.boot.web.servlet.FilterRegistrationBean; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.web.socket.server.standard.ServerEndpointExporter; +// +///** +// * @Description: WebSocketConfig +// * @author: jeecg-boot +// */ +//@Configuration +//public class WebSocketConfig { +// /** +// * 注入ServerEndpointExporter, +// * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint +// */ +// @Bean +// public ServerEndpointExporter serverEndpointExporter() { +// return new ServerEndpointExporter(); +// } +// +// @Bean +// public WebsocketFilter websocketFilter() { +// return new WebsocketFilter(); +// } +// +// @Bean +// public FilterRegistrationBean getFilterRegistrationBean() { +// FilterRegistrationBean bean = new FilterRegistrationBean(); +// bean.setFilter(websocketFilter()); +// //TODO 临时注释掉,测试下线上socket总断的问题 +// bean.addUrlPatterns("/taskCountSocket/*", "/websocket/*", "/eoaSocket/*", "/eoaNewChatSocket/*", "/newsWebsocket/*", "/vxeSocket/*"); +// return bean; +// } +// +//} diff --git a/physical-launcher/pom.xml b/physical-launcher/pom.xml index 714cb50..3fc27bb 100644 --- a/physical-launcher/pom.xml +++ b/physical-launcher/pom.xml @@ -11,9 +11,13 @@ 4.0.0 physical-launcher - + + + org.springframework.boot + spring-boot-starter-web + org.jeecgframework.boot physical-system-biz diff --git a/physical-launcher/src/main/java/org/jeecg/PhysicalApplication.java b/physical-launcher/src/main/java/org/jeecg/PhysicalApplication.java index 0957169..e70e93e 100644 --- a/physical-launcher/src/main/java/org/jeecg/PhysicalApplication.java +++ b/physical-launcher/src/main/java/org/jeecg/PhysicalApplication.java @@ -1,6 +1,6 @@ package org.jeecg; -import com.xkcoding.justauth.autoconfigure.JustAuthAutoConfiguration; +//import com.xkcoding.justauth.autoconfigure.JustAuthAutoConfiguration; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.util.oConvertUtils; import org.springframework.boot.SpringApplication; @@ -22,7 +22,7 @@ import java.net.UnknownHostException; @Slf4j @SpringBootApplication @EnableAsync -@ImportAutoConfiguration(JustAuthAutoConfiguration.class) // spring boot 3.x justauth 兼容性处理 +//@ImportAutoConfiguration(JustAuthAutoConfiguration.class) // spring boot 3.x justauth 兼容性处理 //@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class}) public class PhysicalApplication extends SpringBootServletInitializer { diff --git a/physical-launcher/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java b/physical-launcher/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java index add5875..3ed1ee9 100644 --- a/physical-launcher/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java +++ b/physical-launcher/src/test/java/org/jeecg/modules/message/test/SendMessageTest.java @@ -1,142 +1,142 @@ -package org.jeecg.modules.message.test; - -import com.alibaba.fastjson.JSONObject; -import com.aliyuncs.exceptions.ClientException; -import org.jeecg.PhysicalApplication; -import org.jeecg.common.api.dto.message.BusMessageDTO; -import org.jeecg.common.api.dto.message.BusTemplateMessageDTO; -import org.jeecg.common.api.dto.message.MessageDTO; -import org.jeecg.common.api.dto.message.TemplateMessageDTO; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.constant.enums.DySmsEnum; -import org.jeecg.common.constant.enums.EmailTemplateEnum; -import org.jeecg.common.constant.enums.MessageTypeEnum; -import org.jeecg.common.constant.enums.SysAnnmentTypeEnum; -import org.jeecg.common.system.api.ISysBaseAPI; -import org.jeecg.common.util.DySmsHelper; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.HashMap; -import java.util.Map; - -/** - * @Description: 消息推送测试 - * @Author: lsq - */ -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = PhysicalApplication.class) -public class SendMessageTest { - - @Autowired - ISysBaseAPI sysBaseAPI; - - /** - * 发送系统消息 - */ - @Test - public void sendSysAnnouncement() { - //发送人 - String fromUser = "admin"; - //接收人 - String toUser = "jeecg"; - //标题 - String title = "系统消息"; - //内容 - String msgContent = "TEST:今日份日程计划已送达!"; - //发送系统消息 - sysBaseAPI.sendSysAnnouncement(new MessageDTO(fromUser, toUser, title, msgContent)); - //消息类型 - String msgCategory = CommonConstant.MSG_CATEGORY_1; - //业务类型 - String busType = SysAnnmentTypeEnum.EMAIL.getType(); - //业务ID - String busId = "11111"; - //发送带业务参数的系统消息 - BusMessageDTO busMessageDTO = new BusMessageDTO(fromUser, toUser, title, msgContent, msgCategory, busType, busId); - sysBaseAPI.sendBusAnnouncement(busMessageDTO); - } - - /** - * 发送模版消息 - */ - @Test - public void sendTemplateAnnouncement() { - //发送人 - String fromUser = "admin"; - //接收人 - String toUser = "jeecg"; - //标题 - String title = "通知公告"; - //模版编码 - String templateCode = "412358"; - //模版参数 - Map templateParam = new HashMap<>(); - templateParam.put("realname", "JEECG用户"); - sysBaseAPI.sendTemplateAnnouncement(new TemplateMessageDTO(fromUser, toUser, title, templateParam, templateCode)); - //业务类型 - String busType = SysAnnmentTypeEnum.EMAIL.getType(); - //业务ID - String busId = "11111"; - //发送带业务参数的模版消息 - BusTemplateMessageDTO busMessageDTO = new BusTemplateMessageDTO(fromUser, toUser, title, templateParam, templateCode, busType, busId); - sysBaseAPI.sendBusTemplateAnnouncement(busMessageDTO); - //新发送模版消息 - MessageDTO messageDTO = new MessageDTO(); - messageDTO.setType(MessageTypeEnum.XT.getType()); - messageDTO.setToAll(false); - messageDTO.setToUser(toUser); - messageDTO.setTitle("【流程错误】"); - messageDTO.setFromUser("admin"); - HashMap data = new HashMap<>(); - data.put(CommonConstant.NOTICE_MSG_BUS_TYPE, "msg_node"); - messageDTO.setData(data); - messageDTO.setContent("TEST:流程执行失败!任务节点未找到"); - sysBaseAPI.sendTemplateMessage(messageDTO); - } - - /** - * 发送邮件 - */ - @Test - public void sendEmailMsg() { - String title = "【日程提醒】您的日程任务即将开始"; - String content = "TEST:尊敬的王先生,您购买的演唱会将于本周日10:08分在国家大剧院如期举行,届时请携带好您的门票和身份证到场"; - String email = "250678106@qq.com"; - sysBaseAPI.sendEmailMsg(email, title, content); - } - - /** - * 发送html模版邮件 - */ - @Test - public void sendTemplateEmailMsg() { - String title = "收到一个催办"; - String email = "250678106@qq.com"; - JSONObject params = new JSONObject(); - params.put("bpm_name", "高级设置"); - params.put("bpm_task", "审批人"); - params.put("datetime", "2023-10-07 18:00:49"); - params.put("url", "http://boot3.jeecg.com/message/template"); - params.put("remark", "快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点"); - sysBaseAPI.sendHtmlTemplateEmail(email, title, EmailTemplateEnum.BPM_CUIBAN_EMAIL, params); - } - - /** - * 发送短信 - */ - @Test - public void sendSms() throws ClientException { - //手机号 - String mobile = "159***"; - //消息模版 - DySmsEnum templateCode = DySmsEnum.LOGIN_TEMPLATE_CODE; - //模版所需参数 - JSONObject obj = new JSONObject(); - obj.put("code", "4XDP"); - DySmsHelper.sendSms(mobile, obj, templateCode); - } -} +//package org.jeecg.modules.message.test; +// +//import com.alibaba.fastjson.JSONObject; +//import com.aliyuncs.exceptions.ClientException; +//import org.jeecg.PhysicalApplication; +//import org.jeecg.common.api.dto.message.BusMessageDTO; +//import org.jeecg.common.api.dto.message.BusTemplateMessageDTO; +//import org.jeecg.common.api.dto.message.MessageDTO; +//import org.jeecg.common.api.dto.message.TemplateMessageDTO; +//import org.jeecg.common.constant.CommonConstant; +//import org.jeecg.common.constant.enums.DySmsEnum; +//import org.jeecg.common.constant.enums.EmailTemplateEnum; +//import org.jeecg.common.constant.enums.MessageTypeEnum; +//import org.jeecg.common.constant.enums.SysAnnmentTypeEnum; +//import org.jeecg.common.system.api.ISysBaseAPI; +//import org.jeecg.common.util.DySmsHelper; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.junit4.SpringRunner; +// +//import java.util.HashMap; +//import java.util.Map; +// +///** +// * @Description: 消息推送测试 +// * @Author: lsq +// */ +//@RunWith(SpringRunner.class) +//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = PhysicalApplication.class) +//public class SendMessageTest { +// +// @Autowired +// ISysBaseAPI sysBaseAPI; +// +// /** +// * 发送系统消息 +// */ +// @Test +// public void sendSysAnnouncement() { +// //发送人 +// String fromUser = "admin"; +// //接收人 +// String toUser = "jeecg"; +// //标题 +// String title = "系统消息"; +// //内容 +// String msgContent = "TEST:今日份日程计划已送达!"; +// //发送系统消息 +// sysBaseAPI.sendSysAnnouncement(new MessageDTO(fromUser, toUser, title, msgContent)); +// //消息类型 +// String msgCategory = CommonConstant.MSG_CATEGORY_1; +// //业务类型 +// String busType = SysAnnmentTypeEnum.EMAIL.getType(); +// //业务ID +// String busId = "11111"; +// //发送带业务参数的系统消息 +// BusMessageDTO busMessageDTO = new BusMessageDTO(fromUser, toUser, title, msgContent, msgCategory, busType, busId); +// sysBaseAPI.sendBusAnnouncement(busMessageDTO); +// } +// +// /** +// * 发送模版消息 +// */ +// @Test +// public void sendTemplateAnnouncement() { +// //发送人 +// String fromUser = "admin"; +// //接收人 +// String toUser = "jeecg"; +// //标题 +// String title = "通知公告"; +// //模版编码 +// String templateCode = "412358"; +// //模版参数 +// Map templateParam = new HashMap<>(); +// templateParam.put("realname", "JEECG用户"); +// sysBaseAPI.sendTemplateAnnouncement(new TemplateMessageDTO(fromUser, toUser, title, templateParam, templateCode)); +// //业务类型 +// String busType = SysAnnmentTypeEnum.EMAIL.getType(); +// //业务ID +// String busId = "11111"; +// //发送带业务参数的模版消息 +// BusTemplateMessageDTO busMessageDTO = new BusTemplateMessageDTO(fromUser, toUser, title, templateParam, templateCode, busType, busId); +// sysBaseAPI.sendBusTemplateAnnouncement(busMessageDTO); +// //新发送模版消息 +// MessageDTO messageDTO = new MessageDTO(); +// messageDTO.setType(MessageTypeEnum.XT.getType()); +// messageDTO.setToAll(false); +// messageDTO.setToUser(toUser); +// messageDTO.setTitle("【流程错误】"); +// messageDTO.setFromUser("admin"); +// HashMap data = new HashMap<>(); +// data.put(CommonConstant.NOTICE_MSG_BUS_TYPE, "msg_node"); +// messageDTO.setData(data); +// messageDTO.setContent("TEST:流程执行失败!任务节点未找到"); +// sysBaseAPI.sendTemplateMessage(messageDTO); +// } +// +// /** +// * 发送邮件 +// */ +// @Test +// public void sendEmailMsg() { +// String title = "【日程提醒】您的日程任务即将开始"; +// String content = "TEST:尊敬的王先生,您购买的演唱会将于本周日10:08分在国家大剧院如期举行,届时请携带好您的门票和身份证到场"; +// String email = "250678106@qq.com"; +// sysBaseAPI.sendEmailMsg(email, title, content); +// } +// +// /** +// * 发送html模版邮件 +// */ +// @Test +// public void sendTemplateEmailMsg() { +// String title = "收到一个催办"; +// String email = "250678106@qq.com"; +// JSONObject params = new JSONObject(); +// params.put("bpm_name", "高级设置"); +// params.put("bpm_task", "审批人"); +// params.put("datetime", "2023-10-07 18:00:49"); +// params.put("url", "http://boot3.jeecg.com/message/template"); +// params.put("remark", "快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点快点"); +// sysBaseAPI.sendHtmlTemplateEmail(email, title, EmailTemplateEnum.BPM_CUIBAN_EMAIL, params); +// } +// +// /** +// * 发送短信 +// */ +// @Test +// public void sendSms() throws ClientException { +// //手机号 +// String mobile = "159***"; +// //消息模版 +// DySmsEnum templateCode = DySmsEnum.LOGIN_TEMPLATE_CODE; +// //模版所需参数 +// JSONObject obj = new JSONObject(); +// obj.put("code", "4XDP"); +// DySmsHelper.sendSms(mobile, obj, templateCode); +// } +//} diff --git a/physical-module-system/physical-system-biz/pom.xml b/physical-module-system/physical-system-biz/pom.xml index eb4c853..bb8d956 100644 --- a/physical-module-system/physical-system-biz/pom.xml +++ b/physical-module-system/physical-system-biz/pom.xml @@ -26,10 +26,10 @@ org.hibernate hibernate-core - - org.jeecgframework.boot3 - hibernate-re - + + + + org.jeecgframework.boot @@ -37,20 +37,20 @@ 3.7.0 - - org.jeecgframework - jeewx-api - + + + + - - org.jeecgframework.jimureport - jimureport-spring-boot3-starter-fastjson2 - - - org.jeecgframework.jimureport - drag-free-springboot3 - 1.1.2 - + + + + + + + + + cn.hutool hutool-core @@ -60,17 +60,17 @@ hutool-http - - org.jeecgframework.boot - jeecg-boot-starter3-chatgpt - 3.7.0 - - - cn.hutool - hutool-all - - - + + + + + + + + + + + org.jsoup diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/init/CodeGenerateDbConfig.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/init/CodeGenerateDbConfig.java index 5d9e138..6781131 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/init/CodeGenerateDbConfig.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/init/CodeGenerateDbConfig.java @@ -3,7 +3,7 @@ package org.jeecg.config.init; import com.alibaba.druid.filter.config.ConfigTools; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.jeecgframework.codegenerate.database.CodegenDatasourceConfig; +//import org.jeecgframework.codegenerate.database.CodegenDatasourceConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -46,7 +46,7 @@ public class CodeGenerateDbConfig { log.error(" 代码生成器数据库连接,数据库密码解密失败!"); } } - CodegenDatasourceConfig.initDbConfig(driverClassName, url, username, password); + //CodegenDatasourceConfig.initDbConfig(driverClassName, url, username, password); log.info(" Init CodeGenerate Config [ Get Db Config From application.yml ] "); } return null; diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/jimureport/JimuDragExternalServiceImpl.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/jimureport/JimuDragExternalServiceImpl.java index 18f51a4..01bde38 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/jimureport/JimuDragExternalServiceImpl.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/jimureport/JimuDragExternalServiceImpl.java @@ -1,105 +1,105 @@ -package org.jeecg.config.jimureport; - -import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.api.dto.LogDTO; -import org.jeecg.common.system.api.ISysBaseAPI; -import org.jeecg.common.system.vo.DictModel; -import org.jeecg.common.util.oConvertUtils; -import org.jeecg.modules.base.service.BaseCommonService; -import org.jeecg.modules.drag.service.IOnlDragExternalService; -import org.jeecg.modules.drag.vo.DragDictModel; -import org.jeecg.modules.drag.vo.DragLogDTO; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @Description: 字典处理 - * @Author: lsq - * @Date:2023-01-09 - * @Version:V1.0 - */ -@Slf4j -@Service("onlDragExternalServiceImpl") -public class JimuDragExternalServiceImpl implements IOnlDragExternalService { - - @Autowired - @Lazy - private BaseCommonService baseCommonService; - - @Autowired - @Lazy - private ISysBaseAPI sysBaseApi; - - /** - * 根据多个字典code查询多个字典项 - * - * @param codeList - * @return key = dictCode ; value=对应的字典项 - */ - @Override - public Map> getManyDictItems(List codeList) { - Map> manyDragDictItems = new HashMap<>(); - Map> dictItemsMap = sysBaseApi.getManyDictItems(codeList); - dictItemsMap.forEach((k, v) -> { - List dictItems = new ArrayList<>(); - v.forEach(dictItem -> { - DragDictModel dictModel = new DragDictModel(); - BeanUtils.copyProperties(dictItem, dictModel); - dictItems.add(dictModel); - }); - manyDragDictItems.put(k, dictItems); - }); - return manyDragDictItems; - } - - /** - * @param dictCode - * @return - */ - @Override - public List getDictItems(String dictCode) { - List dictItems = new ArrayList<>(); - if (oConvertUtils.isNotEmpty(dictCode)) { - List dictItemsList = sysBaseApi.getDictItems(dictCode); - dictItemsList.forEach(dictItem -> { - DragDictModel dictModel = new DragDictModel(); - BeanUtils.copyProperties(dictItem, dictModel); - dictItems.add(dictModel); - }); - } - return dictItems; - } - - /** - * 添加日志 - * - * @param dragLogDTO - */ - @Override - public void addLog(DragLogDTO dragLogDTO) { - if (oConvertUtils.isNotEmpty(dragLogDTO)) { - LogDTO dto = new LogDTO(); - BeanUtils.copyProperties(dragLogDTO, dto); - baseCommonService.addLog(dto); - } - } - - /** - * 保存日志 - * - * @param logMsg - * @param logType - * @param operateType - */ - @Override - public void addLog(String logMsg, int logType, int operateType) { - baseCommonService.addLog(logMsg, logType, operateType); - } -} \ No newline at end of file +//package org.jeecg.config.jimureport; +// +//import lombok.extern.slf4j.Slf4j; +//import org.jeecg.common.api.dto.LogDTO; +//import org.jeecg.common.system.api.ISysBaseAPI; +//import org.jeecg.common.system.vo.DictModel; +//import org.jeecg.common.util.oConvertUtils; +//import org.jeecg.modules.base.service.BaseCommonService; +//import org.jeecg.modules.drag.service.IOnlDragExternalService; +//import org.jeecg.modules.drag.vo.DragDictModel; +//import org.jeecg.modules.drag.vo.DragLogDTO; +//import org.springframework.beans.BeanUtils; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Lazy; +//import org.springframework.stereotype.Service; +// +//import java.util.ArrayList; +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +// +///** +// * @Description: 字典处理 +// * @Author: lsq +// * @Date:2023-01-09 +// * @Version:V1.0 +// */ +//@Slf4j +//@Service("onlDragExternalServiceImpl") +//public class JimuDragExternalServiceImpl implements IOnlDragExternalService { +// +// @Autowired +// @Lazy +// private BaseCommonService baseCommonService; +// +// @Autowired +// @Lazy +// private ISysBaseAPI sysBaseApi; +// +// /** +// * 根据多个字典code查询多个字典项 +// * +// * @param codeList +// * @return key = dictCode ; value=对应的字典项 +// */ +// @Override +// public Map> getManyDictItems(List codeList) { +// Map> manyDragDictItems = new HashMap<>(); +// Map> dictItemsMap = sysBaseApi.getManyDictItems(codeList); +// dictItemsMap.forEach((k, v) -> { +// List dictItems = new ArrayList<>(); +// v.forEach(dictItem -> { +// DragDictModel dictModel = new DragDictModel(); +// BeanUtils.copyProperties(dictItem, dictModel); +// dictItems.add(dictModel); +// }); +// manyDragDictItems.put(k, dictItems); +// }); +// return manyDragDictItems; +// } +// +// /** +// * @param dictCode +// * @return +// */ +// @Override +// public List getDictItems(String dictCode) { +// List dictItems = new ArrayList<>(); +// if (oConvertUtils.isNotEmpty(dictCode)) { +// List dictItemsList = sysBaseApi.getDictItems(dictCode); +// dictItemsList.forEach(dictItem -> { +// DragDictModel dictModel = new DragDictModel(); +// BeanUtils.copyProperties(dictItem, dictModel); +// dictItems.add(dictModel); +// }); +// } +// return dictItems; +// } +// +// /** +// * 添加日志 +// * +// * @param dragLogDTO +// */ +// @Override +// public void addLog(DragLogDTO dragLogDTO) { +// if (oConvertUtils.isNotEmpty(dragLogDTO)) { +// LogDTO dto = new LogDTO(); +// BeanUtils.copyProperties(dragLogDTO, dto); +// baseCommonService.addLog(dto); +// } +// } +// +// /** +// * 保存日志 +// * +// * @param logMsg +// * @param logType +// * @param operateType +// */ +// @Override +// public void addLog(String logMsg, int logType, int operateType) { +// baseCommonService.addLog(logMsg, logType, operateType); +// } +//} \ No newline at end of file diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java index 29482d8..5a918bd 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/config/jimureport/JimuReportTokenService.java @@ -1,82 +1,82 @@ -package org.jeecg.config.jimureport; - -import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.system.util.JwtUtil; -import org.jeecg.common.system.vo.SysUserCacheInfo; -import org.jeecg.common.util.RedisUtil; -import org.jeecg.common.util.TokenUtils; -import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; -import org.jeecg.modules.system.service.impl.SysBaseApiImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -/** - * 自定义积木报表鉴权(如果不进行自定义,则所有请求不做权限控制) - * * 1.自定义获取登录token - * * 2.自定义获取登录用户 - * - * @author: jeecg-boot - */ - - -@Slf4j -@Component -public class JimuReportTokenService implements JmReportTokenServiceI { - @Autowired - private SysBaseApiImpl sysBaseApi; - @Autowired - @Lazy - private RedisUtil redisUtil; - - @Override - public String getToken(HttpServletRequest request) { - return TokenUtils.getTokenByRequest(request); - } - - @Override - public String getUsername(String token) { - return JwtUtil.getUsername(token); - } - - @Override - public String[] getRoles(String token) { - String username = JwtUtil.getUsername(token); - Set roles = sysBaseApi.getUserRoleSet(username); - if (CollectionUtils.isEmpty(roles)) { - return null; - } - return (String[]) roles.toArray(new String[roles.size()]); - } - - @Override - public Boolean verifyToken(String token) { - return TokenUtils.verifyToken(token, sysBaseApi, redisUtil); - } - - @Override - public Map getUserInfo(String token) { - Map map = new HashMap(5); - String username = JwtUtil.getUsername(token); - //此处通过token只能拿到一个信息 用户账号 后面的就是根据账号获取其他信息 查询数据或是走redis 用户根据自身业务可自定义 - SysUserCacheInfo userInfo = null; - try { - userInfo = sysBaseApi.getCacheUser(username); - } catch (Exception e) { - log.error("获取用户信息异常:" + e.getMessage()); - return map; - } - //设置账号名 - map.put(SYS_USER_CODE, userInfo.getSysUserCode()); - //设置部门编码 - map.put(SYS_ORG_CODE, userInfo.getSysOrgCode()); - // 将所有信息存放至map 解析sql/api会根据map的键值解析 - return map; - } -} +//package org.jeecg.config.jimureport; +// +//import jakarta.servlet.http.HttpServletRequest; +//import lombok.extern.slf4j.Slf4j; +//import org.jeecg.common.system.util.JwtUtil; +//import org.jeecg.common.system.vo.SysUserCacheInfo; +//import org.jeecg.common.util.RedisUtil; +//import org.jeecg.common.util.TokenUtils; +////import org.jeecg.modules.jmreport.api.JmReportTokenServiceI; +//import org.jeecg.modules.system.service.impl.SysBaseApiImpl; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Lazy; +//import org.springframework.stereotype.Component; +//import org.springframework.util.CollectionUtils; +// +//import java.util.HashMap; +//import java.util.Map; +//import java.util.Set; +// +///** +// * 自定义积木报表鉴权(如果不进行自定义,则所有请求不做权限控制) +// * * 1.自定义获取登录token +// * * 2.自定义获取登录用户 +// * +// * @author: jeecg-boot +// */ +// +// +//@Slf4j +//@Component +//public class JimuReportTokenService implements JmReportTokenServiceI { +// @Autowired +// private SysBaseApiImpl sysBaseApi; +// @Autowired +// @Lazy +// private RedisUtil redisUtil; +// +// @Override +// public String getToken(HttpServletRequest request) { +// return TokenUtils.getTokenByRequest(request); +// } +// +// @Override +// public String getUsername(String token) { +// return JwtUtil.getUsername(token); +// } +// +// @Override +// public String[] getRoles(String token) { +// String username = JwtUtil.getUsername(token); +// Set roles = sysBaseApi.getUserRoleSet(username); +// if (CollectionUtils.isEmpty(roles)) { +// return null; +// } +// return (String[]) roles.toArray(new String[roles.size()]); +// } +// +// @Override +// public Boolean verifyToken(String token) { +// return TokenUtils.verifyToken(token, sysBaseApi, redisUtil); +// } +// +// @Override +// public Map getUserInfo(String token) { +// Map map = new HashMap(5); +// String username = JwtUtil.getUsername(token); +// //此处通过token只能拿到一个信息 用户账号 后面的就是根据账号获取其他信息 查询数据或是走redis 用户根据自身业务可自定义 +// SysUserCacheInfo userInfo = null; +// try { +// userInfo = sysBaseApi.getCacheUser(username); +// } catch (Exception e) { +// log.error("获取用户信息异常:" + e.getMessage()); +// return map; +// } +// //设置账号名 +// map.put(SYS_USER_CODE, userInfo.getSysUserCode()); +// //设置部门编码 +// map.put(SYS_ORG_CODE, userInfo.getSysOrgCode()); +// // 将所有信息存放至map 解析sql/api会根据map的键值解析 +// return map; +// } +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/cas/util/CasServiceUtil.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/cas/util/CasServiceUtil.java index e331752..d4850c5 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/cas/util/CasServiceUtil.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/cas/util/CasServiceUtil.java @@ -1,106 +1,106 @@ -package org.jeecg.modules.cas.util; - -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.conn.socket.LayeredConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.security.cert.X509Certificate; - -/** - * @Description: CasServiceUtil - * @author: jeecg-boot - */ -public class CasServiceUtil { - - public static void main(String[] args) { - String serviceUrl = "https://cas.8f8.com.cn:8443/cas/p3/serviceValidate"; - String service = "http://localhost:3003/user/login"; - String ticket = "ST-5-1g-9cNES6KXNRwq-GuRET103sm0-DESKTOP-VKLS8B3"; - String res = getStValidate(serviceUrl, ticket, service); - - System.out.println("---------res-----" + res); - } - - - /** - * 验证ST - */ - public static String getStValidate(String url, String st, String service) { - try { - url = url + "?service=" + service + "&ticket=" + st; - CloseableHttpClient httpclient = createHttpClientWithNoSsl(); - HttpGet httpget = new HttpGet(url); - HttpResponse response = httpclient.execute(httpget); - String res = readResponse(response); - return res == null ? null : (res == "" ? null : res); - } catch (Exception e) { - e.printStackTrace(); - } - return ""; - } - - - /** - * 读取 response body 内容为字符串 - * - * @param response - * @return - * @throws IOException - */ - private static String readResponse(HttpResponse response) throws IOException { - BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); - String result = new String(); - String line; - while ((line = in.readLine()) != null) { - result += line; - } - return result; - } - - - /** - * 创建模拟客户端(针对 https 客户端禁用 SSL 验证) - * - * @param cookieStore 缓存的 Cookies 信息 - * @return - * @throws Exception - */ - private static CloseableHttpClient createHttpClientWithNoSsl() throws Exception { - // Create a trust manager that does not validate certificate chains - TrustManager[] trustAllCerts = new TrustManager[]{ - new X509TrustManager() { - @Override - public X509Certificate[] getAcceptedIssuers() { - return null; - } - - @Override - public void checkClientTrusted(X509Certificate[] certs, String authType) { - // don't check - } - - @Override - public void checkServerTrusted(X509Certificate[] certs, String authType) { - // don't check - } - } - }; - - SSLContext ctx = SSLContext.getInstance("TLS"); - ctx.init(null, trustAllCerts, null); - LayeredConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(ctx); - return HttpClients.custom() - .setSSLSocketFactory(sslSocketFactory) - .build(); - } - -} +//package org.jeecg.modules.cas.util; +// +//import org.apache.http.HttpResponse; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.conn.socket.LayeredConnectionSocketFactory; +//import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +// +//import javax.net.ssl.SSLContext; +//import javax.net.ssl.TrustManager; +//import javax.net.ssl.X509TrustManager; +//import java.io.BufferedReader; +//import java.io.IOException; +//import java.io.InputStreamReader; +//import java.security.cert.X509Certificate; +// +///** +// * @Description: CasServiceUtil +// * @author: jeecg-boot +// */ +//public class CasServiceUtil { +// +// public static void main(String[] args) { +// String serviceUrl = "https://cas.8f8.com.cn:8443/cas/p3/serviceValidate"; +// String service = "http://localhost:3003/user/login"; +// String ticket = "ST-5-1g-9cNES6KXNRwq-GuRET103sm0-DESKTOP-VKLS8B3"; +// String res = getStValidate(serviceUrl, ticket, service); +// +// System.out.println("---------res-----" + res); +// } +// +// +// /** +// * 验证ST +// */ +// public static String getStValidate(String url, String st, String service) { +// try { +// url = url + "?service=" + service + "&ticket=" + st; +// CloseableHttpClient httpclient = createHttpClientWithNoSsl(); +// HttpGet httpget = new HttpGet(url); +// HttpResponse response = httpclient.execute(httpget); +// String res = readResponse(response); +// return res == null ? null : (res == "" ? null : res); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// return ""; +// } +// +// +// /** +// * 读取 response body 内容为字符串 +// * +// * @param response +// * @return +// * @throws IOException +// */ +// private static String readResponse(HttpResponse response) throws IOException { +// BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); +// String result = new String(); +// String line; +// while ((line = in.readLine()) != null) { +// result += line; +// } +// return result; +// } +// +// +// /** +// * 创建模拟客户端(针对 https 客户端禁用 SSL 验证) +// * +// * @param cookieStore 缓存的 Cookies 信息 +// * @return +// * @throws Exception +// */ +// private static CloseableHttpClient createHttpClientWithNoSsl() throws Exception { +// // Create a trust manager that does not validate certificate chains +// TrustManager[] trustAllCerts = new TrustManager[]{ +// new X509TrustManager() { +// @Override +// public X509Certificate[] getAcceptedIssuers() { +// return null; +// } +// +// @Override +// public void checkClientTrusted(X509Certificate[] certs, String authType) { +// // don't check +// } +// +// @Override +// public void checkServerTrusted(X509Certificate[] certs, String authType) { +// // don't check +// } +// } +// }; +// +// SSLContext ctx = SSLContext.getInstance("TLS"); +// ctx.init(null, trustAllCerts, null); +// LayeredConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(ctx); +// return HttpClients.custom() +// .setSSLSocketFactory(sslSocketFactory) +// .build(); +// } +// +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/DdSendMsgHandle.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/DdSendMsgHandle.java index 633e70d..91e8425 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/DdSendMsgHandle.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/DdSendMsgHandle.java @@ -1,37 +1,37 @@ -package org.jeecg.modules.message.handle.impl; - -import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.api.dto.message.MessageDTO; -import org.jeecg.modules.message.handle.ISendMsgHandle; -import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @Description: 发钉钉消息模板 - * @author: jeecg-boot - */ -@Slf4j -@Component("ddSendMsgHandle") -public class DdSendMsgHandle implements ISendMsgHandle { - - @Autowired - private ThirdAppDingtalkServiceImpl dingtalkService; - - @Override - public void sendMsg(String esReceiver, String esTitle, String esContent) { - log.info("发微信消息模板"); - MessageDTO messageDTO = new MessageDTO(); - messageDTO.setToUser(esReceiver); - messageDTO.setTitle(esTitle); - messageDTO.setContent(esContent); - messageDTO.setToAll(false); - sendMessage(messageDTO); - } - - @Override - public void sendMessage(MessageDTO messageDTO) { - dingtalkService.sendMessage(messageDTO, true); - } - -} +//package org.jeecg.modules.message.handle.impl; +// +//import lombok.extern.slf4j.Slf4j; +//import org.jeecg.common.api.dto.message.MessageDTO; +//import org.jeecg.modules.message.handle.ISendMsgHandle; +//import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +// +///** +// * @Description: 发钉钉消息模板 +// * @author: jeecg-boot +// */ +//@Slf4j +//@Component("ddSendMsgHandle") +//public class DdSendMsgHandle implements ISendMsgHandle { +// +// @Autowired +// private ThirdAppDingtalkServiceImpl dingtalkService; +// +// @Override +// public void sendMsg(String esReceiver, String esTitle, String esContent) { +// log.info("发微信消息模板"); +// MessageDTO messageDTO = new MessageDTO(); +// messageDTO.setToUser(esReceiver); +// messageDTO.setTitle(esTitle); +// messageDTO.setContent(esContent); +// messageDTO.setToAll(false); +// sendMessage(messageDTO); +// } +// +// @Override +// public void sendMessage(MessageDTO messageDTO) { +// dingtalkService.sendMessage(messageDTO, true); +// } +// +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java index f4cffec..b61c68c 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java @@ -1,219 +1,219 @@ -package org.jeecg.modules.message.handle.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import jakarta.mail.MessagingException; -import jakarta.mail.internet.MimeMessage; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ObjectUtils; -import org.jeecg.common.api.dto.message.MessageDTO; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.system.util.JwtUtil; -import org.jeecg.common.util.RedisUtil; -import org.jeecg.common.util.SpringContextUtils; -import org.jeecg.common.util.oConvertUtils; -import org.jeecg.config.StaticConfig; -import org.jeecg.modules.message.handle.ISendMsgHandle; -import org.jeecg.modules.system.entity.SysUser; -import org.jeecg.modules.system.mapper.SysUserMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; -import org.springframework.stereotype.Component; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.List; -import java.util.Set; - -/** - * @Description: 邮箱发送信息 - * @author: jeecg-boot - */ -@Slf4j -@Component("emailSendMsgHandle") -public class EmailSendMsgHandle implements ISendMsgHandle { - static String emailFrom; - - public static void setEmailFrom(String emailFrom) { - EmailSendMsgHandle.emailFrom = emailFrom; - } - - @Autowired - SysUserMapper sysUserMapper; - - @Autowired - private RedisUtil redisUtil; - - /** - * 真实姓名变量 - */ - private static final String realNameExp = "{REALNAME}"; - - - @Override - public void sendMsg(String esReceiver, String esTitle, String esContent) { - JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender"); - MimeMessage message = mailSender.createMimeMessage(); - MimeMessageHelper helper = null; - //update-begin-author:taoyan date:20200811 for:配置类数据获取 - if (oConvertUtils.isEmpty(emailFrom)) { - StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class); - setEmailFrom(staticConfig.getEmailFrom()); - } - //update-end-author:taoyan date:20200811 for:配置类数据获取 - try { - helper = new MimeMessageHelper(message, true); - // 设置发送方邮箱地址 - helper.setFrom(emailFrom); - helper.setTo(esReceiver); - helper.setSubject(esTitle); - helper.setText(esContent, true); - mailSender.send(message); - } catch (MessagingException e) { - e.printStackTrace(); - } - - } - - @Override - public void sendMessage(MessageDTO messageDTO) { - String[] arr = messageDTO.getToUser().split(","); - LambdaQueryWrapper query = new LambdaQueryWrapper().in(SysUser::getUsername, arr); - List list = sysUserMapper.selectList(query); - String content = messageDTO.getContent(); - String title = messageDTO.getTitle(); - for (SysUser user : list) { - String email = user.getEmail(); - if (ObjectUtils.isEmpty(email)) { - continue; - } - content = replaceContent(user, content); - log.info("邮件内容:" + content); - sendMsg(email, title, content); - } - - //update-begin-author:taoyan date:2023-6-20 for: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段,流程中,邮件发送节点,邮件接收人 不可选择邮箱 - Set toEmailList = messageDTO.getToEmailList(); - if (toEmailList != null && toEmailList.size() > 0) { - for (String email : toEmailList) { - if (ObjectUtils.isEmpty(email)) { - continue; - } - log.info("邮件内容:" + content); - sendMsg(email, title, content); - } - } - //update-end-author:taoyan date:2023-6-20 for: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段,流程中,邮件发送节点,邮件接收人 不可选择邮箱 - - //发送给抄送人 - sendMessageToCopyUser(messageDTO); - } - - /** - * 发送邮件给抄送人 - * - * @param messageDTO - */ - public void sendMessageToCopyUser(MessageDTO messageDTO) { - String copyToUser = messageDTO.getCopyToUser(); - if (ObjectUtils.isNotEmpty(copyToUser)) { - LambdaQueryWrapper query = new LambdaQueryWrapper().in(SysUser::getUsername, copyToUser.split(",")); - List list = sysUserMapper.selectList(query); - String content = messageDTO.getContent(); - String title = messageDTO.getTitle(); - - for (SysUser user : list) { - String email = user.getEmail(); - if (ObjectUtils.isEmpty(email)) { - continue; - } - content = replaceContent(user, content); - log.info("邮件内容:" + content); - - //update-begin-author:taoyan date:2023-6-20 for: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段,流程中,邮件发送节点,邮件接收人 不可选择邮箱 - sendEmail(email, content, title); - } - - Set ccEmailList = messageDTO.getCcEmailList(); - if (ccEmailList != null && ccEmailList.size() > 0) { - for (String email : ccEmailList) { - if (ObjectUtils.isEmpty(email)) { - continue; - } - log.info("邮件内容:" + content); - sendEmail(email, content, title); - } - } - - } - } - - /** - * 发送邮件给抄送人调用 - * - * @param email - * @param content - * @param title - */ - private void sendEmail(String email, String content, String title) { - JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender"); - MimeMessage message = mailSender.createMimeMessage(); - MimeMessageHelper helper = null; - if (oConvertUtils.isEmpty(emailFrom)) { - StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class); - setEmailFrom(staticConfig.getEmailFrom()); - } - try { - helper = new MimeMessageHelper(message, true); - // 设置发送方邮箱地址 - helper.setFrom(emailFrom); - helper.setTo(email); - //设置抄送人 - helper.setCc(email); - helper.setSubject(title); - helper.setText(content, true); - mailSender.send(message); - } catch (MessagingException e) { - e.printStackTrace(); - } - } - //update-end-author:taoyan date:2023-6-20 for: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段,流程中,邮件发送节点,邮件接收人 不可选择邮箱 - - - /** - * 替换邮件内容变量 - * - * @param user - * @param content - * @return - */ - private String replaceContent(SysUser user, String content) { - if (content.indexOf(realNameExp) > 0) { - content = content.replace("$" + realNameExp, user.getRealname()).replace(realNameExp, user.getRealname()); - } - if (content.indexOf(CommonConstant.LOGIN_TOKEN) > 0) { - String token = getToken(user); - try { - content = content.replace(CommonConstant.LOGIN_TOKEN, URLEncoder.encode(token, "UTF-8")); - } catch (UnsupportedEncodingException e) { - log.error("邮件消息token编码失败", e.getMessage()); - } - } - return content; - } - - /** - * 获取token - * - * @param user - * @return - */ - private String getToken(SysUser user) { - // 生成token - String token = JwtUtil.sign(user.getUsername(), user.getPassword()); - redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); - // 设置超时时间 1个小时 - redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 1 / 1000); - return token; - } -} +//package org.jeecg.modules.message.handle.impl; +// +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import jakarta.mail.MessagingException; +//import jakarta.mail.internet.MimeMessage; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.commons.lang3.ObjectUtils; +//import org.jeecg.common.api.dto.message.MessageDTO; +//import org.jeecg.common.constant.CommonConstant; +//import org.jeecg.common.system.util.JwtUtil; +//import org.jeecg.common.util.RedisUtil; +//import org.jeecg.common.util.SpringContextUtils; +//import org.jeecg.common.util.oConvertUtils; +//import org.jeecg.config.StaticConfig; +//import org.jeecg.modules.message.handle.ISendMsgHandle; +//import org.jeecg.modules.system.entity.SysUser; +//import org.jeecg.modules.system.mapper.SysUserMapper; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.mail.javamail.JavaMailSender; +//import org.springframework.mail.javamail.MimeMessageHelper; +//import org.springframework.stereotype.Component; +// +//import java.io.UnsupportedEncodingException; +//import java.net.URLEncoder; +//import java.util.List; +//import java.util.Set; +// +///** +// * @Description: 邮箱发送信息 +// * @author: jeecg-boot +// */ +//@Slf4j +//@Component("emailSendMsgHandle") +//public class EmailSendMsgHandle implements ISendMsgHandle { +// static String emailFrom; +// +// public static void setEmailFrom(String emailFrom) { +// EmailSendMsgHandle.emailFrom = emailFrom; +// } +// +// @Autowired +// SysUserMapper sysUserMapper; +// +// @Autowired +// private RedisUtil redisUtil; +// +// /** +// * 真实姓名变量 +// */ +// private static final String realNameExp = "{REALNAME}"; +// +// +// @Override +// public void sendMsg(String esReceiver, String esTitle, String esContent) { +// JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender"); +// MimeMessage message = mailSender.createMimeMessage(); +// MimeMessageHelper helper = null; +// //update-begin-author:taoyan date:20200811 for:配置类数据获取 +// if (oConvertUtils.isEmpty(emailFrom)) { +// StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class); +// setEmailFrom(staticConfig.getEmailFrom()); +// } +// //update-end-author:taoyan date:20200811 for:配置类数据获取 +// try { +// helper = new MimeMessageHelper(message, true); +// // 设置发送方邮箱地址 +// helper.setFrom(emailFrom); +// helper.setTo(esReceiver); +// helper.setSubject(esTitle); +// helper.setText(esContent, true); +// mailSender.send(message); +// } catch (MessagingException e) { +// e.printStackTrace(); +// } +// +// } +// +// @Override +// public void sendMessage(MessageDTO messageDTO) { +// String[] arr = messageDTO.getToUser().split(","); +// LambdaQueryWrapper query = new LambdaQueryWrapper().in(SysUser::getUsername, arr); +// List list = sysUserMapper.selectList(query); +// String content = messageDTO.getContent(); +// String title = messageDTO.getTitle(); +// for (SysUser user : list) { +// String email = user.getEmail(); +// if (ObjectUtils.isEmpty(email)) { +// continue; +// } +// content = replaceContent(user, content); +// log.info("邮件内容:" + content); +// sendMsg(email, title, content); +// } +// +// //update-begin-author:taoyan date:2023-6-20 for: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段,流程中,邮件发送节点,邮件接收人 不可选择邮箱 +// Set toEmailList = messageDTO.getToEmailList(); +// if (toEmailList != null && toEmailList.size() > 0) { +// for (String email : toEmailList) { +// if (ObjectUtils.isEmpty(email)) { +// continue; +// } +// log.info("邮件内容:" + content); +// sendMsg(email, title, content); +// } +// } +// //update-end-author:taoyan date:2023-6-20 for: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段,流程中,邮件发送节点,邮件接收人 不可选择邮箱 +// +// //发送给抄送人 +// sendMessageToCopyUser(messageDTO); +// } +// +// /** +// * 发送邮件给抄送人 +// * +// * @param messageDTO +// */ +// public void sendMessageToCopyUser(MessageDTO messageDTO) { +// String copyToUser = messageDTO.getCopyToUser(); +// if (ObjectUtils.isNotEmpty(copyToUser)) { +// LambdaQueryWrapper query = new LambdaQueryWrapper().in(SysUser::getUsername, copyToUser.split(",")); +// List list = sysUserMapper.selectList(query); +// String content = messageDTO.getContent(); +// String title = messageDTO.getTitle(); +// +// for (SysUser user : list) { +// String email = user.getEmail(); +// if (ObjectUtils.isEmpty(email)) { +// continue; +// } +// content = replaceContent(user, content); +// log.info("邮件内容:" + content); +// +// //update-begin-author:taoyan date:2023-6-20 for: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段,流程中,邮件发送节点,邮件接收人 不可选择邮箱 +// sendEmail(email, content, title); +// } +// +// Set ccEmailList = messageDTO.getCcEmailList(); +// if (ccEmailList != null && ccEmailList.size() > 0) { +// for (String email : ccEmailList) { +// if (ObjectUtils.isEmpty(email)) { +// continue; +// } +// log.info("邮件内容:" + content); +// sendEmail(email, content, title); +// } +// } +// +// } +// } +// +// /** +// * 发送邮件给抄送人调用 +// * +// * @param email +// * @param content +// * @param title +// */ +// private void sendEmail(String email, String content, String title) { +// JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender"); +// MimeMessage message = mailSender.createMimeMessage(); +// MimeMessageHelper helper = null; +// if (oConvertUtils.isEmpty(emailFrom)) { +// StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class); +// setEmailFrom(staticConfig.getEmailFrom()); +// } +// try { +// helper = new MimeMessageHelper(message, true); +// // 设置发送方邮箱地址 +// helper.setFrom(emailFrom); +// helper.setTo(email); +// //设置抄送人 +// helper.setCc(email); +// helper.setSubject(title); +// helper.setText(content, true); +// mailSender.send(message); +// } catch (MessagingException e) { +// e.printStackTrace(); +// } +// } +// //update-end-author:taoyan date:2023-6-20 for: QQYUN-5557【简流】通知节点 发送邮箱 表单上有一个邮箱字段,流程中,邮件发送节点,邮件接收人 不可选择邮箱 +// +// +// /** +// * 替换邮件内容变量 +// * +// * @param user +// * @param content +// * @return +// */ +// private String replaceContent(SysUser user, String content) { +// if (content.indexOf(realNameExp) > 0) { +// content = content.replace("$" + realNameExp, user.getRealname()).replace(realNameExp, user.getRealname()); +// } +// if (content.indexOf(CommonConstant.LOGIN_TOKEN) > 0) { +// String token = getToken(user); +// try { +// content = content.replace(CommonConstant.LOGIN_TOKEN, URLEncoder.encode(token, "UTF-8")); +// } catch (UnsupportedEncodingException e) { +// log.error("邮件消息token编码失败", e.getMessage()); +// } +// } +// return content; +// } +// +// /** +// * 获取token +// * +// * @param user +// * @return +// */ +// private String getToken(SysUser user) { +// // 生成token +// String token = JwtUtil.sign(user.getUsername(), user.getPassword()); +// redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); +// // 设置超时时间 1个小时 +// redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 1 / 1000); +// return token; +// } +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/QywxSendMsgHandle.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/QywxSendMsgHandle.java index 7bdf485..4f7b7dc 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/QywxSendMsgHandle.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/message/handle/impl/QywxSendMsgHandle.java @@ -1,37 +1,37 @@ -package org.jeecg.modules.message.handle.impl; - -import lombok.extern.slf4j.Slf4j; -import org.jeecg.common.api.dto.message.MessageDTO; -import org.jeecg.modules.message.handle.ISendMsgHandle; -import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @Description: 发企业微信消息模板 - * @author: jeecg-boot - */ -@Slf4j -@Component("qywxSendMsgHandle") -public class QywxSendMsgHandle implements ISendMsgHandle { - - @Autowired - private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; - - @Override - public void sendMsg(String esReceiver, String esTitle, String esContent) { - log.info("发微信消息模板"); - MessageDTO messageDTO = new MessageDTO(); - messageDTO.setToUser(esReceiver); - messageDTO.setTitle(esTitle); - messageDTO.setContent(esContent); - messageDTO.setToAll(false); - sendMessage(messageDTO); - } - - @Override - public void sendMessage(MessageDTO messageDTO) { - wechatEnterpriseService.sendMessage(messageDTO, true); - } - -} +//package org.jeecg.modules.message.handle.impl; +// +//import lombok.extern.slf4j.Slf4j; +//import org.jeecg.common.api.dto.message.MessageDTO; +//import org.jeecg.modules.message.handle.ISendMsgHandle; +//import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +// +///** +// * @Description: 发企业微信消息模板 +// * @author: jeecg-boot +// */ +//@Slf4j +//@Component("qywxSendMsgHandle") +//public class QywxSendMsgHandle implements ISendMsgHandle { +// +// @Autowired +// private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; +// +// @Override +// public void sendMsg(String esReceiver, String esTitle, String esContent) { +// log.info("发微信消息模板"); +// MessageDTO messageDTO = new MessageDTO(); +// messageDTO.setToUser(esReceiver); +// messageDTO.setTitle(esTitle); +// messageDTO.setContent(esContent); +// messageDTO.setToAll(false); +// sendMessage(messageDTO); +// } +// +// @Override +// public void sendMessage(MessageDTO messageDTO) { +// wechatEnterpriseService.sendMessage(messageDTO, true); +// } +// +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java index caab1c6..f34bcca 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/cache/AuthStateRedisCache.java @@ -1,69 +1,69 @@ -package org.jeecg.modules.system.cache; - -import jakarta.annotation.PostConstruct; -import me.zhyd.oauth.cache.AuthCacheConfig; -import me.zhyd.oauth.cache.AuthStateCache; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; - -import java.util.concurrent.TimeUnit; - - -public class AuthStateRedisCache implements AuthStateCache { - - @Autowired - private RedisTemplate redisTemplate; - - private ValueOperations valueOperations; - - @PostConstruct - public void init() { - valueOperations = redisTemplate.opsForValue(); - } - - /** - * 存入缓存,默认3分钟 - * - * @param key 缓存key - * @param value 缓存内容 - */ - @Override - public void cache(String key, String value) { - valueOperations.set(key, value, AuthCacheConfig.timeout, TimeUnit.MILLISECONDS); - } - - /** - * 存入缓存 - * - * @param key 缓存key - * @param value 缓存内容 - * @param timeout 指定缓存过期时间(毫秒) - */ - @Override - public void cache(String key, String value, long timeout) { - valueOperations.set(key, value, timeout, TimeUnit.MILLISECONDS); - } - - /** - * 获取缓存内容 - * - * @param key 缓存key - * @return 缓存内容 - */ - @Override - public String get(String key) { - return valueOperations.get(key); - } - - /** - * 是否存在key,如果对应key的value值已过期,也返回false - * - * @param key 缓存key - * @return true:存在key,并且value没过期;false:key不存在或者已过期 - */ - @Override - public boolean containsKey(String key) { - return redisTemplate.hasKey(key); - } -} +//package org.jeecg.modules.system.cache; +// +//import jakarta.annotation.PostConstruct; +//import me.zhyd.oauth.cache.AuthCacheConfig; +//import me.zhyd.oauth.cache.AuthStateCache; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.data.redis.core.ValueOperations; +// +//import java.util.concurrent.TimeUnit; +// +// +//public class AuthStateRedisCache implements AuthStateCache { +// +// @Autowired +// private RedisTemplate redisTemplate; +// +// private ValueOperations valueOperations; +// +// @PostConstruct +// public void init() { +// valueOperations = redisTemplate.opsForValue(); +// } +// +// /** +// * 存入缓存,默认3分钟 +// * +// * @param key 缓存key +// * @param value 缓存内容 +// */ +// @Override +// public void cache(String key, String value) { +// valueOperations.set(key, value, AuthCacheConfig.timeout, TimeUnit.MILLISECONDS); +// } +// +// /** +// * 存入缓存 +// * +// * @param key 缓存key +// * @param value 缓存内容 +// * @param timeout 指定缓存过期时间(毫秒) +// */ +// @Override +// public void cache(String key, String value, long timeout) { +// valueOperations.set(key, value, timeout, TimeUnit.MILLISECONDS); +// } +// +// /** +// * 获取缓存内容 +// * +// * @param key 缓存key +// * @return 缓存内容 +// */ +// @Override +// public String get(String key) { +// return valueOperations.get(key); +// } +// +// /** +// * 是否存在key,如果对应key的value值已过期,也返回false +// * +// * @param key 缓存key +// * @return true:存在key,并且value没过期;false:key不存在或者已过期 +// */ +// @Override +// public boolean containsKey(String key) { +// return redisTemplate.hasKey(key); +// } +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/config/AuthStateConfiguration.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/config/AuthStateConfiguration.java index b7c4916..3b87dd2 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/config/AuthStateConfiguration.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/config/AuthStateConfiguration.java @@ -1,15 +1,15 @@ -package org.jeecg.modules.system.config; - -import me.zhyd.oauth.cache.AuthStateCache; -import org.jeecg.modules.system.cache.AuthStateRedisCache; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class AuthStateConfiguration { - - @Bean - public AuthStateCache authStateCache() { - return new AuthStateRedisCache(); - } -} +//package org.jeecg.modules.system.config; +// +//import me.zhyd.oauth.cache.AuthStateCache; +//import org.jeecg.modules.system.cache.AuthStateRedisCache; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +//@Configuration +//public class AuthStateConfiguration { +// +// @Bean +// public AuthStateCache authStateCache() { +// return new AuthStateRedisCache(); +// } +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java index 242a2af..495b81b 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java @@ -2,7 +2,7 @@ package org.jeecg.modules.system.controller; import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson.JSONObject; -import com.aliyuncs.exceptions.ClientException; +//import com.aliyuncs.exceptions.ClientException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import io.swagger.v3.oas.annotations.Operation; @@ -294,101 +294,101 @@ public class LoginController { @PostMapping(value = "/sms") public Result sms(@RequestBody JSONObject jsonObject, HttpServletRequest request) { Result result = new Result(); - String clientIp = IpUtils.getIpAddr(request); - String mobile = jsonObject.get("mobile").toString(); - //手机号模式 登录模式: "2" 注册模式: "1" - String smsmode = jsonObject.get("smsmode").toString(); - log.info("-------- IP:{}, 手机号:{},获取绑定验证码", clientIp, mobile); - - if (oConvertUtils.isEmpty(mobile)) { - result.setMessage("手机号不允许为空!"); - result.setSuccess(false); - return result; - } - - //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 - String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE + mobile; - Object object = redisUtil.get(redisKey); - //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 - - if (object != null) { - result.setMessage("验证码10分钟内,仍然有效!"); - result.setSuccess(false); - return result; - } - - //------------------------------------------------------------------------------------- - //增加 check防止恶意刷短信接口 - if (!DySmsLimit.canSendSms(clientIp)) { - log.warn("--------[警告] IP地址:{}, 短信接口请求太多-------", clientIp); - result.setMessage("短信接口请求太多,请稍后再试!"); - result.setCode(CommonConstant.PHONE_SMS_FAIL_CODE); - result.setSuccess(false); - return result; - } - //------------------------------------------------------------------------------------- - - //随机数 - String captcha = RandomUtil.randomNumbers(6); - JSONObject obj = new JSONObject(); - obj.put("code", captcha); - try { - boolean b = false; - //注册模板 - if (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) { - SysUser sysUser = sysUserService.getUserByPhone(mobile); - if (sysUser != null) { - result.error500(" 手机号已经注册,请直接登录!"); - baseCommonService.addLog("手机号已经注册,请直接登录!", CommonConstant.LOG_TYPE_1, null); - return result; - } - b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.REGISTER_TEMPLATE_CODE); - } else { - //登录模式,校验用户有效性 - SysUser sysUser = sysUserService.getUserByPhone(mobile); - result = sysUserService.checkUserIsEffective(sysUser); - if (!result.isSuccess()) { - String message = result.getMessage(); - String userNotExist = "该用户不存在,请注册"; - if (userNotExist.equals(message)) { - result.error500("该用户不存在或未绑定手机号"); - } - return result; - } - - /** - * smsmode 短信模板方式 0 .登录模板、1.注册模板、2.忘记密码模板 - */ - if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) { - //登录模板 - b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE); - } else if (CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) { - //忘记密码模板 - b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE); - } - } - - if (b == false) { - result.setMessage("短信验证码发送失败,请稍后重试"); - result.setSuccess(false); - return result; - } - - //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 - //验证码10分钟内有效 - redisUtil.set(redisKey, captcha, 600); - //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 - - //update-begin--Author:scott Date:20190812 for:issues#391 - //result.setResult(captcha); - //update-end--Author:scott Date:20190812 for:issues#391 - result.setSuccess(true); - - } catch (ClientException e) { - e.printStackTrace(); - result.error500(" 短信接口未配置,请联系管理员!"); - return result; - } + //String clientIp = IpUtils.getIpAddr(request); + //String mobile = jsonObject.get("mobile").toString(); + ////手机号模式 登录模式: "2" 注册模式: "1" + //String smsmode = jsonObject.get("smsmode").toString(); + //log.info("-------- IP:{}, 手机号:{},获取绑定验证码", clientIp, mobile); + // + //if (oConvertUtils.isEmpty(mobile)) { + // result.setMessage("手机号不允许为空!"); + // result.setSuccess(false); + // return result; + //} + // + ////update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 + //String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE + mobile; + //Object object = redisUtil.get(redisKey); + ////update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 + // + //if (object != null) { + // result.setMessage("验证码10分钟内,仍然有效!"); + // result.setSuccess(false); + // return result; + //} + // + ////------------------------------------------------------------------------------------- + ////增加 check防止恶意刷短信接口 + //if (!DySmsLimit.canSendSms(clientIp)) { + // log.warn("--------[警告] IP地址:{}, 短信接口请求太多-------", clientIp); + // result.setMessage("短信接口请求太多,请稍后再试!"); + // result.setCode(CommonConstant.PHONE_SMS_FAIL_CODE); + // result.setSuccess(false); + // return result; + //} + ////------------------------------------------------------------------------------------- + // + ////随机数 + //String captcha = RandomUtil.randomNumbers(6); + //JSONObject obj = new JSONObject(); + //obj.put("code", captcha); + //try { + // boolean b = false; + // //注册模板 + // if (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) { + // SysUser sysUser = sysUserService.getUserByPhone(mobile); + // if (sysUser != null) { + // result.error500(" 手机号已经注册,请直接登录!"); + // baseCommonService.addLog("手机号已经注册,请直接登录!", CommonConstant.LOG_TYPE_1, null); + // return result; + // } + // b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.REGISTER_TEMPLATE_CODE); + // } else { + // //登录模式,校验用户有效性 + // SysUser sysUser = sysUserService.getUserByPhone(mobile); + // result = sysUserService.checkUserIsEffective(sysUser); + // if (!result.isSuccess()) { + // String message = result.getMessage(); + // String userNotExist = "该用户不存在,请注册"; + // if (userNotExist.equals(message)) { + // result.error500("该用户不存在或未绑定手机号"); + // } + // return result; + // } + // + // /** + // * smsmode 短信模板方式 0 .登录模板、1.注册模板、2.忘记密码模板 + // */ + // if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) { + // //登录模板 + // b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE); + // } else if (CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) { + // //忘记密码模板 + // b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE); + // } + // } + // + // if (b == false) { + // result.setMessage("短信验证码发送失败,请稍后重试"); + // result.setSuccess(false); + // return result; + // } + // + // //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 + // //验证码10分钟内有效 + // redisUtil.set(redisKey, captcha, 600); + // //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906 + // + // //update-begin--Author:scott Date:20190812 for:issues#391 + // //result.setResult(captcha); + // //update-end--Author:scott Date:20190812 for:issues#391 + // result.setSuccess(true); + // + //} catch (ClientException e) { + // e.printStackTrace(); + // result.error500(" 短信接口未配置,请联系管理员!"); + // return result; + //} return result; } @@ -759,46 +759,46 @@ public class LoginController { @PostMapping(value = "/sendChangePwdSms") public Result sendSms(@RequestBody JSONObject jsonObject) { Result result = new Result<>(); - String mobile = jsonObject.get("mobile").toString(); - if (oConvertUtils.isEmpty(mobile)) { - result.setMessage("手机号不允许为空!"); - result.setSuccess(false); - return result; - } - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - String username = sysUser.getUsername(); - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(SysUser::getUsername, username).eq(SysUser::getPhone, mobile); - SysUser user = sysUserService.getOne(query); - if (null == user) { - return Result.error("当前登录用户和绑定的手机号不匹配,无法修改密码!"); - } - String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE + mobile; - Object object = redisUtil.get(redisKey); - if (object != null) { - result.setMessage("验证码10分钟内,仍然有效!"); - result.setSuccess(false); - return result; - } - //随机数 - String captcha = RandomUtil.randomNumbers(6); - JSONObject obj = new JSONObject(); - obj.put("code", captcha); - try { - boolean b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.CHANGE_PASSWORD_TEMPLATE_CODE); - if (!b) { - result.setMessage("短信验证码发送失败,请稍后重试"); - result.setSuccess(false); - return result; - } - //验证码5分钟内有效 - redisUtil.set(redisKey, captcha, 300); - result.setSuccess(true); - } catch (ClientException e) { - e.printStackTrace(); - result.error500(" 短信接口未配置,请联系管理员!"); - return result; - } + //String mobile = jsonObject.get("mobile").toString(); + //if (oConvertUtils.isEmpty(mobile)) { + // result.setMessage("手机号不允许为空!"); + // result.setSuccess(false); + // return result; + //} + //LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + //String username = sysUser.getUsername(); + //LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + //query.eq(SysUser::getUsername, username).eq(SysUser::getPhone, mobile); + //SysUser user = sysUserService.getOne(query); + //if (null == user) { + // return Result.error("当前登录用户和绑定的手机号不匹配,无法修改密码!"); + //} + //String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE + mobile; + //Object object = redisUtil.get(redisKey); + //if (object != null) { + // result.setMessage("验证码10分钟内,仍然有效!"); + // result.setSuccess(false); + // return result; + //} + ////随机数 + //String captcha = RandomUtil.randomNumbers(6); + //JSONObject obj = new JSONObject(); + //obj.put("code", captcha); + //try { + // boolean b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.CHANGE_PASSWORD_TEMPLATE_CODE); + // if (!b) { + // result.setMessage("短信验证码发送失败,请稍后重试"); + // result.setSuccess(false); + // return result; + // } + // //验证码5分钟内有效 + // redisUtil.set(redisKey, captcha, 300); + // result.setSuccess(true); + //} catch (ClientException e) { + // e.printStackTrace(); + // result.error500(" 短信接口未配置,请联系管理员!"); + // return result; + //} return result; } diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java index 15062a4..0954e3a 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java @@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.jeecg.dingtalk.api.core.response.Response; +//import com.jeecg.dingtalk.api.core.response.Response; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -29,8 +29,8 @@ import org.jeecg.modules.system.entity.SysAnnouncementSend; import org.jeecg.modules.system.service.ISysAnnouncementSendService; import org.jeecg.modules.system.service.ISysAnnouncementService; import org.jeecg.modules.system.service.impl.SysBaseApiImpl; -import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl; -import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl; +//import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl; +//import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl; import org.jeecg.modules.system.util.XssUtils; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; @@ -77,10 +77,10 @@ public class SysAnnouncementController { private ISysAnnouncementSendService sysAnnouncementSendService; @Resource private WebSocket webSocket; - @Autowired - ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; - @Autowired - ThirdAppDingtalkServiceImpl dingtalkService; + //@Autowired + //ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; + //@Autowired + //ThirdAppDingtalkServiceImpl dingtalkService; @Autowired private SysBaseApiImpl sysBaseApi; @Autowired @@ -288,14 +288,14 @@ public class SysAnnouncementController { } try { // 同步企业微信、钉钉的消息通知 - Response dtResponse = dingtalkService.sendActionCardMessage(sysAnnouncement, null, true); - wechatEnterpriseService.sendTextCardMessage(sysAnnouncement, true); - - if (dtResponse != null && dtResponse.isSuccess()) { - String taskId = dtResponse.getResult(); - sysAnnouncement.setDtTaskId(taskId); - sysAnnouncementService.updateById(sysAnnouncement); - } + //Response dtResponse = dingtalkService.sendActionCardMessage(sysAnnouncement, null, true); + //wechatEnterpriseService.sendTextCardMessage(sysAnnouncement, true); + // + //if (dtResponse != null && dtResponse.isSuccess()) { + // String taskId = dtResponse.getResult(); + // sysAnnouncement.setDtTaskId(taskId); + // sysAnnouncementService.updateById(sysAnnouncement); + //} } catch (Exception e) { log.error("同步发送第三方APP消息失败:", e); } @@ -326,7 +326,7 @@ public class SysAnnouncementController { result.success("该系统通知撤销成功"); if (oConvertUtils.isNotEmpty(sysAnnouncement.getDtTaskId())) { try { - dingtalkService.recallMessage(sysAnnouncement.getDtTaskId()); + //dingtalkService.recallMessage(sysAnnouncement.getDtTaskId()); } catch (Exception e) { log.error("第三方APP撤回消息失败:", e); } diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java index 872fa45..7d46da6 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/controller/ThirdAppController.java @@ -1,179 +1,113 @@ -package org.jeecg.modules.system.controller; - -import cn.hutool.core.collection.CollectionUtil; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.jeecg.dingtalk.api.core.response.Response; -import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; -import org.jeecg.common.api.dto.message.MessageDTO; -import org.jeecg.common.api.vo.Result; -import org.jeecg.common.config.TenantContext; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.constant.SymbolConstant; -import org.jeecg.common.constant.enums.MessageTypeEnum; -import org.jeecg.common.system.util.JwtUtil; -import org.jeecg.common.system.vo.LoginUser; -import org.jeecg.common.util.TokenUtils; -import org.jeecg.common.util.oConvertUtils; -import org.jeecg.config.mybatis.MybatisPlusSaasConfig; -import org.jeecg.modules.system.entity.SysThirdAccount; -import org.jeecg.modules.system.entity.SysThirdAppConfig; -import org.jeecg.modules.system.service.ISysThirdAccountService; -import org.jeecg.modules.system.service.ISysThirdAppConfigService; -import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl; -import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl; -import org.jeecg.modules.system.vo.thirdapp.JwSysUserDepartVo; -import org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo; -import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 第三方App对接 - * - * @author: jeecg-boot - */ -@Slf4j -@RestController("thirdAppController") -@RequestMapping("/sys/thirdApp") -public class ThirdAppController { - - @Autowired - ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; - @Autowired - ThirdAppDingtalkServiceImpl dingtalkService; - - @Autowired - private ISysThirdAppConfigService appConfigService; - - @Autowired - private ISysThirdAccountService sysThirdAccountService; - - /** - * 获取启用的系统 - */ - @GetMapping("/getEnabledType") - public Result getEnabledType() { - Map enabledMap = new HashMap(5); - int tenantId; - //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 - if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { - tenantId = oConvertUtils.getInt(TenantContext.getTenant(), -1); - } else { - tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - } - //查询当前租户下的第三方配置 - List list = appConfigService.getThirdConfigListByThirdType(tenantId); - //钉钉是否已配置 - boolean dingConfig = false; - //企业微信是否已配置 - boolean qywxConfig = false; - if (null != list && list.size() > 0) { - for (SysThirdAppConfig config : list) { - if (MessageTypeEnum.DD.getType().equals(config.getThirdType())) { - dingConfig = true; - continue; - } - if (MessageTypeEnum.QYWX.getType().equals(config.getThirdType())) { - qywxConfig = true; - continue; - } - } - } - enabledMap.put("wechatEnterprise", qywxConfig); - enabledMap.put("dingtalk", dingConfig); - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]通过租户模式隔离------------ - return Result.OK(enabledMap); - } - - /** - * 同步本地[用户]到【企业微信】 - * - * @param ids - * @return - */ - @GetMapping("/sync/wechatEnterprise/user/toApp") - public Result syncWechatEnterpriseUserToApp(@RequestParam(value = "ids", required = false) String ids) { - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]通过租户模式隔离 ------------ - //获取企业微信配置 - Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); - if (null != config) { - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]通过租户模式隔离 ------------ - SyncInfoVo syncInfo = wechatEnterpriseService.syncLocalUserToThirdApp(ids); - if (syncInfo.getFailInfo().size() == 0) { - return Result.OK("同步成功", syncInfo); - } else { - return Result.error("同步失败", syncInfo); - } - } - return Result.error("企业微信尚未配置,请配置企业微信"); - } - - /** - * 同步【企业微信】[用户]到本地 - * - * @param ids 作废 - * @return - */ - @GetMapping("/sync/wechatEnterprise/user/toLocal") - public Result syncWechatEnterpriseUserToLocal(@RequestParam(value = "ids", required = false) String ids) { - return Result.error("由于企业微信接口调整,同步到本地功能已失效"); - -// if (thirdAppConfig.isWechatEnterpriseEnabled()) { -// SyncInfoVo syncInfo = wechatEnterpriseService.syncThirdAppUserToLocal(); -// if (syncInfo.getFailInfo().size() == 0) { -// return Result.OK("同步成功", syncInfo); -// } else { -// return Result.error("同步失败", syncInfo); +//package org.jeecg.modules.system.controller; +// +//import cn.hutool.core.collection.CollectionUtil; +//import com.alibaba.fastjson.JSONObject; +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.jeecg.dingtalk.api.core.response.Response; +//import jakarta.servlet.http.HttpServletRequest; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.shiro.SecurityUtils; +//import org.jeecg.common.api.dto.message.MessageDTO; +//import org.jeecg.common.api.vo.Result; +//import org.jeecg.common.config.TenantContext; +//import org.jeecg.common.constant.CommonConstant; +//import org.jeecg.common.constant.SymbolConstant; +//import org.jeecg.common.constant.enums.MessageTypeEnum; +//import org.jeecg.common.system.util.JwtUtil; +//import org.jeecg.common.system.vo.LoginUser; +//import org.jeecg.common.util.TokenUtils; +//import org.jeecg.common.util.oConvertUtils; +//import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +//import org.jeecg.modules.system.entity.SysThirdAccount; +//import org.jeecg.modules.system.entity.SysThirdAppConfig; +//import org.jeecg.modules.system.service.ISysThirdAccountService; +//import org.jeecg.modules.system.service.ISysThirdAppConfigService; +//import org.jeecg.modules.system.service.impl.ThirdAppDingtalkServiceImpl; +//import org.jeecg.modules.system.service.impl.ThirdAppWechatEnterpriseServiceImpl; +//import org.jeecg.modules.system.vo.thirdapp.JwSysUserDepartVo; +//import org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo; +//import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.*; +// +//import java.util.Arrays; +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +// +///** +// * 第三方App对接 +// * +// * @author: jeecg-boot +// */ +//@Slf4j +//@RestController("thirdAppController") +//@RequestMapping("/sys/thirdApp") +//public class ThirdAppController { +// +// @Autowired +// ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; +// @Autowired +// ThirdAppDingtalkServiceImpl dingtalkService; +// +// @Autowired +// private ISysThirdAppConfigService appConfigService; +// +// @Autowired +// private ISysThirdAccountService sysThirdAccountService; +// +// /** +// * 获取启用的系统 +// */ +// @GetMapping("/getEnabledType") +// public Result getEnabledType() { +// Map enabledMap = new HashMap(5); +// int tenantId; +// //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 +// if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { +// tenantId = oConvertUtils.getInt(TenantContext.getTenant(), -1); +// } else { +// tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// } +// //查询当前租户下的第三方配置 +// List list = appConfigService.getThirdConfigListByThirdType(tenantId); +// //钉钉是否已配置 +// boolean dingConfig = false; +// //企业微信是否已配置 +// boolean qywxConfig = false; +// if (null != list && list.size() > 0) { +// for (SysThirdAppConfig config : list) { +// if (MessageTypeEnum.DD.getType().equals(config.getThirdType())) { +// dingConfig = true; +// continue; +// } +// if (MessageTypeEnum.QYWX.getType().equals(config.getThirdType())) { +// qywxConfig = true; +// continue; +// } // } // } -// return Result.error("企业微信同步功能已禁用"); - } - - /** - * 同步本地[部门]到【企业微信】 - * - * @param ids - * @return - */ - @GetMapping("/sync/wechatEnterprise/depart/toApp") - public Result syncWechatEnterpriseDepartToApp(@RequestParam(value = "ids", required = false) String ids) { - //获取企业微信配置 - Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); - if (null != config) { - SyncInfoVo syncInfo = wechatEnterpriseService.syncLocalDepartmentToThirdApp(ids); - if (syncInfo.getFailInfo().size() == 0) { - return Result.OK("同步成功", null); - } else { - return Result.error("同步失败", syncInfo); - } - } - return Result.error("企业微信尚未配置,请配置企业微信"); - } - - /** - * 同步【企业微信】[部门]到本地 - * - * @param ids - * @return - */ - @GetMapping("/sync/wechatEnterprise/depart/toLocal") - public Result syncWechatEnterpriseDepartToLocal(@RequestParam(value = "ids", required = false) String ids) { - return Result.error("由于企业微信接口调整,企业微信同步本地部门失效"); +// enabledMap.put("wechatEnterprise", qywxConfig); +// enabledMap.put("dingtalk", dingConfig); +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]通过租户模式隔离------------ +// return Result.OK(enabledMap); +// } +// +// /** +// * 同步本地[用户]到【企业微信】 +// * +// * @param ids +// * @return +// */ +// @GetMapping("/sync/wechatEnterprise/user/toApp") +// public Result syncWechatEnterpriseUserToApp(@RequestParam(value = "ids", required = false) String ids) { +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]通过租户模式隔离 ------------ // //获取企业微信配置 -// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0); +// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); // SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); // if (null != config) { -// SyncInfoVo syncInfo = wechatEnterpriseService.syncThirdAppDepartmentToLocal(ids); +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]通过租户模式隔离 ------------ +// SyncInfoVo syncInfo = wechatEnterpriseService.syncLocalUserToThirdApp(ids); // if (syncInfo.getFailInfo().size() == 0) { // return Result.OK("同步成功", syncInfo); // } else { @@ -181,88 +115,132 @@ public class ThirdAppController { // } // } // return Result.error("企业微信尚未配置,请配置企业微信"); - } - - /** - * 同步本地[部门]到【钉钉】 - * - * @param ids - * @return - */ - @GetMapping("/sync/dingtalk/depart/toApp") - public Result syncDingtalkDepartToApp(@RequestParam(value = "ids", required = false) String ids) { - //获取钉钉配置 - Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); - if (null != config) { - SyncInfoVo syncInfo = dingtalkService.syncLocalDepartmentToThirdApp(ids); - if (syncInfo.getFailInfo().size() == 0) { - return Result.OK("同步成功", null); - } else { - return Result.error("同步失败", syncInfo); - } - } - return Result.error("钉钉尚未配置,请配置钉钉"); - } - -// /** -// * 同步【钉钉】[部门]到本地 -// * -// * @param ids -// * @return -// */ -// @GetMapping("/sync/dingtalk/depart/toLocal") -// public Result syncDingtalkDepartToLocal(@RequestParam(value = "ids", required = false) String ids) { -// //获取钉钉配置 -// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0); -// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); -// if (null!= config) { -// SyncInfoVo syncInfo = dingtalkService.syncThirdAppDepartmentToLocal(ids); -// if (syncInfo.getFailInfo().size() == 0) { -// return Result.OK("同步成功", syncInfo); -// } else { -// return Result.error("同步失败", syncInfo); -// } -// } -// return Result.error("钉钉尚未配置,请配置钉钉"); // } - - /** - * 同步本地[用户]到【钉钉】 - * - * @param ids - * @return - */ - @GetMapping("/sync/dingtalk/user/toApp") - public Result syncDingtalkUserToApp(@RequestParam(value = "ids", required = false) String ids) { - //获取钉钉配置 - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - //根据租户id和第三方类别获取租户数据 - SysThirdAppConfig appConfig = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); - if (null != appConfig) { - SyncInfoVo syncInfo = dingtalkService.syncLocalUserToThirdApp(ids); - if (syncInfo.getFailInfo().size() == 0) { - return Result.OK("同步成功", syncInfo); - } else { - return Result.error("同步失败", syncInfo); - } - } - return Result.error("钉钉尚未配置,请配置钉钉"); - } - +// // /** -// * 同步【钉钉】[用户]到本地 +// * 同步【企业微信】[用户]到本地 // * // * @param ids 作废 // * @return // */ -// @GetMapping("/sync/dingtalk/user/toLocal") -// public Result syncDingtalkUserToLocal(@RequestParam(value = "ids", required = false) String ids) { +// @GetMapping("/sync/wechatEnterprise/user/toLocal") +// public Result syncWechatEnterpriseUserToLocal(@RequestParam(value = "ids", required = false) String ids) { +// return Result.error("由于企业微信接口调整,同步到本地功能已失效"); +// +//// if (thirdAppConfig.isWechatEnterpriseEnabled()) { +//// SyncInfoVo syncInfo = wechatEnterpriseService.syncThirdAppUserToLocal(); +//// if (syncInfo.getFailInfo().size() == 0) { +//// return Result.OK("同步成功", syncInfo); +//// } else { +//// return Result.error("同步失败", syncInfo); +//// } +//// } +//// return Result.error("企业微信同步功能已禁用"); +// } +// +// /** +// * 同步本地[部门]到【企业微信】 +// * +// * @param ids +// * @return +// */ +// @GetMapping("/sync/wechatEnterprise/depart/toApp") +// public Result syncWechatEnterpriseDepartToApp(@RequestParam(value = "ids", required = false) String ids) { +// //获取企业微信配置 +// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); +// if (null != config) { +// SyncInfoVo syncInfo = wechatEnterpriseService.syncLocalDepartmentToThirdApp(ids); +// if (syncInfo.getFailInfo().size() == 0) { +// return Result.OK("同步成功", null); +// } else { +// return Result.error("同步失败", syncInfo); +// } +// } +// return Result.error("企业微信尚未配置,请配置企业微信"); +// } +// +// /** +// * 同步【企业微信】[部门]到本地 +// * +// * @param ids +// * @return +// */ +// @GetMapping("/sync/wechatEnterprise/depart/toLocal") +// public Result syncWechatEnterpriseDepartToLocal(@RequestParam(value = "ids", required = false) String ids) { +// return Result.error("由于企业微信接口调整,企业微信同步本地部门失效"); +//// //获取企业微信配置 +//// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0); +//// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); +//// if (null != config) { +//// SyncInfoVo syncInfo = wechatEnterpriseService.syncThirdAppDepartmentToLocal(ids); +//// if (syncInfo.getFailInfo().size() == 0) { +//// return Result.OK("同步成功", syncInfo); +//// } else { +//// return Result.error("同步失败", syncInfo); +//// } +//// } +//// return Result.error("企业微信尚未配置,请配置企业微信"); +// } +// +// /** +// * 同步本地[部门]到【钉钉】 +// * +// * @param ids +// * @return +// */ +// @GetMapping("/sync/dingtalk/depart/toApp") +// public Result syncDingtalkDepartToApp(@RequestParam(value = "ids", required = false) String ids) { // //获取钉钉配置 -// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0); +// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); // SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); // if (null != config) { -// SyncInfoVo syncInfo = dingtalkService.syncThirdAppUserToLocal(); +// SyncInfoVo syncInfo = dingtalkService.syncLocalDepartmentToThirdApp(ids); +// if (syncInfo.getFailInfo().size() == 0) { +// return Result.OK("同步成功", null); +// } else { +// return Result.error("同步失败", syncInfo); +// } +// } +// return Result.error("钉钉尚未配置,请配置钉钉"); +// } +// +//// /** +//// * 同步【钉钉】[部门]到本地 +//// * +//// * @param ids +//// * @return +//// */ +//// @GetMapping("/sync/dingtalk/depart/toLocal") +//// public Result syncDingtalkDepartToLocal(@RequestParam(value = "ids", required = false) String ids) { +//// //获取钉钉配置 +//// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0); +//// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); +//// if (null!= config) { +//// SyncInfoVo syncInfo = dingtalkService.syncThirdAppDepartmentToLocal(ids); +//// if (syncInfo.getFailInfo().size() == 0) { +//// return Result.OK("同步成功", syncInfo); +//// } else { +//// return Result.error("同步失败", syncInfo); +//// } +//// } +//// return Result.error("钉钉尚未配置,请配置钉钉"); +//// } +// +// /** +// * 同步本地[用户]到【钉钉】 +// * +// * @param ids +// * @return +// */ +// @GetMapping("/sync/dingtalk/user/toApp") +// public Result syncDingtalkUserToApp(@RequestParam(value = "ids", required = false) String ids) { +// //获取钉钉配置 +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// //根据租户id和第三方类别获取租户数据 +// SysThirdAppConfig appConfig = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); +// if (null != appConfig) { +// SyncInfoVo syncInfo = dingtalkService.syncLocalUserToThirdApp(ids); // if (syncInfo.getFailInfo().size() == 0) { // return Result.OK("同步成功", syncInfo); // } else { @@ -271,310 +249,332 @@ public class ThirdAppController { // } // return Result.error("钉钉尚未配置,请配置钉钉"); // } - - /** - * 发送消息测试 - * - * @return - */ - @PostMapping("/sendMessageTest") - public Result sendMessageTest(@RequestBody JSONObject params, HttpServletRequest request) { - /* 获取前台传递的参数 */ - // 第三方app的类型 - String app = params.getString("app"); - // 是否发送给全部人 - boolean sendAll = params.getBooleanValue("sendAll"); - // 消息接收者,传sys_user表的username字段,多个用逗号分割 - String receiver = params.getString("receiver"); - // 消息内容 - String content = params.getString("content"); - // 租户id - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - - String fromUser = JwtUtil.getUserNameByToken(request); - String title = "第三方APP消息测试"; - MessageDTO message = new MessageDTO(fromUser, receiver, title, content); - message.setToAll(sendAll); - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]钉钉、企业微信通过租户模式隔离 ------------ - String weChatType = MessageTypeEnum.QYWX.getType(); - String dingType = MessageTypeEnum.DD.getType(); - if (weChatType.toUpperCase().equals(app)) { - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, weChatType); - if (null != config) { - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]钉钉、企业微信通过租户模式隔离 ------------ - JSONObject response = wechatEnterpriseService.sendMessageResponse(message, false); - return Result.OK(response); - } - return Result.error("企业微信尚未配置,请配置企业微信"); - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]钉钉、企业微信通过租户模式隔离 ------------ - } else if (dingType.toUpperCase().equals(app)) { - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, dingType); - if (null != config) { - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]钉钉、企业微信通过租户模式隔离 ------------ - Response response = dingtalkService.sendMessageResponse(message, false); - return Result.OK(response); - } - return Result.error("钉钉尚未配置,请配置钉钉"); - } - return Result.error("不识别的第三方APP"); - } - - /** - * 撤回消息测试 - * - * @return - */ - @PostMapping("/recallMessageTest") - public Result recallMessageTest(@RequestBody JSONObject params) { - /* 获取前台传递的参数 */ - // 第三方app的类型 - String app = params.getString("app"); - // 消息id - String msgTaskId = params.getString("msg_task_id"); - //租户id - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - if (CommonConstant.WECHAT_ENTERPRISE.equals(app)) { - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); - if (null != config) { - return Result.error("企业微信不支持撤回消息"); - } - return Result.error("企业微信尚未配置,请配置企业微信"); - } else if (CommonConstant.DINGTALK.equals(app)) { - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); - if (null != config) { - Response response = dingtalkService.recallMessageResponse(msgTaskId); - if (response.isSuccess()) { - return Result.OK("撤回成功", response); - } else { - return Result.error("撤回失败:" + response.getErrcode() + "——" + response.getErrmsg(), response); - } - } - return Result.error("钉钉尚未配置,请配置钉钉"); - } - return Result.error("不识别的第三方APP"); - } - - //========================begin 应用低代码钉钉/企业微信同步用户部门专用 ============================= - - /** - * 添加第三方app配置 - * - * @param appConfig - * @return - */ - @RequestMapping(value = "/addThirdAppConfig", method = RequestMethod.POST) - public Result addThirdAppConfig(@RequestBody SysThirdAppConfig appConfig) { - Result result = new Result<>(); - //根据当前登录租户id和第三方类别判断是否已经创建 - Integer tenantId = oConvertUtils.isNotEmpty(appConfig.getTenantId()) ? appConfig.getTenantId() : oConvertUtils.getInt(TenantContext.getTenant(), 0); - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, appConfig.getThirdType()); - if (null != config) { - result.error500("操作失败,同一个租户下只允许绑定一个钉钉或者企业微信"); - return result; - } - String clientId = appConfig.getClientId(); - //通过应用key获取第三方配置 - List thirdAppConfigByClientId = appConfigService.getThirdAppConfigByClientId(clientId); - if (CollectionUtil.isNotEmpty(thirdAppConfigByClientId)) { - result.error500("AppKey已存在,请勿重复添加"); - return result; - } - try { - appConfig.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0)); - appConfigService.save(appConfig); - result.success("添加成功!"); - } catch (Exception e) { - log.error(e.getMessage(), e); - result.error500("操作失败"); - } - return result; - } - - /** - * 编辑第三方app配置 - * - * @param appConfig - * @return - */ - @RequestMapping(value = "/editThirdAppConfig", method = {RequestMethod.PUT, RequestMethod.POST}) - public Result editThirdAppConfig(@RequestBody SysThirdAppConfig appConfig) { - Result result = new Result<>(); - SysThirdAppConfig config = appConfigService.getById(appConfig.getId()); - if (null == config) { - result.error500("数据不存在"); - return result; - } - String clientId = appConfig.getClientId(); - //如果编辑的应用key,和数据库中的不一致,需要判断应用key是否已存在 - if (!clientId.equals(config.getClientId())) { - //通过应用key获取第三方配置 - List thirdAppConfigByClientId = appConfigService.getThirdAppConfigByClientId(clientId); - if (CollectionUtil.isNotEmpty(thirdAppConfigByClientId)) { - result.error500("AppKey已存在,请勿重复添加"); - return result; - } - } - try { - appConfigService.updateById(appConfig); - result.success("修改成功!"); - } catch (Exception e) { - log.error(e.getMessage(), e); - result.error500("操作失败"); - } - return result; - } - - /** - * 根据租户id和第三方类型获取第三方app配置信息 - * - * @param tenantId - * @param thirdType - * @return - */ - @GetMapping("/getThirdConfigByTenantId") - public Result getThirdAppByTenantId(@RequestParam(name = "tenantId", required = false) Integer tenantId, - @RequestParam(name = "thirdType") String thirdType) { - if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { - if (tenantId == null) { - return Result.error("开启多租户模式,租户ID参数不允许为空!"); - } - } else { - //租户未传递,则采用平台的 - if (tenantId == null) { - tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - } - } - Result result = new Result<>(); - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(SysThirdAppConfig::getThirdType, thirdType); - query.eq(SysThirdAppConfig::getTenantId, tenantId); - SysThirdAppConfig sysThirdAppConfig = appConfigService.getOne(query); - result.setSuccess(true); - result.setResult(sysThirdAppConfig); - return result; - } - - /** - * 同步【钉钉】[部门和用户]到本地 - * - * @param ids - * @return - */ - @GetMapping("/sync/dingtalk/departAndUser/toLocal") - public Result syncDingTalkDepartAndUserToLocal(@RequestParam(value = "ids", required = false) String ids) { - Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); - if (null != config) { - SyncInfoVo syncInfo = dingtalkService.syncThirdAppDepartmentUserToLocal(); - if (syncInfo.getFailInfo().size() == 0) { - return Result.OK("同步成功", syncInfo); - } else { - return Result.error("同步失败", syncInfo); - } - } - return Result.error("钉钉尚未配置,请配置钉钉"); - } - //========================end 应用低代码钉钉/企业微信同步用户部门专用 ======================== - - - //========================begin 应用低代码账号设置第三方账号绑定 ================================ - - /** - * 获取第三方账号 - * - * @param thirdType - * @return - */ - @GetMapping("/getThirdAccountByUserId") - public Result> getThirdAccountByUserId(@RequestParam(name = "thirdType") String thirdType) { - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - //根据id查询 - query.eq(SysThirdAccount::getSysUserId, sysUser.getId()); - //扫码登录只有租户为0 - query.eq(SysThirdAccount::getTenantId, CommonConstant.TENANT_ID_DEFAULT_VALUE); - //根据第三方类别查询 - if (oConvertUtils.isNotEmpty(thirdType)) { - query.in(SysThirdAccount::getThirdType, Arrays.asList(thirdType.split(SymbolConstant.COMMA))); - } - List list = sysThirdAccountService.list(query); - return Result.ok(list); - } - - /** - * 绑定第三方账号 - * - * @return - */ - @PostMapping("/bindThirdAppAccount") - public Result bindThirdAppAccount(@RequestBody SysThirdAccount sysThirdAccount) { - SysThirdAccount thirdAccount = sysThirdAccountService.bindThirdAppAccountByUserId(sysThirdAccount); - return Result.ok(thirdAccount); - } - - /** - * 删除第三方用户信息 - * - * @param sysThirdAccount - * @return - */ - @DeleteMapping("/deleteThirdAccount") - public Result deleteThirdAccountById(@RequestBody SysThirdAccount sysThirdAccount) { - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - if (!sysUser.getId().equals(sysThirdAccount.getSysUserId())) { - return Result.error("无权修改他人信息"); - } - SysThirdAccount thirdAccount = sysThirdAccountService.getById(sysThirdAccount.getId()); - if (null == thirdAccount) { - return Result.error("未找到改第三方账户信息"); - } - sysThirdAccountService.removeById(thirdAccount.getId()); - return Result.ok("解绑成功"); - } - //========================end 应用低代码账号设置第三方账号绑定 ================================ - - /** - * 获取企业微信绑定的用户信息 - * - * @param request - * @return - */ - @GetMapping("/getThirdUserByWechat") - public Result getThirdUserByWechat(HttpServletRequest request) { - //获取企业微信配置 - Integer tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request), 0); - SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); - if (null != config) { - JwSysUserDepartVo list = wechatEnterpriseService.getThirdUserByWechat(tenantId); - return Result.ok(list); - } - return Result.error("企业微信尚未配置,请配置企业微信"); - } - - /** - * 同步企业微信部门和用户到本地 - * - * @param jwUserDepartJson - * @param request - * @return - */ - @GetMapping("/sync/wechatEnterprise/departAndUser/toLocal") - public Result syncWechatEnterpriseDepartAndUserToLocal(@RequestParam(name = "jwUserDepartJson") String jwUserDepartJson, HttpServletRequest request) { - int tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request), 0); - SyncInfoVo syncInfoVo = wechatEnterpriseService.syncWechatEnterpriseDepartAndUserToLocal(jwUserDepartJson, tenantId); - return Result.ok(syncInfoVo); - } - - /** - * 查询被绑定的企业微信用户 - * - * @param request - * @return - */ - @GetMapping("/getThirdUserBindByWechat") - public Result> getThirdUserBindByWechat(HttpServletRequest request) { - int tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request), 0); - List jwSysUserDepartVos = wechatEnterpriseService.getThirdUserBindByWechat(tenantId); - return Result.ok(jwSysUserDepartVos); - } -} +// +//// /** +//// * 同步【钉钉】[用户]到本地 +//// * +//// * @param ids 作废 +//// * @return +//// */ +//// @GetMapping("/sync/dingtalk/user/toLocal") +//// public Result syncDingtalkUserToLocal(@RequestParam(value = "ids", required = false) String ids) { +//// //获取钉钉配置 +//// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(),0); +//// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); +//// if (null != config) { +//// SyncInfoVo syncInfo = dingtalkService.syncThirdAppUserToLocal(); +//// if (syncInfo.getFailInfo().size() == 0) { +//// return Result.OK("同步成功", syncInfo); +//// } else { +//// return Result.error("同步失败", syncInfo); +//// } +//// } +//// return Result.error("钉钉尚未配置,请配置钉钉"); +//// } +// +// /** +// * 发送消息测试 +// * +// * @return +// */ +// @PostMapping("/sendMessageTest") +// public Result sendMessageTest(@RequestBody JSONObject params, HttpServletRequest request) { +// /* 获取前台传递的参数 */ +// // 第三方app的类型 +// String app = params.getString("app"); +// // 是否发送给全部人 +// boolean sendAll = params.getBooleanValue("sendAll"); +// // 消息接收者,传sys_user表的username字段,多个用逗号分割 +// String receiver = params.getString("receiver"); +// // 消息内容 +// String content = params.getString("content"); +// // 租户id +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// +// String fromUser = JwtUtil.getUserNameByToken(request); +// String title = "第三方APP消息测试"; +// MessageDTO message = new MessageDTO(fromUser, receiver, title, content); +// message.setToAll(sendAll); +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]钉钉、企业微信通过租户模式隔离 ------------ +// String weChatType = MessageTypeEnum.QYWX.getType(); +// String dingType = MessageTypeEnum.DD.getType(); +// if (weChatType.toUpperCase().equals(app)) { +// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, weChatType); +// if (null != config) { +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]钉钉、企业微信通过租户模式隔离 ------------ +// JSONObject response = wechatEnterpriseService.sendMessageResponse(message, false); +// return Result.OK(response); +// } +// return Result.error("企业微信尚未配置,请配置企业微信"); +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]钉钉、企业微信通过租户模式隔离 ------------ +// } else if (dingType.toUpperCase().equals(app)) { +// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, dingType); +// if (null != config) { +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]钉钉、企业微信通过租户模式隔离 ------------ +// Response response = dingtalkService.sendMessageResponse(message, false); +// return Result.OK(response); +// } +// return Result.error("钉钉尚未配置,请配置钉钉"); +// } +// return Result.error("不识别的第三方APP"); +// } +// +// /** +// * 撤回消息测试 +// * +// * @return +// */ +// @PostMapping("/recallMessageTest") +// public Result recallMessageTest(@RequestBody JSONObject params) { +// /* 获取前台传递的参数 */ +// // 第三方app的类型 +// String app = params.getString("app"); +// // 消息id +// String msgTaskId = params.getString("msg_task_id"); +// //租户id +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// if (CommonConstant.WECHAT_ENTERPRISE.equals(app)) { +// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); +// if (null != config) { +// return Result.error("企业微信不支持撤回消息"); +// } +// return Result.error("企业微信尚未配置,请配置企业微信"); +// } else if (CommonConstant.DINGTALK.equals(app)) { +// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); +// if (null != config) { +// Response response = dingtalkService.recallMessageResponse(msgTaskId); +// if (response.isSuccess()) { +// return Result.OK("撤回成功", response); +// } else { +// return Result.error("撤回失败:" + response.getErrcode() + "——" + response.getErrmsg(), response); +// } +// } +// return Result.error("钉钉尚未配置,请配置钉钉"); +// } +// return Result.error("不识别的第三方APP"); +// } +// +// //========================begin 应用低代码钉钉/企业微信同步用户部门专用 ============================= +// +// /** +// * 添加第三方app配置 +// * +// * @param appConfig +// * @return +// */ +// @RequestMapping(value = "/addThirdAppConfig", method = RequestMethod.POST) +// public Result addThirdAppConfig(@RequestBody SysThirdAppConfig appConfig) { +// Result result = new Result<>(); +// //根据当前登录租户id和第三方类别判断是否已经创建 +// Integer tenantId = oConvertUtils.isNotEmpty(appConfig.getTenantId()) ? appConfig.getTenantId() : oConvertUtils.getInt(TenantContext.getTenant(), 0); +// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, appConfig.getThirdType()); +// if (null != config) { +// result.error500("操作失败,同一个租户下只允许绑定一个钉钉或者企业微信"); +// return result; +// } +// String clientId = appConfig.getClientId(); +// //通过应用key获取第三方配置 +// List thirdAppConfigByClientId = appConfigService.getThirdAppConfigByClientId(clientId); +// if (CollectionUtil.isNotEmpty(thirdAppConfigByClientId)) { +// result.error500("AppKey已存在,请勿重复添加"); +// return result; +// } +// try { +// appConfig.setTenantId(oConvertUtils.getInt(TenantContext.getTenant(), 0)); +// appConfigService.save(appConfig); +// result.success("添加成功!"); +// } catch (Exception e) { +// log.error(e.getMessage(), e); +// result.error500("操作失败"); +// } +// return result; +// } +// +// /** +// * 编辑第三方app配置 +// * +// * @param appConfig +// * @return +// */ +// @RequestMapping(value = "/editThirdAppConfig", method = {RequestMethod.PUT, RequestMethod.POST}) +// public Result editThirdAppConfig(@RequestBody SysThirdAppConfig appConfig) { +// Result result = new Result<>(); +// SysThirdAppConfig config = appConfigService.getById(appConfig.getId()); +// if (null == config) { +// result.error500("数据不存在"); +// return result; +// } +// String clientId = appConfig.getClientId(); +// //如果编辑的应用key,和数据库中的不一致,需要判断应用key是否已存在 +// if (!clientId.equals(config.getClientId())) { +// //通过应用key获取第三方配置 +// List thirdAppConfigByClientId = appConfigService.getThirdAppConfigByClientId(clientId); +// if (CollectionUtil.isNotEmpty(thirdAppConfigByClientId)) { +// result.error500("AppKey已存在,请勿重复添加"); +// return result; +// } +// } +// try { +// appConfigService.updateById(appConfig); +// result.success("修改成功!"); +// } catch (Exception e) { +// log.error(e.getMessage(), e); +// result.error500("操作失败"); +// } +// return result; +// } +// +// /** +// * 根据租户id和第三方类型获取第三方app配置信息 +// * +// * @param tenantId +// * @param thirdType +// * @return +// */ +// @GetMapping("/getThirdConfigByTenantId") +// public Result getThirdAppByTenantId(@RequestParam(name = "tenantId", required = false) Integer tenantId, +// @RequestParam(name = "thirdType") String thirdType) { +// if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { +// if (tenantId == null) { +// return Result.error("开启多租户模式,租户ID参数不允许为空!"); +// } +// } else { +// //租户未传递,则采用平台的 +// if (tenantId == null) { +// tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// } +// } +// Result result = new Result<>(); +// LambdaQueryWrapper query = new LambdaQueryWrapper<>(); +// query.eq(SysThirdAppConfig::getThirdType, thirdType); +// query.eq(SysThirdAppConfig::getTenantId, tenantId); +// SysThirdAppConfig sysThirdAppConfig = appConfigService.getOne(query); +// result.setSuccess(true); +// result.setResult(sysThirdAppConfig); +// return result; +// } +// +// /** +// * 同步【钉钉】[部门和用户]到本地 +// * +// * @param ids +// * @return +// */ +// @GetMapping("/sync/dingtalk/departAndUser/toLocal") +// public Result syncDingTalkDepartAndUserToLocal(@RequestParam(value = "ids", required = false) String ids) { +// Integer tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); +// if (null != config) { +// SyncInfoVo syncInfo = dingtalkService.syncThirdAppDepartmentUserToLocal(); +// if (syncInfo.getFailInfo().size() == 0) { +// return Result.OK("同步成功", syncInfo); +// } else { +// return Result.error("同步失败", syncInfo); +// } +// } +// return Result.error("钉钉尚未配置,请配置钉钉"); +// } +// //========================end 应用低代码钉钉/企业微信同步用户部门专用 ======================== +// +// +// //========================begin 应用低代码账号设置第三方账号绑定 ================================ +// +// /** +// * 获取第三方账号 +// * +// * @param thirdType +// * @return +// */ +// @GetMapping("/getThirdAccountByUserId") +// public Result> getThirdAccountByUserId(@RequestParam(name = "thirdType") String thirdType) { +// LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); +// LambdaQueryWrapper query = new LambdaQueryWrapper<>(); +// //根据id查询 +// query.eq(SysThirdAccount::getSysUserId, sysUser.getId()); +// //扫码登录只有租户为0 +// query.eq(SysThirdAccount::getTenantId, CommonConstant.TENANT_ID_DEFAULT_VALUE); +// //根据第三方类别查询 +// if (oConvertUtils.isNotEmpty(thirdType)) { +// query.in(SysThirdAccount::getThirdType, Arrays.asList(thirdType.split(SymbolConstant.COMMA))); +// } +// List list = sysThirdAccountService.list(query); +// return Result.ok(list); +// } +// +// /** +// * 绑定第三方账号 +// * +// * @return +// */ +// @PostMapping("/bindThirdAppAccount") +// public Result bindThirdAppAccount(@RequestBody SysThirdAccount sysThirdAccount) { +// SysThirdAccount thirdAccount = sysThirdAccountService.bindThirdAppAccountByUserId(sysThirdAccount); +// return Result.ok(thirdAccount); +// } +// +// /** +// * 删除第三方用户信息 +// * +// * @param sysThirdAccount +// * @return +// */ +// @DeleteMapping("/deleteThirdAccount") +// public Result deleteThirdAccountById(@RequestBody SysThirdAccount sysThirdAccount) { +// LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); +// if (!sysUser.getId().equals(sysThirdAccount.getSysUserId())) { +// return Result.error("无权修改他人信息"); +// } +// SysThirdAccount thirdAccount = sysThirdAccountService.getById(sysThirdAccount.getId()); +// if (null == thirdAccount) { +// return Result.error("未找到改第三方账户信息"); +// } +// sysThirdAccountService.removeById(thirdAccount.getId()); +// return Result.ok("解绑成功"); +// } +// //========================end 应用低代码账号设置第三方账号绑定 ================================ +// +// /** +// * 获取企业微信绑定的用户信息 +// * +// * @param request +// * @return +// */ +// @GetMapping("/getThirdUserByWechat") +// public Result getThirdUserByWechat(HttpServletRequest request) { +// //获取企业微信配置 +// Integer tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request), 0); +// SysThirdAppConfig config = appConfigService.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); +// if (null != config) { +// JwSysUserDepartVo list = wechatEnterpriseService.getThirdUserByWechat(tenantId); +// return Result.ok(list); +// } +// return Result.error("企业微信尚未配置,请配置企业微信"); +// } +// +// /** +// * 同步企业微信部门和用户到本地 +// * +// * @param jwUserDepartJson +// * @param request +// * @return +// */ +// @GetMapping("/sync/wechatEnterprise/departAndUser/toLocal") +// public Result syncWechatEnterpriseDepartAndUserToLocal(@RequestParam(name = "jwUserDepartJson") String jwUserDepartJson, HttpServletRequest request) { +// int tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request), 0); +// SyncInfoVo syncInfoVo = wechatEnterpriseService.syncWechatEnterpriseDepartAndUserToLocal(jwUserDepartJson, tenantId); +// return Result.ok(syncInfoVo); +// } +// +// /** +// * 查询被绑定的企业微信用户 +// * +// * @param request +// * @return +// */ +// @GetMapping("/getThirdUserBindByWechat") +// public Result> getThirdUserBindByWechat(HttpServletRequest request) { +// int tenantId = oConvertUtils.getInt(TokenUtils.getTenantIdByRequest(request), 0); +// List jwSysUserDepartVos = wechatEnterpriseService.getThirdUserBindByWechat(tenantId); +// return Result.ok(jwSysUserDepartVos); +// } +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java index 9337b46..645fc4c 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java @@ -41,9 +41,9 @@ import org.jeecg.common.util.oConvertUtils; import org.jeecg.config.firewall.SqlInjection.IDictTableWhiteListHandler; import org.jeecg.config.mybatis.MybatisPlusSaasConfig; import org.jeecg.modules.message.entity.SysMessageTemplate; -import org.jeecg.modules.message.handle.impl.DdSendMsgHandle; -import org.jeecg.modules.message.handle.impl.EmailSendMsgHandle; -import org.jeecg.modules.message.handle.impl.QywxSendMsgHandle; +//import org.jeecg.modules.message.handle.impl.DdSendMsgHandle; +//import org.jeecg.modules.message.handle.impl.EmailSendMsgHandle; +//import org.jeecg.modules.message.handle.impl.QywxSendMsgHandle; import org.jeecg.modules.message.handle.impl.SystemSendMsgHandle; import org.jeecg.modules.message.service.ISysMessageTemplateService; import org.jeecg.modules.message.websocket.WebSocket; @@ -115,10 +115,10 @@ public class SysBaseApiImpl implements ISysBaseAPI { private SysPermissionMapper sysPermissionMapper; @Autowired private ISysPermissionDataRuleService sysPermissionDataRuleService; - @Autowired - private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; - @Autowired - private ThirdAppDingtalkServiceImpl dingtalkService; + //@Autowired + //private ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; + //@Autowired + //private ThirdAppDingtalkServiceImpl dingtalkService; @Autowired ISysCategoryService sysCategoryService; @Autowired @@ -425,8 +425,8 @@ public class SysBaseApiImpl implements ISysBaseAPI { message.getCategory()); try { // 同步发送第三方APP消息 - wechatEnterpriseService.sendMessage(message, true); - dingtalkService.sendMessage(message, true); + //wechatEnterpriseService.sendMessage(message, true); + //dingtalkService.sendMessage(message, true); } catch (Exception e) { log.error("同步发送第三方APP消息失败!", e); } @@ -443,8 +443,8 @@ public class SysBaseApiImpl implements ISysBaseAPI { message.getBusId()); try { // 同步发送第三方APP消息 - wechatEnterpriseService.sendMessage(message, true); - dingtalkService.sendMessage(message, true); + //wechatEnterpriseService.sendMessage(message, true); + //dingtalkService.sendMessage(message, true); } catch (Exception e) { log.error("同步发送第三方APP消息失败!", e); } @@ -516,8 +516,8 @@ public class SysBaseApiImpl implements ISysBaseAPI { } try { // 同步企业微信、钉钉的消息通知 - dingtalkService.sendActionCardMessage(announcement, mobileOpenUrl, true); - wechatEnterpriseService.sendTextCardMessage(announcement, true); + //dingtalkService.sendActionCardMessage(announcement, mobileOpenUrl, true); + //wechatEnterpriseService.sendTextCardMessage(announcement, true); } catch (Exception e) { log.error("同步发送第三方APP消息失败!", e); } @@ -601,9 +601,9 @@ public class SysBaseApiImpl implements ISysBaseAPI { } try { // 钉钉的消息通知 - dingtalkService.sendActionCardMessage(announcement, mobileOpenUrl, true); + //dingtalkService.sendActionCardMessage(announcement, mobileOpenUrl, true); // 企业微信通知 - wechatEnterpriseService.sendTextCardMessage(announcement, true); + //wechatEnterpriseService.sendTextCardMessage(announcement, true); } catch (Exception e) { log.error("同步发送第三方APP消息失败!", e); } @@ -1388,8 +1388,8 @@ public class SysBaseApiImpl implements ISysBaseAPI { */ @Override public void sendEmailMsg(String email, String title, String content) { - EmailSendMsgHandle emailHandle = new EmailSendMsgHandle(); - emailHandle.sendMsg(email, title, content); + //EmailSendMsgHandle emailHandle = new EmailSendMsgHandle(); + //emailHandle.sendMsg(email, title, content); } /** @@ -1402,31 +1402,31 @@ public class SysBaseApiImpl implements ISysBaseAPI { */ @Override public void sendHtmlTemplateEmail(String email, String title, EmailTemplateEnum emailTemplateEnum, JSONObject params) { - EmailSendMsgHandle emailHandle = new EmailSendMsgHandle(); - String htmlText = ""; - try { - //获取模板实例 - Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); - //设置模板文件的目录 - String url = emailTemplateEnum.getUrl(); - configuration.setClassForTemplateLoading(this.getClass(), url.substring(0, url.lastIndexOf("/"))); - configuration.setDefaultEncoding("UTF-8"); - //空值报错设置 - configuration.setClassicCompatible(true); - configuration.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER); - Template template = configuration.getTemplate(url.substring(url.lastIndexOf("/"))); - //解析模板文件 - htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(template, params); - } catch (IOException e) { - e.printStackTrace(); - } catch (TemplateException e) { - e.printStackTrace(); - } catch (Exception e) { - e.printStackTrace(); - } - - log.info("Email Html Text:{}", htmlText); - emailHandle.sendMsg(email, title, htmlText); + //EmailSendMsgHandle emailHandle = new EmailSendMsgHandle(); + //String htmlText = ""; + //try { + // //获取模板实例 + // Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); + // //设置模板文件的目录 + // String url = emailTemplateEnum.getUrl(); + // configuration.setClassForTemplateLoading(this.getClass(), url.substring(0, url.lastIndexOf("/"))); + // configuration.setDefaultEncoding("UTF-8"); + // //空值报错设置 + // configuration.setClassicCompatible(true); + // configuration.setNewBuiltinClassResolver(TemplateClassResolver.SAFER_RESOLVER); + // Template template = configuration.getTemplate(url.substring(url.lastIndexOf("/"))); + // //解析模板文件 + // htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(template, params); + //} catch (IOException e) { + // e.printStackTrace(); + //} catch (TemplateException e) { + // e.printStackTrace(); + //} catch (Exception e) { + // e.printStackTrace(); + //} + // + //log.info("Email Html Text:{}", htmlText); + //emailHandle.sendMsg(email, title, htmlText); } /** @@ -1570,17 +1570,17 @@ public class SysBaseApiImpl implements ISysBaseAPI { //update-end---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ //-------------------------------------流程节点发送模板消息----------------------------------------------- - @Autowired - private QywxSendMsgHandle qywxSendMsgHandle; + //@Autowired + //private QywxSendMsgHandle qywxSendMsgHandle; @Autowired private SystemSendMsgHandle systemSendMsgHandle; - @Autowired - private EmailSendMsgHandle emailSendMsgHandle; + //@Autowired + //private EmailSendMsgHandle emailSendMsgHandle; - @Autowired - private DdSendMsgHandle ddSendMsgHandle; + //@Autowired + //private DdSendMsgHandle ddSendMsgHandle; @Override public void sendTemplateMessage(MessageDTO message) { @@ -1615,11 +1615,11 @@ public class SysBaseApiImpl implements ISysBaseAPI { // 邮件消息要解析Markdown message.setContent(HTMLUtils.parseMarkdown(message.getContent())); } - emailSendMsgHandle.sendMessage(message); + //emailSendMsgHandle.sendMessage(message); } else if (MessageTypeEnum.DD.getType().equals(messageType)) { - ddSendMsgHandle.sendMessage(message); + //ddSendMsgHandle.sendMessage(message); } else if (MessageTypeEnum.QYWX.getType().equals(messageType)) { - qywxSendMsgHandle.sendMessage(message); + //qywxSendMsgHandle.sendMessage(message); } } diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java index 9d42ada..03175d2 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysThirdAccountServiceImpl.java @@ -2,10 +2,10 @@ package org.jeecg.modules.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.jeecg.dingtalk.api.base.JdtBaseAPI; -import com.jeecg.dingtalk.api.core.response.Response; -import com.jeecg.dingtalk.api.core.vo.AccessToken; -import com.jeecg.dingtalk.api.user.JdtUserAPI; +//import com.jeecg.dingtalk.api.base.JdtBaseAPI; +//import com.jeecg.dingtalk.api.core.response.Response; +//import com.jeecg.dingtalk.api.core.vo.AccessToken; +//import com.jeecg.dingtalk.api.user.JdtUserAPI; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.jeecg.common.constant.CommonConstant; @@ -169,13 +169,13 @@ public class SysThirdAccountServiceImpl extends ServiceImpl getUserIdRes = JdtUserAPI.getUseridByUnionid(tlm.getUuid(), accessToken.getAccessToken()); - if (getUserIdRes.isSuccess()) { - user.setThirdUserId(getUserIdRes.getResult()); - } else { - user.setThirdUserId(tlm.getUuid()); - } + //AccessToken accessToken = JdtBaseAPI.getAccessToken(dingTalkClientId, dingTalkClientSecret); + //Response getUserIdRes = JdtUserAPI.getUseridByUnionid(tlm.getUuid(), accessToken.getAccessToken()); + //if (getUserIdRes.isSuccess()) { + // user.setThirdUserId(getUserIdRes.getResult()); + //} else { + // user.setThirdUserId(tlm.getUuid()); + //} //=============end 判断如果是钉钉的情况下,需要将第三方的用户id查询出来,发送模板的时候有用========== } else { user.setThirdUserId(tlm.getUuid()); diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java index d6e1419..ab52670 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.aliyuncs.exceptions.ClientException; +//import com.aliyuncs.exceptions.ClientException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -102,10 +102,10 @@ public class SysUserServiceImpl extends ServiceImpl impl private BaseCommonService baseCommonService; @Autowired private SysThirdAccountMapper sysThirdAccountMapper; - @Autowired - ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; - @Autowired - ThirdAppDingtalkServiceImpl dingtalkService; + //@Autowired + //ThirdAppWechatEnterpriseServiceImpl wechatEnterpriseService; + //@Autowired + //ThirdAppDingtalkServiceImpl dingtalkService; @Autowired ISysRoleIndexService sysRoleIndexService; @Autowired @@ -710,8 +710,8 @@ public class SysUserServiceImpl extends ServiceImpl impl line += sysUserRoleMapper.delete(new LambdaQueryWrapper().in(SysUserRole::getUserId, userIds)); //4.同步删除第三方App的用户 try { - dingtalkService.removeThirdAppUser(userIds); - wechatEnterpriseService.removeThirdAppUser(userIds); + //dingtalkService.removeThirdAppUser(userIds); + //wechatEnterpriseService.removeThirdAppUser(userIds); } catch (Exception e) { log.error("同步删除第三方App的用户失败:", e); } @@ -2010,33 +2010,33 @@ public class SysUserServiceImpl extends ServiceImpl impl * @param phone */ private void sendPhoneSms(String phone, String clientIp) { - String redisKey = CommonConstant.CHANGE_PHONE_REDIS_KEY_PRE + phone; - Object object = redisUtil.get(redisKey); - - if (object != null) { - throw new JeecgBootException("验证码10分钟内,仍然有效!"); - } - - //增加 check防止恶意刷短信接口 - if (!DySmsLimit.canSendSms(clientIp)) { - log.warn("--------[警告] IP地址:{}, 短信接口请求太多-------", clientIp); - throw new JeecgBootException("短信接口请求太多,请稍后再试!", CommonConstant.PHONE_SMS_FAIL_CODE); - } - - //随机数 - String captcha = RandomUtil.randomNumbers(6); - JSONObject obj = new JSONObject(); - obj.put("code", captcha); - try { - boolean sendSmsSuccess = DySmsHelper.sendSms(phone, obj, DySmsEnum.LOGIN_TEMPLATE_CODE); - if (!sendSmsSuccess) { - throw new JeecgBootException("短信验证码发送失败,请稍后重试!"); - } - //验证码10分钟内有效 - redisUtil.set(redisKey, captcha, 600); - } catch (ClientException e) { - log.error(e.getMessage(), e); - throw new JeecgBootException("短信接口未配置,请联系管理员!"); - } + //String redisKey = CommonConstant.CHANGE_PHONE_REDIS_KEY_PRE + phone; + //Object object = redisUtil.get(redisKey); + // + //if (object != null) { + // throw new JeecgBootException("验证码10分钟内,仍然有效!"); + //} + // + ////增加 check防止恶意刷短信接口 + //if (!DySmsLimit.canSendSms(clientIp)) { + // log.warn("--------[警告] IP地址:{}, 短信接口请求太多-------", clientIp); + // throw new JeecgBootException("短信接口请求太多,请稍后再试!", CommonConstant.PHONE_SMS_FAIL_CODE); + //} + // + ////随机数 + //String captcha = RandomUtil.randomNumbers(6); + //JSONObject obj = new JSONObject(); + //obj.put("code", captcha); + //try { + // boolean sendSmsSuccess = DySmsHelper.sendSms(phone, obj, DySmsEnum.LOGIN_TEMPLATE_CODE); + // if (!sendSmsSuccess) { + // throw new JeecgBootException("短信验证码发送失败,请稍后重试!"); + // } + // //验证码10分钟内有效 + // redisUtil.set(redisKey, captcha, 600); + //} catch (ClientException e) { + // log.error(e.getMessage(), e); + // throw new JeecgBootException("短信接口未配置,请联系管理员!"); + //} } } diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java index e7818e3..cb0421d 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java @@ -1,217 +1,1154 @@ -package org.jeecg.modules.system.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.jeecg.dingtalk.api.base.JdtBaseAPI; -import com.jeecg.dingtalk.api.core.response.Response; -import com.jeecg.dingtalk.api.core.vo.AccessToken; -import com.jeecg.dingtalk.api.core.vo.PageResult; -import com.jeecg.dingtalk.api.department.JdtDepartmentAPI; -import com.jeecg.dingtalk.api.department.vo.Department; -import com.jeecg.dingtalk.api.message.JdtMessageAPI; -import com.jeecg.dingtalk.api.message.vo.ActionCardMessage; -import com.jeecg.dingtalk.api.message.vo.MarkdownMessage; -import com.jeecg.dingtalk.api.message.vo.Message; -import com.jeecg.dingtalk.api.message.vo.TextMessage; -import com.jeecg.dingtalk.api.oauth2.JdtOauth2API; -import com.jeecg.dingtalk.api.oauth2.vo.ContactUser; -import com.jeecg.dingtalk.api.user.JdtUserAPI; -import com.jeecg.dingtalk.api.user.body.GetUserListBody; -import com.jeecg.dingtalk.api.user.vo.User; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang.StringUtils; -import org.jeecg.common.api.dto.message.MessageDTO; -import org.jeecg.common.config.TenantContext; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.constant.SymbolConstant; -import org.jeecg.common.constant.enums.MessageTypeEnum; -import org.jeecg.common.exception.JeecgBootException; -import org.jeecg.common.system.util.JwtUtil; -import org.jeecg.common.util.PasswordUtil; -import org.jeecg.common.util.RestUtil; -import org.jeecg.common.util.SpringContextUtils; -import org.jeecg.common.util.oConvertUtils; -import org.jeecg.config.JeecgBaseConfig; -import org.jeecg.config.mybatis.MybatisPlusSaasConfig; -import org.jeecg.modules.system.entity.*; -import org.jeecg.modules.system.mapper.*; -import org.jeecg.modules.system.model.SysDepartTreeModel; -import org.jeecg.modules.system.model.ThirdLoginModel; -import org.jeecg.modules.system.service.*; -import org.jeecg.modules.system.vo.thirdapp.JdtDepartmentTreeVo; -import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DuplicateKeyException; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - - -/** - * 第三方App对接:钉钉实现类 - * - * @author: jeecg-boot - */ -@Slf4j -@Service -public class ThirdAppDingtalkServiceImpl implements IThirdAppService { - - @Autowired - JeecgBaseConfig jeecgBaseConfig; - @Autowired - private ISysDepartService sysDepartService; - @Autowired - private SysUserMapper userMapper; - @Autowired - private ISysThirdAccountService sysThirdAccountService; - @Autowired - private ISysUserDepartService sysUserDepartService; - @Autowired - private ISysPositionService sysPositionService; - @Autowired - private SysAnnouncementSendMapper sysAnnouncementSendMapper; - @Autowired - private SysThirdAppConfigMapper configMapper; - @Autowired - private SysUserTenantMapper userTenantMapper; - @Autowired - private SysTenantMapper tenantMapper; - - /** - * 第三方APP类型,当前固定为 dingtalk - */ - public final String THIRD_TYPE = "dingtalk"; - - @Override - public String getAccessToken() { - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - SysThirdAppConfig config = getDingThirdAppConfig(); - if (null != config) { - return getTenantAccessToken(config); - } - log.warn("租户下未配置钉钉"); - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - return null; - } - - // update:2022-1-21,updateBy:sunjianlei; for 【JTC-704】【钉钉】部门同步成功,实际没成,后台提示ip白名单 - @Override - public SyncInfoVo syncLocalDepartmentToThirdApp(String ids) { - SyncInfoVo syncInfo = new SyncInfoVo(); - String accessToken = this.getAccessToken(); - if (accessToken == null) { - syncInfo.addFailInfo("accessToken获取失败!"); - return syncInfo; - } - // 获取【钉钉】所有的部门 - List> departments = JdtDepartmentAPI.listAllResponse(accessToken); - // 删除钉钉有但本地没有的部门(以本地部门数据为主)(钉钉不能创建同名部门,只能先删除) - List sysDepartList = sysDepartService.list(); - for1: - for (Response departmentRes : departments) { - // 判断部门是否查询成功 - if (!departmentRes.isSuccess()) { - syncInfo.addFailInfo(departmentRes.getErrmsg()); - // 88 是 ip 不在白名单的错误码,如果遇到此错误码,后面的操作都可以不用进行了,因为肯定都是失败的 - if (new Integer(88).equals(departmentRes.getErrcode())) { - return syncInfo; - } - continue; - } - Department department = departmentRes.getResult(); - for (SysDepart depart : sysDepartList) { - // id相同,代表已存在,不删除 - String sourceIdentifier = department.getSource_identifier(); - if (sourceIdentifier != null && sourceIdentifier.equals(depart.getId())) { - continue for1; - } - } - // 循环到此说明本地没有,删除 - int deptId = department.getDept_id(); - // 钉钉不允许删除带有用户的部门,所以需要判断下,将有用户的部门的用户移动至根部门 - Response> userIdRes = JdtUserAPI.getUserListIdByDeptId(deptId, accessToken); - if (userIdRes.isSuccess() && userIdRes.getResult().size() > 0) { - for (String userId : userIdRes.getResult()) { - User updateUser = new User(); - updateUser.setUserid(userId); - updateUser.setDept_id_list(1); - JdtUserAPI.update(updateUser, accessToken); - } - } - JdtDepartmentAPI.delete(deptId, accessToken); - } - // 获取本地所有部门树结构 - List sysDepartsTree = sysDepartService.queryTreeList(); - // -- 钉钉不能创建新的顶级部门,所以新的顶级部门的parentId就为1 - Department parent = new Department(); - parent.setDept_id(1); - // 递归同步部门 - departments = JdtDepartmentAPI.listAllResponse(accessToken); - this.syncDepartmentRecursion(sysDepartsTree, departments, parent, accessToken, syncInfo); - return syncInfo; - } - - /** - * 递归同步部门到本地 - * - * @param sysDepartsTree - * @param departments - * @param parent - * @param accessToken - * @param syncInfo - */ - public void syncDepartmentRecursion(List sysDepartsTree, List> departments, Department parent, String accessToken, SyncInfoVo syncInfo) { - if (sysDepartsTree != null && sysDepartsTree.size() != 0) { - for1: - for (SysDepartTreeModel depart : sysDepartsTree) { - for (Response departmentRes : departments) { - // 判断部门是否查询成功 - if (!departmentRes.isSuccess()) { - syncInfo.addFailInfo(departmentRes.getErrmsg()); - continue; - } - Department department = departmentRes.getResult(); - // id相同,代表已存在,执行修改操作 - String sourceIdentifier = department.getSource_identifier(); - if (sourceIdentifier != null && sourceIdentifier.equals(depart.getId())) { - this.sysDepartToDtDepartment(depart, department, parent.getDept_id()); - Response response = JdtDepartmentAPI.update(department, accessToken); - if (response.isSuccess()) { - // 紧接着同步子级 - this.syncDepartmentRecursion(depart.getChildren(), departments, department, accessToken, syncInfo); - } - // 收集错误信息 - this.syncDepartCollectErrInfo(response, depart, syncInfo); - // 跳出外部循环 - continue for1; - } - } - // 循环到此说明是新部门,直接调接口创建 - Department newDepartment = this.sysDepartToDtDepartment(depart, parent.getDept_id()); - Response response = JdtDepartmentAPI.create(newDepartment, accessToken); - // 创建成功,将返回的id绑定到本地 - if (response.getResult() != null) { - Department newParent = new Department(); - newParent.setDept_id(response.getResult()); - // 紧接着同步子级 - this.syncDepartmentRecursion(depart.getChildren(), departments, newParent, accessToken, syncInfo); - } - // 收集错误信息 - this.syncDepartCollectErrInfo(response, depart, syncInfo); - } - } - } - +//package org.jeecg.modules.system.service.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSON; +//import com.alibaba.fastjson.JSONObject; +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.baomidou.mybatisplus.core.toolkit.Wrappers; +//import com.jeecg.dingtalk.api.base.JdtBaseAPI; +//import com.jeecg.dingtalk.api.core.response.Response; +//import com.jeecg.dingtalk.api.core.vo.AccessToken; +//import com.jeecg.dingtalk.api.core.vo.PageResult; +//import com.jeecg.dingtalk.api.department.JdtDepartmentAPI; +//import com.jeecg.dingtalk.api.department.vo.Department; +//import com.jeecg.dingtalk.api.message.JdtMessageAPI; +//import com.jeecg.dingtalk.api.message.vo.ActionCardMessage; +//import com.jeecg.dingtalk.api.message.vo.MarkdownMessage; +//import com.jeecg.dingtalk.api.message.vo.Message; +//import com.jeecg.dingtalk.api.message.vo.TextMessage; +//import com.jeecg.dingtalk.api.oauth2.JdtOauth2API; +//import com.jeecg.dingtalk.api.oauth2.vo.ContactUser; +//import com.jeecg.dingtalk.api.user.JdtUserAPI; +//import com.jeecg.dingtalk.api.user.body.GetUserListBody; +//import com.jeecg.dingtalk.api.user.vo.User; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.commons.lang.StringUtils; +//import org.jeecg.common.api.dto.message.MessageDTO; +//import org.jeecg.common.config.TenantContext; +//import org.jeecg.common.constant.CommonConstant; +//import org.jeecg.common.constant.SymbolConstant; +//import org.jeecg.common.constant.enums.MessageTypeEnum; +//import org.jeecg.common.exception.JeecgBootException; +//import org.jeecg.common.system.util.JwtUtil; +//import org.jeecg.common.util.PasswordUtil; +//import org.jeecg.common.util.RestUtil; +//import org.jeecg.common.util.SpringContextUtils; +//import org.jeecg.common.util.oConvertUtils; +//import org.jeecg.config.JeecgBaseConfig; +//import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +//import org.jeecg.modules.system.entity.*; +//import org.jeecg.modules.system.mapper.*; +//import org.jeecg.modules.system.model.SysDepartTreeModel; +//import org.jeecg.modules.system.model.ThirdLoginModel; +//import org.jeecg.modules.system.service.*; +//import org.jeecg.modules.system.vo.thirdapp.JdtDepartmentTreeVo; +//import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo; +//import org.springframework.beans.BeanUtils; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.dao.DuplicateKeyException; +//import org.springframework.stereotype.Service; +// +//import java.util.ArrayList; +//import java.util.HashSet; +//import java.util.List; +//import java.util.Set; +//import java.util.stream.Collectors; +// +// +///** +// * 第三方App对接:钉钉实现类 +// * +// * @author: jeecg-boot +// */ +//@Slf4j +//@Service +//public class ThirdAppDingtalkServiceImpl implements IThirdAppService { +// +// @Autowired +// JeecgBaseConfig jeecgBaseConfig; +// @Autowired +// private ISysDepartService sysDepartService; +// @Autowired +// private SysUserMapper userMapper; +// @Autowired +// private ISysThirdAccountService sysThirdAccountService; +// @Autowired +// private ISysUserDepartService sysUserDepartService; +// @Autowired +// private ISysPositionService sysPositionService; +// @Autowired +// private SysAnnouncementSendMapper sysAnnouncementSendMapper; +// @Autowired +// private SysThirdAppConfigMapper configMapper; +// @Autowired +// private SysUserTenantMapper userTenantMapper; +// @Autowired +// private SysTenantMapper tenantMapper; +// +// /** +// * 第三方APP类型,当前固定为 dingtalk +// */ +// public final String THIRD_TYPE = "dingtalk"; +// // @Override -// public SyncInfoVo syncThirdAppDepartmentToLocal(String ids) { +// public String getAccessToken() { +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// SysThirdAppConfig config = getDingThirdAppConfig(); +// if (null != config) { +// return getTenantAccessToken(config); +// } +// log.warn("租户下未配置钉钉"); +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// return null; +// } +// +// // update:2022-1-21,updateBy:sunjianlei; for 【JTC-704】【钉钉】部门同步成功,实际没成,后台提示ip白名单 +// @Override +// public SyncInfoVo syncLocalDepartmentToThirdApp(String ids) { +// SyncInfoVo syncInfo = new SyncInfoVo(); +// String accessToken = this.getAccessToken(); +// if (accessToken == null) { +// syncInfo.addFailInfo("accessToken获取失败!"); +// return syncInfo; +// } +// // 获取【钉钉】所有的部门 +// List> departments = JdtDepartmentAPI.listAllResponse(accessToken); +// // 删除钉钉有但本地没有的部门(以本地部门数据为主)(钉钉不能创建同名部门,只能先删除) +// List sysDepartList = sysDepartService.list(); +// for1: +// for (Response departmentRes : departments) { +// // 判断部门是否查询成功 +// if (!departmentRes.isSuccess()) { +// syncInfo.addFailInfo(departmentRes.getErrmsg()); +// // 88 是 ip 不在白名单的错误码,如果遇到此错误码,后面的操作都可以不用进行了,因为肯定都是失败的 +// if (new Integer(88).equals(departmentRes.getErrcode())) { +// return syncInfo; +// } +// continue; +// } +// Department department = departmentRes.getResult(); +// for (SysDepart depart : sysDepartList) { +// // id相同,代表已存在,不删除 +// String sourceIdentifier = department.getSource_identifier(); +// if (sourceIdentifier != null && sourceIdentifier.equals(depart.getId())) { +// continue for1; +// } +// } +// // 循环到此说明本地没有,删除 +// int deptId = department.getDept_id(); +// // 钉钉不允许删除带有用户的部门,所以需要判断下,将有用户的部门的用户移动至根部门 +// Response> userIdRes = JdtUserAPI.getUserListIdByDeptId(deptId, accessToken); +// if (userIdRes.isSuccess() && userIdRes.getResult().size() > 0) { +// for (String userId : userIdRes.getResult()) { +// User updateUser = new User(); +// updateUser.setUserid(userId); +// updateUser.setDept_id_list(1); +// JdtUserAPI.update(updateUser, accessToken); +// } +// } +// JdtDepartmentAPI.delete(deptId, accessToken); +// } +// // 获取本地所有部门树结构 +// List sysDepartsTree = sysDepartService.queryTreeList(); +// // -- 钉钉不能创建新的顶级部门,所以新的顶级部门的parentId就为1 +// Department parent = new Department(); +// parent.setDept_id(1); +// // 递归同步部门 +// departments = JdtDepartmentAPI.listAllResponse(accessToken); +// this.syncDepartmentRecursion(sysDepartsTree, departments, parent, accessToken, syncInfo); +// return syncInfo; +// } +// +// /** +// * 递归同步部门到本地 +// * +// * @param sysDepartsTree +// * @param departments +// * @param parent +// * @param accessToken +// * @param syncInfo +// */ +// public void syncDepartmentRecursion(List sysDepartsTree, List> departments, Department parent, String accessToken, SyncInfoVo syncInfo) { +// if (sysDepartsTree != null && sysDepartsTree.size() != 0) { +// for1: +// for (SysDepartTreeModel depart : sysDepartsTree) { +// for (Response departmentRes : departments) { +// // 判断部门是否查询成功 +// if (!departmentRes.isSuccess()) { +// syncInfo.addFailInfo(departmentRes.getErrmsg()); +// continue; +// } +// Department department = departmentRes.getResult(); +// // id相同,代表已存在,执行修改操作 +// String sourceIdentifier = department.getSource_identifier(); +// if (sourceIdentifier != null && sourceIdentifier.equals(depart.getId())) { +// this.sysDepartToDtDepartment(depart, department, parent.getDept_id()); +// Response response = JdtDepartmentAPI.update(department, accessToken); +// if (response.isSuccess()) { +// // 紧接着同步子级 +// this.syncDepartmentRecursion(depart.getChildren(), departments, department, accessToken, syncInfo); +// } +// // 收集错误信息 +// this.syncDepartCollectErrInfo(response, depart, syncInfo); +// // 跳出外部循环 +// continue for1; +// } +// } +// // 循环到此说明是新部门,直接调接口创建 +// Department newDepartment = this.sysDepartToDtDepartment(depart, parent.getDept_id()); +// Response response = JdtDepartmentAPI.create(newDepartment, accessToken); +// // 创建成功,将返回的id绑定到本地 +// if (response.getResult() != null) { +// Department newParent = new Department(); +// newParent.setDept_id(response.getResult()); +// // 紧接着同步子级 +// this.syncDepartmentRecursion(depart.getChildren(), departments, newParent, accessToken, syncInfo); +// } +// // 收集错误信息 +// this.syncDepartCollectErrInfo(response, depart, syncInfo); +// } +// } +// } +// +//// @Override +//// public SyncInfoVo syncThirdAppDepartmentToLocal(String ids) { +//// SyncInfoVo syncInfo = new SyncInfoVo(); +//// String accessToken = this.getAccessToken(); +//// if (accessToken == null) { +//// syncInfo.addFailInfo("accessToken获取失败!"); +//// return syncInfo; +//// } +//// // 获取【钉钉】所有的部门 +//// List departments = JdtDepartmentAPI.listAll(accessToken); +//// String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest()); +//// List departmentTreeList = JdtDepartmentTreeVo.listToTree(departments); +//// // 递归同步部门 +//// this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, accessToken,false); +//// return syncInfo; +//// } +// +// public void syncDepartmentToLocalRecursion(List departmentTreeList, String sysParentId, String username, SyncInfoVo syncInfo, String accessToken, Boolean syncUser, Integer tenantId) { +// +// if (departmentTreeList != null && departmentTreeList.size() != 0) { +// // 记录已经同步过的用户id,当有多个部门的情况时,只同步一次 +// Set syncedUserIdSet = new HashSet<>(); +// for (JdtDepartmentTreeVo departmentTree : departmentTreeList) { +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// // 根据 source_identifier 字段查询 +// //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- +// queryWrapper.and(item -> item.eq(SysDepart::getId, departmentTree.getSource_identifier()).or().eq(SysDepart::getDingIdentifier, departmentTree.getDept_id())); +// //update-end---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- +// SysDepart sysDepart = sysDepartService.getOne(queryWrapper); +// if (sysDepart != null) { +// // 执行更新操作 +// SysDepart updateSysDepart = this.dtDepartmentToSysDepart(departmentTree, sysDepart); +// if (sysParentId != null) { +// updateSysDepart.setParentId(sysParentId); +// //更新父级部门不是叶子结点 +// sysDepartService.updateIzLeaf(sysParentId, CommonConstant.NOT_LEAF); +// } +// try { +// sysDepartService.updateDepartDataById(updateSysDepart, username); +// String str = String.format("部门 %s 更新成功!", updateSysDepart.getDepartName()); +// syncInfo.addSuccessInfo(str); +// } catch (Exception e) { +// this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); +// } +// if (departmentTree.hasChildren()) { +// // 紧接着同步子级 +// this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), updateSysDepart.getId(), username, syncInfo, accessToken, syncUser, tenantId); +// } +// //判断是否需要同步用户 +// if (syncUser) { +// this.addDepartUser(updateSysDepart.getId(), departmentTree.getDept_id(), accessToken, syncInfo, syncedUserIdSet, tenantId); +// } +// } else { +// // 执行新增操作 +// SysDepart newSysDepart = this.dtDepartmentToSysDepart(departmentTree, null); +// if (sysParentId != null) { +// newSysDepart.setParentId(sysParentId); +// // 2 = 组织机构 +// newSysDepart.setOrgCategory("2"); +// } else { +// // 1 = 公司 +// newSysDepart.setOrgCategory("1"); +// } +// try { +// if (oConvertUtils.isEmpty(departmentTree.getParent_id())) { +// newSysDepart.setDingIdentifier(departmentTree.getDept_id().toString()); +// } +// newSysDepart.setTenantId(tenantId); +// sysDepartService.saveDepartData(newSysDepart, username); +// // 更新钉钉 source_identifier +// Department updateDtDepart = new Department(); +// updateDtDepart.setDept_id(departmentTree.getDept_id()); +// updateDtDepart.setSource_identifier(newSysDepart.getId()); +// //为空说明是最顶级部门,最顶级部门不允许修改操作 +// if (oConvertUtils.isNotEmpty(newSysDepart.getParentId())) { +// Response response = JdtDepartmentAPI.update(updateDtDepart, accessToken); +// if (!response.isSuccess()) { +// throw new RuntimeException(response.getErrmsg()); +// } +// } +// String str = String.format("部门 %s 创建成功!", newSysDepart.getDepartName()); +// syncInfo.addSuccessInfo(str); +// //判断是否需要同步用户 +// if (syncUser) { +// this.addDepartUser(newSysDepart.getId(), departmentTree.getDept_id(), accessToken, syncInfo, syncedUserIdSet, tenantId); +// } +// } catch (Exception e) { +// this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); +// } +// // 紧接着同步子级 +// if (departmentTree.hasChildren()) { +// this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), newSysDepart.getId(), username, syncInfo, accessToken, syncUser, tenantId); +// } +// } +// } +// } +// } +// +// private boolean syncDepartCollectErrInfo(Exception e, Department department, SyncInfoVo syncInfo) { +// String msg; +// if (e instanceof DuplicateKeyException) { +// msg = e.getCause().getMessage(); +// } else { +// msg = e.getMessage(); +// } +// String str = String.format("部门 %s(%s) 同步失败!错误信息:%s", department.getName(), department.getDept_id(), msg); +// syncInfo.addFailInfo(str); +// return false; +// } +// +// /** +// * 【同步部门】收集同步过程中的错误信息 +// */ +// private boolean syncDepartCollectErrInfo(Response response, SysDepartTreeModel depart, SyncInfoVo syncInfo) { +// if (!response.isSuccess()) { +// String str = String.format("部门 %s(%s) 同步失败!错误码:%s——%s", depart.getDepartName(), depart.getOrgCode(), response.getErrcode(), response.getErrmsg()); +// syncInfo.addFailInfo(str); +// return false; +// } else { +// String str = String.format("部门户 %s(%s) 同步成功!", depart.getDepartName(), depart.getOrgCode()); +// syncInfo.addSuccessInfo(str); +// return true; +// } +// } +// +// @Override +// public SyncInfoVo syncLocalUserToThirdApp(String ids) { +// SyncInfoVo syncInfo = new SyncInfoVo(); +// String accessToken = this.getAccessToken(); +// if (accessToken == null) { +// syncInfo.addFailInfo("accessToken获取失败!"); +// return syncInfo; +// } +// List sysUsers; +// if (StringUtils.isNotBlank(ids)) { +// String[] idList = ids.split(","); +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.in(SysUser::getId, (Object[]) idList); +// // 获取本地指定用户 +// sysUsers = userMapper.selectList(queryWrapper); +// } else { +// // 获取本地所有用户 +// sysUsers = userMapper.selectList(Wrappers.emptyWrapper()); +// } +// // 查询钉钉所有的部门,用于同步用户和部门的关系 +// List allDepartment = JdtDepartmentAPI.listAll(accessToken); +// +// for (SysUser sysUser : sysUsers) { +// // 外部模拟登陆临时账号,不同步 +// if ("_reserve_user_external".equals(sysUser.getUsername())) { +// continue; +// } +// // 钉钉用户信息,不为null代表已同步过 +// Response dtUserInfo; +// /* +// * 判断是否同步过的逻辑: +// * 1. 查询 sys_third_account(第三方账号表)是否有数据,如果有代表已同步 +// * 2. 本地表里没有,就先用手机号判断,不通过再用username(用户账号)判断。 +// */ +// SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneBySysUserId(sysUser.getId(), THIRD_TYPE); +// if (sysThirdAccount != null && oConvertUtils.isNotEmpty(sysThirdAccount.getThirdUserId())) { +// // sys_third_account 表匹配成功,通过第三方userId查询出第三方userInfo +// dtUserInfo = JdtUserAPI.getUserById(sysThirdAccount.getThirdUserId(), accessToken); +// } else { +// // 手机号匹配 +// Response thirdUserId = JdtUserAPI.getUseridByMobile(sysUser.getPhone(), accessToken); +// // 手机号匹配成功 +// if (thirdUserId.isSuccess() && oConvertUtils.isNotEmpty(thirdUserId.getResult())) { +// // 通过查询到的userId查询用户详情 +// dtUserInfo = JdtUserAPI.getUserById(thirdUserId.getResult(), accessToken); +// } else { +// // 手机号匹配失败,尝试使用username匹配 +// dtUserInfo = JdtUserAPI.getUserById(sysUser.getUsername(), accessToken); +// } +// } +// String dtUserId; +// // api 接口是否执行成功 +// boolean apiSuccess; +// // 已同步就更新,否则就创建 +// if (dtUserInfo != null && dtUserInfo.isSuccess() && dtUserInfo.getResult() != null) { +// User dtUser = dtUserInfo.getResult(); +// dtUserId = dtUser.getUserid(); +// User updateQwUser = this.sysUserToDtUser(sysUser, dtUser, allDepartment); +// Response updateRes = JdtUserAPI.update(updateQwUser, accessToken); +// // 收集成功/失败信息 +// apiSuccess = this.syncUserCollectErrInfo(updateRes, sysUser, syncInfo); +// } else { +// User newQwUser = this.sysUserToDtUser(sysUser, allDepartment); +// Response createRes = JdtUserAPI.create(newQwUser, accessToken); +// dtUserId = createRes.getResult(); +// // 收集成功/失败信息 +// apiSuccess = this.syncUserCollectErrInfo(createRes, sysUser, syncInfo); +// } +// +// // api 接口执行成功,并且 sys_third_account 表匹配失败,就向 sys_third_account 里插入一条数据 +// boolean flag = (sysThirdAccount == null || oConvertUtils.isEmpty(sysThirdAccount.getThirdUserId())); +// if (apiSuccess && flag) { +// if (sysThirdAccount == null) { +// sysThirdAccount = new SysThirdAccount(); +// sysThirdAccount.setSysUserId(sysUser.getId()); +// sysThirdAccount.setStatus(1); +// sysThirdAccount.setDelFlag(0); +// sysThirdAccount.setThirdType(THIRD_TYPE); +// } +// // 设置第三方app用户ID +// sysThirdAccount.setThirdUserId(dtUserId); +// sysThirdAccountService.saveOrUpdate(sysThirdAccount); +// } +// } +// return syncInfo; +// } +// +//// @Override +//// public SyncInfoVo syncThirdAppUserToLocal() { +//// SyncInfoVo syncInfo = new SyncInfoVo(); +//// String accessToken = this.getAccessToken(); +//// if (accessToken == null) { +//// syncInfo.addFailInfo("accessToken获取失败!"); +//// return syncInfo; +//// } +//// +//// // 获取本地用户 +//// List sysUsersList = userMapper.selectList(Wrappers.emptyWrapper()); +//// +//// // 查询钉钉所有的部门,用于同步用户和部门的关系 +//// List allDepartment = JdtDepartmentAPI.listAll(accessToken); +//// // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 +//// List ddUserList = this.getDtAllUserByDepartment(allDepartment, accessToken); +//// // 记录已经同步过的用户id,当有多个部门的情况时,只同步一次 +//// Set syncedUserIdSet = new HashSet<>(); +//// +//// for (User dtUserInfo : ddUserList) { +//// if (syncedUserIdSet.contains(dtUserInfo.getUserid())) { +//// continue; +//// } +//// syncedUserIdSet.add(dtUserInfo.getUserid()); +//// SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(dtUserInfo.getUserid(), THIRD_TYPE); +//// List collect = sysUsersList.stream().filter(user -> (dtUserInfo.getMobile().equals(user.getPhone()) || dtUserInfo.getUserid().equals(user.getUsername())) +//// ).collect(Collectors.toList()); +//// if (collect != null && collect.size() > 0) { +//// SysUser sysUserTemp = collect.get(0); +//// // 循环到此说明用户匹配成功,进行更新操作 +//// SysUser updateSysUser = this.dtUserToSysUser(dtUserInfo, sysUserTemp); +//// try { +//// userMapper.updateById(updateSysUser); +//// String str = String.format("用户 %s(%s) 更新成功!", updateSysUser.getRealname(), updateSysUser.getUsername()); +//// syncInfo.addSuccessInfo(str); +//// } catch (Exception e) { +//// this.syncUserCollectErrInfo(e, dtUserInfo, syncInfo); +//// } +//// //第三方账号关系表 +//// this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), dtUserInfo.getUserid()); +//// }else{ +//// // 如果没有匹配到用户,则走创建逻辑 +//// SysUser newSysUser = this.dtUserToSysUser(dtUserInfo); +//// try { +//// userMapper.insert(newSysUser); +//// String str = String.format("用户 %s(%s) 创建成功!", newSysUser.getRealname(), newSysUser.getUsername()); +//// syncInfo.addSuccessInfo(str); +//// } catch (Exception e) { +//// this.syncUserCollectErrInfo(e, dtUserInfo, syncInfo); +//// } +//// //第三方账号关系表 +//// this.thirdAccountSaveOrUpdate(null, newSysUser.getId(), dtUserInfo.getUserid()); +//// } +//// } +//// return syncInfo; +//// } +// +//// private List getDtAllUserByDepartment(List allDepartment, String accessToken) { +//// // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 +//// List userList = new ArrayList<>(); +//// for (Department department : allDepartment) { +//// this.getUserListByDeptIdRecursion(department.getDept_id(), 0, userList, accessToken); +//// } +//// return userList; +//// } +// +// /** +// * 递归查询所有用户 +// */ +// private void getUserListByDeptIdRecursion(int deptId, int cursor, List userList, String accessToken) { +// // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 +// GetUserListBody getUserListBody = new GetUserListBody(deptId, cursor, 100); +// Response> response = JdtUserAPI.getUserListByDeptId(getUserListBody, accessToken); +// if (response.isSuccess()) { +// PageResult page = response.getResult(); +// userList.addAll(page.getList()); +// if (page.getHas_more()) { +// this.getUserListByDeptIdRecursion(deptId, page.getNext_cursor(), userList, accessToken); +// } +// } +// } +// +// /** +// * 保存或修改第三方登录表 +// * +// * @param sysThirdAccount 第三方账户表对象,为null就新增数据,否则就修改 +// * @param sysUserId 本地系统用户ID +// * @param user 钉钉用户 +// */ +// private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, User user, Integer tenantId) { +// if (sysThirdAccount == null) { +// sysThirdAccount = new SysThirdAccount(); +// sysThirdAccount.setSysUserId(sysUserId); +// sysThirdAccount.setThirdUserUuid(user.getUnionid()); +// sysThirdAccount.setStatus(1); +// sysThirdAccount.setTenantId(tenantId); +// sysThirdAccount.setDelFlag(0); +// sysThirdAccount.setThirdType(THIRD_TYPE); +// } +// sysThirdAccount.setThirdUserId(user.getUserid()); +// if (oConvertUtils.isEmpty(sysThirdAccount.getRealname())) { +// sysThirdAccount.setRealname(user.getName()); +// } +// sysThirdAccountService.saveOrUpdate(sysThirdAccount); +// } +// +// /** +// * 【同步用户】收集同步过程中的错误信息 +// */ +// private boolean syncUserCollectErrInfo(Response response, SysUser sysUser, SyncInfoVo syncInfo) { +// if (!response.isSuccess()) { +// String str = String.format("用户 %s(%s) 同步失败!错误码:%s——%s", sysUser.getUsername(), sysUser.getRealname(), response.getErrcode(), response.getErrmsg()); +// syncInfo.addFailInfo(str); +// return false; +// } else { +// String str = String.format("用户 %s(%s) 同步成功!", sysUser.getUsername(), sysUser.getRealname()); +// syncInfo.addSuccessInfo(str); +// return true; +// } +// } +// +// /** +// * 【同步用户】收集同步过程中的错误信息 +// */ +// private boolean syncUserCollectErrInfo(Exception e, User dtUser, SyncInfoVo syncInfo) { +// String msg; +// if (e instanceof DuplicateKeyException) { +// msg = e.getCause().getMessage(); +// String emailUniq = "uniq_sys_user_email"; +// if (msg.contains(emailUniq)) { +// msg = "邮箱重复,请更换邮箱"; +// } +// String workNoUniq = "uniq_sys_user_work_no"; +// if (msg.contains(workNoUniq)) { +// msg = "工号重复,请更换工号"; +// } +// } else { +// msg = e.getMessage(); +// } +// String str = String.format("用户 %s(%s) 同步失败!错误信息:%s", dtUser.getUserid(), dtUser.getName(), msg); +// syncInfo.addFailInfo(str); +// return false; +// } +// +// +// /** +// * 【同步用户】将SysUser转为【钉钉】的User对象(创建新用户) +// */ +// private User sysUserToDtUser(SysUser sysUser, List allDepartment) { +// User user = new User(); +// // 通过 username 来关联 +// user.setUserid(sysUser.getUsername()); +// return this.sysUserToDtUser(sysUser, user, allDepartment); +// } +// +// /** +// * 【同步用户】将SysUser转为【钉钉】的User对象(更新旧用户) +// */ +// private User sysUserToDtUser(SysUser sysUser, User user, List allDepartment) { +// user.setName(sysUser.getRealname()); +// user.setMobile(sysUser.getPhone()); +// user.setTelephone(sysUser.getTelephone()); +// user.setJob_number(sysUser.getWorkNo()); +// // 职务翻译 +// //update-begin---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ +// //获取用户职位名称 +// List positionList = sysPositionService.getPositionList(sysUser.getId()); +// if (null != positionList && positionList.size() > 0) { +// String positionName = positionList.stream().map(SysPosition::getName).collect(Collectors.joining(SymbolConstant.COMMA)); +// user.setTitle(positionName); +// } +// //update-end---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ +// user.setEmail(sysUser.getEmail()); +// // 查询并同步用户部门关系 +// List departList = this.getUserDepart(sysUser); +// if (departList != null) { +// List departmentIdList = new ArrayList<>(); +// for (SysDepart sysDepart : departList) { +// // 企业微信的部门id +// Department department = this.getDepartmentByDepartId(sysDepart.getId(), allDepartment); +// if (department != null) { +// departmentIdList.add(department.getDept_id()); +// } +// } +// user.setDept_id_list(departmentIdList.toArray(new Integer[]{})); +// user.setDept_order_list(null); +// } +// if (oConvertUtils.isEmpty(user.getDept_id_list())) { +// // 没有找到匹配部门,同步到根部门下 +// user.setDept_id_list(1); +// user.setDept_order_list(null); +// } +// // --- 钉钉没有逻辑删除功能 +// // sysUser.getDelFlag() +// // --- 钉钉没有冻结、启用禁用功能 +// // sysUser.getStatus() +// return user; +// } +// +// +// /** +// * 【同步用户】将【钉钉】的User对象转为SysUser(创建新用户) +// */ +// private SysUser dtUserToSysUser(User dtUser) { +// SysUser sysUser = new SysUser(); +// sysUser.setDelFlag(0); +// // 通过 username 来关联 +// sysUser.setUsername(dtUser.getMobile()); +// // 密码默认为为手机号加门牌号,随机加盐 +// String password = "", salt = oConvertUtils.randomGen(8); +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// if (tenantId > 0) { +// SysTenant tenant = tenantMapper.selectById(tenantId); +// password = tenant.getHouseNumber() + dtUser.getMobile(); +// } else { +// password = dtUser.getMobile(); +// } +// String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt); +// sysUser.setSalt(salt); +// sysUser.setPassword(passwordEncode); +// // update-begin--Author:liusq Date:20210713 for:钉钉同步到本地的人员没有状态,导致同步之后无法登录 #I3ZC2L +// sysUser.setStatus(1); +// // update-end--Author:liusq Date:20210713 for:钉钉同步到本地的人员没有状态,导致同步之后无法登录 #I3ZC2L +// return this.dtUserToSysUser(dtUser, sysUser); +// } +// +// /** +// * 【同步用户】将【钉钉】的User对象转为SysUser(更新旧用户) +// */ +// private SysUser dtUserToSysUser(User dtUser, SysUser oldSysUser) { +// SysUser sysUser = new SysUser(); +// BeanUtils.copyProperties(oldSysUser, sysUser); +// sysUser.setTelephone(dtUser.getTelephone()); +// //如果真实姓名为空的情况下,才会改真实姓名 +// if (oConvertUtils.isEmpty(oldSysUser.getRealname())) { +// sysUser.setRealname(dtUser.getName()); +// } +// // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 +// if (oConvertUtils.isNotEmpty(dtUser.getEmail()) && !dtUser.getEmail().equals(sysUser.getEmail())) { +// sysUser.setEmail(dtUser.getEmail()); +// } else { +// sysUser.setEmail(null); +// } +// // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 +// if (oConvertUtils.isNotEmpty(dtUser.getMobile()) && !dtUser.getMobile().equals(sysUser.getPhone())) { +// sysUser.setPhone(dtUser.getMobile()); +// } else { +// sysUser.setPhone(null); +// } +// // 设置工号,如果工号为空,则使用username +// if (oConvertUtils.isEmpty(dtUser.getJob_number())) { +// sysUser.setWorkNo(dtUser.getUserid()); +// } else { +// sysUser.setWorkNo(dtUser.getJob_number()); +// } +// // --- 钉钉没有逻辑删除功能 +// // sysUser.getDelFlag() +// // --- 钉钉没有冻结、启用禁用功能 +// // sysUser.getStatus() +// return sysUser; +// } +// +// +// /** +// * 查询用户和部门的关系 +// */ +// private List getUserDepart(SysUser sysUser) { +// // 根据用户部门关系表查询出用户的部门 +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysUserDepart::getUserId, sysUser.getId()); +// List sysUserDepartList = sysUserDepartService.list(queryWrapper); +// if (sysUserDepartList.size() == 0) { +// return null; +// } +// // 根据用户部门 +// LambdaQueryWrapper departQueryWrapper = new LambdaQueryWrapper<>(); +// List departIdList = sysUserDepartList.stream().map(SysUserDepart::getDepId).collect(Collectors.toList()); +// departQueryWrapper.in(SysDepart::getId, departIdList); +// List departList = sysDepartService.list(departQueryWrapper); +// return departList.size() == 0 ? null : departList; +// } +// +// /** +// * 根据sysDepartId查询钉钉的部门 +// */ +// private Department getDepartmentByDepartId(String departId, List allDepartment) { +// for (Department department : allDepartment) { +// if (departId.equals(department.getSource_identifier())) { +// return department; +// } +// } +// return null; +// } +// +// +// /** +// * 【同步部门】将SysDepartTreeModel转为【钉钉】的Department对象(创建新部门) +// */ +// private Department sysDepartToDtDepartment(SysDepartTreeModel departTree, Integer parentId) { +// Department department = new Department(); +// department.setSource_identifier(departTree.getId()); +// return this.sysDepartToDtDepartment(departTree, department, parentId); +// } +// +// /** +// * 【同步部门】将SysDepartTreeModel转为【钉钉】的Department对象 +// */ +// private Department sysDepartToDtDepartment(SysDepartTreeModel departTree, Department department, Integer parentId) { +// department.setName(departTree.getDepartName()); +// department.setParent_id(parentId); +// department.setOrder(departTree.getDepartOrder()); +// return department; +// } +// +// +// /** +// * 【同步部门】将【钉钉】的Department对象转为SysDepartTreeModel +// */ +// private SysDepart dtDepartmentToSysDepart(Department department, SysDepart departTree) { +// SysDepart sysDepart = new SysDepart(); +// if (departTree != null) { +// BeanUtils.copyProperties(departTree, sysDepart); +// } +// sysDepart.setDepartName(department.getName()); +// sysDepart.setDepartOrder(department.getOrder()); +// return sysDepart; +// } +// +// @Override +// public int removeThirdAppUser(List userIdList) { +// // 判断启用状态 +// SysThirdAppConfig appConfig = getDingThirdAppConfig(); +// if (null == appConfig) { +// return -1; +// } +// int count = 0; +// if (userIdList != null && userIdList.size() > 0) { +// //update-begin---author:wangshuai ---date:20230209 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// String accessToken = this.getTenantAccessToken(appConfig); +// //update-end---author:wangshuai ---date:20230209 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// if (accessToken == null) { +// return count; +// } +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); +// queryWrapper.in(SysThirdAccount::getSysUserId, userIdList); +// // 根据userId,获取第三方用户的id +// List thirdAccountList = sysThirdAccountService.list(queryWrapper); +// List thirdUserIdList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); +// +// for (String thirdUserId : thirdUserIdList) { +// if (oConvertUtils.isNotEmpty(thirdUserId)) { +// // 没有批量删除的接口 +// Response response = JdtUserAPI.delete(thirdUserId, accessToken); +// if (response.getErrcode() == 0) { +// count++; +// } +// } +// } +// } +// return count; +// +// } +// +// @Override +// public boolean sendMessage(MessageDTO message) { +// return this.sendMessage(message, false); +// } +// +// /** +// * 发送消息 +// * +// * @param message +// * @param verifyConfig +// * @return +// */ +// @Override +// public boolean sendMessage(MessageDTO message, boolean verifyConfig) { +// Response response; +// if (message.isMarkdown()) { +// response = this.sendMarkdownResponse(message, verifyConfig); +// } else { +// response = this.sendMessageResponse(message, verifyConfig); +// } +// if (response != null) { +// return response.isSuccess(); +// } +// return false; +// } +// +// /** +// * 发送Markdown消息 +// * +// * @param message +// * @param verifyConfig +// * @return +// */ +// public Response sendMarkdownResponse(MessageDTO message, boolean verifyConfig) { +// SysThirdAppConfig config = this.getDingThirdAppConfig(); +// if (verifyConfig && null == config) { +// return null; +// } +// String accessToken = this.getAccessToken(); +// if (accessToken == null) { +// return null; +// } +// // 封装钉钉消息 +// String title = message.getTitle(); +// String content = message.getContent(); +// String agentId = config.getAgentId(); +// Message mdMessage = new Message<>(agentId, new MarkdownMessage(title, content)); +// if (message.getToAll()) { +// mdMessage.setTo_all_user(true); +// } else { +// String[] toUsers = message.getToUser().split(","); +// // 通过第三方账号表查询出第三方userId +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE); +// List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, THIRD_TYPE, tenantId); +// List dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); +// mdMessage.setUserid_list(dtUserIds); +// } +// return JdtMessageAPI.sendMarkdownMessage(mdMessage, accessToken); +// } +// +// public Response sendMessageResponse(MessageDTO message, boolean verifyConfig) { +// SysThirdAppConfig config = this.getDingThirdAppConfig(); +// if (verifyConfig && null == config) { +// return null; +// } +// String accessToken = this.getAccessToken(); +// if (accessToken == null) { +// return null; +// } +// // 封装钉钉消息 +// String content = message.getContent(); +// String agentId = config.getAgentId(); +// Message textMessage = new Message<>(agentId, new TextMessage(content)); +// if (message.getToAll()) { +// textMessage.setTo_all_user(true); +// } else { +// String[] toUsers = message.getToUser().split(","); +// // 通过第三方账号表查询出第三方userId +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE); +// List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, THIRD_TYPE, tenantId); +// List dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); +// textMessage.setUserid_list(dtUserIds); +// } +// return JdtMessageAPI.sendTextMessage(textMessage, accessToken); +// } +// +// public boolean recallMessage(String msgTaskId) { +// Response response = this.recallMessageResponse(msgTaskId); +// if (response == null) { +// return false; +// } +// return response.isSuccess(); +// } +// +// /** +// * 撤回消息 +// * +// * @param msgTaskId +// * @return +// */ +// public Response recallMessageResponse(String msgTaskId) { +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// SysThirdAppConfig config = this.getDingThirdAppConfig(); +// String accessToken = this.getTenantAccessToken(config); +// if (accessToken == null) { +// return null; +// } +// String agentId = config.getAgentId(); +// return JdtMessageAPI.recallMessage(agentId, msgTaskId, accessToken); +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// } +// +// /** +// * 发送卡片消息(SysAnnouncement定制) +// * +// * @param announcement +// * @param ddMobileUrl 钉钉打开网页地址 +// * @param verifyConfig 是否验证配置(未启用的APP会拒绝发送) +// * @return +// */ +// public Response sendActionCardMessage(SysAnnouncement announcement, String ddMobileUrl, boolean verifyConfig) { +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// SysThirdAppConfig config = this.getDingThirdAppConfig(); +// if (verifyConfig && null == config) { +// return null; +// } +// String accessToken = this.getTenantAccessToken(config); +// if (accessToken == null) { +// return null; +// } +// String agentId = config.getAgentId(); +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// String emptySuffix = null; +// if (oConvertUtils.isNotEmpty(announcement.getMsgAbstract())) { +// String msgAbstract = announcement.getMsgAbstract().trim(); +// log.info("获取钉钉通知参数,msgAbstract: {}", msgAbstract); +// if (msgAbstract.startsWith("{") && msgAbstract.endsWith("}")) { +// //如果摘要存的是业务扩展参数json,则取公告内容 +// emptySuffix = announcement.getMsgContent(); +// } else { +// //如果摘要不为空且是文本格式,则使用摘要 +// emptySuffix = msgAbstract; +// } +// } else { +// emptySuffix = "空"; +// } +// +// String markdown = "### " + announcement.getTitile() + "\n" + emptySuffix; +// log.info("钉钉推送参数, markdown: {}", markdown); +// ActionCardMessage actionCard = new ActionCardMessage(markdown); +// actionCard.setTitle(announcement.getTitile()); +// actionCard.setSingle_title("详情"); +// String baseUrl = null; +// //优先通过请求获取basepath,获取不到读取 jeecg.domainUrl.pc +// try { +// baseUrl = RestUtil.getBaseUrl(); +// } catch (Exception e) { +// log.warn(e.getMessage()); +// baseUrl = jeecgBaseConfig.getDomainUrl().getPc(); +// //e.printStackTrace(); +// } +// +// log.info("获取钉钉打开网页地址,参数 ddMobileUrl: {}", ddMobileUrl); +// String ddSingleUrl = null; +// if (oConvertUtils.isNotEmpty(ddMobileUrl)) { +// ddSingleUrl = ddMobileUrl; +// } else { +// ddSingleUrl = baseUrl + "/sys/annountCement/show/" + announcement.getId(); +// } +// actionCard.setSingle_url(ddSingleUrl); +// log.info("获取钉钉打开网页地址,最终地址 ddSingleUrl: {}", ddSingleUrl); +// +// Message actionCardMessage = new Message<>(agentId, actionCard); +// if (CommonConstant.MSG_TYPE_ALL.equals(announcement.getMsgType())) { +// actionCardMessage.setTo_all_user(true); +// return JdtMessageAPI.sendActionCardMessage(actionCardMessage, accessToken); +// } else { +// // 将userId转为username +// String[] userIds = null; +// String userId = announcement.getUserIds(); +// if (oConvertUtils.isNotEmpty(userId)) { +// userIds = userId.substring(0, (userId.length() - 1)).split(","); +// } else { +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId()); +// SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper); +// userIds = new String[]{sysAnnouncementSend.getUserId()}; +// } +// +// if (userIds != null) { +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.in(SysUser::getId, userIds); +// List userList = userMapper.selectList(queryWrapper); +// String[] usernameList = userList.stream().map(SysUser::getUsername).toArray(String[]::new); +// +// // 通过第三方账号表查询出第三方userId +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE); +// List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(usernameList, THIRD_TYPE, tenantId); +// List dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); +// actionCardMessage.setUserid_list(dtUserIds); +// return JdtMessageAPI.sendActionCardMessage(actionCardMessage, accessToken); +// } +// } +// return null; +// } +// +// /** +// * OAuth2登录,成功返回登录的SysUser,失败返回null +// */ +// public SysUser oauth2Login(String authCode, Integer tenantId) { +// this.tenantIzExist(tenantId); +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// SysThirdAppConfig dtConfig = configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// // 1. 根据免登授权码获取用户 AccessToken +// String userAccessToken = JdtOauth2API.getUserAccessToken(dtConfig.getClientId(), dtConfig.getClientSecret(), authCode); +// if (userAccessToken == null) { +// log.error("oauth2Login userAccessToken is null"); +// throw new JeecgBootException("请查看应用key和应用秘钥是否正确,组织ID是否匹配"); +// } +// // 2. 根据用户 AccessToken 获取当前用户的基本信息(不包括userId) +// ContactUser contactUser = JdtOauth2API.getContactUsers("me", userAccessToken); +// if (contactUser == null) { +// log.error("oauth2Login contactUser is null"); +// throw new JeecgBootException("获取钉钉用户信息失败"); +// } +// String unionId = contactUser.getUnionId(); +// // 3. 根据获取到的 unionId 换取用户 userId +// String accessToken = this.getTenantAccessToken(dtConfig); +// if (accessToken == null) { +// log.error("oauth2Login accessToken is null"); +// throw new JeecgBootException("请查看应用key和应用秘钥是否正确,组织ID是否匹配"); +// } +// Response getUserIdRes = JdtUserAPI.getUseridByUnionid(unionId, accessToken); +// if (!getUserIdRes.isSuccess()) { +// log.error("oauth2Login getUseridByUnionid failed: " + JSON.toJSONString(getUserIdRes)); +// throw new JeecgBootException("获取钉钉用户信息失败"); +// } +// String appUserId = getUserIdRes.getResult(); +// log.info("appUserId: " + appUserId); +// if (appUserId != null) { +// // 判断第三方用户表有没有这个人 +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); +// queryWrapper.eq(SysThirdAccount::getTenantId, tenantId); +// //update-begin---author:wangshuai---date:2023-12-04---for: auth登录需要联查一下--- +// queryWrapper.and((wrapper) -> wrapper.eq(SysThirdAccount::getThirdUserUuid, appUserId).or().eq(SysThirdAccount::getThirdUserId, appUserId)); +// //update-end---author:wangshuai---date:2023-12-04---for: auth登录需要联查一下--- +// SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper); +// if (thirdAccount != null) { +// return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken, tenantId); +// } else { +// // 直接创建新账号 +// User appUser = JdtUserAPI.getUserById(appUserId, accessToken).getResult(); +// //update-begin---author:wangshuai ---date:20230328 for:[QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------ +// //应该存uuid +// ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUnionid(), appUser.getName(), appUser.getAvatar()); +// //update-end---author:wangshuai ---date:20230328 for:[QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------ +// thirdAccount = sysThirdAccountService.saveThirdUser(tlm, tenantId); +// return this.getSysUserByThird(thirdAccount, appUser, null, null, tenantId); +// } +// } +// return null; +// } +// +// /** +// * 根据第三方账号获取本地账号,如果不存在就创建 +// * +// * @param thirdAccount +// * @param appUser +// * @param appUserId +// * @param accessToken +// * @param tenantId +// * @return +// */ +// private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken, Integer tenantId) { +// String sysUserId = thirdAccount.getSysUserId(); +// if (oConvertUtils.isNotEmpty(sysUserId)) { +// return userMapper.selectById(sysUserId); +// } else { +// // 如果没有 sysUserId ,说明没有绑定账号,获取到手机号之后进行绑定 +// if (appUser == null) { +// appUser = JdtUserAPI.getUserById(appUserId, accessToken).getResult(); +// } +// // 判断系统里是否有这个手机号的用户 +// SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile()); +// if (sysUser != null) { +// thirdAccount.setAvatar(appUser.getAvatar()); +// thirdAccount.setRealname(appUser.getName()); +// thirdAccount.setThirdUserId(appUser.getUserid()); +// //update-begin---author:wangshuai ---date:20230328 for:[QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------ +// thirdAccount.setThirdUserUuid(appUser.getUnionid()); +// //update-end---author:wangshuai ---date:20230328 for:[QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------ +// thirdAccount.setSysUserId(sysUser.getId()); +// sysThirdAccountService.updateById(thirdAccount); +// return sysUser; +// } else { +// // 没有就走创建逻辑 +// return sysThirdAccountService.createUser(appUser.getMobile(), appUser.getUnionid(), tenantId); +// } +// +// } +// } +// +// //========================begin 应用低代码钉钉同步用户部门专用 ==================== +// +// /** +// * 根据类型和租户id获取钉钉配置 +// * +// * @return +// */ +// private SysThirdAppConfig getDingThirdAppConfig() { +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// this.tenantIzExist(tenantId); +// return configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); +// } +// +// /** +// * 获取钉钉accessToken +// * +// * @param config +// * @return +// */ +// private String getTenantAccessToken(SysThirdAppConfig config) { +// if (null == config) { +// return null; +// } +// AccessToken accessToken = JdtBaseAPI.getAccessToken(config.getClientId(), config.getClientSecret()); +// if (accessToken != null) { +// return accessToken.getAccessToken(); +// } +// log.warn("获取AccessToken失败"); +// return null; +// } +// +// /** +// * 添加或保存用户租户 +// * +// * @param userId +// * @param isUpdate 是否是新增 +// */ +// private void createUserTenant(String userId, Boolean isUpdate) { +// if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// //判断当前用户是否已在该租户下面 +// Integer count = userTenantMapper.userTenantIzExist(userId, tenantId); +// //count 为0 新增租户用户,否则不用新增 +// if (count == 0) { +// SysUserTenant userTenant = new SysUserTenant(); +// userTenant.setTenantId(tenantId); +// userTenant.setUserId(userId); +// userTenant.setStatus(isUpdate ? CommonConstant.USER_TENANT_UNDER_REVIEW : CommonConstant.USER_TENANT_NORMAL); +// userTenantMapper.insert(userTenant); +// } +// } +// } +// +// /** +// * 同步用户和部门 +// * +// * @return +// */ +// public SyncInfoVo syncThirdAppDepartmentUserToLocal() { // SyncInfoVo syncInfo = new SyncInfoVo(); // String accessToken = this.getAccessToken(); // if (accessToken == null) { @@ -222,1039 +1159,102 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { // List departments = JdtDepartmentAPI.listAll(accessToken); // String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest()); // List departmentTreeList = JdtDepartmentTreeVo.listToTree(departments); +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); // // 递归同步部门 -// this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, accessToken,false); +// this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, accessToken, true, tenantId); // return syncInfo; // } - - public void syncDepartmentToLocalRecursion(List departmentTreeList, String sysParentId, String username, SyncInfoVo syncInfo, String accessToken, Boolean syncUser, Integer tenantId) { - - if (departmentTreeList != null && departmentTreeList.size() != 0) { - // 记录已经同步过的用户id,当有多个部门的情况时,只同步一次 - Set syncedUserIdSet = new HashSet<>(); - for (JdtDepartmentTreeVo departmentTree : departmentTreeList) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - // 根据 source_identifier 字段查询 - //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- - queryWrapper.and(item -> item.eq(SysDepart::getId, departmentTree.getSource_identifier()).or().eq(SysDepart::getDingIdentifier, departmentTree.getDept_id())); - //update-end---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- - SysDepart sysDepart = sysDepartService.getOne(queryWrapper); - if (sysDepart != null) { - // 执行更新操作 - SysDepart updateSysDepart = this.dtDepartmentToSysDepart(departmentTree, sysDepart); - if (sysParentId != null) { - updateSysDepart.setParentId(sysParentId); - //更新父级部门不是叶子结点 - sysDepartService.updateIzLeaf(sysParentId, CommonConstant.NOT_LEAF); - } - try { - sysDepartService.updateDepartDataById(updateSysDepart, username); - String str = String.format("部门 %s 更新成功!", updateSysDepart.getDepartName()); - syncInfo.addSuccessInfo(str); - } catch (Exception e) { - this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); - } - if (departmentTree.hasChildren()) { - // 紧接着同步子级 - this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), updateSysDepart.getId(), username, syncInfo, accessToken, syncUser, tenantId); - } - //判断是否需要同步用户 - if (syncUser) { - this.addDepartUser(updateSysDepart.getId(), departmentTree.getDept_id(), accessToken, syncInfo, syncedUserIdSet, tenantId); - } - } else { - // 执行新增操作 - SysDepart newSysDepart = this.dtDepartmentToSysDepart(departmentTree, null); - if (sysParentId != null) { - newSysDepart.setParentId(sysParentId); - // 2 = 组织机构 - newSysDepart.setOrgCategory("2"); - } else { - // 1 = 公司 - newSysDepart.setOrgCategory("1"); - } - try { - if (oConvertUtils.isEmpty(departmentTree.getParent_id())) { - newSysDepart.setDingIdentifier(departmentTree.getDept_id().toString()); - } - newSysDepart.setTenantId(tenantId); - sysDepartService.saveDepartData(newSysDepart, username); - // 更新钉钉 source_identifier - Department updateDtDepart = new Department(); - updateDtDepart.setDept_id(departmentTree.getDept_id()); - updateDtDepart.setSource_identifier(newSysDepart.getId()); - //为空说明是最顶级部门,最顶级部门不允许修改操作 - if (oConvertUtils.isNotEmpty(newSysDepart.getParentId())) { - Response response = JdtDepartmentAPI.update(updateDtDepart, accessToken); - if (!response.isSuccess()) { - throw new RuntimeException(response.getErrmsg()); - } - } - String str = String.format("部门 %s 创建成功!", newSysDepart.getDepartName()); - syncInfo.addSuccessInfo(str); - //判断是否需要同步用户 - if (syncUser) { - this.addDepartUser(newSysDepart.getId(), departmentTree.getDept_id(), accessToken, syncInfo, syncedUserIdSet, tenantId); - } - } catch (Exception e) { - this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); - } - // 紧接着同步子级 - if (departmentTree.hasChildren()) { - this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), newSysDepart.getId(), username, syncInfo, accessToken, syncUser, tenantId); - } - } - } - } - } - - private boolean syncDepartCollectErrInfo(Exception e, Department department, SyncInfoVo syncInfo) { - String msg; - if (e instanceof DuplicateKeyException) { - msg = e.getCause().getMessage(); - } else { - msg = e.getMessage(); - } - String str = String.format("部门 %s(%s) 同步失败!错误信息:%s", department.getName(), department.getDept_id(), msg); - syncInfo.addFailInfo(str); - return false; - } - - /** - * 【同步部门】收集同步过程中的错误信息 - */ - private boolean syncDepartCollectErrInfo(Response response, SysDepartTreeModel depart, SyncInfoVo syncInfo) { - if (!response.isSuccess()) { - String str = String.format("部门 %s(%s) 同步失败!错误码:%s——%s", depart.getDepartName(), depart.getOrgCode(), response.getErrcode(), response.getErrmsg()); - syncInfo.addFailInfo(str); - return false; - } else { - String str = String.format("部门户 %s(%s) 同步成功!", depart.getDepartName(), depart.getOrgCode()); - syncInfo.addSuccessInfo(str); - return true; - } - } - - @Override - public SyncInfoVo syncLocalUserToThirdApp(String ids) { - SyncInfoVo syncInfo = new SyncInfoVo(); - String accessToken = this.getAccessToken(); - if (accessToken == null) { - syncInfo.addFailInfo("accessToken获取失败!"); - return syncInfo; - } - List sysUsers; - if (StringUtils.isNotBlank(ids)) { - String[] idList = ids.split(","); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysUser::getId, (Object[]) idList); - // 获取本地指定用户 - sysUsers = userMapper.selectList(queryWrapper); - } else { - // 获取本地所有用户 - sysUsers = userMapper.selectList(Wrappers.emptyWrapper()); - } - // 查询钉钉所有的部门,用于同步用户和部门的关系 - List allDepartment = JdtDepartmentAPI.listAll(accessToken); - - for (SysUser sysUser : sysUsers) { - // 外部模拟登陆临时账号,不同步 - if ("_reserve_user_external".equals(sysUser.getUsername())) { - continue; - } - // 钉钉用户信息,不为null代表已同步过 - Response dtUserInfo; - /* - * 判断是否同步过的逻辑: - * 1. 查询 sys_third_account(第三方账号表)是否有数据,如果有代表已同步 - * 2. 本地表里没有,就先用手机号判断,不通过再用username(用户账号)判断。 - */ - SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneBySysUserId(sysUser.getId(), THIRD_TYPE); - if (sysThirdAccount != null && oConvertUtils.isNotEmpty(sysThirdAccount.getThirdUserId())) { - // sys_third_account 表匹配成功,通过第三方userId查询出第三方userInfo - dtUserInfo = JdtUserAPI.getUserById(sysThirdAccount.getThirdUserId(), accessToken); - } else { - // 手机号匹配 - Response thirdUserId = JdtUserAPI.getUseridByMobile(sysUser.getPhone(), accessToken); - // 手机号匹配成功 - if (thirdUserId.isSuccess() && oConvertUtils.isNotEmpty(thirdUserId.getResult())) { - // 通过查询到的userId查询用户详情 - dtUserInfo = JdtUserAPI.getUserById(thirdUserId.getResult(), accessToken); - } else { - // 手机号匹配失败,尝试使用username匹配 - dtUserInfo = JdtUserAPI.getUserById(sysUser.getUsername(), accessToken); - } - } - String dtUserId; - // api 接口是否执行成功 - boolean apiSuccess; - // 已同步就更新,否则就创建 - if (dtUserInfo != null && dtUserInfo.isSuccess() && dtUserInfo.getResult() != null) { - User dtUser = dtUserInfo.getResult(); - dtUserId = dtUser.getUserid(); - User updateQwUser = this.sysUserToDtUser(sysUser, dtUser, allDepartment); - Response updateRes = JdtUserAPI.update(updateQwUser, accessToken); - // 收集成功/失败信息 - apiSuccess = this.syncUserCollectErrInfo(updateRes, sysUser, syncInfo); - } else { - User newQwUser = this.sysUserToDtUser(sysUser, allDepartment); - Response createRes = JdtUserAPI.create(newQwUser, accessToken); - dtUserId = createRes.getResult(); - // 收集成功/失败信息 - apiSuccess = this.syncUserCollectErrInfo(createRes, sysUser, syncInfo); - } - - // api 接口执行成功,并且 sys_third_account 表匹配失败,就向 sys_third_account 里插入一条数据 - boolean flag = (sysThirdAccount == null || oConvertUtils.isEmpty(sysThirdAccount.getThirdUserId())); - if (apiSuccess && flag) { - if (sysThirdAccount == null) { - sysThirdAccount = new SysThirdAccount(); - sysThirdAccount.setSysUserId(sysUser.getId()); - sysThirdAccount.setStatus(1); - sysThirdAccount.setDelFlag(0); - sysThirdAccount.setThirdType(THIRD_TYPE); - } - // 设置第三方app用户ID - sysThirdAccount.setThirdUserId(dtUserId); - sysThirdAccountService.saveOrUpdate(sysThirdAccount); - } - } - return syncInfo; - } - -// @Override -// public SyncInfoVo syncThirdAppUserToLocal() { -// SyncInfoVo syncInfo = new SyncInfoVo(); -// String accessToken = this.getAccessToken(); -// if (accessToken == null) { -// syncInfo.addFailInfo("accessToken获取失败!"); -// return syncInfo; -// } // -// // 获取本地用户 -// List sysUsersList = userMapper.selectList(Wrappers.emptyWrapper()); // -// // 查询钉钉所有的部门,用于同步用户和部门的关系 -// List allDepartment = JdtDepartmentAPI.listAll(accessToken); -// // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 -// List ddUserList = this.getDtAllUserByDepartment(allDepartment, accessToken); -// // 记录已经同步过的用户id,当有多个部门的情况时,只同步一次 -// Set syncedUserIdSet = new HashSet<>(); -// -// for (User dtUserInfo : ddUserList) { -// if (syncedUserIdSet.contains(dtUserInfo.getUserid())) { +// /** +// * 添加用户及用户部门关系 +// * +// * @param departId 部门id +// * @param dingDepartId 钉钉部门id +// * @param accessToken +// * @param syncInfo +// * @param syncedUserIdSet +// */ +// private void addDepartUser(String departId, Integer dingDepartId, String accessToken, SyncInfoVo syncInfo, Set syncedUserIdSet, Integer tenantId) { +// List userList = new ArrayList<>(); +// getUserListByDeptIdRecursion(dingDepartId, 0, userList, accessToken); +// for (User user : userList) { +// if (syncedUserIdSet.contains(user.getUserid())) { +// //需要同步用户部门 +// this.syncAddOrUpdateUserDepart(user.getUserid(), departId); // continue; // } -// syncedUserIdSet.add(dtUserInfo.getUserid()); -// SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(dtUserInfo.getUserid(), THIRD_TYPE); -// List collect = sysUsersList.stream().filter(user -> (dtUserInfo.getMobile().equals(user.getPhone()) || dtUserInfo.getUserid().equals(user.getUsername())) -// ).collect(Collectors.toList()); -// if (collect != null && collect.size() > 0) { -// SysUser sysUserTemp = collect.get(0); +// syncedUserIdSet.add(user.getUserid()); +// SysUser userByPhone = userMapper.getUserByPhone(user.getMobile()); +// SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByUuidAndThirdType(user.getUnionid(), THIRD_TYPE, tenantId, user.getUserid()); +// if (null != userByPhone) { // // 循环到此说明用户匹配成功,进行更新操作 -// SysUser updateSysUser = this.dtUserToSysUser(dtUserInfo, sysUserTemp); +// SysUser updateSysUser = this.dtUserToSysUser(user, userByPhone); // try { // userMapper.updateById(updateSysUser); // String str = String.format("用户 %s(%s) 更新成功!", updateSysUser.getRealname(), updateSysUser.getUsername()); // syncInfo.addSuccessInfo(str); // } catch (Exception e) { -// this.syncUserCollectErrInfo(e, dtUserInfo, syncInfo); +// this.syncUserCollectErrInfo(e, user, syncInfo); // } // //第三方账号关系表 -// this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), dtUserInfo.getUserid()); -// }else{ +// this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), user, tenantId); +// //创建当前租户 +// this.createUserTenant(updateSysUser.getId(), true); +// //需要同步用户部门 +// this.syncAddOrUpdateUserDepart(updateSysUser.getId(), departId); +// } else { // // 如果没有匹配到用户,则走创建逻辑 -// SysUser newSysUser = this.dtUserToSysUser(dtUserInfo); +// SysUser newSysUser = this.dtUserToSysUser(user); // try { // userMapper.insert(newSysUser); // String str = String.format("用户 %s(%s) 创建成功!", newSysUser.getRealname(), newSysUser.getUsername()); // syncInfo.addSuccessInfo(str); // } catch (Exception e) { -// this.syncUserCollectErrInfo(e, dtUserInfo, syncInfo); +// this.syncUserCollectErrInfo(e, user, syncInfo); // } // //第三方账号关系表 -// this.thirdAccountSaveOrUpdate(null, newSysUser.getId(), dtUserInfo.getUserid()); +// this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), user, tenantId); +// //创建当前租户 +// this.createUserTenant(newSysUser.getId(), false); +// //需要同步用户部门 +// this.syncAddOrUpdateUserDepart(newSysUser.getId(), departId); // } // } -// return syncInfo; // } - -// private List getDtAllUserByDepartment(List allDepartment, String accessToken) { -// // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 -// List userList = new ArrayList<>(); -// for (Department department : allDepartment) { -// this.getUserListByDeptIdRecursion(department.getDept_id(), 0, userList, accessToken); +// +// /** +// * 通过用户id和部门id新增用户部门关系表 +// * +// * @param userId +// * @param departId +// */ +// private void syncAddOrUpdateUserDepart(String userId, String departId) { +// //查询用户是否在部门里面 +// LambdaQueryWrapper query = new LambdaQueryWrapper<>(); +// query.eq(SysUserDepart::getDepId, departId); +// query.eq(SysUserDepart::getUserId, userId); +// long count = sysUserDepartService.count(query); +// if (count == 0) { +// //不存在,则新增部门用户关系 +// SysUserDepart sysUserDepart = new SysUserDepart(null, userId, departId); +// sysUserDepartService.save(sysUserDepart); // } -// return userList; // } - - /** - * 递归查询所有用户 - */ - private void getUserListByDeptIdRecursion(int deptId, int cursor, List userList, String accessToken) { - // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 - GetUserListBody getUserListBody = new GetUserListBody(deptId, cursor, 100); - Response> response = JdtUserAPI.getUserListByDeptId(getUserListBody, accessToken); - if (response.isSuccess()) { - PageResult page = response.getResult(); - userList.addAll(page.getList()); - if (page.getHas_more()) { - this.getUserListByDeptIdRecursion(deptId, page.getNext_cursor(), userList, accessToken); - } - } - } - - /** - * 保存或修改第三方登录表 - * - * @param sysThirdAccount 第三方账户表对象,为null就新增数据,否则就修改 - * @param sysUserId 本地系统用户ID - * @param user 钉钉用户 - */ - private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, User user, Integer tenantId) { - if (sysThirdAccount == null) { - sysThirdAccount = new SysThirdAccount(); - sysThirdAccount.setSysUserId(sysUserId); - sysThirdAccount.setThirdUserUuid(user.getUnionid()); - sysThirdAccount.setStatus(1); - sysThirdAccount.setTenantId(tenantId); - sysThirdAccount.setDelFlag(0); - sysThirdAccount.setThirdType(THIRD_TYPE); - } - sysThirdAccount.setThirdUserId(user.getUserid()); - if (oConvertUtils.isEmpty(sysThirdAccount.getRealname())) { - sysThirdAccount.setRealname(user.getName()); - } - sysThirdAccountService.saveOrUpdate(sysThirdAccount); - } - - /** - * 【同步用户】收集同步过程中的错误信息 - */ - private boolean syncUserCollectErrInfo(Response response, SysUser sysUser, SyncInfoVo syncInfo) { - if (!response.isSuccess()) { - String str = String.format("用户 %s(%s) 同步失败!错误码:%s——%s", sysUser.getUsername(), sysUser.getRealname(), response.getErrcode(), response.getErrmsg()); - syncInfo.addFailInfo(str); - return false; - } else { - String str = String.format("用户 %s(%s) 同步成功!", sysUser.getUsername(), sysUser.getRealname()); - syncInfo.addSuccessInfo(str); - return true; - } - } - - /** - * 【同步用户】收集同步过程中的错误信息 - */ - private boolean syncUserCollectErrInfo(Exception e, User dtUser, SyncInfoVo syncInfo) { - String msg; - if (e instanceof DuplicateKeyException) { - msg = e.getCause().getMessage(); - String emailUniq = "uniq_sys_user_email"; - if (msg.contains(emailUniq)) { - msg = "邮箱重复,请更换邮箱"; - } - String workNoUniq = "uniq_sys_user_work_no"; - if (msg.contains(workNoUniq)) { - msg = "工号重复,请更换工号"; - } - } else { - msg = e.getMessage(); - } - String str = String.format("用户 %s(%s) 同步失败!错误信息:%s", dtUser.getUserid(), dtUser.getName(), msg); - syncInfo.addFailInfo(str); - return false; - } - - - /** - * 【同步用户】将SysUser转为【钉钉】的User对象(创建新用户) - */ - private User sysUserToDtUser(SysUser sysUser, List allDepartment) { - User user = new User(); - // 通过 username 来关联 - user.setUserid(sysUser.getUsername()); - return this.sysUserToDtUser(sysUser, user, allDepartment); - } - - /** - * 【同步用户】将SysUser转为【钉钉】的User对象(更新旧用户) - */ - private User sysUserToDtUser(SysUser sysUser, User user, List allDepartment) { - user.setName(sysUser.getRealname()); - user.setMobile(sysUser.getPhone()); - user.setTelephone(sysUser.getTelephone()); - user.setJob_number(sysUser.getWorkNo()); - // 职务翻译 - //update-begin---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ - //获取用户职位名称 - List positionList = sysPositionService.getPositionList(sysUser.getId()); - if (null != positionList && positionList.size() > 0) { - String positionName = positionList.stream().map(SysPosition::getName).collect(Collectors.joining(SymbolConstant.COMMA)); - user.setTitle(positionName); - } - //update-end---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ - user.setEmail(sysUser.getEmail()); - // 查询并同步用户部门关系 - List departList = this.getUserDepart(sysUser); - if (departList != null) { - List departmentIdList = new ArrayList<>(); - for (SysDepart sysDepart : departList) { - // 企业微信的部门id - Department department = this.getDepartmentByDepartId(sysDepart.getId(), allDepartment); - if (department != null) { - departmentIdList.add(department.getDept_id()); - } - } - user.setDept_id_list(departmentIdList.toArray(new Integer[]{})); - user.setDept_order_list(null); - } - if (oConvertUtils.isEmpty(user.getDept_id_list())) { - // 没有找到匹配部门,同步到根部门下 - user.setDept_id_list(1); - user.setDept_order_list(null); - } - // --- 钉钉没有逻辑删除功能 - // sysUser.getDelFlag() - // --- 钉钉没有冻结、启用禁用功能 - // sysUser.getStatus() - return user; - } - - - /** - * 【同步用户】将【钉钉】的User对象转为SysUser(创建新用户) - */ - private SysUser dtUserToSysUser(User dtUser) { - SysUser sysUser = new SysUser(); - sysUser.setDelFlag(0); - // 通过 username 来关联 - sysUser.setUsername(dtUser.getMobile()); - // 密码默认为为手机号加门牌号,随机加盐 - String password = "", salt = oConvertUtils.randomGen(8); - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - if (tenantId > 0) { - SysTenant tenant = tenantMapper.selectById(tenantId); - password = tenant.getHouseNumber() + dtUser.getMobile(); - } else { - password = dtUser.getMobile(); - } - String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt); - sysUser.setSalt(salt); - sysUser.setPassword(passwordEncode); - // update-begin--Author:liusq Date:20210713 for:钉钉同步到本地的人员没有状态,导致同步之后无法登录 #I3ZC2L - sysUser.setStatus(1); - // update-end--Author:liusq Date:20210713 for:钉钉同步到本地的人员没有状态,导致同步之后无法登录 #I3ZC2L - return this.dtUserToSysUser(dtUser, sysUser); - } - - /** - * 【同步用户】将【钉钉】的User对象转为SysUser(更新旧用户) - */ - private SysUser dtUserToSysUser(User dtUser, SysUser oldSysUser) { - SysUser sysUser = new SysUser(); - BeanUtils.copyProperties(oldSysUser, sysUser); - sysUser.setTelephone(dtUser.getTelephone()); - //如果真实姓名为空的情况下,才会改真实姓名 - if (oConvertUtils.isEmpty(oldSysUser.getRealname())) { - sysUser.setRealname(dtUser.getName()); - } - // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 - if (oConvertUtils.isNotEmpty(dtUser.getEmail()) && !dtUser.getEmail().equals(sysUser.getEmail())) { - sysUser.setEmail(dtUser.getEmail()); - } else { - sysUser.setEmail(null); - } - // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 - if (oConvertUtils.isNotEmpty(dtUser.getMobile()) && !dtUser.getMobile().equals(sysUser.getPhone())) { - sysUser.setPhone(dtUser.getMobile()); - } else { - sysUser.setPhone(null); - } - // 设置工号,如果工号为空,则使用username - if (oConvertUtils.isEmpty(dtUser.getJob_number())) { - sysUser.setWorkNo(dtUser.getUserid()); - } else { - sysUser.setWorkNo(dtUser.getJob_number()); - } - // --- 钉钉没有逻辑删除功能 - // sysUser.getDelFlag() - // --- 钉钉没有冻结、启用禁用功能 - // sysUser.getStatus() - return sysUser; - } - - - /** - * 查询用户和部门的关系 - */ - private List getUserDepart(SysUser sysUser) { - // 根据用户部门关系表查询出用户的部门 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysUserDepart::getUserId, sysUser.getId()); - List sysUserDepartList = sysUserDepartService.list(queryWrapper); - if (sysUserDepartList.size() == 0) { - return null; - } - // 根据用户部门 - LambdaQueryWrapper departQueryWrapper = new LambdaQueryWrapper<>(); - List departIdList = sysUserDepartList.stream().map(SysUserDepart::getDepId).collect(Collectors.toList()); - departQueryWrapper.in(SysDepart::getId, departIdList); - List departList = sysDepartService.list(departQueryWrapper); - return departList.size() == 0 ? null : departList; - } - - /** - * 根据sysDepartId查询钉钉的部门 - */ - private Department getDepartmentByDepartId(String departId, List allDepartment) { - for (Department department : allDepartment) { - if (departId.equals(department.getSource_identifier())) { - return department; - } - } - return null; - } - - - /** - * 【同步部门】将SysDepartTreeModel转为【钉钉】的Department对象(创建新部门) - */ - private Department sysDepartToDtDepartment(SysDepartTreeModel departTree, Integer parentId) { - Department department = new Department(); - department.setSource_identifier(departTree.getId()); - return this.sysDepartToDtDepartment(departTree, department, parentId); - } - - /** - * 【同步部门】将SysDepartTreeModel转为【钉钉】的Department对象 - */ - private Department sysDepartToDtDepartment(SysDepartTreeModel departTree, Department department, Integer parentId) { - department.setName(departTree.getDepartName()); - department.setParent_id(parentId); - department.setOrder(departTree.getDepartOrder()); - return department; - } - - - /** - * 【同步部门】将【钉钉】的Department对象转为SysDepartTreeModel - */ - private SysDepart dtDepartmentToSysDepart(Department department, SysDepart departTree) { - SysDepart sysDepart = new SysDepart(); - if (departTree != null) { - BeanUtils.copyProperties(departTree, sysDepart); - } - sysDepart.setDepartName(department.getName()); - sysDepart.setDepartOrder(department.getOrder()); - return sysDepart; - } - - @Override - public int removeThirdAppUser(List userIdList) { - // 判断启用状态 - SysThirdAppConfig appConfig = getDingThirdAppConfig(); - if (null == appConfig) { - return -1; - } - int count = 0; - if (userIdList != null && userIdList.size() > 0) { - //update-begin---author:wangshuai ---date:20230209 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - String accessToken = this.getTenantAccessToken(appConfig); - //update-end---author:wangshuai ---date:20230209 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - if (accessToken == null) { - return count; - } - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); - queryWrapper.in(SysThirdAccount::getSysUserId, userIdList); - // 根据userId,获取第三方用户的id - List thirdAccountList = sysThirdAccountService.list(queryWrapper); - List thirdUserIdList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); - - for (String thirdUserId : thirdUserIdList) { - if (oConvertUtils.isNotEmpty(thirdUserId)) { - // 没有批量删除的接口 - Response response = JdtUserAPI.delete(thirdUserId, accessToken); - if (response.getErrcode() == 0) { - count++; - } - } - } - } - return count; - - } - - @Override - public boolean sendMessage(MessageDTO message) { - return this.sendMessage(message, false); - } - - /** - * 发送消息 - * - * @param message - * @param verifyConfig - * @return - */ - @Override - public boolean sendMessage(MessageDTO message, boolean verifyConfig) { - Response response; - if (message.isMarkdown()) { - response = this.sendMarkdownResponse(message, verifyConfig); - } else { - response = this.sendMessageResponse(message, verifyConfig); - } - if (response != null) { - return response.isSuccess(); - } - return false; - } - - /** - * 发送Markdown消息 - * - * @param message - * @param verifyConfig - * @return - */ - public Response sendMarkdownResponse(MessageDTO message, boolean verifyConfig) { - SysThirdAppConfig config = this.getDingThirdAppConfig(); - if (verifyConfig && null == config) { - return null; - } - String accessToken = this.getAccessToken(); - if (accessToken == null) { - return null; - } - // 封装钉钉消息 - String title = message.getTitle(); - String content = message.getContent(); - String agentId = config.getAgentId(); - Message mdMessage = new Message<>(agentId, new MarkdownMessage(title, content)); - if (message.getToAll()) { - mdMessage.setTo_all_user(true); - } else { - String[] toUsers = message.getToUser().split(","); - // 通过第三方账号表查询出第三方userId - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE); - List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, THIRD_TYPE, tenantId); - List dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); - mdMessage.setUserid_list(dtUserIds); - } - return JdtMessageAPI.sendMarkdownMessage(mdMessage, accessToken); - } - - public Response sendMessageResponse(MessageDTO message, boolean verifyConfig) { - SysThirdAppConfig config = this.getDingThirdAppConfig(); - if (verifyConfig && null == config) { - return null; - } - String accessToken = this.getAccessToken(); - if (accessToken == null) { - return null; - } - // 封装钉钉消息 - String content = message.getContent(); - String agentId = config.getAgentId(); - Message textMessage = new Message<>(agentId, new TextMessage(content)); - if (message.getToAll()) { - textMessage.setTo_all_user(true); - } else { - String[] toUsers = message.getToUser().split(","); - // 通过第三方账号表查询出第三方userId - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE); - List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, THIRD_TYPE, tenantId); - List dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); - textMessage.setUserid_list(dtUserIds); - } - return JdtMessageAPI.sendTextMessage(textMessage, accessToken); - } - - public boolean recallMessage(String msgTaskId) { - Response response = this.recallMessageResponse(msgTaskId); - if (response == null) { - return false; - } - return response.isSuccess(); - } - - /** - * 撤回消息 - * - * @param msgTaskId - * @return - */ - public Response recallMessageResponse(String msgTaskId) { - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - SysThirdAppConfig config = this.getDingThirdAppConfig(); - String accessToken = this.getTenantAccessToken(config); - if (accessToken == null) { - return null; - } - String agentId = config.getAgentId(); - return JdtMessageAPI.recallMessage(agentId, msgTaskId, accessToken); - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - } - - /** - * 发送卡片消息(SysAnnouncement定制) - * - * @param announcement - * @param ddMobileUrl 钉钉打开网页地址 - * @param verifyConfig 是否验证配置(未启用的APP会拒绝发送) - * @return - */ - public Response sendActionCardMessage(SysAnnouncement announcement, String ddMobileUrl, boolean verifyConfig) { - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - SysThirdAppConfig config = this.getDingThirdAppConfig(); - if (verifyConfig && null == config) { - return null; - } - String accessToken = this.getTenantAccessToken(config); - if (accessToken == null) { - return null; - } - String agentId = config.getAgentId(); - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - String emptySuffix = null; - if (oConvertUtils.isNotEmpty(announcement.getMsgAbstract())) { - String msgAbstract = announcement.getMsgAbstract().trim(); - log.info("获取钉钉通知参数,msgAbstract: {}", msgAbstract); - if (msgAbstract.startsWith("{") && msgAbstract.endsWith("}")) { - //如果摘要存的是业务扩展参数json,则取公告内容 - emptySuffix = announcement.getMsgContent(); - } else { - //如果摘要不为空且是文本格式,则使用摘要 - emptySuffix = msgAbstract; - } - } else { - emptySuffix = "空"; - } - - String markdown = "### " + announcement.getTitile() + "\n" + emptySuffix; - log.info("钉钉推送参数, markdown: {}", markdown); - ActionCardMessage actionCard = new ActionCardMessage(markdown); - actionCard.setTitle(announcement.getTitile()); - actionCard.setSingle_title("详情"); - String baseUrl = null; - //优先通过请求获取basepath,获取不到读取 jeecg.domainUrl.pc - try { - baseUrl = RestUtil.getBaseUrl(); - } catch (Exception e) { - log.warn(e.getMessage()); - baseUrl = jeecgBaseConfig.getDomainUrl().getPc(); - //e.printStackTrace(); - } - - log.info("获取钉钉打开网页地址,参数 ddMobileUrl: {}", ddMobileUrl); - String ddSingleUrl = null; - if (oConvertUtils.isNotEmpty(ddMobileUrl)) { - ddSingleUrl = ddMobileUrl; - } else { - ddSingleUrl = baseUrl + "/sys/annountCement/show/" + announcement.getId(); - } - actionCard.setSingle_url(ddSingleUrl); - log.info("获取钉钉打开网页地址,最终地址 ddSingleUrl: {}", ddSingleUrl); - - Message actionCardMessage = new Message<>(agentId, actionCard); - if (CommonConstant.MSG_TYPE_ALL.equals(announcement.getMsgType())) { - actionCardMessage.setTo_all_user(true); - return JdtMessageAPI.sendActionCardMessage(actionCardMessage, accessToken); - } else { - // 将userId转为username - String[] userIds = null; - String userId = announcement.getUserIds(); - if (oConvertUtils.isNotEmpty(userId)) { - userIds = userId.substring(0, (userId.length() - 1)).split(","); - } else { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId()); - SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper); - userIds = new String[]{sysAnnouncementSend.getUserId()}; - } - - if (userIds != null) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysUser::getId, userIds); - List userList = userMapper.selectList(queryWrapper); - String[] usernameList = userList.stream().map(SysUser::getUsername).toArray(String[]::new); - - // 通过第三方账号表查询出第三方userId - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE); - List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(usernameList, THIRD_TYPE, tenantId); - List dtUserIds = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); - actionCardMessage.setUserid_list(dtUserIds); - return JdtMessageAPI.sendActionCardMessage(actionCardMessage, accessToken); - } - } - return null; - } - - /** - * OAuth2登录,成功返回登录的SysUser,失败返回null - */ - public SysUser oauth2Login(String authCode, Integer tenantId) { - this.tenantIzExist(tenantId); - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - SysThirdAppConfig dtConfig = configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - // 1. 根据免登授权码获取用户 AccessToken - String userAccessToken = JdtOauth2API.getUserAccessToken(dtConfig.getClientId(), dtConfig.getClientSecret(), authCode); - if (userAccessToken == null) { - log.error("oauth2Login userAccessToken is null"); - throw new JeecgBootException("请查看应用key和应用秘钥是否正确,组织ID是否匹配"); - } - // 2. 根据用户 AccessToken 获取当前用户的基本信息(不包括userId) - ContactUser contactUser = JdtOauth2API.getContactUsers("me", userAccessToken); - if (contactUser == null) { - log.error("oauth2Login contactUser is null"); - throw new JeecgBootException("获取钉钉用户信息失败"); - } - String unionId = contactUser.getUnionId(); - // 3. 根据获取到的 unionId 换取用户 userId - String accessToken = this.getTenantAccessToken(dtConfig); - if (accessToken == null) { - log.error("oauth2Login accessToken is null"); - throw new JeecgBootException("请查看应用key和应用秘钥是否正确,组织ID是否匹配"); - } - Response getUserIdRes = JdtUserAPI.getUseridByUnionid(unionId, accessToken); - if (!getUserIdRes.isSuccess()) { - log.error("oauth2Login getUseridByUnionid failed: " + JSON.toJSONString(getUserIdRes)); - throw new JeecgBootException("获取钉钉用户信息失败"); - } - String appUserId = getUserIdRes.getResult(); - log.info("appUserId: " + appUserId); - if (appUserId != null) { - // 判断第三方用户表有没有这个人 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); - queryWrapper.eq(SysThirdAccount::getTenantId, tenantId); - //update-begin---author:wangshuai---date:2023-12-04---for: auth登录需要联查一下--- - queryWrapper.and((wrapper) -> wrapper.eq(SysThirdAccount::getThirdUserUuid, appUserId).or().eq(SysThirdAccount::getThirdUserId, appUserId)); - //update-end---author:wangshuai---date:2023-12-04---for: auth登录需要联查一下--- - SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper); - if (thirdAccount != null) { - return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken, tenantId); - } else { - // 直接创建新账号 - User appUser = JdtUserAPI.getUserById(appUserId, accessToken).getResult(); - //update-begin---author:wangshuai ---date:20230328 for:[QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------ - //应该存uuid - ThirdLoginModel tlm = new ThirdLoginModel(THIRD_TYPE, appUser.getUnionid(), appUser.getName(), appUser.getAvatar()); - //update-end---author:wangshuai ---date:20230328 for:[QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------ - thirdAccount = sysThirdAccountService.saveThirdUser(tlm, tenantId); - return this.getSysUserByThird(thirdAccount, appUser, null, null, tenantId); - } - } - return null; - } - - /** - * 根据第三方账号获取本地账号,如果不存在就创建 - * - * @param thirdAccount - * @param appUser - * @param appUserId - * @param accessToken - * @param tenantId - * @return - */ - private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken, Integer tenantId) { - String sysUserId = thirdAccount.getSysUserId(); - if (oConvertUtils.isNotEmpty(sysUserId)) { - return userMapper.selectById(sysUserId); - } else { - // 如果没有 sysUserId ,说明没有绑定账号,获取到手机号之后进行绑定 - if (appUser == null) { - appUser = JdtUserAPI.getUserById(appUserId, accessToken).getResult(); - } - // 判断系统里是否有这个手机号的用户 - SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile()); - if (sysUser != null) { - thirdAccount.setAvatar(appUser.getAvatar()); - thirdAccount.setRealname(appUser.getName()); - thirdAccount.setThirdUserId(appUser.getUserid()); - //update-begin---author:wangshuai ---date:20230328 for:[QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------ - thirdAccount.setThirdUserUuid(appUser.getUnionid()); - //update-end---author:wangshuai ---date:20230328 for:[QQYUN-4883]钉钉auth登录同一个租户下有同一个用户id------------ - thirdAccount.setSysUserId(sysUser.getId()); - sysThirdAccountService.updateById(thirdAccount); - return sysUser; - } else { - // 没有就走创建逻辑 - return sysThirdAccountService.createUser(appUser.getMobile(), appUser.getUnionid(), tenantId); - } - - } - } - - //========================begin 应用低代码钉钉同步用户部门专用 ==================== - - /** - * 根据类型和租户id获取钉钉配置 - * - * @return - */ - private SysThirdAppConfig getDingThirdAppConfig() { - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - this.tenantIzExist(tenantId); - return configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.DD.getType()); - } - - /** - * 获取钉钉accessToken - * - * @param config - * @return - */ - private String getTenantAccessToken(SysThirdAppConfig config) { - if (null == config) { - return null; - } - AccessToken accessToken = JdtBaseAPI.getAccessToken(config.getClientId(), config.getClientSecret()); - if (accessToken != null) { - return accessToken.getAccessToken(); - } - log.warn("获取AccessToken失败"); - return null; - } - - /** - * 添加或保存用户租户 - * - * @param userId - * @param isUpdate 是否是新增 - */ - private void createUserTenant(String userId, Boolean isUpdate) { - if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - //判断当前用户是否已在该租户下面 - Integer count = userTenantMapper.userTenantIzExist(userId, tenantId); - //count 为0 新增租户用户,否则不用新增 - if (count == 0) { - SysUserTenant userTenant = new SysUserTenant(); - userTenant.setTenantId(tenantId); - userTenant.setUserId(userId); - userTenant.setStatus(isUpdate ? CommonConstant.USER_TENANT_UNDER_REVIEW : CommonConstant.USER_TENANT_NORMAL); - userTenantMapper.insert(userTenant); - } - } - } - - /** - * 同步用户和部门 - * - * @return - */ - public SyncInfoVo syncThirdAppDepartmentUserToLocal() { - SyncInfoVo syncInfo = new SyncInfoVo(); - String accessToken = this.getAccessToken(); - if (accessToken == null) { - syncInfo.addFailInfo("accessToken获取失败!"); - return syncInfo; - } - // 获取【钉钉】所有的部门 - List departments = JdtDepartmentAPI.listAll(accessToken); - String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest()); - List departmentTreeList = JdtDepartmentTreeVo.listToTree(departments); - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - // 递归同步部门 - this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, accessToken, true, tenantId); - return syncInfo; - } - - - /** - * 添加用户及用户部门关系 - * - * @param departId 部门id - * @param dingDepartId 钉钉部门id - * @param accessToken - * @param syncInfo - * @param syncedUserIdSet - */ - private void addDepartUser(String departId, Integer dingDepartId, String accessToken, SyncInfoVo syncInfo, Set syncedUserIdSet, Integer tenantId) { - List userList = new ArrayList<>(); - getUserListByDeptIdRecursion(dingDepartId, 0, userList, accessToken); - for (User user : userList) { - if (syncedUserIdSet.contains(user.getUserid())) { - //需要同步用户部门 - this.syncAddOrUpdateUserDepart(user.getUserid(), departId); - continue; - } - syncedUserIdSet.add(user.getUserid()); - SysUser userByPhone = userMapper.getUserByPhone(user.getMobile()); - SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByUuidAndThirdType(user.getUnionid(), THIRD_TYPE, tenantId, user.getUserid()); - if (null != userByPhone) { - // 循环到此说明用户匹配成功,进行更新操作 - SysUser updateSysUser = this.dtUserToSysUser(user, userByPhone); - try { - userMapper.updateById(updateSysUser); - String str = String.format("用户 %s(%s) 更新成功!", updateSysUser.getRealname(), updateSysUser.getUsername()); - syncInfo.addSuccessInfo(str); - } catch (Exception e) { - this.syncUserCollectErrInfo(e, user, syncInfo); - } - //第三方账号关系表 - this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), user, tenantId); - //创建当前租户 - this.createUserTenant(updateSysUser.getId(), true); - //需要同步用户部门 - this.syncAddOrUpdateUserDepart(updateSysUser.getId(), departId); - } else { - // 如果没有匹配到用户,则走创建逻辑 - SysUser newSysUser = this.dtUserToSysUser(user); - try { - userMapper.insert(newSysUser); - String str = String.format("用户 %s(%s) 创建成功!", newSysUser.getRealname(), newSysUser.getUsername()); - syncInfo.addSuccessInfo(str); - } catch (Exception e) { - this.syncUserCollectErrInfo(e, user, syncInfo); - } - //第三方账号关系表 - this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), user, tenantId); - //创建当前租户 - this.createUserTenant(newSysUser.getId(), false); - //需要同步用户部门 - this.syncAddOrUpdateUserDepart(newSysUser.getId(), departId); - } - } - } - - /** - * 通过用户id和部门id新增用户部门关系表 - * - * @param userId - * @param departId - */ - private void syncAddOrUpdateUserDepart(String userId, String departId) { - //查询用户是否在部门里面 - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(SysUserDepart::getDepId, departId); - query.eq(SysUserDepart::getUserId, userId); - long count = sysUserDepartService.count(query); - if (count == 0) { - //不存在,则新增部门用户关系 - SysUserDepart sysUserDepart = new SysUserDepart(null, userId, departId); - sysUserDepartService.save(sysUserDepart); - } - } - - //========================end 应用低代码钉钉同步用户部门专用 ==================== - - /** - * 验证租户是否存在 - * - * @param tenantId - */ - public void tenantIzExist(Integer tenantId) { - if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { - Long count = tenantMapper.tenantIzExist(tenantId); - if (ObjectUtil.isEmpty(count) || 0 == count) { - throw new JeecgBootException("租户ID:" + tenantId + "无效,平台中不存在!"); - } - } - } -} \ No newline at end of file +// +// //========================end 应用低代码钉钉同步用户部门专用 ==================== +// +// /** +// * 验证租户是否存在 +// * +// * @param tenantId +// */ +// public void tenantIzExist(Integer tenantId) { +// if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { +// Long count = tenantMapper.tenantIzExist(tenantId); +// if (ObjectUtil.isEmpty(count) || 0 == count) { +// throw new JeecgBootException("租户ID:" + tenantId + "无效,平台中不存在!"); +// } +// } +// } +//} \ No newline at end of file diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java index 0fc5901..4990147 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppWechatEnterpriseServiceImpl.java @@ -1,420 +1,342 @@ -package org.jeecg.modules.system.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.jeecg.qywx.api.base.JwAccessTokenAPI; -import com.jeecg.qywx.api.core.common.AccessToken; -import com.jeecg.qywx.api.department.JwDepartmentAPI; -import com.jeecg.qywx.api.department.vo.DepartMsgResponse; -import com.jeecg.qywx.api.department.vo.Department; -import com.jeecg.qywx.api.message.JwMessageAPI; -import com.jeecg.qywx.api.message.vo.*; -import com.jeecg.qywx.api.user.JwUserAPI; -import com.jeecg.qywx.api.user.vo.User; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang.StringUtils; -import org.apache.http.HttpEntity; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.util.EntityUtils; -import org.jeecg.common.api.dto.message.MessageDTO; -import org.jeecg.common.config.TenantContext; -import org.jeecg.common.constant.CommonConstant; -import org.jeecg.common.constant.SymbolConstant; -import org.jeecg.common.constant.enums.MessageTypeEnum; -import org.jeecg.common.exception.JeecgBootException; -import org.jeecg.common.system.util.JwtUtil; -import org.jeecg.common.util.PasswordUtil; -import org.jeecg.common.util.RestUtil; -import org.jeecg.common.util.SpringContextUtils; -import org.jeecg.common.util.oConvertUtils; -import org.jeecg.config.JeecgBaseConfig; -import org.jeecg.config.mybatis.MybatisPlusSaasConfig; -import org.jeecg.modules.system.entity.*; -import org.jeecg.modules.system.mapper.*; -import org.jeecg.modules.system.model.SysDepartTreeModel; -import org.jeecg.modules.system.service.*; -import org.jeecg.modules.system.vo.thirdapp.JwDepartmentTreeVo; -import org.jeecg.modules.system.vo.thirdapp.JwSysUserDepartVo; -import org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo; -import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DuplicateKeyException; -import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; - -/** - * 第三方App对接:企业微信实现类 - * - * @author: jeecg-boot - */ -@Slf4j -@Service -public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { - - @Autowired - JeecgBaseConfig jeecgBaseConfig; - @Autowired - private ISysDepartService sysDepartService; - @Autowired - private SysUserMapper userMapper; - @Autowired - private ISysThirdAccountService sysThirdAccountService; - @Autowired - private ISysUserDepartService sysUserDepartService; - @Autowired - private ISysPositionService sysPositionService; - @Autowired - private SysAnnouncementSendMapper sysAnnouncementSendMapper; - @Autowired - private SysThirdAppConfigMapper configMapper; - @Autowired - private SysTenantMapper sysTenantMapper; - @Autowired - private SysUserTenantMapper sysUserTenantMapper; - @Autowired - private SysThirdAccountMapper sysThirdAccountMapper; - @Autowired - private SysTenantMapper tenantMapper; - - - /** - * errcode - */ - private static final String ERR_CODE = "errcode"; - - /** - * 第三方APP类型,当前固定为 wechat_enterprise - */ - public final String THIRD_TYPE = "wechat_enterprise"; - - @Override - public String getAccessToken() { - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - SysThirdAppConfig config = this.getWeChatThirdAppConfig(); - String corpId = config.getClientId(); - String secret = config.getClientSecret(); - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - AccessToken accessToken = JwAccessTokenAPI.getAccessToken(corpId, secret); - if (accessToken != null) { - return accessToken.getAccesstoken(); - } - log.warn("获取AccessToken失败"); - return null; - } - - /** - * 获取APPToken,新版企业微信的秘钥是分开的 - */ - public String getAppAccessToken(SysThirdAppConfig config) { - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - String corpId = config.getClientId(); - String secret = config.getAgentAppSecret(); - // 如果没有配置APP秘钥,就说明是老企业,可以通用秘钥 - if (oConvertUtils.isEmpty(secret)) { - secret = config.getClientSecret(); - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - } - - AccessToken accessToken = JwAccessTokenAPI.getAccessToken(corpId, secret); - if (accessToken != null) { - return accessToken.getAccesstoken(); - } - log.warn("获取AccessToken失败"); - return null; - } - - @Override - public SyncInfoVo syncLocalDepartmentToThirdApp(String ids) { - SyncInfoVo syncInfo = new SyncInfoVo(); - String accessToken = this.getAccessToken(); - if (accessToken == null) { - syncInfo.addFailInfo("accessToken获取失败!"); - return syncInfo; - } - // 获取企业微信所有的部门 - List departments = JwDepartmentAPI.getAllDepartment(accessToken); - if (departments == null) { - syncInfo.addFailInfo("获取企业微信所有部门失败!"); - return syncInfo; - } - // 删除企业微信有但本地没有的部门(以本地部门数据为主)(以为企业微信不能创建同名部门,所以只能先删除) - List departmentTreeList = JwDepartmentTreeVo.listToTree(departments); - this.deleteDepartRecursion(departmentTreeList, accessToken, true); - // 获取本地所有部门树结构 - List sysDepartsTree = sysDepartService.queryTreeList(); - // -- 企业微信不能创建新的顶级部门,所以新的顶级部门的parentId就为1 - Department parent = new Department(); - parent.setId("1"); - // 递归同步部门 - departments = JwDepartmentAPI.getAllDepartment(accessToken); - this.syncDepartmentRecursion(sysDepartsTree, departments, parent, accessToken); - return syncInfo; - } - - /** - * 递归删除部门以及子部门,由于企业微信不允许删除带有成员和子部门的部门,所以需要递归删除下子部门,然后把部门成员移动端根部门下 - * - * @param children - * @param accessToken - * @param ifLocal - */ - private void deleteDepartRecursion(List children, String accessToken, boolean ifLocal) { - for (JwDepartmentTreeVo departmentTree : children) { - String depId = departmentTree.getId(); - // 过滤根部门 - if (!"1".equals(depId)) { - // 判断本地是否有该部门 - if (ifLocal) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysDepart::getQywxIdentifier, depId); - SysDepart sysDepart = sysDepartService.getOne(queryWrapper); - // 本地有该部门,不删除 - if (sysDepart != null) { - if (departmentTree.hasChildren()) { - this.deleteDepartRecursion(departmentTree.getChildren(), accessToken, true); - } - continue; - } - } - // 判断是否有成员,有就移动到根部门 - List departUserList = JwUserAPI.getUsersByDepartid(depId, "1", null, accessToken); - if (departUserList != null && departUserList.size() > 0) { - for (User user : departUserList) { - User updateUser = new User(); - updateUser.setUserid(user.getUserid()); - updateUser.setDepartment(new Integer[]{1}); - JwUserAPI.updateUser(updateUser, accessToken); - } - } - // 有子部门优先删除子部门 - if (departmentTree.hasChildren()) { - this.deleteDepartRecursion(departmentTree.getChildren(), accessToken, false); - } - // 执行删除操作 - JwDepartmentAPI.deleteDepart(depId, accessToken); - } - } - } - - /** - * 递归同步部门到第三方APP - * - * @param sysDepartsTree - * @param departments - * @param parent - * @param accessToken - */ - private void syncDepartmentRecursion(List sysDepartsTree, List departments, Department parent, String accessToken) { - if (sysDepartsTree != null && sysDepartsTree.size() != 0) { - for1: - for (SysDepartTreeModel depart : sysDepartsTree) { - for (Department department : departments) { - // id相同,代表已存在,执行修改操作 - if (department.getId().equals(depart.getQywxIdentifier())) { - this.sysDepartToQwDepartment(depart, department, parent.getId()); - JwDepartmentAPI.updateDepart(department, accessToken); - // 紧接着同步子级 - this.syncDepartmentRecursion(depart.getChildren(), departments, department, accessToken); - // 跳出外部循环 - continue for1; - } - } - // 循环到此说明是新部门,直接调接口创建 - Department newDepartment = this.sysDepartToQwDepartment(depart, parent.getId()); - DepartMsgResponse response = JwDepartmentAPI.createDepartment(newDepartment, accessToken); - // 创建成功,将返回的id绑定到本地 - if (response != null && response.getId() != null) { - SysDepart sysDepart = new SysDepart(); - sysDepart.setId(depart.getId()); - sysDepart.setQywxIdentifier(response.getId().toString()); - sysDepartService.updateById(sysDepart); - Department newParent = new Department(); - newParent.setId(response.getId().toString()); - // 紧接着同步子级 - this.syncDepartmentRecursion(depart.getChildren(), departments, newParent, accessToken); - } - // 收集错误信息 -// this.syncUserCollectErrInfo(errCode, sysUser, errInfo); - } - } - } - - public SyncInfoVo syncThirdAppDepartmentToLocal(Integer tenantId, Map map) { - SyncInfoVo syncInfo = new SyncInfoVo(); - String accessToken = this.getAccessToken(); - if (accessToken == null) { - syncInfo.addFailInfo("accessToken获取失败!"); - return syncInfo; - } - // 获取企业微信所有的部门 - List departments = JwDepartmentAPI.getAllDepartment(accessToken); - if (departments == null) { - syncInfo.addFailInfo("企业微信部门信息获取失败!"); - return syncInfo; - } - String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest()); - // 将list转为tree - List departmentTreeList = JwDepartmentTreeVo.listToTree(departments); - // 递归同步部门 - this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, tenantId, map); - return syncInfo; - } - - /** - * 递归同步部门到本地 - */ - private void syncDepartmentToLocalRecursion(List departmentTreeList, String sysParentId, String username, SyncInfoVo syncInfo, Integer tenantId, Map map) { - if (departmentTreeList != null && departmentTreeList.size() != 0) { - for (JwDepartmentTreeVo departmentTree : departmentTreeList) { - String depId = departmentTree.getId(); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - // 根据 qywxIdentifier 字段和租户id查询,租户id默认为0 - queryWrapper.eq(SysDepart::getQywxIdentifier, depId); - queryWrapper.eq(SysDepart::getTenantId, tenantId); - SysDepart sysDepart = sysDepartService.getOne(queryWrapper); - if (sysDepart != null) { - // 执行更新操作 - SysDepart updateSysDepart = this.qwDepartmentToSysDepart(departmentTree, sysDepart); - //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- - if (sysParentId != null && !"0".equals(sysParentId)) { - //update-end---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- - updateSysDepart.setParentId(sysParentId); - } - try { - sysDepartService.updateDepartDataById(updateSysDepart, username); - String str = String.format("部门 %s 更新成功!", updateSysDepart.getDepartName()); - syncInfo.addSuccessInfo(str); - map.put(depId, updateSysDepart.getId()); - } catch (Exception e) { - this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); - } - if (departmentTree.hasChildren()) { - // 紧接着同步子级 - this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), updateSysDepart.getId(), username, syncInfo, tenantId, map); - } - } else { - // 执行新增操作 - SysDepart newSysDepart = this.qwDepartmentToSysDepart(departmentTree, null); - if (sysParentId != null && !"0".equals(sysParentId)) { - newSysDepart.setParentId(sysParentId); - // 2 = 组织机构 - newSysDepart.setOrgCategory("2"); - } else { - // 1 = 公司 - newSysDepart.setOrgCategory("1"); - } - newSysDepart.setTenantId(tenantId); - try { - sysDepartService.saveDepartData(newSysDepart, username); - String str = String.format("部门 %s 创建成功!", newSysDepart.getDepartName()); - syncInfo.addSuccessInfo(str); - map.put(depId, newSysDepart.getId()); - } catch (Exception e) { - this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); - } - // 紧接着同步子级 - if (departmentTree.hasChildren()) { - this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), newSysDepart.getId(), username, syncInfo, tenantId, map); - } - } - } - } - } - - @Override - public SyncInfoVo syncLocalUserToThirdApp(String ids) { - SyncInfoVo syncInfo = new SyncInfoVo(); - String accessToken = this.getAccessToken(); - if (accessToken == null) { - syncInfo.addFailInfo("accessToken获取失败!"); - return syncInfo; - } - // 获取企业微信所有的用户 -// List qwUsers = JwUserAPI.getDetailUsersByDepartid("1", null, null, accessToken); - // 获取企业微信所有的用户(只能获取userid) - List qwUsers = JwUserAPI.getUserIdList(accessToken); - - if (qwUsers == null) { - syncInfo.addFailInfo("企业微信用户列表查询失败!"); - return syncInfo; - } - List sysUsers; - if (StringUtils.isNotBlank(ids)) { - String[] idList = ids.split(","); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysUser::getId, (Object[]) idList); - // 获取本地指定用户 - sysUsers = userMapper.selectList(queryWrapper); - } else { - // 获取本地所有用户 - sysUsers = userMapper.selectList(Wrappers.emptyWrapper()); - } - - // 循环判断新用户和需要更新的用户 - for1: - for (SysUser sysUser : sysUsers) { - // 外部模拟登陆临时账号,不同步 - if ("_reserve_user_external".equals(sysUser.getUsername())) { - continue; - } - /* - * 判断是否同步过的逻辑: - * 1. 查询 sys_third_account(第三方账号表)是否有数据,如果有代表已同步 - * 2. 本地表里没有,就先用手机号判断,不通过再用username判断。 - */ - User qwUser; - SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneBySysUserId(sysUser.getId(), THIRD_TYPE); - for (User qwUserTemp : qwUsers) { - if (sysThirdAccount == null || oConvertUtils.isEmpty(sysThirdAccount.getThirdUserId()) || !sysThirdAccount.getThirdUserId().equals(qwUserTemp.getUserid())) { - // sys_third_account 表匹配失败,尝试用手机号匹配 - // 新版企业微信调整了API,现在只能通过userid来判断是否同步过了 -// String phone = sysUser.getPhone(); -// if (!(oConvertUtils.isEmpty(phone) || phone.equals(qwUserTemp.getMobile()))) { - // 手机号匹配失败,再尝试用username匹配 - String username = sysUser.getUsername(); - if (!(oConvertUtils.isEmpty(username) || username.equals(qwUserTemp.getUserid()))) { - // username 匹配失败,直接跳到下一次循环继续 - continue; - } -// } - } - // 循环到此说明用户匹配成功,进行更新操作 - qwUser = this.sysUserToQwUser(sysUser, qwUserTemp); - int errCode = JwUserAPI.updateUser(qwUser, accessToken); - // 收集错误信息 - this.syncUserCollectErrInfo(errCode, sysUser, syncInfo); - this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(), qwUser.getName(), null); - // 更新完成,直接跳到下一次外部循环继续 - continue for1; - } - // 循环到此说明是新用户,直接调接口创建 - qwUser = this.sysUserToQwUser(sysUser); - int errCode = JwUserAPI.createUser(qwUser, accessToken); - // 收集错误信息 - boolean apiSuccess = this.syncUserCollectErrInfo(errCode, sysUser, syncInfo); - if (apiSuccess) { - this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(), qwUser.getName(), null); - } - } - return syncInfo; - } - +//package org.jeecg.modules.system.service.impl; +// +//import cn.hutool.core.util.ObjectUtil; +//import com.alibaba.fastjson.JSONArray; +//import com.alibaba.fastjson.JSONObject; +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.baomidou.mybatisplus.core.toolkit.Wrappers; +//import com.jeecg.qywx.api.base.JwAccessTokenAPI; +//import com.jeecg.qywx.api.core.common.AccessToken; +//import com.jeecg.qywx.api.department.JwDepartmentAPI; +//import com.jeecg.qywx.api.department.vo.DepartMsgResponse; +//import com.jeecg.qywx.api.department.vo.Department; +//import com.jeecg.qywx.api.message.JwMessageAPI; +//import com.jeecg.qywx.api.message.vo.*; +//import com.jeecg.qywx.api.user.JwUserAPI; +//import com.jeecg.qywx.api.user.vo.User; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.commons.lang.StringUtils; +//import org.apache.http.HttpEntity; +//import org.apache.http.client.config.RequestConfig; +//import org.apache.http.client.methods.CloseableHttpResponse; +//import org.apache.http.client.methods.HttpPost; +//import org.apache.http.entity.ContentType; +//import org.apache.http.entity.StringEntity; +//import org.apache.http.impl.client.CloseableHttpClient; +//import org.apache.http.impl.client.HttpClients; +//import org.apache.http.util.EntityUtils; +//import org.jeecg.common.api.dto.message.MessageDTO; +//import org.jeecg.common.config.TenantContext; +//import org.jeecg.common.constant.CommonConstant; +//import org.jeecg.common.constant.SymbolConstant; +//import org.jeecg.common.constant.enums.MessageTypeEnum; +//import org.jeecg.common.exception.JeecgBootException; +//import org.jeecg.common.system.util.JwtUtil; +//import org.jeecg.common.util.PasswordUtil; +//import org.jeecg.common.util.RestUtil; +//import org.jeecg.common.util.SpringContextUtils; +//import org.jeecg.common.util.oConvertUtils; +//import org.jeecg.config.JeecgBaseConfig; +//import org.jeecg.config.mybatis.MybatisPlusSaasConfig; +//import org.jeecg.modules.system.entity.*; +//import org.jeecg.modules.system.mapper.*; +//import org.jeecg.modules.system.model.SysDepartTreeModel; +//import org.jeecg.modules.system.service.*; +//import org.jeecg.modules.system.vo.thirdapp.JwDepartmentTreeVo; +//import org.jeecg.modules.system.vo.thirdapp.JwSysUserDepartVo; +//import org.jeecg.modules.system.vo.thirdapp.JwUserDepartVo; +//import org.jeecg.modules.system.vo.thirdapp.SyncInfoVo; +//import org.springframework.beans.BeanUtils; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.dao.DuplicateKeyException; +//import org.springframework.stereotype.Service; +// +//import java.io.IOException; +//import java.util.*; +//import java.util.concurrent.atomic.AtomicBoolean; +//import java.util.stream.Collectors; +// +///** +// * 第三方App对接:企业微信实现类 +// * +// * @author: jeecg-boot +// */ +//@Slf4j +//@Service +//public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { +// +// @Autowired +// JeecgBaseConfig jeecgBaseConfig; +// @Autowired +// private ISysDepartService sysDepartService; +// @Autowired +// private SysUserMapper userMapper; +// @Autowired +// private ISysThirdAccountService sysThirdAccountService; +// @Autowired +// private ISysUserDepartService sysUserDepartService; +// @Autowired +// private ISysPositionService sysPositionService; +// @Autowired +// private SysAnnouncementSendMapper sysAnnouncementSendMapper; +// @Autowired +// private SysThirdAppConfigMapper configMapper; +// @Autowired +// private SysTenantMapper sysTenantMapper; +// @Autowired +// private SysUserTenantMapper sysUserTenantMapper; +// @Autowired +// private SysThirdAccountMapper sysThirdAccountMapper; +// @Autowired +// private SysTenantMapper tenantMapper; +// +// +// /** +// * errcode +// */ +// private static final String ERR_CODE = "errcode"; +// +// /** +// * 第三方APP类型,当前固定为 wechat_enterprise +// */ +// public final String THIRD_TYPE = "wechat_enterprise"; +// // @Override -// public SyncInfoVo syncThirdAppUserToLocal() { +// public String getAccessToken() { +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// SysThirdAppConfig config = this.getWeChatThirdAppConfig(); +// String corpId = config.getClientId(); +// String secret = config.getClientSecret(); +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// AccessToken accessToken = JwAccessTokenAPI.getAccessToken(corpId, secret); +// if (accessToken != null) { +// return accessToken.getAccesstoken(); +// } +// log.warn("获取AccessToken失败"); +// return null; +// } +// +// /** +// * 获取APPToken,新版企业微信的秘钥是分开的 +// */ +// public String getAppAccessToken(SysThirdAppConfig config) { +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// String corpId = config.getClientId(); +// String secret = config.getAgentAppSecret(); +// // 如果没有配置APP秘钥,就说明是老企业,可以通用秘钥 +// if (oConvertUtils.isEmpty(secret)) { +// secret = config.getClientSecret(); +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// } +// +// AccessToken accessToken = JwAccessTokenAPI.getAccessToken(corpId, secret); +// if (accessToken != null) { +// return accessToken.getAccesstoken(); +// } +// log.warn("获取AccessToken失败"); +// return null; +// } +// +// @Override +// public SyncInfoVo syncLocalDepartmentToThirdApp(String ids) { +// SyncInfoVo syncInfo = new SyncInfoVo(); +// String accessToken = this.getAccessToken(); +// if (accessToken == null) { +// syncInfo.addFailInfo("accessToken获取失败!"); +// return syncInfo; +// } +// // 获取企业微信所有的部门 +// List departments = JwDepartmentAPI.getAllDepartment(accessToken); +// if (departments == null) { +// syncInfo.addFailInfo("获取企业微信所有部门失败!"); +// return syncInfo; +// } +// // 删除企业微信有但本地没有的部门(以本地部门数据为主)(以为企业微信不能创建同名部门,所以只能先删除) +// List departmentTreeList = JwDepartmentTreeVo.listToTree(departments); +// this.deleteDepartRecursion(departmentTreeList, accessToken, true); +// // 获取本地所有部门树结构 +// List sysDepartsTree = sysDepartService.queryTreeList(); +// // -- 企业微信不能创建新的顶级部门,所以新的顶级部门的parentId就为1 +// Department parent = new Department(); +// parent.setId("1"); +// // 递归同步部门 +// departments = JwDepartmentAPI.getAllDepartment(accessToken); +// this.syncDepartmentRecursion(sysDepartsTree, departments, parent, accessToken); +// return syncInfo; +// } +// +// /** +// * 递归删除部门以及子部门,由于企业微信不允许删除带有成员和子部门的部门,所以需要递归删除下子部门,然后把部门成员移动端根部门下 +// * +// * @param children +// * @param accessToken +// * @param ifLocal +// */ +// private void deleteDepartRecursion(List children, String accessToken, boolean ifLocal) { +// for (JwDepartmentTreeVo departmentTree : children) { +// String depId = departmentTree.getId(); +// // 过滤根部门 +// if (!"1".equals(depId)) { +// // 判断本地是否有该部门 +// if (ifLocal) { +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysDepart::getQywxIdentifier, depId); +// SysDepart sysDepart = sysDepartService.getOne(queryWrapper); +// // 本地有该部门,不删除 +// if (sysDepart != null) { +// if (departmentTree.hasChildren()) { +// this.deleteDepartRecursion(departmentTree.getChildren(), accessToken, true); +// } +// continue; +// } +// } +// // 判断是否有成员,有就移动到根部门 +// List departUserList = JwUserAPI.getUsersByDepartid(depId, "1", null, accessToken); +// if (departUserList != null && departUserList.size() > 0) { +// for (User user : departUserList) { +// User updateUser = new User(); +// updateUser.setUserid(user.getUserid()); +// updateUser.setDepartment(new Integer[]{1}); +// JwUserAPI.updateUser(updateUser, accessToken); +// } +// } +// // 有子部门优先删除子部门 +// if (departmentTree.hasChildren()) { +// this.deleteDepartRecursion(departmentTree.getChildren(), accessToken, false); +// } +// // 执行删除操作 +// JwDepartmentAPI.deleteDepart(depId, accessToken); +// } +// } +// } +// +// /** +// * 递归同步部门到第三方APP +// * +// * @param sysDepartsTree +// * @param departments +// * @param parent +// * @param accessToken +// */ +// private void syncDepartmentRecursion(List sysDepartsTree, List departments, Department parent, String accessToken) { +// if (sysDepartsTree != null && sysDepartsTree.size() != 0) { +// for1: +// for (SysDepartTreeModel depart : sysDepartsTree) { +// for (Department department : departments) { +// // id相同,代表已存在,执行修改操作 +// if (department.getId().equals(depart.getQywxIdentifier())) { +// this.sysDepartToQwDepartment(depart, department, parent.getId()); +// JwDepartmentAPI.updateDepart(department, accessToken); +// // 紧接着同步子级 +// this.syncDepartmentRecursion(depart.getChildren(), departments, department, accessToken); +// // 跳出外部循环 +// continue for1; +// } +// } +// // 循环到此说明是新部门,直接调接口创建 +// Department newDepartment = this.sysDepartToQwDepartment(depart, parent.getId()); +// DepartMsgResponse response = JwDepartmentAPI.createDepartment(newDepartment, accessToken); +// // 创建成功,将返回的id绑定到本地 +// if (response != null && response.getId() != null) { +// SysDepart sysDepart = new SysDepart(); +// sysDepart.setId(depart.getId()); +// sysDepart.setQywxIdentifier(response.getId().toString()); +// sysDepartService.updateById(sysDepart); +// Department newParent = new Department(); +// newParent.setId(response.getId().toString()); +// // 紧接着同步子级 +// this.syncDepartmentRecursion(depart.getChildren(), departments, newParent, accessToken); +// } +// // 收集错误信息 +//// this.syncUserCollectErrInfo(errCode, sysUser, errInfo); +// } +// } +// } +// +// public SyncInfoVo syncThirdAppDepartmentToLocal(Integer tenantId, Map map) { +// SyncInfoVo syncInfo = new SyncInfoVo(); +// String accessToken = this.getAccessToken(); +// if (accessToken == null) { +// syncInfo.addFailInfo("accessToken获取失败!"); +// return syncInfo; +// } +// // 获取企业微信所有的部门 +// List departments = JwDepartmentAPI.getAllDepartment(accessToken); +// if (departments == null) { +// syncInfo.addFailInfo("企业微信部门信息获取失败!"); +// return syncInfo; +// } +// String username = JwtUtil.getUserNameByToken(SpringContextUtils.getHttpServletRequest()); +// // 将list转为tree +// List departmentTreeList = JwDepartmentTreeVo.listToTree(departments); +// // 递归同步部门 +// this.syncDepartmentToLocalRecursion(departmentTreeList, null, username, syncInfo, tenantId, map); +// return syncInfo; +// } +// +// /** +// * 递归同步部门到本地 +// */ +// private void syncDepartmentToLocalRecursion(List departmentTreeList, String sysParentId, String username, SyncInfoVo syncInfo, Integer tenantId, Map map) { +// if (departmentTreeList != null && departmentTreeList.size() != 0) { +// for (JwDepartmentTreeVo departmentTree : departmentTreeList) { +// String depId = departmentTree.getId(); +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// // 根据 qywxIdentifier 字段和租户id查询,租户id默认为0 +// queryWrapper.eq(SysDepart::getQywxIdentifier, depId); +// queryWrapper.eq(SysDepart::getTenantId, tenantId); +// SysDepart sysDepart = sysDepartService.getOne(queryWrapper); +// if (sysDepart != null) { +// // 执行更新操作 +// SysDepart updateSysDepart = this.qwDepartmentToSysDepart(departmentTree, sysDepart); +// //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- +// if (sysParentId != null && !"0".equals(sysParentId)) { +// //update-end---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- +// updateSysDepart.setParentId(sysParentId); +// } +// try { +// sysDepartService.updateDepartDataById(updateSysDepart, username); +// String str = String.format("部门 %s 更新成功!", updateSysDepart.getDepartName()); +// syncInfo.addSuccessInfo(str); +// map.put(depId, updateSysDepart.getId()); +// } catch (Exception e) { +// this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); +// } +// if (departmentTree.hasChildren()) { +// // 紧接着同步子级 +// this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), updateSysDepart.getId(), username, syncInfo, tenantId, map); +// } +// } else { +// // 执行新增操作 +// SysDepart newSysDepart = this.qwDepartmentToSysDepart(departmentTree, null); +// if (sysParentId != null && !"0".equals(sysParentId)) { +// newSysDepart.setParentId(sysParentId); +// // 2 = 组织机构 +// newSysDepart.setOrgCategory("2"); +// } else { +// // 1 = 公司 +// newSysDepart.setOrgCategory("1"); +// } +// newSysDepart.setTenantId(tenantId); +// try { +// sysDepartService.saveDepartData(newSysDepart, username); +// String str = String.format("部门 %s 创建成功!", newSysDepart.getDepartName()); +// syncInfo.addSuccessInfo(str); +// map.put(depId, newSysDepart.getId()); +// } catch (Exception e) { +// this.syncDepartCollectErrInfo(e, departmentTree, syncInfo); +// } +// // 紧接着同步子级 +// if (departmentTree.hasChildren()) { +// this.syncDepartmentToLocalRecursion(departmentTree.getChildren(), newSysDepart.getId(), username, syncInfo, tenantId, map); +// } +// } +// } +// } +// } +// +// @Override +// public SyncInfoVo syncLocalUserToThirdApp(String ids) { // SyncInfoVo syncInfo = new SyncInfoVo(); // String accessToken = this.getAccessToken(); // if (accessToken == null) { @@ -422,887 +344,965 @@ public class ThirdAppWechatEnterpriseServiceImpl implements IThirdAppService { // return syncInfo; // } // // 获取企业微信所有的用户 -// List qwUsersList = JwUserAPI.getDetailUsersByDepartid("1", null, null, accessToken); -// if (qwUsersList == null) { +//// List qwUsers = JwUserAPI.getDetailUsersByDepartid("1", null, null, accessToken); +// // 获取企业微信所有的用户(只能获取userid) +// List qwUsers = JwUserAPI.getUserIdList(accessToken); +// +// if (qwUsers == null) { // syncInfo.addFailInfo("企业微信用户列表查询失败!"); // return syncInfo; // } -// //查询本地用户 -// List sysUsersList = userMapper.selectList(Wrappers.emptyWrapper()); +// List sysUsers; +// if (StringUtils.isNotBlank(ids)) { +// String[] idList = ids.split(","); +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.in(SysUser::getId, (Object[]) idList); +// // 获取本地指定用户 +// sysUsers = userMapper.selectList(queryWrapper); +// } else { +// // 获取本地所有用户 +// sysUsers = userMapper.selectList(Wrappers.emptyWrapper()); +// } +// // // 循环判断新用户和需要更新的用户 -// for (User qwUser : qwUsersList) { +// for1: +// for (SysUser sysUser : sysUsers) { +// // 外部模拟登陆临时账号,不同步 +// if ("_reserve_user_external".equals(sysUser.getUsername())) { +// continue; +// } // /* // * 判断是否同步过的逻辑: // * 1. 查询 sys_third_account(第三方账号表)是否有数据,如果有代表已同步 // * 2. 本地表里没有,就先用手机号判断,不通过再用username判断。 // */ -// SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(qwUser.getUserid(), THIRD_TYPE); -// List collect = sysUsersList.stream().filter(user -> (qwUser.getMobile().equals(user.getPhone()) || qwUser.getUserid().equals(user.getUsername())) -// ).collect(Collectors.toList()); -// -// if (collect != null && collect.size() > 0) { -// SysUser sysUserTemp = collect.get(0); +// User qwUser; +// SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneBySysUserId(sysUser.getId(), THIRD_TYPE); +// for (User qwUserTemp : qwUsers) { +// if (sysThirdAccount == null || oConvertUtils.isEmpty(sysThirdAccount.getThirdUserId()) || !sysThirdAccount.getThirdUserId().equals(qwUserTemp.getUserid())) { +// // sys_third_account 表匹配失败,尝试用手机号匹配 +// // 新版企业微信调整了API,现在只能通过userid来判断是否同步过了 +//// String phone = sysUser.getPhone(); +//// if (!(oConvertUtils.isEmpty(phone) || phone.equals(qwUserTemp.getMobile()))) { +// // 手机号匹配失败,再尝试用username匹配 +// String username = sysUser.getUsername(); +// if (!(oConvertUtils.isEmpty(username) || username.equals(qwUserTemp.getUserid()))) { +// // username 匹配失败,直接跳到下一次循环继续 +// continue; +// } +//// } +// } // // 循环到此说明用户匹配成功,进行更新操作 -// SysUser updateSysUser = this.qwUserToSysUser(qwUser, sysUserTemp); -// try { -// userMapper.updateById(updateSysUser); -// String str = String.format("用户 %s(%s) 更新成功!", updateSysUser.getRealname(), updateSysUser.getUsername()); -// syncInfo.addSuccessInfo(str); -// } catch (Exception e) { -// this.syncUserCollectErrInfo(e, qwUser, syncInfo); -// } -// -// this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), qwUser.getUserid()); +// qwUser = this.sysUserToQwUser(sysUser, qwUserTemp); +// int errCode = JwUserAPI.updateUser(qwUser, accessToken); +// // 收集错误信息 +// this.syncUserCollectErrInfo(errCode, sysUser, syncInfo); +// this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(), qwUser.getName(), null); // // 更新完成,直接跳到下一次外部循环继续 -// }else{ -// // 没匹配到用户则走新增逻辑 -// SysUser newSysUser = this.qwUserToSysUser(qwUser); -// try { -// userMapper.insert(newSysUser); -// String str = String.format("用户 %s(%s) 创建成功!", newSysUser.getRealname(), newSysUser.getUsername()); -// syncInfo.addSuccessInfo(str); -// } catch (Exception e) { -// this.syncUserCollectErrInfo(e, qwUser, syncInfo); -// } -// this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), qwUser.getUserid()); +// continue for1; +// } +// // 循环到此说明是新用户,直接调接口创建 +// qwUser = this.sysUserToQwUser(sysUser); +// int errCode = JwUserAPI.createUser(qwUser, accessToken); +// // 收集错误信息 +// boolean apiSuccess = this.syncUserCollectErrInfo(errCode, sysUser, syncInfo); +// if (apiSuccess) { +// this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUser.getId(), qwUser.getUserid(), qwUser.getName(), null); // } // } // return syncInfo; // } - - /** - * 保存或修改第三方登录表 - * - * @param sysThirdAccount 第三方账户表对象,为null就新增数据,否则就修改 - * @param sysUserId 本地系统用户ID - * @param qwUserId 企业微信用户ID - * @param wechatRealName 企业微信用户真实姓名 - */ - private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, String qwUserId, String wechatRealName, Integer tenantId) { - if (sysThirdAccount == null) { - sysThirdAccount = new SysThirdAccount(); - sysThirdAccount.setSysUserId(sysUserId); - sysThirdAccount.setStatus(1); - sysThirdAccount.setDelFlag(0); - sysThirdAccount.setThirdType(THIRD_TYPE); - if (oConvertUtils.isNotEmpty(tenantId)) { - sysThirdAccount.setTenantId(tenantId); - } - } - sysThirdAccount.setThirdUserId(qwUserId); - sysThirdAccount.setThirdUserUuid(qwUserId); - sysThirdAccount.setRealname(wechatRealName); - sysThirdAccountService.saveOrUpdate(sysThirdAccount); - } - - /** - * 【同步用户】收集同步过程中的错误信息 - */ - private boolean syncUserCollectErrInfo(int errCode, SysUser sysUser, SyncInfoVo syncInfo) { - if (errCode != 0) { - String msg = ""; - // https://open.work.weixin.qq.com/api/doc/90000/90139/90313 - switch (errCode) { - case 40003: - msg = "无效的UserID"; - break; - case 60129: - msg = "手机和邮箱不能都为空"; - break; - case 60102: - msg = "UserID已存在"; - break; - case 60103: - msg = "手机号码不合法"; - break; - case 60104: - msg = "手机号码已存在"; - break; - default: - } - String str = String.format("用户 %s(%s) 同步失败!错误码:%s——%s", sysUser.getUsername(), sysUser.getRealname(), errCode, msg); - syncInfo.addFailInfo(str); - return false; - } else { - String str = String.format("用户 %s(%s) 同步成功!", sysUser.getUsername(), sysUser.getRealname()); - syncInfo.addSuccessInfo(str); - return true; - } - } - - private boolean syncUserCollectErrInfo(Exception e, User qwUser, SyncInfoVo syncInfo) { - String msg; - if (e instanceof DuplicateKeyException) { - msg = e.getCause().getMessage(); - } else { - msg = e.getMessage(); - } - String str = String.format("用户 %s(%s) 同步失败!错误信息:%s", qwUser.getUserid(), qwUser.getName(), msg); - syncInfo.addFailInfo(str); - return false; - } - - private boolean syncDepartCollectErrInfo(Exception e, Department department, SyncInfoVo syncInfo) { - String msg; - if (e instanceof DuplicateKeyException) { - msg = e.getCause().getMessage(); - } else { - msg = e.getMessage(); - } - String str = String.format("部门 %s(%s) 同步失败!错误信息:%s", department.getName(), department.getId(), msg); - syncInfo.addFailInfo(str); - return false; - } - - /** - * 【同步用户】将SysUser转为企业微信的User对象(创建新用户) - */ - private User sysUserToQwUser(SysUser sysUser) { - User user = new User(); - // 通过 username 来关联 - user.setUserid(sysUser.getUsername()); - return this.sysUserToQwUser(sysUser, user); - } - - /** - * 【同步用户】将SysUser转为企业微信的User对象(更新旧用户) - */ - private User sysUserToQwUser(SysUser sysUser, User user) { - user.setName(sysUser.getRealname()); - user.setMobile(sysUser.getPhone()); - // 查询并同步用户部门关系 - List departList = this.getUserDepart(sysUser); - if (departList != null) { - List departmentIdList = new ArrayList<>(); - // 企业微信 1表示为上级,0表示非上级 - List isLeaderInDept = new ArrayList<>(); - // 当前用户管理的部门 - List manageDepartIdList = new ArrayList<>(); - if (oConvertUtils.isNotEmpty(sysUser.getDepartIds())) { - manageDepartIdList = Arrays.asList(sysUser.getDepartIds().split(",")); - } - for (SysDepart sysDepart : departList) { - // 企业微信的部门id - if (oConvertUtils.isNotEmpty(sysDepart.getQywxIdentifier())) { - try { - departmentIdList.add(Integer.parseInt(sysDepart.getQywxIdentifier())); - } catch (NumberFormatException ignored) { - continue; - } - // 判断用户身份,是否为上级 - if (CommonConstant.USER_IDENTITY_2.equals(sysUser.getUserIdentity())) { - // 判断当前部门是否为该用户管理的部门 - isLeaderInDept.add(manageDepartIdList.contains(sysDepart.getId()) ? 1 : 0); - } else { - isLeaderInDept.add(0); - } - } - } - user.setDepartment(departmentIdList.toArray(new Integer[]{})); - // 个数必须和参数department的个数一致,表示在所在的部门内是否为上级。1表示为上级,0表示非上级。在审批等应用里可以用来标识上级审批人 - user.setIs_leader_in_dept(isLeaderInDept.toArray(new Integer[]{})); - } - if (user.getDepartment() == null || user.getDepartment().length == 0) { - // 没有找到匹配部门,同步到根部门下 - user.setDepartment(new Integer[]{1}); - user.setIs_leader_in_dept(new Integer[]{0}); - } - // 职务翻译 - //update-begin---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ - List positionList = sysPositionService.getPositionList(sysUser.getId()); - if (null != positionList && positionList.size() > 0) { - String positionName = positionList.stream().map(SysPosition::getName).collect(Collectors.joining(SymbolConstant.COMMA)); - user.setPosition(positionName); - } - //update-end---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ - if (sysUser.getSex() != null) { - user.setGender(sysUser.getSex().toString()); - } - user.setEmail(sysUser.getEmail()); - // 启用/禁用成员(状态),规则不同,需要转换 - // 企业微信规则:1表示启用成员,0表示禁用成员 - // JEECG规则:1正常,2冻结 - if (sysUser.getStatus() != null) { - if (CommonConstant.USER_UNFREEZE.equals(sysUser.getStatus()) || CommonConstant.USER_FREEZE.equals(sysUser.getStatus())) { - user.setEnable(sysUser.getStatus() == 1 ? 1 : 0); - } else { - user.setEnable(1); - } - } - // 座机号 - user.setTelephone(sysUser.getTelephone()); - // --- 企业微信没有逻辑删除的功能 - // update-begin--Author:sunjianlei Date:20210520 for:本地逻辑删除的用户,在企业微信里禁用 ----- - if (CommonConstant.DEL_FLAG_1.equals(sysUser.getDelFlag())) { - user.setEnable(0); - } - // update-end--Author:sunjianlei Date:20210520 for:本地逻辑删除的用户,在企业微信里冻结 ----- - - return user; - } - - /** - * 查询用户和部门的关系 - */ - private List getUserDepart(SysUser sysUser) { - // 根据用户部门关系表查询出用户的部门 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysUserDepart::getUserId, sysUser.getId()); - List sysUserDepartList = sysUserDepartService.list(queryWrapper); - if (sysUserDepartList.size() == 0) { - return null; - } - // 根据用户部门 - LambdaQueryWrapper departQueryWrapper = new LambdaQueryWrapper<>(); - List departIdList = sysUserDepartList.stream().map(SysUserDepart::getDepId).collect(Collectors.toList()); - departQueryWrapper.in(SysDepart::getId, departIdList); - List departList = sysDepartService.list(departQueryWrapper); - return departList.size() == 0 ? null : departList; - } - - /** - * 【同步用户】将企业微信的User对象转为SysUser(创建新用户) - */ - private SysUser qwUserToSysUser(User user) { - SysUser sysUser = new SysUser(); - sysUser.setDelFlag(0); - sysUser.setStatus(1); - // 通过 username 来关联 - sysUser.setUsername(user.getUserid()); - // 密码默认为 “123456”,随机加盐 - String password = "123456", salt = oConvertUtils.randomGen(8); - String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt); - sysUser.setSalt(salt); - sysUser.setPassword(passwordEncode); - return this.qwUserToSysUser(user, sysUser); - } - - /** - * 【同步用户】将企业微信的User对象转为SysUser(更新旧用户) - */ - private SysUser qwUserToSysUser(User qwUser, SysUser oldSysUser) { - SysUser sysUser = new SysUser(); - BeanUtils.copyProperties(oldSysUser, sysUser); - sysUser.setRealname(qwUser.getName()); - sysUser.setPost(qwUser.getPosition()); - // 设置工号,由于企业微信没有工号的概念,所以只能用 userId 代替 - if (oConvertUtils.isEmpty(sysUser.getWorkNo())) { - sysUser.setWorkNo(qwUser.getUserid()); - } - try { - sysUser.setSex(Integer.parseInt(qwUser.getGender())); - } catch (NumberFormatException ignored) { - } - // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 - if (oConvertUtils.isNotEmpty(qwUser.getEmail()) && !qwUser.getEmail().equals(sysUser.getEmail())) { - sysUser.setEmail(qwUser.getEmail()); - } else { - sysUser.setEmail(null); - } - // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 - if (oConvertUtils.isNotEmpty(qwUser.getMobile()) && !qwUser.getMobile().equals(sysUser.getPhone())) { - sysUser.setPhone(qwUser.getMobile()); - } else { - sysUser.setPhone(null); - } - - // 启用/禁用成员(状态),规则不同,需要转换 - // 企业微信规则:1表示启用成员,0表示禁用成员 - // JEECG规则:1正常,2冻结 - if (qwUser.getEnable() != null) { - sysUser.setStatus(qwUser.getEnable() == 1 ? 1 : 2); - } - // 座机号 - sysUser.setTelephone(qwUser.getTelephone()); - - // --- 企业微信没有逻辑删除的功能 - // sysUser.setDelFlag() - return sysUser; - } - - /** - * 【同步部门】将SysDepartTreeModel转为企业微信的Department对象(创建新部门) - */ - private Department sysDepartToQwDepartment(SysDepartTreeModel departTree, String parentId) { - Department department = new Department(); - return this.sysDepartToQwDepartment(departTree, department, parentId); - } - - /** - * 【同步部门】将SysDepartTreeModel转为企业微信的Department对象 - */ - private Department sysDepartToQwDepartment(SysDepartTreeModel departTree, Department department, String parentId) { - department.setName(departTree.getDepartName()); - department.setParentid(parentId); - if (departTree.getDepartOrder() != null) { - department.setOrder(departTree.getDepartOrder().toString()); - } - return department; - } - - - /** - * 【同步部门】将企业微信的Department对象转为SysDepart - */ - private SysDepart qwDepartmentToSysDepart(Department department, SysDepart oldSysDepart) { - SysDepart sysDepart = new SysDepart(); - if (oldSysDepart != null) { - BeanUtils.copyProperties(oldSysDepart, sysDepart); - } - sysDepart.setQywxIdentifier(department.getId()); - sysDepart.setDepartName(department.getName()); - try { - sysDepart.setDepartOrder(Integer.parseInt(department.getOrder())); - } catch (NumberFormatException ignored) { - } - return sysDepart; - } - - @Override - public int removeThirdAppUser(List userIdList) { - // 判断启用状态 - SysThirdAppConfig config = this.getWeChatThirdAppConfig(); - if (null == config) { - return -1; - } - int count = 0; - if (userIdList != null && userIdList.size() > 0) { - String accessToken = this.getAccessToken(); - if (accessToken == null) { - return count; - } - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); - queryWrapper.in(SysThirdAccount::getSysUserId, userIdList); - // 根据userId,获取第三方用户的id - List thirdAccountList = sysThirdAccountService.list(queryWrapper); - List thirdUserIdList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); - - for (String thirdUserId : thirdUserIdList) { - if (oConvertUtils.isNotEmpty(thirdUserId)) { - // 没有批量删除的接口 - int err = JwUserAPI.deleteUser(thirdUserId, accessToken); - if (err == 0) { - count++; - } - } - } - } - return count; - } - - @Override - public boolean sendMessage(MessageDTO message) { - return this.sendMessage(message, false); - } - - @Override - public boolean sendMessage(MessageDTO message, boolean verifyConfig) { - JSONObject response; - if (message.isMarkdown()) { - response = this.sendMarkdownResponse(message, verifyConfig); - } else { - response = this.sendMessageResponse(message, verifyConfig); - } - if (response != null) { - return response.getIntValue("errcode") == 0; - } - return false; - } - - public JSONObject sendMessageResponse(MessageDTO message, boolean verifyConfig) { - SysThirdAppConfig config = this.getWeChatThirdAppConfig(); - if (verifyConfig && null == config) { - return null; - } - String accessToken = this.getAppAccessToken(config); - if (accessToken == null) { - return null; - } - Text text = new Text(); - text.setMsgtype("text"); - text.setTouser(this.getTouser(message.getToUser(), message.getToAll())); - TextEntity entity = new TextEntity(); - entity.setContent(message.getContent()); - text.setText(entity); - text.setAgentid(Integer.parseInt(config.getAgentId())); - return JwMessageAPI.sendTextMessage(text, accessToken); - } - - public JSONObject sendMarkdownResponse(MessageDTO message, boolean verifyConfig) { - SysThirdAppConfig config = this.getWeChatThirdAppConfig(); - if (verifyConfig && null == config) { - return null; - } - String accessToken = this.getAppAccessToken(config); - if (accessToken == null) { - return null; - } - Markdown markdown = new Markdown(); - markdown.setTouser(this.getTouser(message.getToUser(), message.getToAll())); - MarkdownEntity entity = new MarkdownEntity(); - entity.setContent(message.getContent()); - markdown.setMarkdown(entity); - markdown.setAgentid(Integer.parseInt(config.getAgentId())); - return JwMessageAPI.sendMarkdownMessage(markdown, accessToken); - } - - /** - * 发送文本卡片消息(SysAnnouncement定制) - * - * @param announcement - * @param verifyConfig 是否验证配置(未启用的APP会拒绝发送) - * @return - */ - public JSONObject sendTextCardMessage(SysAnnouncement announcement, boolean verifyConfig) { - SysThirdAppConfig config = this.getWeChatThirdAppConfig(); - if (verifyConfig && null == config) { - return null; - } - String accessToken = this.getAppAccessToken(config); - if (accessToken == null) { - return null; - } - TextCard textCard = new TextCard(); - textCard.setAgentid(Integer.parseInt(config.getAgentId())); - boolean isToAll = CommonConstant.MSG_TYPE_ALL.equals(announcement.getMsgType()); - String usernameString = ""; - if (!isToAll) { - // 将userId转为username - String userId = announcement.getUserIds(); - String[] userIds = null; - if (oConvertUtils.isNotEmpty(userId)) { - userIds = userId.substring(0, (userId.length() - 1)).split(","); - } else { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId()); - SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper); - userIds = new String[]{sysAnnouncementSend.getUserId()}; - } - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysUser::getId, userIds); - List userList = userMapper.selectList(queryWrapper); - List usernameList = userList.stream().map(SysUser::getUsername).collect(Collectors.toList()); - usernameString = String.join(",", usernameList); - } - - textCard.setTouser(this.getTouser(usernameString, isToAll)); - TextCardEntity entity = new TextCardEntity(); - entity.setTitle(announcement.getTitile()); - entity.setDescription(oConvertUtils.getString(announcement.getMsgAbstract(), "空")); - String baseUrl = null; - - //优先通过请求获取basepath,获取不到读取 jeecg.domainUrl.pc - try { - baseUrl = RestUtil.getBaseUrl(); - } catch (Exception e) { - log.warn(e.getMessage()); - baseUrl = jeecgBaseConfig.getDomainUrl().getPc(); - //e.printStackTrace(); - } - - entity.setUrl(baseUrl + "/sys/annountCement/show/" + announcement.getId()); - textCard.setTextcard(entity); - return JwMessageAPI.sendTextCardMessage(textCard, accessToken); - } - - private String getTouser(String origin, boolean toAll) { - if (toAll) { - return "@all"; - } else { - String[] toUsers = origin.split(","); - // 通过第三方账号表查询出第三方userId - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE); - List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, THIRD_TYPE, tenantId); - List toUserList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); - // 多个接收者用‘|’分隔 - return String.join("|", toUserList); - } - } - - /** - * 根据第三方登录获取到的code来获取第三方app的用户ID - * - * @param code - * @return - */ - public Map getUserIdByThirdCode(String code, String accessToken) { - JSONObject response = JwUserAPI.getUserInfoByCode(code, accessToken); - if (response != null) { - Map map = new HashMap<>(5); - log.info("response: " + response.toJSONString()); - if (response.getIntValue(ERR_CODE) == 0) { - //将userTicket也返回,用于获取手机号 - String userTicket = response.getString("user_ticket"); - String appUserId = response.getString("UserId"); - map.put("userTicket", userTicket); - map.put("appUserId", appUserId); - return map; - } - } - return null; - } - - /** - * OAuth2登录,成功返回登录的SysUser,失败返回null - */ - public SysUser oauth2Login(String code, Integer tenantId) { - Long count = tenantMapper.tenantIzExist(tenantId); - if (ObjectUtil.isEmpty(count) || 0 == count) { - throw new JeecgBootException("租户不存在!"); - } - //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - SysThirdAppConfig config = configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); - String accessToken = this.getAppAccessToken(config); - //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ - if (accessToken == null) { - return null; - } - Map map = this.getUserIdByThirdCode(code, accessToken); - if (null != map) { - //企业微信需要通过userTicket获取用户信息 - String appUserId = map.get("appUserId"); - String userTicket = map.get("userTicket"); - // 判断第三方用户表有没有这个人 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysThirdAccount::getThirdUserId, appUserId); - queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); - queryWrapper.eq(SysThirdAccount::getTenantId, tenantId); - SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper); - if (thirdAccount != null) { - return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken, userTicket, tenantId); - } else { - throw new JeecgBootException("该用户尚未同步,请同步后再次登录!"); - } - } - return null; - } - - /** - * 根据第三方账号获取本地账号,如果不存在就创建 - * - * @param thirdAccount - * @param appUser - * @param appUserId - * @param accessToken - * @param userTicket 获取访问用户敏感信息 - * @return - */ - private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken, String userTicket, Integer tenantId) { - String sysUserId = thirdAccount.getSysUserId(); - if (oConvertUtils.isNotEmpty(sysUserId)) { - return userMapper.selectById(sysUserId); - } else { - // 如果没有 sysUserId ,说明没有绑定账号,获取到手机号之后进行绑定 - if (appUser == null) { - appUser = this.getUserByUserTicket(userTicket, accessToken); - } - // 判断系统里是否有这个手机号的用户 - SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile()); - if (sysUser != null) { - thirdAccount.setAvatar(appUser.getAvatar()); - thirdAccount.setRealname(appUser.getName()); - thirdAccount.setThirdUserId(appUser.getUserid()); - thirdAccount.setThirdUserUuid(appUser.getUserid()); - thirdAccount.setSysUserId(sysUser.getId()); - sysThirdAccountService.updateById(thirdAccount); - return sysUser; - } else { - // 没有就走创建逻辑 - return sysThirdAccountService.createUser(appUser.getMobile(), appUser.getUserid(), tenantId); - } - - } - } - - /** - * 根据类型和租户id获取企业微信配置 - * - * @return - */ - private SysThirdAppConfig getWeChatThirdAppConfig() { - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - return configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); - } - - /** - * 获取企业微信第三方用户信息 - * - * @param userTicket - * @param accessToken - * @return - */ - private User getUserByUserTicket(String userTicket, String accessToken) { - Map map = new HashMap<>(5); - map.put("user_ticket", userTicket); - //建立连接 - CloseableHttpClient httpClient = null; - CloseableHttpResponse httpResponse = null; - try { - httpClient = HttpClients.createDefault(); - HttpPost httpPost = new HttpPost("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=" + accessToken); - RequestConfig requestConfig = RequestConfig.custom() - .setConnectTimeout(10000).setConnectionRequestTimeout(10000).setSocketTimeout(10000) - .build(); - httpPost.setConfig(requestConfig); - httpPost.setEntity(new StringEntity(JSONObject.toJSONString(map), ContentType.create("application/json", "utf-8"))); - httpResponse = httpClient.execute(httpPost); - // 从响应对象中获取响应内容 - HttpEntity entity = httpResponse.getEntity(); - String result = EntityUtils.toString(entity); - JSONObject jsonObject = JSONObject.parseObject(result); - Integer errcode = jsonObject.getInteger("errcode"); - if (0 == errcode) { - return JSONObject.toJavaObject(jsonObject, User.class); - } - } catch (IOException e) { - log.error(e.getMessage(), e); - } - return null; - } - - /** - * 获取企业微信绑定的用户信息 - * - * @return - */ - public JwSysUserDepartVo getThirdUserByWechat(Integer tenantId) { - JwSysUserDepartVo sysUserDepartVo = new JwSysUserDepartVo(); - //step1 获取用户id和部门id - String accessToken = this.getAccessToken(); - if (accessToken == null) { - throw new JeecgBootException("accessToken获取失败!"); - } - //获取当前租户下的用户 - List userList = sysUserTenantMapper.getUsersByTenantIdAndName(tenantId); - // 获取企业微信所有的用户(只能获取userid) - List qwUsers = JwUserAPI.getUsersByDepartid("1", "1", null, accessToken); - if (oConvertUtils.isEmpty(qwUsers)) { - throw new JeecgBootException("企业微信下没查询到用户!"); - } - List userIds = new ArrayList<>(); - List userWechatList = new ArrayList<>(); - - for (int i = 0; i < qwUsers.size(); i++) { - User user = qwUsers.get(i); - String userId = qwUsers.get(i).getUserid(); - //保证用户唯一 - if (!userIds.contains(userId)) { - //step2 查看是否已经同步过了,同步过的不做处理 - SysThirdAccount oneBySysUserId = sysThirdAccountService.getOneByUuidAndThirdType(userId, THIRD_TYPE, tenantId, userId); - if (null != oneBySysUserId) { - userIds.add(qwUsers.get(i).getUserid()); - userList = userList.stream().filter(item -> !item.getUserId().equals(oneBySysUserId.getSysUserId())).collect(Collectors.toList()); - ; - continue; - } - AtomicBoolean excludeUser = new AtomicBoolean(false); - if (ObjectUtil.isNotEmpty(qwUsers)) { - //step3 通过名称匹配敲敲云 - userList.forEach(item -> { - if (item.getRealName().equals(user.getName())) { - item.setWechatUserId(user.getUserid()); - item.setWechatRealName(user.getName()); - if (ObjectUtil.isNotEmpty(user.getDepartment())) { - item.setWechatDepartId(Arrays.toString(user.getDepartment())); - } - excludeUser.set(true); - } - }); - userIds.add(user.getUserid()); - } - if (!excludeUser.get()) { - JwUserDepartVo userDepartVo = new JwUserDepartVo(); - userDepartVo.setWechatRealName(user.getName()); - userDepartVo.setWechatUserId(user.getUserid()); - if (ObjectUtil.isNotEmpty(user.getDepartment())) { - userDepartVo.setWechatDepartId(Arrays.toString(user.getDepartment())); - } - userWechatList.add(userDepartVo); - } - } - } - //step4 返回用户信息 - sysUserDepartVo.setUserList(userWechatList); - sysUserDepartVo.setJwUserDepartVos(userList); - return sysUserDepartVo; - } - - /** - * 同步企业微信和部门 - * - * @param jwUserDepartJson - * @return - */ - public SyncInfoVo syncWechatEnterpriseDepartAndUserToLocal(String jwUserDepartJson, Integer tenantId) { - //step 1 同步部门 - //存放部门id的map - Map idsMap = new HashMap<>(); - SyncInfoVo syncInfoVo = this.syncThirdAppDepartmentToLocal(tenantId, idsMap); - //step 2 同步用户及用户部门 - this.syncDepartAndUser(syncInfoVo, tenantId, idsMap, jwUserDepartJson); - //step 3 返回同步成功或者同步失败的消息 - return syncInfoVo; - } - - /** - * 同步用户和部门 - * - * @param syncInfoVo 存放错误信息的日志 - * @param tenantId 租户id - * @param idsMap 部门id集合 key为企业微信的id value 为系统部门的id - * @param jwUserDepartJson - */ - private void syncDepartAndUser(SyncInfoVo syncInfoVo, Integer tenantId, Map idsMap, String jwUserDepartJson) { - if (oConvertUtils.isNotEmpty(jwUserDepartJson)) { - JSONArray jsonArray = JSONObject.parseArray(jwUserDepartJson); - for (Object object : jsonArray) { - JSONObject jsonObject = JSONObject.parseObject(object.toString()); - Object userId = jsonObject.get("userId"); - String wechatUserId = jsonObject.getString("wechatUserId"); - String wechatRealName = jsonObject.getString("wechatRealName"); - Object wechatDepartId = jsonObject.get("wechatDepartId"); - String sysUserId = ""; - //step 1 新建或更新用户 - //用户id为空说明需要创建用户 - if (null == userId) { - SysTenant sysTenant = sysTenantMapper.selectById(tenantId); - String houseNumber = ""; - //空说明没有租户直接用用户名 - if (null != sysTenant) { - houseNumber = sysTenant.getHouseNumber(); - } - //用户名和密码用门牌号+用户id的格式,避免用户名重复 - String username = houseNumber + wechatUserId; - //新建用户 - sysUserId = this.saveUser(username, wechatRealName, syncInfoVo, wechatUserId); - } else { - //根据id查询用户 - SysUser sysUser = userMapper.selectById(userId.toString()); - if (null != sysUser) { - sysUserId = sysUser.getId(); - //如果真实姓名为空的情况下,才会改真实姓名 - if (oConvertUtils.isEmpty(sysUser.getRealname())) { - sysUser.setRealname(wechatRealName); - //更新用户 - userMapper.updateById(sysUser); - } - String str = String.format("用户 %s(%s) 更新成功!", sysUser.getRealname(), sysUser.getUsername()); - syncInfoVo.addSuccessInfo(str); - } else { - syncInfoVo.addFailInfo("企业微信用户 " + wechatRealName + " 对应的组织用户没有匹配到!"); - continue; - } - } - if (oConvertUtils.isNotEmpty(sysUserId)) { - //step 2 新增租户用户表 - this.createUserTenant(sysUserId, false, tenantId); - //step 3 新建或更新第三方账号表 - SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByUuidAndThirdType(wechatUserId, THIRD_TYPE, tenantId, wechatUserId); - this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUserId, wechatUserId, wechatRealName, tenantId); - //step 4 新建或更新用户部门关系表 - if (oConvertUtils.isNotEmpty(wechatDepartId)) { - String wechatDepartIds = wechatDepartId.toString(); - String[] departIds = wechatDepartIds.substring(1, wechatDepartIds.length() - 1).split(","); - this.userDepartSaveOrUpdate(idsMap, sysUserId, departIds); - } - } - } - } else { - syncInfoVo.addFailInfo("用户同同步失败,请查看企业微信是否存在用户!"); - } - - } - - /** - * 保存用户 - * - * @param username 用户名 - * @param wechatRealName 企业微信用户真实姓名 - * @param syncInfo 存放成功或失败的信息 - * @param wechatUserId wechatUserId 企业微信对应的id - * @return - */ - private String saveUser(String username, String wechatRealName, SyncInfoVo syncInfo, String wechatUserId) { - SysUser sysUser = new SysUser(); - sysUser.setRealname(wechatRealName); - sysUser.setPassword(username); - sysUser.setUsername(username); - sysUser.setDelFlag(CommonConstant.DEL_FLAG_0); - //设置创建时间 - sysUser.setCreateTime(new Date()); - String salt = oConvertUtils.randomGen(8); - sysUser.setSalt(salt); - String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), sysUser.getPassword(), salt); - sysUser.setPassword(passwordEncode); - sysUser.setStatus(1); - sysUser.setDelFlag(CommonConstant.DEL_FLAG_0); - //用户表字段org_code不能在这里设置他的值 - sysUser.setOrgCode(null); - try { - userMapper.insert(sysUser); - String str = String.format("用户 %s(%s) 创建成功!", sysUser.getRealname(), sysUser.getUsername()); - syncInfo.addSuccessInfo(str); - return sysUser.getId(); - } catch (Exception e) { - User user = new User(); - user.setUserid(wechatUserId); - user.setName(wechatRealName); - this.syncUserCollectErrInfo(e, user, syncInfo); - } - - return ""; - } - - /** - * 新增用户租户 - * - * @param userId - * @param isUpdate 是否是新增 - * @param tenantId - */ - private void createUserTenant(String userId, Boolean isUpdate, Integer tenantId) { - if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { - //判断当前用户是否已在该租户下面 - Integer count = sysUserTenantMapper.userTenantIzExist(userId, tenantId); - //count 为0 新增租户用户,否则不用新增 - if (count == 0) { - SysUserTenant userTenant = new SysUserTenant(); - userTenant.setTenantId(tenantId); - userTenant.setUserId(userId); - userTenant.setStatus(isUpdate ? CommonConstant.USER_TENANT_UNDER_REVIEW : CommonConstant.USER_TENANT_NORMAL); - sysUserTenantMapper.insert(userTenant); - } - } - } - - /** - * 新建或更新用户部门关系表 - * - * @param idsMap 部门id集合 key为企业微信的id value 为系统部门的id - * @param sysUserId 系统对应的用户id - */ - private void userDepartSaveOrUpdate(Map idsMap, String sysUserId, String[] departIds) { - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(SysUserDepart::getUserId, sysUserId); - for (String departId : departIds) { - departId = departId.trim(); - if (idsMap.containsKey(departId)) { - String value = idsMap.get(departId); - //查询用户是否在部门里面 - query.eq(SysUserDepart::getDepId, value); - long count = sysUserDepartService.count(query); - if (count == 0) { - //不存在,则新增部门用户关系 - SysUserDepart sysUserDepart = new SysUserDepart(null, sysUserId, value); - sysUserDepartService.save(sysUserDepart); - } - } - } - } - - public List getThirdUserBindByWechat(int tenantId) { - return sysThirdAccountMapper.getThirdUserBindByWechat(tenantId, THIRD_TYPE); - } -} +// +//// @Override +//// public SyncInfoVo syncThirdAppUserToLocal() { +//// SyncInfoVo syncInfo = new SyncInfoVo(); +//// String accessToken = this.getAccessToken(); +//// if (accessToken == null) { +//// syncInfo.addFailInfo("accessToken获取失败!"); +//// return syncInfo; +//// } +//// // 获取企业微信所有的用户 +//// List qwUsersList = JwUserAPI.getDetailUsersByDepartid("1", null, null, accessToken); +//// if (qwUsersList == null) { +//// syncInfo.addFailInfo("企业微信用户列表查询失败!"); +//// return syncInfo; +//// } +//// //查询本地用户 +//// List sysUsersList = userMapper.selectList(Wrappers.emptyWrapper()); +//// // 循环判断新用户和需要更新的用户 +//// for (User qwUser : qwUsersList) { +//// /* +//// * 判断是否同步过的逻辑: +//// * 1. 查询 sys_third_account(第三方账号表)是否有数据,如果有代表已同步 +//// * 2. 本地表里没有,就先用手机号判断,不通过再用username判断。 +//// */ +//// SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(qwUser.getUserid(), THIRD_TYPE); +//// List collect = sysUsersList.stream().filter(user -> (qwUser.getMobile().equals(user.getPhone()) || qwUser.getUserid().equals(user.getUsername())) +//// ).collect(Collectors.toList()); +//// +//// if (collect != null && collect.size() > 0) { +//// SysUser sysUserTemp = collect.get(0); +//// // 循环到此说明用户匹配成功,进行更新操作 +//// SysUser updateSysUser = this.qwUserToSysUser(qwUser, sysUserTemp); +//// try { +//// userMapper.updateById(updateSysUser); +//// String str = String.format("用户 %s(%s) 更新成功!", updateSysUser.getRealname(), updateSysUser.getUsername()); +//// syncInfo.addSuccessInfo(str); +//// } catch (Exception e) { +//// this.syncUserCollectErrInfo(e, qwUser, syncInfo); +//// } +//// +//// this.thirdAccountSaveOrUpdate(sysThirdAccount, updateSysUser.getId(), qwUser.getUserid()); +//// // 更新完成,直接跳到下一次外部循环继续 +//// }else{ +//// // 没匹配到用户则走新增逻辑 +//// SysUser newSysUser = this.qwUserToSysUser(qwUser); +//// try { +//// userMapper.insert(newSysUser); +//// String str = String.format("用户 %s(%s) 创建成功!", newSysUser.getRealname(), newSysUser.getUsername()); +//// syncInfo.addSuccessInfo(str); +//// } catch (Exception e) { +//// this.syncUserCollectErrInfo(e, qwUser, syncInfo); +//// } +//// this.thirdAccountSaveOrUpdate(sysThirdAccount, newSysUser.getId(), qwUser.getUserid()); +//// } +//// } +//// return syncInfo; +//// } +// +// /** +// * 保存或修改第三方登录表 +// * +// * @param sysThirdAccount 第三方账户表对象,为null就新增数据,否则就修改 +// * @param sysUserId 本地系统用户ID +// * @param qwUserId 企业微信用户ID +// * @param wechatRealName 企业微信用户真实姓名 +// */ +// private void thirdAccountSaveOrUpdate(SysThirdAccount sysThirdAccount, String sysUserId, String qwUserId, String wechatRealName, Integer tenantId) { +// if (sysThirdAccount == null) { +// sysThirdAccount = new SysThirdAccount(); +// sysThirdAccount.setSysUserId(sysUserId); +// sysThirdAccount.setStatus(1); +// sysThirdAccount.setDelFlag(0); +// sysThirdAccount.setThirdType(THIRD_TYPE); +// if (oConvertUtils.isNotEmpty(tenantId)) { +// sysThirdAccount.setTenantId(tenantId); +// } +// } +// sysThirdAccount.setThirdUserId(qwUserId); +// sysThirdAccount.setThirdUserUuid(qwUserId); +// sysThirdAccount.setRealname(wechatRealName); +// sysThirdAccountService.saveOrUpdate(sysThirdAccount); +// } +// +// /** +// * 【同步用户】收集同步过程中的错误信息 +// */ +// private boolean syncUserCollectErrInfo(int errCode, SysUser sysUser, SyncInfoVo syncInfo) { +// if (errCode != 0) { +// String msg = ""; +// // https://open.work.weixin.qq.com/api/doc/90000/90139/90313 +// switch (errCode) { +// case 40003: +// msg = "无效的UserID"; +// break; +// case 60129: +// msg = "手机和邮箱不能都为空"; +// break; +// case 60102: +// msg = "UserID已存在"; +// break; +// case 60103: +// msg = "手机号码不合法"; +// break; +// case 60104: +// msg = "手机号码已存在"; +// break; +// default: +// } +// String str = String.format("用户 %s(%s) 同步失败!错误码:%s——%s", sysUser.getUsername(), sysUser.getRealname(), errCode, msg); +// syncInfo.addFailInfo(str); +// return false; +// } else { +// String str = String.format("用户 %s(%s) 同步成功!", sysUser.getUsername(), sysUser.getRealname()); +// syncInfo.addSuccessInfo(str); +// return true; +// } +// } +// +// private boolean syncUserCollectErrInfo(Exception e, User qwUser, SyncInfoVo syncInfo) { +// String msg; +// if (e instanceof DuplicateKeyException) { +// msg = e.getCause().getMessage(); +// } else { +// msg = e.getMessage(); +// } +// String str = String.format("用户 %s(%s) 同步失败!错误信息:%s", qwUser.getUserid(), qwUser.getName(), msg); +// syncInfo.addFailInfo(str); +// return false; +// } +// +// private boolean syncDepartCollectErrInfo(Exception e, Department department, SyncInfoVo syncInfo) { +// String msg; +// if (e instanceof DuplicateKeyException) { +// msg = e.getCause().getMessage(); +// } else { +// msg = e.getMessage(); +// } +// String str = String.format("部门 %s(%s) 同步失败!错误信息:%s", department.getName(), department.getId(), msg); +// syncInfo.addFailInfo(str); +// return false; +// } +// +// /** +// * 【同步用户】将SysUser转为企业微信的User对象(创建新用户) +// */ +// private User sysUserToQwUser(SysUser sysUser) { +// User user = new User(); +// // 通过 username 来关联 +// user.setUserid(sysUser.getUsername()); +// return this.sysUserToQwUser(sysUser, user); +// } +// +// /** +// * 【同步用户】将SysUser转为企业微信的User对象(更新旧用户) +// */ +// private User sysUserToQwUser(SysUser sysUser, User user) { +// user.setName(sysUser.getRealname()); +// user.setMobile(sysUser.getPhone()); +// // 查询并同步用户部门关系 +// List departList = this.getUserDepart(sysUser); +// if (departList != null) { +// List departmentIdList = new ArrayList<>(); +// // 企业微信 1表示为上级,0表示非上级 +// List isLeaderInDept = new ArrayList<>(); +// // 当前用户管理的部门 +// List manageDepartIdList = new ArrayList<>(); +// if (oConvertUtils.isNotEmpty(sysUser.getDepartIds())) { +// manageDepartIdList = Arrays.asList(sysUser.getDepartIds().split(",")); +// } +// for (SysDepart sysDepart : departList) { +// // 企业微信的部门id +// if (oConvertUtils.isNotEmpty(sysDepart.getQywxIdentifier())) { +// try { +// departmentIdList.add(Integer.parseInt(sysDepart.getQywxIdentifier())); +// } catch (NumberFormatException ignored) { +// continue; +// } +// // 判断用户身份,是否为上级 +// if (CommonConstant.USER_IDENTITY_2.equals(sysUser.getUserIdentity())) { +// // 判断当前部门是否为该用户管理的部门 +// isLeaderInDept.add(manageDepartIdList.contains(sysDepart.getId()) ? 1 : 0); +// } else { +// isLeaderInDept.add(0); +// } +// } +// } +// user.setDepartment(departmentIdList.toArray(new Integer[]{})); +// // 个数必须和参数department的个数一致,表示在所在的部门内是否为上级。1表示为上级,0表示非上级。在审批等应用里可以用来标识上级审批人 +// user.setIs_leader_in_dept(isLeaderInDept.toArray(new Integer[]{})); +// } +// if (user.getDepartment() == null || user.getDepartment().length == 0) { +// // 没有找到匹配部门,同步到根部门下 +// user.setDepartment(new Integer[]{1}); +// user.setIs_leader_in_dept(new Integer[]{0}); +// } +// // 职务翻译 +// //update-begin---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ +// List positionList = sysPositionService.getPositionList(sysUser.getId()); +// if (null != positionList && positionList.size() > 0) { +// String positionName = positionList.stream().map(SysPosition::getName).collect(Collectors.joining(SymbolConstant.COMMA)); +// user.setPosition(positionName); +// } +// //update-end---author:wangshuai ---date:20230220 for:[QQYUN-3980]组织管理中 职位功能 职位表加租户id 加职位-用户关联表------------ +// if (sysUser.getSex() != null) { +// user.setGender(sysUser.getSex().toString()); +// } +// user.setEmail(sysUser.getEmail()); +// // 启用/禁用成员(状态),规则不同,需要转换 +// // 企业微信规则:1表示启用成员,0表示禁用成员 +// // JEECG规则:1正常,2冻结 +// if (sysUser.getStatus() != null) { +// if (CommonConstant.USER_UNFREEZE.equals(sysUser.getStatus()) || CommonConstant.USER_FREEZE.equals(sysUser.getStatus())) { +// user.setEnable(sysUser.getStatus() == 1 ? 1 : 0); +// } else { +// user.setEnable(1); +// } +// } +// // 座机号 +// user.setTelephone(sysUser.getTelephone()); +// // --- 企业微信没有逻辑删除的功能 +// // update-begin--Author:sunjianlei Date:20210520 for:本地逻辑删除的用户,在企业微信里禁用 ----- +// if (CommonConstant.DEL_FLAG_1.equals(sysUser.getDelFlag())) { +// user.setEnable(0); +// } +// // update-end--Author:sunjianlei Date:20210520 for:本地逻辑删除的用户,在企业微信里冻结 ----- +// +// return user; +// } +// +// /** +// * 查询用户和部门的关系 +// */ +// private List getUserDepart(SysUser sysUser) { +// // 根据用户部门关系表查询出用户的部门 +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysUserDepart::getUserId, sysUser.getId()); +// List sysUserDepartList = sysUserDepartService.list(queryWrapper); +// if (sysUserDepartList.size() == 0) { +// return null; +// } +// // 根据用户部门 +// LambdaQueryWrapper departQueryWrapper = new LambdaQueryWrapper<>(); +// List departIdList = sysUserDepartList.stream().map(SysUserDepart::getDepId).collect(Collectors.toList()); +// departQueryWrapper.in(SysDepart::getId, departIdList); +// List departList = sysDepartService.list(departQueryWrapper); +// return departList.size() == 0 ? null : departList; +// } +// +// /** +// * 【同步用户】将企业微信的User对象转为SysUser(创建新用户) +// */ +// private SysUser qwUserToSysUser(User user) { +// SysUser sysUser = new SysUser(); +// sysUser.setDelFlag(0); +// sysUser.setStatus(1); +// // 通过 username 来关联 +// sysUser.setUsername(user.getUserid()); +// // 密码默认为 “123456”,随机加盐 +// String password = "123456", salt = oConvertUtils.randomGen(8); +// String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), password, salt); +// sysUser.setSalt(salt); +// sysUser.setPassword(passwordEncode); +// return this.qwUserToSysUser(user, sysUser); +// } +// +// /** +// * 【同步用户】将企业微信的User对象转为SysUser(更新旧用户) +// */ +// private SysUser qwUserToSysUser(User qwUser, SysUser oldSysUser) { +// SysUser sysUser = new SysUser(); +// BeanUtils.copyProperties(oldSysUser, sysUser); +// sysUser.setRealname(qwUser.getName()); +// sysUser.setPost(qwUser.getPosition()); +// // 设置工号,由于企业微信没有工号的概念,所以只能用 userId 代替 +// if (oConvertUtils.isEmpty(sysUser.getWorkNo())) { +// sysUser.setWorkNo(qwUser.getUserid()); +// } +// try { +// sysUser.setSex(Integer.parseInt(qwUser.getGender())); +// } catch (NumberFormatException ignored) { +// } +// // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 +// if (oConvertUtils.isNotEmpty(qwUser.getEmail()) && !qwUser.getEmail().equals(sysUser.getEmail())) { +// sysUser.setEmail(qwUser.getEmail()); +// } else { +// sysUser.setEmail(null); +// } +// // 因为唯一键约束的原因,如果原数据和旧数据相同,就不更新 +// if (oConvertUtils.isNotEmpty(qwUser.getMobile()) && !qwUser.getMobile().equals(sysUser.getPhone())) { +// sysUser.setPhone(qwUser.getMobile()); +// } else { +// sysUser.setPhone(null); +// } +// +// // 启用/禁用成员(状态),规则不同,需要转换 +// // 企业微信规则:1表示启用成员,0表示禁用成员 +// // JEECG规则:1正常,2冻结 +// if (qwUser.getEnable() != null) { +// sysUser.setStatus(qwUser.getEnable() == 1 ? 1 : 2); +// } +// // 座机号 +// sysUser.setTelephone(qwUser.getTelephone()); +// +// // --- 企业微信没有逻辑删除的功能 +// // sysUser.setDelFlag() +// return sysUser; +// } +// +// /** +// * 【同步部门】将SysDepartTreeModel转为企业微信的Department对象(创建新部门) +// */ +// private Department sysDepartToQwDepartment(SysDepartTreeModel departTree, String parentId) { +// Department department = new Department(); +// return this.sysDepartToQwDepartment(departTree, department, parentId); +// } +// +// /** +// * 【同步部门】将SysDepartTreeModel转为企业微信的Department对象 +// */ +// private Department sysDepartToQwDepartment(SysDepartTreeModel departTree, Department department, String parentId) { +// department.setName(departTree.getDepartName()); +// department.setParentid(parentId); +// if (departTree.getDepartOrder() != null) { +// department.setOrder(departTree.getDepartOrder().toString()); +// } +// return department; +// } +// +// +// /** +// * 【同步部门】将企业微信的Department对象转为SysDepart +// */ +// private SysDepart qwDepartmentToSysDepart(Department department, SysDepart oldSysDepart) { +// SysDepart sysDepart = new SysDepart(); +// if (oldSysDepart != null) { +// BeanUtils.copyProperties(oldSysDepart, sysDepart); +// } +// sysDepart.setQywxIdentifier(department.getId()); +// sysDepart.setDepartName(department.getName()); +// try { +// sysDepart.setDepartOrder(Integer.parseInt(department.getOrder())); +// } catch (NumberFormatException ignored) { +// } +// return sysDepart; +// } +// +// @Override +// public int removeThirdAppUser(List userIdList) { +// // 判断启用状态 +// SysThirdAppConfig config = this.getWeChatThirdAppConfig(); +// if (null == config) { +// return -1; +// } +// int count = 0; +// if (userIdList != null && userIdList.size() > 0) { +// String accessToken = this.getAccessToken(); +// if (accessToken == null) { +// return count; +// } +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); +// queryWrapper.in(SysThirdAccount::getSysUserId, userIdList); +// // 根据userId,获取第三方用户的id +// List thirdAccountList = sysThirdAccountService.list(queryWrapper); +// List thirdUserIdList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); +// +// for (String thirdUserId : thirdUserIdList) { +// if (oConvertUtils.isNotEmpty(thirdUserId)) { +// // 没有批量删除的接口 +// int err = JwUserAPI.deleteUser(thirdUserId, accessToken); +// if (err == 0) { +// count++; +// } +// } +// } +// } +// return count; +// } +// +// @Override +// public boolean sendMessage(MessageDTO message) { +// return this.sendMessage(message, false); +// } +// +// @Override +// public boolean sendMessage(MessageDTO message, boolean verifyConfig) { +// JSONObject response; +// if (message.isMarkdown()) { +// response = this.sendMarkdownResponse(message, verifyConfig); +// } else { +// response = this.sendMessageResponse(message, verifyConfig); +// } +// if (response != null) { +// return response.getIntValue("errcode") == 0; +// } +// return false; +// } +// +// public JSONObject sendMessageResponse(MessageDTO message, boolean verifyConfig) { +// SysThirdAppConfig config = this.getWeChatThirdAppConfig(); +// if (verifyConfig && null == config) { +// return null; +// } +// String accessToken = this.getAppAccessToken(config); +// if (accessToken == null) { +// return null; +// } +// Text text = new Text(); +// text.setMsgtype("text"); +// text.setTouser(this.getTouser(message.getToUser(), message.getToAll())); +// TextEntity entity = new TextEntity(); +// entity.setContent(message.getContent()); +// text.setText(entity); +// text.setAgentid(Integer.parseInt(config.getAgentId())); +// return JwMessageAPI.sendTextMessage(text, accessToken); +// } +// +// public JSONObject sendMarkdownResponse(MessageDTO message, boolean verifyConfig) { +// SysThirdAppConfig config = this.getWeChatThirdAppConfig(); +// if (verifyConfig && null == config) { +// return null; +// } +// String accessToken = this.getAppAccessToken(config); +// if (accessToken == null) { +// return null; +// } +// Markdown markdown = new Markdown(); +// markdown.setTouser(this.getTouser(message.getToUser(), message.getToAll())); +// MarkdownEntity entity = new MarkdownEntity(); +// entity.setContent(message.getContent()); +// markdown.setMarkdown(entity); +// markdown.setAgentid(Integer.parseInt(config.getAgentId())); +// return JwMessageAPI.sendMarkdownMessage(markdown, accessToken); +// } +// +// /** +// * 发送文本卡片消息(SysAnnouncement定制) +// * +// * @param announcement +// * @param verifyConfig 是否验证配置(未启用的APP会拒绝发送) +// * @return +// */ +// public JSONObject sendTextCardMessage(SysAnnouncement announcement, boolean verifyConfig) { +// SysThirdAppConfig config = this.getWeChatThirdAppConfig(); +// if (verifyConfig && null == config) { +// return null; +// } +// String accessToken = this.getAppAccessToken(config); +// if (accessToken == null) { +// return null; +// } +// TextCard textCard = new TextCard(); +// textCard.setAgentid(Integer.parseInt(config.getAgentId())); +// boolean isToAll = CommonConstant.MSG_TYPE_ALL.equals(announcement.getMsgType()); +// String usernameString = ""; +// if (!isToAll) { +// // 将userId转为username +// String userId = announcement.getUserIds(); +// String[] userIds = null; +// if (oConvertUtils.isNotEmpty(userId)) { +// userIds = userId.substring(0, (userId.length() - 1)).split(","); +// } else { +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId()); +// SysAnnouncementSend sysAnnouncementSend = sysAnnouncementSendMapper.selectOne(queryWrapper); +// userIds = new String[]{sysAnnouncementSend.getUserId()}; +// } +// +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.in(SysUser::getId, userIds); +// List userList = userMapper.selectList(queryWrapper); +// List usernameList = userList.stream().map(SysUser::getUsername).collect(Collectors.toList()); +// usernameString = String.join(",", usernameList); +// } +// +// textCard.setTouser(this.getTouser(usernameString, isToAll)); +// TextCardEntity entity = new TextCardEntity(); +// entity.setTitle(announcement.getTitile()); +// entity.setDescription(oConvertUtils.getString(announcement.getMsgAbstract(), "空")); +// String baseUrl = null; +// +// //优先通过请求获取basepath,获取不到读取 jeecg.domainUrl.pc +// try { +// baseUrl = RestUtil.getBaseUrl(); +// } catch (Exception e) { +// log.warn(e.getMessage()); +// baseUrl = jeecgBaseConfig.getDomainUrl().getPc(); +// //e.printStackTrace(); +// } +// +// entity.setUrl(baseUrl + "/sys/annountCement/show/" + announcement.getId()); +// textCard.setTextcard(entity); +// return JwMessageAPI.sendTextCardMessage(textCard, accessToken); +// } +// +// private String getTouser(String origin, boolean toAll) { +// if (toAll) { +// return "@all"; +// } else { +// String[] toUsers = origin.split(","); +// // 通过第三方账号表查询出第三方userId +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), CommonConstant.TENANT_ID_DEFAULT_VALUE); +// List thirdAccountList = sysThirdAccountService.listThirdUserIdByUsername(toUsers, THIRD_TYPE, tenantId); +// List toUserList = thirdAccountList.stream().map(SysThirdAccount::getThirdUserId).collect(Collectors.toList()); +// // 多个接收者用‘|’分隔 +// return String.join("|", toUserList); +// } +// } +// +// /** +// * 根据第三方登录获取到的code来获取第三方app的用户ID +// * +// * @param code +// * @return +// */ +// public Map getUserIdByThirdCode(String code, String accessToken) { +// JSONObject response = JwUserAPI.getUserInfoByCode(code, accessToken); +// if (response != null) { +// Map map = new HashMap<>(5); +// log.info("response: " + response.toJSONString()); +// if (response.getIntValue(ERR_CODE) == 0) { +// //将userTicket也返回,用于获取手机号 +// String userTicket = response.getString("user_ticket"); +// String appUserId = response.getString("UserId"); +// map.put("userTicket", userTicket); +// map.put("appUserId", appUserId); +// return map; +// } +// } +// return null; +// } +// +// /** +// * OAuth2登录,成功返回登录的SysUser,失败返回null +// */ +// public SysUser oauth2Login(String code, Integer tenantId) { +// Long count = tenantMapper.tenantIzExist(tenantId); +// if (ObjectUtil.isEmpty(count) || 0 == count) { +// throw new JeecgBootException("租户不存在!"); +// } +// //update-begin---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// SysThirdAppConfig config = configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); +// String accessToken = this.getAppAccessToken(config); +// //update-end---author:wangshuai ---date:20230224 for:[QQYUN-3440]新建企业微信和钉钉配置表,通过租户模式隔离------------ +// if (accessToken == null) { +// return null; +// } +// Map map = this.getUserIdByThirdCode(code, accessToken); +// if (null != map) { +// //企业微信需要通过userTicket获取用户信息 +// String appUserId = map.get("appUserId"); +// String userTicket = map.get("userTicket"); +// // 判断第三方用户表有没有这个人 +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(SysThirdAccount::getThirdUserId, appUserId); +// queryWrapper.eq(SysThirdAccount::getThirdType, THIRD_TYPE); +// queryWrapper.eq(SysThirdAccount::getTenantId, tenantId); +// SysThirdAccount thirdAccount = sysThirdAccountService.getOne(queryWrapper); +// if (thirdAccount != null) { +// return this.getSysUserByThird(thirdAccount, null, appUserId, accessToken, userTicket, tenantId); +// } else { +// throw new JeecgBootException("该用户尚未同步,请同步后再次登录!"); +// } +// } +// return null; +// } +// +// /** +// * 根据第三方账号获取本地账号,如果不存在就创建 +// * +// * @param thirdAccount +// * @param appUser +// * @param appUserId +// * @param accessToken +// * @param userTicket 获取访问用户敏感信息 +// * @return +// */ +// private SysUser getSysUserByThird(SysThirdAccount thirdAccount, User appUser, String appUserId, String accessToken, String userTicket, Integer tenantId) { +// String sysUserId = thirdAccount.getSysUserId(); +// if (oConvertUtils.isNotEmpty(sysUserId)) { +// return userMapper.selectById(sysUserId); +// } else { +// // 如果没有 sysUserId ,说明没有绑定账号,获取到手机号之后进行绑定 +// if (appUser == null) { +// appUser = this.getUserByUserTicket(userTicket, accessToken); +// } +// // 判断系统里是否有这个手机号的用户 +// SysUser sysUser = userMapper.getUserByPhone(appUser.getMobile()); +// if (sysUser != null) { +// thirdAccount.setAvatar(appUser.getAvatar()); +// thirdAccount.setRealname(appUser.getName()); +// thirdAccount.setThirdUserId(appUser.getUserid()); +// thirdAccount.setThirdUserUuid(appUser.getUserid()); +// thirdAccount.setSysUserId(sysUser.getId()); +// sysThirdAccountService.updateById(thirdAccount); +// return sysUser; +// } else { +// // 没有就走创建逻辑 +// return sysThirdAccountService.createUser(appUser.getMobile(), appUser.getUserid(), tenantId); +// } +// +// } +// } +// +// /** +// * 根据类型和租户id获取企业微信配置 +// * +// * @return +// */ +// private SysThirdAppConfig getWeChatThirdAppConfig() { +// int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); +// return configMapper.getThirdConfigByThirdType(tenantId, MessageTypeEnum.QYWX.getType()); +// } +// +// /** +// * 获取企业微信第三方用户信息 +// * +// * @param userTicket +// * @param accessToken +// * @return +// */ +// private User getUserByUserTicket(String userTicket, String accessToken) { +// Map map = new HashMap<>(5); +// map.put("user_ticket", userTicket); +// //建立连接 +// CloseableHttpClient httpClient = null; +// CloseableHttpResponse httpResponse = null; +// try { +// httpClient = HttpClients.createDefault(); +// HttpPost httpPost = new HttpPost("https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=" + accessToken); +// RequestConfig requestConfig = RequestConfig.custom() +// .setConnectTimeout(10000).setConnectionRequestTimeout(10000).setSocketTimeout(10000) +// .build(); +// httpPost.setConfig(requestConfig); +// httpPost.setEntity(new StringEntity(JSONObject.toJSONString(map), ContentType.create("application/json", "utf-8"))); +// httpResponse = httpClient.execute(httpPost); +// // 从响应对象中获取响应内容 +// HttpEntity entity = httpResponse.getEntity(); +// String result = EntityUtils.toString(entity); +// JSONObject jsonObject = JSONObject.parseObject(result); +// Integer errcode = jsonObject.getInteger("errcode"); +// if (0 == errcode) { +// return JSONObject.toJavaObject(jsonObject, User.class); +// } +// } catch (IOException e) { +// log.error(e.getMessage(), e); +// } +// return null; +// } +// +// /** +// * 获取企业微信绑定的用户信息 +// * +// * @return +// */ +// public JwSysUserDepartVo getThirdUserByWechat(Integer tenantId) { +// JwSysUserDepartVo sysUserDepartVo = new JwSysUserDepartVo(); +// //step1 获取用户id和部门id +// String accessToken = this.getAccessToken(); +// if (accessToken == null) { +// throw new JeecgBootException("accessToken获取失败!"); +// } +// //获取当前租户下的用户 +// List userList = sysUserTenantMapper.getUsersByTenantIdAndName(tenantId); +// // 获取企业微信所有的用户(只能获取userid) +// List qwUsers = JwUserAPI.getUsersByDepartid("1", "1", null, accessToken); +// if (oConvertUtils.isEmpty(qwUsers)) { +// throw new JeecgBootException("企业微信下没查询到用户!"); +// } +// List userIds = new ArrayList<>(); +// List userWechatList = new ArrayList<>(); +// +// for (int i = 0; i < qwUsers.size(); i++) { +// User user = qwUsers.get(i); +// String userId = qwUsers.get(i).getUserid(); +// //保证用户唯一 +// if (!userIds.contains(userId)) { +// //step2 查看是否已经同步过了,同步过的不做处理 +// SysThirdAccount oneBySysUserId = sysThirdAccountService.getOneByUuidAndThirdType(userId, THIRD_TYPE, tenantId, userId); +// if (null != oneBySysUserId) { +// userIds.add(qwUsers.get(i).getUserid()); +// userList = userList.stream().filter(item -> !item.getUserId().equals(oneBySysUserId.getSysUserId())).collect(Collectors.toList()); +// ; +// continue; +// } +// AtomicBoolean excludeUser = new AtomicBoolean(false); +// if (ObjectUtil.isNotEmpty(qwUsers)) { +// //step3 通过名称匹配敲敲云 +// userList.forEach(item -> { +// if (item.getRealName().equals(user.getName())) { +// item.setWechatUserId(user.getUserid()); +// item.setWechatRealName(user.getName()); +// if (ObjectUtil.isNotEmpty(user.getDepartment())) { +// item.setWechatDepartId(Arrays.toString(user.getDepartment())); +// } +// excludeUser.set(true); +// } +// }); +// userIds.add(user.getUserid()); +// } +// if (!excludeUser.get()) { +// JwUserDepartVo userDepartVo = new JwUserDepartVo(); +// userDepartVo.setWechatRealName(user.getName()); +// userDepartVo.setWechatUserId(user.getUserid()); +// if (ObjectUtil.isNotEmpty(user.getDepartment())) { +// userDepartVo.setWechatDepartId(Arrays.toString(user.getDepartment())); +// } +// userWechatList.add(userDepartVo); +// } +// } +// } +// //step4 返回用户信息 +// sysUserDepartVo.setUserList(userWechatList); +// sysUserDepartVo.setJwUserDepartVos(userList); +// return sysUserDepartVo; +// } +// +// /** +// * 同步企业微信和部门 +// * +// * @param jwUserDepartJson +// * @return +// */ +// public SyncInfoVo syncWechatEnterpriseDepartAndUserToLocal(String jwUserDepartJson, Integer tenantId) { +// //step 1 同步部门 +// //存放部门id的map +// Map idsMap = new HashMap<>(); +// SyncInfoVo syncInfoVo = this.syncThirdAppDepartmentToLocal(tenantId, idsMap); +// //step 2 同步用户及用户部门 +// this.syncDepartAndUser(syncInfoVo, tenantId, idsMap, jwUserDepartJson); +// //step 3 返回同步成功或者同步失败的消息 +// return syncInfoVo; +// } +// +// /** +// * 同步用户和部门 +// * +// * @param syncInfoVo 存放错误信息的日志 +// * @param tenantId 租户id +// * @param idsMap 部门id集合 key为企业微信的id value 为系统部门的id +// * @param jwUserDepartJson +// */ +// private void syncDepartAndUser(SyncInfoVo syncInfoVo, Integer tenantId, Map idsMap, String jwUserDepartJson) { +// if (oConvertUtils.isNotEmpty(jwUserDepartJson)) { +// JSONArray jsonArray = JSONObject.parseArray(jwUserDepartJson); +// for (Object object : jsonArray) { +// JSONObject jsonObject = JSONObject.parseObject(object.toString()); +// Object userId = jsonObject.get("userId"); +// String wechatUserId = jsonObject.getString("wechatUserId"); +// String wechatRealName = jsonObject.getString("wechatRealName"); +// Object wechatDepartId = jsonObject.get("wechatDepartId"); +// String sysUserId = ""; +// //step 1 新建或更新用户 +// //用户id为空说明需要创建用户 +// if (null == userId) { +// SysTenant sysTenant = sysTenantMapper.selectById(tenantId); +// String houseNumber = ""; +// //空说明没有租户直接用用户名 +// if (null != sysTenant) { +// houseNumber = sysTenant.getHouseNumber(); +// } +// //用户名和密码用门牌号+用户id的格式,避免用户名重复 +// String username = houseNumber + wechatUserId; +// //新建用户 +// sysUserId = this.saveUser(username, wechatRealName, syncInfoVo, wechatUserId); +// } else { +// //根据id查询用户 +// SysUser sysUser = userMapper.selectById(userId.toString()); +// if (null != sysUser) { +// sysUserId = sysUser.getId(); +// //如果真实姓名为空的情况下,才会改真实姓名 +// if (oConvertUtils.isEmpty(sysUser.getRealname())) { +// sysUser.setRealname(wechatRealName); +// //更新用户 +// userMapper.updateById(sysUser); +// } +// String str = String.format("用户 %s(%s) 更新成功!", sysUser.getRealname(), sysUser.getUsername()); +// syncInfoVo.addSuccessInfo(str); +// } else { +// syncInfoVo.addFailInfo("企业微信用户 " + wechatRealName + " 对应的组织用户没有匹配到!"); +// continue; +// } +// } +// if (oConvertUtils.isNotEmpty(sysUserId)) { +// //step 2 新增租户用户表 +// this.createUserTenant(sysUserId, false, tenantId); +// //step 3 新建或更新第三方账号表 +// SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByUuidAndThirdType(wechatUserId, THIRD_TYPE, tenantId, wechatUserId); +// this.thirdAccountSaveOrUpdate(sysThirdAccount, sysUserId, wechatUserId, wechatRealName, tenantId); +// //step 4 新建或更新用户部门关系表 +// if (oConvertUtils.isNotEmpty(wechatDepartId)) { +// String wechatDepartIds = wechatDepartId.toString(); +// String[] departIds = wechatDepartIds.substring(1, wechatDepartIds.length() - 1).split(","); +// this.userDepartSaveOrUpdate(idsMap, sysUserId, departIds); +// } +// } +// } +// } else { +// syncInfoVo.addFailInfo("用户同同步失败,请查看企业微信是否存在用户!"); +// } +// +// } +// +// /** +// * 保存用户 +// * +// * @param username 用户名 +// * @param wechatRealName 企业微信用户真实姓名 +// * @param syncInfo 存放成功或失败的信息 +// * @param wechatUserId wechatUserId 企业微信对应的id +// * @return +// */ +// private String saveUser(String username, String wechatRealName, SyncInfoVo syncInfo, String wechatUserId) { +// SysUser sysUser = new SysUser(); +// sysUser.setRealname(wechatRealName); +// sysUser.setPassword(username); +// sysUser.setUsername(username); +// sysUser.setDelFlag(CommonConstant.DEL_FLAG_0); +// //设置创建时间 +// sysUser.setCreateTime(new Date()); +// String salt = oConvertUtils.randomGen(8); +// sysUser.setSalt(salt); +// String passwordEncode = PasswordUtil.encrypt(sysUser.getUsername(), sysUser.getPassword(), salt); +// sysUser.setPassword(passwordEncode); +// sysUser.setStatus(1); +// sysUser.setDelFlag(CommonConstant.DEL_FLAG_0); +// //用户表字段org_code不能在这里设置他的值 +// sysUser.setOrgCode(null); +// try { +// userMapper.insert(sysUser); +// String str = String.format("用户 %s(%s) 创建成功!", sysUser.getRealname(), sysUser.getUsername()); +// syncInfo.addSuccessInfo(str); +// return sysUser.getId(); +// } catch (Exception e) { +// User user = new User(); +// user.setUserid(wechatUserId); +// user.setName(wechatRealName); +// this.syncUserCollectErrInfo(e, user, syncInfo); +// } +// +// return ""; +// } +// +// /** +// * 新增用户租户 +// * +// * @param userId +// * @param isUpdate 是否是新增 +// * @param tenantId +// */ +// private void createUserTenant(String userId, Boolean isUpdate, Integer tenantId) { +// if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { +// //判断当前用户是否已在该租户下面 +// Integer count = sysUserTenantMapper.userTenantIzExist(userId, tenantId); +// //count 为0 新增租户用户,否则不用新增 +// if (count == 0) { +// SysUserTenant userTenant = new SysUserTenant(); +// userTenant.setTenantId(tenantId); +// userTenant.setUserId(userId); +// userTenant.setStatus(isUpdate ? CommonConstant.USER_TENANT_UNDER_REVIEW : CommonConstant.USER_TENANT_NORMAL); +// sysUserTenantMapper.insert(userTenant); +// } +// } +// } +// +// /** +// * 新建或更新用户部门关系表 +// * +// * @param idsMap 部门id集合 key为企业微信的id value 为系统部门的id +// * @param sysUserId 系统对应的用户id +// */ +// private void userDepartSaveOrUpdate(Map idsMap, String sysUserId, String[] departIds) { +// LambdaQueryWrapper query = new LambdaQueryWrapper<>(); +// query.eq(SysUserDepart::getUserId, sysUserId); +// for (String departId : departIds) { +// departId = departId.trim(); +// if (idsMap.containsKey(departId)) { +// String value = idsMap.get(departId); +// //查询用户是否在部门里面 +// query.eq(SysUserDepart::getDepId, value); +// long count = sysUserDepartService.count(query); +// if (count == 0) { +// //不存在,则新增部门用户关系 +// SysUserDepart sysUserDepart = new SysUserDepart(null, sysUserId, value); +// sysUserDepartService.save(sysUserDepart); +// } +// } +// } +// } +// +// public List getThirdUserBindByWechat(int tenantId) { +// return sysThirdAccountMapper.getThirdUserBindByWechat(tenantId, THIRD_TYPE); +// } +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JdtDepartmentTreeVo.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JdtDepartmentTreeVo.java index 54f2517..f7c973a 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JdtDepartmentTreeVo.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JdtDepartmentTreeVo.java @@ -1,89 +1,89 @@ -package org.jeecg.modules.system.vo.thirdapp; - -import com.jeecg.dingtalk.api.department.vo.Department; -import org.springframework.beans.BeanUtils; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -/** - * 钉钉树结构的部门 - * - * @author sunjianlei - */ -public class JdtDepartmentTreeVo extends Department { - - private List children; - - public List getChildren() { - return children; - } - - public JdtDepartmentTreeVo setChildren(List children) { - this.children = children; - return this; - } - - public JdtDepartmentTreeVo(Department department) { - BeanUtils.copyProperties(department, this); - } - - /** - * 是否有子项 - */ - public boolean hasChildren() { - return children != null && children.size() > 0; - } - - @Override - public String toString() { - return "JwDepartmentTree{" + - "children=" + children + - "} " + super.toString(); - } - - /** - * 静态辅助方法,将list转为tree结构 - */ - public static List listToTree(List allDepartment) { - // 先找出所有的父级 - List treeList = getByParentId(1, allDepartment); - Optional departmentOptional = allDepartment.stream().filter(item -> item.getParent_id() == null).findAny(); - Department department = new Department(); - //判断是否找到数据 - if (departmentOptional.isPresent()) { - department = departmentOptional.get(); - } - getChildrenRecursion(treeList, allDepartment); - //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- - JdtDepartmentTreeVo treeVo = new JdtDepartmentTreeVo(department); - treeVo.setChildren(treeList); - List list = new ArrayList<>(); - list.add(treeVo); - return list; - //update-end---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- - } - - private static List getByParentId(Integer parentId, List allDepartment) { - List list = new ArrayList<>(); - for (Department department : allDepartment) { - if (parentId.equals(department.getParent_id())) { - list.add(new JdtDepartmentTreeVo(department)); - } - } - return list; - } - - private static void getChildrenRecursion(List treeList, List allDepartment) { - for (JdtDepartmentTreeVo departmentTree : treeList) { - // 递归寻找子级 - List children = getByParentId(departmentTree.getDept_id(), allDepartment); - if (children.size() > 0) { - departmentTree.setChildren(children); - getChildrenRecursion(children, allDepartment); - } - } - } - -} +//package org.jeecg.modules.system.vo.thirdapp; +// +//import com.jeecg.dingtalk.api.department.vo.Department; +//import org.springframework.beans.BeanUtils; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Optional; +// +///** +// * 钉钉树结构的部门 +// * +// * @author sunjianlei +// */ +//public class JdtDepartmentTreeVo extends Department { +// +// private List children; +// +// public List getChildren() { +// return children; +// } +// +// public JdtDepartmentTreeVo setChildren(List children) { +// this.children = children; +// return this; +// } +// +// public JdtDepartmentTreeVo(Department department) { +// BeanUtils.copyProperties(department, this); +// } +// +// /** +// * 是否有子项 +// */ +// public boolean hasChildren() { +// return children != null && children.size() > 0; +// } +// +// @Override +// public String toString() { +// return "JwDepartmentTree{" + +// "children=" + children + +// "} " + super.toString(); +// } +// +// /** +// * 静态辅助方法,将list转为tree结构 +// */ +// public static List listToTree(List allDepartment) { +// // 先找出所有的父级 +// List treeList = getByParentId(1, allDepartment); +// Optional departmentOptional = allDepartment.stream().filter(item -> item.getParent_id() == null).findAny(); +// Department department = new Department(); +// //判断是否找到数据 +// if (departmentOptional.isPresent()) { +// department = departmentOptional.get(); +// } +// getChildrenRecursion(treeList, allDepartment); +// //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- +// JdtDepartmentTreeVo treeVo = new JdtDepartmentTreeVo(department); +// treeVo.setChildren(treeList); +// List list = new ArrayList<>(); +// list.add(treeVo); +// return list; +// //update-end---author:wangshuai---date:2024-04-10---for:【issues/6017】钉钉同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- +// } +// +// private static List getByParentId(Integer parentId, List allDepartment) { +// List list = new ArrayList<>(); +// for (Department department : allDepartment) { +// if (parentId.equals(department.getParent_id())) { +// list.add(new JdtDepartmentTreeVo(department)); +// } +// } +// return list; +// } +// +// private static void getChildrenRecursion(List treeList, List allDepartment) { +// for (JdtDepartmentTreeVo departmentTree : treeList) { +// // 递归寻找子级 +// List children = getByParentId(departmentTree.getDept_id(), allDepartment); +// if (children.size() > 0) { +// departmentTree.setChildren(children); +// getChildrenRecursion(children, allDepartment); +// } +// } +// } +// +//} diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwDepartmentTreeVo.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwDepartmentTreeVo.java index 81d4ec5..b256781 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwDepartmentTreeVo.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/system/vo/thirdapp/JwDepartmentTreeVo.java @@ -1,89 +1,89 @@ -package org.jeecg.modules.system.vo.thirdapp; - -import com.jeecg.qywx.api.department.vo.Department; -import org.springframework.beans.BeanUtils; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -/** - * 企业微信树结构的部门 - * - * @author sunjianlei - */ -public class JwDepartmentTreeVo extends Department { - - private List children; - - public List getChildren() { - return children; - } - - public JwDepartmentTreeVo setChildren(List children) { - this.children = children; - return this; - } - - public JwDepartmentTreeVo(Department department) { - BeanUtils.copyProperties(department, this); - } - - /** - * 是否有子项 - */ - public boolean hasChildren() { - return children != null && children.size() > 0; - } - - @Override - public String toString() { - return "JwDepartmentTree{" + - "children=" + children + - "} " + super.toString(); - } - - /** - * 静态辅助方法,将list转为tree结构 - */ - public static List listToTree(List allDepartment) { - // 先找出所有的父级 - List treeList = getByParentId("1", allDepartment); - Optional departmentOptional = allDepartment.stream().filter(item -> "0".equals(item.getParentid())).findAny(); - Department department = new Department(); - //判断是否找到数据 - if (departmentOptional.isPresent()) { - department = departmentOptional.get(); - } - getChildrenRecursion(treeList, allDepartment); - //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- - JwDepartmentTreeVo treeVo = new JwDepartmentTreeVo(department); - treeVo.setChildren(treeList); - List list = new ArrayList<>(); - list.add(treeVo); - return list; - //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- - } - - private static List getByParentId(String parentId, List allDepartment) { - List list = new ArrayList<>(); - for (Department department : allDepartment) { - if (parentId.equals(department.getParentid())) { - list.add(new JwDepartmentTreeVo(department)); - } - } - return list; - } - - private static void getChildrenRecursion(List treeList, List allDepartment) { - for (JwDepartmentTreeVo departmentTree : treeList) { - // 递归寻找子级 - List children = getByParentId(departmentTree.getId(), allDepartment); - if (children.size() > 0) { - departmentTree.setChildren(children); - getChildrenRecursion(children, allDepartment); - } - } - } - -} +//package org.jeecg.modules.system.vo.thirdapp; +// +//import com.jeecg.qywx.api.department.vo.Department; +//import org.springframework.beans.BeanUtils; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Optional; +// +///** +// * 企业微信树结构的部门 +// * +// * @author sunjianlei +// */ +//public class JwDepartmentTreeVo extends Department { +// +// private List children; +// +// public List getChildren() { +// return children; +// } +// +// public JwDepartmentTreeVo setChildren(List children) { +// this.children = children; +// return this; +// } +// +// public JwDepartmentTreeVo(Department department) { +// BeanUtils.copyProperties(department, this); +// } +// +// /** +// * 是否有子项 +// */ +// public boolean hasChildren() { +// return children != null && children.size() > 0; +// } +// +// @Override +// public String toString() { +// return "JwDepartmentTree{" + +// "children=" + children + +// "} " + super.toString(); +// } +// +// /** +// * 静态辅助方法,将list转为tree结构 +// */ +// public static List listToTree(List allDepartment) { +// // 先找出所有的父级 +// List treeList = getByParentId("1", allDepartment); +// Optional departmentOptional = allDepartment.stream().filter(item -> "0".equals(item.getParentid())).findAny(); +// Department department = new Department(); +// //判断是否找到数据 +// if (departmentOptional.isPresent()) { +// department = departmentOptional.get(); +// } +// getChildrenRecursion(treeList, allDepartment); +// //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信同步部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- +// JwDepartmentTreeVo treeVo = new JwDepartmentTreeVo(department); +// treeVo.setChildren(treeList); +// List list = new ArrayList<>(); +// list.add(treeVo); +// return list; +// //update-begin---author:wangshuai---date:2024-04-10---for:【issues/6017】企业微信部门时没有最顶层的部门名,同步用户时,用户没有部门信息--- +// } +// +// private static List getByParentId(String parentId, List allDepartment) { +// List list = new ArrayList<>(); +// for (Department department : allDepartment) { +// if (parentId.equals(department.getParentid())) { +// list.add(new JwDepartmentTreeVo(department)); +// } +// } +// return list; +// } +// +// private static void getChildrenRecursion(List treeList, List allDepartment) { +// for (JwDepartmentTreeVo departmentTree : treeList) { +// // 递归寻找子级 +// List children = getByParentId(departmentTree.getId(), allDepartment); +// if (children.size() > 0) { +// departmentTree.setChildren(children); +// getChildrenRecursion(children, allDepartment); +// } +// } +// } +// +//} diff --git a/pom.xml b/pom.xml index 36dc32c..f09dd9c 100644 --- a/pom.xml +++ b/pom.xml @@ -215,17 +215,17 @@ ${jeecgboot.version} - - org.jeecgframework.boot - physical-boot-starter3-rabbitmq - ${jeecgboot.version} - - - - org.jeecgframework.boot - physical-boot-starter3-rocketmq - ${jeecgboot.version} - + + + + + + + + + + + org.jeecgframework.boot @@ -243,11 +243,11 @@ - - org.jeecgframework.boot3 - hibernate-re - 3.7.0 - + + + + + org.glassfish.jaxb @@ -256,42 +256,42 @@ - - - org.jeecgframework.boot - physical-boot-starter3-mongon - ${jeecgboot.version} - - - - org.jeecgframework - kingbase8 - 9.0.0 - runtime - - - - com.dameng - Dm8JdbcDriver18 - 8.1.1.49 - - - com.dameng - DmDialect-for-hibernate5.0 - 8.1.1.49 - + + + + + + + + + + + + + + + + + + + + + + + + - - com.qiniu - qiniu-java-sdk - ${qiniu-java-sdk.version} - - - okhttp - com.squareup.okhttp3 - - - + + + + + + + + + + + dom4j @@ -312,21 +312,21 @@ - - com.xkcoding.justauth - justauth-spring-boot-starter - ${justauth-spring-boot-starter.version} - - - hutool-core - cn.hutool - - - fastjson - com.alibaba - - - + + + + + + + + + + + + + + + com.squareup.okhttp3 okhttp @@ -365,62 +365,62 @@ - - org.jeecgframework - jeewx-api - 1.5.2 - - - commons-beanutils - commons-beanutils - - - commons-lang - commons-lang - - - commons-collections - commons-collections - - - commons-logging - commons-logging - - - commons-io - commons-io - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - org.jeecgframework.jimureport - jimureport-spring-boot3-starter-fastjson2 - ${jimureport-spring-boot-starter.version} - - - autopoi-web - org.jeecgframework - - - druid - com.alibaba - - - - - org.jeecgframework.jimureport - jimureport-nosql-starter - 1.6.0 - + + + + + + + + + + + + + + + + + + + + - - org.flywaydb - flyway-core - 7.15.0 - + + + + +