강석 최 2022-10-21 18:06:45 +09:00
commit 19bbfaa5fd
10 changed files with 737 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import com.dbnt.faisp.authMgt.service.AuthMgtService;
import com.dbnt.faisp.codeMgt.service.CodeMgtService;
import com.dbnt.faisp.fpiMgt.affair.model.AffairBoard;
import com.dbnt.faisp.fpiMgt.affair.model.AffairRating;
import com.dbnt.faisp.fpiMgt.affair.model.TypeStatistics;
import com.dbnt.faisp.fpiMgt.affair.service.AffairService;
import com.dbnt.faisp.userInfo.model.UserInfo;
import lombok.RequiredArgsConstructor;
@ -16,6 +17,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -228,4 +230,70 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관
public Integer affairStateChange(@AuthenticationPrincipal UserInfo loginUser, @RequestBody List<AffairRating> ratingList){
return affairService.affairStateChange(loginUser, ratingList);
}
@GetMapping("/statistics")
public ModelAndView statistics(@AuthenticationPrincipal UserInfo loginUser, TypeStatistics typeStatistics){
ModelAndView mav = new ModelAndView("igActivities/fpiMgt/affair/affairStatistics");
List<TypeStatistics> type1 = affairService.selectType1List(typeStatistics);
List<TypeStatistics> type2 = affairService.selectType2List(typeStatistics);
List<TypeStatistics> type3 = affairService.selectType3List(typeStatistics);
List<TypeStatistics> type4 = affairService.selectType4List(typeStatistics);
List<TypeStatistics> totalList = affairService.selectStatusTotal(typeStatistics);
List<TypeStatistics> type1List = affairService.selecType1ListCnt(typeStatistics);
List<TypeStatistics> type2List = affairService.selecType2ListCnt(typeStatistics);
List<TypeStatistics> type3List = affairService.selecType3ListCnt(typeStatistics);
List<TypeStatistics> type4List = affairService.selecType4ListCnt(typeStatistics);
if(!totalList.isEmpty()) {
TypeStatistics total = new TypeStatistics();
total.setItemValue("누계");
total.setWrtOrgan("total");
total.setCnt(0);
for(TypeStatistics stat: totalList) {
total.setCnt(total.getCnt()+stat.getCnt());
}
totalList.add(total);
}
mav.addObject("totalList", totalList);
type1List = addTotalRow(type1, type1List);
type2List = addTotalRow(type2, type2List);
type3List = addTotalRow(type3, type3List);
type4List = addTotalRow(type4, type4List);
mav.addObject("type1", type1);
mav.addObject("type2", type2);
mav.addObject("type3", type3);
mav.addObject("type4", type4);
mav.addObject("type1List", type1List);
mav.addObject("type2List", type2List);
mav.addObject("type3List", type3List);
mav.addObject("type4List", type4List);
mav.addObject("searchParams", typeStatistics);
//메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/translator/info").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
mav.addObject("mgtOrganList", loginUser.getDownOrganCdList());
return mav;
}
private List<TypeStatistics> addTotalRow(List<TypeStatistics> type, List<TypeStatistics> typeList){
Map<String, Integer> totalMap = new HashMap<>();
for(TypeStatistics t: type) {
totalMap.put(t.getAffairType(), 0);
}
for(TypeStatistics t: typeList) {
totalMap.put(t.getAffairType(), totalMap.get(t.getAffairType())+t.getCnt());
}
Iterator<String> keys = totalMap.keySet().iterator();
while(keys.hasNext()) {
String affairType = keys.next();
Integer cnt = totalMap.get(affairType);
TypeStatistics total = new TypeStatistics();
total.setWrtOrgan("total");
total.setAffairType(affairType);
total.setCnt(cnt);
typeList.add(total);
}
return typeList;
}
}

View File

@ -1,6 +1,8 @@
package com.dbnt.faisp.fpiMgt.affair.mapper;
import com.dbnt.faisp.fpiMgt.affair.model.AffairBoard;
import com.dbnt.faisp.fpiMgt.affair.model.TypeStatistics;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@ -13,4 +15,22 @@ public interface AffairMapper {
Integer selectAffairBoardCnt(AffairBoard affair);
String selectHashTags(Integer affairKey);
List<TypeStatistics> selectType1List(TypeStatistics typeStatistics);
List<TypeStatistics> selectType2List(TypeStatistics typeStatistics);
List<TypeStatistics> selectType3List(TypeStatistics typeStatistics);
List<TypeStatistics> selectType4List(TypeStatistics typeStatistics);
List<TypeStatistics> selectStatusTotal(TypeStatistics typeStatistics);
List<TypeStatistics> selecType1ListCnt(TypeStatistics typeStatistics);
List<TypeStatistics> selecType2ListCnt(TypeStatistics typeStatistics);
List<TypeStatistics> selecType3ListCnt(TypeStatistics typeStatistics);
List<TypeStatistics> selecType4ListCnt(TypeStatistics typeStatistics);
}

