251203:1700 Prepare to version 1.6

This commit is contained in:
admin
2025-12-03 17:31:40 +07:00
parent 1817158f25
commit 3e6e810620
3 changed files with 73 additions and 70 deletions

View File

@@ -141,10 +141,12 @@ CREATE TABLE organizations (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง', id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
organization_code VARCHAR(20) NOT NULL UNIQUE COMMENT 'รหัสองค์กร', organization_code VARCHAR(20) NOT NULL UNIQUE COMMENT 'รหัสองค์กร',
organization_name VARCHAR(255) NOT NULL COMMENT 'ชื่อองค์กร', organization_name VARCHAR(255) NOT NULL COMMENT 'ชื่อองค์กร',
-- role_id INT COMMENT 'บทบาทขององค์กร', role_id INT COMMENT 'บทบาทขององค์กร',
is_active BOOLEAN DEFAULT TRUE COMMENT 'สถานะการใช้งาน', is_active BOOLEAN DEFAULT TRUE COMMENT 'สถานะการใช้งาน',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้าง', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้าง',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'วันที่แก้ไขล่าสุด' -- FOREIGN KEY (role_id) REFERENCES organization_roles(id) ON DELETE SET NULL updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'วันที่แก้ไขล่าสุด',
FOREIGN KEY (role_id) REFERENCES organization_roles(id) ON DELETE
SET NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง Master เก็บข้อมูลองค์กรทั้งหมดที่เกี่ยวข้องในระบบ'; ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง Master เก็บข้อมูลองค์กรทั้งหมดที่เกี่ยวข้องในระบบ';
-- ตาราง Master เก็บข้อมูลโครงการ -- ตาราง Master เก็บข้อมูลโครงการ
CREATE TABLE projects ( CREATE TABLE projects (
@@ -789,41 +791,38 @@ CREATE TABLE document_number_counters (
rfa_type_id INT DEFAULT 0 COMMENT '[v1.5.1 NEW] ประเภท RFA เช่น SHD, RPT, MAT (0 = ไม่ใช่ RFA)', rfa_type_id INT DEFAULT 0 COMMENT '[v1.5.1 NEW] ประเภท RFA เช่น SHD, RPT, MAT (0 = ไม่ใช่ RFA)',
discipline_id INT DEFAULT 0 COMMENT 'สาขางาน เช่น TER, STR, GEO (0 = ไม่ระบุ)', discipline_id INT DEFAULT 0 COMMENT 'สาขางาน เช่น TER, STR, GEO (0 = ไม่ระบุ)',
current_year INT NOT NULL COMMENT 'ปี ค.ศ. ของตัวนับ (auto-reset ทุกปี)', current_year INT NOT NULL COMMENT 'ปี ค.ศ. ของตัวนับ (auto-reset ทุกปี)',
-- Counter Data -- Counter Data
version INT DEFAULT 0 NOT NULL COMMENT 'Optimistic Lock Version (TypeORM @VersionColumn)', version INT DEFAULT 0 NOT NULL COMMENT 'Optimistic Lock Version (TypeORM @VersionColumn)',
last_number INT DEFAULT 0 COMMENT 'เลขที่ล่าสุดที่ใช้ไปแล้ว (auto-increment)', last_number INT DEFAULT 0 COMMENT 'เลขที่ล่าสุดที่ใช้ไปแล้ว (auto-increment)',
-- [v1.5.1 UPDATE] Primary Key: 5 columns -> 8 columns -- [v1.5.1 UPDATE] Primary Key: 5 columns -> 8 columns
-- ใช้ COALESCE เพื่อรองรับ NULL ใน recipient_organization_id -- ใช้ COALESCE เพื่อรองรับ NULL ใน recipient_organization_id
PRIMARY KEY ( PRIMARY KEY (
project_id, project_id,
originator_organization_id, originator_organization_id,
COALESCE(recipient_organization_id, 0), -- [v1.5.1 NEW] Handle NULL values COALESCE(recipient_organization_id, 0),
-- [v1.5.1 NEW] Handle NULL values
correspondence_type_id, correspondence_type_id,
sub_type_id, -- [v1.5.1 NEW] sub_type_id,
rfa_type_id, -- [v1.5.1 NEW] -- [v1.5.1 NEW]
rfa_type_id,
-- [v1.5.1 NEW]
discipline_id, discipline_id,
current_year current_year
), ),
-- Foreign Keys -- Foreign Keys
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
FOREIGN KEY (originator_organization_id) REFERENCES organizations(id) ON DELETE CASCADE, FOREIGN KEY (originator_organization_id) REFERENCES organizations(id) ON DELETE CASCADE,
FOREIGN KEY (recipient_organization_id) REFERENCES organizations(id) ON DELETE CASCADE, FOREIGN KEY (recipient_organization_id) REFERENCES organizations(id) ON DELETE CASCADE,
FOREIGN KEY (correspondence_type_id) REFERENCES correspondence_types(id) ON DELETE CASCADE, FOREIGN KEY (correspondence_type_id) REFERENCES correspondence_types(id) ON DELETE CASCADE,
-- [v1.5.1 NEW] Performance Indexes -- [v1.5.1 NEW] Performance Indexes
INDEX idx_counter_lookup (project_id, correspondence_type_id, current_year), INDEX idx_counter_lookup (project_id, correspondence_type_id, current_year),
INDEX idx_counter_org (originator_organization_id, current_year), INDEX idx_counter_org (originator_organization_id, current_year),
-- [v1.5.1 NEW] Data Validation Constraints -- [v1.5.1 NEW] Data Validation Constraints
CONSTRAINT chk_last_number_positive CHECK (last_number >= 0), CONSTRAINT chk_last_number_positive CHECK (last_number >= 0),
CONSTRAINT chk_current_year_valid CHECK (current_year BETWEEN 2020 AND 2100) CONSTRAINT chk_current_year_valid CHECK (
current_year BETWEEN 2020 AND 2100
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci )
COMMENT = '[v1.5.1 UPDATE] ตารางเก็บ Running Number Counters - รองรับ 8-column composite PK'; ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '[v1.5.1 UPDATE] ตารางเก็บ Running Number Counters - รองรับ 8-column composite PK';
-- ========================================================== -- ==========================================================
-- [v1.5.1 NEW] ตารางเก็บ Audit Trail สำหรับการสร้างเลขที่เอกสาร -- [v1.5.1 NEW] ตารางเก็บ Audit Trail สำหรับการสร้างเลขที่เอกสาร
-- เพิ่มตาราง: document_number_audit -- เพิ่มตาราง: document_number_audit
@@ -832,39 +831,30 @@ CREATE TABLE document_number_counters (
-- ========================================================== -- ==========================================================
CREATE TABLE document_number_audit ( CREATE TABLE document_number_audit (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 'ID ของ audit record', id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 'ID ของ audit record',
-- Document Info -- Document Info
document_id INT NOT NULL COMMENT 'ID ของเอกสารที่สร้างเลขที่ (correspondences.id)', document_id INT NOT NULL COMMENT 'ID ของเอกสารที่สร้างเลขที่ (correspondences.id)',
generated_number VARCHAR(100) NOT NULL COMMENT 'เลขที่เอกสารที่สร้าง (ผลลัพธ์)', generated_number VARCHAR(100) NOT NULL COMMENT 'เลขที่เอกสารที่สร้าง (ผลลัพธ์)',
counter_key JSON NOT NULL COMMENT 'Counter key ที่ใช้ (JSON format) - 8 fields', counter_key JSON NOT NULL COMMENT 'Counter key ที่ใช้ (JSON format) - 8 fields',
template_used VARCHAR(200) NOT NULL COMMENT 'Template ที่ใช้ในการสร้าง', template_used VARCHAR(200) NOT NULL COMMENT 'Template ที่ใช้ในการสร้าง',
-- User Info -- User Info
user_id INT NOT NULL COMMENT 'ผู้ขอสร้างเลขที่', user_id INT NOT NULL COMMENT 'ผู้ขอสร้างเลขที่',
ip_address VARCHAR(45) COMMENT 'IP address ของผู้ขอ (IPv4/IPv6)', ip_address VARCHAR(45) COMMENT 'IP address ของผู้ขอ (IPv4/IPv6)',
user_agent TEXT COMMENT 'User agent string (browser info)', user_agent TEXT COMMENT 'User agent string (browser info)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่/เวลาที่สร้าง', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่/เวลาที่สร้าง',
-- Performance & Error Tracking -- Performance & Error Tracking
retry_count INT DEFAULT 0 COMMENT 'จำนวนครั้งที่ retry ก่อนสำเร็จ', retry_count INT DEFAULT 0 COMMENT 'จำนวนครั้งที่ retry ก่อนสำเร็จ',
lock_wait_ms INT COMMENT 'เวลารอ Redis lock (milliseconds)', lock_wait_ms INT COMMENT 'เวลารอ Redis lock (milliseconds)',
total_duration_ms INT COMMENT 'เวลารวมทั้งหมดในการสร้าง (milliseconds)', total_duration_ms INT COMMENT 'เวลารวมทั้งหมดในการสร้าง (milliseconds)',
fallback_used ENUM('NONE', 'DB_LOCK', 'RETRY') DEFAULT 'NONE' fallback_used ENUM('NONE', 'DB_LOCK', 'RETRY') DEFAULT 'NONE' COMMENT 'Fallback strategy ที่ถูกใช้ (NONE=normal, DB_LOCK=Redis down, RETRY=conflict)',
COMMENT 'Fallback strategy ที่ถูกใช้ (NONE=normal, DB_LOCK=Redis down, RETRY=conflict)',
-- Indexes for performance -- Indexes for performance
INDEX idx_document_id (document_id), INDEX idx_document_id (document_id),
INDEX idx_user_id (user_id), INDEX idx_user_id (user_id),
INDEX idx_created_at (created_at), INDEX idx_created_at (created_at),
INDEX idx_generated_number (generated_number), INDEX idx_generated_number (generated_number),
-- Foreign Keys -- Foreign Keys
FOREIGN KEY (document_id) REFERENCES correspondences(id) ON DELETE CASCADE, FOREIGN KEY (document_id) REFERENCES correspondences(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(user_id) FOREIGN KEY (user_id) REFERENCES users(user_id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '[v1.5.1 NEW] Audit Trail สำหรับการสร้างเลขที่เอกสาร - เก็บ ≥ 7 ปี';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
COMMENT='[v1.5.1 NEW] Audit Trail สำหรับการสร้างเลขที่เอกสาร - เก็บ ≥ 7 ปี';
-- ========================================================== -- ==========================================================
-- [v1.5.1 NEW] ตารางเก็บ Error Logs สำหรับ Document Numbering -- [v1.5.1 NEW] ตารางเก็บ Error Logs สำหรับ Document Numbering
-- เพิ่มตาราง: document_number_errors -- เพิ่มตาราง: document_number_errors
@@ -873,38 +863,34 @@ CREATE TABLE document_number_audit (
-- ========================================================== -- ==========================================================
CREATE TABLE document_number_errors ( CREATE TABLE document_number_errors (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 'ID ของ error record', id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 'ID ของ error record',
-- Error Classification -- Error Classification
error_type ENUM( error_type ENUM(
'LOCK_TIMEOUT', -- Redis lock timeout 'LOCK_TIMEOUT',
'VERSION_CONFLICT', -- Optimistic lock version mismatch -- Redis lock timeout
'DB_ERROR', -- Database connection/query error 'VERSION_CONFLICT',
'REDIS_ERROR', -- Redis connection error -- Optimistic lock version mismatch
'DB_ERROR',
-- Database connection/query error
'REDIS_ERROR',
-- Redis connection error
'VALIDATION_ERROR' -- Template/input validation error 'VALIDATION_ERROR' -- Template/input validation error
) NOT NULL COMMENT 'ประเภท error (5 types)', ) NOT NULL COMMENT 'ประเภท error (5 types)',
-- Error Details -- Error Details
error_message TEXT COMMENT 'ข้อความ error (stack top)', error_message TEXT COMMENT 'ข้อความ error (stack top)',
stack_trace TEXT COMMENT 'Stack trace แบบเต็ม (สำหรับ debugging)', stack_trace TEXT COMMENT 'Stack trace แบบเต็ม (สำหรับ debugging)',
context_data JSON COMMENT 'Context ของ request (user, project, counter_key, etc.)', context_data JSON COMMENT 'Context ของ request (user, project, counter_key, etc.)',
-- User Info -- User Info
user_id INT COMMENT 'ผู้ที่เกิด error', user_id INT COMMENT 'ผู้ที่เกิด error',
ip_address VARCHAR(45) COMMENT 'IP address', ip_address VARCHAR(45) COMMENT 'IP address',
-- Timestamps -- Timestamps
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่เกิด error', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่เกิด error',
resolved_at TIMESTAMP NULL COMMENT 'วันที่แก้ไขแล้ว (NULL = ยังไม่แก้)', resolved_at TIMESTAMP NULL COMMENT 'วันที่แก้ไขแล้ว (NULL = ยังไม่แก้)',
-- Indexes for troubleshooting -- Indexes for troubleshooting
INDEX idx_error_type (error_type), INDEX idx_error_type (error_type),
INDEX idx_created_at (created_at), INDEX idx_created_at (created_at),
INDEX idx_user_id (user_id), INDEX idx_user_id (user_id),
INDEX idx_unresolved (resolved_at) -- Find unresolved errors INDEX idx_unresolved (resolved_at) -- Find unresolved errors
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '[v1.5.1 NEW] Error Log สำหรับ Document Numbering System';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
COMMENT='[v1.5.1 NEW] Error Log สำหรับ Document Numbering System';
-- ===================================================== -- =====================================================
-- 10. ⚙️ System & Logs (ระบบและ Log) -- 10. ⚙️ System & Logs (ระบบและ Log)
-- ===================================================== -- =====================================================

View File

@@ -1,23 +1,32 @@
INSERT INTO organizations (id, organization_code, organization_name) INSERT INTO organization_roles (id, role_name)
VALUES VALUES
( 1, 'กทท.' , 'การท่าเรือแห่งประเทศไทย'), ( 1, 'OWNER' ),
( 10, 'สคฉ.3' , 'โครงการพัฒนาท่าเรือแหลมฉบัง ระยะที่ 3' ), ( 2, 'DESIGNER' ),
( 11, 'สคฉ.3-01' , 'ตรวจรับพัสดุ ที่ปรึกษาควบคุมงาน'), ( 3, 'CONSULTANT' ),
( 12, 'สคฉ.3-02' , 'ตรวจรับพัสดุ งานทางทะเล'), ( 4, 'CONTRACTOR' ),
( 13, 'สคฉ.3-03' , 'ตรวจรับพัสดุ อาคารและระบบสาธารณูปโภค'), ( 5, 'THIRD PARTY' ),
( 14, 'สคฉ.3-04' , 'ตรวจรับพัสดุ ตรวจสอบผลกระทบสิ่งแวดล้อม'), ( 6, 'GUEST' );
( 15, 'สคฉ.3-05' , 'ตรวจรับพัสดุ เยียวยาการประมง'),
( 16, 'สคฉ.3-06' , 'ตรวจรับพัสดุ งานก่อสร้าง ส่วนที่ 3'), INSERT INTO organizations (id, organization_code, organization_name, role_id)
( 17, 'สคฉ.3-07' , 'ตรวจรับพัสดุ งานก่อสร้าง ส่วนที่ 4'), VALUES
( 18, 'สคฉ.3-xx' , 'ตรวจรับพัสดุ ที่ปรึกษาออกแบบ ส่วนที่ 4'), ( 1, 'กทท.' , 'การท่าเรือแห่งประเทศไทย', 1),
( 21, 'TEAM' , 'Designer Consulting Ltd.'), ( 10, 'สคฉ.3' , 'โครงการพัฒนาท่าเรือแหลมฉบัง ระยะที่ 3', 1),
( 22, 'คคง.' , 'Construction Supervision Ltd.'), ( 11, 'สคฉ.3-01' , 'ตรวจรับพัสดุ ที่ปรึกษาควบคุมงาน', 1),
( 41, 'ผรม.1' , 'Contractor งานทางทะเล'), ( 12, 'สคฉ.3-02' , 'ตรวจรับพัสดุ งานทางทะเล', 1),
( 42, 'ผรม.2' , 'Contractor อาคารและระบบ'), ( 13, 'สคฉ.3-03' , 'ตรวจรับพัสดุ อาคารและระบบสาธารณูปโภค', 1),
( 43, 'ผรม.3' , 'Contractor #3 Ltd.'), ( 14, 'สคฉ.3-04' , 'ตรวจรับพัสดุ ตรวจสอบผลกระทบสิ่งแวดล้อม', 1),
( 44, 'ผรม.4' , 'Contractor #4 Ltd.'), ( 15, 'สคฉ.3-05' , 'ตรวจรับพัสดุ เยียวยาการประมง', 1),
( 31, 'EN' , 'Third Party Environment'), ( 16, 'สคฉ.3-06' , 'ตรวจรับพัสดุ งานก่อสร้าง ส่วนที่ 3', 1),
( 32, 'CAR' , 'Third Party Fishery Care'); ( 17, 'สคฉ.3-07' , 'ตรวจรับพัสดุ งานก่อสร้าง ส่วนที่ 4', 1),
( 18, 'สคฉ.3-xx' , 'ตรวจรับพัสดุ ที่ปรึกษาออกแบบ ส่วนที่ 4', 1),
( 21, 'TEAM' , 'Designer Consulting Ltd.', 2),
( 22, 'คคง.' , 'Construction Supervision Ltd.', 3),
( 41, 'ผรม.1' , 'Contractor งานทางทะเล', 4),
( 42, 'ผรม.2' , 'Contractor อาคารและระบบ', 4),
( 43, 'ผรม.3' , 'Contractor #3 Ltd.', 4),
( 44, 'ผรม.4' , 'Contractor #4 Ltd.', 4),
( 31, 'EN' , 'Third Party Environment', 5),
( 32, 'CAR' , 'Third Party Fishery Care', 5);
-- Seed project -- Seed project
INSERT INTO projects (project_code, project_name) INSERT INTO projects (project_code, project_name)
VALUES VALUES

View File

@@ -81,16 +81,17 @@
"language": "sql", "language": "sql",
"params": { "params": {
"keywordCase": "upper", // ทำให้ INSERT, VALUES เป็นตัวใหญ่ "keywordCase": "upper", // ทำให้ INSERT, VALUES เป็นตัวใหญ่
"tabWidth": 2, // เยื้อง 3 ช่องว่าง (ปรับจาก 4 เป็น 3 เพื่อ match ตัวอย่าง)
"expressionWidth": 80, // ความยาวสูงสุดต่อบรรทัดก่อนตีบรรทัดใหม่ (ป้องกันคอลัมน์แยกบรรทัด)
"reservedWordCase": "upper", // ทำให้คำสงวนเป็นตัวใหญ่ "reservedWordCase": "upper", // ทำให้คำสงวนเป็นตัวใหญ่
"linesBetweenQueries": 1, "tabWidth": 2, // เยื้อง 2 ช่องว่าง
"expressionWidth": 100, // ความยาวสูงสุดต่อบรรทัดก่อนตีบรรทัดใหม่ (ป้องกันคอลัมน์แยกบรรทัด)
"logicalOperatorNewline": "before", "logicalOperatorNewline": "before",
"aliasAs": "before", "aliasAs": "before",
"commaPosition": "after", "commaPosition": "after",
"linesBetweenQueries": 1,
"linesAroundComments": 0, "linesAroundComments": 0,
"tabulateAlias": false, "tabulateAlias": false,
"newlineBeforeSemicolon": false "newlineBeforeSemicolon": false,
"newlineBeforeOnClauseItems": false
} }
}, },
"sqltools.formatOnSave": true, "sqltools.formatOnSave": true,
@@ -655,18 +656,25 @@
"debug.openDebug": "openOnDebugBreak", "debug.openDebug": "openOnDebugBreak",
"debug.showBreakpointsInOverviewRuler": true, "debug.showBreakpointsInOverviewRuler": true,
"prettier.configPath": "./.prettierrc", "prettier.configPath": "./.prettierrc",
"terminal.integrated.copyOnSelection": true,
"terminal.integrated.tabs.defaultColor": "terminal.ansiBlue",
"sqltools.connections": [ "sqltools.connections": [
{ {
"name": "MariaDB", "mysqlOptions": {
"authProtocol": "default",
"enableSsl": "Disabled"
},
"ssh": "Disabled",
"previewLimit": 50,
"server": "localhost", "server": "localhost",
"port": 3306, "port": 3306,
"user": "root", "driver": "MySQL",
"password": "", "name": "lcbp3_dev",
"database": "lcbp3" "database": "lcbp3_dev",
"username": "root",
"password": "Center#2025"
} }
], ]
"terminal.integrated.copyOnSelection": true,
"terminal.integrated.tabs.defaultColor": "terminal.ansiBlue"
}, },
// ======================================== // ========================================