From 3bffd4ff82dea27b9a16e84956fc2dc99df2a37c Mon Sep 17 00:00:00 2001 From: "MSI\\2Fi" Date: Tue, 20 May 2025 18:00:18 +0800 Subject: [PATCH] Export Staff Info Las modify report --- .../modules/data/service/StaffsService.kt | 6 +- .../modules/report/service/ReportService.kt | 52 +++++++++++++++++- .../templates/report/Staff Information.xlsx | Bin 11722 -> 11783 bytes 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt index 039e152..573fd41 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt @@ -410,12 +410,16 @@ open class StaffsService( + " coalesce (s.joinDate, '') as employmentDate," + " g.code as grade," + " p.description ," - + " s.salaryId," + + " s.salaryId, " + + " s2.lowerLimit, " + + " s2.upperLimit, " + + " s2.hourlyRate, " + " coalesce (s.email , '') as email," + " s.departDate" + " from staff s" + " left join team on team.id = s.teamId" + " left join grade g on g.id = s.gradeId" + + " left join salary s2 on s2.salaryPoint = s.salaryId" + " left join `position` p on p.id = s.currentPosition" + " where s.deleted = false " ) diff --git a/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt b/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt index 5a7689f..3206391 100644 --- a/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt +++ b/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt @@ -5741,6 +5741,7 @@ open class ReportService( "select " + "s.staffId, " + "s.name, " + + "s.departDate, " + "COALESCE(s.email, '') as email, " + "t.code as team, " + "lmd.lastRecordDate " + @@ -5752,7 +5753,17 @@ open class ReportService( "order by lmd.lastrecorddate " ) - val results = jdbcDao.queryForList(sql.toString(), mapOf("searchDate" to date.format(formatter))).map { + val results = jdbcDao.queryForList(sql.toString(), mapOf("searchDate" to date.format(formatter))) + .filter{ + val departDate = it["departDate"] as? java.sql.Date + if (departDate != null) { + val currentDate = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()) + departDate.after(currentDate) + } else { + false // Exclude entries with null departDate + } + } + .map { result -> StaffLastRecordData( result["staffId"] as String, @@ -5907,7 +5918,11 @@ open class ReportService( val gradeCell = row.createCell(4) val positionCell = row.createCell(5) val salaryPointCell = row.createCell(6) - val emailCell = row.createCell(7) + val lowerLimitCell = row.createCell(7) + val upperLimitCell = row.createCell(8) + val hourlyRateCell = row.createCell(9) + val emailCell = row.createCell(10) + val activeCell = row.createCell(11) staffIdCell.apply { setCellValue(it.getValue("staffId") as String) @@ -5946,11 +5961,44 @@ open class ReportService( cellStyle = blackFontStyle } + lowerLimitCell.apply{ + setCellValue((it.getValue("lowerLimit") as Int).toString()) + cellStyle = blackFontStyle + } + + upperLimitCell.apply{ + setCellValue((it.getValue("upperLimit") as Int).toString()) + cellStyle = blackFontStyle + } + + hourlyRateCell.apply{ + setCellValue((it.getValue("hourlyRate") as BigDecimal).toString()) + cellStyle = blackFontStyle + } + emailCell.apply { setCellValue(it.getValue("email") as String) cellStyle = blackFontStyle } + activeCell.apply { + var active: Boolean + var uniCode: String + val departDate = it["departDate"] as? java.sql.Date + + if (departDate != null) { + val currentDate = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()) + active = departDate.after(currentDate) + } else { + active = true // Exclude entries with null departDate + } + + uniCode = if (active) "\u2713" else "\u2717" + + setCellValue(uniCode) + cellStyle = blackFontStyle + } + startRowIndex++ } diff --git a/src/main/resources/templates/report/Staff Information.xlsx b/src/main/resources/templates/report/Staff Information.xlsx index c60fe27715c1ced9fa3a39ba3b97f259ac35218b..f6477bf2d30fe61f1076e02cf367b3bbcfa05d6a 100644 GIT binary patch delta 3785 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 v_|62AW9Eg02$C}VGZQ|4Hz*ea03iFH)ME}