251213:1509 Docunment Number Businee Rule not correct
This commit is contained in:
+7
-6
@@ -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 (องค์กร, โครงการ, สัญญา)**
|
||||
|
||||
+146
-164
@@ -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'
|
||||
+4
-6
@@ -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()
|
||||
);
|
||||
|
||||
+2
-2
@@ -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;
|
||||
Reference in New Issue
Block a user