견문보고 목록 첨부파일 부분 클릭시 다운로드 기능 추가.

견문보고 결재대기 목록에서 이전 결재 평가 조회도록 수정.
방첩공작 실적(통계) 쿼리 수정.
예산편성 등록모달 테이블 고정부분 추가.
master
최강석 2023-05-31 19:02:57 +09:00
parent a37361bdd8
commit 402bd7fa9a
12 changed files with 233 additions and 183 deletions

View File

@ -129,9 +129,11 @@ public class FileController extends BaseService{
@GetMapping("/downloadAffairFiles")
public void downloadAffairFiles(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value="fileNm", defaultValue = "견문보고서 첨부파일_") String fileNm,
@RequestParam(value="affairKeyList") List<Integer> affairKeyList){
List<FileInfo> fileList = affairService.selectAffairFileList(affairKeyList);
makeZipAndOut(request, response, "견문보고서 첨부파일_", fileList);
makeZipAndOut(request, response, fileNm, fileList);
}

View File

@ -146,6 +146,7 @@ public class SecurityConfig{
"/counterIntelligence/**",
"/monitoring/**",
"/intelligenceNetwork/**",
"/budget/**",
"/deadline/**"
).hasRole(Role.USER.name()) // USER 접근 허용
.antMatchers(

View File

@ -72,6 +72,8 @@ public class AffairBoard extends BaseModel {
private String ratingOrgan;
@Transient
private String affairRate;
@Transient
private String beforeRating;
@Transient
private String reception;

View File

@ -109,12 +109,13 @@
a.wrt_user_seq,
a.wrt_dt,
a.report_dt,
a.doc_no,
b.fileCnt,
c.rating_organ,
c.affair_status,
c.affair_rate,
c.organ_up,
a.doc_no
d.beforeRating
from affair_board a
left outer join (select affair_key,
count(file_seq) as fileCnt
@ -123,6 +124,13 @@
on a.affair_key = b.affair_key
inner join affair_rating c
on a.affair_key = c.affair_key
inner join (
select affair_key, STRING_AGG(CAST(og.item_value||' : '||ar.item_value AS VARCHAR), ', ') as beforeRating
from affair_rating aa
inner join code_mgt og on aa.rating_organ = og.item_cd
inner join code_mgt ar on aa.affair_rate = ar.item_cd
group by affair_key
) d on a.affair_key = d.affair_key
<include refid="selectAffairBoardWhere"></include>
order by a.affair_key desc
limit #{rowCnt} offset #{firstIndex}

View File

@ -117,10 +117,18 @@
<select id="selectCiWorkStatisticsList" resultType="ciWorkStatistics" parameterType="ciWorkStatistics">
select work_rating,
count(case when work_start_date >= (#{year}||'-01-01')::date and work_start_date &lt;= (#{year}+1||'-01-01')::date then 1 end) as newWorkCnt,
count(case when work_end_date is null or (work_end_date >= (#{year}+1||'-01-01')::date and work_end_date &lt; (#{year}+2||'-01-01')::date) then 1 end) as doingWorkCnt,
count(case when work_start_date > (#{year}-1||'-01-01')::date and work_start_date &lt;= (#{year}||'-01-01')::date and work_end_date >= (#{year}||'-01-01')::date and work_end_date &lt; (#{year}+1||'-01-01')::date then 1 end) as prevYearWorkEndCnt,
count(case when work_start_date >= (#{year}||'-01-01')::date and work_start_date &lt;= (#{year}+1||'-01-01')::date and work_end_date >= (#{year}||'-01-01')::date and work_end_date &lt; (#{year}+1||'-01-01')::date then 1 end) as thisYearWorkEndCnt
sum(case when work_start_date >= (#{year}||'-01-01')::date and work_start_date &lt; (#{year}+1||'-01-01')::date then 1 else 0 end) as newWorkCnt,
sum(case
when work_start_date >= (#{year}||'-01-01')::date and work_start_date &lt; (#{year}+1||'-01-01')::date and work_end_date is null then 1
when work_start_date >= (#{year}-1||'-01-01')::date and work_start_date &lt; (#{year}||'-01-01')::date and work_end_date is null then 1
when work_start_date >= (#{year}||'-01-01')::date and work_start_date &lt; (#{year}+1||'-01-01')::date and work_end_date > (#{year}||'-01-01')::date and work_end_date &lt; (#{year}+1||'-01-01')::date and work_end_date > now() then 1
when work_start_date >= (#{year}-1||'-01-01')::date and work_start_date &lt; (#{year}||'-01-01')::date and work_end_date > (#{year}||'-01-01')::date and work_end_date &lt; (#{year}+1||'-01-01')::date and work_end_date > now() then 1
when work_start_date >= (#{year}||'-01-01')::date and work_start_date &lt; (#{year}+1||'-01-01')::date and work_end_date > (#{year}+1||'-01-01')::date and work_end_date &lt; (#{year}+2||'-01-01')::date then 1
when work_start_date >= (#{year}-1||'-01-01')::date and work_start_date &lt; (#{year}||'-01-01')::date and work_end_date > (#{year}+1||'-01-01')::date and work_end_date &lt; (#{year}+2||'-01-01')::date then 1
else 0
end) as doingWorkCnt,
sum(case when work_start_date >= (#{year}||'-01-01')::date and work_start_date &lt; (#{year}+1||'-01-01')::date and work_end_date >= (#{year}||'-01-01')::date and work_end_date &lt; (#{year}+1||'-01-01')::date then 1 else 0 end) as thisYearWorkEndCnt,
sum(case when work_start_date >= (#{year}-1||'-01-01')::date and work_start_date &lt; (#{year}||'-01-01')::date and work_end_date >= (#{year}||'-01-01')::date and work_end_date &lt; (#{year}+1||'-01-01')::date then 1 else 0 end) as prevYearWorkEndCnt
from counter_intelligence_work a
WHERE a.status = 'DST007'
<if test='ogCd != null and ogCd != ""'>
@ -137,7 +145,7 @@
</select>
<select id="selectCiWorkYearList" resultType="int">
select year
from ( select EXTRACT(YEAR FROM work_start_date) AS year
from ( select EXTRACT(YEAR FROM work_end_date) AS year
from counter_intelligence_work
where status &lt;> 'DST008'
union

View File

@ -0,0 +1,31 @@
#tableDiv{
height: 600px;
overflow-y: auto;
}
.budgetNameTh{
z-index:3!important;
}
#data-table-default thead{
position: sticky;
top: 0;
z-index: 2;
}
#data-table-default th:nth-child(1),
#data-table-default td:nth-child(1){
position: sticky;
left: -7px;
z-index:1;
}
#data-table-default th:nth-child(2),
#data-table-default td:nth-child(2){
position: sticky;
left: 98px;
z-index:1;
}
#data-table-default th:nth-child(3),
#data-table-default td:nth-child(3){
position: sticky;
left: 216px;
z-index:1;
}

View File

@ -29,8 +29,14 @@ $(document).on('click', '.affairTr', function (event){
$(".trChkBox").prop("checked", false);
chkBox[0].checked = true;
}
if(target.className === "fileTd"
|| $(target).parents(".fileTd").length>0){
$("#fileDownBtn").click();
}else{
getAffairViewModal(Number($(this).find(".affairKey").val()));
}
}
})
$(document).on('click', '#addAffairBtn', function (){
@ -219,14 +225,24 @@ $(document).on('click', '#fileDownBtn', function (){
alert("대상이 없습니다.");
return false;
}
if(selectedList.length===1){
downloadAffairFiles("/file/downloadAffairFiles?fileNm=" +
$(selectedList).parents("tr").find(".reportDt")[0].innerText + "_" +
$(selectedList).parents("tr").find(".reportTitle")[0].innerText +
"_&affairKeyList=", selectedList)
}else{
if(confirm("선택된 견문의 파일을 다운로드 하시겠습니까?")){
let url = "/file/downloadAffairFiles?affairKeyList="
downloadAffairFiles("/file/downloadAffairFiles?affairKeyList=", selectedList)
}
}
})
function downloadAffairFiles(url, selectedList){
$.each(selectedList, function(idx, chkBox){
url += $(chkBox).parents("tr").find(".affairKey").val()+",";
})
window.open(encodeURI(url));
}
})
}
$(document).on('click', '#deleteBtn', function (){
if(confirm("삭제하시겠습니까?\n되돌릴 수 없습니다.")){

View File

@ -5,6 +5,9 @@
<th:block layout:fragment="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}">
</th:block>
<div layout:fragment="content">
<main>
<input type="hidden" id="menuKey" value="55">

View File

@ -1,13 +1,5 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<style>
.scroll {
overflow-x: hidden;
overflow-y: auto;
height: 170px;
}
</style>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header">
<h4 class="modal-title" th:text="${info eq null?'예산항목 추가':'예산항목 수정'}"></h4>
<button type="button" class="btn btn-danger" data-bs-dismiss="modal" aria-hidden="true">x</button>
@ -22,9 +14,7 @@
<input type="hidden" id="prevNameL3" name="prevNameL3" th:value="${info?.nameL3}"/>
<input type="hidden" id="assignCount" name="assignCount" th:value="${#lists.size(list)}"/>
<input type="hidden" id="orgCount" name="orgCount" th:value="${#lists.size(downOrgList)}"/>
<div class="row ">
<div class="row col-10 ">
<div class="row">
<div class="col-auto">
<div class="input-group input-daterange" id="dateSelectorDiv">
<input type="text" class="form-control form-control-sm w-35 dateSelector" id="dt" name="dt"
@ -32,13 +22,14 @@
</div>
</div>
</div>
</div>
<table id="data-table-default" class="table table-striped table-bordered align-middle" style="width:2500px">
<div class="row">
<div class="col-12 overflow-auto" id="tableDiv">
<table id="data-table-default" class="table table-striped table-bordered text-nowrap align-middle">
<thead>
<tr class="table-secondary text-center">
<th rowspan="2">사업명</th>
<th rowspan="2">구분</th>
<th rowspan="2">세부내역</th>
<th class="budgetNameTh" rowspan="2">사업명</th>
<th class="budgetNameTh" rowspan="2">구분</th>
<th class="budgetNameTh" rowspan="2">세부내역</th>
<th rowspan="2">예산총액</th>
<th rowspan="2">예산총배정액<br/>(누적)</th>
<th:block th:each="orglist, i : ${downOrgList}">
@ -47,17 +38,17 @@
</tr>
<tr class="table-secondary text-center">
<th:block th:each="orglist : ${downOrgList}">
<th>기간배정액</th>
<th>금회배정액</th>
<th>누적액</th>
<th>&nbsp;&nbsp;&nbsp;&nbsp;기간배정액&nbsp;&nbsp;&nbsp;&nbsp;</th>
<th>&nbsp;&nbsp;&nbsp;&nbsp;금회배정액&nbsp;&nbsp;&nbsp;&nbsp;</th>
<th>&nbsp;&nbsp;&nbsp;&nbsp;누적액&nbsp;&nbsp;&nbsp;&nbsp;</th>
</th:block>
</tr>
</thead>
<tbody>
<tr class="odd gradeX reporterTr grid" th:each="info, i : ${list}">
<td th:text="${info.getbudget_name_l1}"></td>
<td th:text="${info.getbudget_name_l2}"></td>
<td th:text="${info.getbudget_name_l3}"></td>
<td class="table-secondary" th:text="${info.getbudget_name_l1}"></td>
<td class="table-secondary" th:text="${info.getbudget_name_l2}"></td>
<td class="table-secondary" th:text="${info.getbudget_name_l3}"></td>
<td th:text="${#numbers.formatInteger(info.getplan_amount,1,'COMMA')}" class="text-end"></td>
<td th:text="${#numbers.formatInteger(info.gettotal_assign_amount,1,'COMMA')}" class="text-end"></td>
<th:block th:each="orglist, j : ${downOrgList}">
@ -135,25 +126,20 @@
<td>
<input type="text" th:id="'org7_amount'+${i.index}" name="year" value="" class="w-100 text-end"
th:data-code="${info?.getbudget_code_l3}"
oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');"
/></td>
oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');"/>
</td>
<td th:text="${#numbers.formatInteger(info.getsum_assign_amount8,1,'COMMA')}" class="text-end"></td>
</th:block>
</th:block>
</tr>
</tbody>
</table>
<!-- </table>-->
</div>
</div>
</form>
</div>
<div class="modal-footer">
<!-- <a href="javascript:;" class="btn btn-yellow" id="tempBtn">임시저장</a> -->
<a href="javascript:;" class="btn btn-blue" id="assignSaveBtn">저장</a>
<a href="javascript:;" class="btn btn-blue" id="modifyBtn" th:if="${cmd eq 'update'}">수정</a>
<a href="javascript:;" class="btn btn-primary" id="assignSaveBtn">저장</a>
<a href="javascript:;" class="btn btn-primary" id="modifyBtn" th:if="${cmd eq 'update'}">수정</a>
</div>
<!--<div class="modal-footer">
<a class="btn btn-yellow">임시저장</a>
<a class="btn btn-success">결재</a>
<a class="btn btn-blue">작성</a>
</div>-->
</html>

View File

@ -108,17 +108,14 @@
<th>착수일<br>/종결일</th>
<th>재평가일</th>
<th>첨부파일</th>
<th>작성자</th>
<th>작성일시</th>
</tr>
</thead>
<tbody class="table-group-divider">
<tr class="ciWorkTr" th:each="ciWork,cnt:${ciWorkList}">
<input type="hidden" class="ciwKey" th:value="${ciWork.ciwKey}">
<td th:text="${cnt.count}"></td>
<td th:text="${searchParams.contentCnt-(searchParams.rowCnt*(searchParams.pageIndex-1))-cnt.count+1}"></td>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<td th:if="${ciWork.wrtOrgan eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>

View File

@ -54,12 +54,8 @@
</th>
</tr>
<tr class="table-secondary">
<th>
<th:block th:text="|${searchParams.year-1}년 개척 건 中|"></th:block>
</th>
<th>
<th:block th:text="|${searchParams.year}년 개척 건 中|"></th:block>
</th>
<th th:text="|${searchParams.year}년 개척 건 中|"></th>
<th th:text="|${searchParams.year-1}년 개척 건 中|"></th>
</tr>
</thead>
<tbody class="table-group-divider">
@ -74,8 +70,8 @@
</td>
<td th:text="${statistics.newWorkCnt}"></td>
<td th:text="${statistics.doingWorkCnt}"></td>
<td th:text="${statistics.prevYearWorkEndCnt}"></td>
<td th:text="${statistics.thisYearWorkEndCnt}"></td>
<td th:text="${statistics.prevYearWorkEndCnt}"></td>
</tr>
</tbody>
</table>

View File

@ -142,10 +142,7 @@
<tr class="table-secondary">
<th><input type="checkbox" class="allChk"></th>
<th>문서번호</th>
<th>분야1</th>
<th>분야2</th>
<th>분야3</th>
<th>분야4</th>
<th>분야</th>
<th>제목</th>
<th>관서</th>
<th>부서</th>
@ -153,8 +150,14 @@
<th>보고일자</th>
<th>첨부파일</th>
<th>상태</th>
<th:block th:if="page eq 'stayReport'">
<th>이전평가</th>
<th>평가</th>
</th:block>
<th:block th:unless="page eq 'stayReport'">
<th>평가</th>
<th>상보</th>
</th:block>
</tr>
</thead>
<tbody class="table-group-divider">
@ -164,25 +167,19 @@
<td th:text="${affair.docNo}"></td>
<td>
<th:block th:each="code:${session.commonCode.get('DC01')}">
<th:block th:if="${affair.affairType1 eq code.itemCd}" th:text="${code.itemValue}"></th:block>
<th:block th:if="${affair.affairType1 eq code.itemCd}" th:text="${#strings.concat(code.itemValue, ' > ')}"></th:block>
</th:block>
</td>
<td>
<th:block th:each="code:${session.commonCode.get('DC02')}">
<th:block th:if="${affair.affairType2 eq code.itemCd}" th:text="${code.itemValue}"></th:block>
<th:block th:if="${affair.affairType2 eq code.itemCd}" th:text="${#strings.concat(code.itemValue, ' > ')}"></th:block>
</th:block>
</td>
<td>
<th:block th:each="code:${session.commonCode.get('DC03')}">
<th:block th:if="${affair.affairType3 eq code.itemCd}" th:text="${code.itemValue}"></th:block>
<th:block th:if="${affair.affairType3 eq code.itemCd}" th:text="${#strings.concat(code.itemValue, ' > ')}"></th:block>
</th:block>
</td>
<td>
<th:block th:each="code:${session.commonCode.get('DC04')}">
<th:block th:if="${affair.affairType4 eq code.itemCd}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td th:text="${affair.title}"></td>
<td class="reportTitle" th:text="${affair.title}"></td>
<td>
<th:block th:each="code:${session.commonCode.get('OG')}">
<th:block th:if="${affair.wrtOrgan eq code.itemCd}" th:text="${code.itemValue}"></th:block>
@ -194,8 +191,10 @@
</th:block>
</td>
<td th:text="${affair.wrtUserNm}"></td>
<td th:text="${#temporals.format(affair.reportDt, 'yyyy-MM-dd')}"></td>
<td th:text="${affair.fileCnt eq null?'파일 없음':#strings.concat(affair.fileCnt,' 건')}"></td>
<td class="reportDt" th:text="${#temporals.format(affair.reportDt, 'yyyy-MM-dd')}"></td>
<th:block th:with="fileYn=${affair.fileCnt eq null}">
<td th:class="${fileYn?'':'fileTd'}" th:text="${fileYn?'파일 없음':#strings.concat(affair.fileCnt,' 건')}"></td>
</th:block>
<td>
<th:block th:each="code:${session.commonCode.get('DST')}">
<th:block th:if="${affair.affairStatus eq code.itemCd}" th:text="${code.itemValue}"></th:block>
@ -210,12 +209,13 @@
<td th:text="${affair.organUp eq 'T'?'O':(affair.wrtOrgan ne affair.ratingOrgan?'O':'X')}"></td>
</th:block>
<th:block th:if="${page eq 'stayReport'}">
<td th:text="${affair.beforeRating}"></td>
<th:block th:if="${apprvAuth ne null and affair.affairStatus eq 'DST002'
and (#strings.contains(apprvAuth, 'APC004') or #strings.contains(apprvAuth, 'APC003'))}">
<!--결재권한 있고 결재대기상태이면서 결재권한이 계장, 계장대행을 가지고있는 경우-->
<!--결재대기상태이면서 결재권한이 계장, 계장대행을 가지고있는 경우-->
<th:block th:if="${#strings.contains(apprvAuth, 'APC002') or #strings.contains(apprvAuth, 'APC001')}">
<!--과장, 과장대행 결재권한을 가지고 있는 경우-->
<td colspan="2" class="apprvTd">
<td class="apprvTd">
<input type="hidden" class="affairKey" th:value="${affair.affairKey}">
<div class="row justify-content-center">
<div class="col-auto">
@ -243,7 +243,7 @@
</th:block>
<th:block th:unless="${#strings.contains(apprvAuth, 'APC002') or #strings.contains(apprvAuth, 'APC001')}">
<!--과장, 과장대행 결재권한을 가지고 있지 않은 경우-->
<td colspan="2" class="apprvTd">
<td class="apprvTd">
<input type="hidden" class="affairKey" th:value="${affair.affairKey}">
<input type="radio" class="apprvChkbox" th:id="|apprvChkbox${affair.affairKey}DST004|" th:name="|apprvChkbox${affair.affairKey}|" value="DST004">
<label th:for="|apprvChkbox${affair.affairKey}DST004|">결재</label>
@ -257,7 +257,7 @@
<th:block th:if="${apprvAuth ne null and affair.affairStatus eq 'DST004'
and (#strings.contains(apprvAuth, 'APC002') or #strings.contains(apprvAuth, 'APC001'))}">
<!--결재권한 있고 계장결재완료 상태이면서 결재권한이 과장, 과장대행을 가지고있는 경우-->
<td colspan="2" class="apprvTd">
<td class="apprvTd">
<input type="hidden" class="affairKey" th:value="${affair.affairKey}">
<div class="row justify-content-center">
<div class="col-auto">