Prechádzať zdrojové kódy

优化数据库脚本

nifangxu 1 mesiac pred
rodič
commit
6c8f4dbe52

+ 29 - 0
Dockerfile

@@ -0,0 +1,29 @@
+# 🚀 1. 运行阶段:使用精简版 Java 8 运行环境
+FROM openjdk:8-jre-alpine
+
+# 设置容器内工作目录
+WORKDIR /app
+
+# 拷贝已经构建好的 JAR 文件(注意路径根据你的 Jenkins 或宿主机路径修改)
+COPY portal-service-server/target/portal-service-boot.jar app.jar
+
+# 设置时区
+ENV TZ=Asia/Shanghai
+
+# 接收 build-arg,指定 Spring Profile
+ARG spring_profiles_active=dev
+ENV SPRING_PROFILES_ACTIVE=${spring_profiles_active}
+
+# 暴露应用端口(根据你的项目调整)
+EXPOSE 8091
+
+# 启动应用
+ENTRYPOINT ["java", \
+    "-Xms512m", \
+    "-Xmx512m", \
+    "-XX:+UseContainerSupport", \
+    "-XX:+UseG1GC", \
+    "-Dfile.encoding=UTF-8", \
+    "-Djava.security.egd=file:/dev/./urandom", \
+    "-jar", "app.jar", \
+    "--spring.profiles.active=${SPRING_PROFILES_ACTIVE}"]

+ 122 - 0
Jenkinsfile

@@ -0,0 +1,122 @@
+pipeline {
+    agent any
+
+    parameters {
+        choice(name: 'env', choices: ['dev', 'test', 'prod'], description: '部署环境(dev/test/prod)')
+        string(name: 'NAMESPACE', defaultValue: 'hfln-dev', description: 'Kubernetes 命名空间')
+    }
+
+    environment {
+        PROJECT_NAME    = 'portal-service'
+        MODULE_NAME     = 'portal-service-server'
+        MAVEN_HOME      = '/usr/local/apache-maven-3.9.9/bin'
+        HARBOR_HOST     = '8.130.28.21:81'
+        KUBECONFIG_PATH = '/root/.kube/config'
+    }
+
+    stages {
+        stage('🧬 设置环境变量') {
+            steps {
+                script {
+                    if (params.env == 'prod') {
+                        env.HARBOR_PROJECT = 'prod'
+                    } else if (params.env == 'test') {
+                        env.HARBOR_PROJECT = 'test'
+                    } else {
+                        env.HARBOR_PROJECT = 'dev'
+                    }
+
+                    echo ">>> 使用环境:${params.env},HARBOR 项目:${env.HARBOR_PROJECT},K8S 命名空间:${params.NAMESPACE}"
+                }
+            }
+        }
+
+        stage('🧬 拉取 Git 代码') {
+            steps {
+                script {
+                    echo ">>> 拉取代码中..."
+                    checkout scm
+                    echo ">>> 代码拉取完成 ✅"
+                }
+            }
+        }
+
+        stage('📦 Maven 构建项目') {
+            steps {
+                script {
+                    echo ">>> 开始构建模块:${MODULE_NAME}"
+                    sh "${MAVEN_HOME}/mvn clean package -DskipTests -pl ${MODULE_NAME} -am"
+                    echo ">>> 构建完成 ✅"
+                }
+            }
+        }
+
+        stage('🐳 构建 & 推送 Docker 镜像') {
+            steps {
+                script {
+                    def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}"
+                    echo ">>> 构建 Docker 镜像: ${imageTag}"
+
+                    sh """
+                        docker login -u admin -p Hfln@1024 ${HARBOR_HOST}
+                        docker build --build-arg spring_profiles_active=${params.env} -t ${imageTag} .
+                        docker push ${imageTag}
+                        docker rmi ${imageTag}
+                    """
+                    echo ">>> Docker 镜像构建并推送完成 ✅"
+                }
+            }
+        }
+
+        stage('🚀 部署到 Kubernetes') {
+            steps {
+                script {
+                    def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}"
+
+                    echo ">>> 正在部署:${PROJECT_NAME} 到命名空间:${params.NAMESPACE}"
+
+                    sh """
+                        export KUBECONFIG=${KUBECONFIG_PATH}
+                        kubectl set image deployment/${PROJECT_NAME} ${PROJECT_NAME}=${imageTag} -n ${params.NAMESPACE}
+                    """
+                    echo ">>> 部署完成 ✅"
+                }
+            }
+        }
+    }
+
+    post {
+        success {
+            echo "✅ 构建 & 部署成功 🎉"
+
+            script {
+                echo "🧹 开始清理旧镜像(只保留最新 3 个)"
+                sh """
+                    docker images --format "{{.Repository}}:{{.Tag}}" | \
+                    grep "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:" | \
+                    sed 's/.*://g' | sort -rn | tail -n +4 | while read oldTag; do
+                        image="${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:\${oldTag}"
+                        echo ">>> 检查镜像是否正在使用:\$image"
+                        CONTAINER=\$(docker ps -a --filter ancestor=\$image --format "{{.ID}}")
+                        if [ -z "\$CONTAINER" ]; then
+                            echo "✅ 删除镜像:\$image"
+                            docker rmi \$image
+                        else
+                            echo "⚠️ 镜像 \$image 正在被容器使用,跳过删除。"
+                        fi
+                    done
+                """
+                echo "🧹 旧镜像清理完成 ✅"
+            }
+        }
+
+        failure {
+            echo "❌ 构建或部署失败,请检查日志!"
+        }
+
+        always {
+            echo "🧼 清理工作区..."
+            cleanWs()
+        }
+    }
+}

