251213:1509 Docunment Number Businee Rule not correct
Some checks failed
Spec Validation / validate-markdown (push) Has been cancelled
Spec Validation / validate-diagrams (push) Has been cancelled
Spec Validation / check-todos (push) Has been cancelled

This commit is contained in:
admin
2025-12-13 15:09:01 +07:00
parent d964546c8d
commit ec35521258
64 changed files with 11956 additions and 223 deletions

View File

@@ -1,12 +1,13 @@
# **ตารางฐานข้อมูล (Data Dictionary) - LCBP3-DMS (V1.5.1)**
# **ตารางฐานข้อมูล (Data Dictionary) - LCBP3-DMS (V1.6.0)**
เอกสารนี้สรุปโครงสร้างตาราง,
FOREIGN KEYS (FK),
และ Constraints ที่สำคัญทั้งหมดในฐานข้อมูล LCBP3 - DMS (v1.5.1) เพื่อใช้เป็นเอกสารอ้างอิงสำหรับทีมพัฒนา Backend (NestJS) และ Frontend (Next.js) โดยอิงจาก Requirements และ SQL Script ล่าสุด ** สถานะ: ** FINAL GUIDELINE ** วันที่: ** 2025 -12 -04 ** อ้างอิง: ** Requirements v1.5.1 & FullStackJS Guidelines v1.5.1 ** Classification: ** Internal Technical Documentation ## 📝 สรุปรายการปรับปรุง (Summary of Changes in v1.5.1)
1.** Enhanced Document Numbering **: ปรับปรุงตาราง `document_number_counters` ให้รองรับ 8 - COLUMN Composite PK และเพิ่มตาราง `document_number_audit`,
`document_number_errors` 2.** Unified Workflow ENGINE **: เพิ่มตาราง `workflow_definitions`,
`workflow_instances`,
`workflow_histories` เพื่อรองรับ Workflow แบบ DYNAMIC 3.** New MASTER TABLES **: เพิ่มตาราง `disciplines` และ `correspondence_sub_types` ตาม Req 6B 4.** System Enhancements **: เพิ่มตาราง `json_schemas` และ `user_preferences` 5.** Schema Updates **: เพิ่ม `discipline_id` ในตาราง `correspondences` และ `rfas` ---
และ Constraints ที่สำคัญทั้งหมดในฐานข้อมูล LCBP3 - DMS (v1.6.0) เพื่อใช้เป็นเอกสารอ้างอิงสำหรับทีมพัฒนา Backend (NestJS) และ Frontend (Next.js) โดยอิงจาก Requirements และ SQL Script ล่าสุด ** สถานะ: ** FINAL GUIDELINE ** วันที่: ** 2025 -12 -13 ** อ้างอิง: ** Requirements v1.6.0 & FullStackJS Guidelines v1.6.0 ** Classification: ** Internal Technical Documentation ## 📝 สรุปรายการปรับปรุง (Summary of Changes in v1.6.0)
1.** Schema Refactoring **: ปรับโครงสร้างตาราง `correspondences`, `correspondence_revisions`, `rfas`, `rfa_revisions` ให้เป็นมาตรฐานเดียวกัน
2.** Shared PK Pattern **: ตาราง `rfas` ใช้ ID ร่วมกับ `correspondences` (FK Reference แทน AUTO_INCREMENT)
3.** Column Rename **: เปลี่ยน `title` เป็น `subject` ในตาราง revision และเพิ่ม `body`, `remarks`
4.** Virtual Columns **: เพิ่ม Virtual Columns สำหรับ Index ข้อมูลจาก JSON details
5.** FK Updates **: `correspondence_recipients` FK ชี้ไป `correspondences(id)` แทน `correspondence_revisions` ---
## **1. 🏢 Core & Master Data Tables (องค์กร, โครงการ, สัญญา)**

View File

@@ -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'

View File

@@ -2902,7 +2902,7 @@ INSERT INTO `correspondence_revisions` (
`revision_label`,
`is_current`,
`correspondence_status_id`,
`title`,
`subject`,
`document_date`,
`issued_date`,
`received_date`,
@@ -2937,23 +2937,21 @@ VALUES (
INSERT INTO `rfas` (
`id`,
`rfa_type_id`,
`discipline_id`,
`created_at`,
`created_by`,
`deleted_at`
)
VALUES (1, 68, 75, '2025-12-06 05:40:02', 1, NULL);
VALUES (2, 68, '2025-12-06 05:40:02', 1, NULL);
INSERT INTO `rfa_revisions` (
`id`,
`correspondence_id`,
`rfa_id`,
`revision_number`,
`revision_label`,
`is_current`,
`rfa_status_code_id`,
`rfa_approve_code_id`,
`title`,
`subject`,
`document_date`,
`issued_date`,
`received_date`,
@@ -2969,7 +2967,6 @@ VALUES (
1,
2,
1,
1,
'A',
0,
2,
@@ -3223,3 +3220,4 @@ VALUES (
NOW(),
NOW()
);

View File

@@ -1,8 +1,8 @@
-- ==========================================================
-- DMS v1.5.1 - Permissions Seed Data (REORGANIZED)
-- DMS v1.6.0 - Permissions Seed Data (REORGANIZED)
-- File: specs/07-database/permissions-seed-data.sql
-- Total Permissions: 85 (Reorganized with systematic ID allocation)
-- Created: 2025-12-08
-- Created: 2025-12-13
-- ==========================================================
-- Clear existing data
TRUNCATE TABLE role_permissions;