|
|
|
|
@@ -1,5 +1,5 @@
|
|
|
|
|
-- ==========================================================
|
|
|
|
|
-- DMS v1.5.1 Document Management System Database
|
|
|
|
|
-- DMS v1.6.0 Document Management System Database
|
|
|
|
|
-- Deploy Script Schema
|
|
|
|
|
-- Server: Container Station on QNAP TS-473A
|
|
|
|
|
-- Database service: MariaDB 11.8
|
|
|
|
|
@@ -10,14 +10,11 @@
|
|
|
|
|
-- reverse proxy: jc21/nginx-proxy-manager:latest
|
|
|
|
|
-- cron service: n8n
|
|
|
|
|
-- ==========================================================
|
|
|
|
|
-- [v1.5.1 UPDATE] Enhanced Document Numbering System
|
|
|
|
|
-- Update: Upgraded from v1.4.5
|
|
|
|
|
-- Last Updated: 2025-12-02
|
|
|
|
|
-- [v1.6.0 UPDATE] Refactor Schema
|
|
|
|
|
-- Update: Upgraded from v1.5.1
|
|
|
|
|
-- Last Updated: 2025-12-13
|
|
|
|
|
-- Major Changes:
|
|
|
|
|
-- 1. Document Numbering: 8-column composite PK (was 5 columns)
|
|
|
|
|
-- 2. New Tables: document_number_audit, document_number_errors
|
|
|
|
|
-- 3. Enhanced indexes and constraints for document_number_counters
|
|
|
|
|
-- 4. Based on specs v1.5.1 (refs: 03.11-document-numbering.md)
|
|
|
|
|
-- 1. ปรับปรุง: corespondences, correspondence_revisions, correspondence_recipients, rfas, rfa_revisions
|
|
|
|
|
-- ==========================================================
|
|
|
|
|
SET NAMES utf8mb4;
|
|
|
|
|
|
|
|
|
|
@@ -397,6 +394,20 @@ CREATE TABLE contract_organizations (
|
|
|
|
|
-- =====================================================
|
|
|
|
|
-- 3. ✉️ Correspondences (เอกสารหลัก, Revisions)
|
|
|
|
|
-- =====================================================
|
|
|
|
|
-- ตารางเก็บข้อมูลสาขางาน (Disciplines) แยกตามสัญญา
|
|
|
|
|
CREATE TABLE disciplines (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
|
|
|
|
contract_id INT NOT NULL COMMENT 'ผูกกับสัญญา',
|
|
|
|
|
discipline_code VARCHAR(10) NOT NULL COMMENT 'รหัสสาขา (เช่น GEN, STR)',
|
|
|
|
|
code_name_th VARCHAR(255) COMMENT 'ชื่อไทย',
|
|
|
|
|
code_name_en VARCHAR(255) COMMENT 'ชื่ออังกฤษ',
|
|
|
|
|
is_active TINYINT(1) DEFAULT 1 COMMENT 'สถานะการใช้งาน',
|
|
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
|
FOREIGN KEY (contract_id) REFERENCES contracts (id) ON DELETE CASCADE,
|
|
|
|
|
UNIQUE KEY uk_discipline_contract (contract_id, discipline_code)
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเก็บข้อมูลสาขางาน (Disciplines) ตาม Req 6B';
|
|
|
|
|
|
|
|
|
|
-- ตาราง Master เก็บประเภทเอกสารโต้ตอบ
|
|
|
|
|
CREATE TABLE correspondence_types (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
|
|
|
|
@@ -409,6 +420,19 @@ CREATE TABLE correspondence_types (
|
|
|
|
|
deleted_at DATETIME NULL COMMENT 'วันที่ลบ (Soft Delete)'
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง Master เก็บประเภทเอกสารโต้ตอบ';
|
|
|
|
|
|
|
|
|
|
-- ตารางเก็บประเภทหนังสือย่อย (Sub Types) สำหรับ Mapping เลขรหัส
|
|
|
|
|
CREATE TABLE correspondence_sub_types (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
|
|
|
|
contract_id INT NOT NULL COMMENT 'ผูกกับสัญญา',
|
|
|
|
|
correspondence_type_id INT NOT NULL COMMENT 'ผูกกับประเภทเอกสารหลัก (เช่น RFA)',
|
|
|
|
|
sub_type_code VARCHAR(20) NOT NULL COMMENT 'รหัสย่อย (เช่น MAT, SHP)',
|
|
|
|
|
sub_type_name VARCHAR(255) COMMENT 'ชื่อประเภทหนังสือย่อย',
|
|
|
|
|
sub_type_number VARCHAR(10) COMMENT 'เลขรหัสสำหรับ Running Number (เช่น 11, 22)',
|
|
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
FOREIGN KEY (contract_id) REFERENCES contracts (id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (correspondence_type_id) REFERENCES correspondence_types (id) ON DELETE CASCADE
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเก็บประเภทหนังสือย่อย (Sub Types) ตาม Req 6B';
|
|
|
|
|
|
|
|
|
|
-- ตาราง Master เก็บสถานะของเอกสาร
|
|
|
|
|
CREATE TABLE correspondence_status (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
|
|
|
|
@@ -421,8 +445,9 @@ CREATE TABLE correspondence_status (
|
|
|
|
|
-- ตาราง "แม่" ของเอกสารโต้ตอบ เก็บข้อมูลที่ไม่เปลี่ยนตาม Revision
|
|
|
|
|
CREATE TABLE correspondences (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง (นี่คือ "Master ID" ที่ใช้เชื่อมโยง)',
|
|
|
|
|
correspondence_type_id INT NOT NULL COMMENT 'ประเภทเอกสาร ใช้แบ่งแยกว่าเป็น RFA หรือ อื่นๆ',
|
|
|
|
|
correspondence_number VARCHAR(100) NOT NULL COMMENT 'เลขที่เอกสาร (สร้างจาก DocumentNumberingModule)',
|
|
|
|
|
correspondence_type_id INT NOT NULL COMMENT 'ประเภทเอกสาร',
|
|
|
|
|
discipline_id INT NULL COMMENT 'สาขางาน (ถ้ามี)',
|
|
|
|
|
is_internal_communication TINYINT(1) DEFAULT 0 COMMENT '(1 = ภายใน, 0 = ภายนอก)',
|
|
|
|
|
project_id INT NOT NULL COMMENT 'อยู่ในโครงการ',
|
|
|
|
|
originator_id INT COMMENT 'องค์กรผู้ส่ง',
|
|
|
|
|
@@ -431,47 +456,13 @@ CREATE TABLE correspondences (
|
|
|
|
|
deleted_at DATETIME NULL COMMENT 'สำหรับ Soft Delete',
|
|
|
|
|
FOREIGN KEY (correspondence_type_id) REFERENCES correspondence_types (id) ON DELETE RESTRICT,
|
|
|
|
|
FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (originator_id) REFERENCES organizations (id) ON DELETE
|
|
|
|
|
SET NULL,
|
|
|
|
|
FOREIGN KEY (created_by) REFERENCES users (user_id) ON DELETE
|
|
|
|
|
SET NULL,
|
|
|
|
|
UNIQUE KEY uq_corr_no_per_project (
|
|
|
|
|
project_id,
|
|
|
|
|
correspondence_number
|
|
|
|
|
)
|
|
|
|
|
FOREIGN KEY (originator_id) REFERENCES organizations (id) ON DELETE SET NULL,
|
|
|
|
|
FOREIGN KEY (created_by) REFERENCES users (user_id) ON DELETE SET NULL,
|
|
|
|
|
-- Foreign Key ที่รวมเข้ามาจาก ALTER (ระบุชื่อ Constraint ตามที่ต้องการ)
|
|
|
|
|
CONSTRAINT fk_corr_discipline FOREIGN KEY (discipline_id) REFERENCES disciplines (id) ON DELETE SET NULL,
|
|
|
|
|
UNIQUE KEY uq_corr_no_per_project (project_id, correspondence_number)
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "แม่" ของเอกสารโต้ตอบ เก็บข้อมูลที่ไม่เปลี่ยนตาม Revision';
|
|
|
|
|
|
|
|
|
|
-- ตาราง "ลูก" เก็บประวัติการแก้ไข (Revisions) ของ correspondences (1:N)
|
|
|
|
|
CREATE TABLE correspondence_revisions (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของ Revision',
|
|
|
|
|
correspondence_id INT NOT NULL COMMENT 'Master ID',
|
|
|
|
|
revision_number INT NOT NULL COMMENT 'หมายเลข Revision (0, 1, 2...)',
|
|
|
|
|
revision_label VARCHAR(10) COMMENT 'Revision ที่แสดง (เช่น A, B, 1.1)',
|
|
|
|
|
is_current BOOLEAN DEFAULT FALSE COMMENT '(1 = Revision ปัจจุบัน)',
|
|
|
|
|
correspondence_status_id INT NOT NULL COMMENT 'สถานะของ Revision นี้',
|
|
|
|
|
title VARCHAR(255) NOT NULL COMMENT 'เรื่อง',
|
|
|
|
|
document_date DATE COMMENT 'วันที่ในเอกสาร',
|
|
|
|
|
issued_date DATETIME COMMENT 'วันที่ออกเอกสาร',
|
|
|
|
|
received_date DATETIME COMMENT 'วันที่ลงรับเอกสาร',
|
|
|
|
|
due_date DATETIME COMMENT 'วันที่ครบกำหนด',
|
|
|
|
|
description TEXT COMMENT 'คำอธิบายการแก้ไขใน Revision นี้',
|
|
|
|
|
details JSON COMMENT 'ข้อมูลเฉพาะ (เช่น RFI details)',
|
|
|
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้างเอกสาร',
|
|
|
|
|
created_by INT COMMENT 'ผู้สร้าง',
|
|
|
|
|
updated_by INT COMMENT 'ผู้แก้ไขล่าสุด',
|
|
|
|
|
FOREIGN KEY (correspondence_id) REFERENCES correspondences (id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (correspondence_status_id) REFERENCES correspondence_status (id) ON DELETE RESTRICT,
|
|
|
|
|
FOREIGN KEY (created_by) REFERENCES users (user_id) ON DELETE
|
|
|
|
|
SET NULL,
|
|
|
|
|
FOREIGN KEY (updated_by) REFERENCES users (user_id) ON DELETE
|
|
|
|
|
SET NULL,
|
|
|
|
|
UNIQUE KEY uq_master_revision_number (
|
|
|
|
|
correspondence_id,
|
|
|
|
|
revision_number
|
|
|
|
|
),
|
|
|
|
|
UNIQUE KEY uq_master_current (correspondence_id, is_current)
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "ลูก" เก็บประวัติการแก้ไข (Revisions) ของ correspondences (1 :N)';
|
|
|
|
|
|
|
|
|
|
-- ตารางเชื่อมผู้รับ (TO/CC) สำหรับเอกสารแต่ละฉบับ (M:N)
|
|
|
|
|
CREATE TABLE correspondence_recipients (
|
|
|
|
|
correspondence_id INT COMMENT 'ID ของเอกสาร',
|
|
|
|
|
@@ -482,10 +473,60 @@ CREATE TABLE correspondence_recipients (
|
|
|
|
|
recipient_organization_id,
|
|
|
|
|
recipient_type
|
|
|
|
|
),
|
|
|
|
|
FOREIGN KEY (correspondence_id) REFERENCES correspondence_revisions (correspondence_id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (correspondence_id) REFERENCES correspondences (id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (recipient_organization_id) REFERENCES organizations (id) ON DELETE RESTRICT
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเชื่อมผู้รับ (TO / CC) สำหรับเอกสารแต่ละฉบับ (M :N)';
|
|
|
|
|
|
|
|
|
|
-- ตาราง "ลูก" เก็บประวัติการแก้ไข (Revisions) ของ correspondences (1:N)
|
|
|
|
|
CREATE TABLE correspondence_revisions (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของ Revision',
|
|
|
|
|
|
|
|
|
|
correspondence_id INT NOT NULL COMMENT 'Master ID',
|
|
|
|
|
revision_number INT NOT NULL COMMENT 'หมายเลข Revision (0, 1, 2...)',
|
|
|
|
|
revision_label VARCHAR(10) COMMENT 'Revision ที่แสดง (เช่น A, B, 1.1)',
|
|
|
|
|
is_current BOOLEAN DEFAULT FALSE COMMENT '(1 = Revision ปัจจุบัน)',
|
|
|
|
|
|
|
|
|
|
-- ข้อมูลเนื้อหาที่เปลี่ยนได้
|
|
|
|
|
correspondence_status_id INT NOT NULL COMMENT 'สถานะของ Revision นี้',
|
|
|
|
|
|
|
|
|
|
subject VARCHAR(500) NOT NULL COMMENT 'หัวข้อเรื่อง',
|
|
|
|
|
description TEXT COMMENT 'คำอธิบายการแก้ไขใน Revision นี้',
|
|
|
|
|
body TEXT NULL COMMENT 'เนื้อความ (ถ้ามี)',
|
|
|
|
|
remarks TEXT COMMENT 'หมายเหตุ',
|
|
|
|
|
|
|
|
|
|
document_date DATE COMMENT 'วันที่ในเอกสาร',
|
|
|
|
|
issued_date DATETIME COMMENT 'วันที่ออกเอกสาร',
|
|
|
|
|
received_date DATETIME COMMENT 'วันที่ลงรับเอกสาร',
|
|
|
|
|
due_date DATETIME COMMENT 'วันที่ครบกำหนด',
|
|
|
|
|
|
|
|
|
|
-- Standard Meta Columns
|
|
|
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้างเอกสาร',
|
|
|
|
|
created_by INT COMMENT 'ผู้สร้าง',
|
|
|
|
|
updated_by INT COMMENT 'ผู้แก้ไขล่าสุด',
|
|
|
|
|
|
|
|
|
|
-- ส่วนของ JSON และ Schema Version
|
|
|
|
|
details JSON COMMENT 'ข้อมูลเฉพาะ (เช่น LETTET details)',
|
|
|
|
|
schema_version INT DEFAULT 1 COMMENT 'เวอร์ชันของ Schema ที่ใช้กับ details',
|
|
|
|
|
|
|
|
|
|
-- Generated Virtual Columns (ดึงค่าจาก JSON โดยอัตโนมัติ)
|
|
|
|
|
v_ref_project_id INT GENERATED ALWAYS AS (
|
|
|
|
|
CAST(JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId')) AS UNSIGNED)
|
|
|
|
|
) VIRTUAL COMMENT 'Virtual Column: Project ID จาก JSON',
|
|
|
|
|
|
|
|
|
|
v_doc_subtype VARCHAR(50) GENERATED ALWAYS AS (
|
|
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))
|
|
|
|
|
) VIRTUAL COMMENT 'Virtual Column: Document Subtype จาก JSON',
|
|
|
|
|
|
|
|
|
|
FOREIGN KEY (correspondence_id) REFERENCES correspondences (id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (correspondence_status_id) REFERENCES correspondence_status (id) ON DELETE RESTRICT,
|
|
|
|
|
FOREIGN KEY (created_by) REFERENCES users (user_id) ON DELETE SET NULL,
|
|
|
|
|
FOREIGN KEY (updated_by) REFERENCES users (user_id) ON DELETE SET NULL,
|
|
|
|
|
UNIQUE KEY uq_master_revision_number (correspondence_id, revision_number ),
|
|
|
|
|
UNIQUE KEY uq_master_current (correspondence_id, is_current),
|
|
|
|
|
INDEX idx_corr_rev_v_project (v_ref_project_id),
|
|
|
|
|
INDEX idx_corr_rev_v_subtype (v_doc_subtype)
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "ลูก" เก็บประวัติการแก้ไข (Revisions) ของ correspondences (1 :N)';
|
|
|
|
|
|
|
|
|
|
-- ตาราง Master เก็บ Tags ทั้งหมดที่ใช้ในระบบ
|
|
|
|
|
CREATE TABLE tags (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
|
|
|
|
@@ -533,42 +574,6 @@ CREATE TABLE rfa_types (
|
|
|
|
|
FOREIGN KEY (contract_id) REFERENCES contracts (id) ON DELETE CASCADE
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง Master สำหรับประเภท RFA';
|
|
|
|
|
|
|
|
|
|
-- [NEW 6B] ตารางเก็บข้อมูลสาขางาน (Disciplines) แยกตามสัญญา
|
|
|
|
|
CREATE TABLE disciplines (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
|
|
|
|
contract_id INT NOT NULL COMMENT 'ผูกกับสัญญา',
|
|
|
|
|
discipline_code VARCHAR(10) NOT NULL COMMENT 'รหัสสาขา (เช่น GEN, STR)',
|
|
|
|
|
code_name_th VARCHAR(255) COMMENT 'ชื่อไทย',
|
|
|
|
|
code_name_en VARCHAR(255) COMMENT 'ชื่ออังกฤษ',
|
|
|
|
|
is_active TINYINT(1) DEFAULT 1 COMMENT 'สถานะการใช้งาน',
|
|
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
|
|
|
FOREIGN KEY (contract_id) REFERENCES contracts (id) ON DELETE CASCADE,
|
|
|
|
|
UNIQUE KEY uk_discipline_contract (contract_id, discipline_code)
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเก็บข้อมูลสาขางาน (Disciplines) ตาม Req 6B';
|
|
|
|
|
|
|
|
|
|
-- [NEW 6B] ตารางเก็บประเภทหนังสือย่อย (Sub Types) สำหรับ Mapping เลขรหัส
|
|
|
|
|
CREATE TABLE correspondence_sub_types (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
|
|
|
|
contract_id INT NOT NULL COMMENT 'ผูกกับสัญญา',
|
|
|
|
|
correspondence_type_id INT NOT NULL COMMENT 'ผูกกับประเภทเอกสารหลัก (เช่น RFA)',
|
|
|
|
|
sub_type_code VARCHAR(20) NOT NULL COMMENT 'รหัสย่อย (เช่น MAT, SHP)',
|
|
|
|
|
sub_type_name VARCHAR(255) COMMENT 'ชื่อประเภทหนังสือย่อย',
|
|
|
|
|
sub_type_number VARCHAR(10) COMMENT 'เลขรหัสสำหรับ Running Number (เช่น 11, 22)',
|
|
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
FOREIGN KEY (contract_id) REFERENCES contracts (id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (correspondence_type_id) REFERENCES correspondence_types (id) ON DELETE CASCADE
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเก็บประเภทหนังสือย่อย (Sub Types) ตาม Req 6B';
|
|
|
|
|
|
|
|
|
|
-- หรือใช้ ALTER TABLE (แนะนำให้รันหลังสร้างตาราง disciplines เสร็จ)
|
|
|
|
|
ALTER TABLE correspondences
|
|
|
|
|
ADD COLUMN discipline_id INT NULL COMMENT 'สาขางาน (ถ้ามี)'
|
|
|
|
|
AFTER correspondence_type_id;
|
|
|
|
|
|
|
|
|
|
ALTER TABLE correspondences
|
|
|
|
|
ADD CONSTRAINT fk_corr_discipline FOREIGN KEY (discipline_id) REFERENCES disciplines (id) ON DELETE
|
|
|
|
|
SET NULL;
|
|
|
|
|
|
|
|
|
|
-- ตาราง Master สำหรับสถานะ RFA
|
|
|
|
|
CREATE TABLE rfa_status_codes (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
|
|
|
|
@@ -594,65 +599,75 @@ CREATE TABLE rfa_approve_codes (
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง Master สำหรับรหัสผลการอนุมัติ RFA';
|
|
|
|
|
|
|
|
|
|
CREATE TABLE rfas (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง (RFA Master ID)',
|
|
|
|
|
id INT PRIMARY KEY COMMENT 'ID ของตาราง (RFA Master ID)', -- ❌ ไม่มี AUTO_INCREMENT
|
|
|
|
|
rfa_type_id INT NOT NULL COMMENT 'ประเภท RFA',
|
|
|
|
|
-- discipline_id INT NULL COMMENT 'สาขางาน (ถ้ามี)',
|
|
|
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้าง',
|
|
|
|
|
created_by INT COMMENT 'ผู้สร้าง',
|
|
|
|
|
deleted_at DATETIME NULL COMMENT 'สำหรับ Soft Delete',
|
|
|
|
|
FOREIGN KEY (rfa_type_id) REFERENCES rfa_types (id),
|
|
|
|
|
FOREIGN KEY (created_by) REFERENCES users (user_id) ON DELETE
|
|
|
|
|
SET NULL
|
|
|
|
|
FOREIGN KEY (created_by) REFERENCES users (user_id) ON DELETE SET NULL,
|
|
|
|
|
-- CONSTRAINT fk_rfa_discipline FOREIGN KEY (discipline_id) REFERENCES disciplines (id) ON DELETE SET NULL,
|
|
|
|
|
CONSTRAINT fk_rfas_parent FOREIGN KEY (id) REFERENCES correspondences (id) ON DELETE CASCADE
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "แม่" ของ RFA (มีความสัมพันธ์ 1 :N กับ rfa_revisions)';
|
|
|
|
|
|
|
|
|
|
ALTER TABLE rfas
|
|
|
|
|
ADD COLUMN discipline_id INT NULL COMMENT 'สาขางาน (ถ้ามี)'
|
|
|
|
|
AFTER rfa_type_id;
|
|
|
|
|
|
|
|
|
|
ALTER TABLE rfas
|
|
|
|
|
ADD CONSTRAINT fk_rfa_discipline FOREIGN KEY (discipline_id) REFERENCES disciplines (id) ON DELETE
|
|
|
|
|
SET NULL;
|
|
|
|
|
|
|
|
|
|
-- ตาราง "ลูก" เก็บประวัติ (Revisions) ของ rfas (1:N)
|
|
|
|
|
CREATE TABLE rfa_revisions (
|
|
|
|
|
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของ Revision',
|
|
|
|
|
correspondence_id INT NOT NULL COMMENT 'Master ID ของ Correspondence',
|
|
|
|
|
|
|
|
|
|
rfa_id INT NOT NULL COMMENT 'Master ID ของ RFA',
|
|
|
|
|
revision_number INT NOT NULL COMMENT 'หมายเลข Revision (0, 1, 2...)',
|
|
|
|
|
revision_label VARCHAR(10) COMMENT 'Revision ที่แสดง (เช่น A, B, 1.1)',
|
|
|
|
|
is_current BOOLEAN DEFAULT FALSE COMMENT '(1 = Revision ปัจจุบัน)',
|
|
|
|
|
|
|
|
|
|
-- ข้อมูลเฉพาะของ RFA Revision ที่ซับซ้อน
|
|
|
|
|
rfa_status_code_id INT NOT NULL COMMENT 'สถานะ RFA',
|
|
|
|
|
rfa_approve_code_id INT COMMENT 'ผลการอนุมัติ',
|
|
|
|
|
title VARCHAR(255) NOT NULL COMMENT 'เรื่อง',
|
|
|
|
|
subject VARCHAR(500) NOT NULL COMMENT 'หัวข้อเรื่อง',
|
|
|
|
|
description TEXT COMMENT 'คำอธิบายการแก้ไขใน Revision นี้',
|
|
|
|
|
body TEXT NULL COMMENT 'เนื้อความ (ถ้ามี)',
|
|
|
|
|
remarks TEXT COMMENT 'หมายเหตุ',
|
|
|
|
|
|
|
|
|
|
document_date DATE COMMENT 'วันที่ในเอกสาร',
|
|
|
|
|
issued_date DATE COMMENT 'วันที่ส่งขออนุมัติ',
|
|
|
|
|
received_date DATETIME COMMENT 'วันที่ลงรับเอกสาร',
|
|
|
|
|
due_date DATETIME COMMENT 'วันที่ครบกำหนด',
|
|
|
|
|
approved_date DATE COMMENT 'วันที่อนุมัติ',
|
|
|
|
|
description TEXT COMMENT 'คำอธิบายการแก้ไขใน Revision นี้',
|
|
|
|
|
|
|
|
|
|
-- Standard Meta Columns
|
|
|
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้างเอกสาร',
|
|
|
|
|
created_by INT COMMENT 'ผู้สร้าง',
|
|
|
|
|
updated_by INT COMMENT 'ผู้แก้ไขล่าสุด',
|
|
|
|
|
FOREIGN KEY (correspondence_id) REFERENCES correspondences (id) ON DELETE CASCADE,
|
|
|
|
|
|
|
|
|
|
-- ส่วนของ JSON และ Schema Version
|
|
|
|
|
details JSON NULL COMMENT 'RFA Specific Details',
|
|
|
|
|
schema_version INT DEFAULT 1 COMMENT 'Version ของ JSON Schema',
|
|
|
|
|
|
|
|
|
|
-- Generated Virtual Columns (ดึงค่าจาก JSON โดยอัตโนมัติ)
|
|
|
|
|
v_ref_drawing_count INT GENERATED ALWAYS AS (
|
|
|
|
|
JSON_UNQUOTE(
|
|
|
|
|
JSON_EXTRACT(details, '$.drawingCount')
|
|
|
|
|
)
|
|
|
|
|
) VIRTUAL,
|
|
|
|
|
|
|
|
|
|
FOREIGN KEY (rfa_id) REFERENCES rfas (id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (rfa_status_code_id) REFERENCES rfa_status_codes (id),
|
|
|
|
|
FOREIGN KEY (rfa_approve_code_id) REFERENCES rfa_approve_codes (id) ON DELETE
|
|
|
|
|
SET NULL,
|
|
|
|
|
FOREIGN KEY (created_by) REFERENCES users (user_id) ON DELETE
|
|
|
|
|
SET NULL,
|
|
|
|
|
FOREIGN KEY (updated_by) REFERENCES users (user_id) ON DELETE
|
|
|
|
|
SET NULL,
|
|
|
|
|
UNIQUE KEY uq_rr_rev_number (rfa_id, revision_number),
|
|
|
|
|
UNIQUE KEY uq_rr_current (rfa_id, is_current)
|
|
|
|
|
FOREIGN KEY (rfa_approve_code_id) REFERENCES rfa_approve_codes (id) ON DELETE SET NULL,
|
|
|
|
|
FOREIGN KEY (created_by) REFERENCES users (user_id) ON DELETE SET NULL,
|
|
|
|
|
FOREIGN KEY (updated_by) REFERENCES users (user_id) ON DELETE SET NULL,
|
|
|
|
|
UNIQUE KEY uq_rr_rev_number (rfa_id, revision_number),
|
|
|
|
|
UNIQUE KEY uq_rr_current (rfa_id, is_current)
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "ลูก" เก็บประวัติ (Revisions) ของ rfas (1 :N)';
|
|
|
|
|
|
|
|
|
|
-- ตารางเชื่อมระหว่าง rfa_revisions (ที่เป็นประเภท DWG) กับ shop_drawing_revisions (M:N)
|
|
|
|
|
CREATE TABLE rfa_items (
|
|
|
|
|
rfarev_correspondence_id INT COMMENT 'ID ของ RFA Revision',
|
|
|
|
|
rfa_revision_id INT COMMENT 'ID ของ RFA Revision',
|
|
|
|
|
shop_drawing_revision_id INT COMMENT 'ID ของ Shop Drawing Revision',
|
|
|
|
|
PRIMARY KEY (
|
|
|
|
|
rfarev_correspondence_id,
|
|
|
|
|
rfa_revision_id,
|
|
|
|
|
shop_drawing_revision_id
|
|
|
|
|
),
|
|
|
|
|
FOREIGN KEY (rfarev_correspondence_id) REFERENCES rfa_revisions (correspondence_id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (rfa_revision_id) REFERENCES rfa_revisions (id) ON DELETE CASCADE,
|
|
|
|
|
FOREIGN KEY (shop_drawing_revision_id) REFERENCES shop_drawing_revisions (id) ON DELETE CASCADE
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเชื่อมระหว่าง rfa_revisions (ที่เป็นประเภท DWG) กับ shop_drawing_revisions (M :N)';
|
|
|
|
|
|
|
|
|
|
@@ -1260,51 +1275,6 @@ CREATE TABLE backup_logs (
|
|
|
|
|
error_message TEXT COMMENT 'ข้อความผิดพลาด (ถ้ามี)'
|
|
|
|
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางสำหรับบันทึกประวัติการสำรองข้อมูล';
|
|
|
|
|
|
|
|
|
|
-- 4.2 Virtual Columns for JSON Search (ตัวอย่างสำหรับ Correspondence)
|
|
|
|
|
-- รองรับ: Backend Plan T2.1, Req 3.11.3
|
|
|
|
|
-- เหตุผล: เพิ่มความเร็วในการ Search/Sort ข้อมูลที่อยู่ใน JSON details
|
|
|
|
|
-- หมายเหตุ: ต้องมั่นใจว่า MariaDB เวอร์ชัน 11.8+ รองรับ Syntax นี้
|
|
|
|
|
-- ตัวอย่าง: ดึง Project ID ที่อ้างอิงใน details ออกมาทำ Index
|
|
|
|
|
ALTER TABLE correspondence_revisions
|
|
|
|
|
ADD COLUMN v_ref_project_id INT GENERATED ALWAYS AS (
|
|
|
|
|
JSON_UNQUOTE(
|
|
|
|
|
JSON_EXTRACT(details, '$.projectId')
|
|
|
|
|
)
|
|
|
|
|
) VIRTUAL,
|
|
|
|
|
ADD INDEX idx_corr_rev_v_project (v_ref_project_id);
|
|
|
|
|
|
|
|
|
|
-- ตัวอย่าง: ดึง Document Type ย่อยจาก details
|
|
|
|
|
ALTER TABLE correspondence_revisions
|
|
|
|
|
ADD COLUMN v_doc_subtype VARCHAR(50) GENERATED ALWAYS AS (
|
|
|
|
|
JSON_UNQUOTE(JSON_EXTRACT(details, '$.subType'))
|
|
|
|
|
) VIRTUAL,
|
|
|
|
|
ADD INDEX idx_corr_rev_v_subtype (v_doc_subtype);
|
|
|
|
|
|
|
|
|
|
-- 2. ปรับปรุงตาราง correspondence_revisions
|
|
|
|
|
-- เพิ่ม Virtual Columns และ Schema Version
|
|
|
|
|
ALTER TABLE correspondence_revisions
|
|
|
|
|
ADD COLUMN schema_version INT DEFAULT 1 COMMENT 'เวอร์ชันของ Schema ที่ใช้กับ details'
|
|
|
|
|
AFTER details;
|
|
|
|
|
|
|
|
|
|
-- ทำแบบเดียวกันกับ RFA Revisions หากมีการเก็บ JSON details
|
|
|
|
|
ALTER TABLE rfa_revisions
|
|
|
|
|
ADD COLUMN details JSON NULL COMMENT 'RFA Specific Details'
|
|
|
|
|
AFTER description;
|
|
|
|
|
|
|
|
|
|
ALTER TABLE rfa_revisions
|
|
|
|
|
ADD COLUMN v_ref_drawing_count INT GENERATED ALWAYS AS (
|
|
|
|
|
JSON_UNQUOTE(
|
|
|
|
|
JSON_EXTRACT(details, '$.drawingCount')
|
|
|
|
|
)
|
|
|
|
|
) VIRTUAL;
|
|
|
|
|
|
|
|
|
|
ALTER TABLE rfa_revisions
|
|
|
|
|
ADD COLUMN schema_version INT DEFAULT 1 COMMENT 'Version ของ JSON Schema'
|
|
|
|
|
AFTER details;
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_rfa_rev_v_drawing_count ON rfa_revisions (v_ref_drawing_count);
|
|
|
|
|
|
|
|
|
|
-- ... (ต่อท้ายไฟล์เดิม)
|
|
|
|
|
-- ============================================================
|
|
|
|
|
-- ส่วนที่ 11: Unified Workflow Engine (Phase 6A/Phase 3)
|
|
|
|
|
-- ============================================================
|
|
|
|
|
@@ -1390,6 +1360,13 @@ CREATE INDEX idx_wf_hist_user ON workflow_histories (action_by_user_id);
|
|
|
|
|
-- =====================================================
|
|
|
|
|
-- CREATE INDEXES
|
|
|
|
|
-- =====================================================
|
|
|
|
|
-- Indexes for correspondences
|
|
|
|
|
CREATE INDEX idx_corr_type ON correspondences(correspondence_type_id);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_corr_project ON correspondences(project_id);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX idx_rfa_rev_v_drawing_count ON rfa_revisions (v_ref_drawing_count);
|
|
|
|
|
|
|
|
|
|
-- Indexes for document_number_formats
|
|
|
|
|
CREATE INDEX idx_document_number_formats_project ON document_number_formats (project_id);
|
|
|
|
|
|
|
|
|
|
@@ -1502,7 +1479,7 @@ SELECT c.id AS correspondence_id,
|
|
|
|
|
cr.id AS revision_id,
|
|
|
|
|
cr.revision_number,
|
|
|
|
|
cr.revision_label,
|
|
|
|
|
cr.title,
|
|
|
|
|
cr.subject,
|
|
|
|
|
cr.document_date,
|
|
|
|
|
cr.issued_date,
|
|
|
|
|
cr.received_date,
|
|
|
|
|
@@ -1530,13 +1507,15 @@ WHERE cr.is_current = TRUE
|
|
|
|
|
|
|
|
|
|
-- View แสดง Revision "ปัจจุบัน" ของ rfa_revisions ทั้งหมด
|
|
|
|
|
CREATE VIEW v_current_rfas AS
|
|
|
|
|
SELECT r.id AS rfa_id,
|
|
|
|
|
SELECT
|
|
|
|
|
r.id AS rfa_id,
|
|
|
|
|
r.rfa_type_id,
|
|
|
|
|
rt.type_code AS rfa_type_code,
|
|
|
|
|
rt.type_name_th AS rfa_type_name_th,
|
|
|
|
|
rt.type_name_en AS rfa_type_name_en,
|
|
|
|
|
rr.correspondence_id,
|
|
|
|
|
c.correspondence_number,
|
|
|
|
|
c.discipline_id, -- ✅ ดึงจาก Correspondences
|
|
|
|
|
d.discipline_code, -- ✅ Join เพิ่มเพื่อแสดง code
|
|
|
|
|
c.project_id,
|
|
|
|
|
p.project_code,
|
|
|
|
|
p.project_name,
|
|
|
|
|
@@ -1545,7 +1524,7 @@ SELECT r.id AS rfa_id,
|
|
|
|
|
rr.id AS revision_id,
|
|
|
|
|
rr.revision_number,
|
|
|
|
|
rr.revision_label,
|
|
|
|
|
rr.title,
|
|
|
|
|
rr.subject,
|
|
|
|
|
rr.document_date,
|
|
|
|
|
rr.issued_date,
|
|
|
|
|
rr.received_date,
|
|
|
|
|
@@ -1562,7 +1541,10 @@ SELECT r.id AS rfa_id,
|
|
|
|
|
FROM rfas r
|
|
|
|
|
INNER JOIN rfa_types rt ON r.rfa_type_id = rt.id
|
|
|
|
|
INNER JOIN rfa_revisions rr ON r.id = rr.rfa_id
|
|
|
|
|
INNER JOIN correspondences c ON rr.correspondence_id = c.id
|
|
|
|
|
-- RFA uses shared primary key with correspondences (1:1)
|
|
|
|
|
INNER JOIN correspondences c ON r.id = c.id
|
|
|
|
|
-- [FIX 1] เพิ่มการ Join ตาราง disciplines
|
|
|
|
|
LEFT JOIN disciplines d ON c.discipline_id = d.id
|
|
|
|
|
INNER JOIN projects p ON c.project_id = p.id
|
|
|
|
|
INNER JOIN organizations org ON c.originator_id = org.id
|
|
|
|
|
INNER JOIN rfa_status_codes rsc ON rr.rfa_status_code_id = rsc.id
|
|
|
|
|
@@ -1615,9 +1597,9 @@ SELECT -- 1. Workflow Instance Info
|
|
|
|
|
ELSE 'N/A'
|
|
|
|
|
END AS document_number,
|
|
|
|
|
CASE
|
|
|
|
|
WHEN wi.entity_type = 'rfa_revision' THEN rfa_rev.title
|
|
|
|
|
WHEN wi.entity_type = 'rfa_revision' THEN rfa_rev.subject
|
|
|
|
|
WHEN wi.entity_type = 'circulation' THEN circ.circulation_subject
|
|
|
|
|
WHEN wi.entity_type = 'correspondence_revision' THEN corr_rev.title
|
|
|
|
|
WHEN wi.entity_type = 'correspondence_revision' THEN corr_rev.subject
|
|
|
|
|
ELSE 'Unknown Document'
|
|
|
|
|
END AS subject,
|
|
|
|
|
-- 4. Context Info (สำหรับ Filter สิทธิ์การมองเห็นที่ Backend)
|
|
|
|
|
@@ -1628,7 +1610,7 @@ FROM workflow_instances wi
|
|
|
|
|
JOIN workflow_definitions wd ON wi.definition_id = wd.id -- 5. Joins for RFA (ซับซ้อนหน่อยเพราะ RFA ผูกกับ Correspondence อีกที)
|
|
|
|
|
LEFT JOIN rfa_revisions rfa_rev ON wi.entity_type = 'rfa_revision'
|
|
|
|
|
AND wi.entity_id = CAST(rfa_rev.id AS CHAR)
|
|
|
|
|
LEFT JOIN correspondences rfa_corr ON rfa_rev.correspondence_id = rfa_corr.id -- 6. Joins for Circulation
|
|
|
|
|
LEFT JOIN correspondences rfa_corr ON rfa_rev.id = rfa_corr.id -- 6. Joins for Circulation
|
|
|
|
|
LEFT JOIN circulations circ ON wi.entity_type = 'circulation'
|
|
|
|
|
AND wi.entity_id = CAST(circ.id AS CHAR) -- 7. Joins for Correspondence
|
|
|
|
|
LEFT JOIN correspondence_revisions corr_rev ON wi.entity_type = 'correspondence_revision'
|