fix issue
All checks were successful
Build & Deploy Leave Service / build (push) Successful in 1m52s

This commit is contained in:
Suphonchai Phoonsawat 2026-05-01 16:38:47 +07:00
parent 132a59b946
commit 4bd46d13e5
3 changed files with 214 additions and 3 deletions

View file

@ -1928,9 +1928,9 @@ namespace BMA.EHR.Application.Repositories.Leaves.LeaveRequests
.Include(x => x.Type)
.Where(x => x.KeycloakUserId == keycloakUserId)
.Where(x => x.Type.Id == leaveTypeId)
.Where(x => ((x.DateSendLeave ?? x.CreatedAt).Date >= startDate && (x.DateSendLeave ??x.CreatedAt).Date < endDate))
.Where(x => ((x.DateSendLeave ?? x.CreatedAt) >= startDate && (x.DateSendLeave ??x.CreatedAt) < endDate))
//.Where(x => x.LeaveStartDate.Date >= startDate.Date && x.LeaveStartDate.Date <= endDate.Date)
.Where(x => x.LeaveStatus == "NEW")
.Where(x => (x.LeaveStatus == "NEW" || x.LeaveStatus == "PENDING"))
.ToListAsync();
if (data.Count > 0)

View file

@ -2835,8 +2835,9 @@ namespace BMA.EHR.Leave.Service.Controllers
var leaveData = await _leaveBeginningRepository.GetByYearAndTypeIdForUser2Async(thisYear, rawData.Type.Id, rawData.KeycloakUserId);
var startFiscalYear = new DateTime(rawData.LeaveStartDate.Year - 1, 10, 1);
var endFiscalYear = rawData.CreatedAt;
var endFiscalYear = rawData.DateSendLeave ?? rawData.CreatedAt;
var endFiscalYear2 = new DateTime(rawData.LeaveStartDate.Year, 9, 30);
//var endFiscalYear3 = rawData.DateSendLeave ?? rawData.CreatedAt;
var leaveSummary = await _leaveRequestRepository.GetSumApproveLeaveTotalByTypeAndRangeForUser2(rawData.KeycloakUserId, rawData.Type.Id, startFiscalYear, endFiscalYear);
// วันลาแบบร่างและที่ยื่นลาไปแล้ว

210
README.md Normal file
View file