View File

@ -0,0 +1,48 @@
package com.dbnt.faisp.fpiMgt.affair.model;
import com.dbnt.faisp.config.BaseModel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.List;
import javax.persistence.*;
@Getter
@Setter
@NoArgsConstructor
public class TypeStatistics extends BaseModel {
@Transient
private String wrtOrgan;
@Transient
private String itemValue;
@Transient
private String affairType;
@Transient
private Integer cnt;
@Transient
private List<String> category1;
@Transient
private List<String> category2;
@Transient
private List<String> category3;
@Transient
private List<String> category4;
@Transient
private List<String> organList;
@Override
public String toString() {
return "TypeStatistics [wrtOrgan=" + wrtOrgan + ", itemValue=" + itemValue + ", affairType=" + affairType + ", cnt="
+ cnt + ", category1=" + category1 + "]";
}
}

View File

@ -156,4 +156,40 @@ public class AffairService extends BaseService { // 견문보고
public FileInfo selectAffairFile(Integer parentKey, Integer fileSeq) {
return affairFileRepository.findById(new AffairFile.AffairFileId(parentKey, fileSeq)).orElse(null);
}
public List<TypeStatistics> selectType1List(TypeStatistics typeStatistics) {
return affairMapper.selectType1List(typeStatistics);
}
public List<TypeStatistics> selectType2List(TypeStatistics typeStatistics) {
return affairMapper.selectType2List(typeStatistics);
}
public List<TypeStatistics> selectType3List(TypeStatistics typeStatistics) {
return affairMapper.selectType3List(typeStatistics);
}
public List<TypeStatistics> selectType4List(TypeStatistics typeStatistics) {
return affairMapper.selectType4List(typeStatistics);
}
public List<TypeStatistics> selectStatusTotal(TypeStatistics typeStatistics) {
return affairMapper.selectStatusTotal(typeStatistics);
}
public List<TypeStatistics> selecType1ListCnt(TypeStatistics typeStatistics) {
return affairMapper.selecType1ListCnt(typeStatistics);
}
public List<TypeStatistics> selecType2ListCnt(TypeStatistics typeStatistics) {
return affairMapper.selecType2ListCnt(typeStatistics);
}
public List<TypeStatistics> selecType3ListCnt(TypeStatistics typeStatistics) {
return affairMapper.selecType3ListCnt(typeStatistics);
}
public List<TypeStatistics> selecType4ListCnt(TypeStatistics typeStatistics) {
return affairMapper.selecType4ListCnt(typeStatistics);
}
}

View File

