[CLAUDE] Workflow: Mig 22 schema mới ApprovalWorkflowsV2 (Chunk A)
Session 17 — schema riêng UAT trước khi drop legacy WorkflowDefinition.
Cấu trúc 3 bảng theo yêu cầu user:
Quy trình (Code+Name+ApplicableType)
Bước (Phòng A — DepartmentId hint)
Cấp (NV X — ApproverUserId 1 user cụ thể, KHÔNG OR-of-many)
Khác Mig 21: Levels match 1 NV CHÍNH XÁC qua ApproverUserId, không
match group Dept+PositionLevel/Role/User. Service sau UAT iterate
Steps OrderBy Order → Levels OrderBy Order → ApproverUserId duyệt.
Files:
- Domain/ApprovalWorkflowsV2/ApprovalWorkflow.cs (3 entity + enum
ApplicableType: DuyetNcc/DuyetNccPhuongAn/Contract)
- Infra/Persistence/Configurations/ApprovalWorkflowConfiguration.cs
(FK Cascade Step→Workflow, Level→Step; Restrict Department + User)
- Infra/Persistence/ApplicationDbContext.cs (3 DbSet)
- Infra/Persistence/DbInitializer.cs (2 menu mới: ApprovalWorkflowsV2
root dưới System icon Workflow + AwV2_DuyetNcc leaf icon FileCheck)
- Domain/Identity/MenuKeys.cs (2 const + All array)
- Migration 20260508053749_AddApprovalWorkflowsV2 (3 table CREATE +
2 UNIQUE + 3 index)
Verify:
- Build OK, 77 test pass (54 Domain + 23 Infra) ~3s
- Mig applied cả _Design + _Dev LocalDB
Next chunks:
- B: Application CQRS (Get/Create) + ApprovalWorkflowsV2Controller
- C: FE Designer page /system/approval-workflows-v2/:typeCode
- D: Docs + STATUS update
This commit is contained in:
@ -0,0 +1,63 @@
|
||||
using SolutionErp.Domain.Common;
|
||||
|
||||
namespace SolutionErp.Domain.ApprovalWorkflowsV2;
|
||||
|
||||
// Quy trình duyệt mới (Mig 22 — Session 17, 2026-05-08).
|
||||
// Schema riêng để UAT, KHÔNG đụng WorkflowDefinition cũ (Mig 21 flat). Sau UAT
|
||||
// OK → migrate data PE/HĐ pin sang ApprovalWorkflowId + drop bảng cũ.
|
||||
//
|
||||
// Cấu trúc:
|
||||
// Quy trình (Code + Name + ApplicableType)
|
||||
// Bước 1 - Phòng A (DepartmentId optional hint)
|
||||
// Cấp 1 - NV X (ApproverUserId specific)
|
||||
// Cấp 2 - NV Y
|
||||
// Bước 2 - Phòng B
|
||||
// Cấp 1 - NV Z
|
||||
// ...
|
||||
//
|
||||
// Service (sau khi UAT chốt): iterate Steps OrderBy Order. Mỗi step iterate
|
||||
// Levels OrderBy Order. Mỗi level = 1 NV cụ thể duyệt. Hết level → next step.
|
||||
// Hết step → DaDuyet.
|
||||
public class ApprovalWorkflow : BaseEntity
|
||||
{
|
||||
public string Code { get; set; } = string.Empty; // Mã quy trình "QT-DN-V2-001"
|
||||
public int Version { get; set; } // monotonically increases per Code
|
||||
public ApprovalWorkflowApplicableType ApplicableType { get; set; } // module áp dụng
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string? Description { get; set; }
|
||||
public bool IsActive { get; set; }
|
||||
public DateTime? ActivatedAt { get; set; }
|
||||
|
||||
public List<ApprovalWorkflowStep> Steps { get; set; } = new();
|
||||
}
|
||||
|
||||
public enum ApprovalWorkflowApplicableType
|
||||
{
|
||||
DuyetNcc = 1, // PE module — Duyệt NCC (default test target)
|
||||
DuyetNccPhuongAn = 2, // PE — Duyệt NCC + Giải pháp
|
||||
Contract = 3, // HĐ general (any ContractType)
|
||||
}
|
||||
|
||||
// Bước = Phòng. 1 quy trình có nhiều bước theo Order.
|
||||
public class ApprovalWorkflowStep : BaseEntity
|
||||
{
|
||||
public Guid ApprovalWorkflowId { get; set; }
|
||||
public int Order { get; set; } // 1-based
|
||||
public string Name { get; set; } = string.Empty; // "Phòng A", "Phòng B" — display
|
||||
public Guid? DepartmentId { get; set; } // hint phòng (optional, không strict match)
|
||||
|
||||
public ApprovalWorkflow? ApprovalWorkflow { get; set; }
|
||||
public List<ApprovalWorkflowLevel> Levels { get; set; } = new();
|
||||
}
|
||||
|
||||
// Cấp = 1 NV cụ thể. 1 bước có nhiều cấp theo Order. Approver = ApproverUserId
|
||||
// chính xác (KHÔNG OR-of-many). Sequential trong cùng bước: cấp 1 → cấp 2 → ...
|
||||
public class ApprovalWorkflowLevel : BaseEntity
|
||||
{
|
||||
public Guid ApprovalWorkflowStepId { get; set; }
|
||||
public int Order { get; set; } // 1-based trong cùng step
|
||||
public string? Name { get; set; } // "Cấp 1" — display optional
|
||||
public Guid ApproverUserId { get; set; } // 1 NV cụ thể duyệt cấp này
|
||||
|
||||
public ApprovalWorkflowStep? Step { get; set; }
|
||||
}
|
||||
@ -51,6 +51,20 @@ public static class MenuKeys
|
||||
public const string PurchaseEvaluations = "PurchaseEvaluations"; // root group
|
||||
public const string PeWorkflows = "PeWorkflows"; // workflow admin root
|
||||
|
||||
// ============================================================
|
||||
// Quy trình duyệt MỚI (Mig 22 — Session 17, 2026-05-08):
|
||||
// Schema riêng `ApprovalWorkflow` để UAT trước khi migrate hoàn toàn.
|
||||
// Cấu trúc: Quy trình > Bước (Phòng) > Cấp (NV cụ thể).
|
||||
// Mã + Tên Quy trình
|
||||
// Bước 1 - Phòng A
|
||||
// Cấp 1 - NV X
|
||||
// Cấp 2 - NV Y
|
||||
// Bước 2 - Phòng B
|
||||
// ...
|
||||
// ============================================================
|
||||
public const string ApprovalWorkflowsV2 = "ApprovalWorkflowsV2"; // root admin (mới)
|
||||
public const string ApprovalWorkflowDuyetNccV2 = "AwV2_DuyetNcc"; // leaf cho Duyệt NCC mới
|
||||
|
||||
// ============================================================
|
||||
// Module Ngân sách (Phase 7) — 4 bảng quản lý ngân sách dự án/gói thầu.
|
||||
// 1 root + 3 leaf action (Danh sách / Thao tác / Duyệt).
|
||||
@ -81,6 +95,7 @@ public static class MenuKeys
|
||||
PurchaseEvaluations,
|
||||
Budgets, BudgetList, BudgetCreate, BudgetPending,
|
||||
System, Users, Roles, Permissions, Workflows, PeWorkflows,
|
||||
ApprovalWorkflowsV2, ApprovalWorkflowDuyetNccV2, // Mig 22
|
||||
];
|
||||
|
||||
public static readonly string[] Actions = ["Read", "Create", "Update", "Delete"];
|
||||
|
||||
Reference in New Issue
Block a user