+ 10 - 10
LAS.py

@@ -116,7 +116,6 @@ def sys_init():
         # 报警配置
         g_sys_conf["alarm_conf"] = sys_comm.alarm_conf
 
-
         # 启动成功,打印系统信息
         module_name     = g_sys_conf["module_name"]
         platform        = g_sys_conf["platform"]
@@ -125,15 +124,6 @@ def sys_init():
         max_log_size    = g_sys_conf["max_log_size"]
         log_lvl         = g_sys_conf["log_lvl"]
         sp_id           = g_sys_conf["sp_id"]
-        LOGINFO(f" ================ system init succeed !")
-        LOGINFO(f" ================ module         : {module_name}")
-        LOGINFO(f" ================ platform       : {platform}")
-        LOGINFO(f" ================ host_ip        : {host_ip}")
-        LOGINFO(f" ================ max_log_files  : {max_log_files}")
-        LOGINFO(f" ================ max_log_size   : {max_log_size}")
-        LOGINFO(f" ================ log_lvl        : {log_lvl}")
-        LOGINFO(f" ================ sp_id          : {sp_id}")
-        LOGINFO(f" ================ version        : v B1.0")
 
         print(f" ================ system init succeed !")
         print(f" ================ module         : {module_name}")
@@ -145,6 +135,16 @@ def sys_init():
         print(f" ================ sp_id          : {sp_id}")
         print(f" ================ version        : v B1.0")
 
+        LOGINFO(f" ================ system init succeed !")
+        LOGINFO(f" ================ module         : {module_name}")
+        LOGINFO(f" ================ platform       : {platform}")
+        LOGINFO(f" ================ host_ip        : {host_ip}")
+        LOGINFO(f" ================ max_log_files  : {max_log_files}")
+        LOGINFO(f" ================ max_log_size   : {max_log_size}")
+        LOGINFO(f" ================ log_lvl        : {log_lvl}")
+        LOGINFO(f" ================ sp_id          : {sp_id}")
+        LOGINFO(f" ================ version        : v B1.0")
+
         return 0
 
     except json.JSONDecodeError as e:

+ 16 - 8
db/db_scripts/create_alarm_time_plan.sql