@ -0,0 +1,210 @@
# BMA.EHR - HRMS API Backend
ระบบบริหารจัดการทรัพยากรบุคคล (Human Resource Management System) พัฒนาด้วยสถาปัตยกรรม Microservices บน .NET
---
## Tech Stack
| Category | Technology |
| ----------------- | ----------------------------- |
| Framework | .NET 6.0 / 7.0 / 8.0 |
| Architecture | Clean Architecture, DDD, CQRS |
| Database | MySQL (Entity Framework Core) |
| Authentication | JWT + Keycloak |
| Message Queue | RabbitMQ |
| Object Storage | MinIO |
| Background Jobs | Hangfire |
| Logging | Serilog + Elasticsearch |
| Error Tracking | Sentry |
| API Documentation | Swagger / OpenAPI |
| Containerization | Docker |
| Testing | xUnit, k6 (Load Testing) |
---
## โครงสร้างโปรเจกต์ (Project Structure)
```
BMA.EHR.Solution.sln
├── src/ # Core Libraries
│ ├── BMA.EHR.Domain/ # Domain layer (Entities, Business Rules)
│ ├── BMA.EHR.Application/ # Application layer (Use Cases, Interfaces)
│ └── BMA.EHR.Infrastructure/ # Infrastructure layer (Data Access, External Services)
└── Service/ # Microservices
├── BMA.EHR.Command.Service/ # Command/CQRS API Gateway
├── BMA.EHR.MetaData.Service/ # ข้อมูลอ้างอิง (คำนำหน้า, หมู่เลือด, ศาสนา ฯลฯ)
├── BMA.EHR.Placement.Service/ # การบริจาค/สั่งย้าย/แต่งตั้ง
├── BMA.EHR.OrganizationEmployee.Service/ # โครงสร้างองค์กรและบุคลากร
├── BMA.EHR.Discipline.Service/ # การ discipline บุคลากร
├── BMA.EHR.Retirement.Service/ # การเกษียณอายุราชการ
├── BMA.EHR.Report.Service/ # รายงาน
├── BMA.EHR.Insignia/ # เครื่องราชอิสริยาภรณ์
├── BMA.EHR.Leave/ # ระบบลา
└── BMA.EHR.CheckInConsumer/ # ลงเวลาปฏิบัติงาน
```
---
## โมดูลหลัก (Key Modules)
### การบริหารทรัพยากรบุคคล
- **Placement Service** - สั่งย้าย, แต่งตั้ง, เลื่อนตำแหน่ง, โอนย้ายบุคลากร
- **Organization Employee Service** - จัดการโครงสร้างองค์กร, ตำแหน่ง, ข้อมูลบุคลากร
- **Leave Service** - การลางาน, การอนุมัติ, วันหยุดนักขัตฤกษ์, ยอดวันลาคงเหลือ
- **Discipline Service** - การดำเนินการ discipline, การสืบสวน, เอกสารที่เกี่ยวข้อง
- **Retirement Service** - การเกษียณอายุ, เอกสาร, สิทธิประโยชน์
- **Insignia Service** - เครื่องราชอิสริยาภรณ์และรางวัล
- **CheckIn Consumer** - ติดตามการลงเวลาปฏิบัติงาน
### ระบบสนับสนุน
- **Metadata Service** - ข้อมูลอ้างอิง (คำนำหน้าชื่อ, หมู่เลือด, ศาสนา, ระดับการศึกษา ฯลฯ)
- **Report Service** - สร้างรายงาน PDF/Excel
- **Command Service** - API Gateway สำหรับ CQRS command operations
### ฟีเจอร์เด่น
- **Real-time Notifications** - แจ้งเตือนผ่าน WebSocket
- **Background Processing** - งานที่กำหนดเวลาผ่าน Hangfire
- **Event-Driven Communication** - สื่อสารระหว่าง services ผ่าน RabbitMQ
- **Document Generation** - สร้างเอกสาร PDF/Excel
- **Audit Trail** - บันทึกประวัติการเปลี่ยนแปลงข้อมูลทั้งหมด
---
## API Endpoints
API ใช้ versioning และสามารถดูรายละเอียดได้ผ่าน Swagger UI:
```
/api/v1/placement # การบริจาค/สั่งย้าย/แต่งตั้ง
/api/v1/leave # ระบบลา
/api/v1/discipline # การ discipline
/api/v1/organization # โครงสร้างองค์กร
/api/v1/metadata # ข้อมูลอ้างอิง
/api/v1/retirement # การเกษียณอายุ
/api/v1/insignia # เครื่องราชอิสริยาภรณ์
/api/v1/reports # รายงาน
```
---
## Getting Started
### Prerequisites
- .NET SDK 6.0 / 7.0 / 8.0
- MySQL Server
- Keycloak (Authentication Server)
- RabbitMQ
- MinIO (Object Storage)
- Docker (สำหรับ deployment)
### Configuration
แต่ละ service มีไฟล์ `appsettings.json` สำหรับ config ดังนี้:
- **JWT Authentication** - เชื่อมต่อกับ Keycloak
- **Database Connection** - MySQL connection string
- **RabbitMQ** - Message queue connection
- **MinIO** - File storage endpoint
- **Elasticsearch** - Logging endpoint
- **Mail Server** - สำหรับส่งอีเมล
### Build & Run
```bash
# Restore dependencies
dotnet restore
# Build solution
dotnet build
# Run specific service
dotnet run --project Service/BMA.EHR.Command.Service
```
### Docker
```bash
# Build Docker image
docker build -t bma-ehr-service .
# Run container
docker run -d -p 5000:80 bma-ehr-service
```
---
## Architecture
```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Swagger │ │ Client │ │ WebSocket │
│ UI │ │ Apps │ │ Clients │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────────────────┼────────────────────┘
┌────────▼────────┐
│ API Gateway │
│ (Keycloak JWT) │
└────────┬────────┘
┌────────────────────┼────────────────────┐
│ │ │
┌──────▼──────┐ ┌────────▼──────┐ ┌────────▼──────┐
│ Placement │ │ Leave │ │ Discipline │
│ Service │ │ Service │ │ Service │
└──────┬──────┘ └────────┬──────┘ └────────┬──────┘
│ │ │
└────────────────────┼────────────────────┘
┌─────────────▼──────────────┐
│ MySQL Database │
│ (Entity Framework) │
└────────────────────────────┘
┌────────────────────────────┐
│ RabbitMQ / MinIO / │
│ Elasticsearch / Hangfire │
└────────────────────────────┘
```
---
## Dependencies ที่สำคัญ
| Package | หน้าที่ |
| --------------------- | ------------------------- |
| Entity Framework Core | ORM สำหรับ MySQL |
| Serilog | Structured Logging |
| Swashbuckle | API Documentation |
| Hangfire | Background Job Processing |
| EPPlus | สร้าง/อ่านไฟล์ Excel |
| iTextSharp | สร้างไฟล์ PDF |
| RabbitMQ.Client | Message Queue |
| NEST | Elasticsearch Client |
| ThaiBahtText | แปลงตัวเลขเป็นหน่วยบาทไทย |
| NodaTime | Date/Time Handling |
| Sentry | Error Tracking |
---
## Testing
```bash
# Run unit tests
dotnet test
# Run with coverage
dotnet test --collect:"XPlat Code Coverage"
# Run load tests (k6)
k6 run tests/load/*.js
```
---