From 361602436bfa55ef3f7aa0f515a413b3ae33ea51 Mon Sep 17 00:00:00 2001 From: "Mac\\David" Date: Tue, 28 May 2024 18:08:23 +0800 Subject: [PATCH] resource summary api --- .../modules/data/service/DashboardService.kt | 105 ++++++++++++++++++ .../modules/data/web/DashboardController.kt | 25 +++++ 2 files changed, 130 insertions(+) diff --git a/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt b/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt index eeeceba..de1a206 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt @@ -907,6 +907,111 @@ open class DashboardService( return jdbcDao.queryForList(sql.toString(), args) } + fun projectResourceSummarySearch(args: Map): List> { + val sql = StringBuilder("select" + + " p.id as id," + + " p.code as projectCode," + + " p.name as projectName," + + " concat(c.code,'-',c.name) as customerCodeAndName" + + " from project p" + + " left join customer c on p.customerId = c.id" + + " where p.status = 'On-going'" + + " and p.deleted = 0" + ) + + return jdbcDao.queryForList(sql.toString(), args) + } + fun projectResourceSummaryInformation(args: Map): List> { + val sql = StringBuilder("select" + + " concat(p.code,'-',p.name) as projectCodeAndName," + + " p.expectedTotalFee as totalFee," + + " expenditure.expenditure as expenditure," + + " case" + + " when p.expectedTotalFee - expenditure.expenditure >= 0 then 'Within Budget'" + + " when p.expectedTotalFee - expenditure.expenditure < 0 then 'Overconsumption'" + + " end as status," + + " p.totalManhour as plannedResources," + + " sum(t.normalConsumed) + sum(t.otConsumed) as resourcesSpent," + + " p.totalManhour - sum(t.normalConsumed) + sum(t.otConsumed) as remainingResources" + + " from project p" + + " left join project_task pt on p.id = pt.project_id" + + " left join timesheet t on pt.id = t.projectTaskId" + + " left join(" + + " select" + + " sum(r.expenditure) as expenditure" + + " from(" + + " select" + + " (coalesce(sum(t.normalConsumed),0) * s2.hourlyRate) + (coalesce(sum(t.otConsumed),0) * s2.hourlyRate * 1.0) as expenditure" + + " from project p" + + " left join project_task pt on p.id = pt.project_id" + + " left join timesheet t on pt.id = t.projectTaskId" + + " left join staff s on t.staffId = s.id" + + " left join salary s2 on s.salaryId = s2.salaryPoint" + + " where t.id is not null" + + " and p.id = :projectId" + + " group by s2.hourlyRate" + + " ) as r" + + " ) as expenditure on 1 = 1" + + " where p.id = :projectId" + + " group by expenditure.expenditure" + ) + + return jdbcDao.queryForList(sql.toString(), args) + } + fun projectResourceSummaryMainStage(args: Map): List> { + val sql = StringBuilder("select" + + " p.id as projectId," + + " tg.id," + + " tg.name," + + " count(distinct pt.id) as taskCount," + + " g.name," + + " ifnull(ga.manhour, 0) as plannedResourcesPercentage," + + " ifnull(p.totalManhour, 0) * ifnull(ga.manhour, 0) / 100 as plannedResources," + + " ifnull(p.totalManhour, 0) as totalPlannedResources," + + " sum(ifnull(case when s.gradeId = g.id then t.normalConsumed else 0 end, 0) + ifnull(case when s.gradeId = g.id and ga.projectId = p.id then t.otConsumed else 0 end, 0)) as actualResourcesSpent," + + " sum(ifnull(t.normalConsumed, 0) + ifnull(t.otConsumed, 0)) as totalActualResourcesSpent" + + " from project p" + + " left join project_task pt on pt.project_id = p.id" + + " left join milestone m on m.projectId = p.id and m.id = pt.milestoneId" + + " left join task_group tg on tg.id = m.taskGroupId" + + " left join grade_allocation ga ON ga.projectId = p.id" + + " left join grade g ON g.id = ga.gradeId" + + " left join timesheet t on t.projectTaskId = pt.id" + + " left join staff s on s.id = t.staffId" + + " where p.deleted = false" + + " and p.id = :projectId" + + " group by p.id, tg.id, tg.name, g.name, plannedResourcesPercentage, plannedResources" + + " order by p.id;" + ) + + return jdbcDao.queryForList(sql.toString(), args) + } + fun projectResourceSummarySubStage(args: Map): List> { + val sql = StringBuilder("select" + + " p.id as projectId," + + " t.id," + + " t.taskGroupId as tgId," + + " t.name," + + " g.name," + + " '-' as taskCount," + + " '-' as plannedResources," + + " '-' as totalPlannedResource," + + " sum(ifnull(case when s.gradeId = g.id then ts.normalConsumed else 0 end, 0) + ifnull(case when s.gradeId = g.id and ga.projectId = p.id then ts.otConsumed else 0 end, 0)) as actualResourcesSpent," + + " sum(ifnull(ts.normalConsumed, 0) + ifnull(ts.otConsumed, 0)) as totalActualResourcesSpent" + + " from project p" + + " left join project_task pt on pt.project_id = p.id" + + " left join task t on t.id = pt.task_id" + + " left join grade_allocation ga on ga.projectId = p.id" + + " left join grade g on g.id = ga.gradeId" + + " left join timesheet ts on ts.projectTaskId = pt.id" + + " left join staff s on s.id = ts.staffId" + + " where p.id = :projectId" + + " group by p.id, t.id, t.name, g.name" + + " order by p.id;" + ) + + return jdbcDao.queryForList(sql.toString(), args) + } } diff --git a/src/main/java/com/ffii/tsms/modules/data/web/DashboardController.kt b/src/main/java/com/ffii/tsms/modules/data/web/DashboardController.kt index 7167dfe..a69305d 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/DashboardController.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/DashboardController.kt @@ -207,4 +207,29 @@ class DashboardController( result["teamCashFlowExpenditure"] = teamCashFlowExpenditure return listOf(result) } + @GetMapping("/searchProjectResourcesSummary") + fun searchProjectResourcesSummary(request: HttpServletRequest?): List> { + val args = mutableMapOf() + val projectId = request?.getParameter("projectId") + if (projectId != null) { + args["projectId"] = projectId + } + return dashboardService.projectResourceSummarySearch(args) + } + @GetMapping("/searchProjectResourcesSummaryDetails") + fun searchProjectResourcesSummaryDetails(request: HttpServletRequest?): List> { + val args = mutableMapOf() + val projectId = request?.getParameter("projectId") + if (projectId != null) { + args["projectId"] = projectId + } + val result = mutableMapOf() + val summaryInformation = dashboardService.projectResourceSummaryInformation(args) + val summaryMainStage = dashboardService.projectResourceSummaryMainStage(args) + val summarySubStage = dashboardService.projectResourceSummarySubStage(args) + result["summaryInformation"] = summaryInformation + result["summaryMainStage"] = summaryMainStage + result["summarySubStage"] = summarySubStage + return listOf(result) + } } \ No newline at end of file