From d99509cff5809830a208de24baa4869dfa0bb59a Mon Sep 17 00:00:00 2001 From: JiaoTianBo Date: Thu, 26 Mar 2026 14:29:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(database):=20=E5=88=9D=E5=A7=8B=E5=8C=96AI?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86=E5=B9=B3=E5=8F=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E8=AE=BE=E8=AE=A1=E4=B8=8E=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加PostgreSQL数据库设计,包含部门、用户、角色、权限、项目、任务、工单、 风险、数据录入及文件附件等核心表结构及索引 - 启用pgvector和uuid-ossp扩展,支持向量存储和UUID生成 - 增加数据库表详细注释,便于后续维护与理解 - 配置Spring Boot项目支持Java 17及相关依赖(Web、PostgreSQL、MyBatis Plus、 MinIO、AWS SDK S3) - 新增Dockerfile及构建镜像脚本,支持amd及arm架构容器构建 - 提供完整Docker Compose环境配置,包含MySQL、Redis、Redis Admin、MinIO、 PhpMyAdmin及应用服务容器 - 新增Nginx反向代理配置文件,支持Admin和Client前端分离部署 - 添加一键启动Shell脚本,简化环境及应用服务启动流程 - 更新Spring Boot配置,设置active profile为dev及服务默认端口8080 - 新增Redis配置文件,开放网络访问端口与绑定所有地址 --- Dockerfile | 17 + build.sh | 6 + docs/dev-ops/docker-compose-app.yml | 68 ++ docs/dev-ops/docker-compose-environment.yml | 113 +++ docs/dev-ops/mysql/sql/weform_run.sql | 808 +++++++++++++++++++ docs/dev-ops/nginx/Admin-fronted/nginx.conf | 46 ++ docs/dev-ops/nginx/Client-fronted/nginx.conf | 48 ++ docs/dev-ops/redis/redis.conf | 2 + docs/dev-ops/start-all.sh | 42 + pom.xml | 36 + src/main/resources/application-dev.yaml | 46 ++ src/main/resources/application-prod.yaml | 44 + src/main/resources/application.yaml | 6 + 13 files changed, 1282 insertions(+) create mode 100644 Dockerfile create mode 100644 build.sh create mode 100644 docs/dev-ops/docker-compose-app.yml create mode 100644 docs/dev-ops/docker-compose-environment.yml create mode 100644 docs/dev-ops/mysql/sql/weform_run.sql create mode 100644 docs/dev-ops/nginx/Admin-fronted/nginx.conf create mode 100644 docs/dev-ops/nginx/Client-fronted/nginx.conf create mode 100644 docs/dev-ops/redis/redis.conf create mode 100644 docs/dev-ops/start-all.sh create mode 100644 src/main/resources/application-dev.yaml create mode 100644 src/main/resources/application-prod.yaml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..97e390e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +# 基础镜像 +FROM openjdk:17-jdk + +# 作者 +MAINTAINER cheems + +# 配置 +ENV PARAMS="" + +# 时区 +ENV TZ=PRC +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +# 添加应用 +ADD target/weform-run.jar /weform-run.jar + +ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /weform-run.jar $PARAMS"] \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..4899db3 --- /dev/null +++ b/build.sh @@ -0,0 +1,6 @@ + +# 普通镜像构建,随系统版本构建 amd/arm +docker build -t system/weform-run -f ./Dockerfile . + +# 兼容 amd、arm 构建镜像 +# docker buildx build --load --platform liunx/amd64,linux/arm64 -t xiaofuge/xfg-frame-archetype-app:1.0 -f ./Dockerfile . --push \ No newline at end of file diff --git a/docs/dev-ops/docker-compose-app.yml b/docs/dev-ops/docker-compose-app.yml new file mode 100644 index 0000000..a3c6c09 --- /dev/null +++ b/docs/dev-ops/docker-compose-app.yml @@ -0,0 +1,68 @@ +# /usr/local/bin/docker-compose -f /docs/dev-ops/environment/environment-docker-compose-2.4.yml up -d +version: '3.8' +# docker-compose -f docker-compose-app.yml up -d +# 你需要修改system为你自身系统的仓库名 +services: + weform-run: + image: system/weform-run + container_name: weform-run + restart: on-failure + ports: + - "8080:8080" + environment: + - TZ=PRC + - SERVER_PORT=8080 + volumes: + - ./log:/data/log + - ./upload:/upload + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + networks: + - my-network + + # Admin前端服务 + admin-fronted: + image: nginx:alpine + container_name: admin-fronted + restart: on-failure + ports: + - "8848:80" + volumes: + - ./nginx/Admin-fronted/dist:/usr/share/nginx/html:ro + - ./nginx/Admin-fronted/nginx.conf:/etc/nginx/conf.d/default.conf:ro + depends_on: + - weform-run + networks: + - my-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # Client前端服务 + client-fronted: + image: nginx:alpine + container_name: client-fronted + restart: on-failure + ports: + - "80:80" + volumes: + - ./nginx/Client-fronted/dist:/usr/share/nginx/html:ro + - ./nginx/Client-fronted/nginx.conf:/etc/nginx/conf.d/default.conf:ro + depends_on: + - weform-run + networks: + - my-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +networks: + my-network: + driver: bridge diff --git a/docs/dev-ops/docker-compose-environment.yml b/docs/dev-ops/docker-compose-environment.yml new file mode 100644 index 0000000..83a1662 --- /dev/null +++ b/docs/dev-ops/docker-compose-environment.yml @@ -0,0 +1,113 @@ +# docker 代理和使用文档;https://bugstack.cn/md/road-map/docker.html +version: '3.9' +services: + mysql: + image: mysql:8.0.32 + container_name: mysql + command: --default-authentication-plugin=mysql_native_password + restart: always + environment: + TZ: Asia/Shanghai + MYSQL_ROOT_PASSWORD: 123456 + ports: + - "13306:3306" + volumes: + - ./mysql/data:/var/lib/mysql + - ./mysql/my.cnf:/etc/mysql/conf.d/mysql.cnf:ro + - ./mysql/sql:/docker-entrypoint-initdb.d + healthcheck: + test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] + interval: 5s + timeout: 10s + retries: 10 + start_period: 15s + networks: + - my-network + + # phpmyadmin https://hub.docker.com/_/phpmyadmin + phpmyadmin: + image: phpmyadmin:5.2.1 + container_name: phpmyadmin + hostname: phpmyadmin + restart: always + ports: + - 8899:80 + environment: + - PMA_HOST=mysql + - PMA_PORT=3306 + - MYSQL_ROOT_PASSWORD=123456 + depends_on: + mysql: + condition: service_healthy + networks: + - my-network + + # Redis + redis: + image: redis:6.2 + container_name: redis + restart: always + hostname: redis + privileged: true + ports: + - 16379:6379 + volumes: + - ./redis/redis.conf:/usr/local/etc/redis/redis.conf + command: redis-server /usr/local/etc/redis/redis.conf + networks: + - my-network + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 10s + timeout: 5s + retries: 3 + + # RedisAdmin https://github.com/joeferner/redis-commander + # 账密 admin/admin + redis-admin: + image: spryker/redis-commander:0.8.0 + container_name: redis-admin + hostname: redis-commander + restart: always + ports: + - 8081:8081 + environment: + - REDIS_HOSTS=local:redis:6379 + - HTTP_USER=admin + - HTTP_PASSWORD=admin + - LANG=C.UTF-8 + - LANGUAGE=C.UTF-8 + - LC_ALL=C.UTF-8 + networks: + - my-network + depends_on: + redis: + condition: service_healthy + + # MinIO https://hub.docker.com/r/minio/minio + # 默认账密:minioadmin/minioadmin + minio: + image: minio/minio:latest + container_name: minio + restart: always + hostname: minio + ports: + - "9000:9000" # API端口 + - "9001:9001" # Web控制台端口 + environment: + MINIO_ROOT_USER: minioadmin + MINIO_ROOT_PASSWORD: minioadmin + TZ: Asia/Shanghai + volumes: + - ./minio/data:/data + command: server /data --console-address ":9001" + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ] + interval: 30s + timeout: 20s + retries: 3 + networks: + - my-network +networks: + my-network: + driver: bridge diff --git a/docs/dev-ops/mysql/sql/weform_run.sql b/docs/dev-ops/mysql/sql/weform_run.sql new file mode 100644 index 0000000..b98fda5 --- /dev/null +++ b/docs/dev-ops/mysql/sql/weform_run.sql @@ -0,0 +1,808 @@ +-- ===================================================== +-- AI项目进度与风险管控平台 - 通用版数据库设计 (PostgreSQL + pgvector) +-- 适用于各类项目的管理与追踪分析 +-- 支持AI原生特性:向量存储、语义搜索、RAG +-- ===================================================== + +-- 启用pgvector扩展 +CREATE EXTENSION IF NOT EXISTS vector; +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +-- 设置时区 +SET timezone = 'Asia/Shanghai'; + +-- ===================================================== +-- 1. 部门与用户相关表 (简化版:单部门,无多租户) +-- ===================================================== + +-- 部门表 (单部门架构,简化设计) +DROP TABLE IF EXISTS sys_department; +CREATE TABLE sys_department ( + id BIGSERIAL PRIMARY KEY, + dept_code VARCHAR(50) NOT NULL UNIQUE COMMENT '部门编码', + dept_name VARCHAR(100) NOT NULL COMMENT '部门名称', + parent_id BIGINT DEFAULT NULL COMMENT '父级部门ID', + leader_id BIGINT COMMENT '部门负责人ID', + description TEXT COMMENT '部门描述', + sort_order INT DEFAULT 0 COMMENT '排序', + status SMALLINT DEFAULT 1 COMMENT '状态: 1-正常, 0-禁用', + create_by BIGINT COMMENT '创建人', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新人', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记', + + CONSTRAINT fk_dept_parent FOREIGN KEY (parent_id) REFERENCES sys_department(id) ON DELETE SET NULL +); + +CREATE INDEX idx_dept_parent ON sys_department(parent_id); +CREATE INDEX idx_dept_status ON sys_department(status); + +COMMENT ON TABLE sys_department IS '部门表 - 单部门架构'; + +-- ===================================================== +-- 2. 用户与权限相关表 +-- ===================================================== + +-- 用户表 +DROP TABLE IF EXISTS sys_user; +CREATE TABLE sys_user ( + id BIGSERIAL PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名', + password VARCHAR(200) NOT NULL COMMENT '密码(加密)', + real_name VARCHAR(50) COMMENT '真实姓名', + nickname VARCHAR(50) COMMENT '昵称', + avatar VARCHAR(500) COMMENT '头像URL', + gender SMALLINT DEFAULT 0 COMMENT '性别: 0-未知, 1-男, 2-女', + phone VARCHAR(20) COMMENT '手机号', + email VARCHAR(100) COMMENT '邮箱', + dept_id BIGINT COMMENT '所属部门ID', + position VARCHAR(50) COMMENT '职位', + employee_no VARCHAR(50) COMMENT '工号', + entry_date DATE COMMENT '入职日期', + status SMALLINT DEFAULT 1 COMMENT '状态: 1-正常, 0-禁用, 2-锁定', + last_login_time TIMESTAMP COMMENT '最后登录时间', + last_login_ip VARCHAR(50) COMMENT '最后登录IP', + preferences JSONB COMMENT '用户偏好设置', + extra_data JSONB COMMENT '扩展数据', + create_by BIGINT COMMENT '创建人', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新人', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记', + + CONSTRAINT fk_user_dept FOREIGN KEY (dept_id) REFERENCES sys_department(id) ON DELETE SET NULL +); + +CREATE INDEX idx_user_dept ON sys_user(dept_id); +CREATE INDEX idx_user_phone ON sys_user(phone); +CREATE INDEX idx_user_status ON sys_user(status); + +COMMENT ON TABLE sys_user IS '用户表'; + +-- 角色表 +DROP TABLE IF EXISTS sys_role; +CREATE TABLE sys_role ( + id BIGSERIAL PRIMARY KEY, + role_code VARCHAR(50) NOT NULL UNIQUE COMMENT '角色编码', + role_name VARCHAR(50) NOT NULL COMMENT '角色名称', + role_type VARCHAR(20) DEFAULT 'custom' COMMENT '角色类型: system-系统角色, custom-自定义角色', + description TEXT COMMENT '角色描述', + data_scope SMALLINT DEFAULT 1 COMMENT '数据权限: 1-全部, 2-本部门, 3-本人', + sort_order INT DEFAULT 0 COMMENT '排序', + status SMALLINT DEFAULT 1 COMMENT '状态: 1-正常, 0-禁用', + create_by BIGINT COMMENT '创建人', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新人', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记' +); + +COMMENT ON TABLE sys_role IS '角色表'; + +-- 用户角色关联表 +DROP TABLE IF EXISTS sys_user_role; +CREATE TABLE sys_user_role ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT NOT NULL COMMENT '用户ID', + role_id BIGINT NOT NULL COMMENT '角色ID', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + UNIQUE(user_id, role_id), + CONSTRAINT fk_ur_user FOREIGN KEY (user_id) REFERENCES sys_user(id) ON DELETE CASCADE, + CONSTRAINT fk_ur_role FOREIGN KEY (role_id) REFERENCES sys_role(id) ON DELETE CASCADE +); + +CREATE INDEX idx_ur_role ON sys_user_role(role_id); + +COMMENT ON TABLE sys_user_role IS '用户角色关联表'; + +-- 权限表(菜单/功能权限) +DROP TABLE IF EXISTS sys_permission; +CREATE TABLE sys_permission ( + id BIGSERIAL PRIMARY KEY, + parent_id BIGINT DEFAULT NULL COMMENT '父级权限ID', + permission_code VARCHAR(100) NOT NULL UNIQUE COMMENT '权限编码', + permission_name VARCHAR(50) NOT NULL COMMENT '权限名称', + permission_type SMALLINT DEFAULT 1 COMMENT '权限类型: 1-菜单, 2-按钮, 3-接口', + path VARCHAR(200) COMMENT '路由路径', + component VARCHAR(200) COMMENT '组件路径', + icon VARCHAR(50) COMMENT '图标', + api_url VARCHAR(200) COMMENT '接口URL', + api_method VARCHAR(10) COMMENT '接口方法', + sort_order INT DEFAULT 0 COMMENT '排序', + visible SMALLINT DEFAULT 1 COMMENT '是否可见: 1-是, 0-否', + status SMALLINT DEFAULT 1 COMMENT '状态: 1-正常, 0-禁用', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记', + + CONSTRAINT fk_perm_parent FOREIGN KEY (parent_id) REFERENCES sys_permission(id) ON DELETE SET NULL +); + +CREATE INDEX idx_perm_parent ON sys_permission(parent_id); + +COMMENT ON TABLE sys_permission IS '权限表'; + +-- 角色权限关联表 +DROP TABLE IF EXISTS sys_role_permission; +CREATE TABLE sys_role_permission ( + id BIGSERIAL PRIMARY KEY, + role_id BIGINT NOT NULL COMMENT '角色ID', + permission_id BIGINT NOT NULL COMMENT '权限ID', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + UNIQUE(role_id, permission_id), + CONSTRAINT fk_rp_role FOREIGN KEY (role_id) REFERENCES sys_role(id) ON DELETE CASCADE, + CONSTRAINT fk_rp_perm FOREIGN KEY (permission_id) REFERENCES sys_permission(id) ON DELETE CASCADE +); + +COMMENT ON TABLE sys_role_permission IS '角色权限关联表'; + +-- ===================================================== +-- 3. 项目管理核心表 +-- ===================================================== + +-- 项目表 +DROP TABLE IF EXISTS project; +CREATE TABLE project ( + id BIGSERIAL PRIMARY KEY, + project_code VARCHAR(50) NOT NULL UNIQUE COMMENT '项目编号', + project_name VARCHAR(200) NOT NULL COMMENT '项目名称', + project_type VARCHAR(50) COMMENT '项目类型(如: 研发项目, 工程项目, 运营项目)', + description TEXT COMMENT '项目描述', + objectives TEXT COMMENT '项目目标', + manager_id BIGINT COMMENT '项目经理ID', + sponsor_id BIGINT COMMENT '项目发起人ID', + plan_start_date DATE COMMENT '计划开始日期', + plan_end_date DATE COMMENT '计划结束日期', + actual_start_date DATE COMMENT '实际开始日期', + actual_end_date DATE COMMENT '实际结束日期', + budget DECIMAL(18,2) DEFAULT 0 COMMENT '项目预算', + cost DECIMAL(18,2) DEFAULT 0 COMMENT '已花费金额', + currency VARCHAR(10) DEFAULT 'CNY' COMMENT '币种', + progress INT DEFAULT 0 COMMENT '进度百分比', + status VARCHAR(20) DEFAULT 'draft' COMMENT '状态: draft-草稿, planning-规划中, ongoing-进行中, paused-暂停, completed-已完成, cancelled-已取消', + priority VARCHAR(20) DEFAULT 'medium' COMMENT '优先级: critical-关键, high-高, medium-中, low-低', + risk_level VARCHAR(20) DEFAULT 'low' COMMENT '风险等级: high-高, medium-中, low-低', + visibility SMALLINT DEFAULT 1 COMMENT '可见性: 1-公开, 2-部门内, 3-项目成员', + tags JSONB COMMENT '标签列表', + extra_data JSONB COMMENT '扩展数据(用于存储行业特定字段)', + create_by BIGINT COMMENT '创建人', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新人', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记', + + CONSTRAINT fk_project_manager FOREIGN KEY (manager_id) REFERENCES sys_user(id) ON DELETE SET NULL +); + +CREATE INDEX idx_project_manager ON project(manager_id); +CREATE INDEX idx_project_status ON project(status); +CREATE INDEX idx_project_risk_level ON project(risk_level); + +COMMENT ON TABLE project IS '项目表'; + +-- 项目成员表 +DROP TABLE IF EXISTS `project_member`; +CREATE TABLE `project_member` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `project_id` BIGINT NOT NULL COMMENT '项目ID', + `user_id` BIGINT NOT NULL COMMENT '用户ID', + `role_code` VARCHAR(50) DEFAULT 'member' COMMENT '项目角色: manager-项目经理, leader-负责人, member-成员, observer-观察者', + `join_date` DATE COMMENT '加入日期', + `leave_date` DATE COMMENT '离开日期', + `responsibility` TEXT COMMENT '职责描述', + `weekly_hours` DECIMAL(5,1) COMMENT '每周投入小时数', + `status` TINYINT DEFAULT 1 COMMENT '状态: 1-正常, 0-已移除', + `create_by` BIGINT COMMENT '创建人', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_project_user` (`project_id`, `user_id`), + KEY `idx_user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目成员表'; + +-- 项目阶段/里程碑表 +DROP TABLE IF EXISTS `project_milestone`; +CREATE TABLE `project_milestone` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `project_id` BIGINT NOT NULL COMMENT '项目ID', + `milestone_name` VARCHAR(200) NOT NULL COMMENT '里程碑名称', + `description` TEXT COMMENT '描述', + `plan_date` DATE COMMENT '计划日期', + `actual_date` DATE COMMENT '实际日期', + `status` VARCHAR(20) DEFAULT 'pending' COMMENT '状态: pending-待开始, in_progress-进行中, completed-已完成, delayed-延期', + `progress` INT DEFAULT 0 COMMENT '完成进度', + `sort_order` INT DEFAULT 0 COMMENT '排序', + `is_key` TINYINT DEFAULT 0 COMMENT '是否关键里程碑: 1-是, 0-否', + `deliverables` JSON COMMENT '交付物列表', + `extra_data` JSON COMMENT '扩展数据', + `create_by` BIGINT COMMENT '创建人', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` BIGINT COMMENT '更新人', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` TINYINT DEFAULT 0 COMMENT '删除标记', + PRIMARY KEY (`id`), + KEY `idx_project_id` (`project_id`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目里程碑表'; + +-- ===================================================== +-- 4. 任务管理表 +-- ===================================================== + +-- 任务表 +DROP TABLE IF EXISTS `task`; +CREATE TABLE `task` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `task_code` VARCHAR(50) COMMENT '任务编号', + `project_id` BIGINT NOT NULL COMMENT '项目ID', + `milestone_id` BIGINT COMMENT '所属里程碑ID', + `parent_id` BIGINT COMMENT '父任务ID', + `task_name` VARCHAR(200) NOT NULL COMMENT '任务名称', + `description` TEXT COMMENT '任务描述', + `task_type` VARCHAR(50) COMMENT '任务类型', + `assignee_id` BIGINT COMMENT '执行人ID', + `plan_start_date` DATE COMMENT '计划开始日期', + `plan_end_date` DATE COMMENT '计划结束日期', + `actual_start_date` DATE COMMENT '实际开始日期', + `actual_end_date` DATE COMMENT '实际结束日期', + `plan_hours` DECIMAL(8,2) COMMENT '计划工时(小时)', + `actual_hours` DECIMAL(8,2) COMMENT '实际工时(小时)', + `progress` INT DEFAULT 0 COMMENT '进度百分比', + `priority` VARCHAR(20) DEFAULT 'medium' COMMENT '优先级: critical-关键, high-高, medium-中, low-低', + `status` VARCHAR(20) DEFAULT 'pending' COMMENT '状态: pending-待开始, in_progress-进行中, completed-已完成, cancelled-已取消', + `sort_order` INT DEFAULT 0 COMMENT '排序', + `tags` JSON COMMENT '标签', + `attachments` JSON COMMENT '附件列表', + `extra_data` JSON COMMENT '扩展数据', + `create_by` BIGINT COMMENT '创建人', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` BIGINT COMMENT '更新人', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` TINYINT DEFAULT 0 COMMENT '删除标记', + PRIMARY KEY (`id`), + KEY `idx_project_id` (`project_id`), + KEY `idx_milestone_id` (`milestone_id`), + KEY `idx_parent_id` (`parent_id`), + KEY `idx_assignee_id` (`assignee_id`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务表'; + +-- 任务依赖关系表 +DROP TABLE IF EXISTS `task_dependency`; +CREATE TABLE `task_dependency` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `task_id` BIGINT NOT NULL COMMENT '任务ID', + `depends_on_task_id` BIGINT NOT NULL COMMENT '依赖的任务ID', + `dependency_type` VARCHAR(20) DEFAULT 'finish_to_start' COMMENT '依赖类型: finish_to_start-完成-开始, start_to_start-开始-开始, finish_to_finish-完成-完成, start_to_finish-开始-完成', + `lag_days` INT DEFAULT 0 COMMENT '滞后天数', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_task_dependency` (`task_id`, `depends_on_task_id`), + KEY `idx_depends_on` (`depends_on_task_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='任务依赖关系表'; + +-- ===================================================== +-- 5. 工单管理表 +-- ===================================================== + +-- 工单表 (移除order_type_id外键,使用type字段替代) +-- 工单可关联风险,用于风险处理 +DROP TABLE IF EXISTS work_order; +CREATE TABLE work_order ( + id BIGSERIAL PRIMARY KEY, + order_code VARCHAR(50) NOT NULL UNIQUE COMMENT '工单编号', + order_type VARCHAR(50) COMMENT '工单类型: bug-缺陷, feature-需求, task-任务, incident-事件, risk_handle-风险处理, other-其他', + project_id BIGINT COMMENT '关联项目ID', + risk_id BIGINT COMMENT '关联风险ID(用于风险处理工单)', + title VARCHAR(200) NOT NULL COMMENT '工单标题', + description TEXT COMMENT '工单描述', + creator_id BIGINT NOT NULL COMMENT '创建人ID', + handler_id BIGINT COMMENT '处理人ID', + handler_group_id BIGINT COMMENT '处理组ID', + priority VARCHAR(20) DEFAULT 'medium' COMMENT '优先级: critical-紧急, high-高, medium-中, low-低', + status VARCHAR(20) DEFAULT 'pending' COMMENT '状态: pending-待处理, assigned-已分派, processing-处理中, resolved-已解决, closed-已关闭, reopened-已重开', + source VARCHAR(50) COMMENT '来源: web-网页, mobile-移动端, api-接口, system-系统生成, risk-风险分派', + deadline TIMESTAMP COMMENT '截止时间', + assigned_time TIMESTAMP COMMENT '分派时间', + first_response_time TIMESTAMP COMMENT '首次响应时间', + resolved_time TIMESTAMP COMMENT '解决时间', + closed_time TIMESTAMP COMMENT '关闭时间', + satisfaction_score INT COMMENT '满意度评分(1-5)', + tags JSONB COMMENT '标签', + attachments JSONB COMMENT '附件列表', + extra_data JSONB COMMENT '扩展数据', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记', + + CONSTRAINT fk_wo_project FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE SET NULL, + CONSTRAINT fk_wo_risk FOREIGN KEY (risk_id) REFERENCES risk(id) ON DELETE SET NULL +); + +CREATE INDEX idx_wo_project ON work_order(project_id); +CREATE INDEX idx_wo_risk ON work_order(risk_id); +CREATE INDEX idx_wo_creator ON work_order(creator_id); +CREATE INDEX idx_wo_handler ON work_order(handler_id); +CREATE INDEX idx_wo_status ON work_order(status); +CREATE INDEX idx_wo_priority ON work_order(priority); +CREATE INDEX idx_wo_type ON work_order(order_type); + +COMMENT ON TABLE work_order IS '工单表'; + +-- 工单流转记录表 +DROP TABLE IF EXISTS work_order_log; +CREATE TABLE work_order_log ( + id BIGSERIAL PRIMARY KEY, + order_id BIGINT NOT NULL COMMENT '工单ID', + action_type VARCHAR(50) NOT NULL COMMENT '操作类型: create-创建, assign-分派, accept-接受, process-处理, resolve-解决, close-关闭, reopen-重开, comment-备注', + from_status VARCHAR(20) COMMENT '原状态', + to_status VARCHAR(20) COMMENT '新状态', + operator_id BIGINT COMMENT '操作人ID', + content TEXT COMMENT '操作内容', + attachments JSONB COMMENT '附件列表', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + + CONSTRAINT fk_wol_order FOREIGN KEY (order_id) REFERENCES work_order(id) ON DELETE CASCADE +); + +CREATE INDEX idx_wol_order ON work_order_log(order_id); +CREATE INDEX idx_wol_operator ON work_order_log(operator_id); + +COMMENT ON TABLE work_order_log IS '工单流转记录表'; + +-- ===================================================== +-- 6. 风险管理表 +-- ===================================================== + +-- 风险表 (移除category_id外键,使用category字符串字段) +-- 风险通过分派工单处理,工单完成后同步更新风险状态 +DROP TABLE IF EXISTS risk; +CREATE TABLE risk ( + id BIGSERIAL PRIMARY KEY, + risk_code VARCHAR(50) COMMENT '风险编号', + project_id BIGINT NOT NULL COMMENT '项目ID', + category VARCHAR(50) COMMENT '风险分类: technical-技术风险, schedule-进度风险, cost-成本风险, quality-质量风险, resource-资源风险, external-外部风险, other-其他', + risk_name VARCHAR(200) NOT NULL COMMENT '风险名称', + description TEXT COMMENT '风险描述', + risk_source VARCHAR(50) COMMENT '风险来源: internal-内部, external-外部, ai_detection-AI检测', + risk_type VARCHAR(50) COMMENT '风险类型', + probability DECIMAL(5,2) COMMENT '发生概率(0-100%)', + impact DECIMAL(5,2) COMMENT '影响程度(1-5)', + risk_score DECIMAL(5,2) COMMENT '风险得分(概率*影响)', + risk_level VARCHAR(20) DEFAULT 'low' COMMENT '风险等级: critical-严重, high-高, medium-中, low-低', + status VARCHAR(20) DEFAULT 'identified' COMMENT '状态: identified-已识别, assigned-已分派工单, mitigating-缓解中, resolved-已解决, closed-已关闭', + owner_id BIGINT COMMENT '负责人ID', + + -- 工单关联(风险分派的工单ID列表) + work_order_ids BIGINT[] COMMENT '关联的工单ID数组', + + mitigation_plan TEXT COMMENT '缓解措施', + contingency_plan TEXT COMMENT '应急计划', + trigger_condition TEXT COMMENT '触发条件', + discover_time TIMESTAMP COMMENT '发现时间', + due_date DATE COMMENT '预期解决日期', + resolved_time TIMESTAMP COMMENT '解决时间', + ai_analysis JSONB COMMENT 'AI分析结果', + tags JSONB COMMENT '标签', + extra_data JSONB COMMENT '扩展数据', + create_by BIGINT COMMENT '创建人', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新人', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记', + + CONSTRAINT fk_risk_project FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE +); + +CREATE INDEX idx_risk_project ON risk(project_id); +CREATE INDEX idx_risk_category ON risk(category); +CREATE INDEX idx_risk_owner ON risk(owner_id); +CREATE INDEX idx_risk_level ON risk(risk_level); +CREATE INDEX idx_risk_status ON risk(status); + +COMMENT ON TABLE risk IS '风险表'; + +-- 注:风险通过分派工单进行处理,工单处理完成后同步更新风险状态 +-- 因此不需要单独的风险处理记录表,处理历史在工单流转记录中查看 + +-- ===================================================== +-- 7. 数据录入与报告表 +-- ===================================================== + +-- 日报/数据录入表 +DROP TABLE IF EXISTS `daily_report`; +CREATE TABLE `daily_report` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `project_id` BIGINT NOT NULL COMMENT '项目ID', + `creator_id` BIGINT NOT NULL COMMENT '创建人ID', + `report_date` DATE COMMENT '报告日期', + `report_type` VARCHAR(50) DEFAULT 'daily' COMMENT '报告类型: daily-日报, weekly-周报, monthly-月报, milestone-里程碑报告, photo-照片记录', + `title` VARCHAR(200) COMMENT '标题', + `content` TEXT COMMENT '内容', + `work_content` TEXT COMMENT '工作内容', + `issues` TEXT COMMENT '问题与风险', + `next_plan` TEXT COMMENT '下一步计划', + `location` VARCHAR(200) COMMENT '位置', + `latitude` DECIMAL(10,7) COMMENT '纬度', + `longitude` DECIMAL(10,7) COMMENT '经度', + `weather` VARCHAR(50) COMMENT '天气', + `temperature` DECIMAL(5,2) COMMENT '温度', + `status` VARCHAR(20) DEFAULT 'draft' COMMENT '状态: draft-草稿, submitted-已提交, approved-已审批', + `ai_analysis` JSON COMMENT 'AI分析结果', + `tags` JSON COMMENT '标签', + `extra_data` JSON COMMENT '扩展数据', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` TINYINT DEFAULT 0 COMMENT '删除标记', + PRIMARY KEY (`id`), + KEY `idx_project_id` (`project_id`), + KEY `idx_creator_id` (`creator_id`), + KEY `idx_report_date` (`report_date`), + KEY `idx_report_type` (`report_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='日报/数据录入表'; + +-- 文件附件表 +DROP TABLE IF EXISTS `file_attachment`; +CREATE TABLE `file_attachment` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `file_name` VARCHAR(200) NOT NULL COMMENT '文件名称', + `original_name` VARCHAR(200) COMMENT '原始文件名', + `file_path` VARCHAR(500) NOT NULL COMMENT '文件路径', + `file_url` VARCHAR(500) COMMENT '文件URL', + `file_type` VARCHAR(50) COMMENT '文件类型(MIME)', + `file_size` BIGINT COMMENT '文件大小(字节)', + `storage_type` VARCHAR(20) DEFAULT 'local' COMMENT '存储类型: local-本地, oss-对象存储, minio-MinIO', + `related_type` VARCHAR(50) COMMENT '关联类型: project, task, work_order, risk, report', + `related_id` BIGINT COMMENT '关联ID', + `uploader_id` BIGINT COMMENT '上传人ID', + `exif_data` JSON COMMENT 'EXIF信息(照片专用)', + `ai_analysis` JSON COMMENT 'AI分析结果', + `extra_data` JSON COMMENT '扩展数据', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `deleted` TINYINT DEFAULT 0 COMMENT '删除标记', + PRIMARY KEY (`id`), + KEY `idx_related` (`related_type`, `related_id`), + KEY `idx_uploader_id` (`uploader_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文件附件表'; + +-- ===================================================== +-- 8. 资源管理表 +-- ===================================================== + +-- 资源表(项目资源抽象: 人力、物料、设备、资金等) +-- 简化设计:移除resource_type表,使用resource_type字符串字段 +DROP TABLE IF EXISTS resource; +CREATE TABLE resource ( + id BIGSERIAL PRIMARY KEY, + resource_code VARCHAR(50) COMMENT '资源编号', + project_id BIGINT NOT NULL COMMENT '项目ID', + resource_type VARCHAR(50) COMMENT '资源类型: human-人力, material-物料, equipment-设备, software-软件, finance-资金, other-其他', + resource_name VARCHAR(200) NOT NULL COMMENT '资源名称', + description TEXT COMMENT '资源描述', + specification VARCHAR(200) COMMENT '规格型号', + unit VARCHAR(20) COMMENT '单位', + plan_quantity DECIMAL(12,2) COMMENT '计划数量', + actual_quantity DECIMAL(12,2) COMMENT '实际数量', + unit_price DECIMAL(12,2) COMMENT '单价', + currency VARCHAR(10) DEFAULT 'CNY' COMMENT '币种', + supplier VARCHAR(200) COMMENT '供应商/来源', + status VARCHAR(20) DEFAULT 'planned' COMMENT '状态: planned-计划中, requested-已申请, approved-已批准, procuring-采购中, arrived-已到货, in_use-使用中, completed-已完成', + plan_arrive_date DATE COMMENT '计划到位日期', + actual_arrive_date DATE COMMENT '实际到位日期', + responsible_id BIGINT COMMENT '负责人ID', + location VARCHAR(200) COMMENT '存放位置', + tags JSONB COMMENT '标签', + extra_data JSONB COMMENT '扩展数据', + create_by BIGINT COMMENT '创建人', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新人', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记', + + CONSTRAINT fk_resource_project FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE CASCADE +); + +CREATE INDEX idx_resource_project ON resource(project_id); +CREATE INDEX idx_resource_type ON resource(resource_type); +CREATE INDEX idx_resource_status ON resource(status); + +COMMENT ON TABLE resource IS '资源表 - 项目资源统一管理(人力、物料、设备、资金等)'; + +-- ===================================================== +-- 9. 流程卡点分析表 +-- ===================================================== + +-- 流程卡点记录表 +DROP TABLE IF EXISTS `bottleneck_record`; +CREATE TABLE `bottleneck_record` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `project_id` BIGINT NOT NULL COMMENT '项目ID', + `user_id` BIGINT NOT NULL COMMENT '用户ID', + `bottleneck_type` VARCHAR(50) NOT NULL COMMENT '卡点类型: resource-资源不足, approval-审批延迟, dependency-依赖阻塞, skill-技能不足, external-外部因素, other-其他', + `related_type` VARCHAR(50) COMMENT '关联类型: task, work_order, risk', + `related_id` BIGINT COMMENT '关联ID', + `description` TEXT COMMENT '卡点描述', + `impact_level` VARCHAR(20) DEFAULT 'medium' COMMENT '影响程度: critical-严重, high-高, medium-中, low-低', + `status` VARCHAR(20) DEFAULT 'pending' COMMENT '状态: pending-待处理, resolving-解决中, resolved-已解决', + `start_time` DATETIME COMMENT '卡点开始时间', + `resolved_time` DATETIME COMMENT '解决时间', + `duration_hours` DECIMAL(8,2) COMMENT '持续时长(小时)', + `solution` TEXT COMMENT '解决方案', + `extra_data` JSON COMMENT '扩展数据', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_project_id` (`project_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_bottleneck_type` (`bottleneck_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='流程卡点记录表'; + +-- ===================================================== +-- 10. AI服务相关表 +-- ===================================================== + +-- AI文档向量表 (用于RAG知识库) +DROP TABLE IF EXISTS ai_document; +CREATE TABLE ai_document ( + id BIGSERIAL PRIMARY KEY, + doc_id UUID DEFAULT uuid_generate_v4() COMMENT '文档唯一标识', + + -- 关联关系 + project_id BIGINT COMMENT '关联项目ID', + timeline_node_id BIGINT COMMENT '关联时间节点ID', + kb_id BIGINT COMMENT '关联知识库ID', + -- 文档来源 + source_type VARCHAR(50) NOT NULL COMMENT '来源类型: project-项目文档, risk-风险文档, ticket-工单, report-日报, upload-上传文件, knowledge-知识库, chat-对话记录', + source_id BIGINT COMMENT '来源记录ID', + + -- 文档内容 + title VARCHAR(500) COMMENT '文档标题', + content TEXT NOT NULL COMMENT '文档内容(纯文本)', + content_raw TEXT COMMENT '原始内容(带格式)', + summary TEXT COMMENT 'AI生成的摘要', + + -- 向量嵌入 (1536维适配OpenAI, 可调整为其他维度) + embedding vector(1536) COMMENT '向量嵌入', + + -- 文档元数据 + doc_type VARCHAR(50) COMMENT '文档类型: requirement-需求, design-设计, plan-计划, report-报告, contract-合同, photo-照片, other-其他', + language VARCHAR(10) DEFAULT 'zh' COMMENT '语言: zh-中文, en-英文', + file_type VARCHAR(50) COMMENT '文件类型: pdf, doc, txt, md, jpg, png等', + file_size BIGINT COMMENT '文件大小(字节)', + file_path VARCHAR(500) COMMENT '文件存储路径', + + -- 时间信息 (用于时间维度检索) + doc_date DATE COMMENT '文档日期(如日报日期、照片拍摄日期)', + doc_datetime TIMESTAMP COMMENT '文档时间戳', + + -- 分块信息(大文档分块存储) + chunk_index INT DEFAULT 0 COMMENT '分块序号', + chunk_total INT DEFAULT 1 COMMENT '总分块数', + chunk_parent_id BIGINT COMMENT '父文档ID(分块时使用)', + + -- 标签和分类 + tags JSONB COMMENT '标签数组', + category VARCHAR(100) COMMENT '分类', + + -- 使用统计 + view_count INT DEFAULT 0 COMMENT '查看次数', + query_count INT DEFAULT 0 COMMENT '被检索次数', + last_queried_at TIMESTAMP COMMENT '最后被检索时间', + + -- 状态 + status VARCHAR(20) DEFAULT 'active' COMMENT '状态: active-可用, processing-处理中, error-错误, archived-归档', + error_message TEXT COMMENT '错误信息', + + -- 创建信息 + create_by BIGINT COMMENT '创建人', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新人', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记', + + -- 外键约束 + CONSTRAINT fk_ai_doc_project FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE SET NULL, + CONSTRAINT fk_ai_doc_timeline FOREIGN KEY (timeline_node_id) REFERENCES project_timeline(id) ON DELETE SET NULL, + CONSTRAINT fk_ai_doc_kb FOREIGN KEY (kb_id) REFERENCES ai_knowledge_base(id) ON DELETE SET NULL +); + +-- 创建向量索引 (使用IVFFlat或HNSW) +-- IVFFlat: 适合中等数据量, 内存占用小 +-- HNSW: 适合大数据量, 查询更快但内存占用大 +CREATE INDEX idx_ai_document_embedding ON ai_document + USING ivfflat (embedding vector_cosine_ops) + WITH (lists = 100); + +-- 创建其他常用索引 +CREATE INDEX idx_ai_doc_project ON ai_document(project_id) WHERE deleted = 0; +CREATE INDEX idx_ai_doc_timeline ON ai_document(timeline_node_id) WHERE deleted = 0; +CREATE INDEX idx_ai_doc_kb ON ai_document(kb_id) WHERE deleted = 0; +CREATE INDEX idx_ai_doc_source ON ai_document(source_type, source_id) WHERE deleted = 0; +CREATE INDEX idx_ai_doc_status ON ai_document(status); +CREATE INDEX idx_ai_doc_type ON ai_document(doc_type); +CREATE INDEX idx_ai_doc_tags ON ai_document USING GIN(tags); + +COMMENT ON TABLE ai_document IS 'AI文档向量表 - 存储所有用于RAG的文档向量'; + +-- AI对话记录表 (合并会话管理功能,无需单独的session表) +DROP TABLE IF EXISTS ai_chat_history; +CREATE TABLE ai_chat_history ( + id BIGSERIAL PRIMARY KEY, + + -- 会话标识 (使用UUID标识一个会话,无需单独的session表) + session_id UUID NOT NULL COMMENT '会话ID(同一session_id的消息属于同一会话)', + session_title VARCHAR(200) COMMENT '会话标题(首条消息自动生成)', + + user_id BIGINT NOT NULL COMMENT '用户ID', + project_id BIGINT COMMENT '关联项目ID', + timeline_node_id BIGINT COMMENT '关联时间节点ID', + + -- 消息内容 + role VARCHAR(20) NOT NULL COMMENT '角色: user-用户, assistant-助手, system-系统', + content TEXT NOT NULL COMMENT '对话内容', + content_embedding vector(1536) COMMENT '对话内容的向量表示(用于语义检索历史对话)', + + -- 引用的知识库文档 + referenced_doc_ids BIGINT[] COMMENT '引用的文档ID列表', + + -- 上下文配置 + system_prompt TEXT COMMENT '系统提示词(仅role=system时有值)', + context_window INT DEFAULT 10 COMMENT '该会话的上下文窗口大小', + kb_ids JSONB COMMENT '关联的知识库ID列表', + + -- 模型信息 + model VARCHAR(50) COMMENT '使用的模型', + tokens_used INT COMMENT '消耗Token数', + response_time INT COMMENT '响应时间(ms)', + + -- 用户反馈 + feedback_score INT COMMENT '反馈评分(1-5)', + feedback_content TEXT COMMENT '反馈内容', + + -- 统计 + message_index INT DEFAULT 0 COMMENT '消息在会话中的序号', + + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + + CONSTRAINT fk_chat_project FOREIGN KEY (project_id) REFERENCES project(id) ON DELETE SET NULL, + CONSTRAINT fk_chat_timeline FOREIGN KEY (timeline_node_id) REFERENCES project_timeline(id) ON DELETE SET NULL +); + +-- 索引 +CREATE INDEX idx_chat_session ON ai_chat_history(session_id); +CREATE INDEX idx_chat_user ON ai_chat_history(user_id); +CREATE INDEX idx_chat_project ON ai_chat_history(project_id); +CREATE INDEX idx_chat_timeline ON ai_chat_history(timeline_node_id); +CREATE INDEX idx_chat_time ON ai_chat_history(create_time); +CREATE INDEX idx_chat_role ON ai_chat_history(session_id, role); + +COMMENT ON TABLE ai_chat_history IS 'AI对话记录表 - 包含会话管理功能'; + +-- AI分析结果表 +DROP TABLE IF EXISTS ai_analysis_result; +CREATE TABLE ai_analysis_result ( + id BIGSERIAL PRIMARY KEY, + analysis_type VARCHAR(50) NOT NULL COMMENT '分析类型: photo_analysis-照片分析, risk_prediction-风险预测, progress_analysis-进度分析, text_extraction-文本提取, embedding-向量生成', + related_type VARCHAR(50) COMMENT '关联类型', + related_id BIGINT COMMENT '关联ID', + + -- 输入输出 + input_data JSONB COMMENT '输入数据', + result_data JSONB COMMENT '分析结果', + result_embedding vector(1536) COMMENT '分析结果的向量表示', + + -- 模型信息 + confidence DECIMAL(5,2) COMMENT '置信度(0-100%)', + model_name VARCHAR(100) COMMENT '模型名称', + model_version VARCHAR(50) COMMENT '模型版本', + processing_time INT COMMENT '处理时间(ms)', + + -- 成本和Token + input_tokens INT COMMENT '输入token数', + output_tokens INT COMMENT '输出token数', + cost DECIMAL(10,6) COMMENT '成本(美元)', + + status VARCHAR(20) DEFAULT 'completed' COMMENT '状态: processing-处理中, completed-已完成, failed-失败', + error_message TEXT COMMENT '错误信息', + + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + + CONSTRAINT fk_analysis_project FOREIGN KEY (related_id) REFERENCES project(id) ON DELETE SET NULL +); + +CREATE INDEX idx_analysis_type ON ai_analysis_result(analysis_type); +CREATE INDEX idx_analysis_related ON ai_analysis_result(related_type, related_id); +CREATE INDEX idx_analysis_time ON ai_analysis_result(create_time); + +COMMENT ON TABLE ai_analysis_result IS 'AI分析结果表'; + +-- ===================================================== +-- 11. 系统配置与日志表 +-- ===================================================== + +-- 系统配置表 +DROP TABLE IF EXISTS sys_config; +CREATE TABLE sys_config ( + id BIGSERIAL PRIMARY KEY, + config_key VARCHAR(100) NOT NULL UNIQUE COMMENT '配置键', + config_value TEXT COMMENT '配置值', + config_type VARCHAR(50) DEFAULT 'system' COMMENT '配置类型: system-系统, business-业务, ai-AI配置', + description TEXT COMMENT '配置描述', + status SMALLINT DEFAULT 1 COMMENT '状态', + create_by BIGINT COMMENT '创建人', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_by BIGINT COMMENT '更新人', + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + deleted SMALLINT DEFAULT 0 COMMENT '删除标记' +); + +COMMENT ON TABLE sys_config IS '系统配置表'; + +-- 操作日志表 +DROP TABLE IF EXISTS sys_operation_log; +CREATE TABLE sys_operation_log ( + id BIGSERIAL PRIMARY KEY, + trace_id VARCHAR(100) COMMENT '追踪ID', + user_id BIGINT COMMENT '用户ID', + `module` VARCHAR(50) COMMENT '模块', + `operation` VARCHAR(100) COMMENT '操作', + `method` VARCHAR(200) COMMENT '方法', + `request_url` VARCHAR(500) COMMENT '请求URL', + `request_method` VARCHAR(10) COMMENT '请求方法', + `request_params` TEXT COMMENT '请求参数', + `response_data` TEXT COMMENT '响应数据', + `ip` VARCHAR(50) COMMENT 'IP地址', + `user_agent` VARCHAR(500) COMMENT '用户代理', + `execute_time` INT COMMENT '执行时长(ms)', + `status` TINYINT DEFAULT 1 COMMENT '状态: 1-成功, 0-失败', + `error_msg` TEXT COMMENT '错误信息', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_trace_id` (`trace_id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_module` (`module`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表'; + +-- 通知消息表 +DROP TABLE IF EXISTS `sys_notification`; +CREATE TABLE `sys_notification` ( + `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `user_id` BIGINT NOT NULL COMMENT '接收用户ID', + `title` VARCHAR(200) NOT NULL COMMENT '标题', + `content` TEXT COMMENT '内容', + `notification_type` VARCHAR(50) COMMENT '通知类型: system-系统, task-任务, risk-风险, work_order-工单', + `related_type` VARCHAR(50) COMMENT '关联类型', + `related_id` BIGINT COMMENT '关联ID', + `priority` VARCHAR(20) DEFAULT 'normal' COMMENT '优先级: urgent-紧急, high-高, normal-普通, low-低', + `is_read` TINYINT DEFAULT 0 COMMENT '是否已读: 1-是, 0-否', + `read_time` DATETIME COMMENT '阅读时间', + `sender_id` BIGINT COMMENT '发送人ID', + `extra_data` JSON COMMENT '扩展数据', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_is_read` (`is_read`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知消息表'; \ No newline at end of file diff --git a/docs/dev-ops/nginx/Admin-fronted/nginx.conf b/docs/dev-ops/nginx/Admin-fronted/nginx.conf new file mode 100644 index 0000000..2672591 --- /dev/null +++ b/docs/dev-ops/nginx/Admin-fronted/nginx.conf @@ -0,0 +1,46 @@ +server { + listen 80; + server_name localhost; + index index.html index.htm default.htm default.html; + root /usr/share/nginx/html; + + # 禁止访问的文件或目录 + location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) { + return 404; + } + + # 一键申请SSL证书验证目录相关设置 + location ~ \.well-known { + allow all; + } + + # 禁止在证书验证目录放入敏感文件 + if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) { + return 403; + } + + # API代理 - Admin/api/代理到后端(使用^~提高优先级) + location ^~ /api/ { + proxy_pass http://weform-run:8080/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # 静态资源缓存 + location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { + expires 30d; + error_log /dev/null; + access_log /dev/null; + } + + location ~ .*\.(js|css)?$ { + expires 12h; + error_log /dev/null; + access_log /dev/null; + } + + access_log /var/log/nginx/client-access.log; + error_log /var/log/nginx/client-error.log; +} \ No newline at end of file diff --git a/docs/dev-ops/nginx/Client-fronted/nginx.conf b/docs/dev-ops/nginx/Client-fronted/nginx.conf new file mode 100644 index 0000000..ae19f40 --- /dev/null +++ b/docs/dev-ops/nginx/Client-fronted/nginx.conf @@ -0,0 +1,48 @@ +server { + listen 80; + server_name localhost; + index index.html index.htm default.htm default.html; + root /usr/share/nginx/html; + + # 禁止访问的文件或目录 + location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) { + return 404; + } + + # 一键申请SSL证书验证目录相关设置 + location ~ \.well-known { + allow all; + } + + # 禁止在证书验证目录放入敏感文件 + if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) { + return 403; + } + + # API代理 - Client将/prod-api/代理到后端 + location /prod-api/ { + proxy_pass http://weform-run:8080/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # 静态资源缓存 + location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { + expires 30d; + error_log /dev/null; + access_log /dev/null; + } + + location ~ .*\.(js|css)?$ { + expires 12h; + error_log /dev/null; + access_log /dev/null; + } + + access_log /var/log/nginx/client-access.log; + error_log /var/log/nginx/client-error.log; +} + + diff --git a/docs/dev-ops/redis/redis.conf b/docs/dev-ops/redis/redis.conf new file mode 100644 index 0000000..f6f3781 --- /dev/null +++ b/docs/dev-ops/redis/redis.conf @@ -0,0 +1,2 @@ +bind 0.0.0.0 +port 6379 \ No newline at end of file diff --git a/docs/dev-ops/start-all.sh b/docs/dev-ops/start-all.sh new file mode 100644 index 0000000..d804594 --- /dev/null +++ b/docs/dev-ops/start-all.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# 一键启动脚本 - Linux/Mac版本 +# 用于启动环境和应用服务 + +echo "========================================" +echo "开始启动 weform-run" +echo "========================================" + +# 获取脚本所在目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# 第一步:启动环境服务(MySQL、redis等) +echo "" +echo "[1/2] 正在启动环境服务..." +docker-compose -f docker-compose-environment.yml up -d + +if [ $? -ne 0 ]; then + echo "环境服务启动失败!" + exit 1 +fi + +echo "环境服务启动成功,等待服务就绪..." +sleep 10 + +# 第二步:启动应用服务(后端应用、前端等) +echo "" +echo "[2/2] 正在启动应用服务..." +docker-compose -f docker-compose-app.yml up -d + +if [ $? -ne 0 ]; then + echo "应用服务启动失败!" + exit 1 +fi + +echo "" +echo "========================================" +echo "所有服务启动完成!" +echo "========================================" +echo "查看服务状态: docker-compose -f docker-compose-environment.yml ps && docker-compose -f docker-compose-app.yml ps" +echo "停止所有服务: ./stop-all.sh" + diff --git a/pom.xml b/pom.xml index 81b82a4..806d9f0 100644 --- a/pom.xml +++ b/pom.xml @@ -15,15 +15,51 @@ ylhp-AIProjectManager + 17 + 17 + UTF-8 17 + org.springframework.boot spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + + org.postgresql + postgresql + runtime + + + + + com.baomidou + mybatis-plus-spring-boot3-starter + 3.5.5 + + + + + io.minio + minio + 8.5.7 + + + + + com.amazonaws + aws-java-sdk-s3 + 1.12.700 + org.springframework.boot diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml new file mode 100644 index 0000000..5ae6858 --- /dev/null +++ b/src/main/resources/application-dev.yaml @@ -0,0 +1,46 @@ +# 开发环境配置 +spring: + config: + activate: + on-profile: dev + + # PostgreSQL 数据库配置 + datasource: + url: jdbc:postgresql://localhost:5432/ylhp_ai_project_manager + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:postgres} + driver-class-name: org.postgresql.Driver + hikari: + maximum-pool-size: 10 + minimum-idle: 5 + idle-timeout: 300000 + connection-timeout: 20000 + + # MyBatis Plus 配置 + mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml + type-aliases-package: cn.yinlihupo.ylhpaiprojectmanager.entity + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: + id-type: auto + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + +# MinIO 对象存储配置 +minio: + endpoint: ${MINIO_ENDPOINT:http://localhost:9000} + access-key: ${MINIO_ACCESS_KEY:minioadmin} + secret-key: ${MINIO_SECRET_KEY:minioadmin} + bucket-name: ${MINIO_BUCKET_NAME:ylhp-files} + + +# 日志配置 +logging: + level: + root: INFO + cn.yinlihupo.ylhpaiprojectmanager: DEBUG + org.springframework.web: DEBUG diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..7cce7e0 --- /dev/null +++ b/src/main/resources/application-prod.yaml @@ -0,0 +1,44 @@ +# 生产环境配置 +spring: + config: + activate: + on-profile: prod + + # PostgreSQL 数据库配置 + datasource: + url: jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:ylhp_ai_project_manager} + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + driver-class-name: org.postgresql.Driver + hikari: + maximum-pool-size: 20 + minimum-idle: 10 + idle-timeout: 600000 + connection-timeout: 30000 + + # MyBatis Plus 配置 + mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml + type-aliases-package: cn.yinlihupo.ylhpaiprojectmanager.entity + configuration: + map-underscore-to-camel-case: true + global-config: + db-config: + id-type: auto + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + +# MinIO 对象存储配置 +minio: + endpoint: ${MINIO_ENDPOINT:http://localhost:9000} + access-key: ${MINIO_ACCESS_KEY:minioadmin} + secret-key: ${MINIO_SECRET_KEY:minioadmin} + bucket-name: ${MINIO_BUCKET_NAME:ylhp-files} + +# 日志配置 +logging: + level: + root: WARN + cn.yinlihupo.ylhpaiprojectmanager: INFO + org.springframework.web: WARN diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 7108c1f..6c1e586 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,3 +1,9 @@ spring: application: name: ylhp-AIProjectManager + profiles: + active: dev + +# 公共配置 +server: + port: 8080 \ No newline at end of file