@ -117,4 +117,312 @@
where a.affair_key = #{affairKey}
group by a.affair_key) aa
</select>
<select id="selectType1List" resultType="TypeStatistics" parameterType="TypeStatistics">
select item_cd as affairType,
item_value
from code_mgt
where category_cd = 'DC01'
<choose>
<when test='category1 != null and category1 != ""'>
and item_cd in
<foreach collection="category1" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
<otherwise>
and item_cd not in (select item_cd from code_mgt where category_cd = 'DC01')
</otherwise>
</choose>
order by affairType asc
</select>
<select id="selectType2List" resultType="TypeStatistics" parameterType="TypeStatistics">
select item_cd as affairType,
item_value
from code_mgt
where category_cd = 'DC02'
<choose>
<when test='category2 != null and category2 != ""'>
and item_cd in
<foreach collection="category2" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
<otherwise>
and item_cd not in (select item_cd from code_mgt where category_cd = 'DC02')
</otherwise>
</choose>
order by affairType asc
</select>
<select id="selectType3List" resultType="TypeStatistics" parameterType="TypeStatistics">
select item_cd as affairType,
item_value
from code_mgt
where category_cd = 'DC03'
<choose>
<when test='category3 != null and category3 != ""'>
and item_cd in
<foreach collection="category3" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
<otherwise>
and item_cd not in (select item_cd from code_mgt where category_cd = 'DC03')
</otherwise>
</choose>
order by affairType asc
</select>
<select id="selectType4List" resultType="TypeStatistics" parameterType="TypeStatistics">
select item_cd as affairType,
item_value
from code_mgt
where category_cd = 'DC04'
<choose>
<when test='category4 != null and category4 != ""'>
and item_cd in
<foreach collection="category4" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
<otherwise>
and item_cd not in (select item_cd from code_mgt where category_cd = 'DC04')
</otherwise>
</choose>
order by affairType asc
</select>
<select id="selectStatusTotal" resultType="TypeStatistics" parameterType="TypeStatistics">
select item_cd as wrt_organ,
item_value,
coalesce(cnt,0) as cnt
from(
select item_cd,
item_value
from code_mgt
where category_cd = 'OG'
and use_chk = 'T'
<choose>
<when test='organList != null and organList != ""'>
and item_cd in
<foreach collection="organList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
<otherwise>
and item_cd not in (select item_cd from code_mgt where category_cd = 'OG' and use_chk = 'T')
</otherwise>
</choose>
order by item_cd asc) a left outer join
(select wrt_organ,
count(*) as cnt
from affair_board
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test='category1 != null and category1 != ""'>
or affair_type1 in
<foreach collection="category1" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</if>
<if test='category2 != null and category2 != ""'>
or affair_type2 in
<foreach collection="category2" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</if>
<if test='category3 != null and category3 != ""'>
or affair_type3 in
<foreach collection="category3" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</if>
<if test='category4 != null and category4 != ""'>
or affair_type4 in
<foreach collection="category4" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</if>
</trim>
group by wrt_organ)b on
a.item_cd = b.wrt_organ
order by wrt_organ asc
</select>
<select id="selecType1ListCnt" resultType="TypeStatistics" parameterType="TypeStatistics">
select b.item_cd as wrt_organ ,
b.item_value,
a.item_cd as affair_type,
coalesce(cnt,0) as cnt
from
(select item_cd,
item_value
from code_mgt
where category_cd = 'DC01'
<choose>
<when test='category1 != null and category1 != ""'>
and item_cd in
<foreach collection="category1" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
<otherwise>
and item_cd not in (select item_cd from code_mgt where category_cd = 'DC01')
</otherwise>
</choose>
)a left join
(select item_cd,
item_value
from code_mgt
where category_cd = 'OG'
and use_chk = 'T'
<if test='organList != null and organList != ""'>
and item_cd in
<foreach collection="organList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</if>
order by item_cd asc) b on 1=1
left outer join
(select wrt_organ,
affair_type1 as affair_type,
count(*) as cnt
from affair_board
group by wrt_organ,affair_type1) c
on a.item_cd = c.affair_type and b.item_cd = c.wrt_organ
order by wrt_organ,affair_type asc
</select>
<select id="selecType2ListCnt" resultType="TypeStatistics" parameterType="TypeStatistics">
select b.item_cd as wrt_organ ,
b.item_value,
a.item_cd as affair_type,
coalesce(cnt,0) as cnt
from
(select item_cd,
item_value
from code_mgt
where category_cd = 'DC02'
<choose>
<when test='category2 != null and category2 != ""'>
and item_cd in
<foreach collection="category2" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
<otherwise>
and item_cd not in (select item_cd from code_mgt where category_cd = 'DC02')
</otherwise>
</choose>
)a left join
(select item_cd,
item_value
from code_mgt
where category_cd = 'OG'
and use_chk = 'T'
<if test='organList != null and organList != ""'>
and item_cd in
<foreach collection="organList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</if>
order by item_cd asc) b on 1=1
left outer join
(select wrt_organ,
affair_type2 as affair_type,
count(*) as cnt
from affair_board
group by wrt_organ,affair_type2) c
on a.item_cd = c.affair_type and b.item_cd = c.wrt_organ
order by wrt_organ,affair_type asc
</select>
<select id="selecType3ListCnt" resultType="TypeStatistics" parameterType="TypeStatistics">
select b.item_cd as wrt_organ ,
b.item_value,
a.item_cd as affair_type,
coalesce(cnt,0) as cnt
from
(select item_cd,
item_value
from code_mgt
where category_cd = 'DC03'
<choose>
<when test='category3 != null and category3 != ""'>
and item_cd in
<foreach collection="category3" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
<otherwise>
and item_cd not in (select item_cd from code_mgt where category_cd = 'DC03')
</otherwise>
</choose>
)a left join
(select item_cd,
item_value
from code_mgt
where category_cd = 'OG'
and use_chk = 'T'
<if test='organList != null and organList != ""'>
and item_cd in
<foreach collection="organList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</if>
order by item_cd asc) b on 1=1
left outer join
(select wrt_organ,
affair_type3 as affair_type,
count(*) as cnt
from affair_board
group by wrt_organ,affair_type3) c
on a.item_cd = c.affair_type and b.item_cd = c.wrt_organ
order by wrt_organ,affair_type asc
</select>
<select id="selecType4ListCnt" resultType="TypeStatistics" parameterType="TypeStatistics">
select b.item_cd as wrt_organ ,
b.item_value,
a.item_cd as affair_type,
coalesce(cnt,0) as cnt
from
(select item_cd,
item_value
from code_mgt
where category_cd = 'DC04'
<choose>
<when test='category4 != null and category4 != ""'>
and item_cd in
<foreach collection="category4" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</when>
<otherwise>
and item_cd not in (select item_cd from code_mgt where category_cd = 'DC04')
</otherwise>
</choose>
)a left join
(select item_cd,
item_value
from code_mgt
where category_cd = 'OG'
and use_chk = 'T'
<if test='organList != null and organList != ""'>
and item_cd in
<foreach collection="organList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</if>
order by item_cd asc) b on 1=1
left outer join
(select wrt_organ,
affair_type4 as affair_type,
count(*) as cnt
from affair_board
group by wrt_organ,affair_type4) c
on a.item_cd = c.affair_type and b.item_cd = c.wrt_organ
order by wrt_organ,affair_type asc
</select>
</mapper>

