Переглянути джерело

update report & fix project

tags/Baseline_30082024_BACKEND_UAT
cyril.tsui 1 рік тому
джерело
коміт
03fc7e8c2f
6 змінених файлів з 477 додано та 254 видалено
  1. +6
    -1
      src/main/java/com/ffii/tsms/modules/project/entity/ProjectRepository.kt
  2. +1
    -0
      src/main/java/com/ffii/tsms/modules/project/entity/ProjectTaskRepository.kt
  3. +433
    -248
      src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt
  4. +32
    -5
      src/main/java/com/ffii/tsms/modules/report/web/ReportController.kt
  5. +5
    -0
      src/main/java/com/ffii/tsms/modules/report/web/model/ReportRequest.kt
  6. BIN
      src/main/resources/templates/report/AR02_Delay Report v02.xlsx

+ 6
- 1
src/main/java/com/ffii/tsms/modules/project/entity/ProjectRepository.kt Переглянути файл

@@ -1,10 +1,13 @@
package com.ffii.tsms.modules.project.entity;

import com.ffii.core.support.AbstractRepository
import com.ffii.tsms.modules.data.entity.Customer
import com.ffii.tsms.modules.data.entity.Staff
import com.ffii.tsms.modules.project.entity.projections.InvoiceInfoSearchInfo
import com.ffii.tsms.modules.project.entity.projections.InvoiceSearchInfo
import com.ffii.tsms.modules.project.entity.projections.ProjectSearchInfo
import org.springframework.data.jpa.repository.Query
import org.springframework.lang.Nullable
import java.io.Serializable
import java.time.LocalDate

@@ -25,8 +28,10 @@ interface ProjectRepository : AbstractRepository<Project, Long> {
"")
fun getLatestCodeNumberByMainProject(isClpProject: Boolean, id: Serializable?): Long?

@Query("SELECT max(case when length(p.code) - length(replace(p.code, '-', '')) > 1 then cast(substring_index(p.code, '-', -1) as long) end) FROM Project p WHERE p.code like ?1 and p.id != ?2")
@Query("SELECT max(case when length(p.code) - length(replace(p.code, '-', '')) > 1 then cast(substring_index(p.code, '-', -1) as long) end) FROM Project p WHERE p.code like %?1% and p.id != ?2")
fun getLatestCodeNumberBySubProject(code: String, id: Serializable?): Long?

fun findAllByStatusIsNotAndMainProjectIsNull(status: String): List<Project>

fun findAllByTeamLeadAndCustomer(teamLead: Staff, customer: Customer): List<Project>
}

+ 1
- 0
src/main/java/com/ffii/tsms/modules/project/entity/ProjectTaskRepository.kt Переглянути файл

@@ -5,5 +5,6 @@ import com.ffii.core.support.AbstractRepository
interface ProjectTaskRepository : AbstractRepository<ProjectTask, Long> {
fun findAllByProject(project: Project): List<ProjectTask>

fun findAllByProjectIn(projects: List<Project>): List<ProjectTask>
fun findByProjectAndTask(project: Project, task: Task): ProjectTask?
}

+ 433
- 248
src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt
Різницю між файлами не показано, бо вона завелика
Переглянути файл


+ 32
- 5
src/main/java/com/ffii/tsms/modules/report/web/ReportController.kt Переглянути файл

@@ -2,11 +2,9 @@ package com.ffii.tsms.modules.report.web

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.ffii.tsms.modules.data.entity.Customer
import com.ffii.tsms.modules.data.entity.StaffRepository
import com.ffii.tsms.modules.data.entity.*
//import com.ffii.tsms.modules.data.entity.projections.FinancialStatusReportInfo
import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo
import com.ffii.tsms.modules.data.entity.Team
import com.ffii.tsms.modules.data.service.CustomerService
import com.ffii.tsms.modules.data.service.TeamService
import com.ffii.tsms.modules.project.entity.*
@@ -35,11 +33,12 @@ import java.time.LocalDate
import java.net.URLEncoder
import java.time.format.DateTimeFormatter
import org.springframework.stereotype.Controller
import com.ffii.tsms.modules.data.entity.TeamRepository
import com.ffii.tsms.modules.data.entity.CustomerRepository
import org.springframework.data.jpa.repository.JpaRepository
import com.ffii.tsms.modules.project.entity.Project
import com.ffii.tsms.modules.report.web.model.*
import com.ffii.tsms.modules.timesheet.entity.Timesheet
import org.springframework.data.domain.Example
import org.springframework.data.domain.ExampleMatcher

@RestController
@RequestMapping("/reports")
@@ -87,6 +86,34 @@ class ReportController(
.body(ByteArrayResource(reportResult))
}

@PostMapping("/ProjectPotentialDelayReport")
@Throws(ServletRequestBindingException::class, IOException::class)
fun getProjectPotentialDelayReport(@RequestBody @Valid request: ProjectPotentialDelayReportRequest): ResponseEntity<Resource> {

val team = if (request.teamId.lowercase() == "all") null else teamRepository.findById(request.teamId.toLong()).orElse(null)
val searchedTeam = if (team == null) "All" else team.code + " - " +team.name
val client = if (request.clientId.lowercase() == "all") null else customerRepository.findById(request.clientId.toLong()).orElse(null)
val searchedClient = if (client == null) "All" else client.code + " - " +client.name

val matcher = ExampleMatcher.matching().withIgnoreNullValues()
val exampleQuery = Example.of(Project().apply {
// org.springframework.dao.InvalidDataAccessApiUsageException: Path 'teamLead.team.staff' from root Project must not span a cyclic property reference
// [{ com.ffii.tsms.modules.project.entity.Project@6847e037 }] -teamLead-> [{ com.ffii.tsms.modules.data.entity.Staff@2a4c488b }] -team-> [{ com.ffii.tsms.modules.data.entity.Team@a09acb5 }] -staff-> [{ com.ffii.tsms.modules.data.entity.Staff@2a4c488b }]
// teamLead = team?.staff
customer = client
status = "On-going"
}, matcher)

val projects = if (team == null) projectRepository.findAll(exampleQuery) else projectRepository.findAll(exampleQuery).filter { it.teamLead == team.staff }

val projectTasks = projectTaskRepository.findAllByProjectIn(projects)
val timesheets = timesheetRepository.findAllByProjectTaskIn(projectTasks)
val reportResult: ByteArray = excelReportService.generateProjectPotentialDelayReport(searchedTeam, searchedClient, projects, timesheets)
return ResponseEntity.ok()
.header("filename", "Project Potential Delay Report - " + LocalDate.now() + ".xlsx")
.body(ByteArrayResource(reportResult))
}

@PostMapping("/StaffMonthlyWorkHourAnalysisReport")
@Throws(ServletRequestBindingException::class, IOException::class)
fun StaffMonthlyWorkHourAnalysisReport(@RequestBody @Valid request: StaffMonthlyWorkHourAnalysisReportRequest): ResponseEntity<Resource> {


+ 5
- 0
src/main/java/com/ffii/tsms/modules/report/web/model/ReportRequest.kt Переглянути файл

@@ -18,6 +18,11 @@ data class ProjectCashFlowReportRequest (
val dateType: String, // "Date", "Month"
)

data class ProjectPotentialDelayReportRequest (
val teamId: String,
val clientId: String,
)

data class StaffMonthlyWorkHourAnalysisReportRequest (
val id: Long,
val yearMonth: YearMonth


BIN
src/main/resources/templates/report/AR02_Delay Report v02.xlsx Переглянути файл


Завантаження…
Відмінити
Зберегти