diff --git a/.gitignore b/.gitignore
index 3b437ba5..3fa6ffce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -71,4 +71,9 @@ xueyi-modules/xueyi-tenant/target/
xueyi-visual/xueyi-monitor/target/
docker/mysql/data/
docker/nacos/logs/
-logs/
\ No newline at end of file
+logs/
+
+**/target */
+
+**/.lck*/
+digtalman-*
\ No newline at end of file
diff --git a/Jenkinsfile b/Jenkinsfile
index ee10d082..0ebb8c08 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -8,7 +8,7 @@ pipeline {
// 拉取代码
stage('Pull Code') {
steps {
- checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '0f6d6eaa8754e735262afa495fe2828d611fca17', url: 'http://39.105.23.186:3000/develop/digimeta-MultiSaas.git']]])
+ checkout([$class: 'GitSCM', branches: [[name: '${git_version}']], extensions: [], userRemoteConfigs: [[credentialsId: '0f6d6eaa8754e735262afa495fe2828d611fca17', url: 'http://39.105.23.186:3000/develop/digimeta-MultiSaas.git']]])
}
}
// 代码静态检查
@@ -19,13 +19,22 @@ pipeline {
sh "which java"
echo "打包子目录并进行代码检查 ${project_name}"
sh "mvn clean install"
- sh "mvn -f ${project_name} clean package -e -U -Dmaven.test.skip=true sonar:sonar"
+ sh "mvn -f ${project_name} clean package -e -U -Dmaven.test.skip=true -P${build_env} -Dsonar.login=admin -Dsonar.password=Digimeta@2023 sonar:sonar"
}
}
}
stage('Quality Gate') {
steps {
- timeout(time: 1, unit: 'HOURS') {
+ //休息10s等待结果
+ sleep(10)
+ script {
+ def workspace=pwd()
+ // 删除所有report报告
+ sh "find ${workspace} -name report-task.txt | xargs rm -f"
+ // 删除所有sonar锁
+ sh "find ${workspace} -name .sonar_lock | xargs rm -f"
+ }
+ timeout(time: 5, unit: 'MINUTES') {
// Parameter indicates whether to set pipeline to UNSTABLE if Quality Gate fails
// true = set pipeline to UNSTABLE, false = don't waitForQualityGates abortPipeline: true
waitForQualityGate abortPipeline: true
@@ -44,13 +53,13 @@ pipeline {
if ("${project_name}" == 'digimeta-MultiSaas' ) {
echo '仅做代码检查,不打包目录'
} else {
- echo "构件微服务 ${modules_name},并推送到镜像仓库"
+ echo "构件微服务 ${module_name},并推送到镜像仓库"
sh """
cd ${workspace}/${project_name}
docker login --username=缔智元2023 --password=digimeta@2023 ${ali_registry}
- docker build --tag ${ali_registry}/digitalman-multisaas/${modules_name}:${version} .
- docker push ${ali_registry}/digitalman-multisaas/${modules_name}:${version}
- docker rmi ${ali_registry}/digitalman-multisaas/${modules_name}:${version}
+ docker build --tag ${ali_registry}/digitalman-multisaas/${module_name}:${git_version}-${build_env} .
+ docker push ${ali_registry}/digitalman-multisaas/${module_name}:${git_version}-${build_env}
+ docker rmi ${ali_registry}/digitalman-multisaas/${module_name}:${git_version}-${build_env}
"""
}
}
diff --git a/Jenkinsfile1 b/Jenkinsfile1
new file mode 100644
index 00000000..b6f9d2ce
--- /dev/null
+++ b/Jenkinsfile1
@@ -0,0 +1,67 @@
+node {
+ def workspace=pwd()
+ // 版本
+ def tag = "0.8"
+ def ali_registry = "registry.cn-beijing.aliyuncs.com"
+ // 镜像仓库的地址
+ // def harbor_url = "192.168.81.102:85"
+ // 镜像仓库的项目,这里建议项目名称和jenkins的item项目名称、以及harbor的项目名称保持一致,否则用一下脚本会出问题
+ // def harbor_project = "demo"
+ def mavenPath="/usr/share/maven"
+ // 拉取代码
+ stage('pull code') {
+ checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '0f6d6eaa8754e735262afa495fe2828d611fca17', url: 'http://39.105.23.186:3000/develop/digimeta-MultiSaas.git']]])
+ }
+ // 代码静态检查
+ stage('Maven Package and Sonar') {
+ if ("${project_name}" == 'digimeta-MultiSaas' ) {
+ echo '打包根目录'
+ sh 'mvn clean package sonar:sonar'
+ } else {
+ echo "打包子目录并进行代码检查 ${project_name}"
+ sh "mvn clean install"
+ sh "mvn -f ${project_name} clean package -e -U -Dmaven.test.skip=true sonar:sonar"
+ }
+
+ //script {
+ //引入Jenkins SonarQube-Scanner全局工具 "全局配置中以SonarQube-Scanner命名的工具"
+ // scannerHome = tool 'SonarQube-Scanner'
+ //}
+ //引用SonarQube环境 "系统配置中配置的SonarQube servers的name值 "
+ //withSonarQubeEnv('Sonar') {
+ //执行sonar-scanner命令
+ //sh "${scannerHome}/bin/sonar-scanner"
+ // $mavenPath/bin/mvn sonar:sonar
+ //}
+ }
+ // build Docker并推送镜像仓库
+ stage('build project') {
+ if ("${project_name}" == 'digimeta-MultiSaas' ) {
+ echo '仅做代码检查,不打包目录'
+ } else {
+ echo "构件微服务 ${project_name},并推送到镜像仓库"
+ sh """
+ cd ${workspace}/${project_name}
+ docker login --username=缔智元2023 ${ali_registry}
+ docker build --tag ${ali_registry}/digitalman-multisaas/${project_name}:${version}
+ docker push ${ali_registry}/digitalman-multisaas/${project_name}:${version}
+ """
+
+ }
+ //echo "把jar上传镜像仓库"
+ //def oldImageName = "${project_name}:latest"
+ //def newImageName = "${harbor_url}/${harbor_project}/${project_name}:${tag}"
+ // 改名称 做规范
+ //sh "docker tag ${oldImageName} ${newImageName}"
+ // 删除之前的 镜像
+ //sh "docker rmi ${oldImageName}"
+ // 推送到 dockers仓库
+ //withCredentials([usernamePassword(credentialsId: '8a3d7ab1-4cd6-482c-86c9-a12aa6404d98', passwordVariable: 'harbor_password', usernameVariable: 'harbor_account')]) {
+ // 登录
+ //sh "docker login -u ${harbor_account} -p ${harbor_password} ${harbor_url}"
+ // 上传
+ //sh "docker push ${newImageName}"
+ //echo "镜像推送成功"
+ //}
+ }
+}
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index ca0f7e24..3c96835e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -166,6 +166,34 @@ services:
depends_on:
- xueyi-nacos
- xueyi-redis
+ links:
+ - xueyi-nacos
+ - xueyi-redis
+
+ xueyi-modules-auth:
+ container_name: xueyi-modules-auth
+ build:
+ context: xueyi-modules/xueyi-modules-auth
+ dockerfile: ./Dockerfile
+ ports:
+ - "9970:9970"
+ depends_on:
+ - xueyi-nacos
+ - xueyi-redis
+ links:
+ - xueyi-nacos
+ - xueyi-redis
+ -
+ xueyi-nlt:
+ container_name: xueyi-nlt
+ build:
+ context: xueyi-modules/xueyi-nlt
+ dockerfile: ./Dockerfile
+ ports:
+ - "9910:9910"
+ depends_on:
+ - xueyi-nacos
+ - xueyi-redis
links:
- xueyi-nacos
- xueyi-redis
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index c4739873..c14347b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,8 @@
./target/checkstyle-result.xml
admin
Digimeta@2023
+ 2.0.1
+ 8.3.3
@@ -163,6 +165,11 @@
${fastjson2.version}
+
+ net.logstash.logback
+ logstash-logback-encoder
+ 7.4
+
io.jsonwebtoken
@@ -240,6 +247,13 @@
${xueyi.version}
+
+
+ com.xueyi
+ xueyi-common-mqtt
+ ${xueyi.version}
+
+
com.xueyi
@@ -287,6 +301,19 @@
${xueyi.version}
+
+
+ com.xueyi
+ xueyi-api-modules-auth
+ ${xueyi.version}
+
+
+
+ com.xueyi
+ xueyi-api-nlt
+ ${xueyi.version}
+
+
cn.hutool
@@ -296,6 +323,17 @@
import
+
+ co.elastic.clients
+ elasticsearch-java
+ ${elasticsearch.version}
+
+
+ jakarta.json
+ jakarta.json-api
+ ${jakarta-json.version}
+
+
@@ -319,6 +357,58 @@
+
+
+ local
+
+
+ local
+ 127.0.0.1
+ 18848
+
+
+
+
+
+
+
+
+ dev
+
+
+ dev
+ 39.107.77.235
+ 18848
+ 6d0ee265-2a92-44cc-a6de-f34b3ea104e6
+
+
+
+ true
+
+
+
+ test
+
+
+ test
+ 172.17.0.1
+ 18848
+
+
+
+
+ prod
+
+
+ prod
+ 123.57.75.177
+ 18848
+
+
+
+
+
+
diff --git a/xueyi-api/pom.xml b/xueyi-api/pom.xml
index 7097956a..43a410fd 100644
--- a/xueyi-api/pom.xml
+++ b/xueyi-api/pom.xml
@@ -14,6 +14,8 @@
xueyi-api-tenant
xueyi-api-file
xueyi-api-job
+ xueyi-api-nlt
+ xueyi-api-modules-auth
diff --git a/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/domain/DigitalmanLogFile.java b/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/domain/DigitalmanLogFile.java
new file mode 100644
index 00000000..71a32519
--- /dev/null
+++ b/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/domain/DigitalmanLogFile.java
@@ -0,0 +1,11 @@
+package com.xueyi.file.api.domain;
+
+import lombok.Data;
+
+@Data
+public class DigitalmanLogFile {
+
+ String devId;
+ String logType;
+ String timestamp;
+}
diff --git a/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/feign/RemoteFileService.java b/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/feign/RemoteFileService.java
index ffd9921f..9584e8ff 100644
--- a/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/feign/RemoteFileService.java
+++ b/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/feign/RemoteFileService.java
@@ -12,6 +12,8 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
+import java.util.List;
+
/**
* 文件服务
*
@@ -29,6 +31,15 @@ public interface RemoteFileService {
@PostMapping(value = "/inner/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
R upload(@RequestPart(value = "file") MultipartFile file);
+ /**
+ * 上传pdf文件
+ *
+ * @param file 文件信息
+ * @return 结果
+ */
+ @PostMapping(value = "/inner/uploadpdf", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ R> uploadPdf(@RequestPart(value = "file") MultipartFile file);
+
/**
* 删除文件
*
diff --git a/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/feign/factory/RemoteFileFallbackFactory.java b/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/feign/factory/RemoteFileFallbackFactory.java
index 228fff70..f18fb7d2 100644
--- a/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/feign/factory/RemoteFileFallbackFactory.java
+++ b/xueyi-api/xueyi-api-file/src/main/java/com/xueyi/file/api/feign/factory/RemoteFileFallbackFactory.java
@@ -8,6 +8,8 @@ import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
+import java.util.List;
+
/**
* 文件服务 降级处理
*
@@ -26,6 +28,11 @@ public class RemoteFileFallbackFactory implements FallbackFactory> uploadPdf(MultipartFile file) {
+ return R.fail("上传文件失败:" + throwable.getMessage() );
+ }
+
@Override
public R delete(String url) {
return R.fail("删除文件失败:" + throwable.getMessage());
diff --git a/xueyi-api/xueyi-api-file/xueyi-api-file.iml b/xueyi-api/xueyi-api-file/xueyi-api-file.iml
deleted file mode 100644
index 54137521..00000000
--- a/xueyi-api/xueyi-api-file/xueyi-api-file.iml
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-job/xueyi-api-job.iml b/xueyi-api/xueyi-api-job/xueyi-api-job.iml
deleted file mode 100644
index a99cebae..00000000
--- a/xueyi-api/xueyi-api-job/xueyi-api-job.iml
+++ /dev/null
@@ -1,115 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/domain/vo/DmDeployScheduleVo.java b/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/domain/vo/DmDeployScheduleVo.java
new file mode 100644
index 00000000..fcca87d8
--- /dev/null
+++ b/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/domain/vo/DmDeployScheduleVo.java
@@ -0,0 +1,20 @@
+package com.xueyi.message.api.transfer.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@NoArgsConstructor
+@ToString
+public class DmDeployScheduleVo {
+ private String devId;
+ private String timestamp;
+ private String sign;
+ //请求类型(1:人员 2:技能话术 3:数字人信息)
+ private Integer type;
+ // 企业id
+ private String schedule;
+
+
+}
diff --git a/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/domain/vo/Message.java b/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/domain/vo/Message.java
new file mode 100644
index 00000000..bfdec889
--- /dev/null
+++ b/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/domain/vo/Message.java
@@ -0,0 +1,16 @@
+package com.xueyi.message.api.transfer.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.*;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+@Builder
+@NoArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Message implements Serializable,Cloneable{
+
+
+}
diff --git a/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/feign/RemoteTransferService.java b/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/feign/RemoteTransferService.java
index e927ba3f..8d4f86b0 100644
--- a/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/feign/RemoteTransferService.java
+++ b/xueyi-api/xueyi-api-message/src/main/java/com/xueyi/message/api/transfer/feign/RemoteTransferService.java
@@ -1,15 +1,14 @@
package com.xueyi.message.api.transfer.feign;
-import com.xueyi.common.core.constant.basic.SecurityConstants;
import com.xueyi.common.core.constant.basic.ServiceConstants;
import com.xueyi.common.core.web.result.AjaxResult;
import com.xueyi.common.core.web.result.R;
-
import com.xueyi.message.api.transfer.feign.factory.RemoteTransferFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
/**
* 数据源服务
@@ -21,4 +20,10 @@ public interface RemoteTransferService {
@RequestMapping(value = "/api/device_online_status/{devId}", method = {RequestMethod.GET})
@ResponseBody
public AjaxResult getDeviceOnlineStatus(@RequestParam(value = "devId") String devId);
+
+ @RequestMapping(value = "/api/broadcast", method = {RequestMethod.GET})
+ @ResponseBody
+ public R broadcast(@RequestParam(value = "channel") String channel);
+
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-modules-auth/pom.xml b/xueyi-api/xueyi-api-modules-auth/pom.xml
new file mode 100644
index 00000000..2ec70d4e
--- /dev/null
+++ b/xueyi-api/xueyi-api-modules-auth/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ com.xueyi
+ xueyi-api
+ 2.5.0
+
+ 4.0.0
+
+ xueyi-api-modules-auth
+
+
+ xueyi-api-modules-auth管理接口模块
+
+
+
+
+
+
+ com.xueyi
+ xueyi-common-core
+
+
+
+
+
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-modules-auth/src/main/java/com/xueyi/modules/auth/api/domain/vo/IntentionReqDto.java b/xueyi-api/xueyi-api-modules-auth/src/main/java/com/xueyi/modules/auth/api/domain/vo/IntentionReqDto.java
new file mode 100644
index 00000000..621ef703
--- /dev/null
+++ b/xueyi-api/xueyi-api-modules-auth/src/main/java/com/xueyi/modules/auth/api/domain/vo/IntentionReqDto.java
@@ -0,0 +1,22 @@
+package com.xueyi.modules.auth.api.domain.vo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author yk
+ * @description 意图请求对象DTO
+ * @date 2023-07-31 19:50
+ */
+@Data
+public class IntentionReqDto {
+ @NotNull(message = "staffId不能为空")
+ private String staffId;
+
+ private String staffType;
+ @NotNull(message = "skillCode不能为空")
+ private String skillCode;
+ @NotNull(message = "devId不能为空")
+ private String devId;
+}
diff --git a/xueyi-api/xueyi-api-modules-auth/src/main/java/com/xueyi/modules/auth/api/feign/RemoteSkillAuthService.java b/xueyi-api/xueyi-api-modules-auth/src/main/java/com/xueyi/modules/auth/api/feign/RemoteSkillAuthService.java
new file mode 100644
index 00000000..a7325730
--- /dev/null
+++ b/xueyi-api/xueyi-api-modules-auth/src/main/java/com/xueyi/modules/auth/api/feign/RemoteSkillAuthService.java
@@ -0,0 +1,27 @@
+package com.xueyi.modules.auth.api.feign;
+
+import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.constant.basic.ServiceConstants;
+import com.xueyi.common.core.web.result.AjaxResult;
+import com.xueyi.modules.auth.api.domain.vo.IntentionReqDto;
+import com.xueyi.modules.auth.api.feign.factory.RemoteSkillAuthFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.validation.Valid;
+
+/**
+ * 数据源服务
+ *
+ * @author xueyi
+ */
+@FeignClient(contextId = "remoteSkillAuthService", value = ServiceConstants.SYSTEM_SERVICE, fallbackFactory = RemoteSkillAuthFallbackFactory.class)
+public interface RemoteSkillAuthService {
+ @RequestMapping(value = "/skill/inner/auth", method = {RequestMethod.POST})
+ @ResponseBody
+ public AjaxResult skillAuth(@Valid @RequestBody IntentionReqDto intentionSkillAuth, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-modules-auth/src/main/java/com/xueyi/modules/auth/api/feign/factory/RemoteSkillAuthFallbackFactory.java b/xueyi-api/xueyi-api-modules-auth/src/main/java/com/xueyi/modules/auth/api/feign/factory/RemoteSkillAuthFallbackFactory.java
new file mode 100644
index 00000000..42936c08
--- /dev/null
+++ b/xueyi-api/xueyi-api-modules-auth/src/main/java/com/xueyi/modules/auth/api/feign/factory/RemoteSkillAuthFallbackFactory.java
@@ -0,0 +1,22 @@
+package com.xueyi.modules.auth.api.feign.factory;
+
+import com.xueyi.modules.auth.api.feign.RemoteSkillAuthService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 数据源服务降级处理
+ *
+ * @author xueyi
+ */
+@Slf4j
+@Component
+public class RemoteSkillAuthFallbackFactory implements FallbackFactory {
+
+ @Override
+ public RemoteSkillAuthService create(Throwable cause) {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-modules-auth/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xueyi-api/xueyi-api-modules-auth/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 00000000..072ee7d2
--- /dev/null
+++ b/xueyi-api/xueyi-api-modules-auth/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1 @@
+com.xueyi.modules.auth.api.feign.factory.RemoteSkillAuthFallbackFactory
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-nlt/pom.xml b/xueyi-api/xueyi-api-nlt/pom.xml
new file mode 100644
index 00000000..b42fb186
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/pom.xml
@@ -0,0 +1,33 @@
+
+
+
+ com.xueyi
+ xueyi-api
+ 2.5.0
+
+ 4.0.0
+
+ xueyi-api-nlt
+
+
+ xueyi-api-nlt模型接入管理模块
+
+
+
+
+
+
+ com.xueyi
+ xueyi-common-core
+
+
+
+
+ com.xueyi
+ xueyi-api-system
+
+
+
+
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/netty/domain/vo/DmWebSocketMessageVo.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/netty/domain/vo/DmWebSocketMessageVo.java
new file mode 100644
index 00000000..215163d0
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/netty/domain/vo/DmWebSocketMessageVo.java
@@ -0,0 +1,15 @@
+package com.xueyi.nlt.api.netty.domain.vo;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class DmWebSocketMessageVo {
+ String devId;
+ String skillCode;
+ JSONObject format;
+ String template;
+ String operator;
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/netty/feign/RemoteWebsocketService.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/netty/feign/RemoteWebsocketService.java
new file mode 100644
index 00000000..119df79a
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/netty/feign/RemoteWebsocketService.java
@@ -0,0 +1,20 @@
+package com.xueyi.nlt.api.netty.feign;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.constant.basic.ServiceConstants;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.nlt.api.netty.domain.vo.DmWebSocketMessageVo;
+import com.xueyi.nlt.api.nlt.domain.vo.DmIntentVo;
+import com.xueyi.nlt.api.nlt.feign.factory.RemoteIntentFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+@FeignClient(contextId = "remoteWebsocketService", value = ServiceConstants.NLT_SERVICE, fallbackFactory = RemoteIntentFallbackFactory.class)
+public interface RemoteWebsocketService {
+
+ @PostMapping("websocket/inner/sendMessage")
+ R sendMessage(@RequestBody DmWebSocketMessageVo message, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/CoversationSessionVo.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/CoversationSessionVo.java
new file mode 100644
index 00000000..f6943f14
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/CoversationSessionVo.java
@@ -0,0 +1,13 @@
+package com.xueyi.nlt.api.nlt.domain.vo;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class CoversationSessionVo {
+ protected String category;
+ protected String id;
+ protected JSONObject format;
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/DmIntentVo.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/DmIntentVo.java
new file mode 100644
index 00000000..ce968a49
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/DmIntentVo.java
@@ -0,0 +1,18 @@
+package com.xueyi.nlt.api.nlt.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class DmIntentVo {
+ String devId;
+ Long operator;
+ String skillCode;
+ String content;
+ String preIntent;
+ String sign;
+ String requestId;
+ /** 模式类型 1:工作模式 2:接待模式 3:闲聊模式 */
+ String mode;
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/DmLandingLlmVo.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/DmLandingLlmVo.java
new file mode 100644
index 00000000..114aa76c
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/DmLandingLlmVo.java
@@ -0,0 +1,29 @@
+package com.xueyi.nlt.api.nlt.domain.vo;
+
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class DmLandingLlmVo {
+ private String category;
+ private List message = new ArrayList<>();
+ @Data
+ @NoArgsConstructor
+ class DmLlm {
+ private String role;
+ private String content;
+ }
+
+ // 定义创建DmLlm的对象方法,并添加到message中
+ public void addDmLlm(String role, String content) {
+ DmLlm dmLlm = new DmLlm();
+ dmLlm.setRole(role);
+ dmLlm.setContent(content);
+ message.add(dmLlm);
+ }
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/DmRecognitionVo.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/DmRecognitionVo.java
new file mode 100644
index 00000000..39098bc9
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/DmRecognitionVo.java
@@ -0,0 +1,13 @@
+package com.xueyi.nlt.api.nlt.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class DmRecognitionVo {
+ String devId;
+ Long personId;
+ String registered;
+ String sign;
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/KnowledgeVo.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/KnowledgeVo.java
new file mode 100644
index 00000000..49abb709
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/KnowledgeVo.java
@@ -0,0 +1,13 @@
+package com.xueyi.nlt.api.nlt.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class KnowledgeVo {
+ private String man_code;
+ private String question;
+ private Long tenant_id;
+ private String trace_id;
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/TaskKnowledgeVo.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/TaskKnowledgeVo.java
new file mode 100644
index 00000000..57f23394
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/domain/vo/TaskKnowledgeVo.java
@@ -0,0 +1,17 @@
+package com.xueyi.nlt.api.nlt.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class TaskKnowledgeVo {
+ private Long knowledgeId;
+ private String content;
+ private Integer count;
+ private Long manId;
+ private Long tenantId;
+ private int split;
+ private Long createBy;
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteIntentService.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteIntentService.java
new file mode 100644
index 00000000..50587a9f
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteIntentService.java
@@ -0,0 +1,27 @@
+package com.xueyi.nlt.api.nlt.feign;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.constant.basic.ServiceConstants;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.nlt.api.netty.domain.vo.DmWebSocketMessageVo;
+import com.xueyi.nlt.api.nlt.domain.vo.DmIntentVo;
+import com.xueyi.nlt.api.nlt.feign.factory.RemoteIntentFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@FeignClient(contextId = "remoteIntentService", value = ServiceConstants.NLT_SERVICE, fallbackFactory = RemoteIntentFallbackFactory.class)
+public interface RemoteIntentService {
+
+ @PostMapping("/intent/inner/conversation")
+ R conversationInner(@RequestBody DmIntentVo intent, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/intent/inner/sendMessage")
+ R sendMessage(@RequestBody DmWebSocketMessageVo message, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping("/intent/inner/taskGenerativeKnowledge")
+ public R taskGenerativeKnowledge();
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteLandingLlmService.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteLandingLlmService.java
new file mode 100644
index 00000000..bd3a1873
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteLandingLlmService.java
@@ -0,0 +1,28 @@
+package com.xueyi.nlt.api.nlt.feign;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.xueyi.common.core.web.result.AjaxResult;
+import com.xueyi.nlt.api.nlt.domain.vo.DmLandingLlmVo;
+import com.xueyi.nlt.api.nlt.feign.factory.RemoteLandingLlmFallbackFactory;
+import com.xueyi.nlt.api.nlt.feign.factory.RemoteQAFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 问答服务
+ * @Param man_id 机器人id
+ * @Param question 问题
+ * @Param tenant_id 租户id
+ * @author yrx
+ */
+@FeignClient(url = "${notification.landing-llm.url}",name = "landing-llm", fallbackFactory = RemoteLandingLlmFallbackFactory.class)
+public interface RemoteLandingLlmService {
+
+ @PostMapping("/search/questionAnswer")
+ @ResponseBody
+ JSONObject query(@RequestBody DmLandingLlmVo vo);
+ @PostMapping("/search/questionAnswer")
+ @ResponseBody
+ JSONObject query(@RequestBody JSONObject jsonObject);
+
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteQAService.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteQAService.java
new file mode 100644
index 00000000..aa250919
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/RemoteQAService.java
@@ -0,0 +1,30 @@
+package com.xueyi.nlt.api.nlt.feign;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xueyi.common.core.web.result.AjaxResult;
+import com.xueyi.nlt.api.nlt.domain.vo.KnowledgeVo;
+import com.xueyi.nlt.api.nlt.feign.factory.RemoteQAFallbackFactory;
+import com.xueyi.system.api.sms.domain.vo.SmsReqEntity;
+import com.xueyi.system.api.sms.feign.factory.RemoteSmsFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * 问答服务
+ * @Param man_id 机器人id
+ * @Param question 问题
+ * @Param tenant_id 租户id
+ * @author yrx
+ */
+@FeignClient(url = "${notification.qa.url}",name = "qa", fallbackFactory = RemoteQAFallbackFactory.class)
+public interface RemoteQAService {
+
+ @GetMapping("/knowledge")
+ AjaxResult query(@RequestParam(value = "man_code") String manCode, @RequestParam(value = "question") String question, @RequestParam(value = "tenant_id") Long tenantId);
+ @PostMapping ("/knowledge")
+ AjaxResult query(@RequestBody KnowledgeVo vo);
+
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteIntentFallbackFactory.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteIntentFallbackFactory.java
new file mode 100644
index 00000000..a48cb1f9
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteIntentFallbackFactory.java
@@ -0,0 +1,15 @@
+package com.xueyi.nlt.api.nlt.feign.factory;
+
+import com.xueyi.nlt.api.nlt.feign.RemoteIntentService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class RemoteIntentFallbackFactory implements FallbackFactory {
+ @Override
+ public RemoteIntentService create(Throwable cause) {
+ return null;
+ }
+}
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteLandingLlmFallbackFactory.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteLandingLlmFallbackFactory.java
new file mode 100644
index 00000000..d25ab5b2
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteLandingLlmFallbackFactory.java
@@ -0,0 +1,42 @@
+package com.xueyi.nlt.api.nlt.feign.factory;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.xueyi.common.core.web.result.AjaxResult;
+import com.xueyi.nlt.api.nlt.domain.vo.DmLandingLlmVo;
+import com.xueyi.nlt.api.nlt.feign.RemoteLandingLlmService;
+import com.xueyi.nlt.api.nlt.feign.RemoteQAService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 会议室服务 降级处理
+ *
+ * @author xueyi
+ */
+@Slf4j
+@Component
+public class RemoteLandingLlmFallbackFactory implements FallbackFactory {
+
+ @Override
+ public RemoteLandingLlmService create(Throwable throwable) {
+ log.error("短信服务调用失败:{}", throwable.getMessage());
+ return new RemoteLandingLlmService() {
+ @Override
+ public JSONObject query(DmLandingLlmVo vo) {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("status","fail");
+ jsonObject.put("data","");
+ return jsonObject;
+ }
+
+ @Override
+ public JSONObject query(JSONObject jsonObject) {
+ JSONObject jResult = new JSONObject();
+ jResult.put("status","fail2");
+ jResult.put("data","");
+ return jResult;
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteQAFallbackFactory.java b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteQAFallbackFactory.java
new file mode 100644
index 00000000..d86e84c7
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/java/com/xueyi/nlt/api/nlt/feign/factory/RemoteQAFallbackFactory.java
@@ -0,0 +1,34 @@
+package com.xueyi.nlt.api.nlt.feign.factory;
+
+import com.xueyi.common.core.web.result.AjaxResult;
+import com.xueyi.nlt.api.nlt.domain.vo.KnowledgeVo;
+import com.xueyi.nlt.api.nlt.feign.RemoteQAService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 会议室服务 降级处理
+ *
+ * @author xueyi
+ */
+@Slf4j
+@Component
+public class RemoteQAFallbackFactory implements FallbackFactory {
+
+ @Override
+ public RemoteQAService create(Throwable throwable) {
+ log.error("短信服务调用失败:{}", throwable.getMessage());
+ return new RemoteQAService() {
+ @Override
+ public AjaxResult query(String manCode, String question, Long tenantId) {
+ return AjaxResult.error("查询失败");
+ }
+
+ @Override
+ public AjaxResult query(KnowledgeVo vo) {
+ return AjaxResult.error("查询失败");
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-nlt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xueyi-api/xueyi-api-nlt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 00000000..4669e5f9
--- /dev/null
+++ b/xueyi-api/xueyi-api-nlt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,3 @@
+com.xueyi.nlt.api.nlt.feign.factory.RemoteIntentFallbackFactory
+com.xueyi.nlt.api.nlt.feign.factory.RemoteQAFallbackFactory
+com.xueyi.nlt.api.nlt.feign.factory.RemoteLandingLlmFallbackFactory
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmManDeviceDto.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmManDeviceDto.java
index 6ecba912..44a94aa5 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmManDeviceDto.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmManDeviceDto.java
@@ -3,6 +3,7 @@ package com.xueyi.system.api.digitalmans.domain.dto;
import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo;
import lombok.Data;
import lombok.EqualsAndHashCode;
+import lombok.ToString;
import java.io.Serial;
@@ -12,6 +13,7 @@ import java.io.Serial;
* @author xueyi
*/
@Data
+@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class DmManDeviceDto extends DmManDevicePo {
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmSyncDigitalmanDto.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmSyncDigitalmanDto.java
index bd5b8817..2e848264 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmSyncDigitalmanDto.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmSyncDigitalmanDto.java
@@ -2,13 +2,14 @@ package com.xueyi.system.api.digitalmans.domain.dto;
import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanPo;
import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanWorktimePo;
-import com.xueyi.system.api.digitalmans.domain.po.DmModelPo;
+import com.xueyi.system.api.digitalmans.domain.vo.DmBroadcastVo;
+import com.xueyi.system.api.organize.domain.vo.SysDeptExt;
import com.xueyi.system.api.resource.domain.po.DmResourcesPo;
import lombok.Data;
import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
import java.io.Serial;
+import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
@@ -21,5 +22,8 @@ public class DmSyncDigitalmanDto extends DmDigitalmanPo {
protected DmResourcesPo icon;
protected DmResourcesPo screenOff;
protected DmDigitalmanWorktimePo worktime;
+ protected SysDeptExt workdayHour;
+ protected String iconPos;
+ protected List broadcast;
}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmVisitorsDto.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmVisitorsDto.java
index 85772365..c88edf70 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmVisitorsDto.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/dto/DmVisitorsDto.java
@@ -22,4 +22,6 @@ public class DmVisitorsDto extends DmVisitorsPo {
public static final Long TYPE_VIP_VISITOR = 9L;
public static final Long TYPE_SPECIAL_VISITOR = 10L;
+ public String imgUrl;
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmDigitalmanExtPo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmDigitalmanExtPo.java
index 3f7b4706..17edfd89 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmDigitalmanExtPo.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmDigitalmanExtPo.java
@@ -26,16 +26,16 @@ public class DmDigitalmanExtPo extends TBaseEntity {
private static final long serialVersionUID = 1L;
/** 数字人id */
- @Excel(name = "会议室ID")
+ @Excel(name = "数字人扩展表ID")
protected Long id;
/** 访客电话 */
- @Excel(name = "访客电话")
+ @Excel(name = "snCode")
protected String snCode;
/** 技能信息 */
- @Excel(name = "技能信息")
+ @Excel(name = "ip地址")
protected String ipAddr;
/** 访客公司 */
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmManDevicePo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmManDevicePo.java
index 2d63b449..3e08dcc6 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmManDevicePo.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmManDevicePo.java
@@ -56,4 +56,12 @@ public class DmManDevicePo extends BaseEntity {
@Excel(name = "状态")
protected String status;
+ /** 安装状态 */
+ @Excel(name = "安装状态")
+ protected String setupStatus;
+
+ /** apk版本 */
+ @Excel(name = "apk版本")
+ protected String apkVersion;
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmSkillPo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmSkillPo.java
index 5fe9ce2a..886ba4fe 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmSkillPo.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmSkillPo.java
@@ -1,16 +1,15 @@
package com.xueyi.system.api.digitalmans.domain.po;
-import com.xueyi.common.core.web.tenant.base.TBaseEntity;
-import com.xueyi.common.core.annotation.Excel;
import com.baomidou.mybatisplus.annotation.TableName;
+import com.xueyi.common.core.annotation.Excel;
+import com.xueyi.common.core.web.tenant.base.TBaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
-import static com.xueyi.common.core.constant.basic.EntityConstants.STATUS;
-import static com.xueyi.common.core.constant.basic.EntityConstants.SORT;
import static com.xueyi.common.core.constant.basic.EntityConstants.REMARK;
+import static com.xueyi.common.core.constant.basic.EntityConstants.SORT;
/**
* 访客 持久化对象
@@ -53,4 +52,6 @@ public class DmSkillPo extends TBaseEntity {
protected Integer firstCall;
+ protected String auth;
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmVisitRecordsPo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmVisitRecordsPo.java
index 7739bbe8..5a6ce2e2 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmVisitRecordsPo.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/po/DmVisitRecordsPo.java
@@ -27,6 +27,10 @@ public class DmVisitRecordsPo extends TBaseEntity {
@Serial
private static final long serialVersionUID = 1L;
+ public static final Integer STATUS_VISITING = 0;
+ public static final Integer STATUS_VISITED = 8;
+ public static final Integer STATUS_EXPIRED = 9;
+
/** 访客ID */
@Excel(name = "访客ID")
protected Long visitorId;
@@ -63,4 +67,17 @@ public class DmVisitRecordsPo extends TBaseEntity {
@Excel(name = "所属组织ID")
protected Long deptId;
+
+ protected String visitorCode;
+
+ private String receiverName;
+
+ private String receiverPhone;
+
+
+
+
+ public String toString(){
+ return new StringBuilder("VisitorId: ").append(visitorId).append(", UserId: ").append(userId).append(", VisitDate: ").append(visitDate).append(", VisitTime: ").append(visitTime).append(", Duration: ").append(duration).append(", RecordStatus: ").append(recordStatus).append(", DeptId: ").append(deptId).append(", Num: ").append(num).toString();
+ }
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DashboardVo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DashboardVo.java
new file mode 100644
index 00000000..24062244
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DashboardVo.java
@@ -0,0 +1,22 @@
+package com.xueyi.system.api.digitalmans.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+public class DashboardVo implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 数字人数
+ */
+ private Integer digitalMans;
+ private Integer onlineDevices;
+ private Integer AlertNear7Days;
+ private Integer onProcessAlert;
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DmBatchQuestionsVo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DmBatchQuestionsVo.java
new file mode 100644
index 00000000..e698729c
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DmBatchQuestionsVo.java
@@ -0,0 +1,14 @@
+package com.xueyi.system.api.digitalmans.domain.vo;
+
+import com.alibaba.fastjson2.JSONArray;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Data
+@NoArgsConstructor
+public class DmBatchQuestionsVo {
+ private Long knowledgeId;
+ private JSONArray questions;
+ private Long createId;
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DmBroadcastVo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DmBroadcastVo.java
new file mode 100644
index 00000000..fcc13325
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DmBroadcastVo.java
@@ -0,0 +1,16 @@
+package com.xueyi.system.api.digitalmans.domain.vo;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class DmBroadcastVo {
+ Integer recycle;
+ Integer speed;
+ Long id;
+ List resource;
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DmReceptionVo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DmReceptionVo.java
new file mode 100644
index 00000000..ac8f054e
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/DmReceptionVo.java
@@ -0,0 +1,27 @@
+package com.xueyi.system.api.digitalmans.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+@Data
+@NoArgsConstructor
+public class DmReceptionVo {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ private String name;
+
+ private String date;
+
+ private String welcome;
+
+ private Long[] guide;
+
+ private Long[] first;
+
+ private Long[] second;
+
+ private Long[] third;
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/NumberOfAlertToChartVo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/NumberOfAlertToChartVo.java
new file mode 100644
index 00000000..2ea3ec04
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/NumberOfAlertToChartVo.java
@@ -0,0 +1,21 @@
+package com.xueyi.system.api.digitalmans.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+public class NumberOfAlertToChartVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ private String numberOfAlert;
+
+
+ private String date;
+
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/NumberOfOnlineToChartVo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/NumberOfOnlineToChartVo.java
new file mode 100644
index 00000000..bec8f175
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/domain/vo/NumberOfOnlineToChartVo.java
@@ -0,0 +1,22 @@
+package com.xueyi.system.api.digitalmans.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+public class NumberOfOnlineToChartVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ private String numberOfOnline;
+
+ private Integer total;
+
+ private String date;
+
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteBroadcastService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteBroadcastService.java
new file mode 100644
index 00000000..524881d1
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteBroadcastService.java
@@ -0,0 +1,24 @@
+package com.xueyi.system.api.digitalmans.feign;
+
+import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.constant.basic.ServiceConstants;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.digitalmans.domain.vo.DmBroadcastVo;
+import com.xueyi.system.api.digitalmans.domain.vo.DmReceptionVo;
+import com.xueyi.system.api.organize.feign.factory.RemoteUserFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@FeignClient(contextId = "remoteBroadcastService", value = ServiceConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
+public interface RemoteBroadcastService {
+
+
+ @GetMapping("/broadcast/inner/list")
+ public R> innerlist(@RequestParam("manCode") String manCode,
+ @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteDigitalmanMqttService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteDigitalmanMqttService.java
new file mode 100644
index 00000000..0dc632d7
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteDigitalmanMqttService.java
@@ -0,0 +1,28 @@
+package com.xueyi.system.api.digitalmans.feign;
+
+import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.constant.basic.ServiceConstants;
+import com.xueyi.system.api.organize.feign.factory.RemoteUserFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+
+/**
+ * 一体机mqtt服务
+ *
+ * @author yk
+ */
+@FeignClient(contextId = "remoteDigitalmanMqttService", value = ServiceConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
+public interface RemoteDigitalmanMqttService {
+
+
+ @PostMapping("/man/api/mqtt/heartbeat")
+ public void heartbeat(@RequestBody(required = true) String message,@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+
+ @PostMapping("/man/api/mqtt/log-upload")
+ public void logUpload(@RequestBody(required = true) String message,@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteDigitalmanService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteDigitalmanService.java
index 1ebe2712..8d4f9ab3 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteDigitalmanService.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteDigitalmanService.java
@@ -1,17 +1,22 @@
package com.xueyi.system.api.digitalmans.feign;
+import com.alibaba.fastjson2.JSONObject;
import com.xueyi.common.core.constant.basic.SecurityConstants;
import com.xueyi.common.core.constant.basic.ServiceConstants;
import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto;
import com.xueyi.system.api.digitalmans.domain.dto.DmSyncDigitalmanDto;
import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanExtPo;
import com.xueyi.system.api.organize.feign.factory.RemoteUserFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
+import java.util.List;
+
/**
* 用户服务
*
@@ -35,6 +40,20 @@ public interface RemoteDigitalmanService {
public R initInner(@RequestParam(value = "snCode") String snCode,
@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
- @PostMapping("/man/inner/sync")
- public R sync(@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+ @PostMapping("/man/inner/update_device_online")
+ public R updateDeviceOnline(@RequestParam(value = "deviceId")String deviceId, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+ @PostMapping("/man/inner/sync_ext_isonline")
+ public R syncExtIsonline(@RequestBody List devices, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+
+ @GetMapping("/man/inner-api/devInfo/{devId}")
+ public R devInfo(@RequestParam(value = "devId") String devId, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+
+ @GetMapping("/man/api/mansInfo")
+ public R mansInfo();
+
+ @GetMapping("/man/delRecognizedRecords")
+ public R delRecognizedRecords(@RequestParam(value = "day") Integer days);
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteManDeviceService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteManDeviceService.java
index 641c9289..7d138971 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteManDeviceService.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteManDeviceService.java
@@ -29,7 +29,13 @@ public interface RemoteManDeviceService {
@GetMapping("/manDevice/inner/info/{devId}")
R manDeviceInfoInner(@RequestParam(value = "devId") String devId);
+ @PostMapping(value = "/manDevice/inner/sync")
+ R manDeviceListInnerSync(@RequestParam(value = "tenantId") Long tenantId);
+
@PutMapping(value = "/manDevice/inner/info")
R manDeviceInfoInnerUpdate(@RequestBody DmActiveVo vo);
+ @PostMapping(value = "/manDevice/inner/sync_numbers_of_online")
+ R syncNumbersOfOnline();
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteQuestionanswersService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteQuestionanswersService.java
new file mode 100644
index 00000000..4110c53c
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteQuestionanswersService.java
@@ -0,0 +1,22 @@
+package com.xueyi.system.api.digitalmans.feign;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.constant.basic.ServiceConstants;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.digitalmans.domain.vo.DmBatchQuestionsVo;
+import com.xueyi.system.api.digitalmans.domain.vo.DmReceptionVo;
+import com.xueyi.system.api.organize.feign.factory.RemoteUserFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+@FeignClient(contextId = "remoteQuestionanswersService", value = ServiceConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
+public interface RemoteQuestionanswersService {
+
+
+ @PostMapping("/questionanswers/inner/batch_insert")
+ @ResponseBody
+ public R batchInsertInner(@RequestBody DmBatchQuestionsVo dmBatchQuestionsVo,
+ @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteReceptionService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteReceptionService.java
new file mode 100644
index 00000000..fe7fd6a3
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/digitalmans/feign/RemoteReceptionService.java
@@ -0,0 +1,21 @@
+package com.xueyi.system.api.digitalmans.feign;
+
+import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.constant.basic.ServiceConstants;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.digitalmans.domain.vo.DmReceptionVo;
+import com.xueyi.system.api.organize.feign.factory.RemoteUserFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(contextId = "remoteReceptionService", value = ServiceConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
+public interface RemoteReceptionService {
+
+
+ @GetMapping("/reception/inner/get_reception_task")
+ public R getReceptionTaskInner(@RequestParam("manCode") String manCode,
+ @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/exception/domain/merge/MergeGroup.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/exception/domain/merge/MergeGroup.java
new file mode 100644
index 00000000..43a2ee19
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/exception/domain/merge/MergeGroup.java
@@ -0,0 +1,11 @@
+package com.xueyi.system.api.exception.domain.merge;
+
+public interface MergeGroup {
+
+ /** 设备日志关联 -》 日志 */
+ String LOG_DmDevice_GROUP = "LOG_DmDevice_GROUP";
+
+ /** 模块菜单关联 -》 菜单 */
+ String MENU_SysModule_GROUP = "MENU_SysModule_GROUP";
+
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/holiday/domain/vo/HolidayRspEntity.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/holiday/domain/vo/HolidayRspEntity.java
new file mode 100644
index 00000000..989f5d0d
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/holiday/domain/vo/HolidayRspEntity.java
@@ -0,0 +1,11 @@
+package com.xueyi.system.api.holiday.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class HolidayRspEntity {
+
+
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/holiday/feign/RemoteHolidayService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/holiday/feign/RemoteHolidayService.java
new file mode 100644
index 00000000..7a4fd791
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/holiday/feign/RemoteHolidayService.java
@@ -0,0 +1,24 @@
+package com.xueyi.system.api.holiday.feign;
+
+
+import com.alibaba.fastjson2.JSONObject;
+import com.xueyi.system.api.holiday.feign.factory.RemoteHolidayFallbackFactory;
+import com.xueyi.system.api.sms.domain.vo.SmsReqEntity;
+import com.xueyi.system.api.sms.feign.factory.RemoteSmsFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * 短信发送服务
+ *
+ * @author yrx
+ */
+@FeignClient(url = "${notification.holiday.url}",name = "holiday", fallbackFactory = RemoteHolidayFallbackFactory.class)
+public interface RemoteHolidayService {
+
+ @GetMapping("/api/holiday/year")
+ JSONObject getHolidays();
+
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/holiday/feign/factory/RemoteHolidayFallbackFactory.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/holiday/feign/factory/RemoteHolidayFallbackFactory.java
new file mode 100644
index 00000000..b4f13a7a
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/holiday/feign/factory/RemoteHolidayFallbackFactory.java
@@ -0,0 +1,30 @@
+package com.xueyi.system.api.holiday.feign.factory;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.holiday.feign.RemoteHolidayService;
+import com.xueyi.system.api.sms.domain.vo.SmsReqEntity;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 会议室服务 降级处理
+ *
+ * @author xueyi
+ */
+@Slf4j
+@Component
+public class RemoteHolidayFallbackFactory implements FallbackFactory {
+
+ @Override
+ public RemoteHolidayService create(Throwable throwable) {
+ log.error("短信服务调用失败:{}", throwable.getMessage());
+ return new RemoteHolidayService() {
+ @Override
+ public JSONObject getHolidays() {
+ return R.fail("工作日服务调用失败:" + throwable.getMessage()).toJson();
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/domain/dto/DmMeetingOrdersDto.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/domain/dto/DmMeetingOrdersDto.java
index 33f8f121..358a4581 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/domain/dto/DmMeetingOrdersDto.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/domain/dto/DmMeetingOrdersDto.java
@@ -33,4 +33,6 @@ public class DmMeetingOrdersDto extends DmMeetingOrdersPo {
private DmMeetingRoomsPo dmMeetingRoomsPo;
+ private String devId;
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/feign/RemoteMeetingService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/feign/RemoteMeetingService.java
index 820dd2ef..ecd3a434 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/feign/RemoteMeetingService.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/feign/RemoteMeetingService.java
@@ -9,10 +9,12 @@ import com.xueyi.system.api.meeting.domain.dto.DmMeetingRoomsDto;
import com.xueyi.system.api.meeting.feign.factory.RemoteMeetingFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@@ -41,7 +43,27 @@ public interface RemoteMeetingService {
@PostMapping(value = "/meeting/inner-api/lists")
JSONObject listsInner(@RequestParam("dateStr") String dateStr, @RequestParam("spaceId") Long spaceId, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+ @GetMapping(value = "/meeting/inner-api/lists")
+ JSONObject listsAllInner(@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
@PostMapping(value = "/meeting/inner-api/date-lists")
JSONObject listsByDate(@RequestParam("dateStr") String dateStr, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @PostMapping(value = "/meeting/inner-api/lists-all")
+ JSONObject listAllInner(@RequestParam("dateStr") String dateStr, @RequestParam("spaceId") Long spaceId, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @GetMapping("/meeting/inner-api/recent/{deptId}/{dateStr}")
+ @ResponseBody
+ public List recent(@PathVariable(value = "deptId") Long deptId, @PathVariable(value = "dateStr") String dateStr, @RequestParam(value = "roomId", required = false) Long roomId,@RequestParam(value = "startTime", required = false) String startTime, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source) ;
+
+ @GetMapping("/meeting/inner-api/recent/{deptId}")
+ @ResponseBody
+ public List recent(@PathVariable(value = "deptId") Long deptId, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source) ;
+
+ @GetMapping(value = "/meeting/api/recent/{devId}/{dateStr}")
+ R> ableOrderList(@PathVariable(value = "devId") String devId, @PathVariable(value = "dateStr",required = false) String dateStr, @RequestParam(value = "roomId", required = false) Long roomId, @RequestParam(value = "startTime", required = false) String startTime);
+
+ @GetMapping(value = "/meeting/inner-api/enableOrder/{roomId}/{dateStr}/{startTime}")
+ JSONObject queryExist(@PathVariable(name = "roomId") Long roomId, @PathVariable(name = "dateStr") String dateStr, @PathVariable(name = "startTime") String startTime, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/feign/factory/RemoteMeetingFallbackFactory.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/feign/factory/RemoteMeetingFallbackFactory.java
index 1c29702e..5e0c0b69 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/feign/factory/RemoteMeetingFallbackFactory.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/meeting/feign/factory/RemoteMeetingFallbackFactory.java
@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -33,9 +34,10 @@ public class RemoteMeetingFallbackFactory implements FallbackFactory recent(Long deptId, String dateStr, Long roomId, String startTime, Long enterpriseId, String sourceName, String source) {
+ List js = new ArrayList<>();
+ js.add(R.fail("获取会议室可预约列表失败:" + throwable.getMessage()).toJson());
+ return js;
+ }
+
+ @Override
+ public List recent(Long deptId, Long enterpriseId, String sourceName, String source) {
+ List js = new ArrayList<>();
+ js.add(R.fail("获取会议室可预约列表失败:" + throwable.getMessage()).toJson());
+ return js;
+ }
+
+ @Override
+ public R> ableOrderList(String devId, String dateStr, Long roomId, String startTime) {
+ return null;
+ }
+
+ @Override
+ public JSONObject queryExist(Long roomId, String dateStr, String startTime, Long enterpriseId, String sourceName, String source) {
+ return null;
+ }
};
}
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/dto/SysUserDto.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/dto/SysUserDto.java
index c9791b62..1b6ae47d 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/dto/SysUserDto.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/dto/SysUserDto.java
@@ -59,4 +59,12 @@ public class SysUserDto extends SysUserPo {
return StrUtil.equals(AuthorityConstants.UserType.ADMIN.getCode(), userType);
}
+ @Override
+ public String toString(){
+ return "User{" +
+ "id=" + id +
+ ", username='" + userName + '\'' +
+ ", nickName='" + nickName + '\'' +
+ ", phone='" + phone + '\'';
+ }
}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/po/SysUserPo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/po/SysUserPo.java
index 4b775f2e..c0562719 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/po/SysUserPo.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/po/SysUserPo.java
@@ -95,4 +95,12 @@ public class SysUserPo extends TBaseEntity {
protected LocalDateTime loginDate;
protected String dept;
+ @Override
+ public String toString(){
+ return "User{" +
+ "id=" + id +
+ ", username='" + userName + '\'' +
+ ", nickName='" + nickName + '\'' +
+ ", phone='" + phone + '\'';
+ }
}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/vo/SysDeptExt.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/vo/SysDeptExt.java
new file mode 100644
index 00000000..df1151c0
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/domain/vo/SysDeptExt.java
@@ -0,0 +1,26 @@
+package com.xueyi.system.api.organize.domain.vo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class SysDeptExt {
+
+
+ /** Id */
+ private Long deptId;
+
+ /** 上班打卡开始时间 */
+ private String onDutyHourStart;
+
+ /** 上班打卡结束时间 */
+ private String onDutyHourEnd;
+
+ /** 下班打卡开始时间 */
+ private String offDutyHourStart;
+
+ /** 下班打卡结束时间 */
+ private String offDutyHourEnd;
+
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/feign/RemoteEnterpriseService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/feign/RemoteEnterpriseService.java
new file mode 100644
index 00000000..caeed677
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/feign/RemoteEnterpriseService.java
@@ -0,0 +1,28 @@
+package com.xueyi.system.api.organize.feign;
+
+import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.constant.basic.ServiceConstants;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.organize.domain.dto.SysDeptDto;
+import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto;
+import com.xueyi.system.api.organize.feign.factory.RemoteDeptFallbackFactory;
+import com.xueyi.system.api.organize.feign.factory.RemoteEnterpriseFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 部门服务
+ *
+ * @author xueyi
+ */
+@FeignClient(contextId = "remoteEnterpriseService", value = ServiceConstants.SYSTEM_SERVICE, fallbackFactory = RemoteEnterpriseFallbackFactory.class)
+public interface RemoteEnterpriseService {
+
+ /**
+ * 新增部门
+ *
+ * @return 结果
+ */
+ @GetMapping("/enterprise/info")
+ R getInfo(@RequestParam(value = "enterpriseId") Long enterpriseId);
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/feign/factory/RemoteEnterpriseFallbackFactory.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/feign/factory/RemoteEnterpriseFallbackFactory.java
new file mode 100644
index 00000000..b3f645f8
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/organize/feign/factory/RemoteEnterpriseFallbackFactory.java
@@ -0,0 +1,31 @@
+package com.xueyi.system.api.organize.feign.factory;
+
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.organize.domain.dto.SysDeptDto;
+import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto;
+import com.xueyi.system.api.organize.feign.RemoteDeptService;
+import com.xueyi.system.api.organize.feign.RemoteEnterpriseService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 部门服务 降级处理
+ *
+ * @author xueyi
+ */
+@Slf4j
+@Component
+public class RemoteEnterpriseFallbackFactory implements FallbackFactory {
+
+ @Override
+ public RemoteEnterpriseService create(Throwable throwable) {
+ log.error("部门服务调用失败:{}", throwable.getMessage());
+ return new RemoteEnterpriseService() {
+ @Override
+ public R getInfo(Long enterpriseId) {
+ return R.fail("获取企业信息失败:" + throwable.getMessage());
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/dto/DmRecognizedMultiRecordsDto.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/dto/DmRecognizedMultiRecordsDto.java
new file mode 100644
index 00000000..5f188d8c
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/dto/DmRecognizedMultiRecordsDto.java
@@ -0,0 +1,32 @@
+package com.xueyi.system.api.pass.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 人员识别 数据传输对象
+ *
+ * @author xueyi
+ */
+@Data
+public class DmRecognizedMultiRecordsDto {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+
+ private String devId;
+
+ private BigDecimal timestamp;
+
+ private List records;
+
+ private String sign;
+
+ public final static Integer TYPE_STAFF = 1;
+ public final static Integer TYPE_STRANGER = 2;
+
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/dto/DmRecognizedRecordsDto.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/dto/DmRecognizedRecordsDto.java
index 3bafbf6f..698a1304 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/dto/DmRecognizedRecordsDto.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/dto/DmRecognizedRecordsDto.java
@@ -26,6 +26,6 @@ public class DmRecognizedRecordsDto extends DmRecognizedRecordsPo {
private String sign;
public final static Integer TYPE_STAFF = 1;
- public final static Integer TYPE_STRANGER = 2;
+ public final static Integer TYPE_STRANGER = 6;
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/po/DmRecognizedRecordsPo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/po/DmRecognizedRecordsPo.java
index 983ea1cb..13fb2655 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/po/DmRecognizedRecordsPo.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/domain/po/DmRecognizedRecordsPo.java
@@ -71,4 +71,6 @@ public class DmRecognizedRecordsPo extends TBaseEntity {
@Excel(name = "所属组织ID")
protected Long deptId;
+ protected Long resourceId;
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/feign/RemoteRecognizedRecordsService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/feign/RemoteRecognizedRecordsService.java
index d4ca8cb4..ff5798d7 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/feign/RemoteRecognizedRecordsService.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/feign/RemoteRecognizedRecordsService.java
@@ -4,12 +4,12 @@ import com.alibaba.fastjson2.JSONObject;
import com.xueyi.common.core.constant.basic.SecurityConstants;
import com.xueyi.common.core.constant.basic.ServiceConstants;
import com.xueyi.system.api.organize.feign.factory.RemotePostFallbackFactory;
+import com.xueyi.system.api.pass.domain.dto.DmRecognizedMultiRecordsDto;
import com.xueyi.system.api.pass.domain.dto.DmRecognizedRecordsDto;
import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RequestParam;
/**
* 用户服务
@@ -19,9 +19,12 @@ import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(contextId = "remoteRecognizedRecordsService", value = ServiceConstants.SYSTEM_SERVICE, fallbackFactory = RemotePostFallbackFactory.class)
public interface RemoteRecognizedRecordsService {
- @GetMapping("/pass/inner-api/upload-pass")
+ @PostMapping("/pass/inner-api/upload-pass")
JSONObject uploadPass(@RequestBody DmRecognizedRecordsDto recognizedRecordsDto, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+ @PostMapping("/pass/inner-api/upload-multi-pass")
+ JSONObject uploadMultiPass(@RequestBody DmRecognizedMultiRecordsDto recognizedMultiRecordsDto, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/feign/factory/RemotePassFallbackFactory.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/feign/factory/RemotePassFallbackFactory.java
index 99677e71..76a495e9 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/feign/factory/RemotePassFallbackFactory.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/pass/feign/factory/RemotePassFallbackFactory.java
@@ -2,6 +2,7 @@ package com.xueyi.system.api.pass.feign.factory;
import com.alibaba.fastjson2.JSONObject;
import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.pass.domain.dto.DmRecognizedMultiRecordsDto;
import com.xueyi.system.api.pass.domain.dto.DmRecognizedRecordsDto;
import com.xueyi.system.api.pass.feign.RemoteRecognizedRecordsService;
import lombok.extern.slf4j.Slf4j;
@@ -26,6 +27,11 @@ public class RemotePassFallbackFactory implements FallbackFactory syncH5Config(@RequestParam(value = "tId",required = false) String tId);
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/resource/feign/factory/RemoteH5ConfigFallbackFactory.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/resource/feign/factory/RemoteH5ConfigFallbackFactory.java
new file mode 100644
index 00000000..41bc73ba
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/resource/feign/factory/RemoteH5ConfigFallbackFactory.java
@@ -0,0 +1,21 @@
+package com.xueyi.system.api.resource.feign.factory;
+
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.resource.feign.RemoteH5ConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class RemoteH5ConfigFallbackFactory implements FallbackFactory {
+ @Override
+ public RemoteH5ConfigService create(Throwable cause) {
+ return new RemoteH5ConfigService() {
+ @Override
+ public R syncH5Config(String tId) {
+ return R.fail("同步配置文件失败");
+ }
+ };
+ }
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/sms/domain/vo/DingdingReqEntity.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/sms/domain/vo/DingdingReqEntity.java
new file mode 100644
index 00000000..cbedad3e
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/sms/domain/vo/DingdingReqEntity.java
@@ -0,0 +1,24 @@
+package com.xueyi.system.api.sms.domain.vo;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class DingdingReqEntity {
+ @NotBlank(message = "msgtype不能为空")
+ private String msgtype;
+
+ @NotBlank(message = "text不能为空")
+ private JSONObject text;
+
+
+ public JSONObject toJson(){
+ JSONObject json = new JSONObject(true);
+ json.put("msgtype", msgtype);
+ json.put("text", text);
+ return json;
+ }
+
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/sms/feign/RemoteDingdingService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/sms/feign/RemoteDingdingService.java
new file mode 100644
index 00000000..b6fcccb9
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/sms/feign/RemoteDingdingService.java
@@ -0,0 +1,25 @@
+package com.xueyi.system.api.sms.feign;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xueyi.system.api.sms.domain.vo.DingdingReqEntity;
+import com.xueyi.system.api.sms.domain.vo.SmsReqEntity;
+import com.xueyi.system.api.sms.feign.factory.RemoteDingdingFallbackFactory;
+import com.xueyi.system.api.sms.feign.factory.RemoteSmsFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * 短信发送服务
+ *
+ * @author yrx
+ */
+@FeignClient(url = "${notification.dingding.url}",name = "dingding", fallbackFactory = RemoteDingdingFallbackFactory.class)
+public interface RemoteDingdingService {
+
+ @PostMapping("/robot/send")
+ JSONObject send(@RequestParam(value = "access_token")String token, @RequestBody DingdingReqEntity smsReqEntity);
+
+
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/sms/feign/factory/RemoteDingdingFallbackFactory.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/sms/feign/factory/RemoteDingdingFallbackFactory.java
new file mode 100644
index 00000000..90552fbf
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/sms/feign/factory/RemoteDingdingFallbackFactory.java
@@ -0,0 +1,33 @@
+package com.xueyi.system.api.sms.feign.factory;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.system.api.sms.domain.vo.DingdingReqEntity;
+import com.xueyi.system.api.sms.domain.vo.SmsReqEntity;
+import com.xueyi.system.api.sms.feign.RemoteDingdingService;
+import com.xueyi.system.api.sms.feign.RemoteSmsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 会议室服务 降级处理
+ *
+ * @author xueyi
+ */
+@Slf4j
+@Component
+public class RemoteDingdingFallbackFactory implements FallbackFactory {
+
+ @Override
+ public RemoteDingdingService create(Throwable throwable) {
+ log.error("短信服务调用失败:{}", throwable.getMessage());
+ return new RemoteDingdingService() {
+ @Override
+ public JSONObject send(String token, DingdingReqEntity smsReqEntity) {
+ return R.fail("钉钉服务调用失败:" + throwable.getMessage()).toJson1();
+ }
+
+ };
+ }
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/dto/DmStaffCommonDto.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/dto/DmStaffCommonDto.java
new file mode 100644
index 00000000..a12068d2
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/dto/DmStaffCommonDto.java
@@ -0,0 +1,36 @@
+package com.xueyi.system.api.staff.domain.dto;
+
+import lombok.Data;
+
+/**
+ * 熟人介绍的生人数据的 数据传输对象
+ *
+ * @author xueyi
+ */
+@Data
+public class DmStaffCommonDto {
+
+ public static final String TYPE_STRANGER = "6";
+ public static final String TYPE_VIP_STRANGER = "9";
+ private String staffName;
+
+ protected String staffType;
+
+ protected Integer gender;
+
+ private String staffBase64Img;
+
+ private String devId;
+
+
+ @Override
+ public String toString() {
+ return
+ "staffName:" + staffName +
+ "\nstaffType:" + staffType +
+ "\nstaffBase64Img:" + staffBase64Img +
+ "\ndevId:" + devId +
+ "\n";
+ }
+
+}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/dto/DmVisitCommonDto.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/dto/DmVisitCommonDto.java
index 46583ad4..240455b0 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/dto/DmVisitCommonDto.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/dto/DmVisitCommonDto.java
@@ -30,6 +30,10 @@ public class DmVisitCommonDto {
private String reason;
+ private Long recordId;
+
+ private String visitorBase64Img;
+
@Override
public String toString() {
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/po/DmStaffPo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/po/DmStaffPo.java
index c74a4f77..8883a294 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/po/DmStaffPo.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/po/DmStaffPo.java
@@ -87,4 +87,12 @@ public class DmStaffPo extends TBaseEntity {
@Excel(name = "所属组织ID")
protected Long resourceId;
+ /** 生日日期 */
+ @Excel(name = "生日日期")
+ protected Date birthDate;
+
+ /** 入职日期 */
+ @Excel(name = "入职日期")
+ protected Date hireDate;
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/vo/DmStaffFeature.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/vo/DmStaffFeature.java
index f809c5c7..410a6f5d 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/vo/DmStaffFeature.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/domain/vo/DmStaffFeature.java
@@ -1,8 +1,11 @@
package com.xueyi.system.api.staff.domain.vo;
+import cn.hutool.core.date.DateTime;
import lombok.Data;
import lombok.NoArgsConstructor;
+import net.sf.jsqlparser.expression.DateTimeLiteralExpression;
+import java.time.LocalDateTime;
import java.util.List;
@Data
@@ -14,6 +17,7 @@ public class DmStaffFeature {
private String typeId;
private String nickName;
private int isDel;
+ private LocalDateTime syncTime;
private String feature;
private List dFeatures;
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/feign/RemoteStaffService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/feign/RemoteStaffService.java
index abb5d57f..00ac218c 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/feign/RemoteStaffService.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/feign/RemoteStaffService.java
@@ -1,15 +1,20 @@
package com.xueyi.system.api.staff.feign;
+import com.alibaba.fastjson2.JSONObject;
import com.xueyi.common.core.constant.basic.SecurityConstants;
import com.xueyi.common.core.constant.basic.ServiceConstants;
-import com.xueyi.common.core.web.result.AjaxResult;
import com.xueyi.common.core.web.result.R;
import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto;
import com.xueyi.system.api.organize.feign.factory.RemoteUserFallbackFactory;
-import com.xueyi.system.api.staff.domain.po.DmStaffPo;
+import com.xueyi.system.api.staff.domain.dto.DmStaffCommonDto;
import com.xueyi.system.api.staff.domain.vo.DmStaffFeature;
import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@@ -21,19 +26,18 @@ import java.util.List;
@FeignClient(contextId = "remoteStaffService", value = ServiceConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteStaffService {
- /**
- * 新增用户
- *
- * @param user 用户对象
- * @param enterpriseId 企业Id
- * @param sourceName 策略源
- * @param source 请求来源
- * @return 结果
- */
@GetMapping("/staff/inner/{devId}/{timestamp}")
R> listInner(@RequestParam(value = "devId") String devId, @RequestParam(value = "timestamp") String timestamp,
@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+ @GetMapping("/staff/inner-api/selectOne/{staffId}")
+ JSONObject fetchStaff(@RequestParam(value = "staffId") String staffId, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
@GetMapping("/staff/inner/tenantId/{enterpriseName}")
public R tenantIdInner(@RequestParam(value = "enterpriseName") String enterpriseName) ;
+
+ @PostMapping(value = "/staff/inner-api/new-staff")
+ @ResponseBody
+ public com.alibaba.fastjson2.JSONObject addStaff(@RequestBody DmStaffCommonDto commonDto,@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/feign/RemoteVisitorService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/feign/RemoteVisitorService.java
index 12c82fe1..4aca79ae 100644
--- a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/feign/RemoteVisitorService.java
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/staff/feign/RemoteVisitorService.java
@@ -6,6 +6,7 @@ import com.xueyi.common.core.constant.basic.ServiceConstants;
import com.xueyi.system.api.organize.feign.factory.RemoteUserFallbackFactory;
import com.xueyi.system.api.staff.domain.dto.DmVisitCommonDto;
import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -13,7 +14,7 @@ import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
/**
- * 用户服务
+ * 访客服务
*
* @author yrx
*/
@@ -29,10 +30,24 @@ public interface RemoteVisitorService {
public JSONObject newVisit(@RequestBody DmVisitCommonDto commonDto,
@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+ @DeleteMapping(value = "/visit/inner-api/del-visitor")
+ public JSONObject delVisit(@RequestBody DmVisitCommonDto commonDto,
+ @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+ @GetMapping(value = "/visit/inner-api/sms-config")
+ public JSONObject smsConfig(@RequestParam(value = "devId") String devId, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
@GetMapping(value = "/visit/inner-api/list")
public JSONObject visitList(@RequestParam(value = "empId") Long empId,
@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+ @GetMapping(value = "/visit/inner-api/list-all")
+ public JSONObject visitListAll(@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
@PostMapping(value = "/visit/inner-api/send-sms")
public JSONObject sendSms(@RequestParam(value = "type") Integer type, @RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+
+ @GetMapping(value = "/visit/inner-api/sms-users")
+ public JSONObject smsUserConfig(@RequestHeader(SecurityConstants.ENTERPRISE_ID) Long enterpriseId, @RequestHeader(SecurityConstants.SOURCE_NAME) String sourceName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
}
\ No newline at end of file
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/version/domain/vo/ApkDeployNotifyVo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/version/domain/vo/ApkDeployNotifyVo.java
new file mode 100644
index 00000000..b27f822b
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/version/domain/vo/ApkDeployNotifyVo.java
@@ -0,0 +1,18 @@
+package com.xueyi.system.api.version.domain.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+public class ApkDeployNotifyVo {
+ private String apkVersionName;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime releaseTime;
+ private String path;
+ private LocalDateTime setupTime;
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/version/domain/vo/ApkReleaseVo.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/version/domain/vo/ApkReleaseVo.java
new file mode 100644
index 00000000..1815977e
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/version/domain/vo/ApkReleaseVo.java
@@ -0,0 +1,19 @@
+package com.xueyi.system.api.version.domain.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+public class ApkReleaseVo {
+ private String apkVersionName;
+ private String CodeVersionName;
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime releaseTime;
+ private String path;
+ private String comment;
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/version/feign/RemoteReleaseManagerService.java b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/version/feign/RemoteReleaseManagerService.java
new file mode 100644
index 00000000..d77c478c
--- /dev/null
+++ b/xueyi-api/xueyi-api-system/src/main/java/com/xueyi/system/api/version/feign/RemoteReleaseManagerService.java
@@ -0,0 +1,17 @@
+package com.xueyi.system.api.version.feign;
+
+import com.xueyi.common.core.constant.basic.ServiceConstants;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.message.api.transfer.domain.vo.DmDeployScheduleVo;
+import com.xueyi.system.api.organize.feign.factory.RemoteUserFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+@FeignClient(contextId = "remoteReleaseManagerService", value = ServiceConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
+public interface RemoteReleaseManagerService {
+
+ @PostMapping("/releaseManager/inner/reply")
+ R syncDeployStatus(@RequestBody DmDeployScheduleVo vo);
+}
diff --git a/xueyi-api/xueyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xueyi-api/xueyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 75b8f3ac..fe929e97 100644
--- a/xueyi-api/xueyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/xueyi-api/xueyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,8 +1,11 @@
com.xueyi.system.api.organize.feign.factory.RemoteDeptFallbackFactory
com.xueyi.system.api.organize.feign.factory.RemotePostFallbackFactory
com.xueyi.system.api.organize.feign.factory.RemoteUserFallbackFactory
+com.xueyi.system.api.organize.feign.factory.RemoteEnterpriseFallbackFactory
com.xueyi.system.api.authority.feign.factory.RemoteLoginFallbackFactory
com.xueyi.system.api.authority.feign.factory.RemoteMenuFallbackFactory
com.xueyi.system.api.authority.feign.factory.RemoteAuthFallbackFactory
com.xueyi.system.api.dict.feign.factory.RemoteConfigFallbackFactory
com.xueyi.system.api.log.feign.factory.RemoteLogFallbackFactory
+com.xueyi.system.api.meeting.feign.factory.RemoteMeetingFallbackFactory
+com.xueyi.system.api.resource.feign.factory.RemoteH5ConfigFallbackFactory
diff --git a/xueyi-api/xueyi-api-system/xueyi-api-system.iml b/xueyi-api/xueyi-api-system/xueyi-api-system.iml
deleted file mode 100644
index 54137521..00000000
--- a/xueyi-api/xueyi-api-system/xueyi-api-system.iml
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/xueyi-auth/Dockerfile b/xueyi-auth/Dockerfile
index 619323ea..9177a0fd 100644
--- a/xueyi-auth/Dockerfile
+++ b/xueyi-auth/Dockerfile
@@ -7,6 +7,7 @@ MAINTAINER xueyi
VOLUME /home/xueyi
# 创建目录
RUN mkdir -p /home/xueyi
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 指定路径
WORKDIR /home/xueyi
# 复制jar文件到路径
diff --git a/xueyi-auth/pom.xml b/xueyi-auth/pom.xml
index 66ba9c04..4a85bc1b 100644
--- a/xueyi-auth/pom.xml
+++ b/xueyi-auth/pom.xml
@@ -68,7 +68,21 @@
+
+ maven-resources-plugin
+ org.apache.maven.plugins
+
+ @
+ false
+
+
+
+
+ src/main/resources
+ true
+
+
diff --git a/xueyi-auth/src/main/resources/bootstrap.yml b/xueyi-auth/src/main/resources/bootstrap.yml
index 7b0eb8cc..210b0477 100644
--- a/xueyi-auth/src/main/resources/bootstrap.yml
+++ b/xueyi-auth/src/main/resources/bootstrap.yml
@@ -9,18 +9,21 @@ spring:
name: xueyi-auth
profiles:
# 环境配置
- active: dev
+ active: @activatedProperties@
cloud:
nacos:
discovery:
# 服务注册地址
- server-addr: 172.17.0.1:18848
+ server-addr: @nacos.host@:@nacos.port@
+ namespace: @nacos.namespace@
config:
# 配置中心地址
- server-addr: 172.17.0.1:18848
+ server-addr: @nacos.host@:@nacos.port@
+ namespace: @nacos.namespace@
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
- application-secret-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ - application-datasource-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
diff --git a/xueyi-common/pom.xml b/xueyi-common/pom.xml
index 59b3db18..2746b2b1 100644
--- a/xueyi-common/pom.xml
+++ b/xueyi-common/pom.xml
@@ -20,6 +20,7 @@
xueyi-common-datascope
xueyi-common-datasource
xueyi-common-sms
+ xueyi-common-mqtt
xueyi-common
diff --git a/xueyi-common/xueyi-common-core/pom.xml b/xueyi-common/xueyi-common-core/pom.xml
index a3a89b1f..030dae73 100644
--- a/xueyi-common/xueyi-common-core/pom.xml
+++ b/xueyi-common/xueyi-common-core/pom.xml
@@ -77,6 +77,12 @@
jackson-databind
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ 2.13.0
+
+
com.alibaba.fastjson2
@@ -149,6 +155,13 @@
hutool-crypto
+
+ co.elastic.clients
+ elasticsearch-java
+ 8.3.3
+
+
+
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/basic/ServiceConstants.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/basic/ServiceConstants.java
index 5c1b6c30..3c4ef333 100644
--- a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/basic/ServiceConstants.java
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/basic/ServiceConstants.java
@@ -25,6 +25,9 @@ public class ServiceConstants {
/** 系统模块的serviceId */
public static final String MESSAGE_SERVICE = "xueyi-message";
+ public static final String MODULES_AUTH_SERVICE = "xueyi-modules-auth";
+ public static final String NLT_SERVICE = "xueyi-nlt";
+
/** 定时任务模块的serviceId */
public static final String JOB_SERVICE = "xueyi-job";
/** 定时任务模块的serviceId */
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/InitConstants.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/InitConstants.java
index 27f8b5e3..c6272a8d 100644
--- a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/InitConstants.java
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/InitConstants.java
@@ -11,9 +11,9 @@ public class InitConstants {
public static final String DEFAULT_NAME = "小智";
public static final Integer DEFAULT_CLOTH = 1;
- public static final String DEFAULT_CLOTH_URL = "http://39.107.77.235:9000/dgmeta/init_digital_mans/cloth/default_cloth.jpg";
+ public static final String DEFAULT_CLOTH_URL = "http://39.107.77.235:9000/dgmeta/init_digital_mans/cloth/default_cloth_vi.png";
public static final Integer DEFAULT_MODEL = 1;
- public static final String DEFAULT_MODEL_URL = "http://39.107.77.235:9000/dgmeta/init_digital_mans/model/default_model2.jpg";
+ public static final String DEFAULT_MODEL_URL = "http://39.107.77.235:9000/dgmeta/init_digital_mans/model/default_model_v1.png";
public static final Long DEFAULT_BACKGROUND_ID = 749L;
public static final String DEFAULT_BACKGROUND_URL = "http://39.107.77.235:9000/dgmeta/init_digital_mans/background/default_background.jpg";
@@ -23,6 +23,8 @@ public class InitConstants {
public static final Long DEFAULT_SCREEN_OFF_ID = 1L;
+ public static final String[] DEFAULT_BACKGROUND_URLs =
+ new String[]{"http://39.107.77.235:9000/dgmeta/init_digital_mans/background/default_background.jpg"};
public static final String[] DEFAULT_SCREEN_OFF_URLs =
new String[]{"http://39.107.77.235:9000/dgmeta/init_digital_mans/screenoff/01.jpeg","http://39.107.77.235:9000/dgmeta/init_digital_mans/screenoff/02.jpg"
,"http://39.107.77.235:9000/dgmeta/init_digital_mans/screenoff/03.jpg","http://39.107.77.235:9000/dgmeta/init_digital_mans/screenoff/04.jpg","http://39.107.77.235:9000/dgmeta/init_digital_mans/screenoff/05.jpg"};
@@ -38,5 +40,7 @@ public class InitConstants {
public static final String DEVICE_ACTIVATE_STATUS_NOT_ACTIVATE = "0";
public static final String DEVICE_ACTIVATE_STATUS_ONLINE = "1";
public static final String DEVICE_ACTIVATE_STATUS_OFFLINE = "2";
+ public static final String DEVICE_ACTIVATE_STATUS_APP_RESTART = "3";
+ public static final String DEVICE_ACTIVATE_STATUS_DEVICE_REBOOT = "4";
}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/MessageConstants.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/MessageConstants.java
index 6f739344..134f73b8 100644
--- a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/MessageConstants.java
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/MessageConstants.java
@@ -16,12 +16,66 @@ public class MessageConstants {
/** 数字人同步 */
public static final Long MODEL_SYNC = 2L;
+ public static final Long H5_CONFIG_SYNC = 4L;
+
+ /** 数字人场景 */
+ public static final String MODE_WORK = "1"; // 工作模式
+ public static final String MODE_RECEPTION = "2"; // 接待模式
+ public static final String MODE_FREE_CHAT = "3"; // 闲聊模式
+
/** 缓存数据头 */
public static final String REDIS_GROUP_HEADER = "group:dgman:";
public static final String REDIS_GROUP_DEVICE_HEADER = "group:dgman:device:";
public static final String MSG_MAN_ACTIVATE_MANCODE_ERROR = "激活码输入错误,请重新输入。";
+ public static final Integer SYS_DICT_DATA_RELEASE_UPDATING = 0;
+ public static final Integer SYS_DICT_DATA_RELEASE_DOWNLOAD_SUC = 1;
+ public static final Integer SYS_DICT_DATA_RELEASE_DOWNLOADING = 2;
+ public static final Integer SYS_DICT_DATA_RELEASE_START_DOWNLOAD = 3;
+ public static final Integer SYS_DICT_DATA_RELEASE_UPDATE_REQUEST_PASSED = 4;
+ public static final Integer SYS_DICT_DATA_RELEASE_USING = 5;
+ public static final Integer SYS_DICT_DATA_RELEASE_UPDATE_FAILED = 6;
+ public static final Integer SYS_DICT_DATA_RELEASE_UPDATE_UPDATING = 7;
+ public static final Integer SYS_DICT_DATA_RESTART_DEVICE = 0;
+ public static final Integer SYS_DICT_DATA_RESTART_APP = 1;
+ public static final Integer SYS_DICT_DATA_SPLITED = 1;
+
+ public enum RestartEnum {
+ RESTART_DEVICE(0, "重启设备"),
+ RESTART_APP(1, "重启应用");
+
+ private final Integer code;
+ private final String info;
+
+ RestartEnum(Integer code, String info) {
+ this.code = code;
+ this.info = info;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public String getInfo() {
+ return info;
+ }
+ /**
+ * 提前判断,用于解决
+ * Case中出现的Constant expression required
+ *
+ * @param value
+ * @return
+ */
+ public static RestartEnum getEnum(Integer value) {
+ for (RestartEnum e : RestartEnum.values()) {
+ if (e.getCode().equals(value)) {
+ return e;
+ }
+ }
+ return null;
+ }
+ }
}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/RedisDefinitionConstants.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/RedisDefinitionConstants.java
new file mode 100644
index 00000000..c0494c87
--- /dev/null
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/RedisDefinitionConstants.java
@@ -0,0 +1,7 @@
+package com.xueyi.common.core.constant.digitalman;
+
+public class RedisDefinitionConstants {
+
+ /** 通用-当前在线数(List) */
+ public static final String GENERAL_CURRENT_NUMBER_OF_ONLINE = "general:current_number_of_online";
+}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/SkillConstants.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/SkillConstants.java
new file mode 100644
index 00000000..28903111
--- /dev/null
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/digitalman/SkillConstants.java
@@ -0,0 +1,29 @@
+package com.xueyi.common.core.constant.digitalman;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 技能配置通用常量
+ *
+ * @author yinruoxi
+ */
+public class SkillConstants {
+
+ /** 技能配置 */
+ @Getter
+ @AllArgsConstructor
+ public enum SkillType {
+ GENERATION("0", "通用问答"),
+ BOOK_MEETING_ROOM("1", "会议室预定"),
+ CREATE_VISITOR_INFO("2", "访客预约登记"),
+ REGISTER_VISITOR("3", "访客到访登记"),
+ INTRODUCE_STRANGER("24", "熟人介绍生人"),
+ BROADCAST_DISPLAY("25", "播报展示"),
+ OPEN_DOOR("26", "开门");
+
+ private final String code;
+ private final String info;
+
+ }
+}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/nacos/NacosConstants.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/nacos/NacosConstants.java
new file mode 100644
index 00000000..4dc529fa
--- /dev/null
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/constant/nacos/NacosConstants.java
@@ -0,0 +1,6 @@
+package com.xueyi.common.core.constant.nacos;
+
+public class NacosConstants {
+ public static final String DEFAULT_CONFIG_PATH = "config.json";
+ public static final String DEFAULT_GROUP = "DEFAULT_GROUP";
+}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/DateUtil.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/DateUtil.java
index 601f6b3b..46989d32 100644
--- a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/DateUtil.java
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/DateUtil.java
@@ -5,7 +5,12 @@ import org.apache.commons.lang3.time.DateFormatUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
-import java.time.*;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
@@ -25,11 +30,14 @@ public class DateUtil extends org.apache.commons.lang3.time.DateUtils {
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+
private static final String[] parsePatterns = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+ public static final DateTimeFormatter DEFAULT_DATETIME_PATTERN = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
/**
* 获取当前Date型日期
*
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/InetAddressUtils.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/InetAddressUtils.java
new file mode 100644
index 00000000..7b5f7c8f
--- /dev/null
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/InetAddressUtils.java
@@ -0,0 +1,54 @@
+package com.xueyi.common.core.utils;
+
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.UnknownHostException;
+import java.util.Enumeration;
+
+/**
+ * @author yinruoxi
+ * @version V1.0
+ * @className InetAddressUtils
+ * @description TO DO
+ * @Date 2023/8/10 14:19 PM
+ */
+public class InetAddressUtils {
+
+ public static InetAddress getLocalHostLANAddress() throws UnknownHostException {
+ try {
+ InetAddress candidateAddress = null;
+ // 遍历所有的网络接口
+ for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements();) {
+ NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
+ // 在所有的接口下再遍历IP
+ for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) {
+ InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
+ if (!inetAddr.isLoopbackAddress()) {// 排除loopback类型地址
+ if (inetAddr.isSiteLocalAddress()) {
+ // 如果是site-local地址,就是它了
+ return inetAddr;
+ } else if (candidateAddress == null) {
+ // site-local类型的地址未被发现,先记录候选地址
+ candidateAddress = inetAddr;
+ }
+ }
+ }
+ }
+ if (candidateAddress != null) {
+ return candidateAddress;
+ }
+ // 如果没有发现 non-loopback地址.只能用最次选的方案
+ InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
+ if (jdkSuppliedAddress == null) {
+ throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null.");
+ }
+ return jdkSuppliedAddress;
+ } catch (Exception e) {
+ UnknownHostException unknownHostException = new UnknownHostException(
+ "Failed to determine LAN address: " + e);
+ unknownHostException.initCause(e);
+ throw unknownHostException;
+ }
+ }
+}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/core/SpringUtils.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/core/SpringUtils.java
new file mode 100644
index 00000000..dea751c2
--- /dev/null
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/core/SpringUtils.java
@@ -0,0 +1,135 @@
+package com.xueyi.common.core.utils.core;
+
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+public class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware {
+
+ /** Spring应用上下文环境 */
+ private static ConfigurableListableBeanFactory beanFactory;
+
+ private static ApplicationContext applicationContext;
+
+ public static Map getBeansByAnnotation(Class clsName) throws BeansException{
+
+ return beanFactory.getBeansWithAnnotation(clsName);
+ }
+
+ @Override
+ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+ SpringUtils.beanFactory = beanFactory;
+ }
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ SpringUtils.applicationContext = applicationContext;
+ }
+
+ /**
+ * 获取对象
+ *
+ * @param name
+ * @return Object 一个以所给名字注册的bean的实例
+ * @throws org.springframework.beans.BeansException
+ *
+ */
+ @SuppressWarnings("unchecked")
+ public static T getBean(String name) throws BeansException
+ {
+ return (T) beanFactory.getBean(name);
+ }
+
+ /**
+ * 获取类型为requiredType的对象
+ *
+ * @param clz
+ * @return
+ * @throws org.springframework.beans.BeansException
+ *
+ */
+ public static T getBean(Class clz) throws BeansException
+ {
+ T result = (T) beanFactory.getBean(clz);
+ return result;
+ }
+
+ /**
+ * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
+ *
+ * @param name
+ * @return boolean
+ */
+ public static boolean containsBean(String name)
+ {
+ return beanFactory.containsBean(name);
+ }
+
+ /**
+ * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
+ *
+ * @param name
+ * @return boolean
+ * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
+ *
+ */
+ public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
+ {
+ return beanFactory.isSingleton(name);
+ }
+
+ /**
+ * @param name
+ * @return Class 注册对象的类型
+ * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
+ *
+ */
+ public static Class> getType(String name) throws NoSuchBeanDefinitionException
+ {
+ return beanFactory.getType(name);
+ }
+
+ /**
+ * 如果给定的bean名字在bean定义中有别名,则返回这些别名
+ *
+ * @param name
+ * @return
+ * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
+ *
+ */
+ public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
+ {
+ return beanFactory.getAliases(name);
+ }
+
+ /**
+ * 获取aop代理对象
+ *
+ * @param invoker
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ public static T getAopProxy(T invoker)
+ {
+ return (T) AopContext.currentProxy();
+ }
+
+ /**
+ * 获取当前的环境配置,无配置返回null
+ *
+ * @return 当前的环境配置
+ */
+ public static String[] getActiveProfiles()
+ {
+ return applicationContext.getEnvironment().getActiveProfiles();
+ }
+
+}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/core/StrUtil.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/core/StrUtil.java
index 9678d68d..2be8c7dc 100644
--- a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/core/StrUtil.java
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/core/StrUtil.java
@@ -167,4 +167,27 @@ public class StrUtil extends cn.hutool.core.util.StrUtil implements StrPool {
return matcher.match(pattern, url);
}
+ /**
+ * @Author yangkai
+ * @Description 驼峰转下划线形式,如 helloWorldTest->hello_world_test
+ * @Date 2023/9/4
+ * @Param
+ * @return
+ **/
+ public static String camelCaseToUnderscore(String input) {
+ StringBuilder result = new StringBuilder();
+ for (int i = 0; i < input.length(); i++) {
+ char currentChar = input.charAt(i);
+ if (Character.isUpperCase(currentChar)) {
+ if (i > 0) {
+ result.append("_");
+ }
+ result.append(Character.toLowerCase(currentChar));
+ } else {
+ result.append(currentChar);
+ }
+ }
+ return result.toString();
+ }
+
}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/file/MimeTypeUtil.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/file/MimeTypeUtil.java
index 70fd16c9..b891493d 100644
--- a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/file/MimeTypeUtil.java
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/file/MimeTypeUtil.java
@@ -24,7 +24,7 @@ public class MimeTypeUtil {
public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
"asf", "rm", "rmvb"};
- public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb"};
+ public static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb", "webm"};
public static final String[] DEFAULT_ALLOWED_EXTENSION = {
// 图片
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/sql/EsClient.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/sql/EsClient.java
new file mode 100644
index 00000000..1f863f96
--- /dev/null
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/sql/EsClient.java
@@ -0,0 +1,40 @@
+package com.xueyi.common.core.utils.sql;
+
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.json.jackson.JacksonJsonpMapper;
+import co.elastic.clients.transport.ElasticsearchTransport;
+import co.elastic.clients.transport.rest_client.RestClientTransport;
+import lombok.Data;
+import org.apache.http.HttpHost;
+import org.elasticsearch.client.RestClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author yk
+ * @description
+ * @date 2023-08-29 15:55
+ */
+@Data
+@Configuration
+public class EsClient {
+ @Value("${spring.elasticsearch.host}")
+ public String esHost;
+
+ @Value("${spring.elasticsearch.port}")
+ public String esPort;
+
+
+ @Bean
+ public ElasticsearchClient getEsClient() {
+ RestClient restClient = RestClient.builder(
+ new HttpHost(esHost, Integer.valueOf(esPort))).build();
+
+ ElasticsearchTransport transport = new RestClientTransport(
+ restClient, new JacksonJsonpMapper());
+ ElasticsearchClient client = new ElasticsearchClient(transport);
+ return client;
+ }
+
+}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/time/LocalDateTimeSerializer.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/time/LocalDateTimeSerializer.java
new file mode 100644
index 00000000..5d79e666
--- /dev/null
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/time/LocalDateTimeSerializer.java
@@ -0,0 +1,30 @@
+package com.xueyi.common.core.utils.time;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.xueyi.common.core.utils.DateUtil;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeParseException;
+
+/**
+ * @author yk
+ * @description
+ * @date 2023-08-26 16:19
+ */
+public class LocalDateTimeSerializer extends JsonSerializer {
+
+ @Override
+ public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider)
+ throws IOException {
+ try {
+ String s = value.format(DateUtil.DEFAULT_DATETIME_PATTERN);
+ gen.writeString(s);
+ } catch (DateTimeParseException e) {
+ System.err.println(e);
+ gen.writeString("");
+ }
+ }
+}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/time/LocalDatetimeDeserializer.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/time/LocalDatetimeDeserializer.java
new file mode 100644
index 00000000..d463613b
--- /dev/null
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/utils/time/LocalDatetimeDeserializer.java
@@ -0,0 +1,30 @@
+package com.xueyi.common.core.utils.time;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.xueyi.common.core.utils.DateUtil;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeParseException;
+
+/**
+ * @author yk
+ * @description
+ * @date 2023-08-26 16:05
+ */
+public class LocalDatetimeDeserializer extends JsonDeserializer {
+
+ @Override
+ public LocalDateTime deserialize(JsonParser p, DeserializationContext ctx)
+ throws IOException {
+ String str = p.getText();
+ try {
+ return LocalDateTime.parse(str, DateUtil.DEFAULT_DATETIME_PATTERN);
+ } catch (DateTimeParseException e) {
+ System.err.println(e);
+ return null;
+ }
+ }
+}
diff --git a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/web/entity/base/BaseEntity.java b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/web/entity/base/BaseEntity.java
index 3802a93e..60b60bf1 100644
--- a/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/web/entity/base/BaseEntity.java
+++ b/xueyi-common/xueyi-common-core/src/main/java/com/xueyi/common/core/web/entity/base/BaseEntity.java
@@ -1,8 +1,16 @@
package com.xueyi.common.core.web.entity.base;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.OrderBy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.xueyi.common.core.utils.time.LocalDateTimeSerializer;
+import com.xueyi.common.core.utils.time.LocalDatetimeDeserializer;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -46,6 +54,8 @@ public class BaseEntity extends BasisEntity {
@OrderBy(sort = 20)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
+ @JsonDeserialize(using = LocalDatetimeDeserializer.class) // 反序列化
+ @JsonSerialize(using = LocalDateTimeSerializer.class)
protected LocalDateTime createTime;
/** 更新者Id */
@@ -55,6 +65,8 @@ public class BaseEntity extends BasisEntity {
/** 更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
+ @JsonDeserialize(using = LocalDatetimeDeserializer.class) // 反序列化
+ @JsonSerialize(using = LocalDateTimeSerializer.class)
protected LocalDateTime updateTime;
/** 删除标志 */
diff --git a/xueyi-common/xueyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xueyi-common/xueyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 8fb0d769..3b672294 100644
--- a/xueyi-common/xueyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/xueyi-common/xueyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1 +1,3 @@
-com.xueyi.common.core.utils.core.SpringUtil
\ No newline at end of file
+com.xueyi.common.core.utils.core.SpringUtil
+com.xueyi.common.core.utils.core.SpringUtils
+com.xueyi.common.core.utils.sql.EsClient
\ No newline at end of file
diff --git a/xueyi-common/xueyi-common-mqtt/pom.xml b/xueyi-common/xueyi-common-mqtt/pom.xml
new file mode 100644
index 00000000..3e61f490
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/pom.xml
@@ -0,0 +1,47 @@
+
+
+
+ com.xueyi
+ xueyi-common
+ 2.5.0
+
+ 4.0.0
+
+ xueyi-common-mqtt
+
+
+ xueyi-common-mqtt通信服务
+
+
+
+
+
+
+ org.eclipse.paho
+ org.eclipse.paho.client.mqttv3
+ 1.2.5
+
+
+
+
+ org.springframework.integration
+ spring-integration-mqtt
+ 6.1.0
+
+
+
+ com.xueyi
+ xueyi-common-core
+
+
+
+
+ org.springframework.integration
+ spring-integration-mqtt
+ 5.5.14
+
+
+
+
\ No newline at end of file
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/annotation/MqttService.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/annotation/MqttService.java
new file mode 100644
index 00000000..f016b0f1
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/annotation/MqttService.java
@@ -0,0 +1,18 @@
+package com.xueyi.common.mqtt.annotation;
+
+import org.springframework.core.annotation.AliasFor;
+import org.springframework.stereotype.Component;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Component
+public @interface MqttService {
+
+ @AliasFor(annotation = Component.class)
+ String value() default "";
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/annotation/MqttTopic.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/annotation/MqttTopic.java
new file mode 100644
index 00000000..73b8cf36
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/annotation/MqttTopic.java
@@ -0,0 +1,17 @@
+package com.xueyi.common.mqtt.annotation;
+
+import org.springframework.stereotype.Component;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MqttTopic {
+ /**
+ * 主题名称
+ */
+ String value() default "";
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttConfig.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttConfig.java
new file mode 100644
index 00000000..3152fe29
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttConfig.java
@@ -0,0 +1,55 @@
+package com.xueyi.common.mqtt.configure;
+
+import lombok.Data;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * mqtt配置
+ *
+ * @author xueyi
+ */
+//@Configuration
+//@EnableCaching
+@Data
+public class MqttConfig {
+ @Value("${emqx.brokerUrl}")
+ private String brokerUrl;
+
+ @Value("${emqx.clientId}")
+ private String clientId;
+
+ @Value("${emqx.username}")
+ private String username;
+
+ @Value("${emqx.password}")
+ private String password;
+
+
+ @Value("${emqx.topics}")
+ private String topics;
+
+ @Value("${emqx.prefix}")
+ private String prefix;
+
+ @Value("${emqx.fetchLogTopic}")
+ private String fetchLogTopic;
+
+ @Bean
+ public MqttClient mqttClient() throws Exception {
+ MqttConnectOptions options = new MqttConnectOptions();
+// options.setCleanSession(true);
+ options.setCleanSession(true);
+ options.setConnectionTimeout(10); // 设置连接超时时间为10秒
+ options.setMaxReconnectDelay(5000); // 设置最大重连延迟为5秒
+ options.setAutomaticReconnect(true);
+ options.setUserName(username);
+ options.setPassword(password.toCharArray());
+ MqttClient client = new MqttClient(brokerUrl, clientId);
+ client.connect(options);
+ return client;
+ }
+
+}
\ No newline at end of file
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttConfigV2.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttConfigV2.java
new file mode 100644
index 00000000..0ab5acae
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttConfigV2.java
@@ -0,0 +1,81 @@
+package com.xueyi.common.mqtt.configure;
+
+import com.xueyi.common.mqtt.service.IMqttMessageHandler;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.annotation.IntegrationComponentScan;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.integration.channel.ExecutorChannel;
+import org.springframework.integration.config.EnableIntegration;
+import org.springframework.integration.dsl.IntegrationFlow;
+import org.springframework.integration.dsl.IntegrationFlows;
+import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
+import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
+import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
+import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
+import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.MessageHandler;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * mqtt config
+ */
+@Configuration
+@IntegrationComponentScan("com.xueyi.common.mqtt.connection")
+public class MqttConfigV2 {
+
+ @Autowired
+ private MqttProperties mqttProperties;
+
+ //Mqtt 客户端工厂
+ @Bean
+ public MqttPahoClientFactory mqttPahoClientFactory(){
+ DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
+ MqttConnectOptions options = new MqttConnectOptions();
+ options.setServerURIs(mqttProperties.getHostUrl().split(","));
+ options.setUserName(mqttProperties.getUsername());
+ options.setPassword(mqttProperties.getPassword().toCharArray());
+ factory.setConnectionOptions(options);
+ return factory;
+ }
+
+
+ // 消息生产者
+// @Bean
+// public IntegrationFlow mqttInbound(MqttPahoMessageDrivenChannelAdapter adapter){
+// adapter.setCompletionTimeout(5000);
+// adapter.setConverter(new DefaultPahoMessageConverter());
+// //入站投递的通道
+// adapter.setOutputChannel(mqttInboundChannel());
+// adapter.setQos(1);
+// return IntegrationFlows.from(adapter)
+//// .channel(new ExecutorChannel(mqttThreadPoolTaskExecutor()))
+//// .handle(mqttMessageHandler)
+// .get();
+// }
+
+ //出站消息管道,
+ @Bean
+ public MessageChannel mqttOutboundChannel(){
+ return new DirectChannel();
+ }
+
+
+
+ // 出站处理器 (向 mqtt 发送消息 生产者)
+ @Bean
+ public IntegrationFlow mqttOutboundFlow(MqttPahoClientFactory factory) {
+
+ MqttPahoMessageHandler handler = new MqttPahoMessageHandler(mqttProperties.getOutClientId(),factory);
+ handler.setAsync(true);
+ handler.setConverter(new DefaultPahoMessageConverter());
+ handler.setDefaultTopic(mqttProperties.getDefaultTopic().split(",")[0]);
+ return IntegrationFlows.from( "mqttOutboundChannel").handle(handler).get();
+ }
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttProperties.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttProperties.java
new file mode 100644
index 00000000..fa1a8989
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/configure/MqttProperties.java
@@ -0,0 +1,68 @@
+package com.xueyi.common.mqtt.configure;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+public class MqttProperties {
+
+ /**
+ * 用户名
+ */
+ @Value("${mqtt.username}")
+ private String username;
+
+ /**
+ * 密码
+ */
+ @Value("${mqtt.password}")
+ private String password;
+
+ /**
+ * 连接地址
+ */
+ @Value("${mqtt.host-url}")
+ private String hostUrl;
+
+ /**
+ * 进-客户Id
+ */
+ @Value("${mqtt.in-client-id}")
+ private String inClientId;
+
+ /**
+ * 出-客户Id
+ */
+ @Value("${mqtt.out-client-id}")
+ private String outClientId;
+
+ /**
+ * 客户Id
+ */
+ @Value("${mqtt.client-id}")
+ private String clientId;
+
+ /**
+ * 默认连接话题
+ */
+ @Value("${mqtt.default-topic}")
+ private String defaultTopic;
+
+ /**
+ * 超时时间
+ */
+ @Value("${mqtt.timeout}")
+ private int timeout;
+
+ /**
+ * 保持连接数
+ */
+ @Value("${mqtt.keepalive}")
+ private int keepalive;
+
+ /**是否清除session*/
+ @Value("${mqtt.clearSession}")
+ private boolean clearSession;
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/connection/MqttTemplate.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/connection/MqttTemplate.java
new file mode 100644
index 00000000..f89cb884
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/connection/MqttTemplate.java
@@ -0,0 +1,22 @@
+package com.xueyi.common.mqtt.connection;
+
+import org.springframework.integration.annotation.MessagingGateway;
+import org.springframework.integration.mqtt.support.MqttHeaders;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+/**
+ * MqttGateway
+ *
+ * @author yinruoxi
+ * @date 2022/8/23
+ */
+
+@Component
+@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
+public interface MqttTemplate {
+
+ void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String data);
+
+ void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) Integer Qos, String data);
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/constant/MqttTopicConstant.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/constant/MqttTopicConstant.java
new file mode 100644
index 00000000..d8d1551a
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/constant/MqttTopicConstant.java
@@ -0,0 +1,15 @@
+package com.xueyi.common.mqtt.constant;
+
+public class MqttTopicConstant {
+
+ /**
+ * 数字人常量
+ */
+ public static final String TOPIC_DIGITALMAN = "/digitalman";
+ /**
+ * 通知重启
+ */
+ public static final String TOPIC_NOTIFY_RESTART = "notify/restart";
+
+
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/IMqttMessageHandler.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/IMqttMessageHandler.java
new file mode 100644
index 00000000..93820a70
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/IMqttMessageHandler.java
@@ -0,0 +1,11 @@
+package com.xueyi.common.mqtt.service;
+
+import org.springframework.messaging.MessageHandler;
+
+/**
+ * @author yk
+ * @description
+ * @date 2023-05-10 19:05
+ */
+public interface IMqttMessageHandler extends MessageHandler {
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttMessageHandler.java b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttMessageHandler.java
new file mode 100644
index 00000000..dad71b59
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/java/com/xueyi/common/mqtt/service/MqttMessageHandler.java
@@ -0,0 +1,10 @@
+package com.xueyi.common.mqtt.service;
+
+/**
+ * @author yk
+ * @description
+ * @date 2023-05-10 19:05
+ */
+public interface MqttMessageHandler {
+ void handleMessage(String topic, String message) throws Exception;
+}
diff --git a/xueyi-common/xueyi-common-mqtt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xueyi-common/xueyi-common-mqtt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 00000000..e4f5c417
--- /dev/null
+++ b/xueyi-common/xueyi-common-mqtt/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1,5 @@
+com.xueyi.common.mqtt.configure.MqttProperties
+
+com.xueyi.common.mqtt.configure.MqttConfigV2
+#com.xueyi.common.mqtt.connection.MqttGateway
+
diff --git a/xueyi-common/xueyi-common-security/src/main/java/com/xueyi/common/security/service/BaseTokenService.java b/xueyi-common/xueyi-common-security/src/main/java/com/xueyi/common/security/service/BaseTokenService.java
index c72e7e27..317c483e 100644
--- a/xueyi-common/xueyi-common-security/src/main/java/com/xueyi/common/security/service/BaseTokenService.java
+++ b/xueyi-common/xueyi-common-security/src/main/java/com/xueyi/common/security/service/BaseTokenService.java
@@ -328,6 +328,7 @@ public class BaseTokenService> {
* 刷新令牌有效期
*/
public void refreshToken(HttpServletRequest request) {
+ String token = SecurityUtils.getToken(request);
refreshToken(SecurityUtils.getToken(request));
}
@@ -337,8 +338,10 @@ public class BaseTokenService> {
* @param token token
*/
public void refreshToken(String token) {
+ LoginUser loginUser = getLoginUser(token);
long loginTime = System.currentTimeMillis();
- String userKey = getTokenKey(token);
+ loginUser.setLoginTime(loginTime);
+ String userKey = getTokenKey(loginUser.getToken());
redisService.setCacheMapValue(userKey, SecurityConstants.BaseSecurity.EXPIRE_TIME.getCode(), getExpireTime(loginTime));
redisService.expire(userKey, getTacitExpireTime(), TimeUnit.MINUTES);
}
diff --git a/xueyi-common/xueyi-common-sms/src/main/java/com/xueyi/common/sms/configure/SmsProperties.java b/xueyi-common/xueyi-common-sms/src/main/java/com/xueyi/common/sms/configure/SmsProperties.java
index a4e80919..5bc1f618 100644
--- a/xueyi-common/xueyi-common-sms/src/main/java/com/xueyi/common/sms/configure/SmsProperties.java
+++ b/xueyi-common/xueyi-common-sms/src/main/java/com/xueyi/common/sms/configure/SmsProperties.java
@@ -2,7 +2,6 @@ package com.xueyi.common.sms.configure;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
/**
@@ -27,6 +26,8 @@ public class SmsProperties {
private String meetingQuitTemplate;
private String meetingRemindTemplate;
private String defaultRemindTemplate;
+ private String warningTemplate;
+ private String visitorTemplate;
private String robotName;
- private String receptionPhones;
+ private String receptionPhones;
}
diff --git a/xueyi-common/xueyi-common-web/pom.xml b/xueyi-common/xueyi-common-web/pom.xml
index ecaaa5a5..fb44d7e0 100644
--- a/xueyi-common/xueyi-common-web/pom.xml
+++ b/xueyi-common/xueyi-common-web/pom.xml
@@ -40,6 +40,11 @@
xueyi-common-datasource
+
+ com.xueyi
+ xueyi-common-core
+
+
com.xueyi
diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/config/XueYiMyBatisPlusConfig.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/config/XueYiMyBatisPlusConfig.java
index db10082b..752fdf06 100644
--- a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/config/XueYiMyBatisPlusConfig.java
+++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/config/XueYiMyBatisPlusConfig.java
@@ -68,4 +68,5 @@ public class XueYiMyBatisPlusConfig {
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
+
}
diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/config/XueYiMyRespConfig.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/config/XueYiMyRespConfig.java
new file mode 100644
index 00000000..fe946721
--- /dev/null
+++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/config/XueYiMyRespConfig.java
@@ -0,0 +1,21 @@
+package com.xueyi.common.web.config;
+
+import com.xueyi.common.web.utils.ResponseCodeUtil;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Map;
+
+/**
+ * MP配置
+ *
+ * @author xueyi
+ */
+@Configuration
+public class XueYiMyRespConfig {
+
+ @Bean
+ public Map> responseMessageMap() {
+ return ResponseCodeUtil.getResponseCodeAndMsgMap();
+ }
+}
diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/constant/ResponseCode.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/constant/ResponseCode.java
index 4fca8715..d957338a 100644
--- a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/constant/ResponseCode.java
+++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/constant/ResponseCode.java
@@ -457,12 +457,12 @@ public class ResponseCode {
public static final Integer NOT_FOUND_VISITOR = 5404;
@ResponseMessage(
- msg = {"预订失败,会议室预订时间点有冲突"}
+ msg = {"会议室预订时间点有冲突"}
)
public static final Integer MEETING_ORDER_CONFLICT = 5501;
@ResponseMessage(
- msg = {"预订失败,会议室预订时间错误"}
+ msg = {"会议室预订时间错误"}
)
public static final Integer MEETING_ORDER_TIME_ERROR = 5502;
diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/controller/BaseApiController.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/controller/BaseApiController.java
new file mode 100644
index 00000000..fb195975
--- /dev/null
+++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/controller/BaseApiController.java
@@ -0,0 +1,85 @@
+package com.xueyi.common.web.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.google.common.collect.Lists;
+import com.xueyi.common.web.constant.ResponseCode;
+import com.xueyi.common.web.response.MyResponse;
+import com.xueyi.system.api.device.domain.vo.DeviceTenantSourceMergeVo;
+import com.xueyi.system.api.device.feign.RemoteDeviceTenantMergeService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+import java.util.Map;
+
+public class BaseApiController {
+
+ @Autowired
+ protected Map> responseMessageMap;
+ protected final static String EMPTY_STRING = "";
+
+ protected final static String LANGUAGE_CHINESE = "zh";
+ private MyResponse message = null;
+
+
+ public DeviceTenantSourceMergeVo getDeviceTenantSourceMergeVo(String devId){
+ return remoteDeviceTenantMergeService.selectDeviceTenantSourceMerge(devId);
+ }
+
+
+ @Autowired
+ private RemoteDeviceTenantMergeService remoteDeviceTenantMergeService;
+
+
+ protected MyResponse outputSuccess(){
+ return outputSuccess(null);
+ }
+ /**
+ * 业务处理成功
+ * @param data
+ * @return
+ */
+ protected MyResponse outputSuccess(Object data){
+ return output(ResponseCode.SUCCESS, EMPTY_STRING, data);
+ }
+
+ protected MyResponse output(final Integer code) {
+ return output(code, EMPTY_STRING);
+ }
+
+ protected MyResponse output(final Integer code, final String replaceParameter) {
+ return output(code, replaceParameter, null);
+ }
+
+
+ protected MyResponse output(final Integer code, final String replaceParameter, final Object data) {
+ if (null == replaceParameter) {
+ return output(code, Lists.newArrayList(EMPTY_STRING), data, null);
+ }
+ return output(code, Lists.newArrayList(replaceParameter), data, null);
+ }
+
+ protected MyResponse output(final Integer code, final List replaceParameters, final Object data, final String errorMessage){
+ if (ResponseCode.SUCCESS.equals(code)) {
+ if (null == data) {
+ message = new MyResponse(code);
+ } else {
+ message = new MyResponse(code, EMPTY_STRING, data);
+ }
+ } else {
+ String reponseText = StringUtils.isEmpty(errorMessage)? responseMessageMap.get(code).get(LANGUAGE_CHINESE) : errorMessage;
+ if (null != replaceParameters && replaceParameters.size() > 0) {
+ for (int i = 0; i < replaceParameters.size(); i++) {
+ reponseText = reponseText.replace("#p" + i + "#", replaceParameters.get(i));
+ }
+ }else{
+ reponseText = reponseText.replace("#p0#", "");
+ }
+ if (null == data){
+ message = new MyResponse(code, reponseText);
+ }else{
+ message = new MyResponse(code, reponseText, data);
+ }
+ }
+ return message;
+ }
+}
\ No newline at end of file
diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/service/IBaseService.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/service/IBaseService.java
index d43263bd..c0c04c47 100644
--- a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/service/IBaseService.java
+++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/service/IBaseService.java
@@ -123,4 +123,8 @@ public interface IBaseService {
* 更新缓存数据
*/
void refreshCache();
+
+ void createEsIndex(D dto);
+
+ void saveToEs(D dto);
}
diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/service/impl/BaseServiceImpl.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/service/impl/BaseServiceImpl.java
index 67dcfbb9..6476256a 100644
--- a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/service/impl/BaseServiceImpl.java
+++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/service/impl/BaseServiceImpl.java
@@ -1,5 +1,7 @@
package com.xueyi.common.web.entity.service.impl;
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.xueyi.common.core.constant.basic.BaseConstants;
import com.xueyi.common.core.constant.basic.OperateConstants;
@@ -11,7 +13,12 @@ import com.xueyi.common.redis.constant.RedisConstants;
import com.xueyi.common.web.entity.manager.IBaseManager;
import com.xueyi.common.web.entity.service.IBaseService;
import com.xueyi.common.web.entity.service.impl.handle.BaseHandleServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import java.io.IOException;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
@@ -27,6 +34,7 @@ import java.util.stream.Collectors;
*/
public class BaseServiceImpl> extends BaseHandleServiceImpl implements IBaseService {
+ private Logger log = LoggerFactory.getLogger(BaseServiceImpl.class);
/**
* 查询数据对象列表
*
@@ -214,4 +222,53 @@ public class BaseServiceImpl query.index(finalIndexName)).value();
+ System.out.println(exists);
+ if (exists) {
+ log.info("索引已存在");
+ } else {
+ String finalIndexName1 = indexName;
+ log.info("exists:false, indexName:{}", indexName);
+ final CreateIndexResponse products = client.indices().create(builder -> builder.index(finalIndexName1));
+ log.info(products.acknowledged()?"索引创建成功" : "索引创建失败");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ @Override
+ public void saveToEs(BaseEntity dto) {
+ try {
+ if (null != dto.getId()) {
+ String indexName = activeProfile+"_"+StrUtil.camelCaseToUnderscore(dto.getClass().getSimpleName());
+ log.info("indexName:{}", indexName);
+ createEsIndex((D)dto);
+ String finalIndexName = indexName;
+ client.index(i -> i
+ .index(finalIndexName)
+ .id(dto.getId().toString())
+ .document(dto));
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
}
\ No newline at end of file
diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/interceptor/TenantLineInnerInterceptor.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/interceptor/TenantLineInnerInterceptor.java
index 32cca12c..37ad2ddd 100644
--- a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/interceptor/TenantLineInnerInterceptor.java
+++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/interceptor/TenantLineInnerInterceptor.java
@@ -58,9 +58,16 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
if (InterceptorIgnoreHelper.willIgnoreTenantLine(ms.getId())) return;
PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
- mpBs.sql(this.parserSingle(mpBs.sql(), null));
+ String modifiedSql = fixEmptyInClause(mpBs.sql());
+ mpBs.sql(this.parserSingle(modifiedSql, null));
}
+ private String fixEmptyInClause(String sql) {
+ String fixedSql = sql.replaceAll("IN \\(\\)", "IN (null)"); // 将空括号替换为 (null)
+ return fixedSql;
+ }
+
+
/**
* before -> prepare
*/
diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/utils/DateUtils.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/utils/DateUtils.java
index 60b309a0..612dae7d 100644
--- a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/utils/DateUtils.java
+++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/utils/DateUtils.java
@@ -3,10 +3,12 @@ package com.xueyi.common.web.utils;
import com.google.common.collect.Lists;
import java.math.BigDecimal;
+import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
+import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
@@ -236,15 +238,19 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
}
public static Date parseLongToDate(String dateLong) throws ParseException {
- return parseLongToDate(Double.parseDouble(dateLong));
+ BigDecimal number = new BigDecimal(dateLong);
+ return parseLongToDate(number.doubleValue());
}
public static Date parseLongToDate(Double dateLong) throws ParseException {
Calendar calendar = Calendar.getInstance();
- String str = Double.toString(dateLong);
+ DecimalFormat df = new DecimalFormat("#"); // 创建DecimalFormat对象
+ String str = df.format(dateLong);
if (str.indexOf(".")>-1) {
str = str.replace(".","");
}
- calendar.setTimeInMillis(Long.getLong(str.substring(0,13)));
+ str = str.substring(0,13);
+ BigDecimal number = new BigDecimal(str);
+ calendar.setTimeInMillis(number.longValue());
return calendar.getTime();
}
@@ -329,4 +335,15 @@ public class DateUtils extends org.apache.commons.lang.time.DateUtils {
return ldt;
}
+
+ public static String isAmPm(){
+ //判断当前时间是上午还是下午,上午返回am,下午返回pm
+ LocalTime currentTime = LocalTime.now();
+
+ if (currentTime.isBefore(LocalTime.NOON)) {
+ return "am";
+ } else {
+ return "pm";
+ }
+ }
}
diff --git a/xueyi-common/xueyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xueyi-common/xueyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 1fd4d7d5..d624d5a1 100644
--- a/xueyi-common/xueyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/xueyi-common/xueyi-common-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,5 +1,6 @@
com.xueyi.common.web.config.properties.TenantProperties
com.xueyi.common.web.config.XueYiMyBatisPlusConfig
+com.xueyi.common.web.config.XueYiMyRespConfig
com.xueyi.common.web.handler.XueYiMetaObjectHandler
com.xueyi.common.web.handler.TenantLineHandler
com.xueyi.common.web.aspect.AutoInjectAspect
\ No newline at end of file
diff --git a/xueyi-gateway/Dockerfile b/xueyi-gateway/Dockerfile
index ae162df2..1c567d14 100644
--- a/xueyi-gateway/Dockerfile
+++ b/xueyi-gateway/Dockerfile
@@ -7,6 +7,7 @@ MAINTAINER xueyi
VOLUME /home/xueyi
# 创建目录
RUN mkdir -p /home/xueyi
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 指定路径
WORKDIR /home/xueyi
# 复制jar文件到路径
diff --git a/xueyi-gateway/pom.xml b/xueyi-gateway/pom.xml
index 7a6bff15..b8cdcb2d 100644
--- a/xueyi-gateway/pom.xml
+++ b/xueyi-gateway/pom.xml
@@ -104,7 +104,21 @@
+
+ maven-resources-plugin
+ org.apache.maven.plugins
+
+ @
+ false
+
+
+
+
+ src/main/resources
+ true
+
+
diff --git a/xueyi-gateway/src/main/java/com/xueyi/gateway/filter/AuthFilter.java b/xueyi-gateway/src/main/java/com/xueyi/gateway/filter/AuthFilter.java
index 28620270..034c4075 100644
--- a/xueyi-gateway/src/main/java/com/xueyi/gateway/filter/AuthFilter.java
+++ b/xueyi-gateway/src/main/java/com/xueyi/gateway/filter/AuthFilter.java
@@ -37,7 +37,7 @@ public class AuthFilter implements GlobalFilter, Ordered {
@Autowired
private RedisService redisService;
- private static final String[] whitePrefix = {"/message/api", "/pass/api", "/meeting/api", "/visit/api"};
+ private static final String[] whitePrefix = {"/message/api", "/pass/api", "/meeting/api", "/visit/api", "/file/api","/staff/api","/apkversion/api","/man/api","/holiday/api", "/skill/api", "/intent/api"};
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
diff --git a/xueyi-gateway/src/main/resources/bootstrap.yml b/xueyi-gateway/src/main/resources/bootstrap.yml
index 7b3f4409..7af3dbe4 100644
--- a/xueyi-gateway/src/main/resources/bootstrap.yml
+++ b/xueyi-gateway/src/main/resources/bootstrap.yml
@@ -9,25 +9,25 @@ spring:
name: xueyi-gateway
profiles:
# 环境配置
- active: dev
+ active: @activatedProperties@
cloud:
nacos:
discovery:
# 服务注册地址
- #server-addr: 172.17.0.1:18848
- namespace: 6d0ee265-2a92-44cc-a6de-f34b3ea104e6
- server-addr: 39.107.77.235:18848
+ server-addr: @nacos.host@:@nacos.port@
+ namespace: @nacos.namespace@
config:
# 配置中心地址
- #server-addr: 172.17.0.1:18848
- namespace: 6d0ee265-2a92-44cc-a6de-f34b3ea104e6
- server-addr: 39.107.77.235:18848
+ server-addr: @nacos.host@:@nacos.port@
+ namespace: @nacos.namespace@
+
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
- application-secret-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ - application-datasource-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
sentinel:
# 取消控制台懒加载
eager: true
@@ -38,9 +38,9 @@ spring:
datasource:
ds1:
nacos:
-# server-addr: 172.17.0.1:18848
- namespace: 6d0ee265-2a92-44cc-a6de-f34b3ea104e6
- server-addr: 39.107.77.235:18848
+ server-addr: @nacos.host@:@nacos.port@
+ # namespace: 6d0ee265-2a92-44cc-a6de-f34b3ea104e6
+ # server-addr: 39.107.77.235:18848
dataId: sentinel-xueyi-gateway
groupId: DEFAULT_GROUP
data-type: json
diff --git a/xueyi-modules/pom.xml b/xueyi-modules/pom.xml
index 1cbb819d..7610974a 100644
--- a/xueyi-modules/pom.xml
+++ b/xueyi-modules/pom.xml
@@ -15,6 +15,8 @@
xueyi-job
xueyi-file
xueyi-message
+ xueyi-modules-auth
+ xueyi-nlt
xueyi-modules
diff --git a/xueyi-modules/xueyi-file/Dockerfile b/xueyi-modules/xueyi-file/Dockerfile
index 4c6ef4a1..a2705e07 100644
--- a/xueyi-modules/xueyi-file/Dockerfile
+++ b/xueyi-modules/xueyi-file/Dockerfile
@@ -7,6 +7,7 @@ MAINTAINER xueyi
VOLUME /home/xueyi
# 创建目录
RUN mkdir -p /home/xueyi
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 指定路径
WORKDIR /home/xueyi
# 复制jar文件到路径
diff --git a/xueyi-modules/xueyi-file/pom.xml b/xueyi-modules/xueyi-file/pom.xml
index c656e70d..9412e4db 100644
--- a/xueyi-modules/xueyi-file/pom.xml
+++ b/xueyi-modules/xueyi-file/pom.xml
@@ -72,6 +72,12 @@
xueyi-common-security
+
+ org.apache.pdfbox
+ pdfbox
+ 2.0.29
+
+
@@ -88,7 +94,21 @@
+
+ maven-resources-plugin
+ org.apache.maven.plugins
+
+ @
+ false
+
+
+
+
+ src/main/resources
+ true
+
+
\ No newline at end of file
diff --git a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/controller/SysFileController.java b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/controller/SysFileController.java
index 17085a6d..c2091733 100644
--- a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/controller/SysFileController.java
+++ b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/controller/SysFileController.java
@@ -1,20 +1,34 @@
package com.xueyi.file.controller;
+
+import com.alibaba.fastjson.JSONObject;
import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.utils.core.IdUtil;
import com.xueyi.common.core.utils.file.FileUtil;
import com.xueyi.common.core.web.result.AjaxResult;
import com.xueyi.common.core.web.result.R;
+import com.xueyi.file.api.domain.DigitalmanLogFile;
import com.xueyi.file.api.domain.SysFile;
import com.xueyi.file.api.feign.RemoteFileManageService;
+import com.xueyi.file.config.MinioConfig;
import com.xueyi.file.service.ISysFileService;
+import com.xueyi.file.service.MinioSysFileServiceImpl;
+import com.xueyi.file.utils.PdfToImageUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* 文件请求处理
*
@@ -30,6 +44,12 @@ public class SysFileController {
@Autowired
private RemoteFileManageService remoteFileManageService;
+ @Autowired
+ private MinioConfig minioConfig;
+
+ @Autowired
+ private MinioSysFileServiceImpl minioSysFileService;
+
/**
* 文件上传 | 内部调用
*/
@@ -52,6 +72,45 @@ public class SysFileController {
}
}
+
+ /**
+ * 文件上传 | 内部调用
+ */
+ @PostMapping("/inner/uploadpdf")
+ public R> uploadPdfInner(MultipartFile file) {
+ try {
+ System.out.println("文件上传开始:" + file.getName());
+ // pdf文件转成图片集合
+ List fileList = PdfToImageUtil.pdfToTransformationList(file);
+ List results = new ArrayList<>();
+ int num = 0;
+ // 循环上传并返回日志集合
+ for (File f : fileList) {
+ //将file的文件名重命名为file文件名+两位数的num
+ String fileName = f.getName();
+ String suffix = fileName.substring(fileName.lastIndexOf("."));
+ String name = fileName.substring(0, fileName.lastIndexOf("."));
+ String newName = name + String.format("%02d", num) + suffix;
+ // 上传并返回访问地址
+ String url = sysFileService.uploadFile(newName, f);
+ SysFile sysFile = new SysFile();
+ sysFile.setUrl(url);
+ sysFile.setSize(f.length());
+ sysFile.setName(FileUtil.getName(url));
+ sysFile.setNick(sysFile.getName());
+ remoteFileManageService.saveFileLog(sysFile, SecurityConstants.INNER);
+ results.add(sysFile);
+ };
+
+ return R.ok(results);
+ } catch (Exception e) {
+ log.error("上传文件失败", e);
+ return R.fail(e.getMessage());
+ }
+ }
+
+
+
/**
* 删除文件 | 内部调用
*/
@@ -65,6 +124,22 @@ public class SysFileController {
return R.fail(e.getMessage());
}
}
+ /**
+ * 文件上传请求
+ */
+ @PostMapping("/api/getLogUploadPath")
+ public AjaxResult getLogUploadPath(@RequestBody DigitalmanLogFile file) {
+ // 根据当前时间,获取路径
+ LocalDate currentDate = LocalDate.now();
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+ String path = currentDate.format(formatter);
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("hosts",minioConfig.getUrl());
+ jsonObject.put("bucket",minioConfig.getBucketName());
+ jsonObject.put("filepath","/" + file.getDevId() + "/" + path);
+ jsonObject.put("uuid", IdUtil.simpleUUID());
+ return AjaxResult.success(jsonObject);
+ }
/**
* 文件上传请求
@@ -76,4 +151,14 @@ public class SysFileController {
? AjaxResult.success("上传成功!", R.getData().getUrl())
: AjaxResult.error("上传失败!");
}
+ /**
+ * 文件上传请求
+ */
+ @PostMapping("/uploadpdf")
+ public AjaxResult uploadPdf(MultipartFile file) {
+ R> R = uploadPdfInner(file);
+ return R.isOk()
+ ? AjaxResult.success("上传成功!", R.getData())
+ : AjaxResult.error("上传失败!");
+ }
}
\ No newline at end of file
diff --git a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/FastDfsSysFileServiceImpl.java b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/FastDfsSysFileServiceImpl.java
index 78a5a495..75382b60 100644
--- a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/FastDfsSysFileServiceImpl.java
+++ b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/FastDfsSysFileServiceImpl.java
@@ -8,6 +8,8 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
+
/**
* FastDFS 文件存储
*
@@ -39,6 +41,11 @@ public class FastDfsSysFileServiceImpl implements ISysFileService {
return domain + "/" + storePath.getFullPath();
}
+ @Override
+ public String uploadFile(String fileName, File file) throws Exception {
+ return null;
+ }
+
/**
* 文件删除接口
*
diff --git a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/ISysFileService.java b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/ISysFileService.java
index 74c282a3..221b937d 100644
--- a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/ISysFileService.java
+++ b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/ISysFileService.java
@@ -2,6 +2,8 @@ package com.xueyi.file.service;
import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
+
/**
* 文件上传接口
*
@@ -16,6 +18,7 @@ public interface ISysFileService {
* @return 访问地址
*/
String uploadFile(MultipartFile file) throws Exception;
+ String uploadFile(String fileName, File file) throws Exception;
/**
* 文件删除接口
diff --git a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/LocalSysFileServiceImpl.java b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/LocalSysFileServiceImpl.java
index a00562ec..72901d88 100644
--- a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/LocalSysFileServiceImpl.java
+++ b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/LocalSysFileServiceImpl.java
@@ -2,7 +2,6 @@ package com.xueyi.file.service;
import com.xueyi.file.utils.FileUploadUtils;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@@ -14,7 +13,6 @@ import java.io.File;
* @author xueyi
*/
-@Primary
@Service
public class LocalSysFileServiceImpl implements ISysFileService {
@@ -42,6 +40,11 @@ public class LocalSysFileServiceImpl implements ISysFileService {
return domain + localFilePrefix + name;
}
+ @Override
+ public String uploadFile(String fileName, File file) throws Exception {
+ return null;
+ }
+
/**
* 文件删除接口
*
diff --git a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/MinioSysFileServiceImpl.java b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/MinioSysFileServiceImpl.java
index 1c04d289..5080e530 100644
--- a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/MinioSysFileServiceImpl.java
+++ b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/service/MinioSysFileServiceImpl.java
@@ -4,16 +4,25 @@ import com.xueyi.file.config.MinioConfig;
import com.xueyi.file.utils.FileUploadUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URLEncoder;
+
/**
* Minio 文件存储
*
* @author xueyi
*/
+@Primary
@Service
public class MinioSysFileServiceImpl implements ISysFileService {
@@ -32,6 +41,8 @@ public class MinioSysFileServiceImpl implements ISysFileService {
@Override
public String uploadFile(MultipartFile file) throws Exception {
String fileName = FileUploadUtils.extractFilename(file);
+
+ //fileName = URLEncoder.encode(fileName, "UTF-8");
System.out.println("Minio filename:" + fileName);
PutObjectArgs args = PutObjectArgs.builder()
.bucket(minioConfig.getBucketName())
@@ -41,9 +52,71 @@ public class MinioSysFileServiceImpl implements ISysFileService {
.build();
client.putObject(args);
System.out.println("Minio 文件上传成功");
+ // 获取fileName的最后一个'/'的位置的字符串,并用URLEncoder进行UTF-8编码后,再拼接到fileName中
+ String splitStr = fileName.substring(fileName.lastIndexOf("/") + 1);
+ splitStr = URLEncoder.encode(splitStr, "UTF-8");
+ fileName = fileName.substring(0, fileName.lastIndexOf("/") + 1) + splitStr;
return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
}
+ @Override
+ public String uploadFile(String fileName, File file) throws Exception {
+ fileName = FileUploadUtils.extractFilename(fileName);
+ InputStream inputStream = FileUtils.openInputStream(file);
+ System.out.println("file original filename = " + fileName);
+ System.out.println("file size = " + file.length());
+
+ // 使用IOUtils.toByteArray()方法确保正确地读取输入流中的数据
+ byte[] fileBytes = IOUtils.toByteArray(inputStream);
+
+ // 上传文件到MinIO
+ String minioFileName = uploadFileToMinIO(fileName, fileBytes);
+
+ System.out.println("MinIO 文件上传成功,Minio 文件名:" + minioFileName);
+
+ // 获取fileName的最后一个'/'的位置的字符串,并用URLEncoder进行UTF-8编码后,再拼接到fileName中
+ String splitStr = fileName.substring(fileName.lastIndexOf("/") + 1);
+ splitStr = URLEncoder.encode(splitStr, "UTF-8");
+ fileName = fileName.substring(0, fileName.lastIndexOf("/") + 1) + splitStr;
+
+ return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
+ }
+
+ // 上传文件到MinIO
+ private String uploadFileToMinIO(String fileName, byte[] fileBytes) throws Exception {
+ PutObjectArgs args = PutObjectArgs.builder()
+ .bucket(minioConfig.getBucketName())
+ .object(fileName)
+ .stream(new ByteArrayInputStream(fileBytes), fileBytes.length, -1)
+ .contentType("application/octet-stream")
+ .build();
+ client.putObject(args);
+ return fileName;
+ }
+
+
+ public String uploadFile(File file) throws Exception {
+ String fileName = file.getName();
+ // 获取fileName的最后一个'/'的位置的字符串,并用URLEncoder进行UTF-8编码后,再拼接到fileName中
+ // 使用PutObjectArgs上传文件到MinIO
+ client.putObject(
+ PutObjectArgs.builder()
+ .bucket(minioConfig.getBucketName())
+ .object(fileName)
+ .stream(new FileInputStream(file), file.length(), -1)
+ .contentType("application/octet-stream")
+ .build()
+ );
+
+ System.out.println("文件上传到MinIO成功:" + fileName);
+ String splitStr = fileName.substring(fileName.lastIndexOf("/") + 1);
+ splitStr = URLEncoder.encode(splitStr, "UTF-8");
+ fileName = fileName.substring(0, fileName.lastIndexOf("/") + 1) + splitStr;
+ return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
+ }
+
+
+
/**
* 文件删除接口
*
diff --git a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/utils/FileUploadUtils.java b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/utils/FileUploadUtils.java
index d2285945..921cd4ca 100644
--- a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/utils/FileUploadUtils.java
+++ b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/utils/FileUploadUtils.java
@@ -78,6 +78,13 @@ public class FileUploadUtils {
return StrUtil.format("{}/{}_{}.{}", DateUtil.datePath(), FilenameUtils.getBaseName(file.getOriginalFilename()), IdUtil.simpleUUID(), FileTypeUtil.getExtension(file));
}
+ /**
+ * 编码文件名
+ */
+ public static String extractFilename(String fileName) {
+ return StrUtil.format("{}/{}_{}.{}", DateUtil.datePath(), FilenameUtils.getBaseName(fileName.substring(0,fileName.lastIndexOf("."))), IdUtil.simpleUUID(), fileName.substring(fileName.lastIndexOf(".") + 1 , fileName.length()));
+ }
+
private static File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
File desc = new File(uploadDir + File.separator + fileName);
diff --git a/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/utils/PdfToImageUtil.java b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/utils/PdfToImageUtil.java
new file mode 100644
index 00000000..1ae9d6f4
--- /dev/null
+++ b/xueyi-modules/xueyi-file/src/main/java/com/xueyi/file/utils/PdfToImageUtil.java
@@ -0,0 +1,171 @@
+package com.xueyi.file.utils;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.rendering.PDFRenderer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+
+public class PdfToImageUtil {
+
+ private static final String TEMP_DIR = "/home/xueyi/temp";
+
+ //支持文件格式
+ public static final String SUPPORT_FILE = "pdf";
+ //图片文件格式
+ public static final String IMAGE_SUFFIX = "jpg"; //png
+ //压缩文件格式
+ public static final String ZIP_SUFFIX = "zip";
+ //PDF是否为一页
+ private static boolean isImage;
+
+ private static final Logger log = LoggerFactory.getLogger(PdfToImageUtil.class);
+
+
+ /**
+ * 对外的开放接口,用于将PDF文件转换为图片文件压缩包进行下载
+ * @param file SpringMVC获取的图片文件
+ */
+ public static synchronized void pdfToTransformation(MultipartFile file, HttpServletResponse response) throws Exception {
+ String fileName = file.getOriginalFilename();
+ if(null == fileName) return;
+ String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
+ log.info("文件名称:" + fileName + ",文件后缀:" + suffix);
+ if(!SUPPORT_FILE.equals(suffix)) return;
+ isImage = false;
+ File imageFile = generateFile(file);
+ log.info("文件生成成功!");
+// downloadFile(imageFile, response);
+ }
+
+ /**
+ * 对外的开放接口
+ * @param file SpringMVC获取的图片文件
+ */
+ public static synchronized List pdfToTransformationList(MultipartFile file) throws Exception {
+
+ List imageFiles = new ArrayList<>();
+ try (PDDocument document = PDDocument.load(file.getInputStream())) {
+ PDFRenderer pdfRenderer = new PDFRenderer(document);
+
+ for (int pageIdx = 0; pageIdx < document.getNumberOfPages(); pageIdx++) {
+ PDPage page = document.getPage(pageIdx);
+ BufferedImage image = pdfRenderer.renderImageWithDPI(pageIdx, 300); // Set the DPI as needed
+
+ // 保存图像到本地临时目录
+ /*String imageName = "page_" + (pageIdx + 1) + ".png";
+ File imageFile = saveImageToFile(image, imageName);*/
+ String imageName = "page_" + (pageIdx + 1) + ".jpg";
+ File imageFile = saveCompressedImage(image, imageName, 0.8f);
+
+ imageFiles.add(imageFile);
+ }
+ }
+
+ return imageFiles;
+ }
+
+
+ /**
+ * 将PDF文件转换为多张图片并放入一个压缩包中
+ * @param pdfFile SpringMVC获取的图片文件
+ * @return 图片文件压缩包
+ * @throws Exception 抛出异常
+ */
+ private static File generateFile(MultipartFile pdfFile) throws Exception {
+ String fileName = pdfFile.getOriginalFilename();
+ String directoryName = fileName.substring(0, fileName.lastIndexOf("."));
+ File zipFile = new File(directoryName + "." + ZIP_SUFFIX);
+
+ try (PDDocument document = PDDocument.load(pdfFile.getInputStream());
+ ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {
+
+ PDFRenderer pdfRenderer = new PDFRenderer(document);
+
+ for (int pageIdx = 0; pageIdx < document.getNumberOfPages(); pageIdx++) {
+ PDPage page = document.getPage(pageIdx);
+ BufferedImage image = pdfRenderer.renderImageWithDPI(pageIdx, 300); // Set the DPI as needed
+
+ // Convert BufferedImage to byte array
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ImageIO.write(image, "png", baos);
+ byte[] imageBytes = baos.toByteArray();
+
+ // Add image to the ZipOutputStream
+ ZipEntry zipEntry = new ZipEntry("page_" + (pageIdx + 1) + ".png");
+ zipOut.putNextEntry(zipEntry);
+ zipOut.write(imageBytes);
+ zipOut.closeEntry();
+ }
+
+ System.out.println("PDF转换完成并压缩为:" + directoryName + "." + ZIP_SUFFIX);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return zipFile;
+ }
+
+ private static File saveImageToFile(BufferedImage image, String imageName) throws IOException {
+ Path tempDir = Paths.get(TEMP_DIR);
+ if (!Files.exists(tempDir)) {
+ Files.createDirectories(tempDir);
+ }
+ File imageFile = new File(TEMP_DIR, imageName);
+ ImageIO.write(image, "png", imageFile);
+ return imageFile;
+ }
+
+
+ private static File saveCompressedImage(BufferedImage image, String imageName, float compressionQuality) throws IOException {
+ File tempDir = new File(TEMP_DIR);
+ if (!tempDir.exists()) {
+ tempDir.mkdirs();
+ }
+
+ File imageFile = new File(tempDir, imageName);
+
+ Iterator writers = ImageIO.getImageWritersByFormatName("jpg");
+ ImageWriter writer = writers.next();
+
+ ImageWriteParam param = writer.getDefaultWriteParam();
+ param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+ param.setCompressionQuality(compressionQuality);
+
+ ImageIO.write(image, "jpg", imageFile);
+
+ return imageFile;
+ }
+
+
+
+ /**
+ * 获取PDF页数
+ * @throws IOException
+ */
+ public static Integer getPdfPageSize(MultipartFile file) throws IOException {
+ try (PDDocument document = PDDocument.load(file.getInputStream())) {
+ return document.getNumberOfPages();
+ }
+ }
+}
diff --git a/xueyi-modules/xueyi-file/src/main/resources/bootstrap.yml b/xueyi-modules/xueyi-file/src/main/resources/bootstrap.yml
index 238ea44a..7c1a8155 100644
--- a/xueyi-modules/xueyi-file/src/main/resources/bootstrap.yml
+++ b/xueyi-modules/xueyi-file/src/main/resources/bootstrap.yml
@@ -9,7 +9,7 @@ spring:
name: xueyi-file
profiles:
# 环境配置
- active: dev
+ active: @activatedProperties@
servlet:
multipart:
max-request-size: 10MB
@@ -18,13 +18,16 @@ spring:
nacos:
discovery:
# 服务注册地址
- server-addr: 172.17.0.1:18848
+ server-addr: @nacos.host@:@nacos.port@
+ namespace: @nacos.namespace@
config:
# 配置中心地址
- server-addr: 172.17.0.1:18848
+ server-addr: @nacos.host@:@nacos.port@
+ namespace: @nacos.namespace@
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
- - application-secret-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
\ No newline at end of file
+ - application-secret-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ - application-datasource-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
\ No newline at end of file
diff --git a/xueyi-modules/xueyi-job/Dockerfile b/xueyi-modules/xueyi-job/Dockerfile
index 25544bc3..8bc40c10 100644
--- a/xueyi-modules/xueyi-job/Dockerfile
+++ b/xueyi-modules/xueyi-job/Dockerfile
@@ -7,6 +7,7 @@ MAINTAINER xueyi
VOLUME /home/xueyi
# 创建目录
RUN mkdir -p /home/xueyi
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 指定路径
WORKDIR /home/xueyi
# 复制jar文件到路径
diff --git a/xueyi-modules/xueyi-job/pom.xml b/xueyi-modules/xueyi-job/pom.xml
index a2c5ad64..c8a63fbf 100644
--- a/xueyi-modules/xueyi-job/pom.xml
+++ b/xueyi-modules/xueyi-job/pom.xml
@@ -65,6 +65,11 @@
xueyi-api-job
+
+ com.xueyi
+ xueyi-api-nlt
+
+
@@ -81,7 +86,21 @@
+
+ maven-resources-plugin
+ org.apache.maven.plugins
+
+ @
+ false
+
+
+
+
+ src/main/resources
+ true
+
+
\ No newline at end of file
diff --git a/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DgmanTask.java b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DgmanTask.java
index 939e9325..0af98acb 100644
--- a/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DgmanTask.java
+++ b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DgmanTask.java
@@ -3,6 +3,8 @@ package com.xueyi.job.task;
import com.xueyi.common.cache.utils.SourceUtil;
import com.xueyi.common.core.utils.core.StrUtil;
import com.xueyi.common.core.web.result.R;
+import com.xueyi.message.api.transfer.feign.RemoteTransferService;
+import com.xueyi.system.api.digitalmans.feign.RemoteManDeviceService;
import com.xueyi.system.api.model.Source;
import com.xueyi.tenant.api.tenant.domain.dto.TeTenantDto;
import com.xueyi.tenant.api.tenant.feign.RemoteTenantService;
@@ -22,6 +24,9 @@ public class DgmanTask {
@Autowired
RemoteTenantService tenantService;
+ @Autowired
+ RemoteManDeviceService remoteManDeviceService;
+
public void ryParams(String params) {
System.out.println(StrUtil.format("执行有参方法:参数{}", params));
}
@@ -36,8 +41,16 @@ public class DgmanTask {
// 获取数据源
Source source = SourceUtil.getSourceCache(item.getStrategyId());
// 更新租户内数字人信息
-
+ remoteManDeviceService.manDeviceListInnerSync(item.getId());
});
System.out.println("监控心跳执行完成");
}
+
+ /**
+ * 触发条件:0 0 10 * * *
+ * 每日十点触发,收集当前在线数
+ */
+ public void dgmanDeviceOnlineState() {
+ remoteManDeviceService.syncNumbersOfOnline();
+ }
}
diff --git a/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DmBroadDataTask.java b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DmBroadDataTask.java
new file mode 100644
index 00000000..531c5eee
--- /dev/null
+++ b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DmBroadDataTask.java
@@ -0,0 +1,23 @@
+package com.xueyi.job.task;
+
+import com.xueyi.message.api.transfer.feign.RemoteTransferService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 定时任务调度测试
+ *
+ * @author xueyi
+ */
+@Component("dmBroadDataTask")
+public class DmBroadDataTask {
+ @Autowired
+ RemoteTransferService remoteTransferService;
+ /**
+ * 触发条件:* 0/1 * * * *
+ * 每分钟执行一次
+ */
+ public void syncData() {
+ remoteTransferService.broadcast("broadData");
+ }
+}
diff --git a/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DmGenerativeKnowledgeTask.java b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DmGenerativeKnowledgeTask.java
new file mode 100644
index 00000000..3794bc40
--- /dev/null
+++ b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DmGenerativeKnowledgeTask.java
@@ -0,0 +1,24 @@
+package com.xueyi.job.task;
+
+import com.xueyi.message.api.transfer.feign.RemoteTransferService;
+import com.xueyi.nlt.api.nlt.feign.RemoteIntentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 定时任务调度测试
+ *
+ * @author xueyi
+ */
+@Component("dmGenerativeKnowledgeTask")
+public class DmGenerativeKnowledgeTask {
+ @Autowired
+ RemoteIntentService remoteIntentService;
+ /**
+ * 触发条件:* 0/1 * * * *
+ * 每分钟执行一次
+ */
+ public void generativeKnowledge() {
+ remoteIntentService.taskGenerativeKnowledge();
+ }
+}
diff --git a/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DmRecognizedRecordsCleanTask.java b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DmRecognizedRecordsCleanTask.java
new file mode 100644
index 00000000..9c39a326
--- /dev/null
+++ b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/task/DmRecognizedRecordsCleanTask.java
@@ -0,0 +1,25 @@
+package com.xueyi.job.task;
+
+import com.xueyi.system.api.digitalmans.feign.RemoteDigitalmanService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 定时任务调度测试
+ *
+ * @author xueyi
+ */
+@Component("dmRecognizedRecordsCleanTask")
+public class DmRecognizedRecordsCleanTask {
+ @Autowired
+ RemoteDigitalmanService remoteDigitalmanService;
+ /**
+ * 触发条件:* 0/1 * * * *
+ * 每分钟执行一次
+ */
+
+
+ public void delOutDays() {
+ remoteDigitalmanService.delRecognizedRecords(5);
+ }
+}
diff --git a/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/util/AbstractQuartzJob.java b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/util/AbstractQuartzJob.java
index f47add4d..65037496 100644
--- a/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/util/AbstractQuartzJob.java
+++ b/xueyi-modules/xueyi-job/src/main/java/com/xueyi/job/util/AbstractQuartzJob.java
@@ -43,7 +43,8 @@ public abstract class AbstractQuartzJob implements Job {
doExecute(context, sysJob);
after(context, sysJob, null);
} catch (Exception e) {
- log.error("任务执行异常 - :", e);
+ log.error("任务执行异常 - :", e.getMessage());
+ e.printStackTrace();
after(context, sysJob, e);
}
}
diff --git a/xueyi-modules/xueyi-job/src/main/resources/bootstrap.yml b/xueyi-modules/xueyi-job/src/main/resources/bootstrap.yml
index 720df176..73c4658c 100644
--- a/xueyi-modules/xueyi-job/src/main/resources/bootstrap.yml
+++ b/xueyi-modules/xueyi-job/src/main/resources/bootstrap.yml
@@ -9,15 +9,17 @@ spring:
name: xueyi-job
profiles:
# 环境配置
- active: dev
+ active: @activatedProperties@
cloud:
nacos:
discovery:
# 服务注册地址
- server-addr: 172.17.0.1:18848
+ server-addr: @nacos.host@:@nacos.port@
+ namespace: @nacos.namespace@
config:
# 配置中心地址
- server-addr: 172.17.0.1:18848
+ server-addr: @nacos.host@:@nacos.port@
+ namespace: @nacos.namespace@
# 配置文件格式
file-extension: yml
# 共享配置
diff --git a/xueyi-modules/xueyi-message/Dockerfile b/xueyi-modules/xueyi-message/Dockerfile
index 07cf9cf5..ab03f31a 100644
--- a/xueyi-modules/xueyi-message/Dockerfile
+++ b/xueyi-modules/xueyi-message/Dockerfile
@@ -7,6 +7,7 @@ MAINTAINER xueyi
VOLUME /home/xueyi
# 创建目录
RUN mkdir -p /home/xueyi
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 指定路径
WORKDIR /home/xueyi
# 复制jar文件到路径
diff --git a/xueyi-modules/xueyi-message/pom.xml b/xueyi-modules/xueyi-message/pom.xml
index 405bfafe..628483eb 100644
--- a/xueyi-modules/xueyi-message/pom.xml
+++ b/xueyi-modules/xueyi-message/pom.xml
@@ -41,30 +41,65 @@
spring-boot-starter-actuator
+
+
+ org.springframework.integration
+ spring-integration-mqtt
+ 5.5.14
+
+
+ com.corundumstudio.socketio
+ netty-socketio
+ 1.7.13
+
+
+ io.socket
+ socket.io-client
+ 1.0.0
+
+
com.xueyi
xueyi-common-log
+
com.xueyi
xueyi-common-web
+
+ com.xueyi
+ xueyi-common-mqtt
+ 2.5.0
+
+
com.xueyi
xueyi-common-swagger
+
+
+ com.xueyi
+ xueyi-common-mqtt
+
+
com.xueyi
xueyi-api-file
+
+ com.xueyi
+ xueyi-api-system
+
+
@@ -81,6 +116,20 @@
+
+ maven-resources-plugin
+ org.apache.maven.plugins
+
+ @
+ false
+
+
+
+
+ src/main/resources
+ true
+
+
diff --git a/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/comfiguration/MqttReceiveConfig.java b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/comfiguration/MqttReceiveConfig.java
new file mode 100644
index 00000000..437b0a19
--- /dev/null
+++ b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/comfiguration/MqttReceiveConfig.java
@@ -0,0 +1,75 @@
+package com.xueyi.message.comfiguration;
+
+import com.xueyi.common.mqtt.configure.MqttProperties;
+import com.xueyi.common.mqtt.service.IMqttMessageHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.integration.channel.ExecutorChannel;
+import org.springframework.integration.dsl.IntegrationFlow;
+import org.springframework.integration.dsl.IntegrationFlows;
+import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
+import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
+import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+public class MqttReceiveConfig {
+
+ @Autowired
+ private MqttProperties mqttProperties;
+ @Autowired
+ private IMqttMessageHandler mqttMessageHandler;
+
+
+ // 入站消息管道
+ @Bean
+ public MessageChannel mqttInboundChannel(){
+ return new DirectChannel();
+ }
+
+ // Mqtt 管道适配器
+ @Bean
+ public MqttPahoMessageDrivenChannelAdapter adapter(MqttPahoClientFactory factory){
+ return new MqttPahoMessageDrivenChannelAdapter(mqttProperties.getInClientId(),factory,mqttProperties.getDefaultTopic().split(","));
+ }
+
+ @Bean
+ public IntegrationFlow mqttMessageInbound(MqttPahoMessageDrivenChannelAdapter adapter){
+ adapter.setCompletionTimeout(5000);
+ adapter.setConverter(new DefaultPahoMessageConverter());
+ //入站投递的通道
+ adapter.setOutputChannel(mqttInboundChannel());
+ adapter.setQos(1);
+ return IntegrationFlows.from(adapter)
+ .channel(new ExecutorChannel(mqttThreadPoolTaskExecutor()))
+ .handle(mqttMessageHandler)
+ .get();
+ }
+
+ @Bean
+ public ThreadPoolTaskExecutor mqttThreadPoolTaskExecutor()
+ {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ // 最大可创建的线程数
+ int maxPoolSize = 200;
+ executor.setMaxPoolSize(maxPoolSize);
+ // 核心线程池大小
+ int corePoolSize = 50;
+ executor.setCorePoolSize(corePoolSize);
+ // 队列最大长度
+ int queueCapacity = 1000;
+ executor.setQueueCapacity(queueCapacity);
+ // 线程池维护线程所允许的空闲时间
+ int keepAliveSeconds = 300;
+ executor.setKeepAliveSeconds(keepAliveSeconds);
+ // 线程池对拒绝任务(无线程可用)的处理策略
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ return executor;
+ }
+}
diff --git a/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/handler/MqttMessageHandle.java b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/handler/MqttMessageHandle.java
new file mode 100644
index 00000000..dc505357
--- /dev/null
+++ b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/handler/MqttMessageHandle.java
@@ -0,0 +1,139 @@
+package com.xueyi.message.handler;
+
+import com.xueyi.common.core.utils.core.SpringUtils;
+import com.xueyi.common.mqtt.annotation.MqttService;
+import com.xueyi.common.mqtt.annotation.MqttTopic;
+import com.xueyi.common.mqtt.service.IMqttMessageHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.MessageHandler;
+import org.springframework.messaging.MessagingException;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * mqtt消息处理类
+ * 这里的代码是在spring-integration-mqtt的基础上修改的
+ * 他的代码是在接收到消息后 直接调用了方法
+ * 我这里是把消息放到线程池里面去处理
+ * 这样就不会阻塞mqtt的消息接收
+ */
+@Component
+public class MqttMessageHandle implements IMqttMessageHandler {
+
+ @Value("${spring.profiles.active}")
+ private String activeProfile;
+
+ private static final Logger log = LoggerFactory.getLogger(MqttMessageHandle.class);
+
+ // 包含 @MqttService注解 的类(Component)
+ public static Map mqttServices;
+
+ /**
+ * 所有mqtt到达的消息都会在这里处理
+ * 要注意这个方法是在线程池里面运行的
+ * @param message message
+ */
+ @Override
+ public void handleMessage(Message> message) throws MessagingException {
+ getMqttTopicService(message);
+
+ }
+
+ public Map getMqttServices(){
+ if(mqttServices==null){
+ mqttServices = SpringUtils.getBeansByAnnotation(MqttService.class);
+ }
+ return mqttServices;
+ }
+
+ public void getMqttTopicService(Message> message){
+ // 在这里 我们根据不同的 主题 分发不同的消息
+ String receivedTopic = message.getHeaders().get("mqtt_receivedTopic",String.class);
+ log.info("receivedTopic = {},message = {}", receivedTopic ,message.getPayload());
+ if(receivedTopic==null || "".equals(receivedTopic)){
+ return;
+ }
+ for(Map.Entry entry : getMqttServices().entrySet()){
+ // 把所有带有 @MqttService 的类遍历
+ Class> clazz = entry.getValue().getClass();
+ // 获取他所有方法
+ Method[] methods = clazz.getDeclaredMethods();
+ for ( Method method: methods ){
+ if (method.isAnnotationPresent(MqttTopic.class)){
+ // 如果这个方法有 这个注解
+ MqttTopic handleTopic = method.getAnnotation(MqttTopic.class);
+ String topicName = "/" + activeProfile + handleTopic.value();
+ if(isMatch(receivedTopic,topicName)){
+ // 并且 这个 topic 匹配成功
+ try {
+ method.invoke(SpringUtils.getBean(clazz),message);
+ return;
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ log.error("代理发生问题");
+ } catch (InvocationTargetException e) {
+ log.error("执行 {} 方法出现错误",handleTopic.value(),e);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * mqtt 订阅的主题与我实际的主题是否匹配
+ * @param topic 是实际的主题
+ * @param pattern 是我订阅的主题 可以是通配符模式
+ * @return 是否匹配
+ */
+ public static boolean isMatch(String topic, String pattern){
+
+ if((topic==null) || (pattern==null) ){
+ return false;
+ }
+
+ if(topic.equals(pattern)){
+ // 完全相等是肯定匹配的
+ return true;
+ }
+
+ if("#".equals(pattern)){
+ // # 号代表所有主题 肯定匹配的
+ return true;
+ }
+ String[] splitTopic = topic.split("/");
+ String[] splitPattern = pattern.split("/");
+
+ boolean match = true;
+
+ // 如果包含 # 则只需要判断 # 前面的
+ for (int i = 0; i < splitPattern.length; i++) {
+ if(!"#".equals(splitPattern[i])){
+ // 不是# 号 正常判断
+ if(i>=splitTopic.length){
+ // 此时长度不相等 不匹配
+ match = false;
+ break;
+ }
+ if(!splitTopic[i].equals(splitPattern[i]) && !"+".equals(splitPattern[i])){
+ // 不相等 且不等于 +
+ match = false;
+ break;
+ }
+ }
+ else {
+ // 是# 号 肯定匹配的
+ break;
+ }
+ }
+
+ return match;
+ }
+
+}
diff --git a/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/handler/MqttTopicHandle.java b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/handler/MqttTopicHandle.java
new file mode 100644
index 00000000..2db8a67f
--- /dev/null
+++ b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/handler/MqttTopicHandle.java
@@ -0,0 +1,91 @@
+package com.xueyi.message.handler;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.xueyi.common.core.constant.basic.SecurityConstants;
+import com.xueyi.common.core.web.result.R;
+import com.xueyi.common.mqtt.annotation.MqttService;
+import com.xueyi.common.mqtt.annotation.MqttTopic;
+import com.xueyi.message.api.transfer.domain.vo.DmDeployScheduleVo;
+import com.xueyi.system.api.device.domain.vo.DeviceTenantSourceMergeVo;
+import com.xueyi.system.api.device.feign.RemoteDeviceTenantMergeService;
+import com.xueyi.system.api.digitalmans.feign.RemoteDigitalmanMqttService;
+import com.xueyi.system.api.version.feign.RemoteReleaseManagerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.messaging.Message;
+import org.springframework.stereotype.Component;
+
+
+@MqttService
+@Component
+public class MqttTopicHandle {
+
+ private static final Logger log = LoggerFactory.getLogger(MqttTopicHandle.class);
+ @Autowired
+ private RemoteDeviceTenantMergeService remoteDeviceTenantMergeService;
+
+ @Autowired
+ private RemoteDigitalmanMqttService remoteDigitalmanMqttService;
+
+ @Autowired
+ private RemoteReleaseManagerService remoteReleaseManagerService;
+
+ /**
+ * 以下内容是使用范例
+ // 这里的 # 号是通配符
+ @MqttTopic("test/#")
+ public void test(Message> message){
+ log.info("test="+message.getPayload());
+ }
+
+ // 这里的 + 号是通配符
+ @MqttTopic("topic/+/+/up")
+ public void up(Message> message){
+ log.info("up="+message.getPayload());
+ }
+
+ // 注意 你必须先订阅
+ @MqttTopic("topic/1/2/down")
+ public void down(Message> message){
+ log.info("down="+message.getPayload());
+ }
+ */
+
+ @MqttTopic("digital_man/+/reply/setup")
+ public void setup(Message message){
+ log.info("down="+message.getPayload());
+ }
+
+ @MqttTopic("/digital_man/heart_beat")
+ //@TenantIgnore(tenantLine = true)
+ public void heartbeat(Message message){
+ System.err.println("rev heartbeat mqtt msg:"+message.getPayload().toString());
+
+ String messageStr = message.getPayload().toString();
+ JSONObject heartBeatObj = JSONObject.parseObject(messageStr);
+ String devId = heartBeatObj.getString("devId");
+ DeviceTenantSourceMergeVo vo = remoteDeviceTenantMergeService.selectDeviceTenantSourceMerge(devId);
+ remoteDigitalmanMqttService.heartbeat(messageStr, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER);
+
+ }
+
+ @MqttTopic("/digital_man/log_upload_notification")
+ public void logUpload(Message message){
+ System.err.println("rev logUpload mqtt msg:"+message.getPayload().toString());
+
+ String messageStr = message.getPayload().toString();
+ JSONObject heartBeatObj = JSONObject.parseObject(messageStr);
+ String devId = heartBeatObj.getString("devId");
+ DeviceTenantSourceMergeVo vo = remoteDeviceTenantMergeService.selectDeviceTenantSourceMerge(devId);
+ remoteDigitalmanMqttService.logUpload(messageStr, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER);
+ }
+
+ @MqttTopic("/digital_man/reply/setup")
+ public void setupByDevId(Message message) {
+ log.info("rev setup mqtt msg:" + message.getPayload().toString());
+ DmDeployScheduleVo vo = JSONObject.parseObject(message.getPayload().toString(), DmDeployScheduleVo.class);
+ R result = remoteReleaseManagerService.syncDeployStatus(vo);
+
+ }
+}
diff --git a/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/controller/ApiController.java b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/controller/ApiController.java
index 43b571bf..e52430db 100644
--- a/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/controller/ApiController.java
+++ b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/controller/ApiController.java
@@ -1,6 +1,7 @@
package com.xueyi.message.transfer.controller;
+import com.alibaba.fastjson2.JSONObject;
import com.xueyi.common.cache.utils.SourceUtil;
import com.xueyi.common.core.constant.basic.SecurityConstants;
import com.xueyi.common.core.constant.digitalman.InitConstants;
@@ -9,27 +10,34 @@ import com.xueyi.common.core.web.result.AjaxResult;
import com.xueyi.common.core.web.result.R;
import com.xueyi.message.api.transfer.domain.vo.DmActiveVo;
import com.xueyi.message.api.transfer.domain.vo.DmDeviceVo;
+import com.xueyi.message.transfer.service.impl.MessageQueueServiceImpl;
import com.xueyi.system.api.authority.feign.RemoteLoginService;
import com.xueyi.system.api.device.domain.vo.DeviceTenantSourceMergeVo;
import com.xueyi.system.api.device.feign.RemoteDeviceTenantMergeService;
import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto;
import com.xueyi.system.api.digitalmans.domain.dto.DmSkillDto;
import com.xueyi.system.api.digitalmans.domain.dto.DmSyncDigitalmanDto;
-import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo;
+import com.xueyi.system.api.digitalmans.domain.vo.DmBroadcastVo;
+import com.xueyi.system.api.digitalmans.domain.vo.DmReceptionVo;
+import com.xueyi.system.api.digitalmans.feign.RemoteBroadcastService;
import com.xueyi.system.api.digitalmans.feign.RemoteDigitalmanService;
import com.xueyi.system.api.digitalmans.feign.RemoteManDeviceService;
+import com.xueyi.system.api.digitalmans.feign.RemoteReceptionService;
import com.xueyi.system.api.digitalmans.feign.RemoteSkillService;
import com.xueyi.system.api.model.Source;
import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto;
+import com.xueyi.system.api.resource.feign.RemoteH5ConfigService;
import com.xueyi.system.api.staff.domain.vo.DmStaffFeature;
import com.xueyi.system.api.staff.feign.RemoteStaffService;
-import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.util.MimeTypeUtils;
-import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
@@ -56,12 +64,25 @@ public class ApiController {
@Autowired
RemoteDigitalmanService remoteDigitalmanService;
+ @Autowired
+ RemoteReceptionService remoteReceptionService;
+
@Autowired
RemoteDeviceTenantMergeService deviceTenantMergeServicel;
@Autowired
RemoteManDeviceService manDeviceService;
+ @Autowired
+ RemoteBroadcastService remoteBroadcastService;
+
+ @Autowired
+ MessageQueueServiceImpl messageQueueService;
+
+ @Autowired
+ RemoteH5ConfigService remoteH5ConfigService;
+
+
@RequestMapping(value = "/heartbeat", method = {RequestMethod.POST})
@ResponseBody
@@ -70,6 +91,11 @@ public class ApiController {
System.out.println("heartbeat: device: " + vo.getDevId() + " timestamp: " + sysTime);
Integer dex_res = 0;
// 根据设备id获取租户信息
+ R manDeviceDtoR = manDeviceService.manDeviceInfoInner(vo.getDevId());
+ if (manDeviceDtoR.isFail()) {
+ return AjaxResult.warn("设备号获取失败,请检查");
+ }
+ // 根据设备id获取租户信息
R enterpriseDto = remoteStaffService.tenantIdInner(vo.getEnterpriseName());
if (enterpriseDto.isFail()) {
return AjaxResult.warn("企业号获取失败,请检查");
@@ -78,7 +104,7 @@ public class ApiController {
// 更新心跳
redisTemplate.opsForValue().set("group:dgman:" + vo.getDevId() + ":" + MessageConstants.HEART_BEAT_SYNC,String.valueOf(sysTime));
- String timestamp = redisTemplate.opsForValue().get("group:dgman:" + enterpriseDto.getData().getId() + ":" + MessageConstants.STAFF_SYNC);
+ String timestamp = redisTemplate.opsForValue().get("group:dgman:" + manDeviceDtoR.getData().getTId() + ":" + MessageConstants.STAFF_SYNC);
if (timestamp != null && !timestamp.equalsIgnoreCase(vo.getTimestamp()) && Long.parseLong(timestamp) > Long.parseLong(vo.getTimestamp())) {
@@ -92,6 +118,10 @@ public class ApiController {
if (timestamp != null && !timestamp.equalsIgnoreCase(vo.getTimestamp()) && Long.parseLong(timestamp) > Long.parseLong(vo.getTimestamp())) {
dex_res += 0x100;
}
+ timestamp = redisTemplate.opsForValue().get("group:dgman:" + enterpriseDto.getData().getId() + ":" + MessageConstants.H5_CONFIG_SYNC);
+ if (timestamp != null && !timestamp.equalsIgnoreCase(vo.getTimestamp()) && Long.parseLong(timestamp) > Long.parseLong(vo.getTimestamp())) {
+ dex_res += 0x10000;
+ }
// if (!timestamp.equalsIgnoreCase(vo.getTimestamp()) && Long.parseLong(timestamp) > Long.parseLong(vo.getTimestamp())) {
// dex_res += 0x10;
// }
@@ -129,33 +159,71 @@ public class ApiController {
switch (vo.getType()) {
// 人员信息
case 0:
- timestamp = redisTemplate.opsForValue().get("group:dgman:" + manDeviceDtoR.getData().getTId() + ":" + MessageConstants.STAFF_SYNC );
+ timestamp = redisTemplate.opsForValue().get("group:dgman:" + manDeviceDtoR.getData().getTId() + ":" + MessageConstants.STAFF_SYNC);
if (timestamp == null) {
AjaxResult.warn("当前时间戳获取失败");
}
- R> staffFeatureList = remoteStaffService.listInner(vo.getDevId(), vo.getTimestamp(), manDeviceDtoR.getData().getTId(),source.getMaster(), SecurityConstants.INNER);
+ R> staffFeatureList = remoteStaffService.listInner(vo.getDevId(), vo.getTimestamp(), manDeviceDtoR.getData().getTId(), source.getMaster(), SecurityConstants.INNER);
if (staffFeatureList.isFail())
return AjaxResult.warn("新增失败,请检查!");
- staffFeatureList.getData().forEach(item->
+ staffFeatureList.getData().forEach(item ->
{
- if (item.getFeature() != "" ) {
- String ops_str = item.getFeature().substring(1,item.getFeature().indexOf("]"));
+ if (item.getFeature() != "") {
+ String ops_str = item.getFeature().substring(1, item.getFeature().indexOf("]"));
item.setDFeatures(Arrays.stream(ops_str.split(",")).map(Double::valueOf).collect(Collectors.toList()));
}
item.setFeature("");
});
- return AjaxResult.success(staffFeatureList.getData()).put("timestamp",timestamp);
+ return AjaxResult.success(staffFeatureList.getData()).put("timestamp", timestamp);
case 1:
System.out.println("=========租户号:" + manDeviceDtoR.getData().getTId() + ", 数据源: " + source.getMaster() + " 设备号:" + vo.getDevId());
- R> skillList = remoteSkillService.skilllistInner(vo.getDevId(),vo.getTimestamp(), manDeviceDtoR.getData().getTId(),source.getMaster(), SecurityConstants.INNER);
+ R> skillList = remoteSkillService.skilllistInner(vo.getDevId(), vo.getTimestamp(), manDeviceDtoR.getData().getTId(), source.getMaster(), SecurityConstants.INNER);
if (skillList.isFail())
return AjaxResult.warn("新增失败,请检查");
- return AjaxResult.success(skillList.getData()).put("timestamp",timestamp);
+ return AjaxResult.success(skillList.getData()).put("timestamp", timestamp);
case 2:
- R syncDmDto = remoteDigitalmanService.listInner(manDeviceDtoR.getData().getManCode(),vo.getTimestamp(), manDeviceDtoR.getData().getTId(),source.getMaster(), SecurityConstants.INNER);
+ R syncDmDto = remoteDigitalmanService.listInner(manDeviceDtoR.getData().getManCode(), vo.getTimestamp(), manDeviceDtoR.getData().getTId(), source.getMaster(), SecurityConstants.INNER);
if (syncDmDto.isFail())
return AjaxResult.warn("新增失败,请检查");
- return AjaxResult.success(syncDmDto.getData()).put("timestamp",timestamp);
+ // 添加播报信息
+ R> broadcastVoR = remoteBroadcastService.innerlist(manDeviceDtoR.getData().getManCode(), manDeviceDtoR.getData().getTId(), source.getMaster(), SecurityConstants.INNER);
+ if (!broadcastVoR.isFail()) {
+ syncDmDto.getData().setBroadcast(broadcastVoR.getData());
+ }
+
+ return AjaxResult.success(syncDmDto.getData()).put("timestamp", timestamp);
+ case 3:
+ R receptionVo = remoteReceptionService.getReceptionTaskInner(manDeviceDtoR.getData().getManCode(), manDeviceDtoR.getData().getTId(), source.getMaster(), SecurityConstants.INNER);
+ if (receptionVo.isFail()){
+ return AjaxResult.warn("接待模式任务获取失败,请检查");
+ }
+
+
+// JSONObject jsObject = new JSONObject();
+// jsObject.put("code",200);
+// JSONObject data = new JSONObject();
+// data.put("name", "A市长考察");
+// data.put("date", "07-23");
+// JSONArray gArray = new JSONArray();
+// gArray.add(1676570397299970049L);
+// data.put("guide", gArray);
+// JSONArray fArray = new JSONArray();
+// fArray.add(1682948239952818177L);
+// fArray.add(1683035071285399554L);
+// data.put("first", fArray);
+// JSONArray sArray = new JSONArray();
+// sArray.add(1682328924238446593L);
+// data.put("second", sArray);
+//
+// jsObject.put("data",data);
+// jsObject.put("msg","success");
+ return AjaxResult.success(receptionVo.getData());
+ case 4:
+ R propertyR = remoteH5ConfigService.syncH5Config(manDeviceDtoR.getData().getTId().toString());
+ if (propertyR.isFail()) {
+ return AjaxResult.warn("配置同步失败,请检查");
+ }
+ return AjaxResult.success(propertyR.getData());
}
}
return AjaxResult.success();
@@ -177,9 +245,9 @@ public class ApiController {
vo.setActivateTime(new Date());
// 设备是否已绑定其他账号
R manDeviceDtoR = manDeviceService.manDeviceInfoInner(vo.getSncode());
- if (manDeviceDtoR.getData() != null) {
- return AjaxResult.warn("设备号已绑定其他账号");
- }
+// if (manDeviceDtoR.getData() != null) {
+// return AjaxResult.warn("设备号已绑定其他账号");
+// }
R regR = manDeviceService.manDeviceInfoInnerUpdate(vo);
if (regR.getData() == 0) {
return AjaxResult.warn("更新设备信息失败,请查询log");
@@ -221,6 +289,55 @@ public class ApiController {
return AjaxResult.success(System.currentTimeMillis() - Long.parseLong(timestamp) >10 * 60 * 1000 ? InitConstants.DEVICE_ACTIVATE_STATUS_OFFLINE : InitConstants.DEVICE_ACTIVATE_STATUS_ONLINE);
}
+ /**
+ * @Author yangkai
+ * @Description //TODO
+ * @Date 2023/8/11
+ * @Param
+ * @return
+ *
+ *
+ * manCount
+ * serviceTimeCount
+ * chatTimes
+ * chatDurationCount
+ * skillExecuteTimes
+ *
+ * recognizedPersonCount
+ * servicePerCount
+ *
+ * receptionServiceCount
+ * meetingServiceCount
+ * visitServiceCount
+ * largeModelKnowledgeBaseGroupChangeNum
+ * largeModelKnowledgeBaseChangeNum
+ **/
+ @RequestMapping(value = "/broadcast", method = {RequestMethod.GET})
+ @ResponseBody
+ public R broadcast(@RequestParam(value = "channel") String channel){
+ try {
+ JSONObject json = new JSONObject();
+ /*json.put("chatTimes", 865531);
+ json.put("chatDurationCount", 10068);
+// json.put("skillExecuteTimes", 10);
+ json.put("recognizedPersonCount", 13899);
+ json.put("receptionServiceCount", 1824);
+ json.put("meetingServiceCount", 1762);
+ json.put("visitServiceCount", 523);*/
+
+ R objectR = remoteDigitalmanService.mansInfo();
+ JSONObject jsonObj = objectR.getData();
+ jsonObj.keySet().forEach(key -> json.put(key, jsonObj.get(key)));
+ String str = json.toJSONString();
+
+ messageQueueService.broadcast(channel, str);
+ return R.ok(str);
+ }catch (Exception e){
+ e.printStackTrace();
+ return R.fail(e.getMessage());
+ }
+ }
+
@RequestMapping(value = "/get_activate/{snCode}", method = {RequestMethod.GET})
@ResponseBody
public AjaxResult activate(@PathVariable(value = "snCode") String snCode, HttpServletResponse response) {
@@ -232,4 +349,20 @@ public class ApiController {
System.out.println(manDeviceDtR.getData().toString());
return AjaxResult.success("true");
}
+
+ @RequestMapping(value = "/get_config_info/{deviceId}", method = {RequestMethod.GET})
+ @ResponseBody
+ public AjaxResult getConfigInfo(@PathVariable(value = "deviceId") String deviceId, HttpServletResponse response) {
+ // 根据设备id获取租户信息
+ R manDeviceDtoR = manDeviceService.manDeviceInfoInner(deviceId);
+ String tenantId = null;
+ if (manDeviceDtoR.isOk() && manDeviceDtoR.getData() != null) {
+ tenantId = manDeviceDtoR.getData().getTId().toString();
+ }
+ R propertyR = remoteH5ConfigService.syncH5Config(tenantId);
+ if (propertyR.isFail()) {
+ return AjaxResult.warn("配置同步失败,请检查");
+ }
+ return AjaxResult.success(propertyR.getData());
+ }
}
diff --git a/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/service/IMessageQueueService.java b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/service/IMessageQueueService.java
new file mode 100644
index 00000000..440f1d4e
--- /dev/null
+++ b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/service/IMessageQueueService.java
@@ -0,0 +1,19 @@
+package com.xueyi.message.transfer.service;
+
+import com.corundumstudio.socketio.SocketIOClient;
+import com.xueyi.message.api.transfer.domain.vo.Message;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface IMessageQueueService {
+
+// public List getAll();
+//
+// public boolean add(Message message);
+
+ public void broadcast(String channel, String message);
+
+ public Collection getAllClients();
+
+}
diff --git a/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/service/impl/MessageQueueServiceImpl.java b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/service/impl/MessageQueueServiceImpl.java
new file mode 100644
index 00000000..c413e04d
--- /dev/null
+++ b/xueyi-modules/xueyi-message/src/main/java/com/xueyi/message/transfer/service/impl/MessageQueueServiceImpl.java
@@ -0,0 +1,168 @@
+package com.xueyi.message.transfer.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.corundumstudio.socketio.AckRequest;
+import com.corundumstudio.socketio.Configuration;
+import com.corundumstudio.socketio.SocketIOClient;
+import com.corundumstudio.socketio.SocketIOServer;
+import com.corundumstudio.socketio.listener.ConnectListener;
+import com.corundumstudio.socketio.listener.DataListener;
+import com.corundumstudio.socketio.listener.DisconnectListener;
+import com.corundumstudio.socketio.listener.ExceptionListener;
+import com.xueyi.common.core.utils.InetAddressUtils;
+import com.xueyi.message.api.transfer.domain.vo.Message;
+import com.xueyi.message.transfer.service.IMessageQueueService;
+import io.netty.channel.ChannelHandlerContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+public class MessageQueueServiceImpl implements IMessageQueueService {
+
+ @Autowired
+ RedisTemplate redisTemplate;
+ private Integer port = 9901;
+
+ private SocketIOServer server;
+ private ConcurrentHashMap messageMap = new ConcurrentHashMap<>();
+
+ MessageQueueServiceImpl(){
+ startServer(port);
+ }
+
+// @Override
+// public List getAll(){
+// List list = new ArrayList();
+// Iterator> entries = messageMap.entrySet().iterator();
+// while(entries.hasNext()){
+// Map.Entry entry = entries.next();
+// Message value = entry.getValue();
+// if(System.currentTimeMillis()- value.getTimestamp() > 10000){
+// messageMap.remove(entry.getKey());
+// }else{
+// list.add(value);
+// }
+// }
+// if(list.size()>0){
+// return list;
+// }
+// return null;
+// }
+//
+// @Override
+// public boolean add(Message message){
+//
+// messageMap.put(message.getVid(),message);
+// return true;
+// }
+
+ @Override
+ public void broadcast(String channel, String message){
+ server.getBroadcastOperations().sendEvent(channel,message);
+ }
+
+ @Override
+ public Collection getAllClients(){
+ return server.getAllClients();
+ }
+
+
+ private void startServer(int port){
+ Configuration config = new Configuration();
+ ExceptionListener exceptionListener = new ExceptionListener() {
+ @Override
+ public void onEventException(Exception e, List