View File

@ -0,0 +1,52 @@
$(document).on('click', '#downExcel', function (){
exportExcel();
})
function exportExcel(){
// step 1. workbook 생성
var wb = XLSX.utils.book_new();
// step 2. 시트 만들기
var newWorksheet = excelHandler.getWorksheet();
// step 3. workbook에 새로만든 워크시트에 이름을 주고 붙인다.
XLSX.utils.book_append_sheet(wb, newWorksheet, excelHandler.getSheetName());
// step 4. 엑셀 파일 만들기
var wbout = XLSX.write(wb, {bookType:'xlsx', type: 'binary'});
// step 5. 엑셀 파일 내보내기
saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), excelHandler.getExcelFileName());
}
var excelHandler = {
getExcelFileName : function(){
return '견문통계'+'_'+getToday()+'.xlsx'; //파일명
},
getSheetName : function(){
return 'Table Test Sheet'; //시트명
},
getExcelData : function(){
return document.getElementById('tableData'); //TABLE id
},
getWorksheet : function(){
return XLSX.utils.table_to_sheet(this.getExcelData());
}
}
function s2ab(s) {
var buf = new ArrayBuffer(s.length); //convert s to arrayBuffer
var view = new Uint8Array(buf); //create uint8array as viewer
for (var i=0; i<s.length; i++) view[i] = s.charCodeAt(i) & 0xFF; //convert to octet
return buf;
}
function getToday(){
var date = new Date();
var year = date.getFullYear();
var month = ("0" + (1 + date.getMonth())).slice(-2);
var day = ("0" + date.getDate()).slice(-2);
return year + "-" + month + "-" + day;
}

View File

