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 list, SocketIOClient socketIOClient) { + + } + + @Override + public void onDisconnectException(Exception e, SocketIOClient socketIOClient) { + + } + + @Override + public void onConnectException(Exception e, SocketIOClient socketIOClient) { + + } + + @Override + public boolean exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) throws Exception { + channelHandlerContext.close(); + return true; + } + }; + try { + System.out.println("启动"); +// config.setHostname(InetAddressUtils.getLocalHostLANAddress().getHostAddress()); + config.setHostname("0.0.0.0"); + + } catch (Exception e) { + e.printStackTrace(); + } + config.setPort(port); + config.setExceptionListener(exceptionListener); + server = new SocketIOServer(config); + server.addConnectListener(new ConnectListener() { + // 添加客户端连接监听器 + @Override + public void onConnect(SocketIOClient client) { + System.out.println(client.getRemoteAddress().toString()); + if(client.getRemoteAddress().toString().contains("100.117") || client.getRemoteAddress().toString().contains("100.171")){ + client.disconnect(); + return; + } + client.sendEvent("connected", "hello"); + } + }); + + server.addEventListener("client_info", String.class, new DataListener(){ + @Override + public void onData(SocketIOClient client, String data, AckRequest ackRequest) throws ClassNotFoundException { + //客户端推送advert_info事件时,onData接受数据,这里是string类型的json数据,还可以为Byte[],object其他类型 + String sa = client.getRemoteAddress().toString(); + String clientIp = sa.substring(1,sa.indexOf(":"));//获取客户端连接的ip + Map params = client.getHandshakeData().getUrlParams();//获取客户端url参数 + System.out.println(clientIp+":客户端:************"+data); + } + }); +// server.addEventListener("remove_vinfromrsu", String.class, new DataListener() { +// @Override +// public void onData(SocketIOClient socketIOClient, String s, AckRequest ackRequest) throws Exception { +// System.out.println("remove_vinfromrsu : " + s); +// List list = JSON.parseArray(s, RsuEventSimulatorMessage.class); +// for (RsuEventSimulatorMessage item : list) { +// for (String vout : item.getVinouts()) { +// redisTemplate.opsForSet().remove("rsu_" + item.getRsuId(),vout); +// } +// } +// } +// }); +// server.addEventListener("screen_info", String.class, new DataListener(){ +// @Override +// public void onData(SocketIOClient client, String data, AckRequest ackRequest) throws ClassNotFoundException { +// VehicleGridCountItem item = ((JSONObject)JSON.parse(data)).toJavaObject(VehicleGridCountItem.class); +// gridCountItemMap.put(client,item); +// } +// }); + //添加客户端断开连接事件 + server.addDisconnectListener(new DisconnectListener(){ + @Override + public void onDisconnect(SocketIOClient client) { + String sa = client.getRemoteAddress().toString(); + String clientIp = sa.substring(1,sa.indexOf(":"));//获取设备ip + System.out.println(clientIp+"-------------------------"+"客户端已断开连接"); + //给客户端发送消息 + client.sendEvent("advert_info",clientIp+"客户端你好,我是服务端,期待下次和你见面"); + } + }); + server.start(); + } + +} diff --git a/xueyi-modules/xueyi-message/src/main/resources/bootstrap.yml b/xueyi-modules/xueyi-message/src/main/resources/bootstrap.yml index 1e0cf1ea..08108279 100644 --- a/xueyi-modules/xueyi-message/src/main/resources/bootstrap.yml +++ b/xueyi-modules/xueyi-message/src/main/resources/bootstrap.yml @@ -1,6 +1,6 @@ # Tomcat server: - port: 9700 + port: 9900 # Spring spring: @@ -9,7 +9,7 @@ spring: name: xueyi-message profiles: # 环境配置 - active: dev + active: @activatedProperties@ servlet: multipart: max-request-size: 20MB @@ -17,11 +17,15 @@ spring: 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-modules-auth/Dockerfile b/xueyi-modules/xueyi-modules-auth/Dockerfile new file mode 100644 index 00000000..16329b2e --- /dev/null +++ b/xueyi-modules/xueyi-modules-auth/Dockerfile @@ -0,0 +1,17 @@ +# 基础镜像 +FROM openjdk:17-oracle +# author +MAINTAINER xueyi + +# 挂载目录 +VOLUME /home/xueyi +# 创建目录 +RUN mkdir -p /home/xueyi +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +# 指定路径 +WORKDIR /home/xueyi +# 复制jar文件到路径 +COPY ./target/xueyi-modules-auth.jar /home/xueyi/xueyi-modules-auth.jar + +# 启动系统服务 +ENTRYPOINT ["java","-jar","xueyi-modules-auth.jar"] \ No newline at end of file diff --git a/xueyi-modules/xueyi-modules-auth/pom.xml b/xueyi-modules/xueyi-modules-auth/pom.xml new file mode 100644 index 00000000..9feeabe4 --- /dev/null +++ b/xueyi-modules/xueyi-modules-auth/pom.xml @@ -0,0 +1,105 @@ + + + + com.xueyi + xueyi-modules + 2.5.0 + + + 4.0.0 + + xueyi-modules-auth + + + xueyi-modules-auth数字人权限管理模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + com.xueyi + xueyi-common-log + + + + + com.xueyi + xueyi-common-web + + + + + com.xueyi + xueyi-common-swagger + + + + + com.xueyi + xueyi-api-system + + + + com.xueyi + xueyi-api-modules-auth + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + maven-resources-plugin + org.apache.maven.plugins + + @ + false + + + + + + src/main/resources + true + + + + diff --git a/xueyi-modules/xueyi-modules-auth/sonar-project.properties b/xueyi-modules/xueyi-modules-auth/sonar-project.properties new file mode 100644 index 00000000..b3eacf73 --- /dev/null +++ b/xueyi-modules/xueyi-modules-auth/sonar-project.properties @@ -0,0 +1,15 @@ +sonar.projectKey=digimeta-MultiSaas-modules-auth + +sonar.projectName=digimeta-MultiSaas-modules-auth +sonar.sourceEncoding=UTF-8 +sonar.projectVersion=0.8 + + + +sonar.sources=. +sonar.exclusions=**/test/**,**/target/** +sonar.java.binaries=. + +sonar.java.source=1.8 +sonar.java.target=1.8 + diff --git a/xueyi-modules/xueyi-modules-auth/src/main/java/com/xueyi/modules/auth/XueYiModulesAuthApplication.java b/xueyi-modules/xueyi-modules-auth/src/main/java/com/xueyi/modules/auth/XueYiModulesAuthApplication.java new file mode 100644 index 00000000..dbc3fc50 --- /dev/null +++ b/xueyi-modules/xueyi-modules-auth/src/main/java/com/xueyi/modules/auth/XueYiModulesAuthApplication.java @@ -0,0 +1,32 @@ +package com.xueyi.modules.auth; + +import com.xueyi.common.security.annotation.EnableCustomConfig; +import com.xueyi.common.security.annotation.EnableRyFeignClients; +import com.xueyi.common.swagger.annotation.EnableCustomSwagger; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 业务权限模块 + * + * @author yinruoxi + */ +@EnableCustomConfig +@EnableCustomSwagger +@EnableRyFeignClients +@SpringBootApplication +public class XueYiModulesAuthApplication { + public static void main(String[] args) { + SpringApplication.run(XueYiModulesAuthApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ 业务权限管理模块启动成功 ლ(´ڡ`ლ)゙ \n" + + " _____ __ ____ __ \n" + + " \\ _\\ / / \\ \\ / / \n" + + " .-./ ). / ' \\ _. / ' \n" + + " \\ '_ .') .' _( )_ .' \n" + + " (_ (_) _) ' ___(_ o _)' \n" + + " / \\ \\ | |(_,_)' \n" + + " `-'`-' \\| `-' / \n" + + " / / \\ \\\\ / \n" + + " '--' '----'`-..-' "); + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-modules-auth/src/main/java/com/xueyi/modules/auth/controller/SkillAuthApiController.java b/xueyi-modules/xueyi-modules-auth/src/main/java/com/xueyi/modules/auth/controller/SkillAuthApiController.java new file mode 100644 index 00000000..08b4aebb --- /dev/null +++ b/xueyi-modules/xueyi-modules-auth/src/main/java/com/xueyi/modules/auth/controller/SkillAuthApiController.java @@ -0,0 +1,45 @@ +package com.xueyi.modules.auth.controller; + + +import com.xueyi.common.core.constant.basic.SecurityConstants; +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.web.controller.BaseApiController; +import com.xueyi.modules.auth.api.domain.vo.IntentionReqDto; +import com.xueyi.modules.auth.api.feign.RemoteSkillAuthService; +import com.xueyi.system.api.device.domain.vo.DeviceTenantSourceMergeVo; +import org.springframework.beans.factory.annotation.Autowired; +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.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +@RestController +@RequestMapping("/skill/api") +public class SkillAuthApiController extends BaseApiController { + + + @Autowired + private RemoteSkillAuthService skillAuthService; + + /** + * @Author yangkai + * @Description 技能权限验证,判断的意图对应的技能和传递的人员进行权限比对 + * @Date 2023/7/31 + * @Param IntentionReqDto对象 + * @return AjaxResult + **/ + @RequestMapping(value = "/skillAuth", method = {RequestMethod.POST}) + @ResponseBody + public AjaxResult auth(@Valid @RequestBody IntentionReqDto reqDto, HttpServletResponse response) { + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(reqDto.getDevId()); + + return skillAuthService.skillAuth(reqDto, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + + } + + +} diff --git a/xueyi-modules/xueyi-modules-auth/src/main/resources/banner.txt b/xueyi-modules/xueyi-modules-auth/src/main/resources/banner.txt new file mode 100644 index 00000000..c1cca225 --- /dev/null +++ b/xueyi-modules/xueyi-modules-auth/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _______ _________ _________ _______ _ _______ _ _________ +|\ /||\ /|( ____ \|\ /|\__ __/ \__ __/( ____ \( ( /|( ___ )( ( /|\__ __/ +( \ / )| ) ( || ( \/( \ / ) ) ( ) ( | ( \/| \ ( || ( ) || \ ( | ) ( + \ (_) / | | | || (__ \ (_) / | | _____ | | | (__ | \ | || (___) || \ | | | | + ) _ ( | | | || __) \ / | |(_____)| | | __) | (\ \) || ___ || (\ \) | | | + / ( ) \ | | | || ( ) ( | | | | | ( | | \ || ( ) || | \ | | | +( / \ )| (___) || (____/\ | | ___) (___ | | | (____/\| ) \ || ) ( || ) \ | | | +|/ \|(_______)(_______/ \_/ \_______/ )_( (_______/|/ )_)|/ \||/ )_) )_( \ No newline at end of file diff --git a/xueyi-modules/xueyi-modules-auth/src/main/resources/bootstrap.yml b/xueyi-modules/xueyi-modules-auth/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..5c639522 --- /dev/null +++ b/xueyi-modules/xueyi-modules-auth/src/main/resources/bootstrap.yml @@ -0,0 +1,35 @@ +# Tomcat +server: + port: 9970 + +# Spring +spring: + application: + # 应用名称 + name: xueyi-modules-auth + profiles: + # 环境配置 + active: @activatedProperties@ + servlet: + multipart: + max-request-size: 20MB + max-file-size: 100MB + cloud: + nacos: + discovery: + + # 服务注册地址 + server-addr: @nacos.host@:@nacos.port@ + namespace: @nacos.namespace@ + + config: + # 配置中心地址 + 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} \ No newline at end of file diff --git a/xueyi-modules/xueyi-modules-auth/src/main/resources/logback.xml b/xueyi-modules/xueyi-modules-auth/src/main/resources/logback.xml new file mode 100644 index 00000000..870e1da2 --- /dev/null +++ b/xueyi-modules/xueyi-modules-auth/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/Dockerfile b/xueyi-modules/xueyi-nlt/Dockerfile new file mode 100644 index 00000000..a72da462 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/Dockerfile @@ -0,0 +1,17 @@ +# 基础镜像 +FROM openjdk:17-oracle +# author +MAINTAINER xueyi + +# 挂载目录 +VOLUME /home/xueyi +# 创建目录 +RUN mkdir -p /home/xueyi +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +# 指定路径 +WORKDIR /home/xueyi +# 复制jar文件到路径 +COPY ./target/xueyi-modules-nlt.jar /home/xueyi/xueyi-modules-nlt.jar + +# 启动系统服务 +ENTRYPOINT ["java","-jar","xueyi-modules-nlt.jar"] \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/pom.xml b/xueyi-modules/xueyi-nlt/pom.xml new file mode 100644 index 00000000..74addaa2 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/pom.xml @@ -0,0 +1,112 @@ + + + + com.xueyi + xueyi-modules + 2.5.0 + + 4.0.0 + + xueyi-modules-nlt + + + xueyi-modules-nlt大模型处理模块 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.squareup.okhttp3 + okhttp + 3.9.1 + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + com.xueyi + xueyi-common-log + + + + + com.xueyi + xueyi-common-web + + + + + com.xueyi + xueyi-common-swagger + + + + + com.xueyi + xueyi-api-nlt + + + + com.xueyi + xueyi-api-system + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + maven-resources-plugin + org.apache.maven.plugins + + @ + false + + + + + + src/main/resources + true + + + + diff --git a/xueyi-modules/xueyi-nlt/sonar-project.properties b/xueyi-modules/xueyi-nlt/sonar-project.properties new file mode 100644 index 00000000..d554b7c0 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/sonar-project.properties @@ -0,0 +1,15 @@ +sonar.projectKey=digimeta-MultiSaas-nlt + +sonar.projectName=digimeta-MultiSaas-nlt +sonar.sourceEncoding=UTF-8 +sonar.projectVersion=0.8 + + + +sonar.sources=. +sonar.exclusions=**/test/**,**/target/** +sonar.java.binaries=. + +sonar.java.source=1.8 +sonar.java.target=1.8 + diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/XueYiNltApplication.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/XueYiNltApplication.java new file mode 100644 index 00000000..146b79fa --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/XueYiNltApplication.java @@ -0,0 +1,29 @@ +package com.xueyi.nlt; + + +import com.xueyi.common.security.annotation.EnableCustomConfig; +import com.xueyi.common.security.annotation.EnableRyFeignClients; +import com.xueyi.common.swagger.annotation.EnableCustomSwagger; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@EnableCustomConfig +@EnableCustomSwagger +@EnableRyFeignClients +@SpringBootApplication +public class XueYiNltApplication { + public static void main(String[] args) { + SpringApplication.run(XueYiNltApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ NLT模块启动成功 ლ(´ڡ`ლ)゙ \n" + + " _____ __ ____ __ \n" + + " \\ _\\ / / \\ \\ / / \n" + + " .-./ ). / ' \\ _. / ' \n" + + " \\ '_ .') .' _( )_ .' \n" + + " (_ (_) _) ' ___(_ o _)' \n" + + " / \\ \\ | |(_,_)' \n" + + " `-'`-' \\| `-' / \n" + + " / / \\ \\\\ / \n" + + " '--' '----'`-..-' "); + } + +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/NettyClient.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/NettyClient.java new file mode 100644 index 00000000..82620267 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/NettyClient.java @@ -0,0 +1,195 @@ +package com.xueyi.nlt.netty.client; + +import com.xueyi.nlt.netty.client.codec.WsChannelInitializer; +import com.xueyi.nlt.netty.client.handler.MockClientHandler; +import com.xueyi.nlt.netty.client.handler.NettyClientHandler; +import com.xueyi.nlt.netty.client.handler.NettyWebsocketClientHandler; +import com.xueyi.nlt.netty.client.message.ReceiveMessage; +import io.netty.bootstrap.Bootstrap; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.http.DefaultHttpHeaders; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.HttpServerCodec; +import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory; +import io.netty.handler.codec.http.websocketx.WebSocketVersion; +import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; +import io.netty.handler.timeout.IdleStateHandler; +import okhttp3.HttpUrl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.net.SocketAddress; +import java.net.URI; +import java.net.URL; +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Base64; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; + +@Component +public class NettyClient { + private static final Logger log = LoggerFactory.getLogger(NettyClient.class); + private final int PORT = 8000; + + + public static String hostUrl = "https://spark-api.xf-yun.com/v1.1/chat"; + public static String APPID = "3d9282da";//从开放平台控制台中获取 + public static String APIKEY = "7c217b3a313f4b66fcc14a8e97f85103";//从开放平台控制台中获取 + public static String APISecret = "ZTRiNDQwMTRlOTlmZDQwMDUwYTdjMDM0";//从开放平台控制台中获取 + public static NettyClient nettyClient; + + private String mHost; + + private int mPort; + + private NettyClientHandler mClientHandler; + + private ChannelFuture mChannelFuture; + + /** + * websocket配置 + */ + private WebsocketConfig websocketConfig; + + private Channel channel; + + /** + * 接口消息的接口 + */ + private ReceiveMessage receiveMessage; + + + public void connect() { + + + EventLoopGroup workerGroup = new NioEventLoopGroup(); + try { + HttpUrl authUrl = getAuthorizationUrl(hostUrl, APIKEY, APISecret); + String url = authUrl.toString().replace("https://","wss://").replace("http://","ws://"); + URI uri = new URI(url); + final boolean ssl = "wss".equalsIgnoreCase(url); + final SslContext sslCtx; + if (ssl) { + sslCtx = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build(); + } else { + sslCtx = null; + } + NettyClientHandler webSocketClientHandler = new NettyClientHandler( + WebSocketClientHandshakerFactory.newHandshaker(authUrl.uri() + , WebSocketVersion.V07 + , null + , false + , new DefaultHttpHeaders())); + + final NettyWebsocketClientHandler handler = + new NettyWebsocketClientHandler( + WebSocketClientHandshakerFactory.newHandshaker( + authUrl.uri(), WebSocketVersion.V13, null, true, new DefaultHttpHeaders()), receiveMessage); + + handler.setWebsocketConfig(websocketConfig); + + Bootstrap b = new Bootstrap(); +// mClientHandler = new NettyClientHandler(webSocketClientHandler); +// b.group(workerGroup).channel(NioSocketChannel.class) +// // KeepAlive +// .option(ChannelOption.SO_KEEPALIVE, true) +// // Handler +// .handler(new WsChannelInitializer(webSocketClientHandler)); + + + b.group(workerGroup) + .channel(NioSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) { + ChannelPipeline pipeline = ch.pipeline(); + //wss 连接 + if (sslCtx != null) { + pipeline.addLast(sslCtx.newHandler(ch.alloc(), authUrl.host(), authUrl.port())); + } + pipeline.addLast( + new HttpServerCodec(), + new HttpObjectAggregator(65536), + WebSocketClientCompressionHandler.INSTANCE, + //new LoggingHandler(LogLevel.INFO), // only for debug +// new IdleStateHandler(websocketConfig.getReaderIdleTimeSeconds(), +// websocketConfig.getWriterIdleTimeSeconds(), +// websocketConfig.getAllIdleTimeSeconds()), + handler); + } + }).option(ChannelOption.SO_KEEPALIVE, true) + + ; + +// mChannelFuture = b.connect(authUrl.host(),authUrl.port()).sync(); + mChannelFuture = b.connect("spark-api.xf-yun.com",443).sync(); + channel = mChannelFuture.channel(); + handler.handshakeFuture().sync(); + if (mChannelFuture.isSuccess()) { + log.info("Client,连接服务端成功"); + } + channel.writeAndFlush("介绍下自己"); +// mChannelFuture.channel().closeFuture().sync(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + workerGroup.shutdownGracefully(); + } + } + + //鉴权url + public static HttpUrl getAuthorizationUrl(String hostUrl , String apikey ,String apisecret) throws Exception { + //获取host + URL url = new URL(hostUrl); + //获取鉴权时间 date + SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); + System.out.println("format:\n" + format ); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + String date = format.format(new Date()); + //获取signature_origin字段 + StringBuilder builder = new StringBuilder("host: ").append(url.getHost()).append("\n"). +// append("date: ").append(date).append("\n"). + append("date: ").append("Wed, 02 Aug 2023 05:35:33 GMT").append("\n"). + append("GET ").append(url.getPath()).append(" HTTP/1.1"); + System.out.println("signature_origin:\n" + builder); + //获得signatue + Charset charset = Charset.forName("UTF-8"); + Mac mac = Mac.getInstance("hmacsha256"); + SecretKeySpec sp = new SecretKeySpec(apisecret.getBytes(charset),"hmacsha256"); + mac.init(sp); + byte[] basebefore = mac.doFinal(builder.toString().getBytes(charset)); + String signature = Base64.getEncoder().encodeToString(basebefore); + //获得 authorization_origin + String authorization_origin = String.format("api_key=\"%s\",algorithm=\"%s\",headers=\"%s\",signature=\"%s\"",apikey,"hmac-sha256","host date request-line",signature); + //获得authorization + String authorization = Base64.getEncoder().encodeToString(authorization_origin.getBytes(charset)); + //获取httpurl + HttpUrl httpUrl = HttpUrl.parse("https://" + url.getHost() + url.getPath()).newBuilder().// + addQueryParameter("authorization", authorization).// + addQueryParameter("date", date).// + addQueryParameter("host", url.getHost()).// + build(); + System.out.println("httpUrl:\n" + httpUrl); + return httpUrl; + } + + public static void main(String[] args) { + nettyClient = new NettyClient(); + nettyClient.connect(); + + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/WebSocketClient.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/WebSocketClient.java new file mode 100644 index 00000000..b076bd12 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/WebSocketClient.java @@ -0,0 +1,374 @@ +package com.xueyi.nlt.netty.client; + +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.nacos.shaded.com.google.gson.Gson; +import com.alibaba.nacos.shaded.com.google.gson.JsonArray; +import com.alibaba.nacos.shaded.com.google.gson.JsonObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.nlt.api.netty.domain.vo.DmWebSocketMessageVo; +import okhttp3.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.net.URL; +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.*; + +@Component +public class WebSocketClient extends WebSocketListener { + + public static WebSocketClient INSTANCE; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Value("${secret.spark.appId}") + private String appId; + + @Value("${secret.spark.apiSecret}") + private String apiSecret; + + @Value("${secret.spark.apiKey}") + private String apiKey; + + public final static Object LOCK = new Object(); + public static String hostUrl = "https://spark-api.xf-yun.com/v2.1/chat"; +// public static String APPID = "3d9282da";//从开放平台控制台中获取 +// public static String APIKEY = "7c217b3a313f4b66fcc14a8e97f85103";//从开放平台控制台中获取 +// public static String APISecret = "ZTRiNDQwMTRlOTlmZDQwMDUwYTdjMDM0";//从开放平台控制台中获取 + + public static WebSocket webSocket; + public static String APPID = "948cf4b6";//从开放平台控制台中获取 + public static String APIKEY = "54f6e81f40a31d66d976496de895a7a4";//从开放平台控制台中获取 + public static String APISecret = "ZDYyMjNmMTlkYTE0YWRmOWUwZTYxNjYz";//从开放平台控制台中获取 + public static final Gson json = new Gson(); +// public static String question = "假设你是一位前台,你需要通过与其他人对话来获取会议相关信息,已知今天是2023-7-19,你需要获取会议日期,开始时间,持续时间,会议地点,会议主题。时间用类似00:00的格式输出。对方的话中可能不包含全部信息,对于未知的信息填充为none。如果所有信息都已知那么commit为true。否则为false。将你获得的信息输出为json格式。对方的话是:“明天下午开个会。从两点开到下午三点,在大会议室开,主题是访客接待”,只输出最后的json。输出只有一行,输出格式为{date:,start_time:,duration:,location:,theme:commit:}。";//可以修改question 内容,来向模型提问 + public static String question = "请帮我安排五一出行计划";//可以修改question 内容,来向模型提问 + public static List questions = new ArrayList<>();//可以修改question 内容,来向模型提问 + public String answer = ""; + + @PostConstruct + public void init() { + INSTANCE = this; + INSTANCE.redisTemplate = this.redisTemplate; + INSTANCE.stringRedisTemplate = this.stringRedisTemplate; + INSTANCE.appId = this.appId; + } + + public static void main(String[] args) { + synchronized (LOCK) { + try { + //构建鉴权httpurl + String authUrl = getAuthorizationUrl(hostUrl, INSTANCE.apiKey, INSTANCE.apiSecret); + OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); + String url = authUrl.replace("https://","wss://").replace("http://","ws://"); + Request request = new Request.Builder().url(url).build(); + WebSocket webSocket = okHttpClient.newWebSocket(request,new WebSocketClient()); + LOCK.wait(); + System.out.println("查询完成"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + + // write your code here + + } + + public void sendMsg(String message){ + question = message; + + try { + //构建鉴权httpurl + String authUrl = getAuthorizationUrl(hostUrl,apiKey,apiSecret); + OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); + String url = authUrl.replace("https://","wss://").replace("http://","ws://"); + Request request = new Request.Builder().url(url).build(); + webSocket = okHttpClient.newWebSocket(request,new WebSocketClient()); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void sendMsg(List messages){ + questions = messages; + question = null; + + try { + //构建鉴权httpurl + String authUrl = getAuthorizationUrl(hostUrl,apiKey,apiSecret); + OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); + String url = authUrl.replace("https://","wss://").replace("http://","ws://"); + Request request = new Request.Builder().url(url).build(); + webSocket = okHttpClient.newWebSocket(request,new WebSocketClient()); + + } catch (Exception e) { + e.printStackTrace(); + } + } + //鉴权url + public static String getAuthorizationUrl(String hostUrl , String apikey ,String apisecret) throws Exception { + //获取host + URL url = new URL(hostUrl); + //获取鉴权时间 date + SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); + System.out.println("format:\n" + format ); + format.setTimeZone(TimeZone.getTimeZone("GMT")); + String date = format.format(new Date()); + //获取signature_origin字段 + StringBuilder builder = new StringBuilder("host: ").append(url.getHost()).append("\n"). + append("date: ").append(date).append("\n"). + append("GET ").append(url.getPath()).append(" HTTP/1.1"); + System.out.println("signature_origin:\n" + builder); + //获得signatue + Charset charset = Charset.forName("UTF-8"); + Mac mac = Mac.getInstance("hmacsha256"); + SecretKeySpec sp = new SecretKeySpec(apisecret.getBytes(charset),"hmacsha256"); + mac.init(sp); + byte[] basebefore = mac.doFinal(builder.toString().getBytes(charset)); + String signature = Base64.getEncoder().encodeToString(basebefore); + //获得 authorization_origin + String authorization_origin = String.format("api_key=\"%s\",algorithm=\"%s\",headers=\"%s\",signature=\"%s\"",apikey,"hmac-sha256","host date request-line",signature); + //获得authorization + String authorization = Base64.getEncoder().encodeToString(authorization_origin.getBytes(charset)); + //获取httpurl + HttpUrl httpUrl = HttpUrl.parse("https://" + url.getHost() + url.getPath()).newBuilder().// + addQueryParameter("authorization", authorization).// + addQueryParameter("date", date).// + addQueryParameter("host", url.getHost()).// + build(); + + return httpUrl.toString(); + } + + //重写onopen + @Override + public void onOpen(WebSocket webSocket, Response response) { + super.onOpen(webSocket, response); + new Thread(()->{ + JsonObject frame = new JsonObject(); + JsonObject header = new JsonObject(); + JsonObject chat = new JsonObject(); + JsonObject parameter = new JsonObject(); + JsonObject payload = new JsonObject(); + JsonObject message = new JsonObject(); + JsonObject text = new JsonObject(); + JsonArray ja = new JsonArray(); + + //填充header + header.addProperty("app_id",INSTANCE.appId); + header.addProperty("uid","123456789"); + //填充parameter +// chat.addProperty("domain","general"); //1.0版本 + chat.addProperty("domain","generalv2"); // 2.0版本 + chat.addProperty("random_threshold",0.5); + chat.addProperty("max_tokens",1024); + chat.addProperty("auditing","default"); + parameter.add("chat",chat); + if (!StringUtils.isEmpty(question)) { + text = new JsonObject(); + //填充payload + text.addProperty("role","user"); + text.addProperty("content",question); + ja.add(text); + }else { + for (int i = 0;i < questions.size();i++) { + + text = new JsonObject(); + if (i % 2 == 0) { + text.addProperty("role","user"); + + } else { + text.addProperty("role","assistant"); + } + text.addProperty("content",questions.get(i)); + System.out.println(text.toString()); + ja.add(text); + } + } +// message.addProperty("text",ja.getAsString()); + message.add("text",ja); + payload.add("message",message); + frame.add("header",header); + frame.add("parameter",parameter); + frame.add("payload",payload); + System.out.println("frame:\n" + frame.toString()); + webSocket.send(frame.toString()); + + + } + + + ).start(); + } + + //重写onmessage + + @Override + public void onMessage(WebSocket webSocket, String text) { + super.onMessage(webSocket, text); + System.out.println("text:\n" + text); + ResponseData responseData = json.fromJson(text,ResponseData.class); + synchronized (LOCK) { + try { + // System.out.println("code:\n" + responseData.getHeader().get("code")); + if (0 == responseData.getHeader().get("code").getAsInt()) { + System.out.println("###########"); + System.out.println("getStatus: " + responseData.getHeader().get("status").getAsInt()); + if (2 != responseData.getHeader().get("status").getAsInt()) { + System.out.println("****************"); + Payload pl = json.fromJson(responseData.getPayload(), Payload.class); + JsonArray temp = (JsonArray) pl.getChoices().get("text"); + JsonObject jo = (JsonObject) temp.get(0); + answer += jo.get("content").getAsString(); +// System.out.println(answer); + } else { + Payload pl1 = json.fromJson(responseData.getPayload(), Payload.class); + JsonObject jsonObject = (JsonObject) pl1.getUsage().get("text"); + int prompt_tokens = jsonObject.get("prompt_tokens").getAsInt(); + JsonArray temp1 = (JsonArray) pl1.getChoices().get("text"); + JsonObject jo = (JsonObject) temp1.get(0); + answer += jo.get("content").getAsString(); + System.out.println("返回结果为:\n" + answer); + + if (INSTANCE.redisTemplate.hasKey("gpt:websocket:1")) { + DmWebSocketMessageVo message = (DmWebSocketMessageVo) INSTANCE.redisTemplate.opsForValue().get("gpt:websocket:1"); + if (StringUtils.isNotEmpty(message.getTemplate()) && message.getTemplate().equals("birthday")) { + JSONObject birthdayJo = new JSONObject(); + birthdayJo.put("content", answer); + birthdayJo.put("timestamp", message.getFormat().get("timestamp")); + INSTANCE.stringRedisTemplate.opsForHash().put("group:nlp" + ":" + message.getFormat().getString("orderId"), "birthday", birthdayJo.toString()); + INSTANCE.redisTemplate.delete("gpt:websocket:1"); + return; + } + if (StringUtils.isNotEmpty(message.getTemplate()) && message.getTemplate().equals("hireDate")) { + JSONObject birthdayJo = new JSONObject(); + birthdayJo.put("content", answer); + birthdayJo.put("timestamp", message.getFormat().get("timestamp")); + INSTANCE.stringRedisTemplate.opsForHash().put("group:nlp" + ":" + message.getFormat().getString("orderId"), "hireDate", birthdayJo.toString()); + INSTANCE.redisTemplate.delete("gpt:websocket:1"); + return; + } + JSONObject preWebsocketJo = message.getFormat(); + JSONObject meetingJo = new JSONObject(); + meetingJo.put("timestamp",preWebsocketJo.get("timestamp")); + meetingJo.put("content",answer); + INSTANCE.stringRedisTemplate.opsForHash().put("group:nlp" + ":" + preWebsocketJo.getString("orderId"), "meeting", meetingJo.toString()); + INSTANCE.redisTemplate.delete("gpt:websocket:1"); + + }else { + // 添加缓存 + INSTANCE.stringRedisTemplate.opsForValue().set("group:websocket:content", answer); + LOCK.notifyAll(); + } + +// webSocket.close(3,"客户端主动断开链接"); + //webSocket.close(1000,"客户端主动断开链接"); + + } + + } else { + System.out.println("返回结果错误:\n" + responseData.getHeader().get("code") + responseData.getHeader().get("message")); + LOCK.notifyAll(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + //重写onFailure + + @Override + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + super.onFailure(webSocket, t, response); + System.out.println(response); + } + + + + class ResponseData{ + private JsonObject header; + private JsonObject payload; + + public JsonObject getHeader() { + return header; + } + + public JsonObject getPayload() { + return payload; + } + } + + class Header{ + private int code ; + private String message; + private String sid; + private String status; + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } + + public String getSid() { + return sid; + } + + public String getStatus() { + return status; + } + } + + class Payload{ + private JsonObject choices; + private JsonObject usage; + + public JsonObject getChoices() { + return choices; + } + + public JsonObject getUsage() { + return usage; + } + } + + class Choices{ + private int status; + private int seq; + private JsonArray text; + + public int getStatus() { + return status; + } + + public int getSeq() { + return seq; + } + + public JsonArray getText() { + return text; + } + } + + + + + + +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/WebsocketConfig.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/WebsocketConfig.java new file mode 100644 index 00000000..6a10962b --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/WebsocketConfig.java @@ -0,0 +1,202 @@ +package com.xueyi.nlt.netty.client; + +import java.util.Map; + +public class WebsocketConfig { + + /** + * websocket url-------------(如果存在则以url为主) + */ + private String url; + + + /** + * websocket前缀 + */ + private String scheme = "ws"; + + /** + * 服务器IP + */ + private String host; + + /** + * 服务器端口 + */ + private int port; + + /** + * 默认的websocket地址 + */ + private String path = "websocket"; + + /** + * url参数 + */ + private Map suffixParams; + + + // Optional settings below + /** + * 检查 + */ + private Long checkLiveDuration; + + /** + * 自动重启客户端 + */ + private Boolean autoRebootClient; + + /** + * 保持连接状态 + */ + private Boolean keepAlive; + + /** + * 读空闲超时时间 + */ + private Integer readerIdleTimeSeconds = 60; + + /** + * 写空闲超时时间 + */ + private Integer writerIdleTimeSeconds = 60; + + /** + * 所有空闲超时时间 + */ + private Integer allIdleTimeSeconds = 0; + + /** + * 心跳实现 + */ +// private HeartBeat heartBeat; + + public WebsocketConfig(){ + } + + public WebsocketConfig(String host, int port){ + this.host = host; + this.port = port; + } + + + public WebsocketConfig(String host, int port, String path){ + this.host = host; + this.port = port; + this.path = path; + } + + public WebsocketConfig(String scheme, String host, int port, String path){ + this.scheme = scheme; + this.host = host; + this.port = port; + this.path = path; + } + + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Map getSuffixParams() { + return suffixParams; + } + + public void setSuffixParams(Map suffixParams) { + this.suffixParams = suffixParams; + } + + public Long getCheckLiveDuration() { + return checkLiveDuration; + } + + public void setCheckLiveDuration(Long checkLiveDuration) { + this.checkLiveDuration = checkLiveDuration; + } + + public Boolean getAutoRebootClient() { + return autoRebootClient; + } + + public void setAutoRebootClient(Boolean autoRebootClient) { + this.autoRebootClient = autoRebootClient; + } + + + public Boolean getKeepAlive() { + return keepAlive; + } + + public void setKeepAlive(Boolean keepAlive) { + this.keepAlive = keepAlive; + } + + public Integer getReaderIdleTimeSeconds() { + return readerIdleTimeSeconds; + } + + public void setReaderIdleTimeSeconds(Integer readerIdleTimeSeconds) { + this.readerIdleTimeSeconds = readerIdleTimeSeconds; + } + + public Integer getWriterIdleTimeSeconds() { + return writerIdleTimeSeconds; + } + + public void setWriterIdleTimeSeconds(Integer writerIdleTimeSeconds) { + this.writerIdleTimeSeconds = writerIdleTimeSeconds; + } + + public Integer getAllIdleTimeSeconds() { + return allIdleTimeSeconds; + } + + public void setAllIdleTimeSeconds(Integer allIdleTimeSeconds) { + this.allIdleTimeSeconds = allIdleTimeSeconds; + } + +// public HeartBeat getHeartBeat() { +// return heartBeat; +// } + +// public void setHeartBeat(HeartBeat heartBeat) { +// this.heartBeat = heartBeat; +// } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/codec/WsChannelInitializer.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/codec/WsChannelInitializer.java new file mode 100644 index 00000000..d6f05655 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/codec/WsChannelInitializer.java @@ -0,0 +1,46 @@ +package com.xueyi.nlt.netty.client.codec; + +import com.xueyi.nlt.netty.client.handler.MockClientHandler; +import com.xueyi.nlt.netty.client.handler.NettyClientHandler; +import com.xueyi.nlt.netty.client.handler.WsClientHandler; +import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.HttpServerCodec; +import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.stream.ChunkedWriteHandler; + +public class WsChannelInitializer extends ChannelInitializer { + + private NettyClientHandler nettyClientHandler; + + public WsChannelInitializer(NettyClientHandler nettyClientHandler) { + this.nettyClientHandler = nettyClientHandler; + } + + @Override + protected void initChannel(Channel ch) { + ChannelPipeline pipeline = ch.pipeline(); + // websocket是基于http协议的,所以需要使用http编解码器 + pipeline.addLast(new HttpClientCodec()); + pipeline.addLast(new LoggingHandler(LogLevel.INFO)); + pipeline.addLast("decoder", new StringDecoder()); + pipeline.addLast("encoder", new StringEncoder()); + // 以上三个处理器是对http协议的支持 + + // websocket 服务器处理的协议,并用于指定客户端连接的路由(这里指定的是 /ws) + // 这里的URL就是 ws://ip:port/ws + // 该处理器为运行websocket服务器承担了所有繁重的工作 + // 它会负责websocket的握手以及处理控制帧 + // websocket的数据传输都是以frames进行的 + pipeline.addLast(new WebSocketServerProtocolHandler("/wss")); + // 自定义的处理器 + pipeline.addLast("handler", nettyClientHandler); + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/MockClientHandler.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/MockClientHandler.java new file mode 100644 index 00000000..4feba9eb --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/MockClientHandler.java @@ -0,0 +1,66 @@ +package com.xueyi.nlt.netty.client.handler; + +import com.xueyi.nlt.netty.client.NettyClient; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@Slf4j +public class MockClientHandler extends SimpleChannelInboundHandler { + + // private MsgHandleService msgHandleService; + private static final Logger log = LoggerFactory.getLogger(NettyClient.class); + private final WebSocketClientHandshaker webSocketClientHandshaker; + + public MockClientHandler(WebSocketClientHandshaker webSocketClientHandshaker) { + this.webSocketClientHandshaker = webSocketClientHandshaker; +// this.msgHandleService = SpringContextHolder.getBean(MsgHandleService.class); + } + + /** + * 当客户端主动链接服务端的链接后,调用此方法 + * + * @param channelHandlerContext ChannelHandlerContext + */ + @Override + public void channelActive(ChannelHandlerContext channelHandlerContext) { + log.info("\n\t⌜⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓\n" + + "\t├ [Mock 建立连接]\n" + + "\t⌞⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓"); + + Channel channel = channelHandlerContext.channel(); + // 握手 + webSocketClientHandshaker.handshake(channel); + } + + + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, String data) { + log.info("接收到客户端的响应为:{}", data); + //自定义处理消息 + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + log.info("\n\t⌜⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓\n" + + "\t├ [exception]: {}\n" + + "\t⌞⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓⎓", cause.getMessage()); + ctx.close(); + } + + @Override + public void handlerRemoved(ChannelHandlerContext ctx) { + System.out.println("与服务器端断开连接"); + } + + @Override + public void channelReadComplete(ChannelHandlerContext channelHandlerContext) { + channelHandlerContext.flush(); + } +} + + diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/NettyClientHandler.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/NettyClientHandler.java new file mode 100644 index 00000000..c64694fc --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/NettyClientHandler.java @@ -0,0 +1,108 @@ +package com.xueyi.nlt.netty.client.handler; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.DefaultHttpResponse; +import io.netty.handler.codec.http.websocketx.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.charset.Charset; + +import static com.xueyi.nlt.netty.client.NettyClient.APPID; + +public class NettyClientHandler extends SimpleChannelInboundHandler { + + + + // 定义log + private static final Logger log = LoggerFactory.getLogger(NettyClientHandler.class); + + private final WebSocketClientHandshaker webSocketClientHandshaker; + + public NettyClientHandler(WebSocketClientHandshaker webSocketClientHandshaker) { + this.webSocketClientHandshaker = webSocketClientHandshaker; + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + + Channel channel = ctx.channel(); + // 握手 + webSocketClientHandshaker.handshake(channel); + + String question = "你是能帮我指定一个五一出行的计划么?"; + log.info("Client,channelActive"); + JSONObject frame = new JSONObject(); + JSONObject header = new JSONObject(); + JSONObject chat = new JSONObject(); + JSONObject parameter = new JSONObject(); + JSONObject payload = new JSONObject(); + JSONObject message = new JSONObject(); + JSONObject text = new JSONObject(); + JSONArray ja = new JSONArray(); + + //填充header + header.put("app_id",APPID); + header.put("uid","123456789"); + //填充parameter + chat.put("domain","general"); + chat.put("random_threshold",0); + chat.put("max_tokens",1024); + chat.put("auditing","default"); + parameter.put("chat",chat); + //填充payload + text.put("role","user"); + text.put("content",question); + ja.add(text); +// message.addProperty("text",ja.getAsString()); + message.put("text",ja); + payload.put("message",message); + frame.put("header",header); + frame.put("parameter",parameter); + frame.put("payload",payload); + System.out.println("frame:\n" + frame.toString()); + ByteBuf byteBuf = Unpooled.copiedBuffer(frame.toString(), Charset.forName("utf-8")); + ctx.writeAndFlush(frame.toString()); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { +// log.info("Client,接收到服务端发来的消息:" + msg); +// ByteBuf buf = (ByteBuf) msg; +// byte[] buffer = new byte[buf.readableBytes()]; +// buf.readBytes(buffer); +// String message = new String(buffer, "utf-8"); +// log.info("Client,接收到服务端发来的消息:" + message); + + Channel ch = ctx.channel(); + DefaultHttpResponse response = (DefaultHttpResponse) msg; + log.info(response.toString()); + } + + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception { + // 获取客户端传输来的文本消息 + String text = textWebSocketFrame.text(); + // 这个是自定义的日志工具类,可见其它文章 + log.info("收到的文本消息:[{}]", text); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + log.info("Client,exceptionCaught"); + cause.printStackTrace(); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + log.info("Client,channelInactive"); + } + +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/NettyWebsocketClientHandler.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/NettyWebsocketClientHandler.java new file mode 100644 index 00000000..56c25b51 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/NettyWebsocketClientHandler.java @@ -0,0 +1,196 @@ +package com.xueyi.nlt.netty.client.handler; + +import com.xueyi.nlt.netty.client.message.ReceiveMessage; +import com.xueyi.nlt.netty.client.WebsocketConfig; +import io.netty.buffer.ByteBuf; +import io.netty.channel.*; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.websocketx.*; +import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler.HandshakeComplete; +import io.netty.handler.timeout.IdleStateEvent; +import io.netty.util.CharsetUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; + +public class NettyWebsocketClientHandler extends SimpleChannelInboundHandler { + private Logger logger = LoggerFactory.getLogger(NettyWebsocketClientHandler.class); + + private WebsocketConfig websocketConfig; + + private final WebSocketClientHandshaker handshaker; + + private ChannelPromise handshakeFuture; + + private ReceiveMessage receiveMessage; + +// private HeartBeat heartBeat; + + public NettyWebsocketClientHandler(WebSocketClientHandshaker handshaker) { + this.handshaker = handshaker; + } + + public NettyWebsocketClientHandler(WebSocketClientHandshaker handshaker, ReceiveMessage receiveMessage) { + this.handshaker = handshaker; + this.receiveMessage = receiveMessage; + } + + public ChannelFuture handshakeFuture() { + return handshakeFuture; + } + + @Override + public void handlerAdded(ChannelHandlerContext ctx) { + handshakeFuture = ctx.newPromise(); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception{ + super.channelActive(ctx); + handshaker.handshake(ctx.channel()); + logger.info("channelActive"); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception{ + super.channelInactive(ctx); + logger.info("WebSocket Client disconnected!"); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + super.channelRead(ctx, msg); + } + + @Override + public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { + Channel ch = ctx.channel(); + if (!handshaker.isHandshakeComplete()) { + try { + handshaker.finishHandshake(ch, (FullHttpResponse) msg); + logger.info("WebSocket Client connected!"); + handshakeFuture.setSuccess(); + } catch (WebSocketHandshakeException e) { + logger.info("WebSocket Client failed to connect, " + e.getMessage()); + handshakeFuture.setFailure(e); + } + return; + } + + if (msg instanceof FullHttpResponse) { + FullHttpResponse response = (FullHttpResponse) msg; + throw new IllegalStateException( + "Unexpected FullHttpResponse (getStatus=" + response.getStatus() + + ", content=" + response.content().toString(CharsetUtil.UTF_8) + ')'); + } + + WebSocketFrame frame = (WebSocketFrame) msg; + if (frame instanceof TextWebSocketFrame) { + /** + * 我们主要是用TextWebSocketFrame + */ + TextWebSocketFrame textFrame = (TextWebSocketFrame) frame; + receiveMessage.onMessage(ch, textFrame.text()); + } else if (frame instanceof PongWebSocketFrame) { + logger.info("WebSocket Client received pong"); + receiveMessage.onMessage(ch, frame); + } else if (frame instanceof CloseWebSocketFrame) { + logger.info("WebSocket Client received close Frame"); + //执行后将关闭 + receiveMessage.onMessage(ch, frame); + //receive a closing frame to shutdown the event loop + ch.eventLoop().shutdownGracefully(); + ch.close().sync(); + }else if(frame instanceof BinaryWebSocketFrame){ + BinaryWebSocketFrame binaryFrame = (BinaryWebSocketFrame)msg; + ByteBuf buf = binaryFrame.content(); + if (buf.isReadable()){ + int availableBytesNumber = buf.readableBytes(); + byte[] receivedBytes = new byte[availableBytesNumber]; + buf.readBytes(receivedBytes); + receiveMessage.onMessage(ch, receivedBytes); + } + //buf.release(); + // byte [] bytes = receivedBytes; + } + } + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { +// if (evt instanceof IdleStateEvent) { +// IdleStateEvent idleStateEvent = (IdleStateEvent) evt; +// switch (idleStateEvent.state()) { +// case WRITER_IDLE: +// handlerWriterIdleEvent(ctx); +// break; +// case READER_IDLE: +// handlerReaderIdleEvent(ctx); +// break; +// case ALL_IDLE: +// handlerAllIdleEvent(ctx); +// break; +// default: +// break; +// } +// } else { +// super.userEventTriggered(ctx, evt); +// } + if(evt instanceof HandshakeComplete) { + HandshakeComplete handshake = (WebSocketServerProtocolHandler.HandshakeComplete)evt; + //http request header + HttpHeaders headers = handshake.requestHeaders(); + + //http request uri: /chat?accesskey=hello + String uri = handshake.requestUri(); + + //TODO: parse uri parameters to map ... + Map params ; + + //put to channel context +// ctx.channel().attr(RequestParams).set(params); + } + + } + + +// protected void handlerWriterIdleEvent(ChannelHandlerContext ctx){ +// heartBeat.ping(ctx); +// } +// +// protected void handlerReaderIdleEvent(ChannelHandlerContext ctx){ +// heartBeat.ping(ctx); +// } +// +// protected void handlerAllIdleEvent(ChannelHandlerContext ctx){ +// heartBeat.ping(ctx); +// } + + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + if (!handshakeFuture.isDone()) { + handshakeFuture.setFailure(cause); + } + logger.info("exceptionCaught "+ cause.getMessage()); + } + + + public WebsocketConfig getWebsocketConfig() { + return websocketConfig; + } + + public void setWebsocketConfig(WebsocketConfig websocketConfig) { + this.websocketConfig = websocketConfig; + } + +// public HeartBeat getHeartBeat() { +// return heartBeat; +// } + +// public void setHeartBeat(HeartBeat heartBeat) { +// this.heartBeat = heartBeat; +// } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/WsClientHandler.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/WsClientHandler.java new file mode 100644 index 00000000..adf47c8d --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/handler/WsClientHandler.java @@ -0,0 +1,23 @@ +package com.xueyi.nlt.netty.client.handler; + +import com.xueyi.nlt.netty.client.NettyClient; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class WsClientHandler extends SimpleChannelInboundHandler { + + private static final Logger log = LoggerFactory.getLogger(WsClientHandler.class); + @Override + protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception { + // 获取客户端传输来的文本消息 + String text = msg.text(); + // 这个是自定义的日志工具类,可见其它文章 + log.info("收到的文本消息:[{}]", text); + // 在这里可以判断消息类型(比如初始化连接、消息在客户端间传输等) + // 然后可以将客户端Channel与对应的唯一标识用Map关联起来,就可以做定向推送,而不是广播 + + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/message/ReceiveMessage.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/message/ReceiveMessage.java new file mode 100644 index 00000000..98fa375c --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/client/message/ReceiveMessage.java @@ -0,0 +1,13 @@ +package com.xueyi.nlt.netty.client.message; + +import io.netty.channel.Channel; +import io.netty.handler.codec.http.websocketx.WebSocketFrame; + +public interface ReceiveMessage { + + public void onMessage(Channel channel, String text); + + public void onMessage(Channel channel, byte[] bytes); + + public void onMessage(Channel channel, WebSocketFrame frame); +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/controller/DmWebsocketController.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/controller/DmWebsocketController.java new file mode 100644 index 00000000..74afa8a4 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/netty/controller/DmWebsocketController.java @@ -0,0 +1,79 @@ +package com.xueyi.nlt.netty.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.cache.utils.SourceUtil; +import com.xueyi.common.core.constant.basic.SecurityConstants; +import com.xueyi.common.core.web.result.AjaxResult; +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.netty.client.WebSocketClient; +import com.xueyi.nlt.nlt.domain.vo.IntentTemplateVo; +import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.api.model.Source; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.web.bind.annotation.*; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@RestController +@RequestMapping("/websocket") +public class DmWebsocketController { + + private static final Logger log = LoggerFactory.getLogger(DmWebsocketController.class); + + @Autowired + WebSocketClient webSocketClient; + + @Autowired + StringRedisTemplate stringRedisTemplate; + + @Autowired + RedisTemplate redisTemplate; + + + /** + * 意图请求 + 列表 + */ + @PostMapping("/inner/sendMessage") + @ResponseBody + public R sendMessage(@RequestBody DmWebSocketMessageVo message) { + + log.info("websocket sendMessage:{}", message); + if (message == null || message.getFormat() == null) { + return R.fail("参数为空"); + } + JSONObject jo = message.getFormat(); + SimpleDateFormat dateFormat3 = new SimpleDateFormat("MM-dd"); + Double timestamp = Double.valueOf((String)jo.get("timestamp")); + String meetingRoom = jo.getString("meetingRoom"); + if (StringUtils.isNotEmpty(message.getTemplate()) && message.getTemplate().equals("birthday")) { + String prefix = "假设你是一名公司前台,你看到" + message.getFormat().get("name")+ "已知今天是他的生日。请你从个人角度输出给他的生日贺词。要求待人平和,具有人情味,用词正式,内容与工作无关。输出只包含你要对他说的话,在20字以内。"; + webSocketClient.sendMsg(prefix); + redisTemplate.opsForValue().set("gpt:websocket" + ":" + "1", message); + return R.ok(); + } + if (StringUtils.isNotEmpty(message.getTemplate()) && message.getTemplate().equals("hiredate")) { + String prefix = "假设你是一名公司前台,你看到"+ message.getFormat().get("name")+ ",已知今天是他入职1周年,请你从个人角度说出对他入职周年的祝贺。要求具有人情味,有特色,字数在25字左右,不要提到生日,要带人名。输出只包含你要对他说的话。"; + webSocketClient.sendMsg(prefix); + redisTemplate.opsForValue().set("gpt:websocket" + ":" + "1", message); + return R.ok(); + } + Date date = new Date(timestamp.longValue()); + if (message.getSkillCode().equals("1")) { + String prefix = "假设你是一名公司前台,你看到在你们公司工作的\\"+ jo.getString("orderName")+ "\\,请你从个人角度提醒他参加\\" + + dateFormat3.format(timestamp) + "\\在\\" + meetingRoom + "\\的会,要求语气友好。输出只包含你要对他说的话,在20字左右。"; + webSocketClient.sendMsg(prefix); + // 设置缓存 + redisTemplate.opsForValue().set("gpt:websocket" + ":" + "1", message); + } + return R.ok(); + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmIntentController.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmIntentController.java new file mode 100644 index 00000000..0d4563e3 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/controller/DmIntentController.java @@ -0,0 +1,603 @@ +package com.xueyi.nlt.nlt.controller; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.query_dsl.MatchAllQuery; +import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.cache.utils.SourceUtil; +import com.xueyi.common.core.constant.basic.SecurityConstants; +import com.xueyi.common.core.constant.digitalman.MessageConstants; +import com.xueyi.common.core.context.SecurityContextHolder; +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.result.R; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.security.annotation.Logical; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.security.utils.SecurityUtils; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.nlt.api.netty.domain.vo.DmWebSocketMessageVo; +import com.xueyi.nlt.api.nlt.domain.vo.*; +import com.xueyi.nlt.api.nlt.feign.RemoteIntentService; +import com.xueyi.nlt.api.nlt.feign.RemoteLandingLlmService; +import com.xueyi.nlt.api.nlt.feign.RemoteQAService; +import com.xueyi.nlt.netty.client.WebSocketClient; +import com.xueyi.nlt.nlt.domain.dto.DmIntentDto; +import com.xueyi.nlt.nlt.domain.query.DmIntentQuery; +import com.xueyi.nlt.nlt.domain.vo.IntentTemplateVo; +import com.xueyi.nlt.nlt.service.IDmIntentService; +import com.xueyi.nlt.nlt.template.FreeChatTemplate; +import com.xueyi.nlt.nlt.template.GenerativeKnowledgeTemplate; +import com.xueyi.nlt.nlt.template.MeetingOrderTemplate; +import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.api.digitalmans.domain.vo.DmBatchQuestionsVo; +import com.xueyi.system.api.digitalmans.feign.RemoteDigitalmanService; +import com.xueyi.system.api.digitalmans.feign.RemoteManDeviceService; +import com.xueyi.system.api.digitalmans.feign.RemoteQuestionanswersService; +import com.xueyi.system.api.model.Source; +import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; +import com.xueyi.system.api.organize.feign.RemoteEnterpriseService; +import com.xueyi.tenant.api.tenant.domain.dto.TeTenantDto; +import com.xueyi.tenant.api.tenant.feign.RemoteTenantService; +import org.apache.commons.lang.time.DateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import com.xueyi.common.core.constant.digitalman.SkillConstants.SkillType; + +import java.io.IOException; +import java.io.Serializable; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import static com.xueyi.common.core.constant.digitalman.MessageConstants.SYS_DICT_DATA_SPLITED; + +@RestController +@RequestMapping("/intent") +public class DmIntentController extends BaseController { + + private static final Logger log = LoggerFactory.getLogger(DmIntentController.class); + @Autowired + IDmIntentService dmIntentService; + + @Autowired + WebSocketClient webSocketClient; + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "意图管理 "; + } + + + @Autowired + private StringRedisTemplate redisTemplate; + + @Autowired + private RedisTemplate redisTemplate2; + + + + @Autowired + private RemoteManDeviceService manDeviceService; + + @Autowired + private RemoteIntentService remoteIntentService; + + @Autowired + private MeetingOrderTemplate meetingOrderTemplate; + + @Autowired + private GenerativeKnowledgeTemplate generativeKnowledgeTemplate; + + @Autowired + private FreeChatTemplate freeChatTemplate; + + @Autowired + private RemoteQuestionanswersService questionanswersService; + + @Autowired + RemoteEnterpriseService enterpriseService; + + @Autowired + RemoteLandingLlmService remoteLandingLlmService; + + @Autowired + RemoteQAService remoteQAService; + + @Autowired + RemoteDigitalmanService remoteDigitalmanService; + + @Autowired + private ElasticsearchClient esClient; + /** + * 意图请求 + 列表 + */ + @PostMapping("/api/conversation") + @ResponseBody + public AjaxResult conversationApi(@RequestBody DmIntentVo intent) { + log.info("对话详情:{}", intent.toString()); + log.info("交互对象:{}", intent.toString()); + redisTemplate.opsForValue().increment("dashboard:server", 1); + // 获取今天日期,并格式化成yyyy-MM-dd + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + String today = sdf.format(new Date()); + redisTemplate.opsForValue().increment(("dashboard:server-chart:" + today), 1); + R manDeviceDtoR = manDeviceService.manDeviceInfoInner(intent.getDevId()); + Source source = SourceUtil.getSourceCache(manDeviceDtoR.getData().getStrategyId()); + R jsonObjectR = remoteIntentService.conversationInner(intent, manDeviceDtoR.getData().getTId(), source.getMaster(), SecurityConstants.INNER); + IntentTemplateVo voResult = new IntentTemplateVo(); + voResult.setMsg(""); + if (jsonObjectR.getData() != null) { + if (jsonObjectR.getData().containsKey("result") && StringUtils.isEmpty(jsonObjectR.getData().getString("result")) ) { + voResult.setTarget(0); + } else { + voResult.setTarget(1); + } + } else { + voResult.setTarget(0); + } + if (intent.getMode() != null && intent.getMode().equals(MessageConstants.MODE_FREE_CHAT)) { + voResult.setMsg(jsonObjectR.getData().get("msg").toString()); + } + else { + voResult.setFormat(jsonObjectR.getData()); + } + return AjaxResult.success(voResult); + } + + @PostMapping("/api/skill-intent") + @ResponseBody + public AjaxResult skillIntentApi(@RequestBody DmIntentVo intent) { + log.info("交互对象:{}", intent.toString()); + redisTemplate.opsForValue().increment("dashboard:server", 1); + R manDeviceDtoR = manDeviceService.manDeviceInfoInner(intent.getDevId()); + Source source = SourceUtil.getSourceCache(manDeviceDtoR.getData().getStrategyId()); + IntentTemplateVo voResult = new IntentTemplateVo(); + //查询es,将满足条件的数据调用后续处理,不满足条件的返回原始数据 + SearchResponse dateResponse = null; + List> question_list = null; + try { + MatchQuery byName = MatchQuery.of(m->m.field("name").query(intent.getContent())); + dateResponse = esClient.search(builder -> builder + .index("regular_expression").query(q->q.match(byName)), + JSONObject.class); + question_list = dateResponse.hits().hits(); + log.info("esClient search result: {}", dateResponse); + }catch (IOException ie) { + log.error("esClient search error", ie); + return null; + } + for (Hit jsonObjectHit : question_list) { + JSONObject jo = jsonObjectHit.source(); + Pattern pat = Pattern.compile(jo.get("name").toString()); + Matcher m = pat.matcher(intent.getContent()); + if (m.find()) { +// R jsonObjectR = remoteIntentService.conversationInner(intent, manDeviceDtoR.getData().getTId(), source.getMaster(), SecurityConstants.INNER); + + voResult.setMsg(jo.get("answer").toString()); + // 如果包含Json数据并且json的skillCode字段不等于空 + if (jo.containsKey("json") && StringUtils.isNotEmpty(jo.getString("json"))) { + String skillCode = jo.getJSONObject("json").getString("skillCode"); + intent.setSkillCode(skillCode); + voResult.setJsonFormat(jo.getJSONObject("json")); + voResult.setType("1"); + } + +// return AjaxResult.success(voResult); + } + } + + //走知识库 + R jsonObjectR = remoteIntentService.conversationInner(intent, manDeviceDtoR.getData().getTId(), source.getMaster(), SecurityConstants.INNER); + if (jsonObjectR.getData() != null) { + if (jsonObjectR.getData().containsKey("result") && StringUtils.isEmpty(jsonObjectR.getData().getString("result")) ) { + voResult.setTarget(0); + } else { + voResult.setTarget(1); + } + } else { + voResult.setTarget(0); + } + if (intent.getMode() != null && intent.getMode().equals(MessageConstants.MODE_FREE_CHAT)) { + voResult.setMsg(jsonObjectR.getData().get("msg").toString()); + } + else { + voResult.setFormat(jsonObjectR.getData()); + } + return AjaxResult.success(voResult); + } + + /** + * 意图请求 + 列表 + */ + @PostMapping("/api/say_hello") + @ResponseBody + public AjaxResult sayHelloApi(@RequestBody DmRecognitionVo recognition) { + log.info(recognition.toString()); + redisTemplate.opsForValue().increment("dashboard:recognition", 1); + + redisTemplate.opsForValue().increment("dashboard:conversation-times", 1); + JSONObject joResult = new JSONObject(); + joResult.put("msg",""); + joResult.put("target",0); + if (StringUtils.isNotEmpty(recognition.getRegistered()) && recognition.getRegistered().equals("1")) { + + Map cntMap = redisTemplate.opsForHash().entries("group:nlp" + ":" + recognition.getPersonId()); + //遍历key和value + for (Object key : cntMap.keySet()) { + String value = (String) cntMap.get(key); + if (String.valueOf(key).equals("meeting")) { + JSONObject jo = JSONObject.parseObject(value); + // 判断是否在30分钟内 + System.out.println("timestamp:" + jo.get("timestamp")); + System.out.println("currenttime:" + System.currentTimeMillis()); + if(jo.containsKey("timestamp") && + Double.valueOf(String.valueOf(jo.get("timestamp"))) - System.currentTimeMillis() < 1800000) { + joResult.put("msg",jo.get("content")); + joResult.put("target",1); + redisTemplate.opsForHash().delete("group:nlp" + ":" + recognition.getPersonId(), "meeting"); + redisTemplate.opsForValue().increment("dashboard:conversation-duration", jo.get("content").toString().length() / 4); + return AjaxResult.success(joResult); + } else if (Double.valueOf(String.valueOf(jo.get("timestamp"))) - System.currentTimeMillis() < 0) { + redisTemplate.opsForHash().delete("group:nlp" + ":" + recognition.getPersonId(), "meeting"); + } + } else { + JSONObject jo = JSONObject.parseObject(value); + JSONObject joresult = addNotificaion(String.valueOf(key),recognition.getPersonId(),jo); + if (joresult!= null) { + return AjaxResult.success(joresult); + } + joResult.put("msg",value); + redisTemplate.opsForValue().increment("dashboard:conversation-duration", value.toString().length() / 4); + joResult.put("target",1); + redisTemplate.opsForHash().delete("group:nlp" + ":" + recognition.getPersonId(),key); + return AjaxResult.success(joResult); + } + } + } + redisTemplate.opsForValue().increment("dashboard:conversation-duration", 3); + return AjaxResult.success(joResult); + } + + /** + * 知识库问答请求 + */ + @PostMapping("/api/searchQA") + @ResponseBody + public AjaxResult searchQA(@RequestBody DmIntentVo intent) { + log.info("交互对象:{}",intent.toString()); + + R manDeviceDtoR = manDeviceService.manDeviceInfoInner(intent.getDevId()); + Source source = SourceUtil.getSourceCache(manDeviceDtoR.getData().getStrategyId()); + KnowledgeVo knowledgeVo = new KnowledgeVo(); + knowledgeVo.setMan_code(manDeviceDtoR.getData().getManCode()); + knowledgeVo.setTenant_id(manDeviceDtoR.getData().getTId()); + knowledgeVo.setQuestion(intent.getContent()); +// return remoteQAService.query(manDeviceDtoR.getData().getManCode(),intent.getContent(),manDeviceDtoR.getData().getTId()); + return remoteQAService.query(knowledgeVo); + + } + + /** + * 联动北方大模型请求 + */ + @PostMapping("/api/searchQuestionAnswer") + @ResponseBody + public AjaxResult searchQuestionAnswer(@RequestBody DmIntentVo intent) { + log.info("交互对象:{}",intent.toString()); + redisTemplate.opsForValue().increment("dashboard:recognition", 1); + JSONObject joResult = new JSONObject(); + joResult.put("msg",""); + joResult.put("target",0); + DmLandingLlmVo vo = new DmLandingLlmVo(); + vo.setCategory("bj_unicom"); + vo.addDmLlm("user", intent.getContent()); + JSONObject testJ = new JSONObject(); + testJ.put("category","bj_unicom"); + JSONArray ja1 = new JSONArray(); + JSONObject jo = new JSONObject(); + jo.put("role","user"); + jo.put("content",intent.getContent()); + ja1.add(jo); + testJ.put("messages",ja1); + JSONObject resultJson = remoteLandingLlmService.query(testJ); + JSONArray ja = resultJson.getJSONArray("data"); + + if (ja.size() > 0) { + joResult.put("msg",ja.getJSONObject(0).get("text")); + joResult.put("target",1); + } + return AjaxResult.success(joResult); + } + + + /** + * 意图请求列表 + */ + @PostMapping("/inner/conversation") + @ResponseBody + public R conversationInner(@RequestBody DmIntentVo intent) { + JSONObject joResult = null; + if (intent.getMode() !=null && intent.getMode().equals(MessageConstants.MODE_FREE_CHAT)) { + // 闲聊 + joResult = freeChatTemplate.handle(intent.getDevId(),intent.getContent()); + return R.ok(joResult); + } + // 获取设备号对应缓存 + CoversationSessionVo sessionObject = (CoversationSessionVo) redisTemplate2.opsForValue().get("group:device" + ":" + intent.getDevId() + ":" +"session"); //category + if (sessionObject != null) { + switch (sessionObject.getCategory()) { + case "meeting": + joResult = meetingOrderTemplate.handle(intent.getDevId(),intent.getContent(), Long.parseLong(SecurityContextHolder.getLocalMap().get("enterprise_id").toString())); + return R.ok(joResult); + } + } + if (StringUtils.isEmpty(intent.getSkillCode())) { + // 调用知识库问答 + AjaxResult qaAjax = searchQA(intent); + return R.ok(JSONObject.from(qaAjax.get("data"))); + } + SkillType.BOOK_MEETING_ROOM.getCode(); + // 判断skill code的值 + if (SkillType.BOOK_MEETING_ROOM.getCode().equals(intent.getSkillCode())) { + + // 获取名称为"meeting-order"的BaseTemplate的实例 + redisTemplate.opsForValue().increment("dashboard:meeting", 1); + + joResult = meetingOrderTemplate.handle(intent.getDevId(),intent.getContent(), Long.parseLong(SecurityContextHolder.getLocalMap().get("enterprise_id").toString())); + } else if (SkillType.CREATE_VISITOR_INFO.getCode().equals(intent.getSkillCode())) { + // 访客预定 + redisTemplate.opsForValue().increment("dashboard:create_visitor_info", 1); + } else if (SkillType.REGISTER_VISITOR.getCode().equals(intent.getSkillCode())) { + // 访客登记 + redisTemplate.opsForValue().increment("dashboard:register_visitor", 1); + } else if (SkillType.BROADCAST_DISPLAY.getCode().equals(intent.getSkillCode())) { + // 播报展示 + redisTemplate.opsForValue().increment("dashboard:broadcast_display", 1); + } else if (SkillType.OPEN_DOOR.getCode().equals(intent.getSkillCode())) { + // 开门记录 + redisTemplate.opsForValue().increment("dashboard:open_door", 1); + } + return R.ok(joResult); + } + + /** + * 意图请求 + 列表 + */ + @PostMapping("/inner/sendMessage") + @ResponseBody + public R sendMessage(@RequestBody DmWebSocketMessageVo message) { + + log.info("websocket sendMessage:{}", message); + if (message == null || message.getFormat() == null) { + return R.fail("参数为空"); + } + JSONObject jo = message.getFormat(); + //SimpleDateFormat dateFormat3 = new SimpleDateFormat("MM-dd"); + SimpleDateFormat dateFormat4 = new SimpleDateFormat("M月d日"); + Double timestamp = Double.valueOf((String)jo.get("timestamp")); + String meetingRoom = jo.getString("meetingRoom"); + if (StringUtils.isNotEmpty(message.getTemplate()) && message.getTemplate().equals("birthday")) { + String prefix = "假设你是一名公司前台,你看到" + message.getFormat().get("name")+ "已知今天是他的生日。请你从个人角度输出给他的生日贺词。要求待人平和,具有人情味,用词正式,内容与工作无关。输出只包含你要对他说的话,在20字以内。"; + webSocketClient.sendMsg(prefix); + redisTemplate2.opsForValue().set("gpt:websocket" + ":" + "1", message); + return R.ok(); + } + if (StringUtils.isNotEmpty(message.getTemplate()) && message.getTemplate().equals("hireDate")) { + String prefix = "假设你是一名公司前台,你看到"+ message.getFormat().get("name")+ ",已知今天是他入职" + message.getFormat().get("years")+"周年,请你从个人角度说出对他入职周年的祝贺。要求具有人情味,有特色,字数在25字左右,不要提到生日,要带人名。输出只包含你要对他说的话。"; + webSocketClient.sendMsg(prefix); + redisTemplate2.opsForValue().set("gpt:websocket" + ":" + "1", message); + return R.ok(); + } + Date date = new Date(timestamp.longValue()); + if (message.getSkillCode().equals("1")) { + String prefix = "假设你是一名公司前台,你看到在你们公司工作的\\"+ jo.getString("orderName")+ "\\,请你从个人角度提醒他参加\\" + + dateFormat4.format(timestamp) + "\\在\\" + meetingRoom + "\\的会,要求语气友好。输出只包含你要对他说的话,在20字左右。"; + webSocketClient.sendMsg(prefix); + // 设置缓存 + redisTemplate2.opsForValue().set("gpt:websocket" + ":" + "1", message); + } + return R.ok(); + } + + /** + * 意图请求 + 列表 + */ + @PostMapping("/inner/taskGenerativeKnowledge") + @ResponseBody + public R taskGenerativeKnowledge() { + + // 从列表中获取知识库任务 + TaskKnowledgeVo vo = (TaskKnowledgeVo) redisTemplate2.opsForList().leftPop("group:task"); + + log.info("从缓存中获取对象:{}",vo.toString()); + if (vo == null) { + return R.ok(null,"没有任务"); + } + + if (vo.getSplit() != SYS_DICT_DATA_SPLITED) { + // 请开始你的表演 + String contents = vo.getContent(); + + List results = Arrays.stream(contents.split("\n")).filter(StringUtils::isNotBlank).collect(Collectors.toList()); + results.forEach(item->{ + TaskKnowledgeVo temp = new TaskKnowledgeVo(); + temp.setContent(item); + temp.setCount(item.length()); + temp.setManId(vo.getManId()); + temp.setKnowledgeId(vo.getKnowledgeId()); + temp.setTenantId(vo.getTenantId()); + temp.setSplit(SYS_DICT_DATA_SPLITED); + temp.setCreateBy(vo.getCreateBy()); + redisTemplate2.opsForList().rightPush("group:task", temp); + }); + return R.ok(null,"处理成功"); + } + log.info("交互对象:{}",vo.toString()); + JSONObject joResult = generativeKnowledgeTemplate.handle(null,vo.getContent()); + + if (joResult == null) { + redisTemplate2.opsForList().rightPush("group:task", vo); + return R.ok(null,"任务处理失败,重新放入队列"); + } + + R enterpriseDtoR = enterpriseService.getInfo(vo.getTenantId()); + if (enterpriseDtoR.isFail()) { + log.warn("任务执行失败:{}",vo); + } + Source source = SourceUtil.getSourceCache(enterpriseDtoR.getData().getStrategyId()); + DmBatchQuestionsVo batchQuestionsVo = new DmBatchQuestionsVo(); + batchQuestionsVo.setKnowledgeId(vo.getKnowledgeId()); + batchQuestionsVo.setQuestions(JSONArray.from(joResult.get("questions"))); + batchQuestionsVo.setCreateId(vo.getCreateBy()); + questionanswersService.batchInsertInner(batchQuestionsVo,vo.getTenantId(),source.getMaster(),SecurityConstants.INNER); + + return R.ok(null,"处理成功"); + } + + /** + * 查询意图管理 + 列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_INTENT_LIST) + public AjaxResult list(DmIntentQuery intent) { + return super.list(intent); + } + + /** + * 查询意图管理 + 详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_INTENT_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 意图管理 + 新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_INTENT_ADD) + @Log(title = "意图管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmIntentDto intent) { + return super.add(intent); + } + + /** + * 意图管理 + 修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_INTENT_EDIT) + @Log(title = "意图管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmIntentDto intent) { + return super.edit(intent); + } + + /** + * 意图管理 + 修改状态 + */ + @Override + @PutMapping("/status") + @RequiresPermissions(value = {Auth.DM_INTENT_EDIT, Auth.DM_INTENT_ES}, logical = Logical.OR) + @Log(title = "意图管理", businessType = BusinessType.UPDATE_STATUS) + public AjaxResult editStatus(@RequestBody DmIntentDto intent) { + return super.editStatus(intent); + } + + /** + * 意图管理 + 批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_INTENT_DEL) + @Log(title = "意图管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取意图管理 + 选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + + private JSONObject addNotificaion(String key,Long personId,JSONObject jo) { + JSONObject joResult = new JSONObject(); + if (String.valueOf(key).equals("birthday") || String.valueOf(key).equals("hireDate")) { + // 获取value中的timestamp,判断是否是当天 + if (jo.containsKey("timestamp")) { + // 判断jo.get("timestamp")的月份是否与当天相同 + DateFormat dateFormat = new SimpleDateFormat("MM-dd"); + if (dateFormat.format(new Date(Long.valueOf(String.valueOf(jo.get("timestamp"))))).equals(dateFormat.format(new Date()))) { + joResult.put("msg", jo.get("content")); + joResult.put("target", 1); + redisTemplate.opsForHash().delete("group:nlp" + ":" + personId, key); + redisTemplate.opsForValue().increment("dashboard:conversation-duration", jo.get("content").toString().length() / 4); + return joResult; + } + } + } + return joResult; + } + + interface Auth { + /** 系统 - 意图管理 + 管理 - 列表 */ + String DM_INTENT_LIST = "nlt:intent:list"; + /** 系统 - 意图管理 + 管理 - 详情 */ + String DM_INTENT_SINGLE = "nlt:intent:single"; + /** 系统 - 意图管理 + 管理 - 新增 */ + String DM_INTENT_ADD = "nlt:intent:add"; + /** 系统 - 意图管理 + 管理 - 修改 */ + String DM_INTENT_EDIT = "nlt:intent:edit"; + /** 系统 - 意图管理 + 管理 - 修改状态 */ + String DM_INTENT_ES = "nlt:intent:es"; + /** 系统 - 意图管理 + 管理 - 删除 */ + String DM_INTENT_DEL = "nlt:intent:delete"; + } +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/dto/DmIntentDto.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/dto/DmIntentDto.java new file mode 100644 index 00000000..09877e72 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/dto/DmIntentDto.java @@ -0,0 +1,14 @@ +package com.xueyi.nlt.nlt.domain.dto; + + +import com.xueyi.nlt.nlt.domain.po.DmIntentPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class DmIntentDto extends DmIntentPo { + + private static final long serialVersionUID = 1L; + +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/model/DmIntentConverter.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/model/DmIntentConverter.java new file mode 100644 index 00000000..eff602bc --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/model/DmIntentConverter.java @@ -0,0 +1,13 @@ +package com.xueyi.nlt.nlt.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.nlt.nlt.domain.dto.DmIntentDto; +import com.xueyi.nlt.nlt.domain.po.DmIntentPo; +import com.xueyi.nlt.nlt.domain.query.DmIntentQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + + +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmIntentConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/po/DmIntentPo.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/po/DmIntentPo.java new file mode 100644 index 00000000..4c256f86 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/po/DmIntentPo.java @@ -0,0 +1,61 @@ +package com.xueyi.nlt.nlt.domain.po; + +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.REMARK; +import static com.xueyi.common.core.constant.basic.EntityConstants.SORT; + +/** + * 访客 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_skills", excludeProperty = { SORT, REMARK }) +public class DmIntentPo extends TBaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 数字人id */ + @Excel(name = "数字人id") + protected Long manId; + + /** 技能id */ + @Excel(name = "技能id") + protected String skillCode; + + /** 技能名称 */ + @Excel(name = "技能名称") + protected String name; + + /** 技能信息 */ + @Excel(name = "技能信息") + protected String info; + + /** 访客公司 */ + @Excel(name = "访客公司") + protected String resp; + + /** 访客称呼 */ + @Excel(name = "访客称呼") + protected Long motionId; + + protected String motionName; + + protected Integer firstCall; + + protected String auth; + + protected String intent; + + protected String template; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/query/DmIntentQuery.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/query/DmIntentQuery.java new file mode 100644 index 00000000..d15cef80 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/query/DmIntentQuery.java @@ -0,0 +1,13 @@ +package com.xueyi.nlt.nlt.domain.query; + + +import com.xueyi.nlt.nlt.domain.po.DmIntentPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class DmIntentQuery extends DmIntentPo { + + private static final long serialVersionUID = 1L; +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/IntentTemplateVo.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/IntentTemplateVo.java new file mode 100644 index 00000000..13afd3c3 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/domain/vo/IntentTemplateVo.java @@ -0,0 +1,19 @@ +package com.xueyi.nlt.nlt.domain.vo; + +import com.alibaba.fastjson2.JSONObject; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class IntentTemplateVo { + private String msg; + private JSONObject format; + /** + * 是否触发技能 + */ + private Integer target; + private String skillCode; + private JSONObject jsonFormat; + private String type ="0"; +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmIntentManager.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmIntentManager.java new file mode 100644 index 00000000..d02b1bdc --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/IDmIntentManager.java @@ -0,0 +1,8 @@ +package com.xueyi.nlt.nlt.manager; + +import com.xueyi.common.web.entity.manager.IBaseManager; +import com.xueyi.nlt.nlt.domain.dto.DmIntentDto; +import com.xueyi.nlt.nlt.domain.query.DmIntentQuery; + +public interface IDmIntentManager extends IBaseManager { +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmIntentManager.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmIntentManager.java new file mode 100644 index 00000000..77ea9f87 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/manager/impl/DmIntentManager.java @@ -0,0 +1,15 @@ +package com.xueyi.nlt.nlt.manager.impl; + +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.nlt.nlt.domain.dto.DmIntentDto; +import com.xueyi.nlt.nlt.domain.model.DmIntentConverter; +import com.xueyi.nlt.nlt.domain.po.DmIntentPo; +import com.xueyi.nlt.nlt.domain.query.DmIntentQuery; +import com.xueyi.nlt.nlt.manager.IDmIntentManager; +import com.xueyi.nlt.nlt.mapper.DmIntentMapper; +import org.springframework.stereotype.Component; + +@Component +public class DmIntentManager extends BaseManagerImpl implements IDmIntentManager { + +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/mapper/DmIntentMapper.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/mapper/DmIntentMapper.java new file mode 100644 index 00000000..1c71bcca --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/mapper/DmIntentMapper.java @@ -0,0 +1,11 @@ +package com.xueyi.nlt.nlt.mapper; + +import com.xueyi.common.datasource.annotation.Isolate; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.nlt.nlt.domain.dto.DmIntentDto; +import com.xueyi.nlt.nlt.domain.po.DmIntentPo; +import com.xueyi.nlt.nlt.domain.query.DmIntentQuery; + +@Isolate +public interface DmIntentMapper extends BaseMapper { +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmIntentService.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmIntentService.java new file mode 100644 index 00000000..79981a70 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/IDmIntentService.java @@ -0,0 +1,8 @@ +package com.xueyi.nlt.nlt.service; + +import com.xueyi.common.web.entity.service.IBaseService; +import com.xueyi.nlt.nlt.domain.dto.DmIntentDto; +import com.xueyi.nlt.nlt.domain.query.DmIntentQuery; + +public interface IDmIntentService extends IBaseService { +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmIntentServiceImpl.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmIntentServiceImpl.java new file mode 100644 index 00000000..38c7ba34 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/service/impl/DmIntentServiceImpl.java @@ -0,0 +1,12 @@ +package com.xueyi.nlt.nlt.service.impl; + +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.nlt.nlt.domain.dto.DmIntentDto; +import com.xueyi.nlt.nlt.domain.query.DmIntentQuery; +import com.xueyi.nlt.nlt.manager.IDmIntentManager; +import com.xueyi.nlt.nlt.service.IDmIntentService; +import org.springframework.stereotype.Service; + +@Service +public class DmIntentServiceImpl extends BaseServiceImpl implements IDmIntentService { +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/BaseTemplate.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/BaseTemplate.java new file mode 100644 index 00000000..c2d0faea --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/BaseTemplate.java @@ -0,0 +1,8 @@ +package com.xueyi.nlt.nlt.template; + +import com.alibaba.fastjson2.JSONObject; + +public interface BaseTemplate { + JSONObject handle(String dev, String content); + JSONObject handle(String dev, String content,Long tenantId); +} diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/FreeChatTemplate.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/FreeChatTemplate.java new file mode 100644 index 00000000..1f90d762 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/FreeChatTemplate.java @@ -0,0 +1,61 @@ +package com.xueyi.nlt.nlt.template; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONException; +import com.alibaba.fastjson2.JSONObject; +import com.xueyi.nlt.netty.client.WebSocketClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.List; + + +@Service("free-chat") +public class FreeChatTemplate implements BaseTemplate{ + + private static final Logger log = LoggerFactory.getLogger(FreeChatTemplate.class); + @Autowired + WebSocketClient webSocketClient; + + @Autowired + private RedisTemplate redisTemplate; + + @Override + public JSONObject handle(String devId, String content) { + + // 根据content内容调用模版并返回结果 + synchronized (WebSocketClient.LOCK) { + // 通过redis获取数字人上下文信息 + Long size = redisTemplate.opsForList().size("group:device:" + devId); + if (size > 8) { + redisTemplate.opsForList().leftPop("group:device:" + devId,2); + } + redisTemplate.opsForList().rightPush("group:device:" + devId,content); + List context = redisTemplate.opsForList().range("group:device:" + devId,0,size); + String prefix = "你的任务是[针对给定的文段提出" + (content.length() /100 + 1 ) + "个问题并回答]。文段为:[\""; + String suffix = "\"]。输出为一个JSON数组[{}],每个元素是一个JSON:{“question”:,”answer”:}。不要给出任何解释说明。"; + log.info(prefix + content + suffix); +// webSocketClient.sendMsg(prefix + content + suffix); + webSocketClient.sendMsg(context); + try { + WebSocketClient.LOCK.wait(); + String result = (String)redisTemplate.opsForValue().get("group:websocket:content"); + redisTemplate.opsForList().rightPush("group:device:" + devId,result); + JSONObject resultJson = new JSONObject(); + resultJson.put("msg",result); + return resultJson; + } catch (InterruptedException e) { + log.warn(e.getMessage()); + } + } + return null; + } + + @Override + public JSONObject handle(String dev, String content, Long tenantId) { + return null; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/GenerativeKnowledgeTemplate.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/GenerativeKnowledgeTemplate.java new file mode 100644 index 00000000..edf4366f --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/GenerativeKnowledgeTemplate.java @@ -0,0 +1,59 @@ +package com.xueyi.nlt.nlt.template; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONException; +import com.alibaba.fastjson2.JSONObject; +import com.xueyi.nlt.netty.client.WebSocketClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + + +@Service("generative-knowledge") +public class GenerativeKnowledgeTemplate implements BaseTemplate{ + + private static final Logger log = LoggerFactory.getLogger(GenerativeKnowledgeTemplate.class); + @Autowired + WebSocketClient webSocketClient; + + @Autowired + private RedisTemplate redisTemplate; + + @Override + public JSONObject handle(String devId, String content) { + + // 根据content内容调用模版并返回结果 + synchronized (WebSocketClient.LOCK) { + + String prefix = "你的任务是[针对给定的文段提出" + (content.length() /100 + 1 ) + "个问题并回答]。文段为:[\""; + String suffix = "\"]。输出为一个JSON数组[{}],每个元素是一个JSON:{“question”:,”answer”:}。不要给出任何解释说明。"; + log.info(prefix + content + suffix); + webSocketClient.sendMsg(prefix + content + suffix); + try { + WebSocketClient.LOCK.wait(); + String result = (String)redisTemplate.opsForValue().get("group:websocket:content"); + try { + JSONArray jsonArray = JSONArray.parseArray(result); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("questions",jsonArray); + return jsonObject; + } catch (JSONException je) { + // 返回结果错误,计日志,存log,返回空结果 + log.error(je.getMessage(),je); + return new JSONObject(); + } + + } catch (InterruptedException e) { + log.warn(e.getMessage()); + } + } + return new JSONObject(); + } + + @Override + public JSONObject handle(String dev, String content, Long tenantId) { + return null; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/MeetingOrderTemplate.java b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/MeetingOrderTemplate.java new file mode 100644 index 00000000..1fb499f0 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/java/com/xueyi/nlt/nlt/template/MeetingOrderTemplate.java @@ -0,0 +1,245 @@ +package com.xueyi.nlt.nlt.template; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery; +import co.elastic.clients.elasticsearch._types.query_dsl.Query; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONException; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.cache.utils.SourceUtil; +import com.xueyi.common.core.constant.basic.SecurityConstants; +import com.xueyi.common.core.constant.digitalman.SkillConstants; +import com.xueyi.common.core.web.result.R; +import com.xueyi.nlt.api.nlt.domain.vo.CoversationSessionVo; +import com.xueyi.nlt.netty.client.WebSocketClient; +import com.xueyi.nlt.nlt.controller.DmIntentController; +import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanExtPo; +import com.xueyi.system.api.digitalmans.feign.RemoteDigitalmanService; +import com.xueyi.system.api.meeting.domain.dto.DmMeetingRoomsDto; +import com.xueyi.system.api.meeting.feign.RemoteMeetingService; +import com.xueyi.system.api.model.Source; +import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; +import com.xueyi.system.api.organize.feign.RemoteEnterpriseService; +import com.xueyi.system.api.pass.domain.po.DmRecognizedRecordsPo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +@Service("meeting-order") +public class MeetingOrderTemplate implements BaseTemplate { + + private static final Logger log = LoggerFactory.getLogger(MeetingOrderTemplate.class); + @Autowired + WebSocketClient webSocketClient; + +// @Autowired +// RemoteMeetingService remoteMeetingService; + + @Autowired + private RemoteMeetingService remoteMeetingService; + + @Autowired + private RemoteDigitalmanService digitalmanService; + @Autowired + RemoteEnterpriseService enterpriseService; + @Autowired + private StringRedisTemplate redisTemplate; + + @Autowired + private RedisTemplate objectRedisTemplate; + @Autowired + private ElasticsearchClient esClient; + + @Override + public JSONObject handle(String devId, String content,Long tenantId) { + LocalDateTime date = LocalDateTime.now(); + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 00:00"); + DateTimeFormatter scheduleFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); + R enterpriseDtoR = enterpriseService.getInfo(tenantId); + Source source = SourceUtil.getSourceCache(enterpriseDtoR.getData().getStrategyId()); + R extR = digitalmanService.selectExtByDeviceId(devId,tenantId,source.getMaster(), SecurityConstants.INNER); + DmDigitalmanExtPo extPo = null; + if (null != extR) { + extPo = extR.getData(); + } + + + // 获取房间号 + R> roomListR = remoteMeetingService.roomListInner(extPo.getDeptId(),tenantId,source.getMaster(), SecurityConstants.INNER); + // 缓存获取会议室session信息 + CoversationSessionVo session = (CoversationSessionVo) objectRedisTemplate.opsForValue().get("group:device" + ":" + devId + ":" +"session"); + if (session == null) { + session = new CoversationSessionVo(); + session.setCategory("meeting"); + session.setFormat(new JSONObject()); + session.getFormat().put("skillCode",SkillConstants.SkillType.BOOK_MEETING_ROOM.getCode()); + } + + synchronized (WebSocketClient.LOCK) { + +// String prefix = "假设你是一位前台,你需要通过与其他人对话来获取会议相关信息,已知今天是" + +// date.format(formatter) + ",你需要获取会议日期,开始时间,持续时间,会议地点,会议主题。时间用类似00:00的格式输出。对方的话中可能不包含全部信息,对于未知的信息填充为none。如果所有信息都已知那么commit为true。否则为false。将你获得的信息输出为json格式。对方的话是:“"; +// String suffix = "”,只输出最后的json。输出只有一行,输出格式为{date:,start_time:,duration:,location:,theme:commit:}。"; +// remoteMeetingService.roomListInner() +// String prefix = "我想请你充当[企业前台], 已知现在是" + +// date.format(formatter) + "。我对你说:”"; +// String suffix = "”。会议地点:{" + "大会议室,小会议室" + "}。会议内容:{其他会议,例会,访客接待,面试}。未知的项目输出null。输出为{date:,start_time:,duration_hours:,location:,meeting_content:}"; + String prefix = "当前时间是"+ dateFormatter.format(date)+ " 00:00。我将提供一些用户输入的信息,请提取输入的内容进行结构化转换并输出对应 json 格式的代码。下面是结构的描述:date(格式为YYYY-MM-DD);start_time(格式HH:MM);location; 下面是用户的输入信息:开个会"; + String suffix = "\"。请开始信息提取,你回复的内容必须是一个json结构,如果没提取到的信息赋值为null,我不需要代码。"; + log.info(prefix + content + suffix); + +// String prefix = "当前时间是" + +// date.format(formatter) + " " + date.getDayOfWeek() + "。我将提供一些用户输入的信息,请提取输入的内容进行结构化转换并输出对应 json 格式的代码。下面是结构的描述:会议日期date(格式为YYYY-MM-DD);具体时间start_time(格式HH:MM);会议室地点location; 下面是用户的输入信息:\""; +// String suffix = "\"。请开始信息提取,你回复的内容必须是一个json结构,我只要json结果,不需要代码。"; +// log.info(prefix + content + suffix); + webSocketClient.sendMsg(prefix + content + suffix); + try { + WebSocketClient.LOCK.wait(); + String result = redisTemplate.opsForValue().get("group:websocket:content"); + try { + //对result进行解析,获取字符串第一个与'{'和最后一个'}'之间的字符串,即为json字符串 + if (!result.contains("{") || !result.contains("}")) { + // 生成内容无效 + return session.getFormat(); + } + result = result.substring(result.indexOf("{"), result.lastIndexOf("}") + 1); + System.out.println(result); + JSONObject jo = JSONObject.parseObject(result); + String dateStr = jo.getString("date"); + String timeStr = jo.getString("start_time"); + String locationStr = jo.getString("location"); + + if (StringUtils.isNotEmpty(locationStr)) { + roomListR.getData().forEach(item -> { + if(item.getName().equals(jo.get("location"))){ + jo.put("locationId",item.getId()); + } + }); + if (jo.get("locationId") != null) { + session.getFormat().put("location",locationStr); + session.getFormat().put("locationId",jo.get("locationId")); + } + } + //设置时间参数 + if (StringUtils.isNotEmpty(dateStr) && dateStr.split(":").length == 3) { + if (!jo.containsKey("locationId") || !session.getFormat().containsKey("date")) { + session.getFormat().put("date",dateStr); + } + + } + if (StringUtils.isNotEmpty(timeStr) && !timeStr.equals("00:00")) { + //判断timeStr的格式是否是HH:mm + if (timeStr.split(":").length == 2) { + session.getFormat().put("start_time",timeStr); + } + + } + +// R> recentListR = null; +// if (jo.get("start_time") != null ) { +// if (jo.get("start_time").equals("00:00")) { +// recentListR = remoteMeetingService.ableOrderList(devId, jo.getString("date"), null, null); +// } else { +// recentListR = remoteMeetingService.ableOrderList(devId, jo.getString("date"), null, jo.getString("start_time")); +// } +// if (recentListR.isOk()) { +// jo.put("start_time",recentListR.getData().get(0).get("startTime")); +// jo.put("location",recentListR.getData().get(0).get("roomId")); +// } +// } + // 判断内容是否击中es + CoversationSessionVo dateSession = processEsDate(content,session); + if (dateSession != null ){ + session = dateSession; + } + //判断会议室是否冲突,如果冲突,删除时间 + JSONObject checkObject = session.getFormat(); + if (checkObject.containsKey("date") && checkObject.containsKey("time") && checkObject.containsKey("location")) { + JSONObject ret = remoteMeetingService.queryExist(checkObject.getLong("locationId"), checkObject.getString("date"), checkObject.getString("time"),tenantId,source.getMaster(), SecurityConstants.INNER); + if (StringUtils.isNotEmpty(ret.getString("err"))) { + // 会议室冲突,删除时间 + session.getFormat().remove("time"); + } + } + // redis缓存更新session + objectRedisTemplate.opsForValue().set("group:device" + ":" + devId + ":" +"session", session, 1,TimeUnit.MINUTES); + session.getFormat().put("skillCode", SkillConstants.SkillType.BOOK_MEETING_ROOM.getCode()); + return session.getFormat(); + } catch (JSONException je) { + // 返回结果错误,计日志,存log,返回空结果 + log.error(je.getMessage(),je); + return null; + } + + } catch (InterruptedException e) { + log.warn(e.getMessage()); + Thread.currentThread().interrupt(); + } +// JSONArray ja = new JSONArray(); +// R> recentListR = null; +// recentListR = remoteMeetingService.ableOrderList(devId,null,null,null); +// if (recentListR.isOk()) { +// recentListR.getData().forEach(item->{ +// JSONObject tJson = new JSONObject(); +// tJson.put("start_time",item.get("startTime")); +// tJson.put("location",item.get("roomId")); +// tJson.put("date",item.get(("orderDate"))); +// tJson.put("duration_hours",0.5); +// ja.add(tJson); +// }); +// JSONObject result = new JSONObject(); +// result.put("data",ja); +// return result; +// } + } + return null; + } + private CoversationSessionVo processEsDate(String content,CoversationSessionVo session) { + LocalDateTime date = LocalDateTime.now(); + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + SearchResponse dateResponse = null; + try { + MatchQuery byName = MatchQuery.of(m->m.field("name").query(content)); + dateResponse = esClient.search(builder -> builder + .index("meeting_date").query(q->q.match(byName)).minScore(3.0), + JSONObject.class); + log.info("esClient search result: {}", dateResponse); + }catch (IOException ie) { + log.error("esClient search error", ie); + return null; + } + List dates = dateResponse.hits().hits().stream().map(f->f.source()).collect( + Collectors.toList() + ); + if (dates.size() > 0) { + Integer dateInt = date.getDayOfWeek().getValue(); + date = dates.get(0).get("type").equals("week")? date.plusDays(dates.get(0).getLong("content") - (long)dateInt) : date.plusDays(dates.get(0).getLong("content")); + session.getFormat().put("date",dateFormatter.format(date)); + + } + return session; + } + + @Override + public JSONObject handle(String dev, String content) { + return null; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/resources/banner.txt b/xueyi-modules/xueyi-nlt/src/main/resources/banner.txt new file mode 100644 index 00000000..56ec3d17 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _______ _________ _ _________ +|\ /||\ /|( ____ \|\ /|\__ __/ ( ( /||\ \__ __/ +( \ / )| ) ( || ( \/( \ / ) ) ( | \ ( || ) ) ( + \ (_) / | | | || (__ \ (_) / | | _____ | \ | || | | | + ) _ ( | | | || __) \ / | |(_____)| (\ \) || | | | + / ( ) \ | | | || ( ) ( | | | | \ || | | | +( / \ )| (___) || (____/\ | | ___) (___ | ) \ || (____/\ | | +|/ \|(_______)(_______/ \_/ \_______/ |/ )_)(_______/ )_( \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/resources/bootstrap.yml b/xueyi-modules/xueyi-nlt/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..24f06cd1 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/resources/bootstrap.yml @@ -0,0 +1,34 @@ +# Tomcat +server: + port: 9910 + +# Spring +spring: + application: + # 应用名称 + name: xueyi-nlt + profiles: + # 环境配置 + active: @activatedProperties@ + servlet: + multipart: + max-request-size: 20MB + max-file-size: 100MB + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: @nacos.host@:@nacos.port@ + namespace: @nacos.namespace@ + + config: + # 配置中心地址 + 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} \ No newline at end of file diff --git a/xueyi-modules/xueyi-nlt/src/main/resources/logback.xml b/xueyi-modules/xueyi-nlt/src/main/resources/logback.xml new file mode 100644 index 00000000..7c344af1 --- /dev/null +++ b/xueyi-modules/xueyi-nlt/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/Dockerfile b/xueyi-modules/xueyi-system/Dockerfile index bb4d8abd..0516cebe 100644 --- a/xueyi-modules/xueyi-system/Dockerfile +++ b/xueyi-modules/xueyi-system/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-system/pom.xml b/xueyi-modules/xueyi-system/pom.xml index b74fb9a0..ea8ddea4 100644 --- a/xueyi-modules/xueyi-system/pom.xml +++ b/xueyi-modules/xueyi-system/pom.xml @@ -41,6 +41,11 @@ spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-test + com.xueyi @@ -75,6 +80,17 @@ xueyi-common-sms + + com.xueyi + xueyi-common-mqtt + 2.5.0 + + + + com.xueyi + xueyi-api-modules-auth + + com.konghq @@ -92,6 +108,29 @@ thumbnailator 0.4.8 + + com.xueyi + xueyi-api-nlt + + + + jakarta.json + jakarta.json-api + 2.0.1 + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.13.0 + + + + co.elastic.clients + elasticsearch-java + 8.3.3 + + @@ -110,6 +149,20 @@ + + maven-resources-plugin + org.apache.maven.plugins + + @ + false + + + + + src/main/resources + true + + diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/XueYiSystemApplication.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/XueYiSystemApplication.java index f7136959..a44681c7 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/XueYiSystemApplication.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/XueYiSystemApplication.java @@ -3,12 +3,8 @@ package com.xueyi.system; import com.xueyi.common.security.annotation.EnableCustomConfig; import com.xueyi.common.security.annotation.EnableRyFeignClients; import com.xueyi.common.swagger.annotation.EnableCustomSwagger; -import com.xueyi.common.web.utils.ResponseCodeUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -import java.util.Map; /** * 系统模块 @@ -34,13 +30,4 @@ public class XueYiSystemApplication { " '--' '----'`-..-' "); } - /** - * @Author yangkai - * @Description 返回错误信息处理 - * @return - **/ - @Bean - public Map> responseMessageMap() { - return ResponseCodeUtil.getResponseCodeAndMsgMap(); - } } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/controller/DmHolidayController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/controller/DmHolidayController.java new file mode 100644 index 00000000..093f1375 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/controller/DmHolidayController.java @@ -0,0 +1,46 @@ +package com.xueyi.system.common.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.system.api.holiday.feign.RemoteHolidayService; +import com.xueyi.system.common.domain.dto.DmHolidayDto; +import com.xueyi.system.common.domain.query.DmHolidayQuery; +import com.xueyi.system.common.service.IDmHolidayService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequestMapping("/holiday") +public class DmHolidayController extends BaseController { + + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "节假日管理 "; + } + + @Autowired + RemoteHolidayService holidayService; + /** + * 获取今天是否为工作日 + */ + @GetMapping("/api/getTodayIsWorkDay") + AjaxResult getTodayIsWorkDay() { + return success(baseService.getTodayHoliday()); + } + + /** + * 调用外部接口,获取本年度节假日信息 + */ + @GetMapping("/getHolidays") + AjaxResult getHolidays() { + JSONObject holidays = holidayService.getHolidays(); + return AjaxResult.success(); + } + +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/dto/DmHolidayDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/dto/DmHolidayDto.java new file mode 100644 index 00000000..5dcf1e3e --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/dto/DmHolidayDto.java @@ -0,0 +1,16 @@ +package com.xueyi.system.common.domain.dto; + + +import com.xueyi.system.common.domain.po.DmHolidayPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +@Data +@EqualsAndHashCode(callSuper = true) +public class DmHolidayDto extends DmHolidayPo { + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/model/DmHolidayConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/model/DmHolidayConverter.java new file mode 100644 index 00000000..46449db4 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/model/DmHolidayConverter.java @@ -0,0 +1,18 @@ +package com.xueyi.system.common.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.common.domain.dto.DmHolidayDto; +import com.xueyi.system.common.domain.po.DmHolidayPo; +import com.xueyi.system.common.domain.query.DmHolidayQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 动作管理 + 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmHolidayConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/po/DmHolidayPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/po/DmHolidayPo.java new file mode 100644 index 00000000..fc127871 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/po/DmHolidayPo.java @@ -0,0 +1,41 @@ +package com.xueyi.system.common.domain.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.xueyi.common.core.annotation.Excel; +import com.xueyi.common.core.web.entity.base.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.time.LocalDate; + +import static com.xueyi.common.core.constant.basic.EntityConstants.*; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_holiday", excludeProperty = { STATUS, SORT, REMARK, DEL_FLAG }) +public class DmHolidayPo extends BaseEntity{ + + @Serial + private static final long serialVersionUID = 1L; + + /** 是否为节假日 */ + @Excel(name = "是否为节假日") + protected LocalDate date; + + /** 是否为节假日 */ + @Excel(name = "是否为节假日") + protected Integer holiday; + + /** 工资比例 */ + @Excel(name = "工资比例") + protected Double wage; + + /** 是否节后调休 */ + @Excel(name = "是否节后调休") + protected Integer after; + + /** 关联节假日 */ + @Excel(name = "关联节假日") + protected String target; +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/query/DmHolidayQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/query/DmHolidayQuery.java new file mode 100644 index 00000000..b3813221 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/domain/query/DmHolidayQuery.java @@ -0,0 +1,13 @@ +package com.xueyi.system.common.domain.query; +import com.xueyi.system.common.domain.po.DmHolidayPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class DmHolidayQuery extends DmHolidayPo { + + private static final long serialVersionUID = 1L; + + +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/manager/IDmHolidayManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/manager/IDmHolidayManager.java new file mode 100644 index 00000000..39e6a263 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/manager/IDmHolidayManager.java @@ -0,0 +1,21 @@ +package com.xueyi.system.common.manager; + +import com.xueyi.common.web.entity.manager.IBaseManager; +import com.xueyi.system.common.domain.dto.DmHolidayDto; +import com.xueyi.system.common.domain.query.DmHolidayQuery; + +/** + * 动作管理 +管理 数据封装层 + * + * @author xueyi + */ +public interface IDmHolidayManager extends IBaseManager { + + /** + * 获取今日节假日 + * + * @return 今日节假日 + */ + public DmHolidayDto selectTodayHoliday(DmHolidayQuery query); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/manager/impl/DmHolidayManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/manager/impl/DmHolidayManager.java new file mode 100644 index 00000000..7dd16df0 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/manager/impl/DmHolidayManager.java @@ -0,0 +1,36 @@ +package com.xueyi.system.common.manager.impl; + + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.common.domain.dto.DmHolidayDto; +import com.xueyi.system.common.domain.model.DmHolidayConverter; +import com.xueyi.system.common.domain.po.DmHolidayPo; +import com.xueyi.system.common.domain.query.DmHolidayQuery; +import com.xueyi.system.common.manager.IDmHolidayManager; +import com.xueyi.system.common.mapper.DmHolidayMapper; + +import org.springframework.stereotype.Component; + +import java.util.List; + + +/** + * 动作管理 +管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmHolidayManager extends BaseManagerImpl implements IDmHolidayManager { + + @Override + public DmHolidayDto selectTodayHoliday(DmHolidayQuery query) { + List poList = baseMapper.selectList(Wrappers.query().lambda() + .eq(DmHolidayPo::getDate, query.getDate())); + if (poList != null && poList.size() > 0) { + return baseConverter.mapperDto(poList.get(0)); + } + return null; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/mapper/DmHolidayMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/mapper/DmHolidayMapper.java new file mode 100644 index 00000000..eed0c261 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/mapper/DmHolidayMapper.java @@ -0,0 +1,17 @@ +package com.xueyi.system.common.mapper; + +import com.xueyi.common.datasource.annotation.Master; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.system.common.domain.dto.DmHolidayDto; +import com.xueyi.system.common.domain.po.DmHolidayPo; +import com.xueyi.system.common.domain.query.DmHolidayQuery; + +/** + * 动作管理 +管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmHolidayMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/service/IDmHolidayService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/service/IDmHolidayService.java new file mode 100644 index 00000000..c254c496 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/service/IDmHolidayService.java @@ -0,0 +1,10 @@ +package com.xueyi.system.common.service; + +import com.xueyi.common.web.entity.service.IBaseService; +import com.xueyi.system.common.domain.dto.DmHolidayDto; +import com.xueyi.system.common.domain.query.DmHolidayQuery; + +public interface IDmHolidayService extends IBaseService { + + DmHolidayDto getTodayHoliday(); +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/service/impl/IDmHolidayServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/service/impl/IDmHolidayServiceImpl.java new file mode 100644 index 00000000..c73037f1 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/common/service/impl/IDmHolidayServiceImpl.java @@ -0,0 +1,32 @@ +package com.xueyi.system.common.service.impl; + +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.system.common.domain.dto.DmHolidayDto; +import com.xueyi.system.common.domain.query.DmHolidayQuery; +import com.xueyi.system.common.manager.IDmHolidayManager; +import com.xueyi.system.common.service.IDmHolidayService; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; + +@Service +public class IDmHolidayServiceImpl extends BaseServiceImpl implements IDmHolidayService { + + @Override + public DmHolidayDto getTodayHoliday() { + DmHolidayQuery query = new DmHolidayQuery(); + query.setDate(LocalDate.now()); + DmHolidayDto dto = baseManager.selectTodayHoliday(query); + if (dto != null) { + return dto; + } + dto = new DmHolidayDto(); + // 判断今天是工作日还是周末 + if (LocalDate.now().getDayOfWeek().getValue() == 6 || LocalDate.now().getDayOfWeek().getValue() == 7) { + dto.setHoliday(1); + } else { + dto.setHoliday(0); + } + return dto; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmActionController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmActionController.java new file mode 100644 index 00000000..68cf0421 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmActionController.java @@ -0,0 +1,136 @@ +package com.xueyi.system.digitalmans.controller; + +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.security.annotation.Logical; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.system.digitalmans.domain.dto.DmActionDto; +import com.xueyi.system.digitalmans.domain.query.DmActionQuery; +import com.xueyi.system.digitalmans.service.IDmActionService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.List; + +/** + * 动作管理 +管理 业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/action") +public class DmActionController extends BaseController { + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "动作管理 "; + } + + /** + * 查询动作管理 +列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_ACTION_LIST) + public AjaxResult list(DmActionQuery action) { + return super.list(action); + } + + /** + * 查询动作管理 +详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_ACTION_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 动作管理 +新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_ACTION_ADD) + @Log(title = "动作管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmActionDto action) { + return super.add(action); + } + + /** + * 动作管理 +修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_ACTION_EDIT) + @Log(title = "动作管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmActionDto action) { + return super.edit(action); + } + + /** + * 动作管理 +修改状态 + */ + @Override + @PutMapping("/status") + @RequiresPermissions(value = {Auth.DM_ACTION_EDIT, Auth.DM_ACTION_ES}, logical = Logical.OR) + @Log(title = "动作管理", businessType = BusinessType.UPDATE_STATUS) + public AjaxResult editStatus(@RequestBody DmActionDto action) { + return super.editStatus(action); + } + + /** + * 动作管理 +批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_ACTION_DEL) + @Log(title = "动作管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取动作管理 +选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 动作管理 +管理 - 列表 */ + String DM_ACTION_LIST = "digitalmans:action:list"; + /** 系统 - 动作管理 +管理 - 详情 */ + String DM_ACTION_SINGLE = "digitalmans:action:single"; + /** 系统 - 动作管理 +管理 - 新增 */ + String DM_ACTION_ADD = "digitalmans:action:add"; + /** 系统 - 动作管理 +管理 - 修改 */ + String DM_ACTION_EDIT = "digitalmans:action:edit"; + /** 系统 - 动作管理 +管理 - 修改状态 */ + String DM_ACTION_ES = "digitalmans:action:es"; + /** 系统 - 动作管理 +管理 - 删除 */ + String DM_ACTION_DEL = "digitalmans:action:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmBroadcastController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmBroadcastController.java new file mode 100644 index 00000000..aa46b8cc --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmBroadcastController.java @@ -0,0 +1,218 @@ +package com.xueyi.system.digitalmans.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.xueyi.common.core.utils.core.IdUtil; +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.result.R; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.security.annotation.Logical; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.system.api.digitalmans.domain.vo.DmBroadcastVo; +import com.xueyi.system.api.meeting.feign.RemoteMeetingService; +import com.xueyi.system.api.organize.domain.po.SysUserPo; +import com.xueyi.system.digitalmans.domain.dto.DmBroadcastDto; +import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; +import com.xueyi.system.digitalmans.domain.merge.DmBroadcastResourceMerge; +import com.xueyi.system.digitalmans.domain.query.DmBroadcastQuery; +import com.xueyi.system.digitalmans.domain.query.DmDigitalmanQuery; +import com.xueyi.system.digitalmans.manager.impl.DmBroadcastManager; +import com.xueyi.system.digitalmans.service.IDmBroadcastService; +import com.xueyi.system.digitalmans.service.IDmDigitalmanService; +import com.xueyi.system.organize.service.ISysUserService; +import com.xueyi.system.resource.domain.dto.DmResourcesDto; +import com.xueyi.system.resource.domain.model.DmResourcesConverter; +import com.xueyi.system.resource.mapper.DmResourcesMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * 播报管理 业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/broadcast") +public class DmBroadcastController extends BaseController { + + @Autowired + private DmBroadcastManager broadcastManager; + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "播报" ; + } + + @Autowired + private DmResourcesMapper resourceMapper; + + @Autowired + private DmResourcesConverter resourcesConverter; + + @Autowired + private IDmDigitalmanService digitalmanService; + + @Autowired + private ISysUserService sysUserService; + + /** + * 查询播报列表 + */ + @GetMapping("/inner/list") + public R> innerlist(@RequestParam("manCode")String manCode) { + DmDigitalmanQuery query = new DmDigitalmanQuery(); + query.setManCode(manCode); + List manList = digitalmanService.selectList(query); + List list = baseService.selectListScope(new DmBroadcastQuery()); + List voList = new ArrayList<>(); + list.forEach(item-> { + // 定义DmBroadcastVo类型变量vo,将list.get(0)赋值给vo + DmBroadcastVo vo = new DmBroadcastVo(); + vo.setId(item.getId()); + vo.setSpeed(item.getSpeed()); + vo.setRecycle(item.getRecycle()); + List rList = new ArrayList<>(); + List mergeDtos = broadcastManager.selectBroadcastResourceMerge(item.getId()); + int order = 0; + for (DmBroadcastResourceMerge merge : mergeDtos) { + if (merge.getResourceId() != null && merge.getResourceId() > 0) { + + DmResourcesDto resourcesDto = resourcesConverter.mapperDto(resourceMapper.selectById(merge.getResourceId())); + JSONObject json = new JSONObject(); + json.put("order",order++); + json.put("ttsText",merge.getTtsText()); + json.put("url", resourcesDto.getUrl()); + rList.add(json); + } + } + vo.setResource(rList); + voList.add(vo); + }); + if (voList.size() > 0) + return R.ok(voList); + return R.fail("无法获取播报信息"); + } + + /** + * 查询播报列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_BROADCAST_LIST) + public AjaxResult list(DmBroadcastQuery broadcast) { + startPage(); + List list = baseService.selectListScope(broadcast); + + for (DmBroadcastDto dto : list) { + List mergeDtos = broadcastManager.selectBroadcastResourceMerge(dto.getId()); + SysUserPo user = sysUserService.selectById(dto.getCreateBy()); + dto.setUserName(user.getUserName()); + List temp = new ArrayList<>(); + for (DmBroadcastResourceMerge merge : mergeDtos) { + if (merge.getResourceId() != null && merge.getResourceId() > 0) { + DmResourcesDto resourcesDto = resourcesConverter.mapperDto(resourceMapper.selectById(merge.getResourceId())); + JSONObject json = JSONObject.from(merge); + json.put("url", resourcesDto.getUrl()); + temp.add(json); + } + } + + + dto.setObjList(temp); + } + return getDataTable(list); + } + + /** + * 查询播报详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_BROADCAST_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 播报新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_BROADCAST_ADD) + @Log(title = "播报管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmBroadcastDto broadcast) { + Long id = IdUtil.getSnowflakeNextId(); + broadcast.setId(id); + broadcast.setCreateTime(LocalDateTime.now()); + broadcastManager.addBroadcastResourceMerge(id, broadcast.getResourceList()); + return super.add(broadcast); + } + + /** + * 播报修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_BROADCAST_EDIT) + @Log(title = "播报管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmBroadcastDto broadcast) { + broadcastManager.editBroadcastResourceMerge(broadcast.getId(), broadcast.getResourceList()); + broadcast.setUpdateTime(LocalDateTime.now()); + return super.edit(broadcast); + } + + /** + * 播报修改状态 + */ + @Override + @PutMapping("/status") + @RequiresPermissions(value = {Auth.DM_BROADCAST_EDIT, Auth.DM_BROADCAST_ES}, logical = Logical.OR) + @Log(title = "播报管理", businessType = BusinessType.UPDATE_STATUS) + public AjaxResult editStatus(@RequestBody DmBroadcastDto broadcast) { + return super.editStatus(broadcast); + } + + /** + * 播报批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_BROADCAST_DEL) + @Log(title = "播报管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取播报选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 播报管理 - 列表 */ + String DM_BROADCAST_LIST = "digitalmans:broadcast:list"; + /** 系统 - 播报管理 - 详情 */ + String DM_BROADCAST_SINGLE = "digitalmans:broadcast:single"; + /** 系统 - 播报管理 - 新增 */ + String DM_BROADCAST_ADD = "digitalmans:broadcast:add"; + /** 系统 - 播报管理 - 修改 */ + String DM_BROADCAST_EDIT = "digitalmans:broadcast:edit"; + /** 系统 - 播报管理 - 修改状态 */ + String DM_BROADCAST_ES = "digitalmans:broadcast:es"; + /** 系统 - 播报管理 - 删除 */ + String DM_BROADCAST_DEL = "digitalmans:broadcast:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmDigitalmanController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmDigitalmanController.java index 940c0ddc..0d79a065 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmDigitalmanController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmDigitalmanController.java @@ -1,38 +1,74 @@ package com.xueyi.system.digitalmans.controller; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.xueyi.common.core.constant.basic.BaseConstants; import com.xueyi.common.core.constant.basic.SecurityConstants; -import com.xueyi.common.core.constant.digitalman.InitConstants; +import com.xueyi.common.core.constant.basic.SqlConstants; +import com.xueyi.common.core.constant.digitalman.MessageConstants; import com.xueyi.common.core.web.result.AjaxResult; import com.xueyi.common.core.web.result.R; import com.xueyi.common.core.web.validate.V_A; import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.datasource.annotation.Master; import com.xueyi.common.log.annotation.Log; import com.xueyi.common.log.enums.BusinessType; import com.xueyi.common.security.annotation.InnerAuth; import com.xueyi.common.security.annotation.RequiresPermissions; import com.xueyi.common.web.entity.controller.BaseController; -import com.xueyi.system.api.device.domain.po.DmDeviceTenantMergePo; +import com.xueyi.common.web.utils.DateUtils; +import com.xueyi.message.api.transfer.feign.RemoteTransferService; +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.DmDigitalmanWorktimeDto; -import com.xueyi.system.api.digitalmans.domain.dto.DmModelDto; +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.digitalmans.domain.po.DmDigitalmanPo; -import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanPo; +import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo; +import com.xueyi.system.api.digitalmans.feign.RemoteDigitalmanService; import com.xueyi.system.device.service.impl.DmDeviceTenantMergeServiceImpl; import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanExtDto; +import com.xueyi.system.digitalmans.domain.model.DmDigitalmanExtConverter; +import com.xueyi.system.digitalmans.domain.query.DmDigitalmanExtQuery; import com.xueyi.system.digitalmans.domain.query.DmDigitalmanQuery; +import com.xueyi.system.digitalmans.domain.query.DmManDeviceQuery; +import com.xueyi.system.digitalmans.mapper.DmManDeviceMapper; import com.xueyi.system.digitalmans.service.IDmDigitalmanExtService; import com.xueyi.system.digitalmans.service.IDmDigitalmanService; import com.xueyi.system.digitalmans.service.IDmModelService; import com.xueyi.system.digitalmans.service.IDmSkillService; +import com.xueyi.system.digitalmans.service.impl.DmManDeviceServiceImpl; +import com.xueyi.system.emcs.constant.EmcsUploadType; +import com.xueyi.system.emcs.domain.dto.DmDeviceLogFileDto; +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.system.emcs.domain.dto.RedisBaseDto; +import com.xueyi.system.emcs.mapper.DmDeviceLogFileMapper; +import com.xueyi.system.emcs.mapper.DmExceptionLogMapper; +import com.xueyi.system.emcs.service.BaseRedisListDataCache; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +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.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import java.io.Serializable; +import java.text.ParseException; +import java.time.Duration; +import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * 数字人基础管理 业务处理 @@ -43,18 +79,54 @@ import java.util.List; @RequestMapping("/man") public class DmDigitalmanController extends BaseController { + private final static String HEART_MQTT_PREFIX = "digital-man"; + private final static Integer REDIS_LIST_SIZE = 60; + + @Autowired + private BaseRedisListDataCache baseRedisListDataCache; + + @Autowired + private DmManDeviceMapper manDeviceMapper; + + @Autowired + private DmExceptionLogMapper exceptionLogMapper; + + @Autowired + private DmDeviceLogFileMapper deviceLogFileMapper; + + @Autowired + private RemoteDeviceTenantMergeService remoteDeviceTenantMergeService; + + private static final Logger log = LoggerFactory.getLogger(DmDigitalmanController.class); + @Autowired private DmDeviceTenantMergeServiceImpl deviceTenantMergeService; @Autowired private IDmDigitalmanExtService dmDigitalmanExtService; + @Autowired + private IDmDigitalmanService dmDigitalmanService; + @Autowired private IDmSkillService dmSkillService; @Autowired private IDmModelService dmModelService; + @Autowired + private DmDigitalmanExtConverter dmDigitalmanExtConverter; + + @Autowired + private RemoteTransferService remoteTransferService; + + + @Autowired + private RemoteDigitalmanService remoteDigitalmanService; + + @Autowired + private RedisTemplate redisTemplate; + /** 定义节点名称 */ @Override protected String getNodeName() { @@ -75,16 +147,34 @@ public class DmDigitalmanController extends BaseController sync() { - // 获取账号绑定的设备号 - List devices = super.baseService.selectRegisteredDevices(); + @InnerAuth + @PostMapping("/inner/sync_ext_isonline") + public R syncExtIsonline(@RequestBody List devices) { devices.forEach(item->{ - // 获取并更新在线状态 - super.baseService.syncRegisteredDevice(item); - // 数字人预警机制 + //根据设备与租户信息更新在线状态 + AjaxResult ar = remoteTransferService.getDeviceOnlineStatus(item.getDeviceId()); + DmDigitalmanExtQuery query1 = new DmDigitalmanExtQuery(); + query1.setDeviceId(item.getDeviceId()); + List extList = dmDigitalmanExtService.selectListByDeviceId(query1); + if (extList != null && extList.size() > 0) { + extList.get(0).setIsOnline(Integer.parseInt(ar.get("msg").toString())); + dmDigitalmanExtService.update(extList.get(0)); + // 更新缓存 + DmManDeviceDto redisDto = (DmManDeviceDto)redisTemplate.opsForHash().get(MessageConstants.REDIS_GROUP_DEVICE_HEADER,item.getDeviceId()); + redisDto.setOnlineStatus(ar.get("msg").toString()); + log.info("更新缓存:{}",redisDto); + // 删除缓存 + redisTemplate.opsForHash().delete(MessageConstants.REDIS_GROUP_DEVICE_HEADER, item.getDeviceId()); + // 插入缓存 + redisTemplate.opsForHash().putIfAbsent(MessageConstants.REDIS_GROUP_DEVICE_HEADER,item.getDeviceId(),redisDto); + } }); + return R.ok(); + } + @PostMapping("/inner/update_device_online") + public R updateDeviceOnline(String deviceId) { + super.baseService.syncRegisteredDevice(deviceId); + // 数字人预警机制 return null; } /** @@ -190,4 +280,200 @@ public class DmDigitalmanController extends BaseControllerlambdaQuery().eq(DmManDevicePo::getDeviceId, devId).last(SqlConstants.LIMIT_ONE)); + try { + if (null!= devicePo) { + exceptionLogDto.setManCode(devicePo.getManCode()); + exceptionLogDto.setTId(devicePo.getTId()); + + exceptionLogDto.setOccurTime(DateUtils.dateToLocalDateTime(DateUtils.parseLongToDate(timestamp))); + // 上传类型为崩溃上传时,插入异常日志 + if (uploadType == EmcsUploadType.getTypeCrackUpload()) { + exceptionLogMapper.insert(exceptionLogDto); + } + + //DmExceptionLogDto 持久化 + DmDeviceLogFileDto deviceLogFileDto = new DmDeviceLogFileDto(); + deviceLogFileDto.setManDeviceId(devicePo.getId()); + deviceLogFileDto.setUrl(path); + deviceLogFileDto.setType(uploadType); + deviceLogFileDto.setName(fileName); + + deviceLogFileMapper.insert(deviceLogFileDto); + + } else { + return; + } + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + + @GetMapping("/inner-api/devInfo/{devId}") + public R devInnerInfo(@PathVariable(required = true) String devId) { + + if (StringUtils.isNotEmpty(devId)) { + DmDigitalmanExtPo po = dmDigitalmanService.selectExt(devId); + return R.ok(po); + } + return R.fail("请检查请求参数"); + } + + + @Autowired + DmManDeviceServiceImpl dmManDeviceService; + + + @GetMapping("/api/mansInfo") + @Master + public R mansInfo() { + + List dtos = dmManDeviceService.selectList(new DmManDeviceQuery()); + List dtos2 = dtos.stream().filter(dto -> StringUtils.isNotEmpty(dto.getDeviceId())).collect(Collectors.toList());; + System.err.println(dtos2.size()); + Long serviceTimeCount = 0L; + //当前时间和activateTime时间的差值,activateTime类型是Date,差值返回的单位是小时 + for (DmManDeviceDto dto : dtos2) { + serviceTimeCount += (System.currentTimeMillis() - dto.getActivateTime().getTime())/3600000; + } + + Integer meetingServiceCount = (Integer) redisTemplate.opsForValue().get("dashboard:meeting"); + Integer serverTimes = (Integer) redisTemplate.opsForValue().get("dashboard:server"); + Integer recognition = (Integer) redisTemplate.opsForValue().get("dashboard:recognition"); + Integer receptionCount = (Integer) redisTemplate.opsForValue().get("dashboard:create_visitor_info"); + Integer visitorCount = (Integer) redisTemplate.opsForValue().get("dashboard:register_visitor"); + Integer attendanceCount = (Integer) redisTemplate.opsForValue().get("dashboard:attendance"); + Integer openDoorCount = (Integer) redisTemplate.opsForValue().get("dashboard:open_door"); + Integer conversationDuration = (Integer) redisTemplate.opsForValue().get("dashboard:conversation-duration"); + Integer conversationTimes = (Integer) redisTemplate.opsForValue().get("dashboard:conversation-times"); + JSONArray jsonArray = new JSONArray(); +// JSONArray jsonArray2 = new JSONArray(); + for (int i = 0; i < 7; i++) { + Date date = DateUtils.addDays(new Date(), -i); + String dateStr2 = DateUtils.formatDate(date, "yyyy-MM-dd"); + JSONObject json2 = new JSONObject(); + json2.put("date", dateStr2); + json2.put("serviceTimes", (Integer) redisTemplate.opsForValue().get("dashboard:server-chart:"+dateStr2)); + json2.put("knowledgeNums", (Integer) redisTemplate.opsForValue().get("dashboard:server-chart:"+dateStr2)); + jsonArray.add(json2); + } + log.info("meetingServiceCount:{}",meetingServiceCount); + log.info("serverTimes:{}",serverTimes); + log.info("recognition:{}",recognition); + log.info("receptionCount:{}",receptionCount); + log.info("visitorCount:{}",visitorCount); + log.info("attendanceCount:{}",attendanceCount); + log.info("openDoorCount:{}",openDoorCount); + log.info("chatDurationCount:{}",conversationDuration); + log.info("chatTimes:{}",conversationTimes); + log.info("serverCharts:{}",jsonArray.toJSONString()); + + JSONObject json = new JSONObject(); + json.put("manCount",dtos2.size()); + json.put("chatTimes",conversationTimes); + json.put("chatDurationCount",conversationDuration); + json.put("serviceTimeCount",serviceTimeCount); + json.put("servicePerCount",serverTimes); + json.put("recognizedPersonCount",recognition); + json.put("meetingServiceCount",meetingServiceCount); + json.put("receptionCount",receptionCount); + json.put("visitorCount",visitorCount); + json.put("attendanceCount",attendanceCount); + json.put("openDoorCount",openDoorCount); + json.put("serverCharts",jsonArray); + log.info(json.toJSONString()); + return R.ok(json); + } + + + + + + @GetMapping("/api/devInfo/{devId}") + public R devInfo(@PathVariable(required = true) String devId) { + if (StringUtils.isNotEmpty(devId)){ + DeviceTenantSourceMergeVo vo = remoteDeviceTenantMergeService.selectDeviceTenantSourceMerge(devId); + if (null!= vo){ + return remoteDigitalmanService.devInfo(devId, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + } else { + return R.fail("devId可能不存在"); + } + + } + return R.fail("请检查请求参数"); + } + + @GetMapping("/api/checkNetwork") + public R netInfo() { + return R.ok(); + } } diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmInitSkillsController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmInitSkillsController.java new file mode 100644 index 00000000..9a0b45e3 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmInitSkillsController.java @@ -0,0 +1,145 @@ +package com.xueyi.system.digitalmans.controller; + +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.security.annotation.Logical; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.system.digitalmans.domain.dto.DmInitSkillsDto; +import com.xueyi.system.digitalmans.domain.query.DmInitSkillsQuery; +import com.xueyi.system.digitalmans.service.IDmInitSkillsService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.Serializable; +import java.util.List; + +/** + * 技能管理管理 业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/skillManagement") +public class DmInitSkillsController extends BaseController { + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "技能管理" ; + } + + /** + * 查询技能管理列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_INIT_SKILLS_LIST) + public AjaxResult list(DmInitSkillsQuery initSkills) { + return super.list(initSkills); + } + + /** + * 查询技能管理详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_INIT_SKILLS_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 技能管理导出 + */ + @Override + @PostMapping("/export") + @RequiresPermissions(Auth.DM_INIT_SKILLS_EXPORT) + @Log(title = "技能管理管理", businessType = BusinessType.EXPORT) + public void export(HttpServletResponse response, DmInitSkillsQuery initSkills) { + super.export(response, initSkills); + } + + /** + * 技能管理新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_INIT_SKILLS_ADD) + @Log(title = "技能管理管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmInitSkillsDto initSkills) { + return super.add(initSkills); + } + + /** + * 技能管理修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_INIT_SKILLS_EDIT) + @Log(title = "技能管理管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmInitSkillsDto initSkills) { + return super.edit(initSkills); + } + /** + * 技能管理同步 + */ + @PostMapping("/skills_sync") + public AjaxResult sync(@RequestBody DmInitSkillsDto initSkills) { + return super.edit(initSkills); + } + + /** + * 技能管理修改状态 + */ + @Override + @PutMapping("/status") + @RequiresPermissions(value = {Auth.DM_INIT_SKILLS_EDIT, Auth.DM_INIT_SKILLS_ES}, logical = Logical.OR) + @Log(title = "技能管理管理", businessType = BusinessType.UPDATE_STATUS) + public AjaxResult editStatus(@RequestBody DmInitSkillsDto initSkills) { + return super.editStatus(initSkills); + } + + /** + * 技能管理批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_INIT_SKILLS_DEL) + @Log(title = "技能管理管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取技能管理选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 技能管理管理 - 列表 */ + String DM_INIT_SKILLS_LIST = "digitalmans:skillManagement:list"; + /** 系统 - 技能管理管理 - 详情 */ + String DM_INIT_SKILLS_SINGLE = "digitalmans:skillManagement:single"; + /** 系统 - 技能管理管理 - 新增 */ + String DM_INIT_SKILLS_ADD = "digitalmans:skillManagement:add"; + /** 系统 - 技能管理管理 - 修改 */ + String DM_INIT_SKILLS_EDIT = "digitalmans:skillManagement:edit"; + /** 系统 - 技能管理管理 - 修改状态 */ + String DM_INIT_SKILLS_ES = "digitalmans:skillManagement:es"; + /** 系统 - 技能管理管理 - 删除 */ + String DM_INIT_SKILLS_DEL = "digitalmans:skillManagement:delete"; + /** 系统 - 技能管理管理 - 导出 */ + String DM_INIT_SKILLS_EXPORT = "digitalmans:skillManagement:export"; + /** 系统 - 技能管理管理 - 缓存 */ + String DM_INIT_SKILLS_CACHE = "digitalmans:skillManagement:cache"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmManDeviceController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmManDeviceController.java index 77d3fe03..0a725bdc 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmManDeviceController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmManDeviceController.java @@ -1,8 +1,10 @@ package com.xueyi.system.digitalmans.controller; +import com.alibaba.fastjson.JSONObject; import com.xueyi.common.cache.utils.SourceUtil; import com.xueyi.common.core.constant.basic.SecurityConstants; import com.xueyi.common.core.constant.digitalman.InitConstants; +import com.xueyi.common.core.constant.digitalman.MessageConstants; import com.xueyi.common.core.utils.core.IdUtil; import com.xueyi.common.core.web.result.AjaxResult; import com.xueyi.common.core.web.result.R; @@ -10,22 +12,42 @@ import com.xueyi.common.core.web.validate.V_A; import com.xueyi.common.core.web.validate.V_E; import com.xueyi.common.log.annotation.Log; import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.mqtt.connection.MqttTemplate; import com.xueyi.common.security.annotation.Logical; import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.sms.configure.SmsProperties; import com.xueyi.common.web.entity.controller.BaseController; import com.xueyi.message.api.transfer.domain.vo.DmActiveVo; +import com.xueyi.message.api.transfer.feign.RemoteTransferService; import com.xueyi.system.api.device.domain.dto.DmDeviceTenantMergeDto; import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.api.digitalmans.domain.vo.NumberOfOnlineToChartVo; import com.xueyi.system.api.digitalmans.feign.RemoteDigitalmanService; import com.xueyi.system.api.model.Source; import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; +import com.xueyi.system.api.sms.domain.vo.DingdingReqEntity; +import com.xueyi.system.api.sms.feign.RemoteDingdingService; +import com.xueyi.system.api.sms.feign.RemoteSmsService; +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 com.xueyi.system.device.service.IDmDeviceTenantMergeService; import com.xueyi.system.dict.service.ISysDictDataService; import com.xueyi.system.digitalmans.domain.query.DmManDeviceQuery; +import com.xueyi.system.digitalmans.service.IDmDigitalmanExtService; import com.xueyi.system.digitalmans.service.IDmDigitalmanService; import com.xueyi.system.digitalmans.service.IDmManDeviceService; +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; +import com.xueyi.system.emcs.service.IDmExceptionLogService; import com.xueyi.system.organize.service.ISysEnterpriseService; +import com.xueyi.system.pass.mapper.DmRecognizedRecordsMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -38,7 +60,15 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; + +import static com.xueyi.common.core.constant.digitalman.InitConstants.DEVICE_ACTIVATE_STATUS_OFFLINE; +import static com.xueyi.common.core.constant.digitalman.RedisDefinitionConstants.GENERAL_CURRENT_NUMBER_OF_ONLINE; /** * 数字人设备管理管理 业务处理 @@ -49,9 +79,13 @@ import java.util.List; @RequestMapping("/manDevice") public class DmManDeviceController extends BaseController { + private static final Logger log = LoggerFactory.getLogger(DmManDeviceController.class); @Autowired IDmDigitalmanService digitalmanService; + @Autowired + IDmDigitalmanExtService digitalmanExtService; + @Autowired RemoteDigitalmanService remoteDigitalmanService; @@ -64,6 +98,34 @@ public class DmManDeviceController extends BaseController redisTemplate; + + @Autowired + MqttTemplate mqttTemplate; + @Autowired + IDmExceptionLogService dmExceptionLogService; + + @Autowired + RemoteSmsService remoteSmsService; + + @Autowired + SmsProperties smsProperties; + + @Autowired + RemoteDingdingService remoteDingdingService; + + + /** + * dingding连接token + */ + @Value("${notification.dingding.access-token}") + private String token; + + /** 定义节点名称 */ @Override @@ -84,10 +146,78 @@ public class DmManDeviceController extends BaseController manDeviceListInnerSync(@RequestParam(value = "tenantId") Long tenantId) { + log.info("同步设备信息开始:{}",tenantId); + DmManDeviceQuery query = new DmManDeviceQuery(); + query.setTId(tenantId); + //根据租户id获取设备列表 + List list = super.baseService.manDeviceListNotNullByTenantId(tenantId); + SysEnterpriseDto dto = enterpriseService.selectById(tenantId); + Source source = SourceUtil.getSourceCache(dto.getStrategyId()); + // 同步总体设备信息 + list.stream().filter(item->!item.getOnlineStatus().equalsIgnoreCase("0")).forEach(item->{ + log.info("同步设备信息:{}",item); + DmManDeviceDto tempDto = (DmManDeviceDto) redisTemplate.opsForHash().get(MessageConstants.REDIS_GROUP_DEVICE_HEADER,item.getDeviceId()); + if (!item.getOnlineStatus().equalsIgnoreCase(tempDto.getOnlineStatus())) { + item.setOnlineStatus(tempDto.getOnlineStatus()); + super.baseService.update(item); + } + if (tempDto.getOnlineStatus().equalsIgnoreCase(DEVICE_ACTIVATE_STATUS_OFFLINE)) { + // query if the device is in the exception log + DmExceptionLogQuery logQuery = new DmExceptionLogQuery(); + logQuery.setDevId(tempDto.getDeviceId()); + logQuery.setTId(tenantId); + logQuery.setAlertStatus(0); + logQuery.setType("heartbeat_status"); + List logDtos = dmExceptionLogService.selectList(logQuery); + // if logDtos is not empty, then add a record to the exception log + if (logDtos != null && logDtos.size() == 0) { + DmExceptionLogDto logDto = new DmExceptionLogDto(); + logDto.setDevId(item.getDeviceId()); + logDto.setTId(tenantId); + logDto.setAlertStatus(0); + logDto.setManCode(item.getManCode()); + logDto.setLevel(3); + logDto.setType("heartbeat_status"); + logDto.setOccurTime(LocalDateTime.now()); + dmExceptionLogService.insert(logDto); + DingdingReqEntity entity = new DingdingReqEntity(); + entity.setMsgtype("text"); + JSONObject jo = new JSONObject(); + jo.put("content", "【一级预警】客户" + item.getTenantName() + ",设备" + item.getDeviceId() + "离线,请尽快排查原因,并在运维端解除预警状态。"); + entity.setText(jo); + JSONObject dingdingResult = remoteDingdingService.send(token,entity); + log.info("dingdingResult:{}",dingdingResult); + } + } + }); + return remoteDigitalmanService.syncExtIsonline(list,tenantId,source.getMaster(), SecurityConstants.INNER); + } + @PutMapping(value = "/inner/info") R manDeviceInfoInnerUpdate(@RequestBody DmActiveVo vo) { return R.ok(super.baseService.manDeviceInfoInnerUpdate(vo)); } + @PostMapping(value = "/inner/sync_numbers_of_online") + R syncNumbersOfOnline() { + LocalDate currentDate = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd"); + List manDeviceDtos = (List)redisTemplate.opsForHash().values(MessageConstants.REDIS_GROUP_DEVICE_HEADER); + Long total = manDeviceDtos.stream().filter(item->(!((DmManDeviceDto)item).getOnlineStatus().isEmpty()) && + ((DmManDeviceDto)item).getOnlineStatus().equalsIgnoreCase("1")).count(); + NumberOfOnlineToChartVo vo = new NumberOfOnlineToChartVo(); + vo.setNumberOfOnline(total.toString()); + vo.setDate(currentDate.format(formatter)); + vo.setTotal(manDeviceDtos.size()); + // 获取当前日期并将数据同步到redis + redisTemplate.opsForList().leftPush(GENERAL_CURRENT_NUMBER_OF_ONLINE,vo); + if (redisTemplate.opsForList().size(GENERAL_CURRENT_NUMBER_OF_ONLINE) > 150) { + redisTemplate.opsForList().rightPop(GENERAL_CURRENT_NUMBER_OF_ONLINE,1, TimeUnit.MINUTES); + } + + return R.ok(Integer.parseInt(vo.getNumberOfOnline())); + } /** * 查询数字人设备管理列表 */ @@ -123,6 +253,7 @@ public class DmManDeviceController extends BaseController charList = new ArrayList<>(); + int count = 0; + for (int i = 0; i < devices.size() && i < 35; i++) { + if (++count % 7 == 0) { + charList.add((NumberOfOnlineToChartVo) devices.get(i)); + } + } + JSONObject jsonObject = new JSONObject(); + jsonObject.put("near5Weeks", charList); + // 获取最近五个月的数据 + count = 0; + charList = new ArrayList<>(); + for (int i = 0; i < devices.size(); i++) { + if (++count % 30 == 0) { + charList.add((NumberOfOnlineToChartVo) devices.get(i)); + } + } + jsonObject.put("near5Months", charList); + return AjaxResult.success(jsonObject); + } + + // 软件重启接口,Http为Post请求,用于通过Mqtt向指定设备号发送重启指令,mqtt的Topic为:/digitalman/{devId}/restart,devId为设备号 + @PostMapping("/restart/{type}/{devId}") + public AjaxResult restart(@PathVariable("type") Integer type,@PathVariable("devId") String devId) { + + + return AjaxResult.success(baseService.restartDevice(type,devId)); + } + + + @Autowired + private DmRecognizedRecordsMapper mapper; + @GetMapping("/delRecognizedRecords") + public AjaxResult delRecognizedRecords (@RequestParam(value = "day") Integer day){ + mapper.del(day); + return AjaxResult.success(); + } /** * 获取数字人设备管理选择框列表 */ @@ -193,4 +382,5 @@ public class DmManDeviceController extends BaseController { + + private static final Logger log = LoggerFactory.getLogger(DmQAndAController.class); + @Autowired + RedisTemplate redisTemplate; + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "企业知识库问答" ; + } + + + @PostMapping("/inner/batch_insert") + @ResponseBody + public R batchInsertInner(@RequestBody DmBatchQuestionsVo dmBatchQuestionsVo) { + log.info("knowledgeId:{},questions:{}", dmBatchQuestionsVo.getKnowledgeId(), dmBatchQuestionsVo.getQuestions().toJSONString()); + List queries = new ArrayList<>(); + // JsonArray转换为对象 + for (int i =0 ; i < dmBatchQuestionsVo.getQuestions().size();i++) { + DmQAndADto query = new DmQAndADto(); + JSONObject jsonObject = dmBatchQuestionsVo.getQuestions().getJSONObject(i); + query.setName(jsonObject.getString("question")); + query.setAnswer(jsonObject.getString("answer")); + query.setKnowledgeId(dmBatchQuestionsVo.getKnowledgeId()); + query.setStatus("0"); + query.setType(0); + query.setCreateBy(dmBatchQuestionsVo.getCreateId()); + queries.add(query); + } +// dmBatchQuestionsVo.getQuestions().forEach(item -> { +// DmQAndADto query = new DmQAndADto(); +// JSONObject jsonObject = (JSONObject)item; +// query.setName(jsonObject.getString("question")); +// query.setAnswer(jsonObject.getString("answer")); +// query.setKnowledgeId(dmBatchQuestionsVo.getKnowledgeId()); +// queries.add(query); +// }); + baseService.batchInsert(queries); + return R.ok(); + } + /** + * 查询企业知识库问答列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_Q_AND_A_LIST) + public AjaxResult list(DmQAndAQuery qAndA) { + return super.list(qAndA); + } + + /** + * 查询企业知识库问答详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_Q_AND_A_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 企业知识库问答新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_Q_AND_A_ADD) + @Log(title = "企业知识库问答管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmQAndADto qAndA) { + + return super.add(qAndA); + } + + /** + * 企业知识库元文本 + */ + @PostMapping("/upload") + @Log(title = "企业知识库问答管理", businessType = BusinessType.INSERT) + public AjaxResult upload(@RequestBody DmQAndADto qAndA) { + //将数据缓存到redis队列中 + TaskKnowledgeVo taskKnowledgeVo = new TaskKnowledgeVo(); + taskKnowledgeVo.setContent(qAndA.getMetaText()); + taskKnowledgeVo.setCount(qAndA.getMetaText().length()); + taskKnowledgeVo.setManId(qAndA.getManId()); + taskKnowledgeVo.setKnowledgeId(qAndA.getKnowledgeId()); + taskKnowledgeVo.setTenantId(SecurityUtils.getEnterpriseId()); + taskKnowledgeVo.setSplit(0); + taskKnowledgeVo.setCreateBy(SecurityUtils.getLoginUser().getUserId()); + redisTemplate.opsForList().rightPush("group:task",taskKnowledgeVo); + return super.success(); + } + + /** + * 企业知识库问答修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_Q_AND_A_EDIT) + @Log(title = "企业知识库问答管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmQAndADto qAndA) { + return super.edit(qAndA); + } + + /** + * 企业知识库问答修改状态 + */ + @Override + @PutMapping("/status") + @RequiresPermissions(value = {Auth.DM_Q_AND_A_EDIT, Auth.DM_Q_AND_A_ES}, logical = Logical.OR) + @Log(title = "企业知识库问答管理", businessType = BusinessType.UPDATE_STATUS) + public AjaxResult editStatus(@RequestBody DmQAndADto qAndA) { + return super.editStatus(qAndA); + } + + /** + * 企业知识库问答批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_Q_AND_A_DEL) + @Log(title = "企业知识库问答管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取企业知识库问答选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 企业知识库问答管理 - 列表 */ + String DM_Q_AND_A_LIST = "digitalmans:questionanswers:list"; + /** 系统 - 企业知识库问答管理 - 详情 */ + String DM_Q_AND_A_SINGLE = "digitalmans:questionanswers:single"; + /** 系统 - 企业知识库问答管理 - 新增 */ + String DM_Q_AND_A_ADD = "digitalmans:questionanswers:add"; + /** 系统 - 企业知识库问答管理 - 修改 */ + String DM_Q_AND_A_EDIT = "digitalmans:questionanswers:edit"; + /** 系统 - 企业知识库问答管理 - 修改状态 */ + String DM_Q_AND_A_ES = "digitalmans:questionanswers:es"; + /** 系统 - 企业知识库问答管理 - 删除 */ + String DM_Q_AND_A_DEL = "digitalmans:questionanswers:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmQuestionsController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmQuestionsController.java new file mode 100644 index 00000000..28994ed3 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmQuestionsController.java @@ -0,0 +1,130 @@ +package com.xueyi.system.digitalmans.controller; + +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.security.annotation.Logical; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.security.utils.SecurityUtils; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.nlt.api.nlt.domain.vo.TaskKnowledgeVo; +import com.xueyi.system.digitalmans.domain.dto.DmQuestionsDto; +import com.xueyi.system.digitalmans.domain.query.DmQuestionsQuery; +import com.xueyi.system.digitalmans.service.IDmQuestionsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.List; + +/** + * 企业知识库问题管理 业务处理 + * + * @author yinruoxi + */ +@RestController +@RequestMapping("/questions") +public class DmQuestionsController extends BaseController { + + @Autowired + RedisTemplate redisTemplate; + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "企业知识库问题" ; + } + + /** + * 查询企业知识库问题列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_QUESTIONS_LIST) + public AjaxResult list(DmQuestionsQuery questions) { + return super.list(questions); + } + + /** + * 查询企业知识库问题详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_QUESTIONS_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 企业知识库问题新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_QUESTIONS_ADD) + @Log(title = "企业知识库问题管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmQuestionsDto questions) { + + return super.add(questions); + } + + /** + * 企业知识库问题修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_QUESTIONS_EDIT) + @Log(title = "企业知识库问题管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmQuestionsDto questions) { + return super.edit(questions); + } + + /** + * 企业知识库问题修改状态 + */ + @Override + @PutMapping("/status") + @RequiresPermissions(value = {Auth.DM_QUESTIONS_EDIT, Auth.DM_QUESTIONS_ES}, logical = Logical.OR) + @Log(title = "企业知识库问题管理", businessType = BusinessType.UPDATE_STATUS) + public AjaxResult editStatus(@RequestBody DmQuestionsDto questions) { + return super.editStatus(questions); + } + + /** + * 企业知识库问题批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_QUESTIONS_DEL) + @Log(title = "企业知识库问题管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取企业知识库问题选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 企业知识库问题管理 - 列表 */ + String DM_QUESTIONS_LIST = "digitalmans:questions:list"; + /** 系统 - 企业知识库问题管理 - 详情 */ + String DM_QUESTIONS_SINGLE = "digitalmans:questions:single"; + /** 系统 - 企业知识库问题管理 - 新增 */ + String DM_QUESTIONS_ADD = "digitalmans:questions:add"; + /** 系统 - 企业知识库问题管理 - 修改 */ + String DM_QUESTIONS_EDIT = "digitalmans:questions:edit"; + /** 系统 - 企业知识库问题管理 - 修改状态 */ + String DM_QUESTIONS_ES = "digitalmans:questions:es"; + /** 系统 - 企业知识库问题管理 - 删除 */ + String DM_QUESTIONS_DEL = "digitalmans:questions:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmReceptionController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmReceptionController.java new file mode 100644 index 00000000..dae825f9 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmReceptionController.java @@ -0,0 +1,145 @@ +package com.xueyi.system.digitalmans.controller; + +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.result.R; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.security.annotation.Logical; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.system.api.digitalmans.domain.vo.DmReceptionVo; +import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; +import com.xueyi.system.digitalmans.domain.dto.DmReceptionDto; +import com.xueyi.system.digitalmans.domain.query.DmDigitalmanQuery; +import com.xueyi.system.digitalmans.domain.query.DmReceptionQuery; +import com.xueyi.system.digitalmans.service.IDmDigitalmanService; +import com.xueyi.system.digitalmans.service.IDmReceptionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.List; + +/** + * 接待模式管理管理 业务处理 + * + * @author yinruoxi + */ +@RestController +@RequestMapping("/reception") +public class DmReceptionController extends BaseController { + + @Autowired + private IDmDigitalmanService digitalmanService; + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "接待模式管理" ; + } + + + @GetMapping("/inner/get_reception_task") + public R getReceptionTaskInner(@RequestParam("manCode") String manCode) { + DmDigitalmanQuery query = new DmDigitalmanQuery(); + query.setManCode(manCode); + List manList = digitalmanService.selectList(query); + DmReceptionVo res = baseService.selectReceptionTask(manList.get(0).getId()); + if (res == null) { + return R.fail("未查询到接待模式"); + } + return R.ok(res); + } + + /** + * 查询接待模式管理列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_RECEPTION_LIST) + public AjaxResult list(DmReceptionQuery reception) { + return super.list(reception); + } + + /** + * 查询接待模式管理详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_RECEPTION_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 接待模式管理新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_RECEPTION_ADD) + @Log(title = "接待模式管理管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmReceptionDto reception) { + return super.add(reception); + } + + /** + * 接待模式管理修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_RECEPTION_EDIT) + @Log(title = "接待模式管理管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmReceptionDto reception) { + return super.edit(reception); + } + + + /** + * 接待模式管理修改状态 + */ + @Override + @PutMapping("/status") + @RequiresPermissions(value = {Auth.DM_RECEPTION_EDIT, Auth.DM_RECEPTION_ES}, logical = Logical.OR) + @Log(title = "接待模式管理管理", businessType = BusinessType.UPDATE_STATUS) + public AjaxResult editStatus(@RequestBody DmReceptionDto reception) { + return super.editStatus(reception); + } + + /** + * 接待模式管理批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_RECEPTION_DEL) + @Log(title = "接待模式管理管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取接待模式管理选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 接待模式管理管理 - 列表 */ + String DM_RECEPTION_LIST = "digitalmans:reception:list"; + /** 系统 - 接待模式管理管理 - 详情 */ + String DM_RECEPTION_SINGLE = "digitalmans:reception:single"; + /** 系统 - 接待模式管理管理 - 新增 */ + String DM_RECEPTION_ADD = "digitalmans:reception:add"; + /** 系统 - 接待模式管理管理 - 修改 */ + String DM_RECEPTION_EDIT = "digitalmans:reception:edit"; + /** 系统 - 接待模式管理管理 - 修改状态 */ + String DM_RECEPTION_ES = "digitalmans:reception:es"; + /** 系统 - 接待模式管理管理 - 删除 */ + String DM_RECEPTION_DEL = "digitalmans:reception:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmSkillController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmSkillController.java index 9a34a824..91061652 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmSkillController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/controller/DmSkillController.java @@ -1,6 +1,7 @@ package com.xueyi.system.digitalmans.controller; import com.xueyi.common.core.context.SecurityContextHolder; +import com.xueyi.common.core.utils.core.StrUtil; import com.xueyi.common.core.web.result.AjaxResult; import com.xueyi.common.core.web.result.R; import com.xueyi.common.core.web.validate.V_A; @@ -10,20 +11,34 @@ import com.xueyi.common.log.enums.BusinessType; import com.xueyi.common.security.annotation.InnerAuth; import com.xueyi.common.security.annotation.RequiresPermissions; import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.modules.auth.api.domain.vo.IntentionReqDto; +import com.xueyi.system.api.digitalmans.domain.dto.DmSkillDto; +import com.xueyi.system.api.digitalmans.domain.po.DmSkillPo; +import com.xueyi.system.api.staff.domain.po.DmStaffPo; import com.xueyi.system.digitalmans.domain.dto.DmCustomMadeDto; import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanExtDto; -import com.xueyi.system.api.digitalmans.domain.dto.DmSkillDto; import com.xueyi.system.digitalmans.domain.query.DmDigitalmanExtQuery; import com.xueyi.system.digitalmans.domain.query.DmDigitalmanQuery; import com.xueyi.system.digitalmans.domain.query.DmSkillQuery; import com.xueyi.system.digitalmans.service.IDmDigitalmanExtService; import com.xueyi.system.digitalmans.service.IDmDigitalmanService; import com.xueyi.system.digitalmans.service.IDmSkillService; +import com.xueyi.system.staff.mapper.DmStaffMapper; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - +import org.springframework.web.bind.annotation.DeleteMapping; +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.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; import java.io.Serializable; import java.util.List; @@ -84,6 +99,37 @@ public class DmSkillController extends BaseController resourceList; + + private List objList; + + private String userName; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmInitSkillsDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmInitSkillsDto.java new file mode 100644 index 00000000..a0bf7606 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmInitSkillsDto.java @@ -0,0 +1,30 @@ +package com.xueyi.system.digitalmans.domain.dto; + +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.system.digitalmans.domain.po.DmInitSkillsPo; +import com.xueyi.system.resource.domain.dto.DmResourcesDto; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Skill_Action_GROUP; + +/** + * 技能管理 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmInitSkillsDto extends DmInitSkillsPo { + + @Serial + private static final long serialVersionUID = 1L; + + /** 模块信息 */ + @Correlation(groupName = Skill_Action_GROUP, keyType = OperateConstants.SubKeyType.RECEIVE) + private DmActionDto actionDto; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQAndADto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQAndADto.java new file mode 100644 index 00000000..80fc5ae2 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQAndADto.java @@ -0,0 +1,25 @@ +package com.xueyi.system.digitalmans.domain.dto; + +import com.xueyi.system.digitalmans.domain.po.DmQAndAPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 企业知识库问答 数据传输对象 + * + * @author yinruoxi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmQAndADto extends DmQAndAPo { + + @Serial + private static final long serialVersionUID = 1L; + + private String metaText; + + private String creator; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQuestionsDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQuestionsDto.java new file mode 100644 index 00000000..3427a5ae --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmQuestionsDto.java @@ -0,0 +1,28 @@ +package com.xueyi.system.digitalmans.domain.dto; + +import com.xueyi.system.digitalmans.domain.po.DmQuestionsPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 企业知识库问题 数据传输对象 + * + * @author yinruoxi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmQuestionsDto extends DmQuestionsPo { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 创建人id + */ + private String creator; + + private Long count; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmReceptionDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmReceptionDto.java new file mode 100644 index 00000000..9b23f5f4 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/dto/DmReceptionDto.java @@ -0,0 +1,37 @@ +package com.xueyi.system.digitalmans.domain.dto; + +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.system.api.digitalmans.domain.dto.DmVisitorsDto; +import com.xueyi.system.api.staff.domain.dto.DmStaffDto; +import com.xueyi.system.digitalmans.domain.po.DmReceptionPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.List; + +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Reception_DmReceptionVisitorMerge_GROUP; +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Reception_Staff_GROUP; + +/** + * 接待模式管理 数据传输对象 + * + * @author yinruoxi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmReceptionDto extends DmReceptionPo { + + @Serial + private static final long serialVersionUID = 1L; + + @Correlation(groupName = Reception_Staff_GROUP, keyType = OperateConstants.SubKeyType.RECEIVE) + private DmStaffDto head; + + @Correlation(groupName = Reception_DmReceptionVisitorMerge_GROUP, keyType = OperateConstants.SubKeyType.RECEIVE) + private List visitors; + + // 属性值变量 + private Long [][] priorities; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/DmBroadcastResourceMerge.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/DmBroadcastResourceMerge.java new file mode 100644 index 00000000..869c66a3 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/DmBroadcastResourceMerge.java @@ -0,0 +1,55 @@ +package com.xueyi.system.digitalmans.domain.merge; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.annotation.Correlations; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.web.tenant.base.TBasisEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Broadcast_DmBroadcastResource_GROUP; +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Resource_DmBroadcastResource_GROUP; + +/** + * 播报资源关联 持久化对象 + * + * @author xueyi + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("dm_broadcast_resource_merge") +public class DmBroadcastResourceMerge extends TBasisEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** 播报任务id */ + @Correlations({ + @Correlation(groupName = Broadcast_DmBroadcastResource_GROUP, keyType = OperateConstants.SubKeyType.MERGE_MAIN), + @Correlation(groupName = Resource_DmBroadcastResource_GROUP, keyType = OperateConstants.SubKeyType.MERGE_SLAVE) + }) + protected Long broadcastId; + + ; + + /** 资源id */ + @Correlations({ + @Correlation(groupName = Broadcast_DmBroadcastResource_GROUP, keyType = OperateConstants.SubKeyType.MERGE_MAIN), + @Correlation(groupName = Resource_DmBroadcastResource_GROUP, keyType = OperateConstants.SubKeyType.MERGE_SLAVE) + }) + protected Long resourceId; + + + protected String ttsText; + + public DmBroadcastResourceMerge(Long broadcastId, Long resourceId) { + this.broadcastId = broadcastId; + this.resourceId = resourceId; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/DmReceptionStaffMerge.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/DmReceptionStaffMerge.java new file mode 100644 index 00000000..a76222ce --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/DmReceptionStaffMerge.java @@ -0,0 +1,43 @@ +package com.xueyi.system.digitalmans.domain.merge; + +import com.baomidou.mybatisplus.annotation.*; +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.annotation.Correlations; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.web.tenant.base.TBasisEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +/** + * 接待任务与负责人联表 持久化对象 + * + * @author xueyi + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("dm_reception_staff_merge") +public class DmReceptionStaffMerge extends TBasisEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** 招待id */ + @Correlations({ + @Correlation(groupName = "dm_reception_staff_merge", keyType = OperateConstants.SubKeyType.MERGE_SLAVE), + @Correlation(groupName = "dm_reception_staff_merge", keyType = OperateConstants.SubKeyType.MERGE_MAIN) + }) + protected Long receptionId; + + /** 内部人员id */ + @Correlations({ + @Correlation(groupName = "dm_reception_staff_merge", keyType = OperateConstants.SubKeyType.MERGE_SLAVE), + @Correlation(groupName = "dm_reception_staff_merge", keyType = OperateConstants.SubKeyType.MERGE_MAIN) + }) + protected Long staffId; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/DmReceptionVisitorMerge.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/DmReceptionVisitorMerge.java new file mode 100644 index 00000000..f4a448c6 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/DmReceptionVisitorMerge.java @@ -0,0 +1,56 @@ +package com.xueyi.system.digitalmans.domain.merge; + +import com.baomidou.mybatisplus.annotation.*; +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.annotation.Correlations; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.web.tenant.base.TBasisEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.io.Serial; + +import static com.xueyi.system.api.organize.domain.merge.MergeGroup.POST_SysUserPostMerge_GROUP; +import static com.xueyi.system.api.organize.domain.merge.MergeGroup.USER_SysUserPostMerge_GROUP; +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Reception_DmReceptionVisitorMerge_GROUP; +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Visitor_DmReceptionVisitorMerge_GROUP; + +/** + * 任务访客关联 持久化对象 + * + * @author xueyi + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("dm_reception_visitor_merge") +public class DmReceptionVisitorMerge extends TBasisEntity { + + @Serial + private static final long serialVersionUID = 1L; + + + /** 招待任务id */ + @Correlations({ + @Correlation(groupName = Reception_DmReceptionVisitorMerge_GROUP, keyType = OperateConstants.SubKeyType.MERGE_MAIN), + @Correlation(groupName = Visitor_DmReceptionVisitorMerge_GROUP, keyType = OperateConstants.SubKeyType.MERGE_SLAVE) + }) + protected Long receptionId; + + /** 访客id */ + @Correlations({ + @Correlation(groupName = Visitor_DmReceptionVisitorMerge_GROUP, keyType = OperateConstants.SubKeyType.MERGE_MAIN), + @Correlation(groupName = Reception_DmReceptionVisitorMerge_GROUP, keyType = OperateConstants.SubKeyType.MERGE_SLAVE) + }) + protected Long visitorId; + + /** 优先级 */ + protected Integer priority; + + public DmReceptionVisitorMerge(Long receptionId, Long visitorId, Integer priority) { + this.receptionId = receptionId; + this.visitorId = visitorId; + this.priority = priority; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/MergeGroup.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/MergeGroup.java new file mode 100644 index 00000000..5a78d32d --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/merge/MergeGroup.java @@ -0,0 +1,15 @@ +package com.xueyi.system.digitalmans.domain.merge; + +public interface MergeGroup { + + /** 设备日志关联 -》 日志 */ + String Action_Resource_GROUP = "Action_Resource_GROUP"; + String Skill_Action_GROUP = "Skill_Action_GROUP"; + + String Reception_Staff_GROUP = "Reception_Staff_GROUP"; + String Reception_DmReceptionVisitorMerge_GROUP = "Reception_DmReceptionVisitorMerge_GROUP"; + String Visitor_DmReceptionVisitorMerge_GROUP = "Visitor_DmReceptionVisitorMerge_GROUP"; + String Broadcast_DmBroadcastResource_GROUP = "Broadcast_DmBroadcastResource_GROUP"; + String Resource_DmBroadcastResource_GROUP = "Resource_DmBroadcastResource_GROUP"; + +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmActionConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmActionConverter.java new file mode 100644 index 00000000..ce131a69 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmActionConverter.java @@ -0,0 +1,18 @@ +package com.xueyi.system.digitalmans.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.digitalmans.domain.dto.DmActionDto; +import com.xueyi.system.digitalmans.domain.po.DmActionPo; +import com.xueyi.system.digitalmans.domain.query.DmActionQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 动作管理 + 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmActionConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmBroadcastConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmBroadcastConverter.java new file mode 100644 index 00000000..c765200a --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmBroadcastConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.digitalmans.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.digitalmans.domain.dto.DmBroadcastDto; +import com.xueyi.system.digitalmans.domain.po.DmBroadcastPo; +import com.xueyi.system.digitalmans.domain.query.DmBroadcastQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 播报 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmBroadcastConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmInitSkillsConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmInitSkillsConverter.java new file mode 100644 index 00000000..f5638d34 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmInitSkillsConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.digitalmans.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.digitalmans.domain.dto.DmInitSkillsDto; +import com.xueyi.system.digitalmans.domain.po.DmInitSkillsPo; +import com.xueyi.system.digitalmans.domain.query.DmInitSkillsQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 技能管理 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmInitSkillsConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmQAndAConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmQAndAConverter.java new file mode 100644 index 00000000..81480ff4 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmQAndAConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.digitalmans.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.digitalmans.domain.dto.DmQAndADto; +import com.xueyi.system.digitalmans.domain.po.DmQAndAPo; +import com.xueyi.system.digitalmans.domain.query.DmQAndAQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 企业知识库问答 对象映射器 + * + * @author yinruoxi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmQAndAConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmQuestionsConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmQuestionsConverter.java new file mode 100644 index 00000000..71ae81af --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmQuestionsConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.digitalmans.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.digitalmans.domain.dto.DmQuestionsDto; +import com.xueyi.system.digitalmans.domain.po.DmQuestionsPo; +import com.xueyi.system.digitalmans.domain.query.DmQuestionsQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 企业知识库问题 对象映射器 + * + * @author yinruoxi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmQuestionsConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmReceptionConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmReceptionConverter.java new file mode 100644 index 00000000..a649077c --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/model/DmReceptionConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.digitalmans.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.digitalmans.domain.dto.DmReceptionDto; +import com.xueyi.system.digitalmans.domain.po.DmReceptionPo; +import com.xueyi.system.digitalmans.domain.query.DmReceptionQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 接待模式管理 对象映射器 + * + * @author yinruoxi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmReceptionConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmActionPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmActionPo.java new file mode 100644 index 00000000..6e92cc6e --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmActionPo.java @@ -0,0 +1,49 @@ +package com.xueyi.system.digitalmans.domain.po; + +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.annotation.Correlations; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.web.entity.base.BaseEntity; +import com.xueyi.system.digitalmans.domain.dto.DmActionDto; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.io.Serial; + +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Action_Resource_GROUP; + + +/** + * 动作管理 + 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("dm_action") +public class DmActionPo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 备注 */ + @Excel(name = "备注") + protected String remark; + + /** 供应商 */ + @Excel(name = "供应商") + protected String supplier; + + /** 图片id */ + @NotNull(message = "resourceId不能为空") + @Correlations({ + @Correlation(groupName = Action_Resource_GROUP, keyType = OperateConstants.SubKeyType.MAIN) + }) + @Excel(name = "图片id") + protected Long resourceId; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmBroadcastPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmBroadcastPo.java new file mode 100644 index 00000000..bb3b8ad9 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmBroadcastPo.java @@ -0,0 +1,45 @@ +package com.xueyi.system.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 lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +import static com.xueyi.common.core.constant.basic.EntityConstants.SORT; +import static com.xueyi.common.core.constant.basic.EntityConstants.REMARK; + +/** + * 播报 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_broadcast", excludeProperty = { SORT, REMARK }) +public class DmBroadcastPo extends TBaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 使用状态 */ + @Excel(name = "使用状态") + protected String status; + + /** 资源类型 */ + @Excel(name = "资源类型") + protected Integer type; + + /** 循环播报(0:不循环;1:循环) */ + @Excel(name = "循环播报", readConverterExp = "0=:不循环;1:循环") + protected Integer recycle; + + /** 语速(0:不播报;1:缓慢;2:默认;3:快速) */ + @Excel(name = "语速", readConverterExp = "0=:不播报;1:缓慢;2:默认;3:快速") + protected Integer speed; + + protected Long manId; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmInitSkillsPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmInitSkillsPo.java new file mode 100644 index 00000000..3f89d0bc --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmInitSkillsPo.java @@ -0,0 +1,60 @@ +package com.xueyi.system.digitalmans.domain.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.annotation.Correlations; +import com.xueyi.common.core.annotation.Excel; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.web.entity.base.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +import static com.xueyi.common.core.constant.basic.EntityConstants.REMARK; +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Skill_Action_GROUP; + +/** + * 技能管理 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_init_skills", excludeProperty = { REMARK }) +public class DmInitSkillsPo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 技能code */ + @Excel(name = "技能code") + protected String skillCode; + + /** 技能描述 */ + @Excel(name = "技能描述") + protected String info; + + /** 数字人回复 */ + @Excel(name = "数字人回复") + protected String resp; + + @Correlations({ + @Correlation(groupName = Skill_Action_GROUP, keyType = OperateConstants.SubKeyType.MAIN) + }) + /** 数字人动作 */ + @Excel(name = "数字人动作") + protected Long motionId; + + /** 动作名称 */ + @Excel(name = "动作名称") + protected String motionName; + + + /** 执行动作 */ + @Excel(name = "执行动作") + protected String executeAction; + + protected String auth; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmQAndAPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmQAndAPo.java new file mode 100644 index 00000000..5208548a --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmQAndAPo.java @@ -0,0 +1,48 @@ +package com.xueyi.system.digitalmans.domain.po; + +import com.xueyi.common.core.web.tenant.base.TBaseEntity; +import com.xueyi.system.digitalmans.domain.dto.DmQAndADto; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +import static com.xueyi.common.core.constant.basic.EntityConstants.SORT; +import static com.xueyi.common.core.constant.basic.EntityConstants.REMARK; + +/** + * 企业知识库问答 持久化对象 + * + * @author yinruoxi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_q_and_a", excludeProperty = { SORT, REMARK }) +public class DmQAndAPo extends TBaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 数字人ID */ + @Excel(name = "数字人ID") + protected Long manId; + + /** 问题种类 */ + @Excel(name = "问题种类") + protected Integer type; + + /** 问题ID */ + @Excel(name = "问题ID") + protected Long knowledgeId; + + /** 回答 */ + @Excel(name = "回答") + protected String answer; + + /** 状态(0:正常;1:停用) */ + @Excel(name = "状态(0:正常;1:停用)") + protected String status; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmQuestionsPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmQuestionsPo.java new file mode 100644 index 00000000..81d34814 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmQuestionsPo.java @@ -0,0 +1,48 @@ +package com.xueyi.system.digitalmans.domain.po; + +import com.xueyi.common.core.web.tenant.base.TBaseEntity; +import com.xueyi.system.digitalmans.domain.dto.DmQuestionsDto; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +import static com.xueyi.common.core.constant.basic.EntityConstants.SORT; + +/** + * 企业知识库问题 持久化对象 + * + * @author yinruoxi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_questions", excludeProperty = { SORT }) +public class DmQuestionsPo extends TBaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 知识种类 */ + @Excel(name = "知识种类") + protected Integer type; + + /** 问题code */ + @Excel(name = "问题code") + protected String questionCode; + + /** 分析状态(0:问题生成中;1:完成) */ + @Excel(name = "分析状态(0:问题生成中;1:完成)") + protected String analysisStatus; + + /** 备注 */ + @Excel(name = "备注") + protected String remark; + + /** 数字人id */ + @Excel(name = "数字人id") + protected Long manId; + + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmReceptionPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmReceptionPo.java new file mode 100644 index 00000000..e6d26819 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/po/DmReceptionPo.java @@ -0,0 +1,62 @@ +package com.xueyi.system.digitalmans.domain.po; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.annotation.Correlations; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.web.tenant.base.TBaseEntity; +import com.xueyi.system.digitalmans.domain.dto.DmReceptionDto; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +import static com.xueyi.common.core.constant.basic.EntityConstants.REMARK; +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Reception_Staff_GROUP; + +/** + * 接待模式管理 持久化对象 + * + * @author yinruoxi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_reception", excludeProperty = { REMARK }) +public class DmReceptionPo extends TBaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 负责人 */ + @Excel(name = "负责人") + protected String headName; + + /** 负责人id */ + @Excel(name = "负责人") + @Correlations({ + @Correlation(groupName = Reception_Staff_GROUP, keyType = OperateConstants.SubKeyType.MAIN) + }) + protected Long headId; + + /** 接待日期 */ + @Excel(name = "接待日期") + protected Date receptionTime; + + /** 触发状态 */ + @Excel(name = "触发状态") + protected String status; + + /** 开场白 */ + @Excel(name = "开场白") + protected String welcome; + + /** 数字人id */ + @Excel(name = "数字人id") + protected Long manId; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmActionQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmActionQuery.java new file mode 100644 index 00000000..0eeb8a9e --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmActionQuery.java @@ -0,0 +1,21 @@ +package com.xueyi.system.digitalmans.domain.query; + +import com.xueyi.system.digitalmans.domain.po.DmActionPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 动作管理 + 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmActionQuery extends DmActionPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmBroadcastQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmBroadcastQuery.java new file mode 100644 index 00000000..39a93d0b --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmBroadcastQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.digitalmans.domain.query; + +import com.xueyi.system.digitalmans.domain.po.DmBroadcastPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 播报 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmBroadcastQuery extends DmBroadcastPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmInitSkillsQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmInitSkillsQuery.java new file mode 100644 index 00000000..d919046e --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmInitSkillsQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.digitalmans.domain.query; + +import com.xueyi.system.digitalmans.domain.po.DmInitSkillsPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 技能管理 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmInitSkillsQuery extends DmInitSkillsPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmQAndAQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmQAndAQuery.java new file mode 100644 index 00000000..f7d5b45b --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmQAndAQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.digitalmans.domain.query; + +import com.xueyi.system.digitalmans.domain.po.DmQAndAPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 企业知识库问答 数据查询对象 + * + * @author yinruoxi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmQAndAQuery extends DmQAndAPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmQuestionsQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmQuestionsQuery.java new file mode 100644 index 00000000..de2a25f3 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmQuestionsQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.digitalmans.domain.query; + +import com.xueyi.system.digitalmans.domain.po.DmQuestionsPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 企业知识库问题 数据查询对象 + * + * @author yinruoxi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmQuestionsQuery extends DmQuestionsPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmReceptionQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmReceptionQuery.java new file mode 100644 index 00000000..2baaead0 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/domain/query/DmReceptionQuery.java @@ -0,0 +1,23 @@ +package com.xueyi.system.digitalmans.domain.query; + +import com.xueyi.system.digitalmans.domain.po.DmReceptionPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 接待模式管理 数据查询对象 + * + * @author yinruoxi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmReceptionQuery extends DmReceptionPo { + + @Serial + private static final long serialVersionUID = 1L; + + protected String taskTime; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmActionManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmActionManager.java new file mode 100644 index 00000000..417bd10b --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmActionManager.java @@ -0,0 +1,14 @@ +package com.xueyi.system.digitalmans.manager; + +import com.xueyi.system.digitalmans.domain.dto.DmActionDto; +import com.xueyi.system.digitalmans.domain.query.DmActionQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * 动作管理 +管理 数据封装层 + * + * @author xueyi + */ +public interface IDmActionManager extends IBaseManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmBroadcastManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmBroadcastManager.java new file mode 100644 index 00000000..51ef8258 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmBroadcastManager.java @@ -0,0 +1,23 @@ +package com.xueyi.system.digitalmans.manager; + +import com.xueyi.common.web.entity.manager.IBaseManager; +import com.xueyi.system.digitalmans.domain.dto.DmBroadcastDto; +import com.xueyi.system.digitalmans.domain.merge.DmBroadcastResourceMerge; +import com.xueyi.system.digitalmans.domain.query.DmBroadcastQuery; + +import java.util.List; + +/** + * 播报管理 数据封装层 + * + * @author xueyi + */ +public interface IDmBroadcastManager extends IBaseManager { + + void addBroadcastResourceMerge(Long broadcastId, List merges); + + void editBroadcastResourceMerge(Long broadcastId, List merges); + + List selectBroadcastResourceMerge(Long broadcastId); + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmInitSkillsManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmInitSkillsManager.java new file mode 100644 index 00000000..d6d51c60 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmInitSkillsManager.java @@ -0,0 +1,13 @@ +package com.xueyi.system.digitalmans.manager; + +import com.xueyi.system.digitalmans.domain.dto.DmInitSkillsDto; +import com.xueyi.system.digitalmans.domain.query.DmInitSkillsQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * 技能管理管理 数据封装层 + * + * @author xueyi + */ +public interface IDmInitSkillsManager extends IBaseManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmManDeviceManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmManDeviceManager.java index be2e24ef..d11b2b71 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmManDeviceManager.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmManDeviceManager.java @@ -18,4 +18,5 @@ public interface IDmManDeviceManager extends IBaseManager selectListByManual(DmManDeviceQuery query); + List selectManDeviceListNotNullByTenantId(Long tenantId); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmQAndAManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmQAndAManager.java new file mode 100644 index 00000000..10f696a3 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmQAndAManager.java @@ -0,0 +1,13 @@ +package com.xueyi.system.digitalmans.manager; + +import com.xueyi.system.digitalmans.domain.dto.DmQAndADto; +import com.xueyi.system.digitalmans.domain.query.DmQAndAQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * 企业知识库问答管理 数据封装层 + * + * @author yinruoxi + */ +public interface IDmQAndAManager extends IBaseManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmQuestionsManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmQuestionsManager.java new file mode 100644 index 00000000..a38f3f32 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmQuestionsManager.java @@ -0,0 +1,13 @@ +package com.xueyi.system.digitalmans.manager; + +import com.xueyi.system.digitalmans.domain.dto.DmQuestionsDto; +import com.xueyi.system.digitalmans.domain.query.DmQuestionsQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * 企业知识库问题管理 数据封装层 + * + * @author yinruoxi + */ +public interface IDmQuestionsManager extends IBaseManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmReceptionManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmReceptionManager.java new file mode 100644 index 00000000..76182ddc --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/IDmReceptionManager.java @@ -0,0 +1,24 @@ +package com.xueyi.system.digitalmans.manager; + +import com.xueyi.system.digitalmans.domain.dto.DmReceptionDto; +import com.xueyi.system.digitalmans.domain.merge.DmReceptionVisitorMerge; +import com.xueyi.system.digitalmans.domain.query.DmReceptionQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +import java.util.List; + +/** + * 接待模式管理管理 数据封装层 + * + * @author yinruoxi + */ +public interface IDmReceptionManager extends IBaseManager { + + void addDeceptionVisitorMerge(Long receptionId, Long[][] visitorIds); + + void editReceptionVisitorMerge(Long receptionId, Long[][] visitorIds); + + List selectDeceptionVisitorMerge(Long receptionId); + + List selectReceptionTaskOpenStatus(); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmActionManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmActionManager.java new file mode 100644 index 00000000..2708b1f7 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmActionManager.java @@ -0,0 +1,38 @@ +package com.xueyi.system.digitalmans.manager.impl; + +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.web.entity.domain.SlaveRelation; +import com.xueyi.system.digitalmans.domain.po.DmActionPo; +import com.xueyi.system.digitalmans.domain.dto.DmActionDto; +import com.xueyi.system.digitalmans.domain.query.DmActionQuery; +import com.xueyi.system.digitalmans.domain.model.DmActionConverter; +import com.xueyi.system.digitalmans.mapper.DmActionMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.digitalmans.manager.IDmActionManager; +import com.xueyi.system.resource.manager.impl.DmResourcesManager; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Action_Resource_GROUP; + +/** + * 动作管理 +管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmActionManager extends BaseManagerImpl implements IDmActionManager { + + @Override + protected List subRelationInit() { + List result = new ArrayList(); + result.add(new SlaveRelation(Action_Resource_GROUP, DmResourcesManager.class, OperateConstants.SubOperateLimit.ONLY_SEL)); + return result; + } +} + + + diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmBroadcastManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmBroadcastManager.java new file mode 100644 index 00000000..8fcd0803 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmBroadcastManager.java @@ -0,0 +1,83 @@ +package com.xueyi.system.digitalmans.manager.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.digitalmans.domain.dto.DmBroadcastDto; +import com.xueyi.system.digitalmans.domain.merge.DmBroadcastResourceMerge; +import com.xueyi.system.digitalmans.domain.model.DmBroadcastConverter; +import com.xueyi.system.digitalmans.domain.po.DmBroadcastPo; +import com.xueyi.system.digitalmans.domain.query.DmBroadcastQuery; +import com.xueyi.system.digitalmans.manager.IDmBroadcastManager; +import com.xueyi.system.digitalmans.mapper.DmBroadcastMapper; +import com.xueyi.system.digitalmans.mapper.merge.DmBroadcastResourceMergeMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 播报管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmBroadcastManager extends BaseManagerImpl implements IDmBroadcastManager { + @Autowired + private DmBroadcastResourceMergeMapper broadcastResourceMergeMapper; + + + @Override + public void addBroadcastResourceMerge(Long broadcastId, List merges) { + List broadcastResourceMerges = new ArrayList(); + if (merges != null && merges.size() > 0) { + for (DmBroadcastResourceMerge merge : merges) { + merge.setBroadcastId(broadcastId); + broadcastResourceMerges.add(merge); + } + } + + if (broadcastResourceMerges.size() > 0) { + broadcastResourceMergeMapper.insertBatch(broadcastResourceMerges); + } + } + + @Override + public void editBroadcastResourceMerge(Long broadcastId, List merges) { + List broadcastResourceMerges = new ArrayList(); + List mergeDtos = selectBroadcastResourceMerge(broadcastId); + if (merges != null && merges.size() > 0) { + for (DmBroadcastResourceMerge merge : merges) { + merge.setBroadcastId(broadcastId); + broadcastResourceMerges.add(merge); + } + } + List idList = mergeDtos.stream() + .map(DmBroadcastResourceMerge::getId) + .collect(Collectors.toList()); + List newList = broadcastResourceMerges.stream() + .map(DmBroadcastResourceMerge::getId) + .collect(Collectors.toList()); + + + idList.removeAll(newList); + if (idList.size() > 0) { + broadcastResourceMergeMapper.deleteBatchIds(idList); + } + + if (broadcastResourceMerges.size() > 0) { + broadcastResourceMergeMapper.updateBatch(broadcastResourceMerges); + } + } + + @Override + public List selectBroadcastResourceMerge(Long broadcastId) { + List merges = broadcastResourceMergeMapper.selectList(Wrappers.query().lambda() + .eq(DmBroadcastResourceMerge::getBroadcastId, broadcastId) + .orderByAsc(DmBroadcastResourceMerge::getId)); + + return merges; + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmDigitalmanManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmDigitalmanManager.java index fa011deb..99e0fcc7 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmDigitalmanManager.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmDigitalmanManager.java @@ -5,23 +5,26 @@ import com.xueyi.common.core.constant.basic.SqlConstants; import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; import com.xueyi.system.api.digitalmans.domain.dto.DmDigitalmanWorktimeDto; import com.xueyi.system.api.digitalmans.domain.dto.DmSyncDigitalmanDto; -import com.xueyi.system.api.resource.domain.po.DmResourcesPo; -import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanExtDto; -import com.xueyi.system.digitalmans.domain.model.DmDigitalmanWorktimeConverter; import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanExtPo; import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanPo; -import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; import com.xueyi.system.api.digitalmans.domain.po.DmModelPo; -import com.xueyi.system.digitalmans.domain.query.DmDigitalmanQuery; +import com.xueyi.system.api.organize.domain.vo.SysDeptExt; +import com.xueyi.system.api.resource.domain.po.DmResourcesPo; +import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; import com.xueyi.system.digitalmans.domain.model.DmDigitalmanConverter; -import com.xueyi.system.digitalmans.mapper.*; +import com.xueyi.system.digitalmans.domain.model.DmDigitalmanWorktimeConverter; +import com.xueyi.system.digitalmans.domain.query.DmDigitalmanQuery; import com.xueyi.system.digitalmans.manager.IDmDigitalmanManager; +import com.xueyi.system.digitalmans.mapper.DmDigitalmanExtMapper; +import com.xueyi.system.digitalmans.mapper.DmDigitalmanMapper; +import com.xueyi.system.digitalmans.mapper.DmDigitalmanWorktimeMapper; +import com.xueyi.system.digitalmans.mapper.DmModelMapper; +import com.xueyi.system.organize.mapper.SysDeptExtMapper; import com.xueyi.system.resource.mapper.DmResourcesMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.Serializable; -import java.util.List; /** * 数字人基础管理 数据封装层处理 @@ -39,6 +42,9 @@ public class DmDigitalmanManager extends BaseManagerImpl implements IDmInitSkillsManager { + + @Override + protected List subRelationInit() { + List result = new ArrayList(); + result.add(new SlaveRelation(Skill_Action_GROUP, DmActionManager.class, OperateConstants.SubOperateLimit.ONLY_SEL)); + return result; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmManDeviceManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmManDeviceManager.java index 1f77ae2f..6ae55847 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmManDeviceManager.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmManDeviceManager.java @@ -51,4 +51,9 @@ public class DmManDeviceManager extends BaseManagerImpl selectListByManual(DmManDeviceQuery query) { return mapperDto(manDeviceMapper.selectListByManual(query)); } + + @Override + public List selectManDeviceListNotNullByTenantId(Long tenantId) { + return mapperDto(manDeviceMapper.selectListByManualDeviceIdNotNullByTenantId(tenantId)); + } } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmModelManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmModelManager.java index 9b461663..b4602ce8 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmModelManager.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmModelManager.java @@ -12,7 +12,9 @@ import com.xueyi.system.digitalmans.mapper.DmModelMapper; import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; import com.xueyi.system.digitalmans.manager.IDmModelManager; import com.xueyi.system.api.resource.domain.po.DmResourcesPo; +import com.xueyi.system.resource.domain.po.DmBackgroundPo; import com.xueyi.system.resource.domain.po.DmScreenOffPo; +import com.xueyi.system.resource.mapper.DmBackgroundMapper; import com.xueyi.system.resource.mapper.DmResourcesMapper; import com.xueyi.system.resource.mapper.DmScreenOffMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -41,6 +43,9 @@ public class DmModelManager extends BaseManagerImpl backgroundPos = backgroundMapper.selectList(null); + List bResourcesPos = new ArrayList<>(); + backgroundPos.forEach(rpo->bResourcesPos.add(dmResourcesMapper.selectById(rpo.getResourceId()))); + modelDto.setRBackgrounds(bResourcesPos); + /** 新业务 需求变更,代码暂时保留 if (modelDto.getBackgroundContain() != null && modelDto.getBackgroundContain().length() > 0) { modelDto.setRBackgrounds(new ArrayList<>(modelDto.getBackgroundContain().split(",").length)); Arrays.asList(modelDto.getBackgroundContain().split(",")).forEach(bgItem-> { modelDto.getRBackgrounds().add(dmResourcesMapper.selectById(Long.parseLong(bgItem))); }); } + **/ // 获取模型页 modelDto.setModelUrl(dmResourcesMapper.selectById(modelDto.getCurrentModel()).getUrl()); // 获取展示页 diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmQAndAManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmQAndAManager.java new file mode 100644 index 00000000..60968c3e --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmQAndAManager.java @@ -0,0 +1,19 @@ +package com.xueyi.system.digitalmans.manager.impl; + +import com.xueyi.system.digitalmans.domain.po.DmQAndAPo; +import com.xueyi.system.digitalmans.domain.dto.DmQAndADto; +import com.xueyi.system.digitalmans.domain.query.DmQAndAQuery; +import com.xueyi.system.digitalmans.domain.model.DmQAndAConverter; +import com.xueyi.system.digitalmans.mapper.DmQAndAMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.digitalmans.manager.IDmQAndAManager; +import org.springframework.stereotype.Component; + +/** + * 企业知识库问答管理 数据封装层处理 + * + * @author yinruoxi + */ +@Component +public class DmQAndAManager extends BaseManagerImpl implements IDmQAndAManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmQuestionsManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmQuestionsManager.java new file mode 100644 index 00000000..7a182a7d --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmQuestionsManager.java @@ -0,0 +1,57 @@ +package com.xueyi.system.digitalmans.manager.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xueyi.system.digitalmans.domain.po.DmQAndAPo; +import com.xueyi.system.digitalmans.domain.po.DmQuestionsPo; +import com.xueyi.system.digitalmans.domain.dto.DmQuestionsDto; +import com.xueyi.system.digitalmans.domain.query.DmQuestionsQuery; +import com.xueyi.system.digitalmans.domain.model.DmQuestionsConverter; +import com.xueyi.system.digitalmans.mapper.DmQAndAMapper; +import com.xueyi.system.digitalmans.mapper.DmQuestionsMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.digitalmans.manager.IDmQuestionsManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * 企业知识库问题管理 数据封装层处理 + * + * @author yinruoxi + */ +@Component +public class DmQuestionsManager extends BaseManagerImpl implements IDmQuestionsManager { + @Autowired + DmQAndAMapper dmQAndAMapper; + + @Override + public List selectList(DmQuestionsQuery query) { + List dmQuestionsDtos = super.selectList(query); + dmQuestionsDtos.forEach(item->{ + item.setCount(dmQAndAMapper.selectCount(Wrappers.query().lambda().eq(DmQAndAPo::getKnowledgeId,item.getId()))); + }); + return dmQuestionsDtos; + } + + @Override + public int deleteByIds(Collection idList) { + // 根据知识库id删除对应问题集 + idList.forEach(item->{ + dmQAndAMapper.delete(Wrappers.query().lambda().eq(DmQAndAPo::getKnowledgeId,item)); + }); + return super.deleteByIds(idList); + } + + @Override + public int updateStatus(DmQuestionsDto dto) { + // 根据知识库id更新对应问题集状态 +// dmQAndAMapper.selectList(Wrappers.query().lambda().eq(DmQAndAPo::getKnowledgeId,dto.getId())).forEach(item->{ +// item.setStatus(dto.getStatus()); +// dmQAndAMapper.update(item); +// }; + return super.updateStatus(dto); + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmReceptionManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmReceptionManager.java new file mode 100644 index 00000000..84ce3566 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/manager/impl/DmReceptionManager.java @@ -0,0 +1,145 @@ +package com.xueyi.system.digitalmans.manager.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.utils.core.ArrayUtil; +import com.xueyi.common.core.utils.core.CollUtil; +import com.xueyi.common.web.entity.domain.SlaveRelation; +import com.xueyi.system.api.organize.domain.dto.SysDeptDto; +import com.xueyi.system.digitalmans.domain.merge.DmReceptionVisitorMerge; +import com.xueyi.system.digitalmans.domain.po.DmReceptionPo; +import com.xueyi.system.digitalmans.domain.dto.DmReceptionDto; +import com.xueyi.system.digitalmans.domain.query.DmReceptionQuery; +import com.xueyi.system.digitalmans.domain.model.DmReceptionConverter; +import com.xueyi.system.digitalmans.mapper.DmReceptionMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.digitalmans.manager.IDmReceptionManager; +import com.xueyi.system.digitalmans.mapper.merge.DmReceptionVisitorMergeMapper; +import com.xueyi.system.organize.domain.merge.SysRoleDeptMerge; +import com.xueyi.system.organize.domain.merge.SysRolePostMerge; +import com.xueyi.system.resource.manager.impl.DmResourcesManager; +import com.xueyi.system.staff.manager.impl.DmStaffManager; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Reception_DmReceptionVisitorMerge_GROUP; +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Reception_Staff_GROUP; + + + +/** + * 接待模式管理管理 数据封装层处理 + * + * @author yinruoxi + */ +@Component +public class DmReceptionManager extends BaseManagerImpl implements IDmReceptionManager { + + + @Autowired + private DmReceptionVisitorMergeMapper dmReceptionVisitorMergeMapper; + + @Override + protected List subRelationInit() { + List result = new ArrayList(); + result.add(new SlaveRelation(Reception_Staff_GROUP, DmStaffManager.class, OperateConstants.SubOperateLimit.ONLY_SEL)); + result.add(new SlaveRelation(Reception_DmReceptionVisitorMerge_GROUP, DmReceptionVisitorMergeMapper.class, DmReceptionVisitorMerge.class, OperateConstants.SubOperateLimit.ONLY_DEL)); + return result; + } + + + @Override + public int insert(DmReceptionDto dto) { + // 判断priorities的长度,如果长度为0,返回失败 + if (dto.getPriorities() == null || dto.getPriorities().length == 0) { + return 0; + } else { + int row = super.insert(dto); + if (row > 0) { + if (dto.getPriorities().length > 1) { + this.addDeceptionVisitorMerge(dto.getId(),dto.getPriorities()); + } + } + return row; + } + + } + + @Override + public void addDeceptionVisitorMerge(Long receptionId, Long[][] visitorIds) { + if (ArrayUtil.isNotEmpty(visitorIds)) { + List receptionVisitorMerges = new ArrayList(); + if (visitorIds == null) { + return; + } + for (int p = 1; p < visitorIds.length; p++) { + int priority = p; + List visitorList = new ArrayList<>(Arrays.asList(visitorIds[p])); + // 1.存储接待模式与访客的关联数据 + receptionVisitorMerges.addAll(visitorList.stream().filter(visitorId->visitorId!=null).map(visitorId -> new DmReceptionVisitorMerge(receptionId, visitorId, priority)) + .collect(Collectors.toList())); + } + // 2.在数据库插入接待模式与访客的关联数据 + if (receptionVisitorMerges.size() > 0) { + dmReceptionVisitorMergeMapper.insertBatch(receptionVisitorMerges); + } + + } + } + + @Override + public List selectDeceptionVisitorMerge(Long receptionId) { + + return dmReceptionVisitorMergeMapper.selectList(Wrappers. query().lambda() + .eq(DmReceptionVisitorMerge::getReceptionId,receptionId)); + } + + @Override + public List selectReceptionTaskOpenStatus() { + return baseConverter.mapperDto(baseMapper.selectList(Wrappers.query().lambda() + .eq(DmReceptionPo::getStatus,1))); + } + + @Override + public int update(DmReceptionDto dto) { + int row = super.update(dto); + if (row > 0) { + this.editReceptionVisitorMerge(dto.getId(),dto.getPriorities()); + } + return row; + } + + @Override + public void editReceptionVisitorMerge(Long receptionId, Long[][] visitorIds) { + // 1.校验organizeIds是否为空 ? 删除不存在的,增加新增的 : 删除所有 + if (ArrayUtil.isNotEmpty(visitorIds)) { + // 1.计算所有visitorIds的总和 + List visitorIdList = new ArrayList<>(); + for (int p = 1; p < visitorIds.length; p++) { + visitorIdList.addAll(Arrays.asList(visitorIds[p])); + } + // 2.删除所有任务相关数据 + dmReceptionVisitorMergeMapper.delete(Wrappers.query().lambda() + .eq(DmReceptionVisitorMerge::getReceptionId, receptionId)); + // 3.新增所有任务相关数据 + List receptionVisitorMerges = new ArrayList(); + for (int p = 1; p < visitorIds.length; p++) { + int priority = p; + List visitorList = new ArrayList<>(Arrays.asList(visitorIds[p])); + // 1.存储接待模式与访客的关联数据 + receptionVisitorMerges.addAll(visitorList.stream().filter(visitorId->visitorId!=null).map(visitorId -> new DmReceptionVisitorMerge(receptionId, visitorId, priority)) + .collect(Collectors.toList())); + } + // 2.在数据库插入接待模式与访客的关联数据 + if (receptionVisitorMerges.size() > 0) { + dmReceptionVisitorMergeMapper.insertBatch(receptionVisitorMerges); + } + } + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmActionMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmActionMapper.java new file mode 100644 index 00000000..1cb8b87f --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmActionMapper.java @@ -0,0 +1,17 @@ +package com.xueyi.system.digitalmans.mapper; + +import com.xueyi.system.digitalmans.domain.query.DmActionQuery; +import com.xueyi.system.digitalmans.domain.dto.DmActionDto; +import com.xueyi.system.digitalmans.domain.po.DmActionPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Master; + +/** + * 动作管理 +管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmActionMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmBroadcastMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmBroadcastMapper.java new file mode 100644 index 00000000..6032bcde --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmBroadcastMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.digitalmans.mapper; + +import com.xueyi.system.digitalmans.domain.query.DmBroadcastQuery; +import com.xueyi.system.digitalmans.domain.dto.DmBroadcastDto; +import com.xueyi.system.digitalmans.domain.po.DmBroadcastPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Isolate; + +/** + * 播报管理 数据层 + * + * @author xueyi + */ +@Isolate +public interface DmBroadcastMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmDigitalmanExtMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmDigitalmanExtMapper.java index 800764c3..7ff09c5d 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmDigitalmanExtMapper.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmDigitalmanExtMapper.java @@ -1,12 +1,10 @@ package com.xueyi.system.digitalmans.mapper; import com.xueyi.common.datasource.annotation.Isolate; -import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; -import com.xueyi.system.digitalmans.domain.query.DmDigitalmanExtQuery; -import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanExtDto; -import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanExtPo; import com.xueyi.common.web.entity.mapper.BaseMapper; -import com.xueyi.common.datasource.annotation.Master; +import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanExtPo; +import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanExtDto; +import com.xueyi.system.digitalmans.domain.query.DmDigitalmanExtQuery; /** * 数字人扩展管理 数据层 @@ -16,5 +14,6 @@ import com.xueyi.common.datasource.annotation.Master; @Isolate public interface DmDigitalmanExtMapper extends BaseMapper { public DmDigitalmanExtDto selectByManId(Long id); + public DmDigitalmanExtDto selectByManCode(String manCode); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmInitSkillsMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmInitSkillsMapper.java new file mode 100644 index 00000000..77bdd513 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmInitSkillsMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.digitalmans.mapper; + +import com.xueyi.system.digitalmans.domain.query.DmInitSkillsQuery; +import com.xueyi.system.digitalmans.domain.dto.DmInitSkillsDto; +import com.xueyi.system.digitalmans.domain.po.DmInitSkillsPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Master; + +/** + * 技能管理管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmInitSkillsMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmManDeviceMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmManDeviceMapper.java index 37f1bede..2a43d574 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmManDeviceMapper.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmManDeviceMapper.java @@ -5,6 +5,7 @@ import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo; import com.xueyi.common.web.entity.mapper.BaseMapper; import com.xueyi.common.datasource.annotation.Master; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,6 +17,7 @@ import java.util.List; @Master public interface DmManDeviceMapper extends BaseMapper { List selectListByManual(DmManDevicePo po); + List selectListByManualDeviceIdNotNullByTenantId(@Param("tenantId")Long tenantId); DmManDevicePo getOne(String devId); diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmQAndAMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmQAndAMapper.java new file mode 100644 index 00000000..a86c12a6 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmQAndAMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.digitalmans.mapper; + +import com.xueyi.system.digitalmans.domain.query.DmQAndAQuery; +import com.xueyi.system.digitalmans.domain.dto.DmQAndADto; +import com.xueyi.system.digitalmans.domain.po.DmQAndAPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Isolate; + +/** + * 企业知识库问答管理 数据层 + * + * @author yinruoxi + */ +@Isolate +public interface DmQAndAMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmQuestionsMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmQuestionsMapper.java new file mode 100644 index 00000000..7d6edfa4 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmQuestionsMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.digitalmans.mapper; + +import com.xueyi.system.digitalmans.domain.query.DmQuestionsQuery; +import com.xueyi.system.digitalmans.domain.dto.DmQuestionsDto; +import com.xueyi.system.digitalmans.domain.po.DmQuestionsPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Isolate; + +/** + * 企业知识库问题管理 数据层 + * + * @author yinruoxi + */ +@Isolate +public interface DmQuestionsMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmReceptionMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmReceptionMapper.java new file mode 100644 index 00000000..84daa527 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmReceptionMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.digitalmans.mapper; + +import com.xueyi.system.digitalmans.domain.query.DmReceptionQuery; +import com.xueyi.system.digitalmans.domain.dto.DmReceptionDto; +import com.xueyi.system.digitalmans.domain.po.DmReceptionPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Isolate; + +/** + * 接待模式管理管理 数据层 + * + * @author yinruoxi + */ +@Isolate +public interface DmReceptionMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmSkillMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmSkillMapper.java index 6449a43f..9eb101e6 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmSkillMapper.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/DmSkillMapper.java @@ -1,15 +1,12 @@ package com.xueyi.system.digitalmans.mapper; - -import com.xueyi.common.web.entity.mapper.BaseMapper; import com.xueyi.common.datasource.annotation.Isolate; -import com.xueyi.message.api.transfer.domain.vo.DmActiveVo; +import com.xueyi.common.web.entity.mapper.BaseMapper; import com.xueyi.system.api.digitalmans.domain.dto.DmSkillDto; import com.xueyi.system.api.digitalmans.domain.po.DmSkillPo; import com.xueyi.system.digitalmans.domain.query.DmSkillQuery; import com.xueyi.system.digitalmans.domain.vo.DmSyncDigitalmanVo; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -23,4 +20,6 @@ public interface DmSkillMapper extends BaseMapper selectSkillListByH5(@Param("manId")Long manId, @Param("timestamp") String timestamp); public List selectSkillListByH5(DmSyncDigitalmanVo vo); + + public DmSkillPo selectSkillByCode(String skillCode); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/merge/DmBroadcastResourceMergeMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/merge/DmBroadcastResourceMergeMapper.java new file mode 100644 index 00000000..ecdb221d --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/merge/DmBroadcastResourceMergeMapper.java @@ -0,0 +1,14 @@ +package com.xueyi.system.digitalmans.mapper.merge; + +import com.xueyi.common.datasource.annotation.Isolate; +import com.xueyi.common.web.entity.mapper.BasicMapper; +import com.xueyi.system.digitalmans.domain.merge.DmBroadcastResourceMerge; + +/** + * 播报文件关联 数据层 + * + * @author xueyi + */ +@Isolate +public interface DmBroadcastResourceMergeMapper extends BasicMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/merge/DmReceptionStaffMergeMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/merge/DmReceptionStaffMergeMapper.java new file mode 100644 index 00000000..3ece015a --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/merge/DmReceptionStaffMergeMapper.java @@ -0,0 +1,17 @@ +package com.xueyi.system.digitalmans.mapper.merge; + +import com.xueyi.common.datasource.annotation.Isolate; +import com.xueyi.common.datasource.annotation.Master; +import com.xueyi.common.web.entity.mapper.BasicMapper; +import com.xueyi.system.digitalmans.domain.merge.DmReceptionStaffMerge; + +/** + * 接待任务与负责人联表 数据层 + * + * @author xueyi + */ +@Isolate +public interface DmReceptionStaffMergeMapper extends BasicMapper { + + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/merge/DmReceptionVisitorMergeMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/merge/DmReceptionVisitorMergeMapper.java new file mode 100644 index 00000000..fd8d8f7f --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/mapper/merge/DmReceptionVisitorMergeMapper.java @@ -0,0 +1,14 @@ +package com.xueyi.system.digitalmans.mapper.merge; + +import com.xueyi.common.datasource.annotation.Isolate; +import com.xueyi.common.web.entity.mapper.BasicMapper; +import com.xueyi.system.digitalmans.domain.merge.DmReceptionVisitorMerge; + +/** + * 任务访客关联 数据层 + * + * @author xueyi + */ +@Isolate +public interface DmReceptionVisitorMergeMapper extends BasicMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmActionService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmActionService.java new file mode 100644 index 00000000..c455871f --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmActionService.java @@ -0,0 +1,14 @@ +package com.xueyi.system.digitalmans.service; + +import com.xueyi.system.digitalmans.domain.query.DmActionQuery; +import com.xueyi.system.digitalmans.domain.dto.DmActionDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * 动作管理 +管理 服务层 + * + * @author xueyi + */ +public interface IDmActionService extends IBaseService { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmBroadcastService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmBroadcastService.java new file mode 100644 index 00000000..cd831d94 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmBroadcastService.java @@ -0,0 +1,13 @@ +package com.xueyi.system.digitalmans.service; + +import com.xueyi.system.digitalmans.domain.query.DmBroadcastQuery; +import com.xueyi.system.digitalmans.domain.dto.DmBroadcastDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * 播报管理 服务层 + * + * @author xueyi + */ +public interface IDmBroadcastService extends IBaseService { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmInitSkillsService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmInitSkillsService.java new file mode 100644 index 00000000..97a5f140 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmInitSkillsService.java @@ -0,0 +1,13 @@ +package com.xueyi.system.digitalmans.service; + +import com.xueyi.system.digitalmans.domain.query.DmInitSkillsQuery; +import com.xueyi.system.digitalmans.domain.dto.DmInitSkillsDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * 技能管理管理 服务层 + * + * @author xueyi + */ +public interface IDmInitSkillsService extends IBaseService { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmManDeviceService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmManDeviceService.java index df89f6c4..581f56f3 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmManDeviceService.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmManDeviceService.java @@ -4,8 +4,11 @@ import com.xueyi.common.web.entity.service.IBaseService; import com.xueyi.message.api.transfer.domain.vo.DmActiveVo; import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo; import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.api.digitalmans.domain.vo.DashboardVo; import com.xueyi.system.digitalmans.domain.query.DmManDeviceQuery; +import java.util.List; + /** * 数字人设备管理管理 服务层 * @@ -15,5 +18,9 @@ public interface IDmManDeviceService extends IBaseService manDeviceListNotNullByTenantId(Long tenantId); DmManDevicePo getOne(String devId); + + Integer restartDevice(Integer type,String devId); + DashboardVo dashboardData(); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQAndAService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQAndAService.java new file mode 100644 index 00000000..ab3cac85 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQAndAService.java @@ -0,0 +1,16 @@ +package com.xueyi.system.digitalmans.service; + +import com.xueyi.system.digitalmans.domain.query.DmQAndAQuery; +import com.xueyi.system.digitalmans.domain.dto.DmQAndADto; +import com.xueyi.common.web.entity.service.IBaseService; + +import java.util.List; + +/** + * 企业知识库问答管理 服务层 + * + * @author yinruoxi + */ +public interface IDmQAndAService extends IBaseService { + Integer batchInsert(List queryList); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQuestionsService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQuestionsService.java new file mode 100644 index 00000000..5cf18157 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmQuestionsService.java @@ -0,0 +1,13 @@ +package com.xueyi.system.digitalmans.service; + +import com.xueyi.system.digitalmans.domain.query.DmQuestionsQuery; +import com.xueyi.system.digitalmans.domain.dto.DmQuestionsDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * 企业知识库问题管理 服务层 + * + * @author yinruoxi + */ +public interface IDmQuestionsService extends IBaseService { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmReceptionService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmReceptionService.java new file mode 100644 index 00000000..ea73fb73 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmReceptionService.java @@ -0,0 +1,16 @@ +package com.xueyi.system.digitalmans.service; + +import com.xueyi.system.api.digitalmans.domain.vo.DmReceptionVo; +import com.xueyi.system.digitalmans.domain.query.DmReceptionQuery; +import com.xueyi.system.digitalmans.domain.dto.DmReceptionDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * 接待模式管理管理 服务层 + * + * @author yinruoxi + */ +public interface IDmReceptionService extends IBaseService { + + DmReceptionVo selectReceptionTask(Long manId); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmSkillService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmSkillService.java index 84390d62..3afb350a 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmSkillService.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/IDmSkillService.java @@ -1,10 +1,11 @@ package com.xueyi.system.digitalmans.service; +import com.xueyi.common.web.entity.service.IBaseService; import com.xueyi.system.api.digitalmans.domain.dto.DmSkillDto; +import com.xueyi.system.api.digitalmans.domain.po.DmSkillPo; import com.xueyi.system.digitalmans.domain.dto.DmCustomMadeDto; import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; import com.xueyi.system.digitalmans.domain.query.DmSkillQuery; -import com.xueyi.common.web.entity.service.IBaseService; import java.util.List; @@ -16,6 +17,8 @@ import java.util.List; public interface IDmSkillService extends IBaseService { List selectSkillListByTimestamp(Long manId,String timestamp); + DmSkillPo selectSkillByCode(String skillCode); + int customInsert(DmCustomMadeDto dto); int batchInitInsert(DmDigitalmanDto digitalmanDto); diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmActionServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmActionServiceImpl.java new file mode 100644 index 00000000..15825a74 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmActionServiceImpl.java @@ -0,0 +1,36 @@ +package com.xueyi.system.digitalmans.service.impl; + +import com.xueyi.system.digitalmans.domain.dto.DmActionDto; +import com.xueyi.system.digitalmans.domain.query.DmActionQuery; +import com.xueyi.system.digitalmans.service.IDmActionService; +import com.xueyi.system.digitalmans.manager.IDmActionManager; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 动作管理 +管理 服务层处理 + * + * @author xueyi + */ +@Service +public class DmActionServiceImpl extends BaseServiceImpl implements IDmActionService { + + /** + * 查询动作管理 +对象列表 | 数据权限 + * + * @param action 动作管理 +对象 + * @return 动作管理 +对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmActionMapper"}) + public List selectListScope(DmActionQuery action) { + return baseManager.selectList(action); + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmBroadcastServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmBroadcastServiceImpl.java new file mode 100644 index 00000000..0d6f5294 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmBroadcastServiceImpl.java @@ -0,0 +1,32 @@ +package com.xueyi.system.digitalmans.service.impl; + +import com.xueyi.system.digitalmans.domain.dto.DmBroadcastDto; +import com.xueyi.system.digitalmans.domain.query.DmBroadcastQuery; +import com.xueyi.system.digitalmans.service.IDmBroadcastService; +import com.xueyi.system.digitalmans.manager.IDmBroadcastManager; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 播报管理 服务层处理 + * + * @author xueyi + */ +@Service +public class DmBroadcastServiceImpl extends BaseServiceImpl implements IDmBroadcastService { + + /** + * 查询播报对象列表 | 数据权限 + * + * @param broadcast 播报对象 + * @return 播报对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmBroadcastMapper"}) + public List selectListScope(DmBroadcastQuery broadcast) { + return baseManager.selectList(broadcast); + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmDigitalmanExtServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmDigitalmanExtServiceImpl.java index 110e7256..7e7a9094 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmDigitalmanExtServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmDigitalmanExtServiceImpl.java @@ -1,12 +1,11 @@ package com.xueyi.system.digitalmans.service.impl; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanExtDto; import com.xueyi.system.digitalmans.domain.query.DmDigitalmanExtQuery; +import com.xueyi.system.digitalmans.manager.IDmDigitalmanExtManager; import com.xueyi.system.digitalmans.mapper.DmDigitalmanExtMapper; -import com.xueyi.system.digitalmans.mapper.DmDigitalmanMapper; import com.xueyi.system.digitalmans.service.IDmDigitalmanExtService; -import com.xueyi.system.digitalmans.manager.IDmDigitalmanExtManager; -import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmDigitalmanServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmDigitalmanServiceImpl.java index b4ed4745..90bf4142 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmDigitalmanServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmDigitalmanServiceImpl.java @@ -333,6 +333,7 @@ public class DmDigitalmanServiceImpl extends BaseServiceImpl implements IDmInitSkillsService { + + /** + * 查询技能管理对象列表 | 数据权限 + * + * @param initSkills 技能管理对象 + * @return 技能管理对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmInitSkillsMapper"}) + public List selectListScope(DmInitSkillsQuery initSkills) { + return baseManager.selectList(initSkills); + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmManDeviceServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmManDeviceServiceImpl.java index 5af6da40..92812924 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmManDeviceServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmManDeviceServiceImpl.java @@ -1,27 +1,33 @@ package com.xueyi.system.digitalmans.service.impl; -import com.github.pagehelper.Page; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.xueyi.common.core.constant.digitalman.InitConstants; import com.xueyi.common.core.constant.digitalman.MessageConstants; -import com.xueyi.common.core.utils.core.IdUtil; import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.mqtt.connection.MqttTemplate; import com.xueyi.common.web.annotation.TenantIgnore; import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; import com.xueyi.message.api.transfer.domain.vo.DmActiveVo; -import com.xueyi.message.api.transfer.domain.vo.DmDeviceVo; import com.xueyi.message.api.transfer.feign.RemoteTransferService; -import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo; import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo; +import com.xueyi.system.api.digitalmans.domain.vo.DashboardVo; import com.xueyi.system.digitalmans.domain.query.DmManDeviceQuery; import com.xueyi.system.digitalmans.manager.IDmManDeviceManager; import com.xueyi.system.digitalmans.mapper.DmManDeviceMapper; import com.xueyi.system.digitalmans.service.IDmManDeviceService; -import com.xueyi.system.resource.service.IDmResourcesService; +import com.xueyi.system.emcs.domain.po.DmExceptionLogPo; +import com.xueyi.system.emcs.mapper.DmExceptionLogMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; /** @@ -33,6 +39,7 @@ import java.util.List; public class DmManDeviceServiceImpl extends BaseServiceImpl implements IDmManDeviceService { + private static final Logger log = LoggerFactory.getLogger(DmManDeviceServiceImpl.class); @Autowired RemoteTransferService remoteTransferService; @@ -46,6 +53,12 @@ public class DmManDeviceServiceImpl extends BaseServiceImpl manDeviceDtoRedisTemplate; + @Autowired + DmExceptionLogMapper exceptionLogMapper; + + + @Autowired + MqttTemplate mqttTemplate; /** * 查询数字人设备管理对象列表 | 数据权限 @@ -101,6 +114,7 @@ public class DmManDeviceServiceImpl extends BaseServiceImpl manDeviceListNotNullByTenantId(Long tenantId) { + return super.baseManager.selectManDeviceListNotNullByTenantId(tenantId); + } + + @Override + public DashboardVo dashboardData() { + DashboardVo vo = new DashboardVo(); + + List manDeviceDtoList = this.selectList(new DmManDeviceQuery()); + // 获取数字员工总数 + vo.setDigitalMans(manDeviceDtoList.size()); + // 获取当前在线率 + Long total = (long)manDeviceDtoList.size(); + Long onlineTotal = manDeviceDtoList.stream().filter(item->(!item.getOnlineStatus().isEmpty()) && + item.getOnlineStatus().equalsIgnoreCase("1")).count(); + int percent = (total == 0?0 : (int)(onlineTotal/total.doubleValue() * 100)); + log.info("数字员工总数为{},当前在线设备为{},当前在线率为:{}",total, onlineTotal, percent); + + vo.setOnlineDevices(percent); + // 近七天预警 + LocalDateTime currentDate = LocalDateTime.now(); + LocalDateTime sevenDaysAgo =currentDate.minusDays(7).withHour(0).withMinute(0).withSecond(0); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + vo.setAlertNear7Days(exceptionLogMapper.selectList(Wrappers.query().lambda() + .ge(DmExceptionLogPo::getCreateTime,sevenDaysAgo.format(formatter))).size()); + // 当前未解除预警数 + vo.setOnProcessAlert(exceptionLogMapper.selectList(Wrappers.query().lambda() + .eq(DmExceptionLogPo::getAlertStatus,0)).size()); + return vo; + } + + @Override + public Integer restartDevice(Integer type, String devId) { + // 发送重启指令 + JSONObject message = new JSONObject(); + message.put("type",type); + mqttTemplate.sendToMqtt("/prod/digital_man/" + devId + "/notify/restart", message.toJSONString()); + // 更新设备启动状态 + DmManDeviceDto dmManDeviceDto = new DmManDeviceDto(); + dmManDeviceDto.setManCode(devId); + + + switch (MessageConstants.RestartEnum.getEnum(type)) { + case RESTART_APP: +// dmManDeviceDto.setSetupStatus(MessageConstants.RestartEnum.RESTART_APP.getCode().toString()); + // 更新设备在线状态 + dmManDeviceDto.setOnlineStatus(InitConstants.DEVICE_ACTIVATE_STATUS_APP_RESTART); + break; + case RESTART_DEVICE: +// dmManDeviceDto.setSetupStatus(MessageConstants.RestartEnum.RESTART_DEVICE.getCode().toString()); + // 更新设备在线状态 + dmManDeviceDto.setOnlineStatus(InitConstants.DEVICE_ACTIVATE_STATUS_DEVICE_REBOOT); + break; + default: + break; + } + return super.baseManager.updateInfoByManual(dmManDeviceDto); + } } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQAndAServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQAndAServiceImpl.java new file mode 100644 index 00000000..aa4ee63a --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQAndAServiceImpl.java @@ -0,0 +1,56 @@ +package com.xueyi.system.digitalmans.service.impl; + +import com.xueyi.system.api.organize.domain.dto.SysUserDto; +import com.xueyi.system.api.organize.domain.query.SysUserQuery; +import com.xueyi.system.digitalmans.domain.dto.DmQAndADto; +import com.xueyi.system.digitalmans.domain.dto.DmQuestionsDto; +import com.xueyi.system.digitalmans.domain.query.DmQAndAQuery; +import com.xueyi.system.digitalmans.service.IDmQAndAService; +import com.xueyi.system.digitalmans.manager.IDmQAndAManager; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.system.organize.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 企业知识库问答管理 服务层处理 + * + * @author yinruoxi + */ +@Service +public class DmQAndAServiceImpl extends BaseServiceImpl implements IDmQAndAService { + + @Autowired + private ISysUserService iSysUserService; + /** + * 查询企业知识库问答对象列表 | 数据权限 + * + * @param qAndA 企业知识库问答对象 + * @return 企业知识库问答对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmQAndAMapper"}) + public List selectListScope(DmQAndAQuery qAndA) { + + SysUserQuery userQuery = new SysUserQuery(); + List userDtos = iSysUserService.selectList(userQuery); + + List qAndADtos = baseManager.selectList(qAndA); + qAndADtos.forEach(qAndADto -> { + userDtos.forEach(userDto -> { + if (userDto.getId().equals(qAndADto.getCreateBy())) { + qAndADto.setCreator(userDto.getUserName()); + } + }); + }); + return baseManager.selectList(qAndA); + } + + + @Override + public Integer batchInsert(List queryList) { + return baseManager.insertBatch(queryList); + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQuestionsServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQuestionsServiceImpl.java new file mode 100644 index 00000000..c8bcd269 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmQuestionsServiceImpl.java @@ -0,0 +1,49 @@ +package com.xueyi.system.digitalmans.service.impl; + +import com.xueyi.system.api.organize.domain.dto.SysUserDto; +import com.xueyi.system.api.organize.domain.query.SysUserQuery; +import com.xueyi.system.digitalmans.domain.dto.DmQuestionsDto; +import com.xueyi.system.digitalmans.domain.query.DmQuestionsQuery; +import com.xueyi.system.digitalmans.service.IDmQuestionsService; +import com.xueyi.system.digitalmans.manager.IDmQuestionsManager; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.system.organize.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 企业知识库问题管理 服务层处理 + * + * @author yinruoxi + */ +@Service +public class DmQuestionsServiceImpl extends BaseServiceImpl implements IDmQuestionsService { + + @Autowired + private ISysUserService iSysUserService; + /** + * 查询企业知识库问题对象列表 | 数据权限 + * + * @param questions 企业知识库问题对象 + * @return 企业知识库问题对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmQuestionsMapper"}) + public List selectListScope(DmQuestionsQuery questions) { + SysUserQuery userQuery = new SysUserQuery(); + List userDtos = iSysUserService.selectList(userQuery); + + List questionsDtos = baseManager.selectList(questions); + questionsDtos.forEach(questionsDto -> { + userDtos.forEach(userDto -> { + if (userDto.getId().equals(questionsDto.getCreateBy())) { + questionsDto.setCreator(userDto.getUserName()); + } + }); + }); + return questionsDtos; + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmReceptionServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmReceptionServiceImpl.java new file mode 100644 index 00000000..c30b0199 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmReceptionServiceImpl.java @@ -0,0 +1,132 @@ +package com.xueyi.system.digitalmans.service.impl; + +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.system.api.digitalmans.domain.vo.DmReceptionVo; +import com.xueyi.system.digitalmans.domain.dto.DmReceptionDto; +import com.xueyi.system.digitalmans.domain.merge.DmReceptionVisitorMerge; +import com.xueyi.system.digitalmans.domain.query.DmReceptionQuery; +import com.xueyi.system.digitalmans.service.IDmReceptionService; +import com.xueyi.system.digitalmans.manager.IDmReceptionManager; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +/** + * 接待模式管理管理 服务层处理 + * + * @author yinruoxi + */ +@Service +public class DmReceptionServiceImpl extends BaseServiceImpl implements IDmReceptionService { + + /** + * 查询接待模式管理对象列表 | 数据权限 + * + * @param reception 接待模式管理对象 + * @return 接待模式管理对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmReceptionMapper"}) + public List selectListScope(DmReceptionQuery reception) { + List dtoList = baseManager.selectList(reception); + for (DmReceptionDto dto : dtoList) { + List rvList = baseManager.selectDeceptionVisitorMerge(dto.getId()); + Long[][] visitorIds = new Long[3][5]; + List first = new ArrayList<>(); + List second = new ArrayList<>(); + List third = new ArrayList<>(); + for (DmReceptionVisitorMerge rv : rvList) { + switch (rv.getPriority()) { + case 1: + first.add(rv.getVisitorId()); + break; + case 2: + second.add(rv.getVisitorId()); + break; + case 3: + third.add(rv.getVisitorId()); + break; + default: + break; + } + } + visitorIds[0] = first.toArray(new Long[0]); + visitorIds[1] = second.toArray(new Long[0]); + visitorIds[2] = third.toArray(new Long[0]); + dto.setPriorities(visitorIds); + } + +// return dtoList; + return dtoList; + } + + + @Override + public int updateStatus(DmReceptionDto dto) { + // 查询原始数据 + DmReceptionDto originDto = baseManager.selectById(dto.getId()); + // 查询运行中的任务 + List taskList = baseManager.selectReceptionTaskOpenStatus(); + startHandle(OperateConstants.ServiceType.EDIT_STATUS, originDto, dto); + if (taskList != null && taskList.size() > 0 && dto.getStatus().equals("1")) { + for (DmReceptionDto task : taskList) { + if (task.getId().equals(dto.getId())) { + continue; + } + task.setStatus("0"); + baseManager.updateStatus(task); + } + } + int row = baseManager.updateStatus(dto); + endHandle(OperateConstants.ServiceType.EDIT_STATUS, row, originDto, dto); + return row; + } + + @Override + public DmReceptionVo selectReceptionTask(Long manId) { + DmReceptionQuery query = new DmReceptionQuery(); + query.setManId(manId); + query.setStatus("1"); + List dtoList = baseManager.selectList(query); + if (dtoList == null || dtoList.size() == 0) { + return null; + } + DmReceptionVo vo = new DmReceptionVo(); + DmReceptionDto dto = dtoList.get(0); + vo.setName(dto.getName()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd"); + SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd"); + vo.setDate(dateFormat.format(dto.getReceptionTime())); + vo.setWelcome(dto.getWelcome()); + vo.setGuide(new Long[]{dto.getHeadId()}); + List rvList = baseManager.selectDeceptionVisitorMerge(dto.getId()); + Long[][] visitorIds = new Long[3][5]; + List first = new ArrayList<>(); + List second = new ArrayList<>(); + List third = new ArrayList<>(); + for (DmReceptionVisitorMerge rv : rvList) { + switch (rv.getPriority()) { + case 1: + first.add(rv.getVisitorId()); + break; + case 2: + second.add(rv.getVisitorId()); + break; + case 3: + third.add(rv.getVisitorId()); + break; + default: + break; + } + } + vo.setFirst(first.toArray(new Long[0])); + vo.setSecond(second.toArray(new Long[0])); + vo.setThird(third.toArray(new Long[0])); + return vo; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmSkillServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmSkillServiceImpl.java index c1d60903..3934ecde 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmSkillServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/digitalmans/service/impl/DmSkillServiceImpl.java @@ -1,8 +1,9 @@ package com.xueyi.system.digitalmans.service.impl; -import com.xueyi.common.core.constant.basic.EntityConstants; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; import com.xueyi.system.api.digitalmans.domain.dto.DmInitSkillDto; import com.xueyi.system.api.digitalmans.domain.dto.DmSkillDto; +import com.xueyi.system.api.digitalmans.domain.po.DmSkillPo; import com.xueyi.system.digitalmans.domain.dto.DmCustomMadeDto; import com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; import com.xueyi.system.digitalmans.domain.query.DmInitSkillQuery; @@ -11,10 +12,8 @@ import com.xueyi.system.digitalmans.domain.vo.DmSyncDigitalmanVo; import com.xueyi.system.digitalmans.manager.IDmSkillManager; import com.xueyi.system.digitalmans.manager.impl.DmInitSkillManager; import com.xueyi.system.digitalmans.manager.impl.DmSkillManager; -import com.xueyi.system.digitalmans.mapper.DmCustomMadeMapper; import com.xueyi.system.digitalmans.mapper.DmSkillMapper; import com.xueyi.system.digitalmans.service.IDmSkillService; -import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -39,9 +38,9 @@ public class DmSkillServiceImpl extends BaseServiceImpl { + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "日志文件信息记录" ; + } + + /** + * 查询日志文件信息记录列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_DEVICE_LOG_FILE_LIST) + public AjaxResult list(DmDeviceLogFileQuery deviceLogFile) { + System.out.println("DmDeviceLogFileController:list"); + return super.list(deviceLogFile); + } + + /** + * 查询日志文件信息记录详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_DEVICE_LOG_FILE_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 日志文件信息记录新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_DEVICE_LOG_FILE_ADD) + @Log(title = "日志文件信息记录管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmDeviceLogFileDto deviceLogFile) { + return super.add(deviceLogFile); + } + + /** + * 日志文件信息记录修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_DEVICE_LOG_FILE_EDIT) + @Log(title = "日志文件信息记录管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmDeviceLogFileDto deviceLogFile) { + return super.edit(deviceLogFile); + } + + /** + * 日志文件信息记录批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_DEVICE_LOG_FILE_DEL) + @Log(title = "日志文件信息记录管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取日志文件信息记录选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 日志文件信息记录管理 - 列表 */ + String DM_DEVICE_LOG_FILE_LIST = "system:file:list"; + /** 系统 - 日志文件信息记录管理 - 详情 */ + String DM_DEVICE_LOG_FILE_SINGLE = "system:file:single"; + /** 系统 - 日志文件信息记录管理 - 新增 */ + String DM_DEVICE_LOG_FILE_ADD = "system:file:add"; + /** 系统 - 日志文件信息记录管理 - 修改 */ + String DM_DEVICE_LOG_FILE_EDIT = "system:file:edit"; + /** 系统 - 日志文件信息记录管理 - 删除 */ + String DM_DEVICE_LOG_FILE_DEL = "system:file:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/controller/DmExceptionLogController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/controller/DmExceptionLogController.java new file mode 100644 index 00000000..889c305f --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/controller/DmExceptionLogController.java @@ -0,0 +1,327 @@ +package com.xueyi.system.emcs.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.mqtt.connection.MqttTemplate; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.system.api.digitalmans.domain.vo.NumberOfAlertToChartVo; +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.system.emcs.domain.dto.RedisBaseDto; +import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; +import com.xueyi.system.emcs.service.BaseRedisListDataCache; +import com.xueyi.system.emcs.service.IDmExceptionLogService; +import com.xueyi.system.emcs.service.LogMqttMessageHandler; +import com.xueyi.system.emcs.service.impl.DmExceptionLogServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +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.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.Serializable; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.Month; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 数字人状态事件上报日志管理 业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/log") +public class DmExceptionLogController extends BaseController { + private final static String HEART_MQTT_PREFIX = "digital-man"; + + private final static String[] CHART_TYPES = new String[]{"network", "cpu", "memory"}; + @Autowired + private MqttTemplate mqttTemplate; + + @Autowired + private LogMqttMessageHandler logMqttMessageHandler; + + @Autowired + private BaseRedisListDataCache baseRedisListDataCache; + + @Autowired + private DmExceptionLogServiceImpl exceptionLogService; + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "数字人状态事件上报日志" ; + } + + + /** + * 查询数字人状态事件上报日志列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_EXCEPTION_LOG_LIST) + public AjaxResult list(DmExceptionLogQuery exceptionLog) { + return super.list(exceptionLog); + } + + /** + * 查询数字人状态事件上报日志详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_EXCEPTION_LOG_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 数字人状态事件上报日志新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_EXCEPTION_LOG_ADD) + @Log(title = "数字人状态事件上报日志管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmExceptionLogDto exceptionLog) { + return super.add(exceptionLog); + } + + /** + * 数字人状态事件上报日志修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_EXCEPTION_LOG_EDIT) + @Log(title = "数字人状态事件上报日志管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmExceptionLogDto exceptionLog) { + if (exceptionLog == null || exceptionLog.getId() == null) { + return error("参数不合法"); + } + DmExceptionLogDto dto = exceptionLogService.selectById(exceptionLog.getId()); + dto.setAlertStatus(exceptionLog.getAlertStatus()); + dto.setEndTime(LocalDateTime.now()); + return super.edit(dto); + } + + public static List getRecentHourTimes() { + List recentHourTimes = new ArrayList<>(); + + // 获取当前时间 + LocalDateTime now = LocalDateTime.now(); + + // 获取一个小时前的时间 + LocalDateTime oneHourAgo = now.minusHours(1); + + // 从一个小时前的时间开始,每分钟递增,直到当前时间 + LocalDateTime current = oneHourAgo; + while (current.isBefore(now)) { + // 格式化时间为HH:mm + String formattedTime = current.format(DateTimeFormatter.ofPattern("HH:mm")); + + // 添加到列表中 + recentHourTimes.add(formattedTime); + + // 当前时间加一分钟 + current = current.plusMinutes(1); + } + + return recentHourTimes; + } + + @GetMapping( value = "/chart/{devId}") + public AjaxResult queryChartData(@PathVariable String devId) { + JSONObject json = new JSONObject(); + + List times = getRecentHourTimes(); + Arrays.stream(CHART_TYPES).toList().forEach(item->{ + List redisList = new ArrayList<>(); + String key = HEART_MQTT_PREFIX + ":" + devId + ":" + item; + redisList = baseRedisListDataCache.getList(key); + if (redisList!= null && redisList.size() > 0) { + RedisBaseDto baseDto = (RedisBaseDto) redisList.get(redisList.size()-1); + String occur = baseDto.getOccurTime(); + String last = times.get(times.size()-1); + LocalTime localTime1 = LocalTime.parse(occur); + LocalTime localTime2 = LocalTime.parse(last); + LocalTime localTime = localTime2.minusMinutes(3); + if (localTime.compareTo(localTime1) > 0 ){ + JSONObject redisDto = new JSONObject(); + redisDto.put("occurTime", localTime2.format(DateTimeFormatter.ofPattern("HH:mm"))); + redisDto.put("val", "N"); + redisList.add(redisDto); + } + } else { + String last = times.get(times.size()-1); + LocalTime localTime2 = LocalTime.parse(last); + JSONObject redisDto = new JSONObject(); + redisDto.put("occurTime", localTime2.format(DateTimeFormatter.ofPattern("HH:mm"))); + redisDto.put("val", "N"); + redisList.add(redisDto); + } +// redisList.get(redisList.size()-1); + json.put(item, redisList); + }); + + System.err.println(getRecentHourTimes()); + + return success(json); + } + + /** + * 数字人状态事件上报日志批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_EXCEPTION_LOG_DEL) + @Log(title = "数字人状态事件上报日志管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + @GetMapping("/range_alerts_to_chart") + public AjaxResult rangeAlertsToChart() { + JSONObject jsonObject = new JSONObject(); + List rangeBy5Weeks = new ArrayList<>(); + // select nearly 5 weeks alerts from dm_exception_log + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime startL = LocalDateTime.now(); + LocalDateTime endL = null; + for (int i = 0;i < 5;i++) { + // 格式化日期时间 + // 把startL设置当前时间减一周后的周一00:00:00 + startL = startL.with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0); + // 把endL设置成周日23:59:59,如果是当前一周,设置成当前时间 + if (i == 0) { + endL = LocalDateTime.now(); + } else { + endL = startL.with(DayOfWeek.SUNDAY).withHour(23).withMinute(59).withSecond(59); + } + String start = startL.format(formatter); + String end = endL.format(formatter); + NumberOfAlertToChartVo vo = new NumberOfAlertToChartVo(); + DateTimeFormatter formatter_for_week = DateTimeFormatter.ofPattern("MM-dd"); + vo.setNumberOfAlert(String.valueOf(super.baseService.selectListRangeByCreateTime(start,end).size())); + vo.setDate(startL.format(formatter_for_week)); + rangeBy5Weeks.add(0,vo); + // 将startL减去1周 + startL = startL.minusWeeks(1); + } + jsonObject.put("rangeBy5Weeks",rangeBy5Weeks); + //获取近五月的预警 + startL = LocalDateTime.now(); + List rangeBy5Months = new ArrayList<>(); + for (int i = 0;i < 5;i++) { + // 格式化日期时间 + // 把startL设置当前时间减一周后的周一00:00:00 + startL = startL.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0); + // 把endL设置成周日23:59:59,如果是当前一周,设置成当前时间 + if (i == 0) { + endL = LocalDateTime.now(); + } else { + endL = startL.plusMonths(1).minusDays(1).withHour(23).withMinute(59).withSecond(59); + } + String start = startL.format(formatter); + String end = endL.format(formatter); + NumberOfAlertToChartVo vo = new NumberOfAlertToChartVo(); + + DateTimeFormatter formatter_for_month = DateTimeFormatter.ofPattern("MM"); + vo.setNumberOfAlert(String.valueOf(super.baseService.selectListRangeByCreateTime(start,end).size())); + vo.setDate(startL.format(formatter_for_month)); + rangeBy5Months.add(0,vo); + // 开始时间减去1个月 + startL = startL.minusMonths(1); + } + jsonObject.put("rangeBy5Months",rangeBy5Months); + return AjaxResult.success(jsonObject); + } + + @GetMapping("/alerts_counts_to_chart/{devId}") + public AjaxResult rangeAlertCountsToChart(@PathVariable String devId) { + JSONObject jsonObject = new JSONObject(); + List> range = new ArrayList<>(); + + YearMonth currentYearMonth = YearMonth.now(); + int currentYear = currentYearMonth.getYear(); + int currentMonth = currentYearMonth.getMonthValue(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + // 遍历每个月 + for (Month month : Month.values()) { + int monthValue = month.getValue(); + + // 如果当前月份已经过去,则跳过输出 + if (monthValue > currentMonth) { + continue; + } + // 获取当前月份的第一天和最后一天 + LocalDate firstDay = LocalDate.of(currentYear, month, 1); + LocalDate lastDay = firstDay.withDayOfMonth(firstDay.lengthOfMonth()); + + String start = firstDay.atStartOfDay().withHour(0).withMinute(0).withSecond(0).format(formatter); + String end = lastDay.atStartOfDay().withHour(23).withMinute(59).withSecond(59).format(formatter); + Map map = new HashMap<>(); + map.put(monthValue+"月",super.baseService.selectListRangeByCreateTimeAndDevId(start, end, devId).size()); + range.add(map); + + } + + jsonObject.put("range",range); + return AjaxResult.success(jsonObject); + } + /* + * @Author yangkai + * @Description //主动拉取日志操作 + * @Date 2023/5/10 + * @Param [devId, uploadType] + * @return com.xueyi.common.core.web.result.AjaxResult + **/ + @PostMapping("/fetch-log") + public AjaxResult sendMqttMsgToDev(@RequestBody JSONObject json){ + String devId = json.getString("devId"); + devId = StringUtils.isEmpty(devId) ? json.getString("id") : devId; + JSONObject jsonObject = new JSONObject(); + jsonObject.put("devId", devId); + + mqttTemplate.sendToMqtt("/prod/digital_man"+"/"+devId+"/log_upload", jsonObject.toJSONString()); + return success("操作成功"); + } + + /** + * 获取数字人状态事件上报日志选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 数字人状态事件上报日志管理 - 列表 */ + String DM_EXCEPTION_LOG_LIST = "log:log:list"; + /** 系统 - 数字人状态事件上报日志管理 - 详情 */ + String DM_EXCEPTION_LOG_SINGLE = "log:log:single"; + /** 系统 - 数字人状态事件上报日志管理 - 新增 */ + String DM_EXCEPTION_LOG_ADD = "log:log:add"; + /** 系统 - 数字人状态事件上报日志管理 - 修改 */ + String DM_EXCEPTION_LOG_EDIT = "log:log:edit"; + /** 系统 - 数字人状态事件上报日志管理 - 删除 */ + String DM_EXCEPTION_LOG_DEL = "log:log:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/dto/DmDeviceLogFileDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/dto/DmDeviceLogFileDto.java new file mode 100644 index 00000000..f25ef3b2 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/dto/DmDeviceLogFileDto.java @@ -0,0 +1,30 @@ +package com.xueyi.system.emcs.domain.dto; + +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.emcs.domain.po.DmDeviceLogFilePo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +import static com.xueyi.system.api.exception.domain.merge.MergeGroup.LOG_DmDevice_GROUP; + +/** + * 日志文件信息记录 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmDeviceLogFileDto extends DmDeviceLogFilePo { + + @Serial + private static final long serialVersionUID = 1L; + + /** 模块信息 */ + @Correlation(groupName = LOG_DmDevice_GROUP, keyType = OperateConstants.SubKeyType.RECEIVE) + private DmManDeviceDto dmManDeviceDto; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/dto/DmExceptionLogDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/dto/DmExceptionLogDto.java new file mode 100644 index 00000000..82ea2eae --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/dto/DmExceptionLogDto.java @@ -0,0 +1,23 @@ +package com.xueyi.system.emcs.domain.dto; + +import com.xueyi.system.emcs.domain.po.DmExceptionLogPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 数字人状态事件上报日志 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmExceptionLogDto extends DmExceptionLogPo { + + @Serial + private static final long serialVersionUID = 1L; + + private String tenantName; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/dto/RedisBaseDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/dto/RedisBaseDto.java new file mode 100644 index 00000000..7091e5e5 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/dto/RedisBaseDto.java @@ -0,0 +1,24 @@ +package com.xueyi.system.emcs.domain.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 数字人状态事件上报日志网络参数DTO + * + * @author xueyi + */ +@Data +public class RedisBaseDto implements Serializable { + private String occurTime; + private String val; + + public RedisBaseDto(){} + + public RedisBaseDto(String occurTime, String val) { + this.occurTime = occurTime; + this.val = val; + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/model/DmDeviceLogFileConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/model/DmDeviceLogFileConverter.java new file mode 100644 index 00000000..701e3304 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/model/DmDeviceLogFileConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.emcs.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.emcs.domain.dto.DmDeviceLogFileDto; +import com.xueyi.system.emcs.domain.po.DmDeviceLogFilePo; +import com.xueyi.system.emcs.domain.query.DmDeviceLogFileQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 日志文件信息记录 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmDeviceLogFileConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/model/DmExceptionLogConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/model/DmExceptionLogConverter.java new file mode 100644 index 00000000..f8392e70 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/model/DmExceptionLogConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.emcs.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.system.emcs.domain.po.DmExceptionLogPo; +import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 数字人状态事件上报日志 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmExceptionLogConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/po/DmDeviceLogFilePo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/po/DmDeviceLogFilePo.java new file mode 100644 index 00000000..36bb786d --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/po/DmDeviceLogFilePo.java @@ -0,0 +1,56 @@ +package com.xueyi.system.emcs.domain.po; + +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.annotation.Correlations; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.web.entity.base.BaseEntity; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.io.Serial; + +import static com.xueyi.common.core.constant.basic.EntityConstants.*; +import static com.xueyi.system.api.exception.domain.merge.MergeGroup.LOG_DmDevice_GROUP; + +/** + * 日志文件信息记录 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_device_log_file", excludeProperty = { STATUS, SORT, REMARK, DEL_FLAG }) +public class DmDeviceLogFilePo extends BaseEntity { + + + @Serial + private static final long serialVersionUID = 1L; + + /** 日志类型(1:通用;2:主动拉起;3:崩溃重启) */ + @Excel(name = "日志类型(1:通用;2:主动拉起;3:崩溃重启)") + protected Integer type; + + /** 设备管理主键ID */ + /** 模块Id */ + @NotNull(message = "模块Id不能为空") + @Correlations({ + @Correlation(groupName = LOG_DmDevice_GROUP, keyType = OperateConstants.SubKeyType.MAIN) + }) + protected Long manDeviceId; + + /** url地址 */ + @Excel(name = "url地址") + protected String url; + + /** 所属组织ID */ + @Excel(name = "所属组织ID") + protected Long deptId; + + /** 文件大小 */ + @Excel(name = "文件大小") + protected Long fileSize; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/po/DmExceptionLogPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/po/DmExceptionLogPo.java new file mode 100644 index 00000000..d3dd0416 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/po/DmExceptionLogPo.java @@ -0,0 +1,72 @@ +package com.xueyi.system.emcs.domain.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xueyi.common.core.annotation.Excel; +import com.xueyi.common.core.web.entity.base.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.time.LocalDateTime; + +import static com.xueyi.common.core.constant.basic.EntityConstants.NAME; +import static com.xueyi.common.core.constant.basic.EntityConstants.REMARK; +import static com.xueyi.common.core.constant.basic.EntityConstants.SORT; +import static com.xueyi.common.core.constant.basic.EntityConstants.STATUS; + +/** + * 数字人状态事件上报日志 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_exception_log", excludeProperty = { STATUS, SORT, REMARK, NAME }) +public class DmExceptionLogPo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 数字人ID */ + @Excel(name = "数字人Code") + protected String manCode; + + @Excel(name = "devId") + protected String devId; + + /** 故障类型(重启,摄像头故障等) */ + @Excel(name = "故障类型(重启,摄像头故障等)") + protected String type; + + /** 故障等级 */ + @Excel(name = "故障等级") + protected Integer level; + + /** 故障发生时间 */ + @Excel(name = "故障发生时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + protected LocalDateTime occurTime; + + /** 故障结束时间 */ + @Excel(name = "故障结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + protected LocalDateTime endTime; + + /** 事件名 */ + @Excel(name = "事件名") + protected String exceptionName; + + /** 报警状态(0预警中 1已解除 ) */ + @Excel(name = "报警状态(0预警中 1已解除 )") + protected Integer alertStatus; + + /** 所属组织ID */ + @Excel(name = "所属组织ID") + protected Long deptId; + + /** 租户Id */ + @Excel(name = "租户Id") + protected Long tId; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/query/DmDeviceLogFileQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/query/DmDeviceLogFileQuery.java new file mode 100644 index 00000000..49e44505 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/query/DmDeviceLogFileQuery.java @@ -0,0 +1,25 @@ +package com.xueyi.system.emcs.domain.query; + +import com.xueyi.system.digitalmans.domain.query.DmManDeviceQuery; +import com.xueyi.system.emcs.domain.po.DmDeviceLogFilePo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 日志文件信息记录 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmDeviceLogFileQuery extends DmDeviceLogFilePo { + + @Serial + private static final long serialVersionUID = 1L; + + protected String startTime; + protected String endTime; + protected DmManDeviceQuery manDeviceQuery; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/query/DmExceptionLogQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/query/DmExceptionLogQuery.java new file mode 100644 index 00000000..49781bf5 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/domain/query/DmExceptionLogQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.emcs.domain.query; + +import com.xueyi.system.emcs.domain.po.DmExceptionLogPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 数字人状态事件上报日志 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmExceptionLogQuery extends DmExceptionLogPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/IDmDeviceLogFileManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/IDmDeviceLogFileManager.java new file mode 100644 index 00000000..59148d52 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/IDmDeviceLogFileManager.java @@ -0,0 +1,13 @@ +package com.xueyi.system.emcs.manager; + +import com.xueyi.system.emcs.domain.dto.DmDeviceLogFileDto; +import com.xueyi.system.emcs.domain.query.DmDeviceLogFileQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * 日志文件信息记录管理 数据封装层 + * + * @author xueyi + */ +public interface IDmDeviceLogFileManager extends IBaseManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/IDmExceptionLogManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/IDmExceptionLogManager.java new file mode 100644 index 00000000..f7747000 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/IDmExceptionLogManager.java @@ -0,0 +1,17 @@ +package com.xueyi.system.emcs.manager; + +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +import java.util.List; + +/** + * 数字人状态事件上报日志管理 数据封装层 + * + * @author xueyi + */ +public interface IDmExceptionLogManager extends IBaseManager { + List selectListRangeByCreateTime(String start,String end); + List selectListRangeByCreateTimeAndDevId(String start,String end,String devId); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/impl/DmDeviceLogFileManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/impl/DmDeviceLogFileManager.java new file mode 100644 index 00000000..890e2a92 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/impl/DmDeviceLogFileManager.java @@ -0,0 +1,65 @@ +package com.xueyi.system.emcs.manager.impl; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.github.pagehelper.Page; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.utils.core.CollUtil; +import com.xueyi.common.core.utils.page.PageUtil; +import com.xueyi.common.web.entity.domain.SlaveRelation; +import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.digitalmans.manager.impl.DmManDeviceManager; +import com.xueyi.system.emcs.domain.po.DmDeviceLogFilePo; +import com.xueyi.system.emcs.domain.dto.DmDeviceLogFileDto; +import com.xueyi.system.emcs.domain.query.DmDeviceLogFileQuery; +import com.xueyi.system.emcs.domain.model.DmDeviceLogFileConverter; +import com.xueyi.system.emcs.mapper.DmDeviceLogFileMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.emcs.manager.IDmDeviceLogFileManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static com.xueyi.system.api.exception.domain.merge.MergeGroup.LOG_DmDevice_GROUP; + +/** + * 日志文件信息记录管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmDeviceLogFileManager extends BaseManagerImpl implements IDmDeviceLogFileManager { + + @Autowired + DmManDeviceManager manDeviceManager; + + @Override + protected List subRelationInit() { + List result = new ArrayList(); + result.add(new SlaveRelation(LOG_DmDevice_GROUP, DmManDeviceManager.class, OperateConstants.SubOperateLimit.ONLY_SEL)); + return result; + } + + @Override + public List selectList(DmDeviceLogFileQuery query) { + // 因为Page在执行第一次查询时会强制注入Limit,所以导致业务逻辑错误,需要先清除Page信息后查询数字人列表,再重新设置Page信息后查询日志 + Page page = PageUtil.getLocalPage(); + System.out.println(page.getPageNum() + " " + page.getPageSize()); + PageUtil.clearPage(); + List manDeviceDtos = manDeviceManager.selectList(query.getManDeviceQuery()); + List manDeviceIds = manDeviceDtos.stream().map(DmManDeviceDto::getId).collect(Collectors.toList()); + if (CollUtil.isEmpty(manDeviceIds)) { + return new Page<>(); + } + PageUtil.startPage(page.getPageNum(), page.getPageSize()); + return subMerge(mapperDto(super.baseMapper.selectList(selectListQuery(query) + .and(StringUtils.isNotEmpty(query.getStartTime()) && StringUtils.isNotEmpty(query.getEndTime()), t->{ + t.ge(DmDeviceLogFilePo::getCreateTime,query.getStartTime()); + t.le(DmDeviceLogFilePo::getCreateTime,query.getEndTime()); + }) + .and(CollUtil.isNotEmpty(manDeviceIds),i->i.in(DmDeviceLogFilePo::getManDeviceId, manDeviceIds))))); + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/impl/DmExceptionLogManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/impl/DmExceptionLogManager.java new file mode 100644 index 00000000..53277aaf --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/manager/impl/DmExceptionLogManager.java @@ -0,0 +1,42 @@ +package com.xueyi.system.emcs.manager.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.system.emcs.domain.model.DmExceptionLogConverter; +import com.xueyi.system.emcs.domain.po.DmExceptionLogPo; +import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; +import com.xueyi.system.emcs.manager.IDmExceptionLogManager; +import com.xueyi.system.emcs.mapper.DmExceptionLogMapper; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 数字人状态事件上报日志管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmExceptionLogManager extends BaseManagerImpl implements IDmExceptionLogManager { + @Override + public List selectListRangeByCreateTime(String start,String end) { + return mapperDto(super.baseMapper.selectList(new LambdaQueryWrapper() + .and(StringUtils.isNotEmpty(start) && StringUtils.isNotEmpty(end), t->{ + t.ge(DmExceptionLogPo::getCreateTime,start); + t.le(DmExceptionLogPo::getCreateTime,end); + }))); + } + + @Override + public List selectListRangeByCreateTimeAndDevId(String start, String end, String devId) { + return mapperDto(super.baseMapper.selectList(new LambdaQueryWrapper().eq(DmExceptionLogPo::getDevId,devId) + .and(StringUtils.isNotEmpty(start) && StringUtils.isNotEmpty(end), t->{ + t.ge(DmExceptionLogPo::getCreateTime,start); + t.le(DmExceptionLogPo::getCreateTime,end); + }))); + } + + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/mapper/DmDeviceLogFileMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/mapper/DmDeviceLogFileMapper.java new file mode 100644 index 00000000..c57eae65 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/mapper/DmDeviceLogFileMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.emcs.mapper; + +import com.xueyi.system.emcs.domain.query.DmDeviceLogFileQuery; +import com.xueyi.system.emcs.domain.dto.DmDeviceLogFileDto; +import com.xueyi.system.emcs.domain.po.DmDeviceLogFilePo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Master; + +/** + * 日志文件信息记录管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmDeviceLogFileMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/mapper/DmExceptionLogMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/mapper/DmExceptionLogMapper.java new file mode 100644 index 00000000..e1021581 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/mapper/DmExceptionLogMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.emcs.mapper; + +import com.xueyi.common.datasource.annotation.Master; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.system.emcs.domain.po.DmExceptionLogPo; +import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; + +/** + * 数字人状态事件上报日志管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmExceptionLogMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/BaseRedisListDataCache.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/BaseRedisListDataCache.java new file mode 100644 index 00000000..823d590e --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/BaseRedisListDataCache.java @@ -0,0 +1,47 @@ +package com.xueyi.system.emcs.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.io.Serializable; +import java.time.Duration; +import java.util.List; + +/** + * @author yk + * @description + * @date 2023-05-12 14:22 + */ +@Component +public class BaseRedisListDataCache { + @Autowired + private RedisTemplate redisTemplate; + + private Integer size; + + public BaseRedisListDataCache init( Integer size) { + this.size = size; + return this; + } + + + public void addToList(String key, Serializable value) { + // 将新值添加到List中 + redisTemplate.opsForList().rightPush(key, value); + + // 如果List长度超过设定值,则淘汰最早的元素 + if (redisTemplate.opsForList().size(key) > size) { + redisTemplate.opsForList().leftPop(key); + } + } + + public List getList(String key) { + return redisTemplate.opsForList().range(key, 0, -1); + } + + + public void setListExpiration(String key, Duration duration) { + redisTemplate.expire(key, duration); + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/HeartBeatMessageHandler.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/HeartBeatMessageHandler.java new file mode 100644 index 00000000..5ea0ec79 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/HeartBeatMessageHandler.java @@ -0,0 +1,62 @@ +package com.xueyi.system.emcs.service; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.mqtt.service.MqttMessageHandler; +import com.xueyi.common.redis.service.RedisService; +import com.xueyi.common.web.utils.DateUtils; +import com.xueyi.system.emcs.domain.dto.RedisBaseDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author yk + * @description + * @date 2023-05-10 19:08 + */ +@Service +public class HeartBeatMessageHandler implements MqttMessageHandler { + + @Autowired + private RedisService redis; + + private final static String HEART_MQTT_PREFIX = "digital-man"; + private final static Integer REDIS_LIST_SIZE = 60; + + @Autowired + private BaseRedisListDataCache baseRedisListDataCache; + @Override + public void handleMessage(String topic, String message) throws Exception{ + System.err.println("HeartBeatMessageHandler: " + message); + + JSONObject heartBeatObj = JSONObject.parseObject(message); + String devId = heartBeatObj.getString("devId"); + String timestamp = heartBeatObj.getString("timestamp"); + String network = heartBeatObj.getString("wifi_rssi"); + String cpu_max = heartBeatObj.getString("cpuinfo_max_freq"); + String cpu_scaling = heartBeatObj.getString("scaling_cur_freq"); + String cpu = Double.valueOf(cpu_scaling) / Double.valueOf(cpu_max) * 100 + ""; + String memory_cur = heartBeatObj.getString("memory_total"); +// String memoryTotal = heartBeatObj.getString("MemTotal").substring(0,heartBeatObj.getString("MemTotal").length() - 2); + String memoryTotal = heartBeatObj.getString("memory_total"); + Double memoryFree = Double.valueOf(heartBeatObj.getString("memory_free")); + String memory = (Double.valueOf(memoryTotal) - memoryFree) / Double.valueOf(memoryTotal) * 100 + ""; + String occurTime = ""; + + occurTime = DateUtils.formatDate(DateUtils.parseLongToDate(timestamp),"HH:mm"); + + + if (StringUtils.isNotEmpty(devId)) { + if (StringUtils.isNotEmpty(network)){ + baseRedisListDataCache.init (REDIS_LIST_SIZE).addToList(HEART_MQTT_PREFIX+":"+devId+":network", new RedisBaseDto(occurTime, network)); + } + if (StringUtils.isNotEmpty(cpu)) { + baseRedisListDataCache.init(REDIS_LIST_SIZE).addToList(HEART_MQTT_PREFIX + ":" + devId + ":cpu", new RedisBaseDto(occurTime, cpu)); + } + if (StringUtils.isNotEmpty(memory)) { + baseRedisListDataCache.init(REDIS_LIST_SIZE).addToList(HEART_MQTT_PREFIX + ":" + devId + ":memory", new RedisBaseDto(occurTime, memory)); + } + } + System.err.println(heartBeatObj.toJSONString()); + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/IDmDeviceLogFileService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/IDmDeviceLogFileService.java new file mode 100644 index 00000000..e2320932 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/IDmDeviceLogFileService.java @@ -0,0 +1,13 @@ +package com.xueyi.system.emcs.service; + +import com.xueyi.system.emcs.domain.query.DmDeviceLogFileQuery; +import com.xueyi.system.emcs.domain.dto.DmDeviceLogFileDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * 日志文件信息记录管理 服务层 + * + * @author xueyi + */ +public interface IDmDeviceLogFileService extends IBaseService { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/IDmExceptionLogService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/IDmExceptionLogService.java new file mode 100644 index 00000000..6e22c8bc --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/IDmExceptionLogService.java @@ -0,0 +1,20 @@ +package com.xueyi.system.emcs.service; + +import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.common.web.entity.service.IBaseService; + +import java.util.List; + +/** + * 数字人状态事件上报日志管理 服务层 + * + * @author xueyi + */ +public interface IDmExceptionLogService extends IBaseService { + + // 获取某一时间段的数据集合 + List selectListRangeByCreateTime(String start,String end); + + List selectListRangeByCreateTimeAndDevId(String start,String end,String devId); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/LogMqttMessageHandler.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/LogMqttMessageHandler.java new file mode 100644 index 00000000..f84b130b --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/LogMqttMessageHandler.java @@ -0,0 +1,38 @@ +package com.xueyi.system.emcs.service; + +import com.xueyi.common.mqtt.service.MqttMessageHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author yk + * @description + * @date 2023-05-10 19:08 + */ +@Service +public class LogMqttMessageHandler implements MqttMessageHandler { + + private final static List TOPICS = List.of("/digital_man/heart_beat", "/digital_man/log_upload_notification"); + + @Autowired + private HeartBeatMessageHandler heartBeatMessageHandler; + + @Autowired + private LogUploadMessageHandler logUploadMessageHandler; + + @Override + public void handleMessage(String topic, String message) throws Exception{ + // 处理消息的业务逻辑 + System.out.println("收到主题:" + topic + ",消息内:" + message); + + if (TOPICS.contains(topic)){ + if (topic.equalsIgnoreCase("/digital_man/log_upload_notification")){ + logUploadMessageHandler.handleMessage(topic, message); + } else if (topic.equalsIgnoreCase("/digital_man/heart_beat")){ + heartBeatMessageHandler.handleMessage(topic, message); + } + } + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/LogUploadMessageHandler.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/LogUploadMessageHandler.java new file mode 100644 index 00000000..ddaf2b02 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/LogUploadMessageHandler.java @@ -0,0 +1,87 @@ +package com.xueyi.system.emcs.service; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xueyi.common.core.constant.basic.SqlConstants; +import com.xueyi.common.mqtt.service.MqttMessageHandler; +import com.xueyi.common.web.utils.DateUtils; +import com.xueyi.system.api.digitalmans.domain.po.DmManDevicePo; +import com.xueyi.system.digitalmans.mapper.DmManDeviceMapper; +import com.xueyi.system.emcs.constant.EmcsUploadType; +import com.xueyi.system.emcs.domain.dto.DmDeviceLogFileDto; +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.system.emcs.mapper.DmDeviceLogFileMapper; +import com.xueyi.system.emcs.mapper.DmExceptionLogMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.ParseException; + +/** + * + * @author yk + * @description 处理订阅到的mqtt设备异常记录 + * @date 2023-05-10 19:08 + */ +@Service +public class LogUploadMessageHandler implements MqttMessageHandler { + + @Autowired + private DmManDeviceMapper manDeviceMapper; + + @Autowired + private DmExceptionLogMapper exceptionLogMapper; + + @Autowired + private DmDeviceLogFileMapper deviceLogFileMapper; + + @Override + public void handleMessage(String topic, String message) { + System.out.println("发送日志到主题:" + topic + ",消息:" + message); + JSONObject heartBeatObj = JSONObject.parseObject(message); + String devId = heartBeatObj.getString("devId"); + String timestamp = heartBeatObj.getString("timestamp"); + String fileName = heartBeatObj.getString("file_name"); + String path = heartBeatObj.getString("path"); + String type = heartBeatObj.getString("type"); + Integer level = heartBeatObj.getInteger("level"); + Integer uploadType = heartBeatObj.getInteger("upload_type"); + + + DmExceptionLogDto exceptionLogDto = new DmExceptionLogDto(); + exceptionLogDto.setType(type); + exceptionLogDto.setLevel(level); + exceptionLogDto.setDevId(devId); + + DmManDevicePo devicePo = manDeviceMapper.selectOne(Wrappers.lambdaQuery().eq(DmManDevicePo::getDeviceId, devId).last(SqlConstants.LIMIT_ONE)); + try { + if (null!= devicePo) { + exceptionLogDto.setManCode(devicePo.getManCode()); + exceptionLogDto.setTId(devicePo.getTId()); + + exceptionLogDto.setOccurTime(DateUtils.dateToLocalDateTime(DateUtils.parseLongToDate(timestamp))); + // 上传类型为崩溃上传时,插入异常日志 + if (uploadType == EmcsUploadType.getTypeCrackUpload()) { + exceptionLogMapper.insert(exceptionLogDto); + } + + //DmExceptionLogDto 持久化 + DmDeviceLogFileDto deviceLogFileDto = new DmDeviceLogFileDto(); + deviceLogFileDto.setManDeviceId(devicePo.getId()); + deviceLogFileDto.setUrl(path); + deviceLogFileDto.setType(uploadType); + deviceLogFileDto.setName(fileName); + + deviceLogFileMapper.insert(deviceLogFileDto); + + } else { + return; + } + } catch (ParseException e) { + throw new RuntimeException(e); + } + + + + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/impl/DmDeviceLogFileServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/impl/DmDeviceLogFileServiceImpl.java new file mode 100644 index 00000000..dea34672 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/impl/DmDeviceLogFileServiceImpl.java @@ -0,0 +1,32 @@ +package com.xueyi.system.emcs.service.impl; + +import com.xueyi.system.emcs.domain.dto.DmDeviceLogFileDto; +import com.xueyi.system.emcs.domain.query.DmDeviceLogFileQuery; +import com.xueyi.system.emcs.service.IDmDeviceLogFileService; +import com.xueyi.system.emcs.manager.IDmDeviceLogFileManager; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 日志文件信息记录管理 服务层处理 + * + * @author xueyi + */ +@Service +public class DmDeviceLogFileServiceImpl extends BaseServiceImpl implements IDmDeviceLogFileService { + + /** + * 查询日志文件信息记录对象列表 | 数据权限 + * + * @param deviceLogFile 日志文件信息记录对象 + * @return 日志文件信息记录对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmDeviceLogFileMapper"}) + public List selectListScope(DmDeviceLogFileQuery deviceLogFile) { + return baseManager.selectList(deviceLogFile); + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/impl/DmExceptionLogServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/impl/DmExceptionLogServiceImpl.java new file mode 100644 index 00000000..e11bb274 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/emcs/service/impl/DmExceptionLogServiceImpl.java @@ -0,0 +1,54 @@ +package com.xueyi.system.emcs.service.impl; + +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; +import com.xueyi.system.emcs.domain.dto.DmExceptionLogDto; +import com.xueyi.system.emcs.domain.query.DmExceptionLogQuery; +import com.xueyi.system.emcs.manager.IDmExceptionLogManager; +import com.xueyi.system.emcs.service.IDmExceptionLogService; +import com.xueyi.system.organize.service.ISysEnterpriseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 数字人状态事件上报日志管理 服务层处理 + * + * @author xueyi + */ +@Service +public class DmExceptionLogServiceImpl extends BaseServiceImpl implements IDmExceptionLogService { + + @Autowired + private ISysEnterpriseService enterpriseService; + /** + * 查询数字人状态事件上报日志对象列表 | 数据权限 + * + * @param exceptionLog 数字人状态事件上报日志对象 + * @return 数字人状态事件上报日志对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmExceptionLogMapper"}) + public List selectListScope(DmExceptionLogQuery exceptionLog) { + List exceptionLogDtos = baseManager.selectList(exceptionLog); + exceptionLogDtos.forEach(dto->{ + Long tId = dto.getTId(); + if (tId!= null) { + SysEnterpriseDto enterpriseDto = enterpriseService.selectById(tId); + dto.setTenantName(enterpriseDto.getName()); + } + }); + return exceptionLogDtos; + } + + @Override + public List selectListRangeByCreateTime(String start,String end) { + return super.baseManager.selectListRangeByCreateTime(start,end); + } + + @Override + public List selectListRangeByCreateTimeAndDevId(String start, String end, String devId) { + return super.baseManager.selectListRangeByCreateTimeAndDevId(start, end, devId); + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/intercepts/EntityInterceptor.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/intercepts/EntityInterceptor.java index 1b0dbad3..fca70bd1 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/intercepts/EntityInterceptor.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/intercepts/EntityInterceptor.java @@ -9,6 +9,7 @@ import com.xueyi.system.api.digitalmans.domain.po.DmModelPo; import com.xueyi.system.api.digitalmans.domain.po.DmSkillPo; import com.xueyi.system.api.staff.domain.po.DmStaffPo; import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanPo; +import com.xueyi.system.resource.domain.po.DmH5ConfigPo; import org.apache.ibatis.binding.MapperMethod; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.MappedStatement; @@ -16,6 +17,8 @@ import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Signature; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -35,7 +38,11 @@ import java.util.Date; MappedStatement.class, Object.class }) -}) +, @Signature(method = "query", type = Executor.class, args = { + MappedStatement.class, Object.class, + RowBounds.class, ResultHandler.class + })} +) public class EntityInterceptor implements Interceptor { private static final Logger LOGGER = LoggerFactory.getLogger(EntityInterceptor.class); @Autowired @@ -108,7 +115,10 @@ public class EntityInterceptor implements Interceptor { if (null!=paramObject && paramObject instanceof DmDigitalmanWorktimePo) { redisTemplate.opsForValue().set("group:dgman:" + enterpriseId +":" + MessageConstants.MODEL_SYNC,String.valueOf(currentTime)); } - + if (null!=paramObject && paramObject instanceof DmH5ConfigPo) { + DmH5ConfigPo po = (DmH5ConfigPo)paramObject; + redisTemplate.opsForValue().set("group:dgman:" + po.getEnterpriseId() +":" + MessageConstants.H5_CONFIG_SYNC,String.valueOf(currentTime)); + } return invocation.proceed(); } diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/controller/api/DmMeetingApiController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/controller/api/DmMeetingApiController.java index 1f841570..23ed9bd0 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/controller/api/DmMeetingApiController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/controller/api/DmMeetingApiController.java @@ -14,7 +14,10 @@ import com.xueyi.system.api.pass.domain.dto.DmRecognizedRecordsDto; import com.xueyi.system.api.pass.feign.RemoteRecognizedRecordsService; import com.xueyi.system.resource.controller.api.BaseApiController; import com.xueyi.system.utils.common.ImageUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -37,6 +40,7 @@ import java.util.List; @RequestMapping("/meeting/api") public class DmMeetingApiController extends BaseApiController { + private static final Logger log = LoggerFactory.getLogger(DmMeetingApiController.class); @Autowired private RemoteMeetingService remoteMeetingService; @@ -46,6 +50,9 @@ public class DmMeetingApiController extends BaseApiController { @Autowired private SmsService smsService; + @Autowired + private StringRedisTemplate redisTemplate; + @GetMapping(value = "/room-lists/{devId}") public List roomList(@PathVariable(value = "devId") String devId){ DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); @@ -91,6 +98,15 @@ public class DmMeetingApiController extends BaseApiController { return remoteMeetingService.delInner(id, vo.getTenantId(),vo.getSourceSlave(), SecurityConstants.INNER); } + @ResponseBody + @PostMapping(value = "/cancel-order") + public JSONObject cancel(@RequestParam(required = true) String devId) { +// redisTemplate.delete("group:websocket" + ":" + devId); + redisTemplate.delete("group:device" + ":" + devId + ":" +"session"); + log.info("取消预约,删除redis缓存"); + return outputSuccess().toJSON(); + } + @ResponseBody @PostMapping(value = "/lists") public JSONObject list(String dateStr, Long spaceId, String devId) { @@ -99,6 +115,14 @@ public class DmMeetingApiController extends BaseApiController { return remoteMeetingService.listsInner(dateStr, spaceId, vo.getTenantId(),vo.getSourceSlave(),SecurityConstants.INNER); } + @ResponseBody + @GetMapping(value = "/lists/{devId}") + public JSONObject listAll(@PathVariable(required = true) String devId) { + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); + + return remoteMeetingService.listsAllInner(vo.getTenantId(),vo.getSourceSlave(),SecurityConstants.INNER); + } + @ResponseBody @PostMapping(value = "/date-lists") @@ -108,6 +132,15 @@ public class DmMeetingApiController extends BaseApiController { return remoteMeetingService.listsByDate(dateStr, vo.getTenantId(),vo.getSourceSlave(),SecurityConstants.INNER); } + + @ResponseBody + @PostMapping(value = "/lists-all") + public JSONObject listAfter(String dateStr, Long spaceId, String devId) { + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); + + return remoteMeetingService.listAllInner(dateStr, spaceId, vo.getTenantId(),vo.getSourceSlave(),SecurityConstants.INNER); + } + @Autowired private RemoteRecognizedRecordsService recognizedRecordsService; @@ -124,4 +157,48 @@ public class DmMeetingApiController extends BaseApiController { return ImageUtil.urlImageToBase64(url); } + + + @GetMapping(value = "/recent/{devId}/{dateStr}") + @ResponseBody + public R> ableOrderList(@PathVariable(value = "devId") String devId, @PathVariable(value = "dateStr") String dateStr, @RequestParam(value = "roomId", required = false) Long roomId, @RequestParam(value = "startTime", required = false) String startTime) { + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); + + R extR = digitalmanService.selectExtByDeviceId(devId, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + DmDigitalmanExtPo extPo = null; + if (null != extR) { + extPo = extR.getData(); + } + if (extPo != null) { + List result = remoteMeetingService.recent(extPo.getDeptId(), dateStr, roomId, startTime, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + return R.ok(result); + } else { + return R.fail("未找到设备信息"); + } + } + @GetMapping(value = "/recent/{devId}") + @ResponseBody + public R> ableOrderList(@PathVariable(value = "devId") String devId){ + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); + + R extR = digitalmanService.selectExtByDeviceId(devId,vo.getTenantId(),vo.getSourceSlave(), SecurityConstants.INNER); + DmDigitalmanExtPo extPo = null; + if (null != extR) { + extPo = extR.getData(); + } + if (extPo != null) { + List result = remoteMeetingService.recent(extPo.getDeptId(), vo.getTenantId(),vo.getSourceSlave(), SecurityConstants.INNER); + return R.ok(result); + } else { + return R.fail("未找到设备信息"); + } + } + + @ResponseBody + @GetMapping(value = "/enableOrder/{devId}") + public JSONObject queryExist(@PathVariable(value = "devId") String devId, Long roomId, String dateStr, String startTime) { + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); + + return remoteMeetingService.queryExist(roomId, dateStr, startTime, vo.getTenantId(),vo.getSourceSlave(), SecurityConstants.INNER); + } } diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/controller/api/DmMeetingInnerApiController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/controller/api/DmMeetingInnerApiController.java index 16e25c1c..558cf1a1 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/controller/api/DmMeetingInnerApiController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/controller/api/DmMeetingInnerApiController.java @@ -4,18 +4,33 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xueyi.common.cache.utils.SourceUtil; +import com.xueyi.common.core.constant.basic.SecurityConstants; +import com.xueyi.common.core.constant.basic.SqlConstants; +import com.xueyi.common.core.utils.core.ObjectUtil; import com.xueyi.common.core.web.result.R; import com.xueyi.common.security.annotation.InnerAuth; import com.xueyi.common.sms.configure.SmsProperties; import com.xueyi.common.web.constant.ResponseCode; import com.xueyi.common.web.utils.DateUtils; +import com.xueyi.nlt.api.netty.domain.vo.DmWebSocketMessageVo; +import com.xueyi.nlt.api.netty.feign.RemoteWebsocketService; +import com.xueyi.nlt.api.nlt.feign.RemoteIntentService; +import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanExtPo; +import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanPo; +import com.xueyi.system.api.digitalmans.feign.RemoteManDeviceService; import com.xueyi.system.api.meeting.domain.dto.DmMeetingOrdersDto; import com.xueyi.system.api.meeting.domain.dto.DmMeetingRoomsDto; import com.xueyi.system.api.meeting.domain.po.DmMeetingOrdersPo; import com.xueyi.system.api.meeting.domain.po.DmMeetingRoomsPo; +import com.xueyi.system.api.model.Source; import com.xueyi.system.api.sms.domain.vo.SmsReqEntity; import com.xueyi.system.api.sms.feign.RemoteSmsService; import com.xueyi.system.api.staff.domain.po.DmStaffPo; +import com.xueyi.system.digitalmans.mapper.DmDigitalmanExtMapper; +import com.xueyi.system.digitalmans.mapper.DmDigitalmanMapper; import com.xueyi.system.meeting.domain.model.DmMeetingOrdersConverter; import com.xueyi.system.meeting.domain.model.DmMeetingRoomsConverter; import com.xueyi.system.meeting.mapper.DmMeetingOrdersMapper; @@ -24,19 +39,30 @@ import com.xueyi.system.meeting.service.impl.DmMeetingOrdersServiceImpl; import com.xueyi.system.meeting.service.impl.DmMeetingRoomsServiceImpl; import com.xueyi.system.resource.controller.api.BaseApiController; import com.xueyi.system.staff.mapper.DmStaffMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; 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.RequestMapping; 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.HttpServletRequest; import java.text.SimpleDateFormat; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Comparator; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 会议室预约管理 API @@ -47,6 +73,7 @@ import java.util.List; @RequestMapping("/meeting/inner-api") public class DmMeetingInnerApiController extends BaseApiController { + private static final Logger log = LoggerFactory.getLogger(DmMeetingInnerApiController.class); @Autowired private DmMeetingRoomsMapper dmMeetingRoomsMapper; @@ -70,10 +97,27 @@ public class DmMeetingInnerApiController extends BaseApiController { @Autowired private RemoteSmsService remoteSmsService; + @Autowired + private DmDigitalmanMapper digitalmanMapper; + + @Autowired + private DmDigitalmanExtMapper digitalmanExtMapper; + @Autowired private DmMeetingRoomsConverter dmMeetingRoomsConverter; + @Autowired + private StringRedisTemplate redisTemplate; + + @Autowired + private RemoteWebsocketService remoteWebsocketService; + + @Autowired + private RemoteIntentService remoteIntentService; + @Autowired + private RemoteManDeviceService manDeviceService; + @InnerAuth @GetMapping("/rooms/{deptId}") @@ -93,6 +137,7 @@ public class DmMeetingInnerApiController extends BaseApiController { @InnerAuth @PostMapping(value = "/save") public JSONObject saveInner(@RequestBody DmMeetingOrdersDto order, HttpServletRequest request) { + log.info("saveInner order:{}", order); String orderData = order.getOrderData(); JSONArray jsonArray = JSONArray.parseArray(orderData); if (jsonArray.isEmpty()) { @@ -102,6 +147,11 @@ public class DmMeetingInnerApiController extends BaseApiController { StringBuilder mms = new StringBuilder(); SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat dateFormat2 = new SimpleDateFormat("HH:mm"); + + DmMeetingRoomsPo meetingRoom = dmMeetingRoomsService.selectById(order.getSpaceId().toString()); + if (null == meetingRoom){ + return output(ResponseCode.ILLEGAL_PARAMETER, "spaceId").toJSON(); + } for (Object js : jsonArray) { JSONObject temp = (JSONObject) js; String date = temp.getString("date"); @@ -135,8 +185,8 @@ public class DmMeetingInnerApiController extends BaseApiController { } dmMeetingOrdersMapper.insertBatch(list); - DmMeetingRoomsPo meetingRoom = dmMeetingRoomsService.selectById(order.getSpaceId().toString()); - mms.append(mms.substring(0, mms.length() - 1) + "于" + meetingRoom.getName()); + + String mms2 = mms.substring(0, mms.length() - 1) + "于" + meetingRoom.getName(); DmStaffPo dmStaffPo = dmStaffMapper.selectById(order.getOrderBy()); SmsReqEntity send = new SmsReqEntity(); @@ -145,17 +195,74 @@ public class DmMeetingInnerApiController extends BaseApiController { send.setPhone(dmStaffPo.getPhone()); send.setTemplate(smsProperties.getMeetingOrderTemplate()); JSONObject jsonObject = new JSONObject(); - jsonObject.put("dateStr", mms); + jsonObject.put("dateStr", mms2); jsonObject.put("name", dmStaffPo.getUserName()); //TODO. 发送短信 后期需要获取数字人昵称 - jsonObject.put("robotName", smsProperties.getRobotName()); + + DmDigitalmanPo dmDigitalmanPo = digitalmanMapper.selectByCode(digitalmanExtMapper.selectOne(Wrappers.query().lambda().eq(DmDigitalmanExtPo::getDeviceId, order.getDevId()).last(SqlConstants.LIMIT_ONE)).getManCode()); + if (null!= dmDigitalmanPo && StringUtils.isNotEmpty(dmDigitalmanPo.getName())) { + jsonObject.put("robotName", dmDigitalmanPo.getName()); + } else { + jsonObject.put("robotName", smsProperties.getRobotName()); + } + send.setDataMap(jsonObject.toJSONString()); remoteSmsService.sendSms(send); } } catch (Exception e) { + System.err.println(e.getMessage()); e.printStackTrace(); } + // 埋点 预定会议室 + redisTemplate.opsForValue().increment("dashboard:meeting", 1); + // 创建会议提醒 + // 创建json + JSONObject jsonObject = new JSONObject(); + jsonObject.put("meetingRoom", meetingRoom.getName()); + jsonObject.put("orderName", dmStaffPo.getUserName()); + jsonObject.put("orderId", dmStaffPo.getId()); + jsonObject.put("timestamp", list.get(0).getStartTime().getTime()); +// redisTemplate.opsForValue().set("group:nlp" + ":" + dmStaffPo.getId() + ":" + "meeting",jsonObject.toString()); + // 将创建临时信息添加进缓存:用户会议提醒 + + DmWebSocketMessageVo vo = new DmWebSocketMessageVo(); + vo.setDevId(order.getDevId()); + vo.setSkillCode("1"); + vo.setFormat(jsonObject); + R manDeviceDtoR = manDeviceService.manDeviceInfoInner(order.getDevId()); + Source source = SourceUtil.getSourceCache(manDeviceDtoR.getData().getStrategyId()); + remoteIntentService.sendMessage(vo, manDeviceDtoR.getData().getTId(), source.getMaster(), SecurityConstants.INNER); + // 清除设备会议室模版session信息 + redisTemplate.delete("group:websocket" + ":" + order.getDevId()); + redisTemplate.delete("group:device" + ":" + order.getDevId() + ":" +"session"); + return outputSuccess().toJSON(); + } + + + @InnerAuth + @GetMapping(value = "/enableOrder/{roomId}/{dateStr}/{startTime}") + public JSONObject queryExist(@PathVariable(name = "roomId") Long roomId, @PathVariable(name = "dateStr") String dateStr, @PathVariable(name = "startTime") String startTime) { + log.info("dateStr:{}", dateStr); + log.info("startTime:{}", startTime); + DmMeetingRoomsPo room = dmMeetingRoomsMapper.findById(roomId); + if (null == room) { + return output(ResponseCode.DATA_NOT_EXISTS, "会议室").toJSON(); + } + if (DateUtils.formatDate(new Date(), "yyyy-MM-dd").compareTo(dateStr) > 0) { + return output(ResponseCode.MEETING_ORDER_TIME_ERROR).toJSON(); + } + if (StringUtils.isEmpty(startTime)) { + return output(ResponseCode.MEETING_ORDER_TIME_ERROR).toJSON(); + } + String sTime = startTime,eTime = ""; + Date end = DateUtils.addMinutes(DateUtils.parseStrToDate(dateStr + " " + startTime, "yyyy-MM-dd HH:mm"), 30); + eTime = DateUtils.formatDate(end, "HH:mm"); + + List lists = dmMeetingOrdersMapper.queryByOrder(roomId, dateStr, sTime, eTime); + if (lists.size() > 0) { + return output(ResponseCode.MEETING_ORDER_TIME_ERROR).toJSON(); + } return outputSuccess().toJSON(); } @@ -222,12 +329,13 @@ public class DmMeetingInnerApiController extends BaseApiController { List list = dmMeetingOrdersMapper.findListByDateStr(dateStr); List res = new ArrayList<>(); list.forEach(item -> { - DmMeetingOrdersDto dto = dmMeetingOrdersConverter.mapperDto(item); - DmMeetingRoomsPo mr = dmMeetingRoomsMapper.findById(item.getSpaceId()); - dto.setRoomName(mr.getName()); - dmMeetingOrdersService.fixColumns(dto); - res.add(dto); + if (null != mr) { + DmMeetingOrdersDto dto = dmMeetingOrdersConverter.mapperDto(item); + dto.setRoomName(mr.getName()); + dmMeetingOrdersService.fixColumns(dto); + res.add(dto); + } }); return outputSuccess(res).toJSON(); } @@ -246,4 +354,312 @@ public class DmMeetingInnerApiController extends BaseApiController { return outputSuccess(res).toJSON(); } + @InnerAuth + @PostMapping(value = "/lists-all") + public JSONObject listAllInner(@RequestParam("dateStr") String dateStr, @RequestParam("spaceId") Long spaceId) { + String date = dateStr.substring(0, 10); + String time = dateStr.substring(11); + System.err.println("date:"+date+"; time:"+time+";spaceId:"+spaceId); + List list = dmMeetingOrdersMapper.findAllListByDate(date,time, spaceId); + List res = new ArrayList<>(); + list.forEach(item -> { + DmMeetingOrdersDto dto = dmMeetingOrdersConverter.mapperDto(item); + dmMeetingOrdersService.fixColumns(dto); + res.add(dto); + }); + return outputSuccess(res).toJSON(); + } + + @InnerAuth + @GetMapping(value = "/lists") + public JSONObject listAllInner() { + List list = dmMeetingOrdersMapper.findAllList(); + List res = new ArrayList<>(); + list.forEach(item -> { + DmMeetingOrdersDto dto = dmMeetingOrdersConverter.mapperDto(item); + DmMeetingRoomsPo mr = dmMeetingRoomsMapper.findById(dto.getSpaceId()); + dto.setRoomName(mr.getName()); + dmMeetingOrdersService.fixColumns(dto); + res.add(dto); + }); + return outputSuccess(res).toJSON(); + } + + /* + * 获取会议室最近的可用时间段 + * @Author yangkai + * @Description //TODO + * @Date 2023/9/1 + * @Param [roomId, objects, currentTime] + * @return java.util.List + **/ + List freeTimePart (Long roomId, List objects, String currentTime) { + List freeTimeList = new ArrayList<>(); + + if (null == objects || objects.size() ==0) { + JSONObject json = new JSONObject(); + json.put("startTime", currentTime); + json.put("endTime", 0); + json.put("roomId", roomId); + freeTimeList.add(json); + return freeTimeList; + } + if (objects.size() ==1) { + DmMeetingOrdersPo current = objects.get(0); + if (DateUtils.formatDate(current.getStartTime(), "HH:mm").compareTo(currentTime) > 0 ) { + JSONObject json = new JSONObject(); + json.put("startTime", currentTime); + json.put("endTime", DateUtils.formatDate(current.getStartTime(), "HH:mm")); + json.put("roomId", roomId); + freeTimeList.add(json); + } else { + if (DateUtils.formatDate(current.getEndTime(), "HH:mm").compareTo(currentTime) > 0 ) { + JSONObject json = new JSONObject(); + json.put("startTime", DateUtils.formatDate(current.getEndTime(), "HH:mm")); + json.put("endTime", 0); + json.put("roomId", roomId); + freeTimeList.add(json); + } else { + JSONObject json = new JSONObject(); + json.put("startTime", currentTime); + json.put("endTime", 0); + json.put("roomId", roomId); + freeTimeList.add(json); + } + + } + return freeTimeList; + } +// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + objects = objects.stream().sorted(Comparator.comparing(po -> DateUtils.formatDate(po.getStartTime(), "HH:mm"))).collect(Collectors.toList()); + for (int i = 0; i < objects.size() - 1; i++) { + DmMeetingOrdersPo current = objects.get(i); + DmMeetingOrdersPo next = objects.get(i + 1); + + Date freeStartTime = current.getEndTime(); + Date freeEndTime = next.getStartTime(); + + String freeStartTimeStr = DateUtils.formatDate(current.getEndTime(), "HH:mm"); + String freeEndTimeStr = DateUtils.formatDate(next.getStartTime(), "HH:mm"); + + if (DateUtils.formatDate(current.getStartTime(), "HH:mm").compareTo(currentTime) < 0) { + if (i==objects.size() - 2) { + JSONObject json = new JSONObject(); + if (DateUtils.formatDate(next.getEndTime(), "HH:mm").compareTo(currentTime)>0) { + json.put("startTime", DateUtils.formatDate(next.getEndTime(), "HH:mm")); + } else { + json.put("startTime", currentTime); + } + json.put("endTime", 0); + json.put("roomId", current.getSpaceId()); + freeTimeList.add(json); + } + continue; + } + + if (i==0 && DateUtils.formatDate(current.getStartTime(), "HH:mm").compareTo(currentTime) > 0 ) { + JSONObject json = new JSONObject(); + json.put("startTime", currentTime); + json.put("endTime", DateUtils.formatDate(current.getStartTime(), "HH:mm")); + json.put("roomId", roomId); + freeTimeList.add(json); + } + + if (freeStartTime.before(freeEndTime)) { + JSONObject json = new JSONObject(); + json.put("startTime", freeStartTimeStr); + json.put("endTime", freeEndTimeStr); + json.put("roomId", roomId); + freeTimeList.add(json); + } + + if (i==objects.size() - 2) { + JSONObject json = new JSONObject(); + if (DateUtils.formatDate(next.getEndTime(), "HH:mm").compareTo(currentTime)>0) { + json.put("startTime", DateUtils.formatDate(next.getEndTime(), "HH:mm")); + } else { + json.put("startTime", currentTime); + } + json.put("endTime", 0); + json.put("roomId", current.getSpaceId()); + freeTimeList.add(json); + } + } + log.info("===============freeTimePart==============111"); + log.info("roomId:{},currentStr:{}, freeTimeList:{}",roomId,currentTime, freeTimeList); + log.info("===============freeTimePart==============222"); + return freeTimeList; + } + + + JSONObject getList(String currentStr, Map> groupedByRoom, Map rooms, Map sorts, List ids){ + Map> freeTime = new HashMap<>(); + log.info("currentStr:{}", currentStr); + for(int i=0;i arr = new ArrayList<>(); + for (int i=0;i value = freeTime.get(key); + arr.addAll(value); + } + Map finalRooms = rooms; + Map finalSorts = sorts; + arr = arr.stream().map(j->{j.put("roomName", finalRooms.get(j.getLong("roomId")));j.put("sort", finalSorts.get(j.getLong("roomId")));return j;}).sorted(Comparator.comparing(po -> po.getString("startTime"))).collect(Collectors.toList()); + List arr2 = new ArrayList<>(); + for (int i=0;i0 ? arr2.stream().sorted(Comparator.comparing(po -> po.getInteger("sort"))).collect(Collectors.toList()).get(0) : null; + } + + @InnerAuth + @GetMapping("/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, HttpServletRequest request) { + + List list = new ArrayList<>(); + List ids = new ArrayList<>(); + Map rooms = new HashMap<>(); + if (null == roomId) { + DmMeetingRoomsPo dm = new DmMeetingRoomsPo(); + dm.setDeptId(deptId); + List pos = dmMeetingRoomsMapper.selectRoomList(dm); + ids = pos.stream().map(DmMeetingRoomsPo::getId).collect(Collectors.toList()); + rooms = pos.stream().collect(Collectors.toMap(DmMeetingRoomsPo::getId, DmMeetingRoomsPo::getName)); + list = dmMeetingOrdersMapper.findListByDateStr(dateStr); + } else { + DmMeetingRoomsPo po = dmMeetingRoomsMapper.findById(roomId); + list = dmMeetingOrdersMapper.findListByDate(dateStr, po.getId()); + ids.add(roomId); + rooms.put(po.getId(), po.getName()); + } + + + //过滤掉今天的已经过去的预约记录,并按开始时间进行排序 + list = list.stream().filter(t->DateUtils.formatDate(t.getOrderDate(), "yyyy-MM-dd").compareTo(DateUtils.formatDate(new Date(), "yyyy-MM-dd"))>0 || (DateUtils.formatDate(t.getOrderDate(), "yyyy-MM-dd").compareTo(DateUtils.formatDate(new Date(), "yyyy-MM-dd"))==0 && DateUtils.formatDate(t.getStartTime(), "HH:mm").compareTo(DateUtils.formatDate(new Date(), "HH:mm"))>0)).sorted(Comparator.comparing(po -> DateUtils.formatDate(po.getStartTime(), "HH:mm"))).collect(Collectors.toList()); + + + //获得当前时间开始最近的整点,或者半点 + String currentStr = "08:00"; + if (StringUtils.isNotEmpty(startTime)) { + currentStr = startTime; + } + + if (dateStr.compareTo(DateUtils.formatDate(new Date(), "yyyy-MM-dd")) == 0) { + LocalTime currentTime = LocalTime.now(); + if (currentTime.getMinute() >= 30) { + currentTime = currentTime.plusHours(1).withMinute(0).withSecond(0); + } else { + currentTime = currentTime.withMinute(30).withSecond(0); + } + + currentStr = currentTime.format(DateTimeFormatter.ofPattern("HH:mm")); + } + + Map> groupedByRoom = list.stream() + .collect(Collectors.groupingBy(DmMeetingOrdersPo::getSpaceId)); + + Map> freeTime = new HashMap<>(); + + for(int i=0;i arr = new ArrayList<>(); + for (int i=0;i value = freeTime.get(key); + arr.addAll(freeTime.get(key)); + } + Map finalRooms = rooms; + arr = arr.stream().map(j->{j.put("roomName", finalRooms.get(j.getLong("roomId")));return j;}).sorted(Comparator.comparing(po -> po.getString("startTime"))).collect(Collectors.toList()); + return arr; + } + + @Autowired + private DmMeetingOrdersServiceImpl ordersService; + + @InnerAuth + @GetMapping("/recent/{deptId}") + @ResponseBody + public List recent(@PathVariable(value = "deptId") Long deptId) { + + List list = new ArrayList<>(); + List ids = new ArrayList<>(); + Map rooms = new HashMap<>(); + Map sorts = new HashMap<>(); + //当天 + String dateStr = DateUtils.formatDate(new Date(), "yyyy-MM-dd"); + + DmMeetingRoomsPo dm = new DmMeetingRoomsPo(); + dm.setDeptId(deptId); + List pos = dmMeetingRoomsMapper.selectRoomList(dm); + + ids = pos.stream().map(DmMeetingRoomsPo::getId).collect(Collectors.toList()); + rooms = pos.stream().collect(Collectors.toMap(DmMeetingRoomsPo::getId, DmMeetingRoomsPo::getName)); + sorts = pos.stream().collect(Collectors.toMap(DmMeetingRoomsPo::getId, DmMeetingRoomsPo::getSort)); + log.info("ids:" + ids); + + //获得当前时间开始最近的整点,或者半点 + String currentStr = "08:00"; + if (dateStr.compareTo(DateUtils.formatDate(new Date(), "yyyy-MM-dd")) == 0) { + LocalTime currentTime = LocalTime.now(); + if (currentTime.getMinute() >= 30) { + currentTime = currentTime.plusHours(1).withMinute(0).withSecond(0); + } else { + currentTime = currentTime.withMinute(30).withSecond(0); + } + currentStr = currentTime.format(DateTimeFormatter.ofPattern("HH:mm")); + } + + Map> groupedByRoom = ordersService.selectOrderedList(deptId,dateStr); + String nextDateStr = DateUtils.dateStrAdd(dateStr, 1); + Map> nextGroupedByRoom = ordersService.selectOrderedList(deptId,nextDateStr); + JSONObject js1 = getList(currentStr, groupedByRoom, rooms, sorts, ids); + JSONObject js2 = new JSONObject(); + JSONObject js3 = new JSONObject(); + if (DateUtils.isAmPm().equals("am")) { + currentStr = "14:00"; + js2 = getList(currentStr, groupedByRoom, rooms, sorts, ids); + currentStr = "09:00"; + js3 = getList(currentStr, nextGroupedByRoom, rooms, sorts, ids); + + } else { + currentStr = "09:00"; + js2 = getList(currentStr, nextGroupedByRoom, rooms, sorts, ids); + currentStr = "14:00"; + js3 = getList(currentStr, nextGroupedByRoom, rooms, sorts, ids); + } + List arr = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(js1)) { + js1.put("orderDate", dateStr); + arr.add(js1); + } + if (ObjectUtil.isNotEmpty(js2)) { + if (DateUtils.isAmPm().equals("am")) { + js2.put("orderDate", dateStr); + } else { + js2.put("orderDate", nextDateStr); + } + arr.add(js2); + } + if (ObjectUtil.isNotEmpty(js3)) { + js3.put("orderDate", nextDateStr); + arr.add(js3); + } + + return arr; + } + } diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/mapper/DmMeetingOrdersMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/mapper/DmMeetingOrdersMapper.java index b2d1fc64..779ac392 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/mapper/DmMeetingOrdersMapper.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/mapper/DmMeetingOrdersMapper.java @@ -21,5 +21,9 @@ public interface DmMeetingOrdersMapper extends BaseMapper findListByDate(@Param("orderDate") String orderDate, @Param("spaceId") Long spaceId); + List findAllListByDate(@Param("date") String date, @Param("time") String time, @Param("spaceId") Long spaceId); + + List findAllList(); + List findListByDateStr(@Param("orderDate") String orderDate); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/service/IDmMeetingOrdersService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/service/IDmMeetingOrdersService.java index cf97381c..0643690a 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/service/IDmMeetingOrdersService.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/service/IDmMeetingOrdersService.java @@ -6,6 +6,7 @@ import com.xueyi.system.api.meeting.domain.po.DmMeetingOrdersPo; import com.xueyi.system.meeting.domain.query.DmMeetingOrdersQuery; import java.util.List; +import java.util.Map; /** * 会议室预约管理 服务层 @@ -16,4 +17,6 @@ public interface IDmMeetingOrdersService extends IBaseService selectRoomList(DmMeetingOrdersPo query); void fixColumns(DmMeetingOrdersDto dto); + + Map> selectOrderedList(Long deptId, String dateStr); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/service/impl/DmMeetingOrdersServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/service/impl/DmMeetingOrdersServiceImpl.java index c21873d6..5ce2c6e5 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/service/impl/DmMeetingOrdersServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/meeting/service/impl/DmMeetingOrdersServiceImpl.java @@ -7,12 +7,19 @@ import com.xueyi.system.api.meeting.domain.po.DmMeetingOrdersPo; import com.xueyi.system.api.staff.domain.po.DmStaffPo; import com.xueyi.system.meeting.domain.query.DmMeetingOrdersQuery; import com.xueyi.system.meeting.manager.IDmMeetingOrdersManager; +import com.xueyi.system.meeting.mapper.DmMeetingOrdersMapper; +import com.xueyi.system.meeting.mapper.DmMeetingRoomsMapper; import com.xueyi.system.meeting.service.IDmMeetingOrdersService; import com.xueyi.system.staff.service.impl.DmStaffServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 会议室预约管理 服务层处理 @@ -52,4 +59,29 @@ public class DmMeetingOrdersServiceImpl extends BaseServiceImpl> selectOrderedList(Long deptId, String dateStr) { + List list = new ArrayList<>(); + //当天 + String curDateStr = DateUtils.formatDate(new Date(), "yyyy-MM-dd"); + list = dmMeetingOrdersMapper.findListByDateStr(dateStr); + + //过滤掉今天的已经过去的预约记录,并按开始时间进行排序 + if (curDateStr.equals(dateStr)) { + list = list.stream().filter(t->DateUtils.formatDate(t.getOrderDate(), "yyyy-MM-dd").compareTo(DateUtils.formatDate(new Date(), "yyyy-MM-dd"))>0 || (DateUtils.formatDate(t.getOrderDate(), "yyyy-MM-dd").compareTo(DateUtils.formatDate(new Date(), "yyyy-MM-dd"))==0 && DateUtils.formatDate(t.getStartTime(), "HH:mm").compareTo(DateUtils.formatDate(new Date(), "HH:mm"))>0)).sorted(Comparator.comparing(po -> DateUtils.formatDate(po.getStartTime(), "HH:mm"))).collect(Collectors.toList()); + } else { + list = list.stream().sorted(Comparator.comparing(po -> DateUtils.formatDate(po.getStartTime(), "HH:mm"))).collect(Collectors.toList()); + } + + Map> groupedByRoom = list.stream() + .collect(Collectors.groupingBy(DmMeetingOrdersPo::getSpaceId)); + return groupedByRoom; + } } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/controller/SysEnterpriseController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/controller/SysEnterpriseController.java index 6f21251e..cb8fb6d1 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/controller/SysEnterpriseController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/controller/SysEnterpriseController.java @@ -8,10 +8,7 @@ import com.xueyi.common.web.entity.controller.BaseController; import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; import com.xueyi.system.api.organize.domain.query.SysEnterpriseQuery; import com.xueyi.system.organize.service.ISysEnterpriseService; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * 企业管理 业务处理 @@ -27,6 +24,14 @@ public class SysEnterpriseController extends BaseController getInfo(@RequestParam(value = "enterpriseId") Long enterpriseId) { + return R.ok(baseService.selectById(enterpriseId)); + } + /** * 获取企业信息 | 内部调用 */ diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/controller/SysOrganizeController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/controller/SysOrganizeController.java index 91ba327a..532fe9b4 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/controller/SysOrganizeController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/controller/SysOrganizeController.java @@ -6,10 +6,15 @@ import com.xueyi.common.security.annotation.Logical; import com.xueyi.common.security.annotation.RequiresPermissions; import com.xueyi.common.security.auth.Auth; import com.xueyi.common.web.entity.controller.BasisController; -import com.xueyi.system.organize.domain.vo.SysDeptExt; +import com.xueyi.system.api.organize.domain.vo.SysDeptExt; import com.xueyi.system.organize.service.ISysOrganizeService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * 组织管理 业务处理 diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/domain/po/SysDeptExtPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/domain/po/SysDeptExtPo.java index c6645e54..fd2369a1 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/domain/po/SysDeptExtPo.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/domain/po/SysDeptExtPo.java @@ -21,19 +21,19 @@ public class SysDeptExtPo extends TBaseEntity { private Long deptId; - /** 工作日上班时间 */ - @Excel(name = "工作日上班时间") - protected String workdayHourStart; + /** 上班打卡开始时间 */ + @Excel(name = "上班打卡开始时间") + protected String onDutyHourStart; - /** 工作日下班时间 */ - @Excel(name = "工作日下班时间") - protected String workdayHourEnd; + /** 上班打卡结束时间 */ + @Excel(name = "上班打卡结束时间") + protected String onDutyHourEnd; - /** 休息日上班时间 */ - @Excel(name = "休息日上班时间") - protected String weekendHourStart; + /** 下班打卡开始时间 */ + @Excel(name = "下班打卡开始时间") + protected String offDutyHourStart; - /** 休息日下班时间 */ - @Excel(name = "休息日下班时间") - protected String weekendHourEnd; + /** 下班打卡结束时间 */ + @Excel(name = "下班打卡结束时间") + protected String offDutyHourEnd; } diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/domain/vo/SysDeptExt.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/domain/vo/SysDeptExt.java deleted file mode 100644 index d1cd4bd1..00000000 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/domain/vo/SysDeptExt.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.xueyi.system.organize.domain.vo; - -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -public class SysDeptExt { - - - /** Id */ - private Long deptId; - - /** Id */ - private String workdayHourStart; - - /** Id */ - private String workdayHourEnd; - - /** Id */ - private String weekendHourStart; - - /** Id */ - private String weekendHourEnd; - -} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/manager/ISysOrganizeManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/manager/ISysOrganizeManager.java index 903133be..077cc33f 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/manager/ISysOrganizeManager.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/manager/ISysOrganizeManager.java @@ -1,6 +1,6 @@ package com.xueyi.system.organize.manager; -import com.xueyi.system.organize.domain.vo.SysDeptExt; +import com.xueyi.system.api.organize.domain.vo.SysDeptExt; import com.xueyi.system.organize.domain.vo.SysOrganizeTree; import java.util.Collection; diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/manager/impl/SysOrganizeManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/manager/impl/SysOrganizeManager.java index 59f7c2df..cb9cb5fa 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/manager/impl/SysOrganizeManager.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/manager/impl/SysOrganizeManager.java @@ -6,11 +6,11 @@ import com.xueyi.common.core.utils.core.ArrayUtil; import com.xueyi.common.core.utils.core.CollUtil; import com.xueyi.system.api.organize.domain.dto.SysDeptDto; import com.xueyi.system.api.organize.domain.dto.SysPostDto; +import com.xueyi.system.api.organize.domain.vo.SysDeptExt; import com.xueyi.system.organize.domain.merge.SysOrganizeRoleMerge; import com.xueyi.system.organize.domain.merge.SysRoleDeptMerge; import com.xueyi.system.organize.domain.merge.SysRolePostMerge; import com.xueyi.system.organize.domain.merge.SysUserPostMerge; -import com.xueyi.system.organize.domain.vo.SysDeptExt; import com.xueyi.system.organize.domain.vo.SysOrganizeTree; import com.xueyi.system.organize.manager.ISysDeptManager; import com.xueyi.system.organize.manager.ISysOrganizeManager; @@ -23,7 +23,12 @@ import com.xueyi.system.organize.mapper.merge.SysUserPostMergeMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; /** diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/mapper/SysDeptExtMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/mapper/SysDeptExtMapper.java index 38464ff1..aa5f65bc 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/mapper/SysDeptExtMapper.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/mapper/SysDeptExtMapper.java @@ -2,11 +2,10 @@ package com.xueyi.system.organize.mapper; import com.xueyi.common.datasource.annotation.Isolate; import com.xueyi.common.web.entity.mapper.BaseMapper; -import com.xueyi.common.web.entity.mapper.TreeMapper; +import com.xueyi.system.api.organize.domain.vo.SysDeptExt; import com.xueyi.system.organize.domain.dto.SysDeptExtDto; import com.xueyi.system.organize.domain.po.SysDeptExtPo; import com.xueyi.system.organize.domain.query.SysDeptExtQuery; -import com.xueyi.system.organize.domain.vo.SysDeptExt; import org.apache.ibatis.annotations.Param; /** diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/service/ISysOrganizeService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/service/ISysOrganizeService.java index de74a986..81c45cd7 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/service/ISysOrganizeService.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/service/ISysOrganizeService.java @@ -1,6 +1,6 @@ package com.xueyi.system.organize.service; -import com.xueyi.system.organize.domain.vo.SysDeptExt; +import com.xueyi.system.api.organize.domain.vo.SysDeptExt; import com.xueyi.system.organize.domain.vo.SysOrganizeTree; import java.util.Collection; diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/service/impl/SysOrganizeServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/service/impl/SysOrganizeServiceImpl.java index 878d8f0e..21de9081 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/service/impl/SysOrganizeServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/organize/service/impl/SysOrganizeServiceImpl.java @@ -4,7 +4,7 @@ import com.xueyi.common.core.constant.system.OrganizeConstants; import com.xueyi.common.core.utils.TreeUtil; import com.xueyi.common.core.utils.core.CollUtil; import com.xueyi.common.core.utils.core.StrUtil; -import com.xueyi.system.organize.domain.vo.SysDeptExt; +import com.xueyi.system.api.organize.domain.vo.SysDeptExt; import com.xueyi.system.organize.domain.vo.SysOrganizeTree; import com.xueyi.system.organize.manager.impl.SysOrganizeManager; import com.xueyi.system.organize.service.ISysOrganizeService; diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/controller/DmRecognizedRecordsController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/controller/DmRecognizedRecordsController.java index e3d0d2d8..cb69752f 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/controller/DmRecognizedRecordsController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/controller/DmRecognizedRecordsController.java @@ -10,6 +10,8 @@ import com.xueyi.common.web.entity.controller.BaseController; import com.xueyi.system.api.pass.domain.dto.DmRecognizedRecordsDto; import com.xueyi.system.pass.domain.query.DmRecognizedRecordsQuery; import com.xueyi.system.pass.service.IDmRecognizedRecordsService; +import com.xueyi.system.pass.service.impl.DmRecognizedRecordsServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -38,6 +40,10 @@ public class DmRecognizedRecordsController extends BaseController 0) + recognizedRecordsService.setRedisRecognizedCount(recognizedMultiRecordsDto.getRecords().size()); + + return recognizedRecordsFeign.uploadMultiPass(recognizedMultiRecordsDto, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + } + + @Autowired + private DmRecognizedRecordsMapper recordsMapper; + +// @Autowired +// private RecognizedRecordsRepository recordsRepository; + +// @Autowired +// private RecognizedRecordsRepository recordsRepository; + + @Autowired + private ElasticsearchClient esClient; + + @GetMapping("/syncEs") + @TenantIgnore(tenantLine = true) + public AjaxResult sync(@RequestHeader(value = SecurityConstants.SOURCE_NAME, defaultValue = "salve") String sourceName, @RequestHeader(value = SecurityConstants.ENTERPRISE_ID, defaultValue = "-1") Long enterpriseId, @RequestHeader(value = SecurityConstants.FROM_SOURCE, defaultValue = SecurityConstants.INNER) String source) { + List lists = recordsMapper.selectList(new QueryWrapper<>()); + + BulkRequest.Builder br = new BulkRequest.Builder(); + + System.err.println(lists.get(0)); + for (int j = 0; j < lists.size(); j++) { + int finalJ = j; + br.operations(op -> op + .index(idx -> { + + return idx + .index("saas-recognized-records") + .id(lists.get(finalJ).getId().toString()) + .document(lists.get(finalJ)); + } + ) + ); + } + + try { + BulkResponse result = esClient.bulk(br.build()); + if (result.errors()) { + log.error("Bulk had errors"); + for (BulkResponseItem item : result.items()) { + if (item.error() != null) { + log.error(item.error().reason()); + } + } + } + } catch (IOException e) { + log.error("sync error:{}", e.getMessage()); + throw new RuntimeException(e); + } + +// lists.stream().forEach(f->recordsRepository.save((EsRecognizedRecordsPo) f)); + return AjaxResult.success(); + } + + + + + @GetMapping("/queryEs") + @TenantIgnore(tenantLine = true) + public AjaxResult queryEs(@RequestHeader(value = SecurityConstants.SOURCE_NAME, defaultValue = "salve") String sourceName, @RequestHeader(value = SecurityConstants.ENTERPRISE_ID, defaultValue = "-1") Long enterpriseId, @RequestHeader(value = SecurityConstants.FROM_SOURCE, defaultValue = SecurityConstants.INNER) String source, @RequestBody JSONObject params) { + DmRecognizedRecordsPo ee = new DmRecognizedRecordsPo(); + System.err.println(ee.getClass().getName()); + System.err.println(ee.getClass().getSimpleName()); + + SearchTemplateResponse response = null; + SearchResponse response2 = null; + Query byName = MatchQuery.of(m -> m + .field("userName") + .query(params.getString("userName")) + )._toQuery(); + +// Search by max price + Query byDeptId = MatchQuery.of(r -> r + .field("deptId") + .query(params.getString("deptId")) +// .gte(JsonData.of("1676567054881718273")) + )._toQuery(); + try { + response2 = esClient.search(s -> s + .index("saas-recognized-records") + .query(q -> q + .bool(b -> b.must(byName).must(byDeptId)) + ).from(params.getInteger("from")).size(params.getInteger("size")), + DmRecognizedRecordsPo.class + ); + } catch (IOException e) { + throw new RuntimeException(e); + } + + TotalHits total = response2.hits().total(); + boolean isExactResult = total.relation() == TotalHitsRelation.Eq; + + if (isExactResult) { + log.info("There are " + total.value() + " results"); + } else { + log.info("There are more than " + total.value() + " results"); + } + List products2 = response2.hits().hits().stream().map(f->f.source()).collect( + Collectors.toList() + ); + + List> hits = response2.hits().hits(); + for (Hit hit: hits) { + DmRecognizedRecordsPo product = hit.source(); + log.info("Found product " + product.getDevId() + ", score " + hit.score()); + } + try { + response = esClient.searchTemplate(r -> r + .index("saas-recognized-records") + .id("records-search-template") + .params("query_string", JsonData.of(params.getString("userName"))) + .params("from", JsonData.of(params.getInteger("from"))) + .params("size", JsonData.of(params.getInteger("size"))) + , + DmRecognizedRecordsPo.class + ); + } catch (IOException e) { + throw new RuntimeException(e); + } + + List> hits2 = response.hits().hits(); + List products = response.hits().hits().stream().map(f->f.source()).collect( + Collectors.toList() + ); + + +// lists.stream().forEach(f->recordsRepository.save((EsRecognizedRecordsPo) f)); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("data", products); + jsonObject.put("data2", products2); + + return AjaxResult.success(jsonObject); + } + + } diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/controller/api/DmRecognizedRecordsInnerApiController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/controller/api/DmRecognizedRecordsInnerApiController.java index 1c1b6c8f..213b617d 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/controller/api/DmRecognizedRecordsInnerApiController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/controller/api/DmRecognizedRecordsInnerApiController.java @@ -1,6 +1,8 @@ package com.xueyi.system.pass.controller.api; import cn.hutool.core.util.ObjectUtil; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.xueyi.common.core.web.result.R; @@ -10,12 +12,17 @@ import com.xueyi.common.web.response.MyResponse; import com.xueyi.common.web.utils.DateUtils; import com.xueyi.file.api.domain.SysFile; import com.xueyi.file.api.feign.RemoteFileService; +import com.xueyi.system.api.pass.domain.dto.DmRecognizedMultiRecordsDto; import com.xueyi.system.api.pass.domain.dto.DmRecognizedRecordsDto; import com.xueyi.system.api.pass.domain.po.DmRecognizedRecordsPo; import com.xueyi.system.api.staff.domain.po.DmStaffPo; import com.xueyi.system.pass.domain.model.DmRecognizedRecordsConverter; import com.xueyi.system.pass.mapper.DmRecognizedRecordsMapper; +import com.xueyi.system.pass.service.impl.DmRecognizedRecordsServiceImpl; import com.xueyi.system.resource.controller.api.BaseApiController; +import com.xueyi.system.resource.domain.dto.DmResourcesDto; +import com.xueyi.system.resource.service.impl.DmResourcesServiceImpl; +import com.xueyi.system.resource.service.impl.FaceServiceImpl; import com.xueyi.system.staff.mapper.DmStaffMapper; import com.xueyi.system.staff.service.impl.DmStaffServiceImpl; import com.xueyi.system.utils.common.ImageUtil; @@ -28,6 +35,8 @@ import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; /** * 人员识别管理 业务处理 @@ -53,9 +62,20 @@ public class DmRecognizedRecordsInnerApiController extends BaseApiController { @Autowired ImageUtil imageUtil; + @Autowired + private DmResourcesServiceImpl iDmResourcesService; + @Autowired private DmRecognizedRecordsConverter recordsConverter; + @Autowired + private FaceServiceImpl faceService; + + @Autowired + private DmRecognizedRecordsServiceImpl recognizedRecordsService; + + @Autowired + private ElasticsearchClient esClient; @InnerAuth @PostMapping(value = "/upload-pass") public JSONObject upload(@RequestBody DmRecognizedRecordsDto recognizedRecordsDto) { @@ -64,6 +84,7 @@ public class DmRecognizedRecordsInnerApiController extends BaseApiController { Long userId = recognizedRecordsDto.getUserId(); String imgBase64 = recognizedRecordsDto.getImgbase64(); String sign = recognizedRecordsDto.getSign(); + Integer type = recognizedRecordsDto.getType();//1:staff;2:stranger MyResponse myResponse = commonCheck(deviceId, timestamp.doubleValue(), sign); if (myResponse.getStatus() != 0) { @@ -71,18 +92,22 @@ public class DmRecognizedRecordsInnerApiController extends BaseApiController { } DmRecognizedRecordsPo cr = recordsConverter.mapperPo(recognizedRecordsDto); - DmStaffPo emp = dmStaffMapper.selectById(userId); - if (ObjectUtils.anyNotNull(emp)) { - cr.setUserName(emp.getUserName()); - cr.setDeptId(emp.getDeptId()); - } try { cr.setRecognizedTime(DateUtils.parseLongToDate(timestamp.longValue())); } catch (ParseException e) { e.printStackTrace(); return output(ResponseCode.ILLEGAL_PARAMETER, "timestamp").toJSON(); } + if (!type.equals(DmRecognizedRecordsDto.TYPE_STRANGER)) { + DmStaffPo emp = dmStaffMapper.selectById(userId); + if (ObjectUtils.anyNotNull(emp)) { + cr.setUserName(emp.getUserName()); + cr.setDeptId(emp.getDeptId()); + + dmStaffService.updateOrInsertAttendance(cr); + } + } if (StringUtils.isNotEmpty(imgBase64)) { R fileResult = fileService.upload(imageUtil.base64ToMultipartFile(imgBase64)); @@ -92,10 +117,78 @@ public class DmRecognizedRecordsInnerApiController extends BaseApiController { cr.setFaceUrl(url); } - if (ObjectUtils.anyNotNull(emp)) {//员工不为空更新考勤 - dmStaffService.updateOrInsertAttendance(cr); - } dmRecognizedRecordsMapper.insert(cr); + recognizedRecordsService.saveToEs(recordsConverter.mapperDto(cr)); + + recognizedRecordsService.setRedisRecognizedCount(1); + + return outputSuccess().toJSON(); + } + + @InnerAuth + @PostMapping(value = "/upload-multi-pass") + public JSONObject uploads(@RequestBody DmRecognizedMultiRecordsDto recognizedMultiRecordsDto) { + String deviceId = recognizedMultiRecordsDto.getDevId(); + BigDecimal timestamp = recognizedMultiRecordsDto.getTimestamp(); + String sign = recognizedMultiRecordsDto.getSign(); + + MyResponse myResponse = commonCheck(deviceId, timestamp.doubleValue(), sign); + if (myResponse.getStatus() != 0) { + return myResponse.toJSON(); + } + + List dtoList = recognizedMultiRecordsDto.getRecords(); + + List crs = new ArrayList<>(); + for (DmRecognizedRecordsDto recognizedRecordsDto : dtoList) { + Long userId = recognizedRecordsDto.getUserId(); + String imgBase64 = recognizedRecordsDto.getImgbase64(); + Integer type = recognizedRecordsDto.getType();//1:staff;2:stranger + DmRecognizedRecordsPo cr = recordsConverter.mapperPo(recognizedRecordsDto); + + try { + cr.setRecognizedTime(DateUtils.parseLongToDate(timestamp.longValue())); + } catch (ParseException e) { + e.printStackTrace(); + return output(ResponseCode.ILLEGAL_PARAMETER, "timestamp").toJSON(); + } + if (type.equals(DmRecognizedRecordsDto.TYPE_STRANGER)) { + DmStaffPo emp = dmStaffMapper.selectById(userId); + if (ObjectUtils.anyNotNull(emp)) { + cr.setUserName(emp.getUserName()); + cr.setDeptId(emp.getDeptId()); + + dmStaffService.updateOrInsertAttendance(cr); + } + } + if (StringUtils.isNotEmpty(imgBase64)) { + R fileResult = fileService.upload(imageUtil.base64ToMultipartFile(imgBase64)); + if (ObjectUtil.isNull(fileResult) || ObjectUtil.isNull(fileResult.getData())) + return output(ResponseCode.FILE_SERVICE_ERROR).toJSON(); + String url = fileResult.getData().getUrl(); + DmResourcesDto dmResourcesDto = new DmResourcesDto(); + dmResourcesDto.setType(DmResourcesDto.TYPE_PIC); + dmResourcesDto.setUrl(url); + dmResourcesDto.setName("stranger"); + + com.alibaba.fastjson.JSONObject json = faceService.getFaceExtraction("", "", imgBase64); + + if (0!=json.getInteger("status")) { + return output(-1, json.getString("errMsg")).toJSON(); + } else { + JSONArray obj = json.getJSONArray("result").getJSONObject(0).getJSONArray("faces").getJSONObject(0).getJSONArray("feature"); + dmResourcesDto.setFeature(obj.toJSONString()); + } + + iDmResourcesService.addOne(dmResourcesDto); + cr.setFaceUrl(url); + cr.setResourceId(dmResourcesDto.getId()); + } +// recognizedRecordsService.saveToEs(recordsConverter.mapperDto(cr)); + crs.add(cr); + } + + dmRecognizedRecordsMapper.insertBatch(crs); return outputSuccess().toJSON(); } diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/mapper/DmRecognizedRecordsMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/mapper/DmRecognizedRecordsMapper.java index d6417c8e..2a24c2c6 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/mapper/DmRecognizedRecordsMapper.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/mapper/DmRecognizedRecordsMapper.java @@ -13,4 +13,5 @@ import com.xueyi.system.pass.domain.query.DmRecognizedRecordsQuery; */ @Isolate public interface DmRecognizedRecordsMapper extends BaseMapper { + public void del(Integer day); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/service/IDmRecognizedRecordsService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/service/IDmRecognizedRecordsService.java index 156eb99d..1df1a29e 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/service/IDmRecognizedRecordsService.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/service/IDmRecognizedRecordsService.java @@ -10,4 +10,5 @@ import com.xueyi.system.pass.domain.query.DmRecognizedRecordsQuery; * @author xueyi */ public interface IDmRecognizedRecordsService extends IBaseService { + } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/service/impl/DmRecognizedRecordsServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/service/impl/DmRecognizedRecordsServiceImpl.java index 5029d7e8..477ce462 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/service/impl/DmRecognizedRecordsServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/pass/service/impl/DmRecognizedRecordsServiceImpl.java @@ -1,12 +1,20 @@ package com.xueyi.system.pass.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.xueyi.common.web.annotation.TenantIgnore; import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; import com.xueyi.system.api.pass.domain.dto.DmRecognizedRecordsDto; import com.xueyi.system.pass.domain.query.DmRecognizedRecordsQuery; import com.xueyi.system.pass.manager.IDmRecognizedRecordsManager; +import com.xueyi.system.pass.mapper.DmRecognizedRecordsMapper; import com.xueyi.system.pass.service.IDmRecognizedRecordsService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import java.io.Serializable; import java.util.List; /** @@ -17,6 +25,14 @@ import java.util.List; @Service public class DmRecognizedRecordsServiceImpl extends BaseServiceImpl implements IDmRecognizedRecordsService { + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private DmRecognizedRecordsMapper recognizedRecordsMapper; + + private static final Logger log = LoggerFactory.getLogger(DmRecognizedRecordsServiceImpl.class); /** * 查询人员识别对象列表 | 数据权限 * @@ -29,4 +45,26 @@ public class DmRecognizedRecordsServiceImpl extends BaseServiceImpl()); + log.info("同步redis mysql识别人数:"+count); + redisTemplate.opsForValue().set("dashboard:recognizedPersonCount",count); + } + + public void setRedisRecognizedCount(Integer num){ + if (!redisTemplate.hasKey("dashboard:recognizedPersonCount")){ + syncToRedis(); + } else { + log.info("同步redis 新增识别人数:"+num); + if (null != redisTemplate.opsForValue().get("dashboard:recognizedPersonCount")) { + Long count = ((Number) (redisTemplate.opsForValue().get("dashboard:recognizedPersonCount"))).longValue(); + redisTemplate.opsForValue().set("dashboard:recognizedPersonCount", count + num); + } + } + + } + + } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmBackgroundController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmBackgroundController.java new file mode 100644 index 00000000..02e218ae --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmBackgroundController.java @@ -0,0 +1,82 @@ +package com.xueyi.system.resource.controller; + +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.system.resource.domain.dto.DmBackgroundDto; +import com.xueyi.system.resource.domain.query.DmBackgroundQuery; +import com.xueyi.system.resource.service.IDmBackgroundService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 背景图素材管理 业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/background") +public class DmBackgroundController extends BaseController { + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "背景图素材" ; + } + + /** + * 查询背景图素材列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_BACKGROUND_LIST) + public AjaxResult list(DmBackgroundQuery background) { + return super.list(background); + } + + /** + * 背景图素材新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_BACKGROUND_ADD) + @Log(title = "背景图素材管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmBackgroundDto background) { + return super.add(background); + } + + /** + * 背景图素材批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_BACKGROUND_DEL) + @Log(title = "背景图素材管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取背景图素材选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 背景图素材管理 - 列表 */ + String DM_BACKGROUND_LIST = "resource:background:list"; + /** 系统 - 背景图素材管理 - 新增 */ + String DM_BACKGROUND_ADD = "resource:background:add"; + /** 系统 - 背景图素材管理 - 删除 */ + String DM_BACKGROUND_DEL = "resource:background:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmH5ConfigController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmH5ConfigController.java new file mode 100644 index 00000000..38341b4a --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmH5ConfigController.java @@ -0,0 +1,147 @@ +package com.xueyi.system.resource.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.result.R; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.security.annotation.Logical; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.system.resource.domain.dto.DmH5ConfigDto; +import com.xueyi.system.resource.domain.query.DmH5ConfigQuery; +import com.xueyi.system.resource.service.IDmH5ConfigService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.List; + +/** + * H5配置表管理 业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/h5config") +public class DmH5ConfigController extends BaseController { + private static final Logger log = LoggerFactory.getLogger(DmH5ConfigController.class); + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "H5配置表" ; + } + + @GetMapping("/inner/syncH5Config") + R syncH5Config(@RequestParam(value = "tId",required = false) String tId) { + Long tenantId = null; + if (StringUtils.isNotEmpty(tId)) { + tenantId = Long.parseLong(tId); + } + String result = baseService.syncH5Config(tenantId); + if (StringUtils.isNotEmpty(result)) { + return R.ok(result); + } + return R.fail("同步配置文件失败"); + } + + /** + * 查询H5配置表列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_H5_CONFIG_LIST) + public AjaxResult list(DmH5ConfigQuery h5Config) { + return super.list(h5Config); + } + + /** + * 查询H5配置表详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_H5_CONFIG_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * H5配置表新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_H5_CONFIG_ADD) + @Log(title = "H5配置表管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmH5ConfigDto h5Config) { + log.info("H5配置表新增:{}", h5Config); + log.info("租户:{}", h5Config.getEnterpriseId()); + return super.add(h5Config); + } + + /** + * H5配置表修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_H5_CONFIG_EDIT) + @Log(title = "H5配置表管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmH5ConfigDto h5Config) { + try { + JSONObject jsonObject = JSONObject.parseObject(h5Config.getProperty()); + } catch (Exception e) { + return AjaxResult.error("配置格式错误"); + } + return super.edit(h5Config); + } + + /** + * H5配置表修改状态 + */ + @Override + @PutMapping("/status") + @RequiresPermissions(value = {Auth.DM_H5_CONFIG_EDIT, Auth.DM_H5_CONFIG_ES}, logical = Logical.OR) + @Log(title = "H5配置表管理", businessType = BusinessType.UPDATE_STATUS) + public AjaxResult editStatus(@RequestBody DmH5ConfigDto h5Config) { + return super.editStatus(h5Config); + } + + /** + * H5配置表批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_H5_CONFIG_DEL) + @Log(title = "H5配置表管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取H5配置表选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - H5配置表管理 - 列表 */ + String DM_H5_CONFIG_LIST = "resource:h5config:list"; + /** 系统 - H5配置表管理 - 详情 */ + String DM_H5_CONFIG_SINGLE = "resource:h5config:single"; + /** 系统 - H5配置表管理 - 新增 */ + String DM_H5_CONFIG_ADD = "resource:h5config:add"; + /** 系统 - H5配置表管理 - 修改 */ + String DM_H5_CONFIG_EDIT = "resource:h5config:edit"; + /** 系统 - H5配置表管理 - 修改状态 */ + String DM_H5_CONFIG_ES = "resource:h5config:es"; + /** 系统 - H5配置表管理 - 删除 */ + String DM_H5_CONFIG_DEL = "resource:h5config:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmResourcesController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmResourcesController.java index 4a94822f..5c542705 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmResourcesController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmResourcesController.java @@ -167,7 +167,6 @@ public class DmResourcesController extends BaseController> fileResult = remoteFileService.uploadPdf(file); + if (ObjectUtil.isNull(fileResult) || ObjectUtil.isNull(fileResult.getData())) + return error("文件服务异常,请联系管理员!"); + JSONArray ja = new JSONArray(); + for (SysFile sf : fileResult.getData()) { + String url = sf.getUrl(); + // 预留人脸识别与图像质量监测接口,如果监测异常返回错误 + + DmResourcesDto dto = new DmResourcesDto(); + dto.setName(file.getOriginalFilename()); + dto.setUrl(url); + dto.setType(DmResourcesPo.TYPE_PIC); + dto.setFileSize(sf.getSize()); + + iDmResourcesService.addOne(dto); + JSONObject jo = new JSONObject(); + jo.put(PARAM_RESOURCE_ID, dto.getId()); + jo.put(PARAM_URL, url); + ja.add(jo); + } + AjaxResult ajax = success(); + ajax.put(AjaxResult.RESULT_TAG, ja); + return ajax; + } + return error("上传图片异常,请联系管理员!"); + } + /** * 头像上传 */ diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/api/BaseApiController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/api/BaseApiController.java index 7d82ff2d..3e48b96b 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/api/BaseApiController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/api/BaseApiController.java @@ -4,12 +4,8 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -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 com.xueyi.system.digitalmans.domain.dto.DmDigitalmanDto; import com.xueyi.system.digitalmans.mapper.DmDigitalmanMapper; import com.xueyi.system.digitalmans.service.impl.DmDigitalmanServiceImpl; import org.springframework.beans.factory.annotation.Autowired; @@ -17,82 +13,10 @@ import org.springframework.beans.factory.annotation.Autowired; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.IOException; -import java.util.List; import java.util.Map; import java.util.TreeMap; -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; - } - +public class BaseApiController extends com.xueyi.common.web.controller.BaseApiController { @Autowired @@ -100,6 +24,7 @@ public class BaseApiController { @Autowired private DmDigitalmanMapper dmDigitalmanMapper; + public MyResponse commonCheck(String devId, Double timestamp, String sign) { String regexZS = "[0-9A-Za-z_-]+"; if (!(StringUtils.isNotEmpty(devId) && devId.matches(regexZS))) { @@ -111,8 +36,8 @@ public class BaseApiController { } // dmDigitalmanService.selectById() - DmDigitalmanDto dmDigitalmanDto = dmDigitalmanMapper.selectByCode(devId); - System.err.println(dmDigitalmanDto); + /*DmDigitalmanDto dmDigitalmanDto = dmDigitalmanMapper.selectByCode(devId); + System.err.println(dmDigitalmanDto);*/ /* Device device = deviceService.findByDevId(devId); if (!ObjectUtils.isNotNull(device)) { diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/dto/DmBackgroundDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/dto/DmBackgroundDto.java new file mode 100644 index 00000000..d9f0e67c --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/dto/DmBackgroundDto.java @@ -0,0 +1,28 @@ +package com.xueyi.system.resource.domain.dto; + +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.system.resource.domain.po.DmBackgroundPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +import static com.xueyi.system.resource.domain.merge.MergeGroup.Background_Resource_GROUP; + +/** + * 背景图素材 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmBackgroundDto extends DmBackgroundPo { + + @Serial + private static final long serialVersionUID = 1L; + + /** 模块信息 */ + @Correlation(groupName = Background_Resource_GROUP, keyType = OperateConstants.SubKeyType.RECEIVE) + private DmResourcesDto resource; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/dto/DmH5ConfigDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/dto/DmH5ConfigDto.java new file mode 100644 index 00000000..8b991c66 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/dto/DmH5ConfigDto.java @@ -0,0 +1,26 @@ +package com.xueyi.system.resource.domain.dto; + +import com.xueyi.system.resource.domain.po.DmH5ConfigPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * H5配置表 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmH5ConfigDto extends DmH5ConfigPo { + + @Serial + private static final long serialVersionUID = 1L; + + /** 所属租户名称 */ + private String tenantName; + + /** 属性值 */ + private String property; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/merge/MergeGroup.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/merge/MergeGroup.java new file mode 100644 index 00000000..90d3d094 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/merge/MergeGroup.java @@ -0,0 +1,8 @@ +package com.xueyi.system.resource.domain.merge; + +public interface MergeGroup { + + /** 设备日志关联 -》 日志 */ + String Background_Resource_GROUP = "Background_Resource_GROUP"; + +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/model/DmBackgroundConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/model/DmBackgroundConverter.java new file mode 100644 index 00000000..49c369df --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/model/DmBackgroundConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.resource.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.resource.domain.dto.DmBackgroundDto; +import com.xueyi.system.resource.domain.po.DmBackgroundPo; +import com.xueyi.system.resource.domain.query.DmBackgroundQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 背景图素材 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmBackgroundConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/model/DmH5ConfigConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/model/DmH5ConfigConverter.java new file mode 100644 index 00000000..3dc46449 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/model/DmH5ConfigConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.resource.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.resource.domain.dto.DmH5ConfigDto; +import com.xueyi.system.resource.domain.po.DmH5ConfigPo; +import com.xueyi.system.resource.domain.query.DmH5ConfigQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * H5配置表 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmH5ConfigConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/po/DmBackgroundPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/po/DmBackgroundPo.java new file mode 100644 index 00000000..92fdd60e --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/po/DmBackgroundPo.java @@ -0,0 +1,49 @@ +package com.xueyi.system.resource.domain.po; + +import com.xueyi.common.core.annotation.Correlation; +import com.xueyi.common.core.annotation.Correlations; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.core.web.tenant.base.TBaseEntity; +import com.xueyi.system.resource.domain.dto.DmBackgroundDto; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.io.Serial; + +import static com.xueyi.common.core.constant.basic.EntityConstants.*; +import static com.xueyi.system.resource.domain.merge.MergeGroup.Background_Resource_GROUP; + +/** + * 背景图素材 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_background", excludeProperty = { UPDATE_BY, SORT, CREATE_BY, DEL_FLAG, REMARK }) +public class DmBackgroundPo extends TBaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 使用状态 */ + @Excel(name = "使用状态") + protected String status; + + /** 资源类型 */ + @Excel(name = "资源类型") + protected Integer type; + + /** resource_id */ + @NotNull(message = "resourceId不能为空") + @Correlations({ + @Correlation(groupName = Background_Resource_GROUP, keyType = OperateConstants.SubKeyType.MAIN) + }) + + @Excel(name = "resource_id") + protected Long resourceId; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/po/DmH5ConfigPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/po/DmH5ConfigPo.java new file mode 100644 index 00000000..7e1c1455 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/po/DmH5ConfigPo.java @@ -0,0 +1,43 @@ +package com.xueyi.system.resource.domain.po; + +import com.xueyi.common.core.web.entity.base.BaseEntity; +import com.xueyi.system.resource.domain.dto.DmH5ConfigDto; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + + +/** + * H5配置表 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("dm_h5_config") +public class DmH5ConfigPo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 所属租户id */ + @Excel(name = "所属租户id") + protected Long enterpriseId; + + + /** 版本号 */ + @Excel(name = "版本号") + protected String version; + + /** 状态(0:使用;1:停用) */ + @Excel(name = "状态", readConverterExp = "0=:使用;1:停用") + protected String status; + + /** 备注 */ + @Excel(name = "备注") + protected String remark; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/query/DmBackgroundQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/query/DmBackgroundQuery.java new file mode 100644 index 00000000..50977f8f --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/query/DmBackgroundQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.resource.domain.query; + +import com.xueyi.system.resource.domain.po.DmBackgroundPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 背景图素材 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmBackgroundQuery extends DmBackgroundPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/query/DmH5ConfigQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/query/DmH5ConfigQuery.java new file mode 100644 index 00000000..a14aedee --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/domain/query/DmH5ConfigQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.resource.domain.query; + +import com.xueyi.system.resource.domain.po.DmH5ConfigPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * H5配置表 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmH5ConfigQuery extends DmH5ConfigPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/IDmBackgroundManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/IDmBackgroundManager.java new file mode 100644 index 00000000..1295e042 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/IDmBackgroundManager.java @@ -0,0 +1,13 @@ +package com.xueyi.system.resource.manager; + +import com.xueyi.system.resource.domain.dto.DmBackgroundDto; +import com.xueyi.system.resource.domain.query.DmBackgroundQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * 背景图素材管理 数据封装层 + * + * @author xueyi + */ +public interface IDmBackgroundManager extends IBaseManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/IDmH5ConfigManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/IDmH5ConfigManager.java new file mode 100644 index 00000000..2e5b279d --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/IDmH5ConfigManager.java @@ -0,0 +1,13 @@ +package com.xueyi.system.resource.manager; + +import com.xueyi.system.resource.domain.dto.DmH5ConfigDto; +import com.xueyi.system.resource.domain.query.DmH5ConfigQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * H5配置表管理 数据封装层 + * + * @author xueyi + */ +public interface IDmH5ConfigManager extends IBaseManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/impl/DmBackgroundManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/impl/DmBackgroundManager.java new file mode 100644 index 00000000..26adf6fc --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/impl/DmBackgroundManager.java @@ -0,0 +1,33 @@ +package com.xueyi.system.resource.manager.impl; + +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.web.entity.domain.SlaveRelation; +import com.xueyi.system.resource.domain.po.DmBackgroundPo; +import com.xueyi.system.resource.domain.dto.DmBackgroundDto; +import com.xueyi.system.resource.domain.query.DmBackgroundQuery; +import com.xueyi.system.resource.domain.model.DmBackgroundConverter; +import com.xueyi.system.resource.mapper.DmBackgroundMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.resource.manager.IDmBackgroundManager; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +import static com.xueyi.system.resource.domain.merge.MergeGroup.Background_Resource_GROUP; + +/** + * 背景图素材管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmBackgroundManager extends BaseManagerImpl implements IDmBackgroundManager { + + @Override + protected List subRelationInit() { + List result = new ArrayList(); + result.add(new SlaveRelation(Background_Resource_GROUP,DmResourcesManager.class, OperateConstants.SubOperateLimit.ONLY_SEL)); + return result; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/impl/DmH5ConfigManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/impl/DmH5ConfigManager.java new file mode 100644 index 00000000..595c2fb0 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/manager/impl/DmH5ConfigManager.java @@ -0,0 +1,31 @@ +package com.xueyi.system.resource.manager.impl; + +import com.alibaba.cloud.nacos.NacosConfigManager; +import com.alibaba.nacos.api.exception.NacosException; +import com.xueyi.common.core.constant.nacos.NacosConstants; +import com.xueyi.system.resource.domain.po.DmH5ConfigPo; +import com.xueyi.system.resource.domain.dto.DmH5ConfigDto; +import com.xueyi.system.resource.domain.query.DmH5ConfigQuery; +import com.xueyi.system.resource.domain.model.DmH5ConfigConverter; +import com.xueyi.system.resource.mapper.DmH5ConfigMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.resource.manager.IDmH5ConfigManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * H5配置表管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmH5ConfigManager extends BaseManagerImpl implements IDmH5ConfigManager { + + private static final Logger log = LoggerFactory.getLogger(DmH5ConfigManager.class); + @Autowired + NacosConfigManager nacosConfigManager; + + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/mapper/DmBackgroundMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/mapper/DmBackgroundMapper.java new file mode 100644 index 00000000..bf879927 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/mapper/DmBackgroundMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.resource.mapper; + +import com.xueyi.system.resource.domain.query.DmBackgroundQuery; +import com.xueyi.system.resource.domain.dto.DmBackgroundDto; +import com.xueyi.system.resource.domain.po.DmBackgroundPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Isolate; + +/** + * 背景图素材管理 数据层 + * + * @author xueyi + */ +@Isolate +public interface DmBackgroundMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/mapper/DmH5ConfigMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/mapper/DmH5ConfigMapper.java new file mode 100644 index 00000000..d488654d --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/mapper/DmH5ConfigMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.resource.mapper; + +import com.xueyi.system.resource.domain.query.DmH5ConfigQuery; +import com.xueyi.system.resource.domain.dto.DmH5ConfigDto; +import com.xueyi.system.resource.domain.po.DmH5ConfigPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Master; + +/** + * H5配置表管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmH5ConfigMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmBackgroundService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmBackgroundService.java new file mode 100644 index 00000000..1ebbb700 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmBackgroundService.java @@ -0,0 +1,13 @@ +package com.xueyi.system.resource.service; + +import com.xueyi.system.resource.domain.query.DmBackgroundQuery; +import com.xueyi.system.resource.domain.dto.DmBackgroundDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * 背景图素材管理 服务层 + * + * @author xueyi + */ +public interface IDmBackgroundService extends IBaseService { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmH5ConfigService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmH5ConfigService.java new file mode 100644 index 00000000..25a10f49 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmH5ConfigService.java @@ -0,0 +1,21 @@ +package com.xueyi.system.resource.service; + +import com.xueyi.system.resource.domain.query.DmH5ConfigQuery; +import com.xueyi.system.resource.domain.dto.DmH5ConfigDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * H5配置表管理 服务层 + * + * @author xueyi + */ +public interface IDmH5ConfigService extends IBaseService { + + /** + * 同步H5配置表 + * + * @param tId 租户Id + * @return 结果 + */ + public String syncH5Config(Long tId); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmResourcesService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmResourcesService.java index eedc96d5..3c5ea537 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmResourcesService.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/IDmResourcesService.java @@ -1,9 +1,10 @@ package com.xueyi.system.resource.service; +import com.xueyi.common.core.web.result.R; +import com.xueyi.common.web.entity.service.IBaseService; import com.xueyi.system.api.resource.domain.po.DmResourcesPo; -import com.xueyi.system.resource.domain.query.DmResourcesQuery; import com.xueyi.system.resource.domain.dto.DmResourcesDto; -import com.xueyi.common.web.entity.service.IBaseService; +import com.xueyi.system.resource.domain.query.DmResourcesQuery; /** * 静态资源管理 服务层 @@ -15,4 +16,6 @@ public interface IDmResourcesService extends IBaseService implements IDmBackgroundService { + + /** + * 查询背景图素材对象列表 | 数据权限 + * + * @param background 背景图素材对象 + * @return 背景图素材对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmBackgroundMapper"}) + public List selectListScope(DmBackgroundQuery background) { + return baseManager.selectList(background); + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/impl/DmH5ConfigServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/impl/DmH5ConfigServiceImpl.java new file mode 100644 index 00000000..cd830a8b --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/impl/DmH5ConfigServiceImpl.java @@ -0,0 +1,140 @@ +package com.xueyi.system.resource.service.impl; + +import com.alibaba.cloud.nacos.NacosConfigManager; +import com.alibaba.nacos.api.exception.NacosException; +import com.baomidou.dynamic.datasource.annotation.DSTransactional; +import com.xueyi.common.core.constant.nacos.NacosConstants; +import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.digitalmans.domain.query.DmManDeviceQuery; +import com.xueyi.system.digitalmans.service.IDmManDeviceService; +import com.xueyi.system.resource.domain.dto.DmH5ConfigDto; +import com.xueyi.system.resource.domain.query.DmH5ConfigQuery; +import com.xueyi.system.resource.manager.impl.DmH5ConfigManager; +import com.xueyi.system.resource.service.IDmH5ConfigService; +import com.xueyi.system.resource.manager.IDmH5ConfigManager; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.Serializable; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * H5配置表管理 服务层处理 + * + * @author xueyi + */ +@Service +public class DmH5ConfigServiceImpl extends BaseServiceImpl implements IDmH5ConfigService { + + + private static final Logger log = LoggerFactory.getLogger(DmH5ConfigManager.class); + @Autowired + NacosConfigManager nacosConfigManager; + + @Autowired + IDmManDeviceService dmManDeviceService; + + + + /** + * 查询H5配置表对象列表 | 数据权限 + * + * @param h5Config H5配置表对象 + * @return H5配置表对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmH5ConfigMapper"}) + public List selectListScope(DmH5ConfigQuery h5Config) { + List list = baseManager.selectList(h5Config); + list.forEach(item-> { + DmManDeviceQuery query = new DmManDeviceQuery(); + query.setTId(item.getEnterpriseId()); + DmManDeviceDto manDeviceDto = dmManDeviceService.selectList(query).stream().filter(device -> device.getTId().equals(item.getEnterpriseId())).findFirst().get(); + if (manDeviceDto != null) { + item.setTenantName(manDeviceDto.getTenantName()); + } + }); + return list; + } + + @Override + public int insert(DmH5ConfigDto dto) { + // 获取基础配置文件 + try { + String property = nacosConfigManager.getConfigService().getConfig(NacosConstants.DEFAULT_CONFIG_PATH, NacosConstants.DEFAULT_GROUP, 5000); + // 设置新增配置文件名 + String[] strs = NacosConstants.DEFAULT_CONFIG_PATH.split("\\."); + dto.setName(strs[0] + "_" + dto.getEnterpriseId() + "." + strs[1]); + // 新增配置文件 + nacosConfigManager.getConfigService().publishConfig(dto.getName(), NacosConstants.DEFAULT_GROUP,property); + } catch (NacosException ne) { + log.error("H5配置表上传nacos-新增配置文件失败:{}", ne.getMessage()); + } + + return super.insert(dto); + } + + @Override + public int update(DmH5ConfigDto dto) { + try { + // 获取文件名 + nacosConfigManager.getConfigService().publishConfig(dto.getName(), NacosConstants.DEFAULT_GROUP,dto.getProperty()); + } catch (NacosException ne) { + log.error("H5配置表上传nacos-修改配置文件失败:{}", ne.getMessage()); + } + return super.update(dto); + } + + @Override + public DmH5ConfigDto selectById(Serializable id) { + DmH5ConfigDto dto = super.selectById(id); + try { + dto.setProperty(nacosConfigManager.getConfigService().getConfig(dto.getName(), NacosConstants.DEFAULT_GROUP, 5000)); + } catch (NacosException ne) { + log.error("H5配置表nacos-获取配置文件失败:{}", ne.getMessage()); + } + return dto; + } + + @Override + public String syncH5Config(Long tId) { + log.info("tenant_id:{}",tId); + if (tId == null) { + try { + return nacosConfigManager.getConfigService().getConfig(NacosConstants.DEFAULT_CONFIG_PATH, NacosConstants.DEFAULT_GROUP, 5000); + } catch (NacosException e) { + log.error("H5同步-获取默认配置文件失败:{}", e.getMessage()); + } + } + DmH5ConfigQuery query = new DmH5ConfigQuery(); + query.setEnterpriseId(tId); + List list = baseManager.selectList(query).stream().filter(item -> item.getEnterpriseId().equals(tId)).collect(Collectors.toList()); + if (list != null && list.size() > 0) { + DmH5ConfigDto dto = list.get(0); + if (dto != null) { + try { + return nacosConfigManager.getConfigService().getConfig(dto.getName(), NacosConstants.DEFAULT_GROUP, 5000); + } catch (NacosException ne) { + log.error("H5同步-获取配置文件失败:{}", ne.getMessage()); + try { + return nacosConfigManager.getConfigService().getConfig(NacosConstants.DEFAULT_CONFIG_PATH, NacosConstants.DEFAULT_GROUP, 5000); + } catch (NacosException e) { + log.error("H5同步-获取默认配置文件失败:{}", e.getMessage()); + } + } + } + } else { + try { + return nacosConfigManager.getConfigService().getConfig(NacosConstants.DEFAULT_CONFIG_PATH, NacosConstants.DEFAULT_GROUP, 5000); + } catch (NacosException e) { + log.error("H5同步-获取默认配置文件失败:{}", e.getMessage()); + } + } + return ""; + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/impl/DmResourcesServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/impl/DmResourcesServiceImpl.java index b0ed0843..c53ebc3a 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/impl/DmResourcesServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/service/impl/DmResourcesServiceImpl.java @@ -1,12 +1,19 @@ package com.xueyi.system.resource.service.impl; -import com.xueyi.system.resource.domain.dto.DmResourcesDto; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.xueyi.common.core.web.result.R; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.file.api.domain.SysFile; +import com.xueyi.file.api.feign.RemoteFileService; import com.xueyi.system.api.resource.domain.po.DmResourcesPo; +import com.xueyi.system.resource.domain.dto.DmResourcesDto; import com.xueyi.system.resource.domain.query.DmResourcesQuery; +import com.xueyi.system.resource.manager.IDmResourcesManager; import com.xueyi.system.resource.mapper.DmResourcesMapper; import com.xueyi.system.resource.service.IDmResourcesService; -import com.xueyi.system.resource.manager.IDmResourcesManager; -import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.system.utils.common.ImageUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,6 +29,16 @@ public class DmResourcesServiceImpl extends BaseServiceImpl fileResult = fileService.upload(imageUtil.base64ToMultipartFile(imgBase64)); + if (ObjectUtil.isNull(fileResult) || ObjectUtil.isNull(fileResult.getData())) + return R.fail(fileResult.getMsg()); + String url = fileResult.getData().getUrl(); + + dmResourcesDto.setType(DmResourcesDto.TYPE_PIC); + dmResourcesDto.setUrl(url); + dmResourcesDto.setName(name); + + com.alibaba.fastjson.JSONObject json = faceService.getFaceExtraction("", "", imgBase64); + + if (0!=json.getInteger("status")) { + return R.fail(json.getString("errMsg")); + } else { + JSONArray obj = json.getJSONArray("result").getJSONObject(0).getJSONArray("faces").getJSONObject(0).getJSONArray("feature"); + dmResourcesDto.setFeature(obj.toJSONString()); + } + + addOne(dmResourcesDto); + + } + return R.ok(dmResourcesDto); + } } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/DmStaffController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/DmStaffController.java index 39047dcd..97b227dc 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/DmStaffController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/DmStaffController.java @@ -1,5 +1,9 @@ package com.xueyi.system.staff.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.context.SecurityContextHolder; import com.xueyi.common.core.utils.core.ObjectUtil; import com.xueyi.common.core.utils.core.StrUtil; import com.xueyi.common.core.utils.file.FileTypeUtil; @@ -16,10 +20,14 @@ import com.xueyi.common.security.annotation.RequiresPermissions; import com.xueyi.common.web.entity.controller.BaseController; import com.xueyi.file.api.domain.SysFile; import com.xueyi.file.api.feign.RemoteFileService; +import com.xueyi.nlt.api.netty.domain.vo.DmWebSocketMessageVo; +import com.xueyi.nlt.api.nlt.feign.RemoteIntentService; +import com.xueyi.system.api.model.Source; import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; import com.xueyi.system.api.staff.domain.dto.DmStaffDto; import com.xueyi.system.api.staff.domain.po.DmStaffPo; import com.xueyi.system.authority.service.ISysLoginService; +import com.xueyi.system.organize.service.ISysEnterpriseService; import com.xueyi.system.staff.domain.query.DmStaffQuery; import com.xueyi.system.api.staff.domain.vo.DmStaffFeature; import com.xueyi.system.staff.service.IDmStaffService; @@ -30,6 +38,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.Serializable; import java.util.Arrays; +import java.util.Date; import java.util.List; /** @@ -49,6 +58,13 @@ public class DmStaffController extends BaseController { + + @Autowired + private DmVisitorSmsConfigServiceImpl visitorSmsConfigService; + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "租户访客接待短信模板配置" ; + } + + /** + * 查询租户访客接待短信模板配置列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_VISITOR_SMS_CONFIG_LIST) + public AjaxResult list(DmVisitorSmsConfigQuery visitorSmsConfig) { + return super.list(visitorSmsConfig); + } + + /** + * 查询租户访客接待短信模板配置详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_VISITOR_SMS_CONFIG_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 租户访客接待短信模板配置新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_VISITOR_SMS_CONFIG_ADD) + @Log(title = "租户访客接待短信模板配置管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmVisitorSmsConfigDto visitorSmsConfig) { + if (visitorSmsConfig.getId()!= null) {// + DmVisitorSmsConfigDto dto = visitorSmsConfigService.selectById(visitorSmsConfig.getId()); + dto.setCompanyAddress(visitorSmsConfig.getCompanyAddress()); + dto.setCompanyName(visitorSmsConfig.getCompanyName()); + dto.setParkPrompt(visitorSmsConfig.getParkPrompt()); + visitorSmsConfigService.update(dto); + return success(); + } else { + return super.add(visitorSmsConfig); + } + } + + /** + * 租户访客接待短信模板配置修改 + */ + @Override + @PutMapping + @RequiresPermissions(Auth.DM_VISITOR_SMS_CONFIG_EDIT) + @Log(title = "租户访客接待短信模板配置管理", businessType = BusinessType.UPDATE) + public AjaxResult edit(@Validated({V_E.class}) @RequestBody DmVisitorSmsConfigDto visitorSmsConfig) { + return super.edit(visitorSmsConfig); + } + + /** + * 租户访客接待短信模板配置批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_VISITOR_SMS_CONFIG_DEL) + @Log(title = "租户访客接待短信模板配置管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取租户访客接待短信模板配置选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 租户访客接待短信模板配置管理 - 列表 */ + String DM_VISITOR_SMS_CONFIG_LIST = "visitor:visitor/sms:list"; + /** 系统 - 租户访客接待短信模板配置管理 - 新增 */ + String DM_VISITOR_SMS_CONFIG_ADD = "visitor:visitor/sms:add"; + /** 系统 - 租户访客接待短信模板配置管理 - 详情 */ + String DM_VISITOR_SMS_CONFIG_SINGLE = "visitor:visitor/sms:single"; + + /** 系统 - 租户访客接待短信模板配置管理 - 修改 */ + String DM_VISITOR_SMS_CONFIG_EDIT = "visitor:visitor/sms:edit"; + /** 系统 - 租户访客接待短信模板配置管理 - 删除 */ + String DM_VISITOR_SMS_CONFIG_DEL = "visitor:visitor/sms:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmStaffApiController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmStaffApiController.java new file mode 100644 index 00000000..bb439f71 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmStaffApiController.java @@ -0,0 +1,44 @@ +package com.xueyi.system.staff.controller.api; + +import com.alibaba.fastjson2.JSONObject; +import com.xueyi.common.core.constant.basic.SecurityConstants; +import com.xueyi.system.api.device.domain.vo.DeviceTenantSourceMergeVo; +import com.xueyi.system.api.staff.domain.dto.DmStaffCommonDto; +import com.xueyi.system.api.staff.feign.RemoteStaffService; +import com.xueyi.system.resource.controller.api.BaseApiController; +import org.springframework.beans.factory.annotation.Autowired; +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.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * 员工管理 API业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/staff/api") +public class DmStaffApiController extends BaseApiController { + + @Autowired + private RemoteStaffService staffService; + + @GetMapping(value = "fetchOne/{devId}/{staffId}") + @ResponseBody + public JSONObject fetchStaff(@PathVariable("devId") String devId, @PathVariable("staffId") String staffId){ + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); + return staffService.fetchStaff(staffId, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + } + + + @PostMapping(value = "new-staff") + @ResponseBody + public com.alibaba.fastjson2.JSONObject newStaff(@RequestBody DmStaffCommonDto commonDto){ + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(commonDto.getDevId()); + return staffService.addStaff(commonDto, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmStaffInnerApiController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmStaffInnerApiController.java new file mode 100644 index 00000000..2d1ff349 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmStaffInnerApiController.java @@ -0,0 +1,123 @@ +package com.xueyi.system.staff.controller.api; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xueyi.common.core.constant.basic.SqlConstants; +import com.xueyi.common.core.web.result.R; +import com.xueyi.common.security.annotation.InnerAuth; +import com.xueyi.common.web.constant.ResponseCode; +import com.xueyi.file.api.feign.RemoteFileService; +import com.xueyi.system.api.digitalmans.domain.dto.DmVisitorsDto; +import com.xueyi.system.api.digitalmans.domain.po.DmVisitorsPo; +import com.xueyi.system.api.staff.domain.dto.DmStaffCommonDto; +import com.xueyi.system.api.staff.domain.po.DmStaffPo; +import com.xueyi.system.resource.controller.api.BaseApiController; +import com.xueyi.system.resource.domain.dto.DmResourcesDto; +import com.xueyi.system.resource.service.impl.DmResourcesServiceImpl; +import com.xueyi.system.resource.service.impl.FaceServiceImpl; +import com.xueyi.system.staff.mapper.DmStaffMapper; +import com.xueyi.system.staff.mapper.DmVisitorsMapper; +import com.xueyi.system.utils.common.ImageUtil; +import org.springframework.beans.factory.annotation.Autowired; +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.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * 员工管理 API业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/staff/inner-api") +public class DmStaffInnerApiController extends BaseApiController { + + @Autowired + private DmStaffMapper dmStaffMapper; + + @Autowired + private RemoteFileService fileService; + + @Autowired + private FaceServiceImpl faceService; + + @Autowired + private ImageUtil imageUtil; + + @Autowired + private DmResourcesServiceImpl iDmResourcesService; + + @Autowired + private DmVisitorsMapper dmVisitorsMapper; + + @Autowired + private DmStaffMapper staffMapper; + + @InnerAuth + @GetMapping(value = "selectOne/{staffId}") + @ResponseBody + public JSONObject fetchStaff(@PathVariable("staffId") String staffId){ + DmStaffPo dmStaff = dmStaffMapper.selectOne(Wrappers.lambdaQuery().eq(DmStaffPo::getId, staffId).last(SqlConstants.LIMIT_ONE)); + if (dmStaff!= null) { + return outputSuccess(dmStaff).toJSON(); + } + return output(ResponseCode.DATA_NOT_EXISTS,"指定ID的员工").toJSON(); + } + + @InnerAuth + @PostMapping(value = "new-staff") + @ResponseBody + public com.alibaba.fastjson2.JSONObject newStaff(@RequestBody DmStaffCommonDto commonDto){ + //访客 + if (commonDto.getStaffType().equals(DmStaffCommonDto.TYPE_STRANGER) || commonDto.getStaffType().equals(DmStaffCommonDto.TYPE_VIP_STRANGER)) { + + DmVisitorsPo v = new DmVisitorsPo(); + v.setName(commonDto.getStaffName()); + v.setNickname(commonDto.getStaffName()); + v.setType(DmVisitorsDto.TYPE_NORMAL_VISITOR); + v.setGender(commonDto.getGender()); + v.setType(Long.parseLong(commonDto.getStaffType())); + + //兼容熟人介绍生人,传递访客照片 + if (StringUtils.isNotEmpty(commonDto.getStaffBase64Img())) { + R r = iDmResourcesService.addBase64Img(commonDto.getStaffBase64Img(), "stranger-"+commonDto.getStaffName()); + + if (r.getData() instanceof DmResourcesDto) { + DmResourcesDto dmResourcesDto = (DmResourcesDto) r.getData(); + v.setResourceId(dmResourcesDto.getId()); + v.setAvatar(dmResourcesDto.getUrl()); + } else { + return output(ResponseCode.FILE_UPLOAD_FAIL, r.getMsg()).toJSON(); + } + } + + dmVisitorsMapper.addOne(v); + } else {//员工 + DmStaffPo staffPo = new DmStaffPo(); + staffPo.setNickName(commonDto.getStaffName()); + staffPo.setUserName(commonDto.getStaffName()); + staffPo.setUserType(commonDto.getStaffType()); + staffPo.setSex(commonDto.getGender()!=null ? String.valueOf(commonDto.getGender()):null); + if (StringUtils.isNotEmpty(commonDto.getStaffBase64Img())) { + R r = iDmResourcesService.addBase64Img(commonDto.getStaffBase64Img(), "staff-"+commonDto.getStaffName()); + + if (r.getData() instanceof DmResourcesDto) { + DmResourcesDto dmResourcesDto = (DmResourcesDto) r.getData(); + staffPo.setResourceId(dmResourcesDto.getId()); + staffPo.setAvatar(dmResourcesDto.getUrl()); + } else { + return output(ResponseCode.FILE_UPLOAD_FAIL, r.getMsg()).toJSON(); + } + } + dmStaffMapper.insert(staffPo); + } + + return outputSuccess().toJSON(); + } + +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmVisitorApi2Controller.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmVisitorApi2Controller.java deleted file mode 100644 index e0deca34..00000000 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmVisitorApi2Controller.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.xueyi.system.staff.controller.api; - -import com.alibaba.fastjson2.JSONObject; -import com.xueyi.common.core.constant.basic.SecurityConstants; -import com.xueyi.system.api.device.domain.vo.DeviceTenantSourceMergeVo; -import com.xueyi.system.api.staff.domain.dto.DmVisitCommonDto; -import com.xueyi.system.api.staff.feign.RemoteVisitorService; -import com.xueyi.system.resource.controller.api.BaseApiController; -import com.xueyi.system.staff.mapper.DmStaffMapper; -import com.xueyi.system.staff.mapper.DmVisitRecordsMapper; -import com.xueyi.system.staff.mapper.DmVisitorsMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -/** - * 访客管理 API业务处理 - * - * @author xueyi - */ -@RestController -@RequestMapping("/visit2/api") -public class DmVisitorApi2Controller extends BaseApiController { - - - @Autowired - private DmVisitRecordsMapper dmVisitRecordsMapper; - - @Autowired - private DmStaffMapper dmStaffMapper; - - @Autowired - private DmVisitorsMapper dmVisitorsMapper; - - - @Autowired - private RemoteVisitorService visitorService; - - @PostMapping(value = "confirm-visitor") - @ResponseBody - public JSONObject queryVisit(String visitorName, Long empId, String devId){ - DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); - - return visitorService.queryVisit(visitorName, empId, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); - } - - @PostMapping(value = "new-visitor") - @ResponseBody - public JSONObject newVisit(@RequestBody DmVisitCommonDto commonDto){ - DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(commonDto.getDevId()); - - return visitorService.newVisit(commonDto, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); - } - -} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmVisitorApiController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmVisitorApiController.java index db3c592f..3ed98e77 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmVisitorApiController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/controller/api/DmVisitorApiController.java @@ -10,6 +10,7 @@ import com.xueyi.system.staff.mapper.DmStaffMapper; import com.xueyi.system.staff.mapper.DmVisitRecordsMapper; import com.xueyi.system.staff.mapper.DmVisitorsMapper; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -58,14 +59,36 @@ public class DmVisitorApiController extends BaseApiController { } + @GetMapping(value = "list-all") + @ResponseBody + public JSONObject visitList(String devId){ + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); + + return visitorService.visitListAll(vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + + } + @PostMapping(value = "new-visitor") @ResponseBody public JSONObject newVisit(@RequestBody DmVisitCommonDto commonDto){ DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(commonDto.getDevId()); - return visitorService.newVisit(commonDto, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); } + @DeleteMapping(value = "del-visitor") + @ResponseBody + public JSONObject del(@RequestBody DmVisitCommonDto commonDto){ + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(commonDto.getDevId()); + return visitorService.delVisit(commonDto, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + } + + @GetMapping(value = "sms-config/{devId}") + @ResponseBody + public JSONObject smsConfig(@PathVariable("devId") String devId){ + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); + return visitorService.smsConfig(devId, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + } + @GetMapping(value = "send-sms/{type}/{devId}") @ResponseBody public JSONObject sendSms(@PathVariable("type") Integer type, @PathVariable("devId") String devId){ @@ -74,4 +97,12 @@ public class DmVisitorApiController extends BaseApiController { return visitorService.sendSms(type, vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); } + @GetMapping(value = "get-sms-users/{devId}") + @ResponseBody + public JSONObject smsUserConfig(@PathVariable("devId") String devId){ + DeviceTenantSourceMergeVo vo = super.getDeviceTenantSourceMergeVo(devId); + + return visitorService.smsUserConfig(vo.getTenantId(), vo.getSourceSlave(), SecurityConstants.INNER); + } + } diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/dto/DmVisitorSmsConfigDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/dto/DmVisitorSmsConfigDto.java new file mode 100644 index 00000000..7c95c8c6 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/dto/DmVisitorSmsConfigDto.java @@ -0,0 +1,20 @@ +package com.xueyi.system.staff.domain.dto; + +import com.xueyi.system.staff.domain.po.DmVisitorSmsConfigPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 租户访客接待短信模板配置 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmVisitorSmsConfigDto extends DmVisitorSmsConfigPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/model/DmVisitorSmsConfigConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/model/DmVisitorSmsConfigConverter.java new file mode 100644 index 00000000..3c958682 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/model/DmVisitorSmsConfigConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.staff.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.staff.domain.dto.DmVisitorSmsConfigDto; +import com.xueyi.system.staff.domain.po.DmVisitorSmsConfigPo; +import com.xueyi.system.staff.domain.query.DmVisitorSmsConfigQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 租户访客接待短信模板配置 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmVisitorSmsConfigConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/po/DmVisitorSmsConfigPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/po/DmVisitorSmsConfigPo.java new file mode 100644 index 00000000..574f17ef --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/po/DmVisitorSmsConfigPo.java @@ -0,0 +1,46 @@ +package com.xueyi.system.staff.domain.po; + +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.CREATE_BY; +import static com.xueyi.common.core.constant.basic.EntityConstants.CREATE_TIME; +import static com.xueyi.common.core.constant.basic.EntityConstants.DEL_FLAG; +import static com.xueyi.common.core.constant.basic.EntityConstants.NAME; +import static com.xueyi.common.core.constant.basic.EntityConstants.REMARK; +import static com.xueyi.common.core.constant.basic.EntityConstants.SORT; +import static com.xueyi.common.core.constant.basic.EntityConstants.STATUS; +import static com.xueyi.common.core.constant.basic.EntityConstants.UPDATE_BY; +import static com.xueyi.common.core.constant.basic.EntityConstants.UPDATE_TIME; + +/** + * 租户访客接待短信模板配置 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_visitor_sms_config", excludeProperty = { STATUS, UPDATE_BY, SORT, CREATE_BY, DEL_FLAG, CREATE_TIME, UPDATE_TIME, REMARK, NAME }) +public class DmVisitorSmsConfigPo extends TBaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** */ + @Excel(name = "") + protected String companyName; + + /** */ + @Excel(name = "") + protected String companyAddress; + + /** */ + @Excel(name = "") + protected String parkPrompt; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/query/DmVisitorSmsConfigQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/query/DmVisitorSmsConfigQuery.java new file mode 100644 index 00000000..4730c4eb --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/domain/query/DmVisitorSmsConfigQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.staff.domain.query; + +import com.xueyi.system.staff.domain.po.DmVisitorSmsConfigPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 租户访客接待短信模板配置 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmVisitorSmsConfigQuery extends DmVisitorSmsConfigPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/IDmVisitorSmsConfigManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/IDmVisitorSmsConfigManager.java new file mode 100644 index 00000000..e0c3b0fc --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/IDmVisitorSmsConfigManager.java @@ -0,0 +1,13 @@ +package com.xueyi.system.staff.manager; + +import com.xueyi.system.staff.domain.dto.DmVisitorSmsConfigDto; +import com.xueyi.system.staff.domain.query.DmVisitorSmsConfigQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * 租户访客接待短信模板配置管理 数据封装层 + * + * @author xueyi + */ +public interface IDmVisitorSmsConfigManager extends IBaseManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/impl/DmVisitorSmsConfigManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/impl/DmVisitorSmsConfigManager.java new file mode 100644 index 00000000..3c3518eb --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/impl/DmVisitorSmsConfigManager.java @@ -0,0 +1,19 @@ +package com.xueyi.system.staff.manager.impl; + +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.staff.domain.dto.DmVisitorSmsConfigDto; +import com.xueyi.system.staff.domain.model.DmVisitorSmsConfigConverter; +import com.xueyi.system.staff.domain.po.DmVisitorSmsConfigPo; +import com.xueyi.system.staff.domain.query.DmVisitorSmsConfigQuery; +import com.xueyi.system.staff.manager.IDmVisitorSmsConfigManager; +import com.xueyi.system.staff.mapper.DmVisitorSmsConfigMapper; +import org.springframework.stereotype.Component; + +/** + * 租户访客接待短信模板配置管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmVisitorSmsConfigManager extends BaseManagerImpl implements IDmVisitorSmsConfigManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/impl/DmVisitorsManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/impl/DmVisitorsManager.java index 3185575c..46746900 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/impl/DmVisitorsManager.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/manager/impl/DmVisitorsManager.java @@ -1,14 +1,25 @@ package com.xueyi.system.staff.manager.impl; +import com.xueyi.common.core.constant.basic.OperateConstants; +import com.xueyi.common.web.entity.domain.SlaveRelation; import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; import com.xueyi.system.api.digitalmans.domain.dto.DmVisitorsDto; import com.xueyi.system.api.digitalmans.domain.po.DmVisitorsPo; +import com.xueyi.system.digitalmans.domain.merge.DmReceptionVisitorMerge; +import com.xueyi.system.digitalmans.mapper.merge.DmReceptionVisitorMergeMapper; +import com.xueyi.system.resource.manager.impl.DmResourcesManager; import com.xueyi.system.staff.domain.model.DmVisitorsConverter; import com.xueyi.system.staff.domain.query.DmVisitorsQuery; import com.xueyi.system.staff.manager.IDmVisitorsManager; import com.xueyi.system.staff.mapper.DmVisitorsMapper; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; + +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Action_Resource_GROUP; +import static com.xueyi.system.digitalmans.domain.merge.MergeGroup.Visitor_DmReceptionVisitorMerge_GROUP; + /** * 访客管理 数据封装层处理 * @@ -16,4 +27,10 @@ import org.springframework.stereotype.Component; */ @Component public class DmVisitorsManager extends BaseManagerImpl implements IDmVisitorsManager { + @Override + protected List subRelationInit() { + List result = new ArrayList(); + result.add(new SlaveRelation(Visitor_DmReceptionVisitorMerge_GROUP, DmReceptionVisitorMergeMapper.class, DmReceptionVisitorMerge.class, OperateConstants.SubOperateLimit.ONLY_DEL)); + return result; + } } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/mapper/DmVisitRecordsMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/mapper/DmVisitRecordsMapper.java index ad96a055..83fa8a16 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/mapper/DmVisitRecordsMapper.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/mapper/DmVisitRecordsMapper.java @@ -20,4 +20,5 @@ public interface DmVisitRecordsMapper extends BaseMapper findByEmp(@Param("userId") Long userId); + List findList(); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/mapper/DmVisitorSmsConfigMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/mapper/DmVisitorSmsConfigMapper.java new file mode 100644 index 00000000..aa0ceb3a --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/mapper/DmVisitorSmsConfigMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.staff.mapper; + +import com.xueyi.system.staff.domain.query.DmVisitorSmsConfigQuery; +import com.xueyi.system.staff.domain.dto.DmVisitorSmsConfigDto; +import com.xueyi.system.staff.domain.po.DmVisitorSmsConfigPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Isolate; + +/** + * 租户访客接待短信模板配置管理 数据层 + * + * @author xueyi + */ +@Isolate +public interface DmVisitorSmsConfigMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/IDmEmpAttendanceService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/IDmEmpAttendanceService.java index 8a444d95..e08d62a6 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/IDmEmpAttendanceService.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/IDmEmpAttendanceService.java @@ -1,5 +1,6 @@ package com.xueyi.system.staff.service; +import com.xueyi.common.web.annotation.TenantIgnore; import com.xueyi.system.staff.domain.query.DmEmpAttendanceQuery; import com.xueyi.system.staff.domain.dto.DmEmpAttendanceDto; import com.xueyi.common.web.entity.service.IBaseService; @@ -10,4 +11,7 @@ import com.xueyi.common.web.entity.service.IBaseService; * @author xueyi */ public interface IDmEmpAttendanceService extends IBaseService { + + @TenantIgnore(tenantLine = true) + public Integer selectCountIgnoreTenant(); } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/IDmVisitorSmsConfigService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/IDmVisitorSmsConfigService.java new file mode 100644 index 00000000..c573ca83 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/IDmVisitorSmsConfigService.java @@ -0,0 +1,13 @@ +package com.xueyi.system.staff.service; + +import com.xueyi.system.staff.domain.query.DmVisitorSmsConfigQuery; +import com.xueyi.system.staff.domain.dto.DmVisitorSmsConfigDto; +import com.xueyi.common.web.entity.service.IBaseService; + +/** + * 租户访客接待短信模板配置管理 服务层 + * + * @author xueyi + */ +public interface IDmVisitorSmsConfigService extends IBaseService { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/impl/DmEmpAttendanceServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/impl/DmEmpAttendanceServiceImpl.java index a4cf6cd4..9584876b 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/impl/DmEmpAttendanceServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/impl/DmEmpAttendanceServiceImpl.java @@ -1,12 +1,18 @@ package com.xueyi.system.staff.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.xueyi.common.web.annotation.TenantIgnore; import com.xueyi.system.staff.domain.dto.DmEmpAttendanceDto; import com.xueyi.system.staff.domain.query.DmEmpAttendanceQuery; +import com.xueyi.system.staff.mapper.DmEmpAttendanceMapper; import com.xueyi.system.staff.service.IDmEmpAttendanceService; import com.xueyi.system.staff.manager.IDmEmpAttendanceManager; import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import java.io.Serializable; import java.util.List; /** @@ -29,4 +35,31 @@ public class DmEmpAttendanceServiceImpl extends BaseServiceImpl redisTemplate; + @Override + @TenantIgnore(tenantLine = true) + public Integer selectCountIgnoreTenant() { + if (redisTemplate.hasKey("broadcast:attendance")) { + Integer attendance = (Integer) redisTemplate.opsForValue().get("broadcast:attendance"); + return attendance; + } else { + Long attendance = attendanceMapper.selectCount(new QueryWrapper<>()); + redisTemplate.opsForValue().set("dashboard:attendance", attendance); + return Math.toIntExact(attendance); + } + } + + public void updRedisCount(){ + if (redisTemplate.hasKey("dashboard:attendance")) { + redisTemplate.opsForValue().increment("dashboard:attendance"); + } else { + Long attendance = attendanceMapper.selectCount(new QueryWrapper<>()); + redisTemplate.opsForValue().set("dashboard:attendance", attendance); + } + } } \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/impl/DmStaffServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/impl/DmStaffServiceImpl.java index 2cb19398..5e8ec858 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/impl/DmStaffServiceImpl.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/staff/service/impl/DmStaffServiceImpl.java @@ -35,6 +35,8 @@ public class DmStaffServiceImpl extends BaseServiceImpl wrapper = new QueryWrapper<>(); wrapper.eq("id",empAttendance.getId()); dmEmpAttendanceMapper.update(empAttendance, wrapper); + } else { DmEmpAttendancePo ea = new DmEmpAttendancePo(); Date checkDate = DateUtils.parseStrToDate(DateUtils.formatDate(checkTime, "yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss"); @@ -123,6 +126,7 @@ public class DmStaffServiceImpl extends BaseServiceImpl implements IDmVisitRecordsService { + + private static final int CODE_LENGTH = 4; + private static final String REDIS_KEY_PREFIX = "visitor:verification_code:"; + + @Autowired + private RedisTemplate redisTemplate; + + + public String generateCode() { + /*try { + Random random = SecureRandom.getInstanceStrong(); + StringBuilder codeBuilder = new StringBuilder(CODE_LENGTH); + + for (int i = 0; i < CODE_LENGTH; i++) { + int digit = random.nextInt(10); + codeBuilder.append(digit); + } + return codeBuilder.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + }*/ + String timeStr = String.valueOf(System.currentTimeMillis()); + timeStr.substring(timeStr.length() - 4 ); + + return timeStr.substring(timeStr.length() - 4 ); + } + + public boolean storeCode(String code) { + String redisKey = REDIS_KEY_PREFIX + code; + Boolean success = redisTemplate.opsForValue().setIfAbsent(redisKey, code, 1, TimeUnit.DAYS); + return success != null && success; + } + /** * 查询访客对象列表 | 数据权限 * @@ -29,4 +66,15 @@ public class DmVisitRecordsServiceImpl extends BaseServiceImpl implements IDmVisitorSmsConfigService { + + /** + * 查询租户访客接待短信模板配置对象列表 | 数据权限 + * + * @param visitorSmsConfig 租户访客接待短信模板配置对象 + * @return 租户访客接待短信模板配置对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmVisitorSmsConfigMapper"}) + public List selectListScope(DmVisitorSmsConfigQuery visitorSmsConfig) { + return baseManager.selectList(visitorSmsConfig); + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/controller/DmApkVersionController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/controller/DmApkVersionController.java new file mode 100644 index 00000000..bf2386c8 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/controller/DmApkVersionController.java @@ -0,0 +1,111 @@ +package com.xueyi.system.version.controller; + +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.system.api.version.domain.vo.ApkReleaseVo; +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.system.version.domain.query.DmApkVersionQuery; +import com.xueyi.system.version.service.IDmApkVersionService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.List; + +/** + * 版本管理管理 业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/apkversion") +public class DmApkVersionController extends BaseController { + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "版本管理" ; + } + + + @PostMapping("/api/apk_release_notify") + @Log(title = "版本管理发布通知", businessType = BusinessType.INSERT) + public AjaxResult apkReleaseNotify( @RequestBody ApkReleaseVo apkReleaseVo) { + // 向数据库插入一条数据 + DmApkVersionDto apkVersion = new DmApkVersionDto(); + apkVersion.setApkVersion(apkReleaseVo.getApkVersionName()); + apkVersion.setCodeVersion(apkReleaseVo.getCodeVersionName()); + apkVersion.setReleaseTime(apkReleaseVo.getReleaseTime()); + apkVersion.setPath(apkReleaseVo.getPath()); + apkVersion.setComment(apkReleaseVo.getComment()); + return super.add(apkVersion); + } + + + /** + * 查询版本管理列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_APK_VERSION_LIST) + public AjaxResult list(DmApkVersionQuery apkVersion) { + return super.list(apkVersion); + } + + /** + * 查询版本管理详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_APK_VERSION_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return super.getInfo(id); + } + + /** + * 版本管理新增 + */ + @Override + @PostMapping + @RequiresPermissions(Auth.DM_APK_VERSION_ADD) + @Log(title = "版本管理管理", businessType = BusinessType.INSERT) + public AjaxResult add(@Validated({V_A.class}) @RequestBody DmApkVersionDto apkVersion) { + return super.add(apkVersion); + } + + /** + * 版本管理批量删除 + */ + @Override + @DeleteMapping("/batch/{idList}") + @RequiresPermissions(Auth.DM_APK_VERSION_DEL) + @Log(title = "版本管理管理", businessType = BusinessType.DELETE) + public AjaxResult batchRemove(@PathVariable List idList) { + return super.batchRemove(idList); + } + + /** + * 获取版本管理选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 版本管理管理 - 列表 */ + String DM_APK_VERSION_LIST = "version:apkversion:list"; + /** 系统 - 版本管理管理 - 详情 */ + String DM_APK_VERSION_SINGLE = "version:apkversion:single"; + /** 系统 - 版本管理管理 - 新增 */ + String DM_APK_VERSION_ADD = "version:apkversion:add"; + /** 系统 - 版本管理管理 - 删除 */ + String DM_APK_VERSION_DEL = "version:apkversion:delete"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/controller/DmReleaseManagerController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/controller/DmReleaseManagerController.java new file mode 100644 index 00000000..76eb1d01 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/controller/DmReleaseManagerController.java @@ -0,0 +1,97 @@ +package com.xueyi.system.version.controller; + +import com.xueyi.common.core.web.result.AjaxResult; +import com.xueyi.common.core.web.result.R; +import com.xueyi.common.core.web.validate.V_A; +import com.xueyi.common.core.web.validate.V_E; +import com.xueyi.common.log.annotation.Log; +import com.xueyi.common.log.enums.BusinessType; +import com.xueyi.common.mqtt.connection.MqttTemplate; +import com.xueyi.common.security.annotation.RequiresPermissions; +import com.xueyi.common.web.entity.controller.BaseController; +import com.xueyi.message.api.transfer.domain.vo.DmDeployScheduleVo; +import com.xueyi.system.api.digitalmans.domain.dto.DmManDeviceDto; +import com.xueyi.system.api.organize.domain.dto.SysEnterpriseDto; +import com.xueyi.system.digitalmans.controller.DmDigitalmanExtController; +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; +import com.xueyi.system.version.service.IDmReleaseManagerService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.Serializable; +import java.util.List; + +/** + * 发布管理管理 业务处理 + * + * @author xueyi + */ +@RestController +@RequestMapping("/releaseManager") +public class DmReleaseManagerController extends BaseController { + + private static final Logger log = LoggerFactory.getLogger(DmReleaseManagerController.class); + @Autowired + MqttTemplate mqttTemplate; + + /** 定义节点名称 */ + @Override + protected String getNodeName() { + return "发布管理" ; + } + + /** 根据设备id获取数字人信息 */ + @PostMapping("/inner/reply") + R syncDeployStatus(@RequestBody DmDeployScheduleVo vo) { + log.info(vo.toString()); + + return R.ok(baseService.syncDeployStatusByDevId(vo)); + } + + /** + * 查询发布管理列表 + */ + @Override + @GetMapping("/list") + @RequiresPermissions(Auth.DM_MAN_DEVICE_LIST) + public AjaxResult list(DmReleaseManagerQuery releaseManager) { + return super.list(releaseManager); + } + + /** + * 查询发布管理详细 + */ + @Override + @GetMapping(value = "/{id}") + @RequiresPermissions(Auth.DM_MAN_DEVICE_SINGLE) + public AjaxResult getInfo(@PathVariable Serializable id) { + return success(super.baseService.selectHistoryByDevId(id)); + } + + @PostMapping("/batch/remote/{idList}") + @Log(title = "数字人升级", businessType = BusinessType.OTHER) + public AjaxResult batchRemoteDeploy(@PathVariable List idList, @RequestParam("apkVersion") String apkVersion) { + return success(baseService.remoteDeployByDevId(idList, apkVersion)); + } + + /** + * 获取发布管理选择框列表 + */ + @Override + @GetMapping("/option") + public AjaxResult option() { + return super.option(); + } + + interface Auth { + /** 系统 - 发布管理管理 - 列表 */ + String DM_MAN_DEVICE_LIST = "version:releaseManager:list"; + /** 系统 - 发布管理管理 - 详情 */ + String DM_MAN_DEVICE_SINGLE = "version:releaseManager:single"; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/dto/DmApkVersionDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/dto/DmApkVersionDto.java new file mode 100644 index 00000000..aecf8da2 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/dto/DmApkVersionDto.java @@ -0,0 +1,21 @@ +package com.xueyi.system.version.domain.dto; + +import com.xueyi.system.version.domain.po.DmApkVersionPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 版本管理 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmApkVersionDto extends DmApkVersionPo { + + @Serial + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/dto/DmDeployHistoryDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/dto/DmDeployHistoryDto.java new file mode 100644 index 00000000..6550326b --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/dto/DmDeployHistoryDto.java @@ -0,0 +1,22 @@ +package com.xueyi.system.version.domain.dto; + +import com.xueyi.system.version.domain.po.DmDeployHistoryPo; +import com.xueyi.system.version.domain.po.DmReleaseManagerPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 发布管理 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmDeployHistoryDto extends DmDeployHistoryPo { + + @Serial + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/dto/DmReleaseManagerDto.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/dto/DmReleaseManagerDto.java new file mode 100644 index 00000000..d6d6498c --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/dto/DmReleaseManagerDto.java @@ -0,0 +1,21 @@ +package com.xueyi.system.version.domain.dto; + +import com.xueyi.system.version.domain.po.DmReleaseManagerPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 发布管理 数据传输对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmReleaseManagerDto extends DmReleaseManagerPo { + + @Serial + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/model/DmApkVersionConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/model/DmApkVersionConverter.java new file mode 100644 index 00000000..c67730a1 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/model/DmApkVersionConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.version.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.system.version.domain.po.DmApkVersionPo; +import com.xueyi.system.version.domain.query.DmApkVersionQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 版本管理 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmApkVersionConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/model/DmDeployHistoryConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/model/DmDeployHistoryConverter.java new file mode 100644 index 00000000..0ad521f3 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/model/DmDeployHistoryConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.version.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.version.domain.dto.DmDeployHistoryDto; +import com.xueyi.system.version.domain.po.DmDeployHistoryPo; +import com.xueyi.system.version.domain.query.DmDeployHistoryQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 发布管理 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmDeployHistoryConverter extends BaseConverter { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/model/DmReleaseManagerConverter.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/model/DmReleaseManagerConverter.java new file mode 100644 index 00000000..d9a2f9b9 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/model/DmReleaseManagerConverter.java @@ -0,0 +1,17 @@ +package com.xueyi.system.version.domain.model; + +import com.xueyi.common.core.web.entity.model.BaseConverter; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.system.version.domain.po.DmReleaseManagerPo; +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants; + +/** + * 发布管理 对象映射器 + * + * @author xueyi + */ +@Mapper(componentModel = MappingConstants.ComponentModel.SPRING) +public interface DmReleaseManagerConverter extends BaseConverter { +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/po/DmApkVersionPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/po/DmApkVersionPo.java new file mode 100644 index 00000000..129b90f8 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/po/DmApkVersionPo.java @@ -0,0 +1,53 @@ +package com.xueyi.system.version.domain.po; + +import java.time.LocalDateTime; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xueyi.common.core.web.entity.base.BaseEntity; +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +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.DEL_FLAG; +import static com.xueyi.common.core.constant.basic.EntityConstants.REMARK; +import static com.xueyi.common.core.constant.basic.EntityConstants.NAME; + +/** + * 版本管理 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_apk_version", excludeProperty = { STATUS, DEL_FLAG, REMARK, NAME }) +public class DmApkVersionPo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** apk版本 */ + @Excel(name = "apk版本") + protected String apkVersion; + + /** 代码版本 */ + @Excel(name = "代码版本") + protected String codeVersion; + + /** 版本安装路径 */ + @Excel(name = "版本安装路径") + protected String path; + + /** 版本更新说明 */ + @Excel(name = "版本更新说明") + protected String comment; + + /** 发布时间 */ + @Excel(name = "发布时间") + protected LocalDateTime releaseTime; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/po/DmDeployHistoryPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/po/DmDeployHistoryPo.java new file mode 100644 index 00000000..09399e60 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/po/DmDeployHistoryPo.java @@ -0,0 +1,35 @@ +package com.xueyi.system.version.domain.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.xueyi.common.core.annotation.Excel; +import com.xueyi.common.core.web.entity.base.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.time.LocalDateTime; + +import static com.xueyi.common.core.constant.basic.EntityConstants.*; + +/** + * 版本管理 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_deploy_history", excludeProperty = { STATUS, DEL_FLAG, REMARK, NAME }) +public class DmDeployHistoryPo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** apk版本 */ + @Excel(name = "apk版本") + protected String devId; + + /** 代码版本 */ + @Excel(name = "代码版本") + protected String apkVersionId; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/po/DmReleaseManagerPo.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/po/DmReleaseManagerPo.java new file mode 100644 index 00000000..e0e232ca --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/po/DmReleaseManagerPo.java @@ -0,0 +1,69 @@ +package com.xueyi.system.version.domain.po; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xueyi.common.core.web.entity.base.BaseEntity; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.common.core.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +import static com.xueyi.common.core.constant.basic.EntityConstants.REMARK; + +/** + * 发布管理 持久化对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "dm_man_device", excludeProperty = { REMARK }) +public class DmReleaseManagerPo extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** 租户名 */ + @Excel(name = "租户名") + protected String tenantName; + + /** 设备号 */ + @Excel(name = "设备号") + protected String deviceId; + + /** 数字人编号 */ + @Excel(name = "数字人编号") + protected String manCode; + + /** 激活日期 */ + @Excel(name = "激活日期") + protected Date activateTime; + + /** 代码版本号 */ + @Excel(name = "代码版本号") + protected String softwareVersion; + + /** 状态(0,未激活;1:在线;2:离线) */ + @Excel(name = "状态(0,未激活;1:在线;2:离线)") + protected String onlineStatus; + + /** 租户id */ + @Excel(name = "租户id") + protected Long tId; + + /** 状态 */ + @Excel(name = "状态") + protected String status; + + /** apk版本号 */ + @Excel(name = "apk版本号") + protected String apkVersion; + + /** 安装状态 */ + @Excel + protected Integer setupStatus; + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/query/DmApkVersionQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/query/DmApkVersionQuery.java new file mode 100644 index 00000000..d56ba78f --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/query/DmApkVersionQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.version.domain.query; + +import com.xueyi.system.version.domain.po.DmApkVersionPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 版本管理 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmApkVersionQuery extends DmApkVersionPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/query/DmDeployHistoryQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/query/DmDeployHistoryQuery.java new file mode 100644 index 00000000..d14b4fce --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/query/DmDeployHistoryQuery.java @@ -0,0 +1,21 @@ +package com.xueyi.system.version.domain.query; + +import com.xueyi.system.version.domain.po.DmDeployHistoryPo; +import com.xueyi.system.version.domain.po.DmReleaseManagerPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 发布管理 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmDeployHistoryQuery extends DmDeployHistoryPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/query/DmReleaseManagerQuery.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/query/DmReleaseManagerQuery.java new file mode 100644 index 00000000..918b9597 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/domain/query/DmReleaseManagerQuery.java @@ -0,0 +1,20 @@ +package com.xueyi.system.version.domain.query; + +import com.xueyi.system.version.domain.po.DmReleaseManagerPo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 发布管理 数据查询对象 + * + * @author xueyi + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DmReleaseManagerQuery extends DmReleaseManagerPo { + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/IDmApkVersionManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/IDmApkVersionManager.java new file mode 100644 index 00000000..fe7fa702 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/IDmApkVersionManager.java @@ -0,0 +1,13 @@ +package com.xueyi.system.version.manager; + +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.system.version.domain.query.DmApkVersionQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +/** + * 版本管理管理 数据封装层 + * + * @author xueyi + */ +public interface IDmApkVersionManager extends IBaseManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/IDmDeployHistoryManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/IDmDeployHistoryManager.java new file mode 100644 index 00000000..02db2162 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/IDmDeployHistoryManager.java @@ -0,0 +1,19 @@ +package com.xueyi.system.version.manager; + +import com.xueyi.common.web.entity.manager.IBaseManager; +import com.xueyi.system.version.domain.dto.DmDeployHistoryDto; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.system.version.domain.query.DmDeployHistoryQuery; +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; + +import java.io.Serializable; +import java.util.List; + +/** + * 发布管理管理 数据封装层 + * + * @author xueyi + */ +public interface IDmDeployHistoryManager extends IBaseManager { + List selectHistoryByDevId (Serializable id); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/IDmReleaseManagerManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/IDmReleaseManagerManager.java new file mode 100644 index 00000000..b89bfa02 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/IDmReleaseManagerManager.java @@ -0,0 +1,18 @@ +package com.xueyi.system.version.manager; + +import com.xueyi.system.version.domain.dto.DmDeployHistoryDto; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; +import com.xueyi.common.web.entity.manager.IBaseManager; + +import java.io.Serializable; +import java.util.List; + +/** + * 发布管理管理 数据封装层 + * + * @author xueyi + */ +public interface IDmReleaseManagerManager extends IBaseManager { + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/impl/DmApkVersionManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/impl/DmApkVersionManager.java new file mode 100644 index 00000000..3cdc4a0f --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/impl/DmApkVersionManager.java @@ -0,0 +1,19 @@ +package com.xueyi.system.version.manager.impl; + +import com.xueyi.system.version.domain.po.DmApkVersionPo; +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.system.version.domain.query.DmApkVersionQuery; +import com.xueyi.system.version.domain.model.DmApkVersionConverter; +import com.xueyi.system.version.mapper.DmApkVersionMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.version.manager.IDmApkVersionManager; +import org.springframework.stereotype.Component; + +/** + * 版本管理管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmApkVersionManager extends BaseManagerImpl implements IDmApkVersionManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/impl/DmDeployHistoryManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/impl/DmDeployHistoryManager.java new file mode 100644 index 00000000..f95439fd --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/impl/DmDeployHistoryManager.java @@ -0,0 +1,33 @@ +package com.xueyi.system.version.manager.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.version.domain.dto.DmDeployHistoryDto; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.system.version.domain.model.DmDeployHistoryConverter; +import com.xueyi.system.version.domain.model.DmReleaseManagerConverter; +import com.xueyi.system.version.domain.po.DmDeployHistoryPo; +import com.xueyi.system.version.domain.po.DmReleaseManagerPo; +import com.xueyi.system.version.domain.query.DmDeployHistoryQuery; +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; +import com.xueyi.system.version.manager.IDmDeployHistoryManager; +import com.xueyi.system.version.manager.IDmReleaseManagerManager; +import com.xueyi.system.version.mapper.DmDeployHistoryMapper; +import com.xueyi.system.version.mapper.DmReleaseManagerMapper; +import org.springframework.stereotype.Component; + +import java.io.Serializable; +import java.util.List; + +/** + * 发布管理管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmDeployHistoryManager extends BaseManagerImpl implements IDmDeployHistoryManager { + @Override + public List selectHistoryByDevId(Serializable id) { + return mapperDto(super.baseMapper.selectList(new LambdaQueryWrapper().eq(DmDeployHistoryPo::getDevId, id))); + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/impl/DmReleaseManagerManager.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/impl/DmReleaseManagerManager.java new file mode 100644 index 00000000..07853c3f --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/manager/impl/DmReleaseManagerManager.java @@ -0,0 +1,19 @@ +package com.xueyi.system.version.manager.impl; + +import com.xueyi.system.version.domain.po.DmReleaseManagerPo; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; +import com.xueyi.system.version.domain.model.DmReleaseManagerConverter; +import com.xueyi.system.version.mapper.DmReleaseManagerMapper; +import com.xueyi.common.web.entity.manager.impl.BaseManagerImpl; +import com.xueyi.system.version.manager.IDmReleaseManagerManager; +import org.springframework.stereotype.Component; + +/** + * 发布管理管理 数据封装层处理 + * + * @author xueyi + */ +@Component +public class DmReleaseManagerManager extends BaseManagerImpl implements IDmReleaseManagerManager { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/mapper/DmApkVersionMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/mapper/DmApkVersionMapper.java new file mode 100644 index 00000000..1d7c3d2d --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/mapper/DmApkVersionMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.version.mapper; + +import com.xueyi.system.version.domain.query.DmApkVersionQuery; +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.system.version.domain.po.DmApkVersionPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Master; + +/** + * 版本管理管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmApkVersionMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/mapper/DmDeployHistoryMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/mapper/DmDeployHistoryMapper.java new file mode 100644 index 00000000..25a946ad --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/mapper/DmDeployHistoryMapper.java @@ -0,0 +1,19 @@ +package com.xueyi.system.version.mapper; + +import com.xueyi.common.datasource.annotation.Master; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.system.version.domain.dto.DmDeployHistoryDto; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.system.version.domain.po.DmDeployHistoryPo; +import com.xueyi.system.version.domain.po.DmReleaseManagerPo; +import com.xueyi.system.version.domain.query.DmDeployHistoryQuery; +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; + +/** + * 发布管理管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmDeployHistoryMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/mapper/DmReleaseManagerMapper.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/mapper/DmReleaseManagerMapper.java new file mode 100644 index 00000000..712e983f --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/mapper/DmReleaseManagerMapper.java @@ -0,0 +1,16 @@ +package com.xueyi.system.version.mapper; + +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.system.version.domain.po.DmReleaseManagerPo; +import com.xueyi.common.web.entity.mapper.BaseMapper; +import com.xueyi.common.datasource.annotation.Master; + +/** + * 发布管理管理 数据层 + * + * @author xueyi + */ +@Master +public interface DmReleaseManagerMapper extends BaseMapper { +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/IDmApkVersionService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/IDmApkVersionService.java new file mode 100644 index 00000000..ebc93975 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/IDmApkVersionService.java @@ -0,0 +1,17 @@ +package com.xueyi.system.version.service; + +import com.xueyi.system.version.domain.query.DmApkVersionQuery; +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.common.web.entity.service.IBaseService; + +import java.io.Serializable; + +/** + * 版本管理管理 服务层 + * + * @author xueyi + */ +public interface IDmApkVersionService extends IBaseService { + + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/IDmReleaseManagerService.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/IDmReleaseManagerService.java new file mode 100644 index 00000000..9dfe7d8c --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/IDmReleaseManagerService.java @@ -0,0 +1,24 @@ +package com.xueyi.system.version.service; + +import com.xueyi.message.api.transfer.domain.vo.DmDeployScheduleVo; +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.system.version.domain.dto.DmDeployHistoryDto; +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.common.web.entity.service.IBaseService; + +import java.io.Serializable; +import java.util.List; + +/** + * 发布管理管理 服务层 + * + * @author xueyi + */ +public interface IDmReleaseManagerService extends IBaseService { + List selectHistoryByDevId(Serializable id); + + Integer remoteDeployByDevId(List idList, String apkVersion); + + Integer syncDeployStatusByDevId(DmDeployScheduleVo vo); +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/impl/DmApkVersionServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/impl/DmApkVersionServiceImpl.java new file mode 100644 index 00000000..fd3a6745 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/impl/DmApkVersionServiceImpl.java @@ -0,0 +1,32 @@ +package com.xueyi.system.version.service.impl; + +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.system.version.domain.query.DmApkVersionQuery; +import com.xueyi.system.version.service.IDmApkVersionService; +import com.xueyi.system.version.manager.IDmApkVersionManager; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 版本管理管理 服务层处理 + * + * @author xueyi + */ +@Service +public class DmApkVersionServiceImpl extends BaseServiceImpl implements IDmApkVersionService { + + /** + * 查询版本管理对象列表 | 数据权限 + * + * @param apkVersion 版本管理对象 + * @return 版本管理对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmApkVersionMapper"}) + public List selectListScope(DmApkVersionQuery apkVersion) { + return baseManager.selectList(apkVersion); + } + +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/impl/DmReleaseManagerServiceImpl.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/impl/DmReleaseManagerServiceImpl.java new file mode 100644 index 00000000..07fab570 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/version/service/impl/DmReleaseManagerServiceImpl.java @@ -0,0 +1,102 @@ +package com.xueyi.system.version.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.xueyi.common.core.constant.digitalman.MessageConstants; +import com.xueyi.common.mqtt.connection.MqttTemplate; +import com.xueyi.common.web.entity.service.impl.BaseServiceImpl; +import com.xueyi.message.api.transfer.domain.vo.DmDeployScheduleVo; +import com.xueyi.system.digitalmans.manager.IDmManDeviceManager; +import com.xueyi.system.version.domain.dto.DmApkVersionDto; +import com.xueyi.system.version.domain.dto.DmDeployHistoryDto; +import com.xueyi.system.version.domain.dto.DmReleaseManagerDto; +import com.xueyi.system.version.domain.query.DmApkVersionQuery; +import com.xueyi.system.version.domain.query.DmReleaseManagerQuery; +import com.xueyi.system.version.manager.IDmApkVersionManager; +import com.xueyi.system.version.manager.IDmDeployHistoryManager; +import com.xueyi.system.version.manager.IDmReleaseManagerManager; +import com.xueyi.system.version.service.IDmReleaseManagerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.Serializable; +import java.util.List; + +/** + * 发布管理管理 服务层处理 + * + * @author xueyi + */ +@Service +public class DmReleaseManagerServiceImpl extends BaseServiceImpl implements IDmReleaseManagerService { + + @Autowired + IDmDeployHistoryManager deployHistoryManager; + + @Autowired + IDmManDeviceManager dmManDeviceManager; + @Autowired + IDmApkVersionManager apkVersionManager; + @Autowired + MqttTemplate mqttTemplate; + /** + * 查询发布管理对象列表 | 数据权限 + * + * @param releaseManager 发布管理对象 + * @return 发布管理对象集合 + */ + @Override + //@DataScope(userAlias = "createBy", mapperScope = {"DmReleaseManagerMapper"}) + public List selectListScope(DmReleaseManagerQuery releaseManager) { + return baseManager.selectList(releaseManager); + } + + @Override + public List selectHistoryByDevId(Serializable id) { + return deployHistoryManager.selectHistoryByDevId(id); + } + + @Override + public Integer remoteDeployByDevId(List idList, String apkVersion) { + // 对idList进行遍历 + int cnt = 0; + for (String dId : idList) { + + // 1.dId表示设备dId,根据设备id查询dm_man_device表并获取dto + DmReleaseManagerQuery query = new DmReleaseManagerQuery(); + query.setDeviceId(dId); + DmReleaseManagerDto dmReleaseManagerDto = baseManager.selectList(query).get(0); + if (dmReleaseManagerDto == null) { + return 0; + } + // 根据apkVersion获取DmApkVersionDto + DmApkVersionQuery versionQuery = new DmApkVersionQuery(); + versionQuery.setApkVersion(apkVersion); + DmApkVersionDto dmApkVersionDto = apkVersionManager.selectList(versionQuery).get(0); + JSONObject jo = new JSONObject(); + jo.put("versionName", apkVersion); + jo.put("path", dmApkVersionDto.getPath()); + jo.put("setupTime", dmApkVersionDto.getReleaseTime()); + jo.put("md5", ""); + // 2.向Mqtt发送消息 + mqttTemplate.sendToMqtt("/prod/digital_man/" + dId + "/notify/apk_update", jo.toJSONString()); + // 3. 更新setup_status字段并更新表 + dmReleaseManagerDto.setSetupStatus(MessageConstants.SYS_DICT_DATA_RELEASE_START_DOWNLOAD); + baseManager.update(dmReleaseManagerDto); + cnt++; + } + + return cnt; + } + + @Override + public Integer syncDeployStatusByDevId(DmDeployScheduleVo vo) { + // 1.获取vo中的devId,并根据devId获取DmReleaseManagerDto + DmReleaseManagerQuery query = new DmReleaseManagerQuery(); + query.setDeviceId(vo.getDevId()); + DmReleaseManagerDto dmReleaseManagerDto = baseManager.selectList(query).get(0); + // 2. 更新setup_status字段并更新表 + dmReleaseManagerDto.setSetupStatus(vo.getType()); + + return baseManager.update(dmReleaseManagerDto); + } +} \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/resources/bootstrap.yml b/xueyi-modules/xueyi-system/src/main/resources/bootstrap.yml index 1ad7e15b..803c03b4 100644 --- a/xueyi-modules/xueyi-system/src/main/resources/bootstrap.yml +++ b/xueyi-modules/xueyi-system/src/main/resources/bootstrap.yml @@ -9,7 +9,7 @@ spring: name: xueyi-system profiles: # 环境配置 - active: dev + active: @activatedProperties@ servlet: multipart: max-request-size: 20MB @@ -18,15 +18,14 @@ spring: nacos: discovery: # 服务注册地址 - server-addr: 172.17.0.1:18848 - #server-addr: 39.107.77.235:18848 -# namespace: 6d0ee265-2a92-44cc-a6de-f34b3ea104e6 + server-addr: @nacos.host@:@nacos.port@ + namespace: @nacos.namespace@ config: -# namespace: 6d0ee265-2a92-44cc-a6de-f34b3ea104e6 # 配置中心地址 - #server-addr: 39.107.77.235:18848 - 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-system/src/main/resources/mapper/deptExt/SysDeptExtMapper.xml b/xueyi-modules/xueyi-system/src/main/resources/mapper/deptExt/SysDeptExtMapper.xml index f59cc7c1..e21e92d7 100644 --- a/xueyi-modules/xueyi-system/src/main/resources/mapper/deptExt/SysDeptExtMapper.xml +++ b/xueyi-modules/xueyi-system/src/main/resources/mapper/deptExt/SysDeptExtMapper.xml @@ -6,29 +6,29 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - - + + + + - insert into sys_dept_ext (dept_id,workday_hour_start,workday_hour_end,weekend_hour_start,weekend_hour_end) - values (#{deptId},#{workdayHourStart},#{workdayHourEnd},#{weekendHourStart},#{weekendHourEnd}) + insert into sys_dept_ext (dept_id,on_duty_hour_start,on_duty_hour_end,off_duty_hour_start,off_duty_hour_end) + values (#{deptId},#{onDutyHourStart},#{onDutyHourEnd},#{offDutyHourStart},#{offDutyHourEnd}) update sys_dept_ext - workday_hour_start = #{workdayHourStart}, - workday_hour_end = #{workdayHourEnd}, - weekend_hour_start = #{weekendHourStart}, - weekend_hour_end = #{weekendHourEnd}, + on_duty_hour_start = #{onDutyHourStart}, + on_duty_hour_end = #{onDutyHourEnd}, + off_duty_hour_start = #{offDutyHourStart}, + off_duty_hour_end = #{offDutyHourEnd}, where dept_id = #{deptId} diff --git a/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmDigitalmanExtMapper.xml b/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmDigitalmanExtMapper.xml index c452b4a2..79525d24 100644 --- a/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmDigitalmanExtMapper.xml +++ b/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmDigitalmanExtMapper.xml @@ -8,4 +8,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmManDeviceMapper.xml b/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmManDeviceMapper.xml index 64148c54..3efc7b94 100644 --- a/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmManDeviceMapper.xml +++ b/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmManDeviceMapper.xml @@ -14,6 +14,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -34,6 +36,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -57,6 +64,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" activate_time = #{activateTime}, software_version = #{softwareVersion}, online_status = #{onlineStatus}, + setup_status = #{setupStatus}, + apk_version = #{apkVersion}, where man_code = #{manCode} diff --git a/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmSkillMapper.xml b/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmSkillMapper.xml index b361149d..7d6a0993 100644 --- a/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmSkillMapper.xml +++ b/xueyi-modules/xueyi-system/src/main/resources/mapper/digitalmans/DmSkillMapper.xml @@ -23,4 +23,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select s.id, s.man_id,s.status, s.first_call, s.skill_code, s.info, s.del_flag, s.resp, s.motion_id, s.motion_name from dm_skills s where (UNIX_TIMESTAMP(s.update_time) * 1000 > #{timestamp} or UNIX_TIMESTAMP(s.create_time) * 1000 > #{timestamp} ) and man_id = #{manId} + + \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/resources/mapper/meeting/DmMeetingOrdersMapper.xml b/xueyi-modules/xueyi-system/src/main/resources/mapper/meeting/DmMeetingOrdersMapper.xml index 5a5aee38..8e169b89 100644 --- a/xueyi-modules/xueyi-system/src/main/resources/mapper/meeting/DmMeetingOrdersMapper.xml +++ b/xueyi-modules/xueyi-system/src/main/resources/mapper/meeting/DmMeetingOrdersMapper.xml @@ -20,7 +20,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT * FROM dm_meeting_orders WHERE order_date = #{orderDate} AND del_flag = 0 AND space_id = #{spaceId} + + + \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/resources/mapper/pass/DmRecognizedRecordsMapper.xml b/xueyi-modules/xueyi-system/src/main/resources/mapper/pass/DmRecognizedRecordsMapper.xml new file mode 100644 index 00000000..593c0da0 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/resources/mapper/pass/DmRecognizedRecordsMapper.xml @@ -0,0 +1,12 @@ + + + + + + DELETE FROM dm_recognized_records + WHERE recognized_time DATE_SUB(NOW(), INTERVAL ${day} DAY) AND user_id='88888'; + + + \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmStaffMapper.xml b/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmStaffMapper.xml index 62803124..4330193c 100644 --- a/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmStaffMapper.xml +++ b/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmStaffMapper.xml @@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -24,12 +25,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmVisitRecordsMapper.xml b/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmVisitRecordsMapper.xml index 4098eb39..1b8437f3 100644 --- a/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmVisitRecordsMapper.xml +++ b/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmVisitRecordsMapper.xml @@ -4,11 +4,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + \ No newline at end of file diff --git a/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmVisitorsMapper.xml b/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmVisitorsMapper.xml index c42df2b7..a76212ee 100644 --- a/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmVisitorsMapper.xml +++ b/xueyi-modules/xueyi-system/src/main/resources/mapper/staff/DmVisitorsMapper.xml @@ -9,13 +9,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select LAST_INSERT_ID() - insert into dm_visitors(name,nickname,phone,visitor_company,type) values + insert into dm_visitors(name,nickname,phone,visitor_company,type,resource_id,avatar) values ( #{name}, #{nickname}, #{phone}, #{visitorCompany}, - #{type} + #{type}, + #{resourceId}, + #{avatar} ) \ No newline at end of file diff --git a/xueyi-modules/xueyi-tenant/Dockerfile b/xueyi-modules/xueyi-tenant/Dockerfile index e40da049..aa068b39 100644 --- a/xueyi-modules/xueyi-tenant/Dockerfile +++ b/xueyi-modules/xueyi-tenant/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-tenant/pom.xml b/xueyi-modules/xueyi-tenant/pom.xml index 8775fdd9..93335805 100644 --- a/xueyi-modules/xueyi-tenant/pom.xml +++ b/xueyi-modules/xueyi-tenant/pom.xml @@ -81,6 +81,20 @@ + + maven-resources-plugin + org.apache.maven.plugins + + @ + false + + + + + src/main/resources + true + + diff --git a/xueyi-modules/xueyi-tenant/src/main/resources/bootstrap.yml b/xueyi-modules/xueyi-tenant/src/main/resources/bootstrap.yml index 413e993b..16d7217d 100644 --- a/xueyi-modules/xueyi-tenant/src/main/resources/bootstrap.yml +++ b/xueyi-modules/xueyi-tenant/src/main/resources/bootstrap.yml @@ -9,7 +9,7 @@ spring: name: xueyi-tenant profiles: # 环境配置 - active: dev + active: @activatedProperties@ servlet: multipart: max-request-size: 20MB @@ -18,10 +18,13 @@ 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 # 共享配置 diff --git a/xueyi-visual/xueyi-monitor/xueyi-visual-monitor.iml b/xueyi-visual/xueyi-monitor/xueyi-visual-monitor.iml deleted file mode 100644 index 99bc7b0c..00000000 --- a/xueyi-visual/xueyi-monitor/xueyi-visual-monitor.iml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file