@@ -1,9 +1,17 @@
-CREATE TABLE `lnxx_dev`.`alarm_time_plan`  (
-  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '索引',
-  `start_date` char(255) NULL COMMENT '开始日期',
-  `stop_date` char(255) NULL COMMENT '结束日期',
-  `time_range` char(255) NULL COMMENT '生效时间',
-  `month_days` char(255) NULL COMMENT '每月的生效日期',
-  `weekdays` char(255) NULL COMMENT '每周的生效日期',
+-- 幂等化建表
+CREATE TABLE IF NOT EXISTS `lnxx_dev`.`alarm_time_plan2` (
+  `id` INT NOT NULL AUTO_INCREMENT COMMENT '索引',
+  `start_date` CHAR(255) NULL COMMENT '开始日期',
+  `stop_date` CHAR(255) NULL COMMENT '结束日期',
+  `time_range` CHAR(255) NULL COMMENT '生效时间',
+  `month_days` CHAR(255) NULL COMMENT '每月的生效日期',
+  `weekdays` CHAR(255) NULL COMMENT '每周的生效日期',
   PRIMARY KEY (`id`)
-);
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='时间计划表';
+
+ALTER TABLE `lnxx_dev`.`alarm_time_plan2`
+  MODIFY COLUMN `start_date` CHAR(255) NULL COMMENT '开始日期',
+  MODIFY COLUMN `stop_date` CHAR(255) NULL COMMENT '结束日期',
+  MODIFY COLUMN `time_range` CHAR(255) NULL COMMENT '生效时间',
+  MODIFY COLUMN `month_days` CHAR(255) NULL COMMENT '每月的生效日期',
+  MODIFY COLUMN `weekdays` CHAR(255) NULL COMMENT '每周的生效日期';

+ 32 - 16
db/db_scripts/create_alram_plan.sql

@@ -1,17 +1,33 @@
-CREATE TABLE `lnxx_dev`.`alarm_plan`  (
-  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '索引',
-  `uuid` varchar(255) NULL COMMENT 'uuid',
-  `name` varchar(255) NULL COMMENT '计划名称',
-  `dev_id` varchar(255) NULL COMMENT '设备id',
-  `enable` int(0) NULL COMMENT '是否启用',
-  `region` varchar(255) NULL COMMENT '检测区域[left, top, width, height]',
-  `event_val` int(0) NULL COMMENT '事件类型值',
-  `alarm_time_plan_id` int(0) NULL COMMENT '时间计划表id',
-  `threshold_time` int(0) NULL COMMENT '触发阈值(秒)',
-  `merge_time` int(0) NULL COMMENT '归并时间(秒)',
-  `param` varchar(255) NULL COMMENT '参数',
-  `create_time` datetime(0) NULL COMMENT '创建时间',
-  `update_time` datetime(0) NULL COMMENT '更新时间',
-  `remark` varchar(255) NULL COMMENT 'remark',
+-- 幂等化建表
+CREATE TABLE IF NOT EXISTS `lnxx_dev`.`alarm_plan2` (
+  `id` INT NOT NULL AUTO_INCREMENT COMMENT '索引',
+  `uuid` VARCHAR(255) NULL COMMENT 'uuid',
+  `name` VARCHAR(255) NULL COMMENT '计划名称',
+  `dev_id` VARCHAR(255) NULL COMMENT '设备id',
+  `enable` INT NULL COMMENT '是否启用',
+  `region` VARCHAR(255) NULL COMMENT '检测区域[left, top, width, height]',
+  `event_val` INT NULL COMMENT '事件类型值',
+  `alarm_time_plan_id` INT NULL COMMENT '时间计划表id',
+  `threshold_time` INT NULL COMMENT '触发阈值(秒)',
+  `merge_time` INT NULL COMMENT '归并时间(秒)',
+  `param` VARCHAR(255) NULL COMMENT '参数',
+  `create_time` DATETIME NULL COMMENT '创建时间',
+  `update_time` DATETIME NULL COMMENT '更新时间',
+  `remark` VARCHAR(255) NULL COMMENT 'remark',
   PRIMARY KEY (`id`)
-);
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报警计划表';
+
+ALTER TABLE `lnxx_dev`.`alarm_plan2`
+  MODIFY COLUMN `uuid` VARCHAR(255) NULL COMMENT 'uuid',
+  MODIFY COLUMN `name` VARCHAR(255) NULL COMMENT '计划名称',
+  MODIFY COLUMN `dev_id` VARCHAR(255) NULL COMMENT '设备id',
+  MODIFY COLUMN `enable` INT NULL COMMENT '是否启用',
+  MODIFY COLUMN `region` VARCHAR(255) NULL COMMENT '检测区域[left, top, width, height]',
+  MODIFY COLUMN `event_val` INT NULL COMMENT '事件类型值',
+  MODIFY COLUMN `alarm_time_plan_id` INT NULL COMMENT '时间计划表id',
+  MODIFY COLUMN `threshold_time` INT NULL COMMENT '触发阈值(秒)',
+  MODIFY COLUMN `merge_time` INT NULL COMMENT '归并时间(秒)',
+  MODIFY COLUMN `param` VARCHAR(255) NULL COMMENT '参数',
+  MODIFY COLUMN `create_time` DATETIME NULL COMMENT '创建时间',
+  MODIFY COLUMN `update_time` DATETIME NULL COMMENT '更新时间',
+  MODIFY COLUMN `remark` VARCHAR(255) NULL COMMENT 'remark';

+ 32 - 1
db/db_scripts/create_event_type.sql

@@ -1,3 +1,4 @@
+-- 幂等化建表
 CREATE TABLE `lnxx_dev`.`event_type`  (
   `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '索引',
   `event_val` int(0) NULL COMMENT '事件值',
@@ -6,4 +7,34 @@ CREATE TABLE `lnxx_dev`.`event_type`  (
   `remark` varchar(255) NULL COMMENT '备注',
   PRIMARY KEY (`id`),
   UNIQUE KEY uniq_event_val (`event_val`)
-);
+);
+
+CREATE TABLE IF NOT EXISTS `lnxx_dev`.`event_type` (
+  `id` INT NOT NULL AUTO_INCREMENT COMMENT '索引',
+  `event_val` INT NULL COMMENT '事件值',
+  `event_str` VARCHAR(255) NULL COMMENT '事件字符串',
+  `event_desc` VARCHAR(255) NULL COMMENT '事件描述',
+  `remark` VARCHAR(255) NULL COMMENT '备注',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `uniq_event_val` (`event_val`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='事件类型表';
+
+-- 幂等化插入
+INSERT INTO lnxx_dev.event_type (
+    event_val,
+    event_str,
+    event_desc,
+    remark
+) VALUES
+    (1, "stay_detection", "停留事件", NULL),
+    (2, "retention_detection", "滞留事件", NULL),
+    (3, "toileting_detection", "如厕事件", NULL),
+    (4, "toileting_frequency", "如厕频次统计", NULL),
+    (5, "night_toileting_frequency", "夜间如厕频次统计", NULL),
+    (6, "toileting_frequency_abnormal", "如厕频次异常", NULL),
+    (7, "night_toileting_frequency_abnormal", "起夜异常", NULL),
+    (8, "bathroom_stay_frequency", "卫生间频次统计", NULL),
+    (9, "target_absence", "异常消失", NULL)
+ON DUPLICATE KEY UPDATE
+    event_str = VALUES(event_str),
+    event_desc = VALUES(event_desc);

+ 20 - 18
db/db_scripts/create_events.sql

@@ -1,20 +1,22 @@
-CREATE TABLE `lnxx_dev`.`events`  (
-  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '索引',
-  `dev_id` varchar(255) NULL COMMENT '设备id',
-  `uuid` varchar(255) NULL COMMENT 'uuid',
-  `plan_uuid` varchar(255) NULL COMMENT 'alarm_plan的uuid',
-  `event_type` varchar(255) NULL COMMENT '事件类型',
-  `info` varchar(255) NULL COMMENT '事件信息(json)',
-  `is_handle` int(255) NULL COMMENT '是否处理:0-未处理,1-已处理',
-  `create_time` datetime(0) NULL COMMENT '创建时间',
-  `update_time` datetime(0) NULL COMMENT '更新时间',
-  `is_deleted` int(0) NULL COMMENT '删除标记:0-未删除,1-已删除',
-  `remark` varchar(255) NULL COMMENT '备注',
+-- 幂等化建表
+CREATE TABLE IF NOT EXISTS `lnxx_dev`.`events` (
+  `id` INT NOT NULL AUTO_INCREMENT COMMENT '索引',
+  `dev_id` VARCHAR(255) NULL COMMENT '设备id',
+  `uuid` VARCHAR(255) NULL COMMENT 'uuid',
+  `plan_uuid` VARCHAR(255) NULL COMMENT 'alarm_plan的uuid',
+  `event_type` INT NULL DEFAULT NULL COMMENT '事件类型',
+  `info` JSON NULL COMMENT '事件信息(json)',
+  `is_handle` INT NULL COMMENT '是否处理:0-未处理,1-已处理',
+  `create_time` DATETIME NULL COMMENT '创建时间',
+  `update_time` DATETIME NULL COMMENT '更新时间',
+  `is_deleted` INT NULL COMMENT '删除标记:0-未删除,1-已删除',
+  `remark` VARCHAR(255) NULL COMMENT '备注',
+  `tenant_id` BIGINT NULL COMMENT '租户表主键id',
   PRIMARY KEY (`id`)
-);
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='事件表';
 
-ALTER TABLE `lnxx_dev`.`events` 
-MODIFY COLUMN `info` JSON NULL COMMENT '事件信息(json)';
-
-ALTER TABLE `lnxx_dev`.`events` 
-ADD COLUMN `tenant_id` bigint(0) NULL COMMENT '租户表主键id' AFTER `remark`;
+ALTER TABLE `lnxx_dev`.`events`
+  MODIFY COLUMN `event_type` INT NULL DEFAULT NULL COMMENT '事件类型' AFTER `plan_uuid`,
+  MODIFY COLUMN `info` JSON NULL COMMENT '事件信息(json)',
+  MODIFY COLUMN `is_handle` INT NULL COMMENT '是否处理:0-未处理,1-已处理',
+  MODIFY COLUMN `tenant_id` BIGINT NULL COMMENT '租户表主键id';

+ 1 - 0
db/db_scripts/insert_into_event_type.sql

@@ -1,3 +1,4 @@
+-- 幂等化插入
 INSERT INTO event_type (
     event_val,
     event_str,

+ 0 - 2
device/dev_mng.py

@@ -216,9 +216,7 @@ class DeviceManager():
                 for dev_id, device in list(self.g_dev_map.items()):
                     last_keepalive = device.get_keepalive()
                     if now - last_keepalive > self.HEARTBEAT_TIMEOUT:
-                        
                         # device.online_ = 0    # 标记掉线
-                        
                         del self.g_dev_map[dev_id]  # 直接销毁实例
                         LOGINFO(f"[WARN] Device {dev_id} heartbeat timeout destroy")