@ -0,0 +1,2 @@
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
var saveAs=saveAs||function(e){"use strict";if(typeof e==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),o="download"in r,a=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},i=/constructor/i.test(e.HTMLElement)||e.safari,f=/CriOS\/[\d]+/.test(navigator.userAgent),u=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},s="application/octet-stream",d=1e3*40,c=function(e){var t=function(){if(typeof e==="string"){n().revokeObjectURL(e)}else{e.remove()}};setTimeout(t,d)},l=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var o=e["on"+t[r]];if(typeof o==="function"){try{o.call(e,n||e)}catch(a){u(a)}}}},p=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob([String.fromCharCode(65279),e],{type:e.type})}return e},v=function(t,u,d){if(!d){t=p(t)}var v=this,w=t.type,m=w===s,y,h=function(){l(v,"writestart progress write writeend".split(" "))},S=function(){if((f||m&&i)&&e.FileReader){var r=new FileReader;r.onloadend=function(){var t=f?r.result:r.result.replace(/^data:[^;]*;/,"data:attachment/file;");var n=e.open(t,"_blank");if(!n)e.location.href=t;t=undefined;v.readyState=v.DONE;h()};r.readAsDataURL(t);v.readyState=v.INIT;return}if(!y){y=n().createObjectURL(t)}if(m){e.location.href=y}else{var o=e.open(y,"_blank");if(!o){e.location.href=y}}v.readyState=v.DONE;h();c(y)};v.readyState=v.INIT;if(o){y=n().createObjectURL(t);setTimeout(function(){r.href=y;r.download=u;a(r);h();c(y);v.readyState=v.DONE});return}S()},w=v.prototype,m=function(e,t,n){return new v(e,t||e.name||"download",n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){t=t||e.name||"download";if(!n){e=p(e)}return navigator.msSaveOrOpenBlob(e,t)}}w.abort=function(){};w.readyState=w.INIT=0;w.WRITING=1;w.DONE=2;w.error=w.onwritestart=w.onprogress=w.onwrite=w.onabort=w.onerror=w.onwriteend=null;return m}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!==null){define("FileSaver.js",function(){return saveAs})}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,177 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"
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/igActivities/fpiMgt/affair/statistics.js}"></script>
</th:block>
<div layout:fragment="content">
<main class="pt-3">
<h4>견문통계</h4>
<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 text-center">
<div class="card-body">
<div class="col-auto">
<button id="downExcel">엑셀다운</button>
</div>
<div class="tab-content border border-top-0 p-2">
<form id="searchFm" method="get" th:action="@{/affair/statistics}">
<div class="row pe-3 py-1">
<div class="col-auto">
<div class="input-group w-auto input-daterange" id="dateSelectorDiv">
<input type="text" class="form-control form-control-sm" id="startDate" name="startDate" placeholder="시작일" autocomplete="off" readonly th:value="${searchParams.startDate}">
<input type="text" class="form-control form-control-sm" id="endDate" name="endDate" placeholder="종료일" autocomplete="off" readonly th:value="${searchParams.endDate}">
</div>
</div>
<div class="col-auto">
<ul class="select_list" th:each="commonCode:${session.commonCode.get('OG')}">
<th:block th:if="${#lists.contains(mgtOrganList, commonCode.itemCd)}">
<li>
<input id="category11" name="organList" type="checkbox" th:value="${commonCode.itemCd}" th:if="${#lists.isEmpty(searchParams.organList)}">
<input id="category11" name="organList" type="checkbox" th:value="${commonCode.itemCd}" th:checked="${#lists.contains(searchParams.organList, commonCode.itemCd)}" th:unless="${#lists.isEmpty(searchParams.organList)}">
<label th:text="${commonCode.itemValue}"></label>
</li>
</th:block>
</ul>
</th:block>
</div>
<div class="row justify-content-end pb-1">
<div class="col-auto" style="overflow: auto">
<ul class="select_list" th:each="commonCode:${session.commonCode.get('DC01')}">
<li>
<input th:id="|category1${commonCode.itemCd}|" name="category1" type="checkbox" th:value="${commonCode.itemCd}" th:if="${#lists.isEmpty(searchParams.category1)}">
<input th:id="|category1${commonCode.itemCd}|" name="category1" type="checkbox" th:value="${commonCode.itemCd}" th:checked="${#lists.contains(searchParams.category1, commonCode.itemCd)}" th:unless="${#lists.isEmpty(searchParams.category1)}">
<label th:for="|category1${commonCode.itemCd}|" th:text="${commonCode.itemValue}"></label>
</li>
</ul>
</div>
<div class="col-auto">
<ul class="select_list" th:each="commonCode:${session.commonCode.get('DC02')}">
<li>
<input id="category11" name="category2" type="checkbox" th:value="${commonCode.itemCd}" th:if="${#lists.isEmpty(searchParams.category2)}">
<input id="category11" name="category2" type="checkbox" th:value="${commonCode.itemCd}" th:checked="${#lists.contains(searchParams.category2, commonCode.itemCd)}" th:unless="${#lists.isEmpty(searchParams.category2)}">
<label th:text="${commonCode.itemValue}"></label>
</li>
</ul>
</div>
<div class="col-auto">
<ul class="select_list" th:each="commonCode:${session.commonCode.get('DC03')}">
<li>
<input id="category11" name="category3" type="checkbox" th:value="${commonCode.itemCd}" th:if="${#lists.isEmpty(searchParams.category3)}">
<input id="category11" name="category3" type="checkbox" th:value="${commonCode.itemCd}" th:checked="${#lists.contains(searchParams.category3, commonCode.itemCd)}" th:unless="${#lists.isEmpty(searchParams.category3)}">
<label th:text="${commonCode.itemValue}"></label>
</li>
</ul>
</div>
<div class="col-auto">
<ul class="select_list" th:each="commonCode:${session.commonCode.get('DC04')}">
<li>
<input id="category11" name="category4" type="checkbox" th:value="${commonCode.itemCd}" th:if="${#lists.isEmpty(searchParams.category4)}">
<input id="category11" name="category4" type="checkbox" th:value="${commonCode.itemCd}" th:checked="${#lists.contains(searchParams.category4, commonCode.itemCd)}" th:unless="${#lists.isEmpty(searchParams.category4)}">
<label th:text="${commonCode.itemValue}"></label>
</li>
</ul>
</div>
</div>
<div class="col-1 d-grid gap-2">
<input type="submit" class="btn btn-lg btn-primary col-auto" id="searchBtn" value="검색">
</div>
</div>
</form>
<div class="row justify-content-start">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="row">
<table class="table table-hover" id="tableData">
<thead>
<tr>
<th rowspan="2">구분</th>
<th rowspan="2">누계</th>
<th:block th:unless="${#lists.isEmpty(type1)}">
<th th:colspan="${type1.size()}">분류1</th>
</th:block>
<th:block th:unless="${#lists.isEmpty(type2)}">
<th th:colspan="${type2.size()}">분류2</th>
</th:block>
<th:block th:unless="${#lists.isEmpty(type3)}">
<th th:colspan="${type3.size()}">분류3</th>
</th:block>
<th:block th:unless="${#lists.isEmpty(type4)}">
<th th:colspan="${type4.size()}">분류4</th>
</th:block>
</tr>
<tr>
<th:block th:unless="${#lists.isEmpty(type1)}">
<th:block th:each="type1:${type1}">
<th th:text="${type1.itemValue}"></th>
</th:block>
</th:block>
<th:block th:unless="${#lists.isEmpty(type2)}">
<th:block th:each="type2:${type2}">
<th th:text="${type2.itemValue}"></th>
</th:block>
</th:block>
<th:block th:unless="${#lists.isEmpty(type3)}">
<th:block th:each="type3:${type3}">
<th th:text="${type3.itemValue}"></th>
</th:block>
</th:block>
<th:block th:unless="${#lists.isEmpty(type4)}">
<th:block th:each="type4:${type4}">
<th th:text="${type4.itemValue}"></th>
</th:block>
</th:block>
</tr>
</thead>
<tbody>
<th:block th:each="total:${totalList}">
<tr>
<td th:text="${total.itemValue}"></td>
<td th:text="${total.cnt}"></td>
<th:block th:each="commonCode:${type1}">
<th:block th:each="type1:${type1List}">
<th:block th:if="${type1.affairType eq commonCode.affairType} and ${total.wrtOrgan eq type1.wrtOrgan}">
<td th:text="${type1.cnt}"></td>
</th:block>
</th:block>
</th:block>
<th:block th:each="commonCode:${type2}">
<th:block th:each="type2:${type2List}">
<th:block th:if="${type2.affairType eq commonCode.affairType} and ${total.wrtOrgan eq type2.wrtOrgan}">
<td th:text="${type2.cnt}"></td>
</th:block>
</th:block>
</th:block>
<th:block th:each="commonCode:${type3}">
<th:block th:each="type3:${type3List}">
<th:block th:if="${type3.affairType eq commonCode.affairType} and ${total.wrtOrgan eq type3.wrtOrgan}">
<td th:text="${type3.cnt}"></td>
</th:block>
</th:block>
</th:block>
<th:block th:each="commonCode:${type4}">
<th:block th:each="type4:${type4List}">
<th:block th:if="${type4.affairType eq commonCode.affairType} and ${total.wrtOrgan eq type4.wrtOrgan}">
<td th:text="${type4.cnt}"></td>
</th:block>
</th:block>
</th:block>
</tr>
</th:block>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
</html>

View File

@ -29,6 +29,9 @@
<!--summernote-->
<script type="text/javascript" th:src="@{/vendor/summernote-0.8.18-dist/summernote-lite.min.js}"></script>
<script type="text/javascript" th:src="@{/vendor/summernote-0.8.18-dist/lang/summernote-ko-KR.min.js}"></script>
<!--sheetJs(excel)-->
<script type="text/javascript" th:src="@{/vendor/excel/FileSaver.min.js}"></script>
<script type="text/javascript" th:src="@{/vendor/excel/xlsx.full.min.js}"></script>
<script type="text/javascript" th:src="@{/js/common.js}"></script>
<!-- 컨텐츠페이지의 스크립트 영역이 들어감 -->