예산배정 목록조회 로직 변경.

master
강석 최 2023-07-25 17:22:08 +09:00
parent e52dbd5498
commit a5827e1a88
7 changed files with 274 additions and 176 deletions

View File

@ -132,7 +132,8 @@ public class BudgetController {
if (requestDto.getYear() != null) {
userOrgCode = requestDto.getCode();
List<AssignResult> list = budgetService.selectBudgetAssignInfo(loginUser, requestDto);
// List<AssignResult> list = budgetService.selectBudgetAssignInfo(loginUser, requestDto);
List<AssignResult> list = budgetService.selectBudgetAssignInfoList(requestDto);
mav.addObject("list", list);
} else {
// 로그인된 해당청 기본선택

View File

@ -15,6 +15,8 @@ public interface BudgetMapper {
UpdateResult callSpUpdateBudgetPlanCodeItem(BudgetParams param);
UpdateResult callSpDeleteBudgetPlan(BudgetParams param);
List<AssignResult> callSpGetBudgetAssignInfo(BudgetParams param);
List<AssignResult> selectBudgetAssignInfoList(BudgetParams params);
List<AssignAmount> selectBudgetAssignAmountList(BudgetParams params);
List<CodeResult> callSpGetDownOrg(BudgetParams param);
List<CodeResult> callSpGetLowerOrgCodeByName();
String callSpGetHighOrgCode(BudgetParams params);
@ -25,4 +27,5 @@ public interface BudgetMapper {
List<ExpenseResult> callSpGetbudgetStatOrg(BudgetParams params);
List<StatsItemResult> callSpGetbudgetStatDetail(BudgetParams params);
List<L3CodeResult> callSpGetBudgetCodeL3(BudgetParams params);
}

View File

@ -0,0 +1,12 @@
package com.dbnt.faisp.main.budget.model.result;
import lombok.Getter;
@Getter
public class AssignAmount {
Integer orderSeq;
String organCd;
String budgetCode;
Integer periodAssignAmount;
Integer sumAssignAmount;
}

View File

@ -1,33 +1,35 @@
package com.dbnt.faisp.main.budget.model.result;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class AssignResult {
String orgCount;
String budgetNameL1;
String budgetNameL2;
String budgetNameL3;
String budgetCodeL3;
String planAmount;
String totalAssignAmount;
String periodAssignAmount1;
String sumAssignAmount1;
String periodAssignAmount2;
String sumAssignAmount2;
String periodAssignAmount3;
String sumAssignAmount3;
String periodAssignAmount4;
String sumAssignAmount4;
String periodAssignAmount5;
String sumAssignAmount5;
String periodAssignAmount6;
String sumAssignAmount6;
String periodAssignAmount7;
String sumAssignAmount7;
String periodAssignAmount8;
String sumAssignAmount8;
String periodAssignAmount9;
String sumAssignAmount9;
String planAmount = "0";
String totalAssignAmount = "0";
String periodAssignAmount1 = "0";
String sumAssignAmount1 = "0";
String periodAssignAmount2 = "0";
String sumAssignAmount2 = "0";
String periodAssignAmount3 = "0";
String sumAssignAmount3 = "0";
String periodAssignAmount4 = "0";
String sumAssignAmount4 = "0";
String periodAssignAmount5 = "0";
String sumAssignAmount5 = "0";
String periodAssignAmount6 = "0";
String sumAssignAmount6 = "0";
String periodAssignAmount7 = "0";
String sumAssignAmount7 = "0";
String periodAssignAmount8 = "0";
String sumAssignAmount8 = "0";
String periodAssignAmount9 = "0";
String sumAssignAmount9 = "0";
}

View File

@ -292,12 +292,6 @@ public class BudgetService {
// 예산배정
public List<AssignResult> selectBudgetAssignInfo(UserInfo loginUser, BudgetDto.AssignSearchReqeust requestDto){
// System.out.println(requestDto.getCode());
// System.out.println(requestDto.getYear());
// System.out.println(requestDto.getStDate());
// System.out.println(requestDto.getEdDate());
//System.out.println(requestDto.getYear()+" / "+ requestDto.getCode()+" / "+ "admin"+" / "+ java.sql.Date.valueOf(requestDto.getStDate())+" / "+java.sql.Date.valueOf(requestDto.getEdDate()));
// return budgetRepository.callSpGetBudgetAssignInfo(requestDto.getYear(), requestDto.getCode(), "admin", java.sql.Date.valueOf(requestDto.getStDate()),java.sql.Date.valueOf(requestDto.getEdDate()));
BudgetParams params = new BudgetParams();
params.setYear(requestDto.getYear());
params.setCode(requestDto.getCode());
@ -307,6 +301,67 @@ public class BudgetService {
return budgetMapper.callSpGetBudgetAssignInfo(params);
}
public List<AssignResult> selectBudgetAssignInfoList(BudgetDto.AssignSearchReqeust requestDto){
BudgetParams params = new BudgetParams();
params.setYear(requestDto.getYear());
params.setCode(requestDto.getCode());
params.setUser("admin");
params.setStDate(java.sql.Date.valueOf(requestDto.getStDate()));
params.setEdDate(java.sql.Date.valueOf(requestDto.getEdDate()));
List<AssignResult> assignResultList = budgetMapper.selectBudgetAssignInfoList(params);
List<AssignAmount> assignAmountList = budgetMapper.selectBudgetAssignAmountList(params);
for(AssignResult result: assignResultList){
for(AssignAmount amount: assignAmountList){
if(result.getBudgetCodeL3().equals(amount.getBudgetCode())){
int totalAssignAmount = result.getTotalAssignAmount()==null?0:Integer.parseInt(result.getTotalAssignAmount());
totalAssignAmount += amount.getSumAssignAmount();
result.setTotalAssignAmount(Integer.toString(totalAssignAmount));
switch (amount.getOrderSeq()){
case 1:
result.setPeriodAssignAmount1(amount.getPeriodAssignAmount().toString());
result.setSumAssignAmount1(amount.getSumAssignAmount().toString());
break;
case 2:
result.setPeriodAssignAmount2(amount.getPeriodAssignAmount().toString());
result.setSumAssignAmount2(amount.getSumAssignAmount().toString());
break;
case 3:
result.setPeriodAssignAmount3(amount.getPeriodAssignAmount().toString());
result.setSumAssignAmount3(amount.getSumAssignAmount().toString());
break;
case 4:
result.setPeriodAssignAmount4(amount.getPeriodAssignAmount().toString());
result.setSumAssignAmount4(amount.getSumAssignAmount().toString());
break;
case 5:
result.setPeriodAssignAmount5(amount.getPeriodAssignAmount().toString());
result.setSumAssignAmount5(amount.getSumAssignAmount().toString());
break;
case 6:
result.setPeriodAssignAmount6(amount.getPeriodAssignAmount().toString());
result.setSumAssignAmount6(amount.getSumAssignAmount().toString());
break;
case 7:
result.setPeriodAssignAmount7(amount.getPeriodAssignAmount().toString());
result.setSumAssignAmount7(amount.getSumAssignAmount().toString());
break;
case 8:
result.setPeriodAssignAmount8(amount.getPeriodAssignAmount().toString());
result.setSumAssignAmount8(amount.getSumAssignAmount().toString());
break;
case 9:
result.setPeriodAssignAmount9(amount.getPeriodAssignAmount().toString());
result.setSumAssignAmount9(amount.getSumAssignAmount().toString());
break;
}
}
}
}
return assignResultList;
}
//(공통) 2단계로 하위청 뿌려주기
public List<CodeResult> selectDownOrg(String userOrgCode){
// return budgetRepository.callSpGetDownOrg(userOrgCode);

View File

@ -36,6 +36,49 @@
select *
from sp_get_budget_assign_info(#{year}, #{code}, #{user} ,#{stDate}::date, #{edDate}::date)
</select>
<select id="selectBudgetAssignInfoList" resultType="AssignResult" parameterType="BudgetParams">
SELECT d.budget_code as budgetCodeL3,
a.l1_name as budgetNameL1,
b.l2_name as budgetNameL2,
c.l3_name as budgetNameL3,
d.amount as plan_amount
FROM public.tbl_budget_code_l1 A
inner join public.tbl_budget_code_l2 B on a.l1_code = b.l1_code
inner join public.tbl_budget_code_l3 C on b.l2_code = c.l2_code and c.use_tag = 'Y'
inner join public.tbl_budget_plan D on c.l3_code = d.budget_code and d.org_code = #{code}
WHERE a.L1_YEAR = #{year}
ORDER BY d.budget_code ASC
</select>
<select id="selectBudgetAssignAmountList" resultType="AssignAmount" parameterType="BudgetParams">
select oc.order_seq,
oc.organ_cd,
tba.budget_code,
tba.period_assign_amount,
coalesce(tbe.sum_assign_amount, 0) as sum_assign_amount
from (
select h_org_code, l_org_code, budget_code, sum(amount) as period_assign_amount
from tbl_budget_assign
where h_org_code = #{code}
group by h_org_code, l_org_code, budget_code
) tba
left outer join (
select org_code, budget_code, sum(amount) as sum_assign_amount
from tbl_budget_expense
where EXTRACT( year FROM expense_date ) = ${year}
group by org_code, budget_code
) tbe on tba.l_org_code = tbe.org_code and tba.budget_code = tbe.budget_code
inner join (
select (ROW_NUMBER() OVER()) AS order_seq, *
from (
select #{code} as organ_cd
union all
select organ_cd
from organ_config
where parent_organ = #{code}
) a
) oc on tba.l_org_code = oc.organ_cd
order by order_seq, organ_cd, budget_code
</select>
<select id="callSpGetDownOrg" resultType="CodeResult" parameterType="BudgetParams">
select org_code as orgCode,
org_name as orgName

View File

@ -3,163 +3,145 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/layout}">
<th:block layout:fragment="script">
<script type="text/javascript" th:src="@{/js/budget/assign.js}"></script>
<script type="text/javascript" th:src="@{/js/budget/assign.js}"></script>
</th:block>
<th:block layout:fragment="css">
<link rel="stylesheet" th:href="@{/css/budget/assign.css}">
<link rel="stylesheet" th:href="@{/css/budget/assign.css}">
</th:block>
<div layout:fragment="content">
<main>
<input type="hidden" id="menuKey" value="55">
<div class="row justify-content-between">
<div class="col-auto">
<div class="mb-2">
<div class="d-inline align-middle"><i class="bi bi-square-fill"></i></div>
<h5 class="d-inline align-middle"> 예산배정</h5>
</div>
</div>
<div class="col-auto">
<p class="mb-0 mt-2">정보예산관리 > 예산배정</p>
</div>
<main>
<input type="hidden" id="menuKey" value="55">
<div class="row justify-content-between">
<div class="col-auto">
<div class="mb-2">
<div class="d-inline align-middle"><i class="bi bi-square-fill"></i></div>
<h5 class="d-inline align-middle"> 예산배정</h5>
</div>
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<div class="row mx-0">
<div class="col-12 card bg-light text-center">
<div class="card-body">
<form id="assginForm" method="get" action="/budget/assign" onsubmit="return false;">
<input type="hidden" name="year" id="year" value=""/>
<div class="row justify-content-between py-1">
<div class="col-auto">
</div>
<div class="col-auto">
<div class="row justify-content-end">
<div class="col-auto">
<select class="form-select form-select-sm" name="code" id="code">>
<option value="OG001">본청</option>
<option th:each="code : ${codeList}" th:value="${code?.orgCode}"
th:text="${code?.orgName}"
th:selected="${searchParams?.code eq code.orgCode}">2023
</option>
</select>
</div>
<div class="col-auto">
<div class="input-group w-auto input-daterange" id="dateSelectorDiv">
<input type="text" class="form-control form-control-sm" id="stDate" name="stDate" placeholder="시작일" autocomplete="off" readonly
th:value="${searchParams.stDate}">
<input type="text" class="form-control form-control-sm" id="edDate" name="edDate" placeholder="종료일" autocomplete="off" readonly
th:value="${searchParams.edDate}">
</div>
</div>
<div class=" col-auto">
<input type="submit" class="btn btn-sm btn-primary" id="assignsearchBtn" value="검색">
</div>
</div>
</div>
</div>
</form>
<div class="row">
<div class="col-12">
<table class="table table-sm table-bordered table-hover">
<thead>
<tr class="table-secondary">
<th rowspan="2">사업명</th>
<th rowspan="2">구분</th>
<th rowspan="2">세부내역</th>
<th rowspan="2">예산총액</th>
<th rowspan="2">예산총배정액<br>(누적)</th>
<th:block th:each="orglist : ${downOrgList}">
<th colspan="2" th:text="${orglist.orgName}"></th>
</th:block>
</tr>
<tr class="table-secondary">
<th:block th:each="orglist : ${downOrgList}">
<th>기간배정액</th>
<th>누적액</th>
</th:block>
</tr>
</thead>
<tbody class="table-group-divider" id="ResultRow">
<tr th:each="info, i : ${list}">
<td th:text="${info.budgetNameL1}"></td>
<td th:text="${info.budgetNameL2}"></td>
<td th:text="${info.budgetNameL3}"></td>
<td th:text="${#numbers.formatInteger(info.planAmount,1,'COMMA')}"
class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.totalAssignAmount,1,'COMMA')}"
class="text-end"></td>
<th:block th:each="orglist, j : ${downOrgList}">
<th:block th:if="${j.index} == '0'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount1,1,'COMMA')}"
class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount1,1,'COMMA')}"
class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '1'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount2,1,'COMMA')}"
class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount2,1,'COMMA')}"
class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '2'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount3,1,'COMMA')}"
class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount3,1,'COMMA')}"
class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '3'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount4,1,'COMMA')}"
class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount4,1,'COMMA')}"
class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '4'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount5,1,'COMMA')}"
class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount5,1,'COMMA')}"
class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '5'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount6,1,'COMMA')}"
class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount6,1,'COMMA')}"
class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '6'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount7,1,'COMMA')}"
class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount7,1,'COMMA')}"
class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '7'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount8,1,'COMMA')}"
class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount8,1,'COMMA')}"
class="text-end"></td>
</th:block>
</th:block>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row justify-content-between">
<div class="col-auto"></div>
<div class="col-auto">
</div>
<div class="col-auto">
<input type="button" class="btn btn-success" value="등록" id="addBtn">
</div>
</div>
<div class="col-auto">
<p class="mb-0 mt-2">정보예산관리 > 예산배정</p>
</div>
</div>
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<div class="row mx-0">
<div class="col-12 card bg-light text-center">
<div class="card-body">
<form id="assginForm" method="get" action="/budget/assign" onsubmit="return false;">
<input type="hidden" name="year" id="year" value=""/>
<div class="row justify-content-between py-1">
<div class="col-auto">
</div>
<div class="col-auto">
<div class="row justify-content-end">
<div class="col-auto">
<select class="form-select form-select-sm" name="code" id="code">>
<option value="OG001">본청</option>
<option th:each="code : ${codeList}" th:value="${code?.orgCode}"
th:text="${code?.orgName}"
th:selected="${searchParams?.code eq code.orgCode}">2023
</option>
</select>
</div>
<div class="col-auto">
<div class="input-group w-auto input-daterange" id="dateSelectorDiv">
<input type="text" class="form-control form-control-sm" id="stDate" name="stDate" placeholder="시작일" autocomplete="off" readonly
th:value="${searchParams.stDate}">
<input type="text" class="form-control form-control-sm" id="edDate" name="edDate" placeholder="종료일" autocomplete="off" readonly
th:value="${searchParams.edDate}">
</div>
</div>
<div class=" col-auto">
<input type="submit" class="btn btn-sm btn-primary" id="assignsearchBtn" value="검색">
</div>
</div>
</div>
</div>
</form>
<div class="row">
<div class="col-12">
<table class="table table-sm table-bordered table-hover">
<thead>
<tr class="table-secondary">
<th rowspan="2">사업명</th>
<th rowspan="2">구분</th>
<th rowspan="2">세부내역</th>
<th rowspan="2">예산총액</th>
<th rowspan="2">예산총배정액<br>(누적)</th>
<th:block th:each="orglist : ${downOrgList}">
<th colspan="2" th:text="${orglist.orgName}"></th>
</th:block>
</tr>
<tr class="table-secondary">
<th:block th:each="orglist : ${downOrgList}">
<th>기간배정액</th>
<th>누적액</th>
</th:block>
</tr>
</thead>
<tbody class="table-group-divider" id="ResultRow">
<tr th:each="info, i : ${list}">
<td th:text="${info.budgetNameL1}"></td>
<td th:text="${info.budgetNameL2}"></td>
<td th:text="${info.budgetNameL3}"></td>
<td th:text="${#numbers.formatInteger(info.planAmount,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.totalAssignAmount,1,'COMMA')}" class="text-end"></td>
<th:block th:each="orglist, j : ${downOrgList}">
<th:block th:if="${j.index} == '0'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount1,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount1,1,'COMMA')}" class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '1'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount2,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount2,1,'COMMA')}" class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '2'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount3,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount3,1,'COMMA')}" class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '3'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount4,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount4,1,'COMMA')}" class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '4'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount5,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount5,1,'COMMA')}" class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '5'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount6,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount6,1,'COMMA')}" class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '6'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount7,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount7,1,'COMMA')}" class="text-end"></td>
</th:block>
<th:block th:if="${j.index} == '7'">
<td th:text="${#numbers.formatInteger(info.periodAssignAmount8,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.sumAssignAmount8,1,'COMMA')}" class="text-end"></td>
</th:block>
</th:block>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row justify-content-between">
<div class="col-auto"></div>
<div class="col-auto">
</div>
<div class="col-auto">
<input type="button" class="btn btn-success" value="등록" id="addBtn">
</div>
</div>
<div class="modal fade" id="editModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="faRptEditModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xxl modal-dialog-scrollable">
<div class="modal-content" id="editModalContent"></div>
</div>
</div>
</div>
<div class="modal fade" id="editModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="faRptEditModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xxl modal-dialog-scrollable">
<div class="modal-content" id="editModalContent"></div>
</div>
</div>
</div>
</main>
</div>
</div>
</main>
</div>
</html>