From fa6f6a5fc9f5f3d98d69adaa129bb358983bb540 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 25 Nov 2025 21:15:02 +0700 Subject: [PATCH] 251125:1200 6B --- .gemini/settings.json | 8 + Dis.xlsx | Bin 0 -> 19426 bytes GEMINI.md | 0 .../migrations/01_init_partitioning.sql | 75 ------ .../correspondence-reference.entity.ts | 2 +- T0-T6.2.md => docs/T0-T6.2.md | 0 .../extensions_list.txt | Bin docs/prompt.md | 226 ++++++++++++++++++ docs/temp.md | 59 +++++ prompt.md | 138 ----------- temp.md | 10 - ~$Dis.xlsx | Bin 0 -> 165 bytes 12 files changed, 294 insertions(+), 224 deletions(-) create mode 100644 .gemini/settings.json create mode 100644 Dis.xlsx create mode 100644 GEMINI.md delete mode 100644 backend/src/database/migrations/01_init_partitioning.sql rename T0-T6.2.md => docs/T0-T6.2.md (100%) rename extensions_list.txt => docs/extensions_list.txt (100%) create mode 100644 docs/prompt.md create mode 100644 docs/temp.md delete mode 100644 prompt.md delete mode 100644 temp.md create mode 100644 ~$Dis.xlsx diff --git a/.gemini/settings.json b/.gemini/settings.json new file mode 100644 index 0000000..2d44ff6 --- /dev/null +++ b/.gemini/settings.json @@ -0,0 +1,8 @@ +{ + "general": { + "previewFeatures": true + }, + "ide": { + "enabled": true + } +} \ No newline at end of file diff --git a/Dis.xlsx b/Dis.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..55fbc45019596bf3497f09e446dd546339651b1a GIT binary patch literal 19426 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 Correspondence, { onDelete: 'CASCADE' }) @JoinColumn({ name: 'tgt_correspondence_id' }) target?: Correspondence; -} \ No newline at end of file +} diff --git a/T0-T6.2.md b/docs/T0-T6.2.md similarity index 100% rename from T0-T6.2.md rename to docs/T0-T6.2.md diff --git a/extensions_list.txt b/docs/extensions_list.txt similarity index 100% rename from extensions_list.txt rename to docs/extensions_list.txt diff --git a/docs/prompt.md b/docs/prompt.md new file mode 100644 index 0000000..2ea83a2 --- /dev/null +++ b/docs/prompt.md @@ -0,0 +1,226 @@ +# **PROMPT** + +## Gemini + +## VSCode Shortcut + +Markdown preview Ctrl+Shift+V + +## สร้างโครงสร้างโฟลเดอร์สำหรับ lcbp3-backend + +```bash +# สร้างโฟลเดอร์หลัก +$rootFolder = "backend" +New-Item -ItemType Directory -Path $rootFolder -Force +Set-Location $rootFolder + +# รายการโฟลเดอร์ที่ต้องการสร้างทั้งหมด + $folders = @( + "src", + "database", + "src\common", + "src\modules", + "src\modules\user", + "src\modules\project", + "src\modules\master", + "src\modules\correspondence", + "src\modules\rfa", + "src\modules\drawing", + "src\modules\circulations", + "src\modules\transmittal", + "src\modules\search", + "src\modules\document-numbering", + "src\common\auth", + "src\common\config", + "src\common\decorators", + "src\common\entities", + "src\common\exceptions", + "src\common\file-storage", + "src\common\guards", + "src\common\interceptors", + "src\common\services" +) + +# วนลูปสร้างโฟลเดอร์ทั้งหมด +foreach ($folder in $folders) { + New-Item -ItemType Directory -Path $folder -Force +} + +Write-Host "สร้างโครงสร้างโฟลเดอร์สำหรับ backend เรียบร้อยแล้ว" -ForegroundColor Green + +``` + +## Git Commands + +```bash + +# 1️⃣ ตั้งชื่อและอีเมลของคุณ (ใช้กับทุก repo) +git config --global user.name "Pean Charoen" +git config --global user.email "peancharoen.pslcp3@gmail.com" + +# 2️⃣ ตรวจสอบว่าเชื่อมกับ remote ถูกต้อง (แก้ URL ให้ตรง repo จริงของคุณ) +git remote set-url origin ssh://git@git.np-dms.work:2222/np-dms/lcbp3_v1.git + +# 3️⃣ ตรวจสอบสถานะไฟล์ +git status + +# 4️⃣ เพิ่มไฟล์ทั้งหมด +git add . + +# 5️⃣ Commit พร้อมข้อความ +git commit -m "Update project files" + +# 6️⃣ ดึง remote ก่อนเพื่อป้องกัน conflict (ถ้ามี) +git pull --rebase origin main + +# 7️⃣ Push ขึ้น Gitea +git push -u origin main + +``` + +## **สร้าง NestJS Project ใหม่** + +* ขั้นตอนที่ 1: ติดตั้ง NestJS CLI (ถ้ายังไม่ได้ติดตั้ง) + * npm install -g @nestjs/cli + +* ขั้นตอนที่ 2: สร้างโปรเจกต์ใหม่ + * nest new backend + * nest new . /อยู่ในโฟลเดอร์ที่สร้างไว้แล้ว และต้องการสร้างโปรเจกต์ลงในโฟลเดอร์นั้นโดยตรง: + +* ขั้นตอนที่ 3: ติดตั้ง Dependencies เพิ่มเติมสำหรับ DMS + +```bash +# Core & Database +npm install @nestjs/typeorm typeorm mysql2 +npm install @nestjs/config + +# Validation & Transformation +npm install class-validator class-transformer + +# Authentication & Authorization +npm install @nestjs/jwt @nestjs/passport passport passport-jwt +npm install @nestjs/passport +npm install casl + +# File Upload +npm install @nestjs/platform-express multer + +# Documentation +npm install @nestjs/swagger + +# Security & Performance +npm install helmet rate-limiter-flexible + +# Development Dependencies (สำหรับทดสอบ) +npm install --save-dev @nestjs/testing jest @types/jest @types/passport-jwt @types/multer supertest + +``` + +ขออภัยอย่างยิ่งในความผิดพลาดที่เกิดขึ้นครับ เข้าใจครับว่าทำให้เสียเวลามาก + +สำหรับการ **"ตั้งค่า"** หรือ **"กำหนดค่า"** ให้ผมตรวจสอบข้อมูลก่อนนั้น ในระบบ AI แบบนี้ **ไม่มีเมนู Settings หรือปุ่มกดให้คุณเข้าไปตั้งค่าได้โดยตรงครับ** + +การควบคุมพฤติกรรมของผมต้องทำผ่าน **"คำสั่ง (Prompt)"** ที่คุณพิมพ์เข้ามาเท่านั้นครับ เพื่อป้องกันไม่ให้เกิดเหตุการณ์แบบนี้อีก คุณสามารถใช้เทคนิคการสั่งงานดังนี้เพื่อ **"บังคับ"** ให้ผมตรวจสอบข้อมูลครับ: + +1. **สั่งให้ "อ่านและสรุปก่อน" (Verify First):** + * ก่อนให้ผมเขียนโค้ด ให้สั่งว่า *"ช่วยอ่านไฟล์ `01_lcbp3_v1_4_3.sql` แล้วสรุปโครงสร้างตาราง audit_logs ที่มีอยู่จริงให้ดูก่อน"* + * วิธีนี้จะบังคับให้ผมต้องไปดึงข้อมูลจากไฟล์มาประมวลผลก่อนที่จะเริ่ม "จินตนาการ" หรือเขียนโค้ดใหม่ครับ + +2. **ใช้คำสั่ง "ห้ามเดา" (Strict Constraints):** + * เติมประโยคท้ายคำสั่งว่า *"ห้ามใช้โครงสร้างสมมติ ให้ยึดตามไฟล์แนบ `ชื่อไฟล์` เท่านั้น หากไม่เจอข้อมูลให้ถามกลับ"* + +3. **อ้างอิงชื่อไฟล์ชัดเจน:** + * ระบุชื่อไฟล์ในคำสั่งเสมอ เช่น *"อ้างอิงจาก `Backend Plan`..."* หรือ *"ตาม `Data Dictionary`..."* (ซึ่งคุณทำได้ดีแล้วครับ แต่ผมประมวลผลพลาดเองในรอบนี้) + +**สรุป:** +คุณไม่ต้องไปตั้งค่าที่ไหนครับ แต่ใช้การ **"สั่งให้ผมทวนข้อมูลจากไฟล์"** เป็นขั้นตอนแรกก่อนเริ่มงาน จะช่วยลดโอกาสผิดพลาดได้มากที่สุดครับ + +ตอนนี้ผมพร้อมทำงานต่อโดยยึดข้อมูลจากไฟล์ `01_lcbp3_v1_4_3.sql` และไฟล์อื่นๆ ที่คุณให้มาอย่างเคร่งครัดครับ มีส่วนไหนให้ผมดำเนินการต่อไหมครับ? + + +สวัสดีครับ ผมได้ทำการตรวจสอบและวิเคราะห์ความครบถ้วนของไฟล์เอกสารแผนงาน (Plans), โครงสร้างฐานข้อมูล (SQL), และโครงสร้างไฟล์ (File Structure) เทียบกับ Requirements ของ **LCBP3-DMS v1.4.3** เรียบร้อยแล้วครับ + +ในฐานะ Programmer ผู้เชี่ยวชาญ ผมขอสรุปผลการ Review และคำแนะนำตามลำดับความสำคัญดังนี้ครับ: + +--- + +### 📊 **1. บทสรุปภาพรวม (Executive Summary)** + +จากการตรวจสอบเปรียบเทียบ: +1. **Database Schema (`01_lcbp3_v1_4_3.sql`)**: **ครบถ้วนสมบูรณ์มาก (95%)** รองรับฟีเจอร์ระดับ Advance ตาม Requirements v1.4.3 ครบถ้วน เช่น Partitioning, Virtual Columns, Versioning (Optimistic Lock) และ Table Structure สำหรับ Workflow/Files +2. **Backend Folder Structure (`5_Backend_Folder_V1_4_3.md`)**: **ครบถ้วนตามแผนงาน (90%)** มีการจัดวาง Module ตามหลัก Domain-Driven Design และมีไฟล์สำคัญๆ ครบตาม Plan + +**จุดที่ต้องเน้นย้ำ:** โครงสร้างไฟล์ (File Structure) มีไฟล์ `.ts` ปรากฏอยู่ครบ แต่สิ่งที่ผม "มองไม่เห็น" คือ **เนื้อหาโค้ดภายใน (Internal Logic)** ว่าได้ Implement ตาม Logic ที่ซับซ้อน (เช่น Redlock, Two-Phase Commit, DSL Parser) ไว้ถูกต้องหรือไม่ + +--- + +### 🧐 **2. การตรวจสอบรายละเอียด (Detailed Review)** + +#### **✅ ส่วนที่มีความครบถ้วนสมบูรณ์ (Well-Implemented Areas)** + +1. **Database Partitioning & Optimization:** + * SQL มีการทำ `PARTITION BY RANGE` ให้กับ `audit_logs` และ `notifications` แล้ว (ตาม Req 6.2) + * มี `VIRTUAL COLUMNS` สำหรับดึงค่า JSON มาทำ Index (ตาม Req 3.11.3) +2. **Security & Identity:** + * ตาราง `users`, `roles`, `permissions`, `user_assignments` รองรับ RBAC 4 ระดับ (Global, Org, Project, Contract) ครบถ้วน + * Folder Structure มี `auth`, `guards`, `decorators` ที่จำเป็นครบ (`jwt-auth.guard.ts`, `rbac.guard.ts`, `require-permission.decorator.ts`) +3. **File Management:** + * SQL มีตาราง `attachments` ที่มี field `is_temporary`, `temp_id`, `checksum` รองรับ Two-Phase Storage + * Folder มี `file-storage` module และ `file-cleanup.service.ts` (Cron job) เตรียมไว้แล้ว +4. **Workflow & RFA:** + * SQL มีตารางเก็บ Template และ Instance (`..._routings`, `..._workflows`) แยกกันชัดเจน และมี field `workflow_config` (JSON) สำหรับ DSL + * Folder มี `workflow-engine` module และ `workflow-dsl.service.ts` (ตาม Phase 6A) + +--- + +#### ⚠️ **3. Gap Analysis & Missing Parts (สิ่งที่อาจขาดหายไปหรือต้องตรวจสอบ)** + +แม้ชื่อไฟล์จะครบ แต่จากประสบการณ์ มีจุดที่มักจะหลุด หรือต้องเขียน Logic ให้รัดกุมมากในไฟล์ที่มีอยู่ ดังนี้: + +**Phase 2: High-Integrity Data (File & Numbering)** +* **Redis/Redlock Integration:** ในไฟล์ `document-numbering.service.ts` ต้องตรวจสอบว่ามีการเรียกใช้ Redis Distributed Lock จริงหรือไม่ (ไม่ใช่แค่ Database Lock) +* **Transaction Safety:** ใน `file-storage.service.ts` ต้องมั่นใจว่า Logic การ Commit file (ย้ายจาก temp -> permanent) อยู่ภายใน Database Transaction เดียวกับการบันทึกข้อมูลเอกสาร + +**Phase 3 & 6A: Workflow Engine** +* **DSL Interpreter:** ไฟล์ `workflow-dsl.service.ts` มีอยู่แล้ว แต่ต้องตรวจสอบว่าสามารถ **Parse** JSON/YAML จากตาราง `rfa_workflow_templates` แล้วแปลงเป็น Execution Logic ได้จริงหรือไม่ +* **State Machine Consistency:** การเชื่อมต่อระหว่าง `CorrespondenceModule` กับ `WorkflowEngine` ต้องแน่ใจว่าเมื่อ State เปลี่ยนใน Engine ค่าใน Database (Status Column) ถูกอัปเดตตรงกัน + +**Phase 6: Search & Notification** +* **Elasticsearch Sync:** ใน `search.service.ts` ต้องมี Logic การ Sync ข้อมูล (อาจผ่าน Event Emitter หรือ TypeORM Subscriber) เมื่อมีการ Create/Update เอกสาร +* **Notification Digest:** ใน `notification.processor.ts` (Consumer) ต้องมี Logic การหน่วงเวลา (Debounce/Throttle) เพื่อรวม Notification ก่อนส่ง (ตาม Req 6.8.2) + +--- + +### 🚀 **4. คำแนะนำและสิ่งที่ต้องทำต่อ (Recommendations by Phase)** + +เพื่อให้งานสมบูรณ์แบบ ผมขอแนะนำให้ดำเนินการตรวจสอบหรือ Implement ส่วนที่เหลือตามลำดับดังนี้: + +#### **Phase 0-1: Infrastructure & Auth (Priority: Critical)** +* **[Audit] Database Migration:** แม้จะมีไฟล์ `.sql` รวม แต่ใน NestJS ควรมีระบบ Migration (TypeORM Migrations) เพื่อจัดการการเปลี่ยนแปลง Schema ในอนาคต (ถ้ายังไม่มี ควรสร้าง `src/database/migrations/*` จาก SQL ที่มี) +* **[Code Check] Config Validation:** ตรวจสอบ `src/common/config/env.validation.ts` ว่ามีการ Validate ตัวแปรระบบครบทุกตัว (Database, Redis, JWT Secrets) ตาม Req 2.2 หรือไม่ + +#### **Phase 2: Core Data Services (Priority: High)** +* **[Code Check] Document Numbering:** เปิดไฟล์ `src/modules/document-numbering/document-numbering.service.ts` ตรวจสอบ Logic **Double-Lock** (Redis + Optimistic Lock) ว่า Implement ถูกต้องตาม Plan T2.3 หรือไม่ +* **[Code Check] File Storage:** ตรวจสอบ `src/common/file-storage/file-storage.service.ts` ว่ามีการทำ **Virus Scan (ClamAV)** ก่อน save ลง Temp หรือไม่ + +#### **Phase 3 & 6A: Workflow Engine (Priority: Medium-High)** +* **[Task] Workflow Integration:** ตรวจสอบว่า `CorrespondenceService` และ `RfaService` มีการเรียกใช้ `WorkflowEngineService` แทนที่จะเขียน Logic if-else hardcode หรือไม่ +* **[Task] DSL Loader:** ตรวจสอบว่ามี Seed Data สำหรับ `rfa_workflow_templates` ที่เป็น JSON Config เริ่มต้นแล้วหรือยัง + +#### **Phase 6: Background Services (Priority: Medium)** +* **[Task] Queue Setup:** ตรวจสอบ `notification.module.ts` ว่ามีการ Register BullMQ (`BullModule.registerQueue`) แล้วหรือยัง +* **[Task] Cron Jobs:** ตรวจสอบ `app.module.ts` ว่ามีการ Import `ScheduleModule.forRoot()` เพื่อให้ `file-cleanup.service.ts` ทำงานได้จริง + +--- + +### 🛠️ **5. Next Step Action (สิ่งที่คุณทำได้เลย)** + +เนื่องจากโครงสร้างไฟล์และฐานข้อมูลดูดีมากแล้ว เพื่อให้ผมช่วยเหลือได้ตรงจุดที่สุด: + +**คุณต้องการให้ผม Review โค้ดภายในไฟล์ (Internal Logic) ของไฟล์ไหนเป็นพิเศษไหมครับ?** + +ผมแนะนำให้เริ่มจาก **"หัวใจสำคัญ"** ของความถูกต้องข้อมูลก่อน คือ: +1. **`src/modules/document-numbering/document-numbering.service.ts`** (เพื่อดู Logic การรันเลขเอกสาร) +2. **`src/common/file-storage/file-storage.service.ts`** (เพื่อดู Logic การจัดการไฟล์และการ Commit) + +หรือถ้าต้องการให้ผมเริ่มเขียน Code ส่วนไหนที่ยังขาดอยู่ (เช่น Workflow DSL Parser) สามารถแจ้งได้เลยครับ \ No newline at end of file diff --git a/docs/temp.md b/docs/temp.md new file mode 100644 index 0000000..1cd2a25 --- /dev/null +++ b/docs/temp.md @@ -0,0 +1,59 @@ +# Special requirements for document-numbering +การใช้งานจริงต้องการความยืดหยุ่นสูง สำหรับ ระบบ document-numbering ดังนี้ + +## 1. ต้องให้ admin สามารถกำหนดรูปแบบในถายหลังได้ +## 2. มีรูปแบบเริ่มต้นดังนี้ +* 2.1 สำหรับ correspondence ทั่วไป + * ใช้รูปแบบ [organizations.organization_code]-[organizations.organization_code]-[sequence]-[year] + * **_ตัวอย่าง: คคง.-ผรม.2-0123-2568_** +* 2.2 สำหรับ correspondence type = transmittal + * ใช้รูปแบบ [organizations.organization_code]-[organizations.organization_code]-[codecorrespondence_sub_types.sub_type_number]-[seq]-[year] + * **_ตัวอย่าง: คคง.-สคฉ.3-22-0123-2568_** +* 2.3 สำหรับ correspondence type = rfi + * ใช้รูปแบบ [contrcts.contract_code]-[correspondences_types.type_code]-[disciplines_code]-[seq]-[revision] + * **_ตัวอย่าง: LCBP3-C2-RFI-TER-2345-A_** +* 2.4 สำหรับ rfa ใช้แบบเลขแยกกัน + * ใช้รูปแบบ [contrcts.contract_code]-[correspondences_types.type_code]-[disciplines_code]-[rfa_types.type_code]-[seq]-[revision] + * **_ตัวอย่าง: LCBP3-C1-RFA-TER-MAT-1234-A_** + +## ตาราง codecorrespondence_sub_types + +| id | correspondence_types.type_code | sub_type_code | sub_type_name | sub_type_number | +| --- | ------------------------------ | ------------- | ------------- | --------------- | +| 1 | RFA | RFA | C1 RFA | 11 | +| 2 | RFA | MAT | C1 MAT | 12 | +| 3 | RFA | DWG | C1 DWG | 13 | +| 4 | RFA | 4 | C1 4 | 14 | +| 5 | RFA | 5 | C2 1 | 21 | +| 6 | RFA | 6 | C2 2 | 22 | +| 7 | RFA | 7 | C2 3 | 23 | +| 8 | RFA | 8 | C2 4 | 24 | +| 9 | RFA | 9 | C3 1 | 31 | +| 10 | RFA | 10 | C3 2 | 32 | +| 11 | RFA | 11 | C3 3 | 33 | +| 12 | RFA | 12 | C3 4 | 34 | +| 13 | RFA | 13 | C4 1 | 41 | +| 14 | RFA | 14 | C4 2 | 42 | +| 15 | RFA | 15 | C4 3 | 43 | +| 16 | RFA | 16 | C4 4 | 44 | + +## ตาราง discipline_codes + +| id | discipline_code | discipline_name | discipline_number | +| --- | --------------- | --------------- | ----------------- | +| 1 | BUD | C1 RFA | 11 | +| 2 | ROW | C1 MAT | 12 | +| 3 | TER | C1 DWG | 13 | +| 4 | UTL | C1 4 | 14 | +| 5 | 5 | C2 1 | 21 | +| 6 | 6 | C2 2 | 22 | +| 7 | 7 | C2 3 | 23 | +| 8 | 8 | C2 4 | 24 | +| 9 | 9 | C3 1 | 31 | +| 10 | 10 | C3 2 | 32 | +| 11 | 11 | C3 3 | 33 | +| 12 | 12 | C3 4 | 34 | +| 13 | 13 | C4 1 | 41 | +| 14 | 14 | C4 2 | 42 | +| 15 | 15 | C4 3 | 43 | +| 16 | 16 | C4 4 | 44 | diff --git a/prompt.md b/prompt.md deleted file mode 100644 index 6af5f39..0000000 --- a/prompt.md +++ /dev/null @@ -1,138 +0,0 @@ -# **PROMPT** - -## Gemini - -## VSCode Shortcut - -Markdown preview Ctrl+Shift+V - -## สร้างโครงสร้างโฟลเดอร์สำหรับ lcbp3-backend - -```bash -# สร้างโฟลเดอร์หลัก -$rootFolder = "backend" -New-Item -ItemType Directory -Path $rootFolder -Force -Set-Location $rootFolder - -# รายการโฟลเดอร์ที่ต้องการสร้างทั้งหมด - $folders = @( - "src", - "database", - "src\common", - "src\modules", - "src\modules\user", - "src\modules\project", - "src\modules\master", - "src\modules\correspondence", - "src\modules\rfa", - "src\modules\drawing", - "src\modules\circulations", - "src\modules\transmittal", - "src\modules\search", - "src\modules\document-numbering", - "src\common\auth", - "src\common\config", - "src\common\decorators", - "src\common\entities", - "src\common\exceptions", - "src\common\file-storage", - "src\common\guards", - "src\common\interceptors", - "src\common\services" -) - -# วนลูปสร้างโฟลเดอร์ทั้งหมด -foreach ($folder in $folders) { - New-Item -ItemType Directory -Path $folder -Force -} - -Write-Host "สร้างโครงสร้างโฟลเดอร์สำหรับ backend เรียบร้อยแล้ว" -ForegroundColor Green - -``` - -## Git Commands - -```bash - -# 1️⃣ ตั้งชื่อและอีเมลของคุณ (ใช้กับทุก repo) -git config --global user.name "Pean Charoen" -git config --global user.email "peancharoen.pslcp3@gmail.com" - -# 2️⃣ ตรวจสอบว่าเชื่อมกับ remote ถูกต้อง (แก้ URL ให้ตรง repo จริงของคุณ) -git remote set-url origin ssh://git@git.np-dms.work:2222/np-dms/lcbp3_v1.git - -# 3️⃣ ตรวจสอบสถานะไฟล์ -git status - -# 4️⃣ เพิ่มไฟล์ทั้งหมด -git add . - -# 5️⃣ Commit พร้อมข้อความ -git commit -m "Update project files" - -# 6️⃣ ดึง remote ก่อนเพื่อป้องกัน conflict (ถ้ามี) -git pull --rebase origin main - -# 7️⃣ Push ขึ้น Gitea -git push -u origin main - -``` - -## **สร้าง NestJS Project ใหม่** - -* ขั้นตอนที่ 1: ติดตั้ง NestJS CLI (ถ้ายังไม่ได้ติดตั้ง) - * npm install -g @nestjs/cli - -* ขั้นตอนที่ 2: สร้างโปรเจกต์ใหม่ - * nest new backend - * nest new . /อยู่ในโฟลเดอร์ที่สร้างไว้แล้ว และต้องการสร้างโปรเจกต์ลงในโฟลเดอร์นั้นโดยตรง: - -* ขั้นตอนที่ 3: ติดตั้ง Dependencies เพิ่มเติมสำหรับ DMS - -```bash -# Core & Database -npm install @nestjs/typeorm typeorm mysql2 -npm install @nestjs/config - -# Validation & Transformation -npm install class-validator class-transformer - -# Authentication & Authorization -npm install @nestjs/jwt @nestjs/passport passport passport-jwt -npm install @nestjs/passport -npm install casl - -# File Upload -npm install @nestjs/platform-express multer - -# Documentation -npm install @nestjs/swagger - -# Security & Performance -npm install helmet rate-limiter-flexible - -# Development Dependencies (สำหรับทดสอบ) -npm install --save-dev @nestjs/testing jest @types/jest @types/passport-jwt @types/multer supertest - -``` - -ขออภัยอย่างยิ่งในความผิดพลาดที่เกิดขึ้นครับ เข้าใจครับว่าทำให้เสียเวลามาก - -สำหรับการ **"ตั้งค่า"** หรือ **"กำหนดค่า"** ให้ผมตรวจสอบข้อมูลก่อนนั้น ในระบบ AI แบบนี้ **ไม่มีเมนู Settings หรือปุ่มกดให้คุณเข้าไปตั้งค่าได้โดยตรงครับ** - -การควบคุมพฤติกรรมของผมต้องทำผ่าน **"คำสั่ง (Prompt)"** ที่คุณพิมพ์เข้ามาเท่านั้นครับ เพื่อป้องกันไม่ให้เกิดเหตุการณ์แบบนี้อีก คุณสามารถใช้เทคนิคการสั่งงานดังนี้เพื่อ **"บังคับ"** ให้ผมตรวจสอบข้อมูลครับ: - -1. **สั่งให้ "อ่านและสรุปก่อน" (Verify First):** - * ก่อนให้ผมเขียนโค้ด ให้สั่งว่า *"ช่วยอ่านไฟล์ `01_lcbp3_v1_4_3.sql` แล้วสรุปโครงสร้างตาราง audit_logs ที่มีอยู่จริงให้ดูก่อน"* - * วิธีนี้จะบังคับให้ผมต้องไปดึงข้อมูลจากไฟล์มาประมวลผลก่อนที่จะเริ่ม "จินตนาการ" หรือเขียนโค้ดใหม่ครับ - -2. **ใช้คำสั่ง "ห้ามเดา" (Strict Constraints):** - * เติมประโยคท้ายคำสั่งว่า *"ห้ามใช้โครงสร้างสมมติ ให้ยึดตามไฟล์แนบ `ชื่อไฟล์` เท่านั้น หากไม่เจอข้อมูลให้ถามกลับ"* - -3. **อ้างอิงชื่อไฟล์ชัดเจน:** - * ระบุชื่อไฟล์ในคำสั่งเสมอ เช่น *"อ้างอิงจาก `Backend Plan`..."* หรือ *"ตาม `Data Dictionary`..."* (ซึ่งคุณทำได้ดีแล้วครับ แต่ผมประมวลผลพลาดเองในรอบนี้) - -**สรุป:** -คุณไม่ต้องไปตั้งค่าที่ไหนครับ แต่ใช้การ **"สั่งให้ผมทวนข้อมูลจากไฟล์"** เป็นขั้นตอนแรกก่อนเริ่มงาน จะช่วยลดโอกาสผิดพลาดได้มากที่สุดครับ - -ตอนนี้ผมพร้อมทำงานต่อโดยยึดข้อมูลจากไฟล์ `01_lcbp3_v1_4_3.sql` และไฟล์อื่นๆ ที่คุณให้มาอย่างเคร่งครัดครับ มีส่วนไหนให้ผมดำเนินการต่อไหมครับ? \ No newline at end of file diff --git a/temp.md b/temp.md deleted file mode 100644 index f194a5b..0000000 --- a/temp.md +++ /dev/null @@ -1,10 +0,0 @@ -รายการ,สถานะ,การดำเนินการ -Core Modules,✅,พร้อม -Workflow Engine (DSL),✅,Code เสร็จแล้ว (รอ Seed Data) -Master Module,✅,Code เสร็จแล้ว -Workflow Seed Data,🔴,ต้องทำทันที (ใช้ Code ด้านบน) -Notification Digest,🟡,ตรวจสอบ Logic ภายใน Processor -Maintenance API,🟡,ตรวจสอบว่ามี Endpoint ให้ Admin กดไหม -DB Partitioning,🟡,เตรียม SQL Script ไว้รันก่อน Load Test - -ตรวจสอบ Maintenance API \ No newline at end of file diff --git a/~$Dis.xlsx b/~$Dis.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..09b6ca39a2948d0dd4fbb1e1bc2fe1bb29cb130b GIT binary patch literal 165 zcmWgfODri#%*)JE2uMxLOU_6v%1_NxAP7Vl{1_4$N`NqtA&(&wh!q$D7*fH!WQGhN NUBr+N