[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:
pqhuy1987
2026-05-08 12:39:37 +07:00
parent 21ee36390e
commit c847dc0b24
8 changed files with 4274 additions and 0 deletions

View File

@ -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; }
}