251225:1703 On going update to 1.7.0: Refoctory drawing Module not finish
This commit is contained in:
@@ -796,7 +796,7 @@ CREATE TABLE shop_drawing_sub_categories (
|
||||
CREATE TABLE shop_drawings (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
||||
project_id INT NOT NULL COMMENT 'โครงการ',
|
||||
drawing_number VARCHAR(100) NOT NULL UNIQUE COMMENT 'เลขที่ Shop Drawing',
|
||||
drawing_number VARCHAR(100) NOT NULL COMMENT 'เลขที่ Shop Drawing',
|
||||
main_category_id INT NOT NULL COMMENT 'หมวดหมู่หลัก',
|
||||
sub_category_id INT NOT NULL COMMENT 'หมวดหมู่ย่อย',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้าง',
|
||||
@@ -805,7 +805,8 @@ CREATE TABLE shop_drawings (
|
||||
updated_by INT COMMENT 'ผู้แก้ไขล่าสุด',
|
||||
FOREIGN KEY (project_id) REFERENCES projects (id),
|
||||
FOREIGN KEY (main_category_id) REFERENCES shop_drawing_main_categories (id),
|
||||
FOREIGN KEY (sub_category_id) REFERENCES shop_drawing_sub_categories (id)
|
||||
FOREIGN KEY (sub_category_id) REFERENCES shop_drawing_sub_categories (id),
|
||||
UNIQUE KEY ux_shop_dwg_no_project (project_id, drawing_number)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง Master เก็บข้อมูล "แบบก่อสร้าง"';
|
||||
|
||||
-- ตาราง "ลูก" เก็บประวัติ (Revisions) ของ shop_drawings (1:N)
|
||||
@@ -814,14 +815,22 @@ CREATE TABLE shop_drawing_revisions (
|
||||
shop_drawing_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 NULL COMMENT '(TRUE = Revision ปัจจุบัน, NULL = ไม่ใช่ปัจจุบัน)',
|
||||
revision_date DATE COMMENT 'วันที่ของ Revision',
|
||||
title VARCHAR(500) NOT NULL COMMENT 'ชื่อแบบ',
|
||||
description TEXT COMMENT 'คำอธิบายการแก้ไข',
|
||||
legacy_drawing_number VARCHAR(100) NULL COMMENT 'เลขที่เดิมของ Shop Drawing',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้าง',
|
||||
created_by INT COMMENT 'ผู้สร้าง',
|
||||
updated_by INT COMMENT 'ผู้แก้ไขล่าสุด',
|
||||
FOREIGN KEY (shop_drawing_id) REFERENCES shop_drawings (id) ON DELETE CASCADE,
|
||||
UNIQUE KEY ux_sd_rev_drawing_revision (shop_drawing_id, revision_number)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "ลูก" เก็บประวัติ (Revisions) ของ shop_drawings (1 :N)';
|
||||
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 ux_sd_rev_drawing_revision (shop_drawing_id, revision_number),
|
||||
UNIQUE KEY uq_sd_current (shop_drawing_id, is_current)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "ลูก" เก็บประวัติ (Revisions) ของ shop_drawings (1:N)';
|
||||
|
||||
-- ตารางเชื่อมระหว่าง shop_drawing_revisions กับ contract_drawings (M:N)
|
||||
CREATE TABLE shop_drawing_revision_contract_refs (
|
||||
@@ -839,7 +848,7 @@ CREATE TABLE shop_drawing_revision_contract_refs (
|
||||
CREATE TABLE asbuilt_drawings (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของตาราง',
|
||||
project_id INT NOT NULL COMMENT 'โครงการ',
|
||||
drawing_number VARCHAR(100) NOT NULL UNIQUE COMMENT 'เลขที่ AS Built Drawing',
|
||||
drawing_number VARCHAR(100) NOT NULL COMMENT 'เลขที่ AS Built Drawing',
|
||||
main_category_id INT NOT NULL COMMENT 'หมวดหมู่หลัก',
|
||||
sub_category_id INT NOT NULL COMMENT 'หมวดหมู่ย่อย',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้าง',
|
||||
@@ -848,25 +857,34 @@ CREATE TABLE asbuilt_drawings (
|
||||
updated_by INT COMMENT 'ผู้แก้ไขล่าสุด',
|
||||
FOREIGN KEY (project_id) REFERENCES projects (id),
|
||||
FOREIGN KEY (main_category_id) REFERENCES shop_drawing_main_categories (id),
|
||||
FOREIGN KEY (sub_category_id) REFERENCES shop_drawing_sub_categories (id)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง Master เก็บข้อมูล "แบบก่อสร้าง"';
|
||||
FOREIGN KEY (sub_category_id) REFERENCES shop_drawing_sub_categories (id),
|
||||
UNIQUE KEY ux_asbuilt_no_project (project_id, drawing_number)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง Master เก็บข้อมูล "แบบ AS Built"';
|
||||
|
||||
-- ตาราง "ลูก" เก็บประวัติ (Revisions) ของ shop_drawings (1:N)
|
||||
-- ตาราง "ลูก" เก็บประวัติ (Revisions) ของ AS Built (1:N)
|
||||
CREATE TABLE asbuilt_drawing_revisions (
|
||||
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'ID ของ Revision',
|
||||
asbuilt_drawing_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 NULL COMMENT '(TRUE = Revision ปัจจุบัน, NULL = ไม่ใช่ปัจจุบัน)',
|
||||
revision_date DATE COMMENT 'วันที่ของ Revision',
|
||||
title VARCHAR(500) NOT NULL COMMENT 'ชื่อแบบ',
|
||||
description TEXT COMMENT 'คำอธิบายการแก้ไข',
|
||||
legacy_drawing_number VARCHAR(100) NULL COMMENT 'เลขที่เดิมของ AS Built Drawing',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'วันที่สร้าง',
|
||||
created_by INT COMMENT 'ผู้สร้าง',
|
||||
updated_by INT COMMENT 'ผู้แก้ไขล่าสุด',
|
||||
FOREIGN KEY (asbuilt_drawing_id) REFERENCES asbuilt_drawings (id) ON DELETE CASCADE,
|
||||
UNIQUE KEY ux_sd_rev_drawing_revision (asbuilt_drawing_id, revision_number)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "ลูก" เก็บประวัติ (Revisions) ของ asbuilt_drawings (1 :N)';
|
||||
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 ux_asbuilt_rev_drawing_revision (asbuilt_drawing_id, revision_number),
|
||||
UNIQUE KEY uq_asbuilt_current (asbuilt_drawing_id, is_current)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตาราง "ลูก" เก็บประวัติ (Revisions) ของ asbuilt_drawings (1:N)';
|
||||
|
||||
-- ตารางเชื่อมระหว่าง asbuilt_drawing_revisions กับ shop_drawings (M:N)
|
||||
-- ตารางเชื่อมระหว่าง asbuilt_drawing_revisions กับ shop_drawing_revisions (M:N)
|
||||
CREATE TABLE asbuilt_revision_shop_revisions_refs (
|
||||
asbuilt_drawing_revision_id INT COMMENT 'ID ของ AS Built Drawing Revision',
|
||||
shop_drawing_revision_id INT COMMENT 'ID ของ Shop Drawing Revision',
|
||||
@@ -878,6 +896,58 @@ CREATE TABLE asbuilt_revision_shop_revisions_refs (
|
||||
FOREIGN KEY (shop_drawing_revision_id) REFERENCES shop_drawing_revisions (id) ON DELETE CASCADE
|
||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเชื่อมระหว่าง asbuilt_drawing_revisions กับ shop_drawing_revisions (M :N)';
|
||||
|
||||
-- =====================================================
|
||||
-- View: Shop Drawing พร้อม Current Revision
|
||||
-- =====================================================
|
||||
CREATE OR REPLACE VIEW vw_shop_drawing_current AS
|
||||
SELECT sd.id,
|
||||
sd.project_id,
|
||||
sd.drawing_number,
|
||||
sd.main_category_id,
|
||||
sd.sub_category_id,
|
||||
sd.created_at,
|
||||
sd.updated_at,
|
||||
sd.deleted_at,
|
||||
sd.updated_by,
|
||||
sdr.id AS revision_id,
|
||||
sdr.revision_number,
|
||||
sdr.revision_label,
|
||||
sdr.revision_date,
|
||||
sdr.title AS revision_title,
|
||||
sdr.description AS revision_description,
|
||||
sdr.legacy_drawing_number,
|
||||
sdr.created_by AS revision_created_by,
|
||||
sdr.updated_by AS revision_updated_by
|
||||
FROM shop_drawings sd
|
||||
LEFT JOIN shop_drawing_revisions sdr ON sd.id = sdr.shop_drawing_id
|
||||
AND sdr.is_current = TRUE;
|
||||
|
||||
-- =====================================================
|
||||
-- View: As Built Drawing พร้อม Current Revision
|
||||
-- =====================================================
|
||||
CREATE OR REPLACE VIEW vw_asbuilt_drawing_current AS
|
||||
SELECT ad.id,
|
||||
ad.project_id,
|
||||
ad.drawing_number,
|
||||
ad.main_category_id,
|
||||
ad.sub_category_id,
|
||||
ad.created_at,
|
||||
ad.updated_at,
|
||||
ad.deleted_at,
|
||||
ad.updated_by,
|
||||
adr.id AS revision_id,
|
||||
adr.revision_number,
|
||||
adr.revision_label,
|
||||
adr.revision_date,
|
||||
adr.title AS revision_title,
|
||||
adr.description AS revision_description,
|
||||
adr.legacy_drawing_number,
|
||||
adr.created_by AS revision_created_by,
|
||||
adr.updated_by AS revision_updated_by
|
||||
FROM asbuilt_drawings ad
|
||||
LEFT JOIN asbuilt_drawing_revisions adr ON ad.id = adr.asbuilt_drawing_id
|
||||
AND adr.is_current = TRUE;
|
||||
|
||||
-- =====================================================
|
||||
-- 6. 🔄 Circulations (ใบเวียนภายใน)
|
||||
-- =====================================================
|
||||
@@ -1978,7 +2048,9 @@ CREATE INDEX idx_correspondences_project_type ON correspondences (project_id, co
|
||||
CREATE INDEX idx_corr_revisions_status_current ON correspondence_revisions (correspondence_status_id, is_current);
|
||||
|
||||
CREATE INDEX IDX_AUDIT_DOC_ID ON document_number_audit (document_id);
|
||||
CREATE INDEX IDX_AUDIT_STATUS ON document_number_audit (status);
|
||||
|
||||
CREATE INDEX IDX_AUDIT_STATUS ON document_number_audit (STATUS);
|
||||
|
||||
CREATE INDEX IDX_AUDIT_OPERATION ON document_number_audit (operation);
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
@@ -202,7 +202,7 @@ INSERT INTO users (
|
||||
VALUES (
|
||||
1,
|
||||
'superadmin',
|
||||
'$2b$10$E6d5k.f46jr.POGWKHhiQ.X1ZsFrMpZox//sCxeOiLUULGuAHO0NW',
|
||||
'$2b$10$MpKnf1UEvlu8hZcqMkhMsuWG3gYD/priWTUr71GpF/uuroaGxtose',
|
||||
'Super',
|
||||
'Admin',
|
||||
'superadmin @example.com',
|
||||
@@ -212,7 +212,7 @@ VALUES (
|
||||
(
|
||||
2,
|
||||
'admin',
|
||||
'$2b$10$E6d5k.f46jr.POGWKHhiQ.X1ZsFrMpZox//sCxeOiLUULGuAHO0NW',
|
||||
'$2b$10$MpKnf1UEvlu8hZcqMkhMsuWG3gYD/priWTUr71GpF/uuroaGxtose',
|
||||
'Admin',
|
||||
'คคง.',
|
||||
'admin@example.com',
|
||||
@@ -222,7 +222,7 @@ VALUES (
|
||||
(
|
||||
3,
|
||||
'editor01',
|
||||
'$2b$10$E6d5k.f46jr.POGWKHhiQ.X1ZsFrMpZox//sCxeOiLUULGuAHO0NW',
|
||||
'$2b$10$MpKnf1UEvlu8hZcqMkhMsuWG3gYD/priWTUr71GpF/uuroaGxtose',
|
||||
'DC',
|
||||
'C1',
|
||||
'editor01 @example.com',
|
||||
@@ -232,7 +232,7 @@ VALUES (
|
||||
(
|
||||
4,
|
||||
'viewer01',
|
||||
'$2b$10$E6d5k.f46jr.POGWKHhiQ.X1ZsFrMpZox//sCxeOiLUULGuAHO0NW',
|
||||
'$2b$10$MpKnf1UEvlu8hZcqMkhMsuWG3gYD/priWTUr71GpF/uuroaGxtose',
|
||||
'Viewer',
|
||||
'สคฉ.03',
|
||||
'viewer01 @example.com',
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,10 +7,10 @@
|
||||
## กำหนดสิทธิ
|
||||
|
||||
```bash
|
||||
chown -R 999:999 /share/Container/mariadb/init
|
||||
chmod 755 /share/Container/mariadb/init
|
||||
setfacl -R -m u:999:r-x /share/Container/mariadb/init
|
||||
setfacl -R -d -m u:999:r-x /share/Container/mariadb/init
|
||||
chown -R 999:999 /share/nap-dms/mariadb/init
|
||||
chmod 755 /share/nap-dms/mariadb/init
|
||||
setfacl -R -m u:999:r-x /share/nap-dms/mariadb/init
|
||||
setfacl -R -d -m u:999:r-x /share/nap-dms/mariadb/init
|
||||
|
||||
chown -R 33:33 /share/Container/pma/tmp
|
||||
chmod 755 /share/Container/pma/tmp
|
||||
@@ -86,9 +86,9 @@ services:
|
||||
ports:
|
||||
- "3306:3306"
|
||||
volumes:
|
||||
- "/share/Container/mariadb/data:/var/lib/mysql"
|
||||
- "/share/Container/mariadb/my.cnf:/etc/mysql/conf.d/my.cnf:ro"
|
||||
- "/share/Container/mariadb/init:/docker-entrypoint-initdb.d:ro"
|
||||
- "/share/nap-dms/mariadb/data:/var/lib/mysql"
|
||||
- "/share/nap-dms/mariadb/my.cnf:/etc/mysql/conf.d/my.cnf:ro"
|
||||
- "/share/nap-dms/mariadb/init:/docker-entrypoint-initdb.d:ro"
|
||||
- "/share/dms-data/mariadb/backup:/backup"
|
||||
healthcheck:
|
||||
test:
|
||||
|
||||
110
specs/08-infrastructure/lcbp3-db.md
Normal file
110
specs/08-infrastructure/lcbp3-db.md
Normal file
@@ -0,0 +1,110 @@
|
||||
# File: mariadb/docker-compose-db.yml
|
||||
# DMS Container v1_7_0 Servive: mariadb, pma
|
||||
x-restart: &restart_policy
|
||||
restart: unless-stopped
|
||||
|
||||
x-logging: &default_logging
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "5"
|
||||
|
||||
services:
|
||||
mariadb:
|
||||
<<: [*restart_policy, *default_logging]
|
||||
image: mariadb:11.8
|
||||
container_name: mariadb
|
||||
stdin_open: true
|
||||
tty: true
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: "2.0"
|
||||
memory: 4G
|
||||
reservations:
|
||||
cpus: "0.5"
|
||||
memory: 1G
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: "Center#2025"
|
||||
MYSQL_DATABASE: "lcbp3"
|
||||
MYSQL_USER: "center"
|
||||
MYSQL_PASSWORD: "Center#2025"
|
||||
TZ: "Asia/Bangkok"
|
||||
ports:
|
||||
- "3306:3306"
|
||||
volumes:
|
||||
- "/share/nap-dms/mariadb/data:/var/lib/mysql"
|
||||
- "/share/nap-dms/mariadb/my.cnf:/etc/mysql/conf.d/my.cnf:ro"
|
||||
- "/share/nap-dms/mariadb/init:/docker-entrypoint-initdb.d:ro"
|
||||
- "/share/dms-data/mariadb/backup:/backup"
|
||||
healthcheck:
|
||||
test:
|
||||
["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -pCenter#2025 || exit 1"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 15
|
||||
networks:
|
||||
lcbp3: {}
|
||||
|
||||
pma:
|
||||
<<: [*restart_policy, *default_logging]
|
||||
image: phpmyadmin:5-apache
|
||||
container_name: pma
|
||||
stdin_open: true
|
||||
tty: true
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: "0.25"
|
||||
memory: 256M
|
||||
environment:
|
||||
TZ: "Asia/Bangkok"
|
||||
PMA_HOST: "mariadb"
|
||||
PMA_PORT: "3306"
|
||||
PMA_ABSOLUTE_URI: "https://pma.np-dms.work/"
|
||||
UPLOAD_LIMIT: "1G"
|
||||
MEMORY_LIMIT: "512M"
|
||||
ports:
|
||||
- "89:80"
|
||||
# expose:
|
||||
# - "80"
|
||||
volumes:
|
||||
- "/share/Container/pma/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php:ro"
|
||||
- "/share/Container/pma/zzz-custom.ini:/usr/local/etc/php/conf.d/zzz-custom.ini:ro"
|
||||
- "/share/Container/pma/tmp:/var/lib/phpmyadmin/tmp:rw"
|
||||
- "/share/dms-data/logs/pma:/var/log/apache2"
|
||||
depends_on:
|
||||
mariadb:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
lcbp3: {}
|
||||
|
||||
networks:
|
||||
lcbp3:
|
||||
external: true
|
||||
|
||||
# chown -R 999:999 /share/nap-dms/mariadb/init
|
||||
# chmod 755 /share/nap-dms/mariadb/init
|
||||
# setfacl -R -m u:999:r-x /share/nap-dms/mariadb/init
|
||||
# setfacl -R -d -m u:999:r-x /share/nap-dms/mariadb/init
|
||||
|
||||
# chown -R 33:33 /share/Container/pma/tmp
|
||||
# chmod 755 /share/Container/pma/tmp
|
||||
# setfacl -R -m u:33:rwx /share/Container/pma/tmp
|
||||
# setfacl -R -d -m u:33:rwx /share/Container/pma/tmp
|
||||
|
||||
# chown -R 33:33 /share/dms-data/logs/pma
|
||||
# chmod 755 /share/dms-data/logs/pma
|
||||
# setfacl -R -m u:33:rwx /share/dms-data/logs/pma
|
||||
# setfacl -R -d -m u:33:rwx /share/dms-data/logs/pma
|
||||
|
||||
# setfacl -R -m u:1000:rwx /share/Container/gitea
|
||||
# setfacl -R -m u:1000:rwx /share/dms-data/gitea_repos
|
||||
# setfacl -R -m u:1000:rwx /share/dms-data/gitea_registry
|
||||
|
||||
# docker exec -it mariadb mysql -u root -p
|
||||
# CREATE DATABASE npm;
|
||||
# CREATE USER 'npm'@'%' IDENTIFIED BY 'npm';
|
||||
# GRANT ALL PRIVILEGES ON npm.* TO 'npm'@'%';
|
||||
# FLUSH PRIVILEGES;
|
||||
71
specs/09-history/2025-12-24-document-numbering-fixes.md
Normal file
71
specs/09-history/2025-12-24-document-numbering-fixes.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# Session History: 2025-12-24 - Document Numbering Fixes
|
||||
|
||||
## Overview
|
||||
- **Date:** 2025-12-24
|
||||
- **Duration:** ~2 hours
|
||||
- **Focus:** Document Numbering System - Bug Fixes & Improvements
|
||||
|
||||
---
|
||||
|
||||
## Changes Made
|
||||
|
||||
### 1. Year Token Format (4-digit)
|
||||
**Files:**
|
||||
- `backend/src/modules/document-numbering/services/format.service.ts`
|
||||
|
||||
**Changes:**
|
||||
```typescript
|
||||
// Before
|
||||
'{YEAR}': year.toString().substring(2), // "25"
|
||||
'{YEAR:BE}': (year + 543).toString().substring(2), // "68"
|
||||
|
||||
// After
|
||||
'{YEAR}': year.toString(), // "2025"
|
||||
'{YEAR:BE}': (year + 543).toString(), // "2568"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. TypeScript Field Name Fixes
|
||||
**Files:**
|
||||
- `backend/src/modules/document-numbering/dto/preview-number.dto.ts`
|
||||
- `backend/src/modules/document-numbering/controllers/document-numbering.controller.ts`
|
||||
- `frontend/lib/api/numbering.ts`
|
||||
- `frontend/components/numbering/template-tester.tsx`
|
||||
|
||||
**Changes:**
|
||||
- `originatorId` → `originatorOrganizationId`
|
||||
- `typeId` → `correspondenceTypeId`
|
||||
|
||||
---
|
||||
|
||||
### 3. Generate Test Number Bug Fix
|
||||
**Root Cause:**
|
||||
1. API client ใช้ NextAuth `getSession()` แต่ token อยู่ใน Zustand localStorage (`auth-storage`)
|
||||
2. Response wrapper mismatch: backend ส่ง `{ data: {...} }` แต่ frontend อ่าน `res.data` โดยตรง
|
||||
|
||||
**Files:**
|
||||
- `frontend/lib/api/client.ts` - ดึง token จาก `localStorage['auth-storage']`
|
||||
- `frontend/lib/api/numbering.ts` - แก้ response unwrapping: `res.data.data || res.data`
|
||||
|
||||
---
|
||||
|
||||
### 4. Documentation
|
||||
**Files Created/Updated:**
|
||||
- `docs/document-numbering-summary.md` - Comprehensive system summary
|
||||
|
||||
---
|
||||
|
||||
## Verification Results
|
||||
|
||||
| Test | Result |
|
||||
| -------------------- | --------- |
|
||||
| Backend Build | ✅ Pass |
|
||||
| Frontend Build | ✅ Pass |
|
||||
| Generate Test Number | ✅ Working |
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
- Template ต้องใช้ `{YEAR:BE}` เพื่อแสดงปี พ.ศ. (ไม่ใช่ `{YEAR}`)
|
||||
- สามารถแก้ไข Template ผ่าน Admin > Numbering > Edit Template
|
||||
@@ -0,0 +1,100 @@
|
||||
# Drawing Module Frontend/Backend Implementation
|
||||
|
||||
**วันที่:** 25 ธันวาคม 2568 (2025-12-25)
|
||||
**Session:** Drawing Dashboard & Admin Panel UX/UI Implementation
|
||||
|
||||
---
|
||||
|
||||
## 🎯 วัตถุประสงค์
|
||||
|
||||
1. Update Backend entities และ Frontend types ตาม v1.7.0 schema (Drawing Revision)
|
||||
2. สร้าง Admin Panel สำหรับจัดการ Drawing Master Data
|
||||
3. สร้าง Backend APIs สำหรับ CRUD operations
|
||||
|
||||
---
|
||||
|
||||
## ✅ สิ่งที่ทำเสร็จ
|
||||
|
||||
### 1. Backend Entity Updates (Drawing Revision Schema)
|
||||
|
||||
| File | Changes |
|
||||
| ------------------------------------ | --------------------------------------------------------- |
|
||||
| `shop-drawing-revision.entity.ts` | เพิ่ม `isCurrent`, `createdBy`, `updatedBy`, User relations |
|
||||
| `asbuilt-drawing-revision.entity.ts` | เพิ่ม `isCurrent`, `createdBy`, `updatedBy`, User relations |
|
||||
|
||||
### 2. Frontend Type Updates
|
||||
|
||||
| File | Changes |
|
||||
| --------------------------- | ------------------------------------------------------------------------- |
|
||||
| `frontend/types/drawing.ts` | `DrawingRevision` - เพิ่ม `createdBy`, `updatedBy`, update `isCurrent` type |
|
||||
|
||||
### 3. Admin Panel Frontend (6 pages)
|
||||
|
||||
| Route | Description |
|
||||
| ----------------------------------------- | ------------------ |
|
||||
| `/admin/drawings` | Navigation hub |
|
||||
| `/admin/drawings/contract/volumes` | Volume CRUD |
|
||||
| `/admin/drawings/contract/categories` | Category CRUD |
|
||||
| `/admin/drawings/contract/sub-categories` | Sub-category CRUD |
|
||||
| `/admin/drawings/shop/main-categories` | Main Category CRUD |
|
||||
| `/admin/drawings/shop/sub-categories` | Sub-category CRUD |
|
||||
|
||||
**Service:** `frontend/lib/services/drawing-master-data.service.ts`
|
||||
|
||||
### 4. Backend APIs (Full CRUD)
|
||||
|
||||
**Controller:** `backend/src/modules/drawing/drawing-master-data.controller.ts`
|
||||
**Service:** `backend/src/modules/drawing/drawing-master-data.service.ts`
|
||||
|
||||
| Endpoint | Methods |
|
||||
| --------------------------------------------------- | ------------------------ |
|
||||
| `/api/drawings/master-data/contract/volumes` | GET, POST, PATCH, DELETE |
|
||||
| `/api/drawings/master-data/contract/categories` | GET, POST, PATCH, DELETE |
|
||||
| `/api/drawings/master-data/contract/sub-categories` | GET, POST, PATCH, DELETE |
|
||||
| `/api/drawings/master-data/shop/main-categories` | GET, POST, PATCH, DELETE |
|
||||
| `/api/drawings/master-data/shop/sub-categories` | GET, POST, PATCH, DELETE |
|
||||
|
||||
### 5. Admin Dashboard Update
|
||||
|
||||
เพิ่ม "Drawing Master Data" link ใน Admin Dashboard (`frontend/app/(admin)/admin/page.tsx`)
|
||||
|
||||
---
|
||||
|
||||
## 📁 ไฟล์ที่แก้ไข/สร้างใหม่
|
||||
|
||||
### Backend
|
||||
- `backend/src/modules/drawing/entities/shop-drawing-revision.entity.ts` - Modified
|
||||
- `backend/src/modules/drawing/entities/asbuilt-drawing-revision.entity.ts` - Modified
|
||||
- `backend/src/modules/drawing/drawing-master-data.controller.ts` - Rewritten
|
||||
- `backend/src/modules/drawing/drawing-master-data.service.ts` - Rewritten
|
||||
|
||||
### Frontend
|
||||
- `frontend/types/drawing.ts` - Modified
|
||||
- `frontend/lib/services/drawing-master-data.service.ts` - **NEW**
|
||||
- `frontend/app/(admin)/admin/drawings/page.tsx` - **NEW**
|
||||
- `frontend/app/(admin)/admin/drawings/contract/volumes/page.tsx` - **NEW**
|
||||
- `frontend/app/(admin)/admin/drawings/contract/categories/page.tsx` - **NEW**
|
||||
- `frontend/app/(admin)/admin/drawings/contract/sub-categories/page.tsx` - **NEW**
|
||||
- `frontend/app/(admin)/admin/drawings/shop/main-categories/page.tsx` - **NEW**
|
||||
- `frontend/app/(admin)/admin/drawings/shop/sub-categories/page.tsx` - **NEW**
|
||||
- `frontend/app/(admin)/admin/page.tsx` - Modified
|
||||
|
||||
### Specs
|
||||
- `specs/09-history/2025-12-25-drawing-revision-schema-update.md` - Updated (marked complete)
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Build Status
|
||||
|
||||
| Component | Status |
|
||||
| --------- | -------- |
|
||||
| Backend | ✅ Passed |
|
||||
| Frontend | ✅ Passed |
|
||||
|
||||
---
|
||||
|
||||
## 📋 TODO (Phase 2+)
|
||||
|
||||
- [ ] Dashboard Drawing UX Enhancements (filters)
|
||||
- [ ] Contract Drawing: Category-SubCategory mapping UI
|
||||
- [ ] Shop Drawing: MainCategory-SubCategory linking
|
||||
80
specs/09-history/2025-12-25-drawing-module-refactor.md
Normal file
80
specs/09-history/2025-12-25-drawing-module-refactor.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# Session History: Drawing Module Refactor v1.7.0
|
||||
|
||||
**Date:** 2025-12-25
|
||||
**Session ID:** cdbb2d6b-1fab-459e-8ec9-e864bd30b308
|
||||
|
||||
---
|
||||
|
||||
## Objective
|
||||
Refactor Drawing module (backend & frontend) to align with `lcbp3-v1.7.0-schema.sql`, specifically for AS Built Drawings.
|
||||
|
||||
---
|
||||
|
||||
## Changes Made
|
||||
|
||||
### Backend
|
||||
|
||||
#### Entities Updated
|
||||
| File | Changes |
|
||||
| ------------------------------------ | --------------------------------------------------- |
|
||||
| `asbuilt-drawing.entity.ts` | Added `mainCategoryId`, `subCategoryId` + relations |
|
||||
| `asbuilt-drawing-revision.entity.ts` | Added `legacyDrawingNumber` |
|
||||
|
||||
#### New Files Created
|
||||
| File | Description |
|
||||
| -------------------------------------------- | ----------------------------------- |
|
||||
| `dto/create-asbuilt-drawing.dto.ts` | Create AS Built with first revision |
|
||||
| `dto/create-asbuilt-drawing-revision.dto.ts` | Add revision to existing AS Built |
|
||||
| `dto/search-asbuilt-drawing.dto.ts` | Search with pagination |
|
||||
| `asbuilt-drawing.service.ts` | CRUD service |
|
||||
| `asbuilt-drawing.controller.ts` | REST controller |
|
||||
|
||||
#### Module Updated
|
||||
- `drawing.module.ts` - Registered new entities, service, controller
|
||||
|
||||
#### New API Endpoints
|
||||
| Method | Path | Description |
|
||||
| ------ | --------------------------------- | ------------ |
|
||||
| POST | `/drawings/asbuilt` | Create |
|
||||
| POST | `/drawings/asbuilt/:id/revisions` | Add revision |
|
||||
| GET | `/drawings/asbuilt` | List |
|
||||
| GET | `/drawings/asbuilt/:id` | Get by ID |
|
||||
| DELETE | `/drawings/asbuilt/:id` | Delete |
|
||||
|
||||
---
|
||||
|
||||
### Frontend
|
||||
|
||||
#### Types Updated
|
||||
| File | Changes |
|
||||
| ------------------------------------------ | ------------------------------------------------------------------- |
|
||||
| `types/drawing.ts` | `AsBuiltDrawing` interface: added `mainCategoryId`, `subCategoryId` |
|
||||
| `types/dto/drawing/asbuilt-drawing.dto.ts` | Added category IDs |
|
||||
|
||||
#### Components Updated
|
||||
| File | Changes |
|
||||
| ------------------------------------- | ------------------------------------------------------- |
|
||||
| `components/drawings/upload-form.tsx` | AS_BUILT form: added category selectors, title required |
|
||||
| `components/drawings/list.tsx` | `projectId` now required prop |
|
||||
| `app/(dashboard)/drawings/page.tsx` | Added project selector dropdown |
|
||||
|
||||
#### Hooks Updated
|
||||
| File | Changes |
|
||||
| ---------------------- | -------------------------------- |
|
||||
| `hooks/use-drawing.ts` | Fixed toast message for AS_BUILT |
|
||||
|
||||
---
|
||||
|
||||
## Verification Results
|
||||
|
||||
| Component | Command | Result |
|
||||
| --------- | ------------ | --------- |
|
||||
| Backend | `pnpm build` | ✅ Success |
|
||||
| Frontend | `pnpm build` | ✅ Success |
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
- AS Built Drawings use same category structure as Shop Drawings (`shop_drawing_main_categories`, `shop_drawing_sub_categories`)
|
||||
- No existing data in `asbuilt_drawings` table, no migration needed
|
||||
- Pre-existing lint warnings (`any` types) in `upload-form.tsx` not addressed in this session
|
||||
@@ -0,0 +1,94 @@
|
||||
# Drawing Revision Schema Update
|
||||
|
||||
**วันที่:** 25 ธันวาคม 2568 (2025-12-25)
|
||||
**Session:** Drawing Revision Schema Consistency Update
|
||||
|
||||
---
|
||||
|
||||
## 🎯 วัตถุประสงค์
|
||||
|
||||
ปรับปรุง schema ของตาราง Drawing (Shop Drawing และ As Built Drawing) ให้สอดคล้องกับ pattern ของตาราง revision อื่นๆ ในระบบ (เช่น `correspondence_revisions`, `rfa_revisions`)
|
||||
|
||||
---
|
||||
|
||||
## 📝 การเปลี่ยนแปลง
|
||||
|
||||
### 1. Schema Updates (`lcbp3-v1.7.0-schema.sql`)
|
||||
|
||||
#### 1.1 เพิ่ม Columns ใน `shop_drawing_revisions`
|
||||
```sql
|
||||
is_current BOOLEAN DEFAULT NULL COMMENT '(TRUE = Revision ปัจจุบัน, NULL = ไม่ใช่ปัจจุบัน)'
|
||||
created_by INT COMMENT 'ผู้สร้าง'
|
||||
updated_by INT COMMENT 'ผู้แก้ไขล่าสุด'
|
||||
```
|
||||
- เพิ่ม Foreign Keys สำหรับ `created_by` และ `updated_by` ไปยัง `users` table
|
||||
- เพิ่ม `UNIQUE KEY uq_sd_current (shop_drawing_id, is_current)` เพื่อ enforce ว่ามี `is_current = TRUE` ได้แค่ 1 row ต่อ drawing
|
||||
|
||||
#### 1.2 เพิ่ม Columns ใน `asbuilt_drawing_revisions`
|
||||
- เหมือนกับ `shop_drawing_revisions`
|
||||
|
||||
#### 1.3 เปลี่ยน Unique Constraint ของ `drawing_number`
|
||||
- **เดิม:** `UNIQUE (drawing_number)` - Global uniqueness
|
||||
- **ใหม่:** `UNIQUE (project_id, drawing_number)` - Project-scoped uniqueness
|
||||
|
||||
### 2. Views เพิ่มใหม่
|
||||
|
||||
```sql
|
||||
-- View สำหรับ Shop Drawing พร้อม Current Revision
|
||||
CREATE OR REPLACE VIEW vw_shop_drawing_current AS ...
|
||||
|
||||
-- View สำหรับ As Built Drawing พร้อม Current Revision
|
||||
CREATE OR REPLACE VIEW vw_asbuilt_drawing_current AS ...
|
||||
```
|
||||
|
||||
**ประโยชน์:**
|
||||
- Query ง่ายขึ้นโดยไม่ต้อง JOIN ทุกครั้ง
|
||||
- ตัวอย่าง: `SELECT * FROM vw_shop_drawing_current WHERE project_id = 3`
|
||||
|
||||
### 3. Seed Data Updates (`lcbp3-v1.7.0-seed-shopdrawing.sql`)
|
||||
|
||||
เพิ่ม UPDATE statement ท้ายไฟล์เพื่อ set `is_current = TRUE` สำหรับ revision ล่าสุดของแต่ละ drawing:
|
||||
|
||||
```sql
|
||||
UPDATE shop_drawing_revisions sdr
|
||||
JOIN (
|
||||
SELECT shop_drawing_id, MAX(revision_number) AS max_rev
|
||||
FROM shop_drawing_revisions
|
||||
GROUP BY shop_drawing_id
|
||||
) latest ON sdr.shop_drawing_id = latest.shop_drawing_id
|
||||
AND sdr.revision_number = latest.max_rev
|
||||
SET sdr.is_current = TRUE;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 เหตุผลทางเทคนิค
|
||||
|
||||
### ทำไมใช้ `DEFAULT NULL` แทน `DEFAULT FALSE`?
|
||||
|
||||
MariaDB/MySQL ไม่อนุญาตให้มี duplicate values ใน UNIQUE constraint รวมถึง `FALSE` หลายตัว:
|
||||
|
||||
| `is_current` | ความหมาย | อนุญาตหลายแถว? |
|
||||
| ------------ | -------------- | ----------------------------- |
|
||||
| `TRUE` | Revision ปัจจุบัน | ❌ ไม่ได้ (UNIQUE) |
|
||||
| `NULL` | Revision เก่า | ✅ ได้ (NULL ignored in UNIQUE) |
|
||||
| `FALSE` | Revision เก่า | ❌ ไม่ได้ (จะซ้ำกัน) |
|
||||
|
||||
---
|
||||
|
||||
## 📁 ไฟล์ที่แก้ไข
|
||||
|
||||
| ไฟล์ | การเปลี่ยนแปลง |
|
||||
| ----------------------------------------------------- | ------------------------------------ |
|
||||
| `specs/07-database/lcbp3-v1.7.0-schema.sql` | เพิ่ม columns, views, และ constraints |
|
||||
| `specs/07-database/lcbp3-v1.7.0-seed-shopdrawing.sql` | เพิ่ม UPDATE statement สำหรับ is_current |
|
||||
|
||||
---
|
||||
|
||||
## ✅ สถานะ
|
||||
|
||||
- [x] Schema updated
|
||||
- [x] Seed data updated
|
||||
- [x] Views created
|
||||
- [x] Backend entities/DTOs update
|
||||
- [x] Frontend types update
|
||||
Reference in New Issue
Block a user