방첩공작 작업완료
parent
215c45ccdd
commit
df1801fe70
|
|
@ -2,6 +2,7 @@ package com.dbnt.faisp.main.counterIntelligence;
|
|||
|
||||
import com.dbnt.faisp.main.authMgt.service.AuthMgtService;
|
||||
import com.dbnt.faisp.main.codeMgt.service.CodeMgtService;
|
||||
import com.dbnt.faisp.main.counterIntelligence.model.CiWorkStatistics;
|
||||
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork;
|
||||
import com.dbnt.faisp.main.counterIntelligence.service.CounterIntelligenceService;
|
||||
import com.dbnt.faisp.main.userInfo.model.UserInfo;
|
||||
|
|
@ -58,7 +59,9 @@ public class CounterIntelligenceController {
|
|||
}else{
|
||||
ciWork = ciService.selectCounterIntelligenceWork(ciWork.getCiwKey());
|
||||
}
|
||||
|
||||
String accessAuth = authMgtService.selectAccessConfigList
|
||||
(loginUser.getUserSeq(), "/counterIntelligence/ciWorkList").get(0).getAccessAuth();
|
||||
mav.addObject("accessAuth", accessAuth);
|
||||
mav.addObject("atCodeList", codeMgtService.selectCodeMgtList("AT"));
|
||||
mav.addObject("at2CodeList", ciWork.getCiwKey()!=null?codeMgtService.selectCodeMgtList(ciWork.getArrestType1()):null);
|
||||
mav.addObject("ciWork", ciWork);
|
||||
|
|
@ -70,6 +73,9 @@ public class CounterIntelligenceController {
|
|||
ModelAndView mav = new ModelAndView("counterIntelligence/ciWorkViewModal");
|
||||
mav.addObject("lineSeparator", '\n');
|
||||
mav.addObject("viewUserSeq", loginUser.getUserSeq());
|
||||
String accessAuth = authMgtService.selectAccessConfigList
|
||||
(loginUser.getUserSeq(), "/counterIntelligence/ciWorkList").get(0).getAccessAuth();
|
||||
mav.addObject("accessAuth", accessAuth);
|
||||
mav.addObject("ciWork", ciService.selectCounterIntelligenceWork(ciWork.getCiwKey()));
|
||||
return mav;
|
||||
}
|
||||
|
|
@ -80,4 +86,25 @@ public class CounterIntelligenceController {
|
|||
ciWork.setMultipartFileList(request.getMultiFileMap().get("uploadFiles"));
|
||||
return ciService.saveCiWork(ciWork, deleteFileSeq);
|
||||
}
|
||||
@PostMapping("/deleteCiWork")
|
||||
public Integer deleteCiWork(@AuthenticationPrincipal UserInfo loginUser, CounterIntelligenceWork ciWork){
|
||||
String accessAuth = authMgtService.selectAccessConfigList
|
||||
(loginUser.getUserSeq(), "/counterIntelligence/ciWorkList").get(0).getAccessAuth();
|
||||
if(accessAuth.equals("ACC003")){
|
||||
return ciService.deleteCiWork(ciWork.getCiwKey());
|
||||
}else{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@GetMapping("/CiWorkStatistics")
|
||||
public ModelAndView ciWorkStatistics(CiWorkStatistics ciWorkStatistics){
|
||||
if(ciWorkStatistics.getYear()==null){
|
||||
ciWorkStatistics.setYear(LocalDateTime.now().getYear());
|
||||
}
|
||||
ModelAndView mav = new ModelAndView("/counterIntelligence/ciWorkStatistics");
|
||||
mav.addObject("yearList", ciService.selectCiWorkYearList());
|
||||
mav.addObject("ciWorkStatisticsList", ciService.selectCiWorkStatisticsList(ciWorkStatistics));
|
||||
mav.addObject("searchParams", ciWorkStatistics);
|
||||
return mav;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.dbnt.faisp.main.counterIntelligence.mapper;
|
||||
|
||||
import com.dbnt.faisp.main.counterIntelligence.model.CiWorkStatistics;
|
||||
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork;
|
||||
import com.dbnt.faisp.main.faRpt.model.FaRptBoard;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
|
@ -15,4 +16,8 @@ public interface CounterIntelligenceMapper {
|
|||
Integer selectCounterIntelligenceWorkCnt(CounterIntelligenceWork ciWork);
|
||||
|
||||
String selectHashTags(Integer ciwKey);
|
||||
|
||||
List<CiWorkStatistics> selectCiWorkStatisticsList(CiWorkStatistics ciWorkStatistics);
|
||||
|
||||
List<Integer> selectCiWorkYearList();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
package com.dbnt.faisp.main.counterIntelligence.model;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
public class CiWorkStatistics {
|
||||
|
||||
private String workRating;
|
||||
|
||||
private Integer newWorkCnt=0;
|
||||
private Integer doingWorkCnt=0;
|
||||
private Integer prevYearWorkEndCnt=0;
|
||||
private Integer thisYearWorkEndCnt=0;
|
||||
|
||||
private Integer year;
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@ package com.dbnt.faisp.main.counterIntelligence.service;
|
|||
import com.dbnt.faisp.config.BaseService;
|
||||
import com.dbnt.faisp.config.FileInfo;
|
||||
import com.dbnt.faisp.main.counterIntelligence.mapper.CounterIntelligenceMapper;
|
||||
import com.dbnt.faisp.main.counterIntelligence.model.CiWorkStatistics;
|
||||
import com.dbnt.faisp.main.counterIntelligence.model.CiwFile;
|
||||
import com.dbnt.faisp.main.counterIntelligence.model.CounterIntelligenceWork;
|
||||
import com.dbnt.faisp.main.counterIntelligence.model.HashTagLinkCiw;
|
||||
|
|
@ -104,4 +105,28 @@ public class CounterIntelligenceService extends BaseService {
|
|||
public FileInfo selectCiWorkFile(Integer ciwKey, Integer fileSeq) {
|
||||
return ciwFileRepository.findById(new CiwFile.CiwFileId(ciwKey, fileSeq)).orElse(null);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public Integer deleteCiWork(Integer ciwKey) {
|
||||
CounterIntelligenceWork ciWork = ciwRepository.findById(ciwKey).orElse(null);
|
||||
ciWork.setStatus("DST008");
|
||||
return ciwKey;
|
||||
}
|
||||
|
||||
public List<Integer> selectCiWorkYearList() {
|
||||
return ciMapper.selectCiWorkYearList();
|
||||
}
|
||||
|
||||
public List<CiWorkStatistics> selectCiWorkStatisticsList(CiWorkStatistics ciWorkStatistics) {
|
||||
List<CiWorkStatistics> ciWorkStatisticsList = ciMapper.selectCiWorkStatisticsList(ciWorkStatistics);
|
||||
CiWorkStatistics totalStatistics = new CiWorkStatistics();
|
||||
for(CiWorkStatistics statistics: ciWorkStatisticsList){
|
||||
totalStatistics.setNewWorkCnt(totalStatistics.getNewWorkCnt()+statistics.getNewWorkCnt());
|
||||
totalStatistics.setDoingWorkCnt(totalStatistics.getDoingWorkCnt()+statistics.getDoingWorkCnt());
|
||||
totalStatistics.setPrevYearWorkEndCnt(totalStatistics.getPrevYearWorkEndCnt()+statistics.getPrevYearWorkEndCnt());
|
||||
totalStatistics.setThisYearWorkEndCnt(totalStatistics.getThisYearWorkEndCnt()+statistics.getThisYearWorkEndCnt());
|
||||
}
|
||||
ciWorkStatisticsList.add(totalStatistics);
|
||||
return ciWorkStatisticsList;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
<mapper namespace="com.dbnt.faisp.main.counterIntelligence.mapper.CounterIntelligenceMapper">
|
||||
<sql id="selectCounterIntelligenceWorkListWhere">
|
||||
<where>
|
||||
a.status <> 'DST008'
|
||||
<if test='wrtUserSeq != null and wrtUserSeq != 0'>
|
||||
and ((a.wrt_user_seq = #{wrtUserSeq} and a.status = 'DST002') or a.status = 'DST007')
|
||||
</if>
|
||||
|
|
@ -96,8 +97,8 @@
|
|||
a.wrt_dt,
|
||||
b.fileCnt
|
||||
from counter_intelligence_work a
|
||||
inner join (select ciw_key, count(*) as fileCnt from ciw_file group by ciw_key) b
|
||||
on a.ciw_key = b.ciw_key
|
||||
left outer join (select ciw_key, count(*) as fileCnt from ciw_file group by ciw_key) b
|
||||
on a.ciw_key = b.ciw_key
|
||||
<include refid="selectCounterIntelligenceWorkListWhere"></include>
|
||||
ORDER BY a.ciw_key DESC
|
||||
LIMIT #{rowCnt} OFFSET #{firstIndex}
|
||||
|
|
@ -105,7 +106,7 @@
|
|||
<select id="selectCounterIntelligenceWorkCnt" parameterType="CounterIntelligenceWork" resultType="int">
|
||||
select count(*)
|
||||
from counter_intelligence_work a
|
||||
inner join (select ciw_key, count(*) as fileCnt from ciw_file group by ciw_key) b
|
||||
left outer join (select ciw_key, count(*) as fileCnt from ciw_file group by ciw_key) b
|
||||
on a.ciw_key = b.ciw_key
|
||||
<include refid="selectCounterIntelligenceWorkListWhere"></include>
|
||||
</select>
|
||||
|
|
@ -115,4 +116,26 @@
|
|||
inner join hash_tag b on a.tag_key = b.tag_key
|
||||
where a.ciw_key = #{ciwKey}
|
||||
</select>
|
||||
<select id="selectCiWorkStatisticsList" resultType="ciWorkStatistics" parameterType="ciWorkStatistics">
|
||||
select work_rating,
|
||||
count(case when work_start_date > (#{year}||'-01-01')::date and work_start_date < (#{year}+1||'-01-01')::date then 1 end) as newWorkCnt,
|
||||
count(case when work_end_date > (#{year}+1||'-01-01')::date and work_end_date < (#{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 < (#{year}||'-01-01')::date and work_end_date > (#{year}||'-01-01')::date and work_end_date < (#{year}+1||'-01-01')::date then 1 end) as prevYearWorkEndCnt,
|
||||
count(case when work_start_date > (#{year}||'-01-01')::date and work_start_date < (#{year}+1||'-01-01')::date and work_end_date > (#{year}||'-01-01')::date and work_end_date < (#{year}+1||'-01-01')::date then 1 end) as thisYearWorkEndCnt
|
||||
from counter_intelligence_work a
|
||||
WHERE a.status = 'DST007'
|
||||
group by work_rating
|
||||
order by work_rating
|
||||
</select>
|
||||
<select id="selectCiWorkYearList" resultType="int">
|
||||
select year
|
||||
from ( select EXTRACT(YEAR FROM work_start_date) AS year
|
||||
from counter_intelligence_work
|
||||
where status <> 'DST008'
|
||||
union
|
||||
select EXTRACT(YEAR FROM now()) AS year
|
||||
) a
|
||||
group by year
|
||||
order by year desc
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
@ -1,3 +1,13 @@
|
|||
$(document).on('click', '#ciWorkTab', function (){
|
||||
location.href="/counterIntelligence/ciWorkList";
|
||||
})
|
||||
$(document).on('click', '#performanceTab', function (){
|
||||
location.href="/counterIntelligence/CiWorkStatistics";
|
||||
})
|
||||
$(document).on('change', '#statisticsYear', function (){
|
||||
location.href="/counterIntelligence/CiWorkStatistics?year="+this.value;
|
||||
})
|
||||
|
||||
$(document).on('click', '#addCiWorkBtn', function (){
|
||||
getCiWorkEditModal(null);
|
||||
})
|
||||
|
|
@ -19,6 +29,10 @@ $(document).on('click', '#editCiWorkBtn', function (){
|
|||
getCiWorkEditModal($(this).attr("data-ciwkey"));
|
||||
})
|
||||
|
||||
$(document).on('click', '#deleteCiWorkBtn', function (){
|
||||
deleteCiWork($(this).attr("data-ciwkey"));
|
||||
})
|
||||
|
||||
function getCiWorkEditModal(ciwKey){
|
||||
$.ajax({
|
||||
url: '/counterIntelligence/ciWorkEditModal',
|
||||
|
|
@ -65,6 +79,7 @@ function saveCiWork(status){
|
|||
flag = contentCheck();
|
||||
}
|
||||
if(flag){
|
||||
contentFade("in");
|
||||
const ciWorkEditForm = $("#ciWorkEditForm");
|
||||
ciWorkEditForm.find("#status").val(status);
|
||||
const formData = new FormData(ciWorkEditForm[0]);
|
||||
|
|
@ -97,6 +112,33 @@ function saveCiWork(status){
|
|||
}
|
||||
}
|
||||
|
||||
function deleteCiWork(ciwKey){
|
||||
if(confirm("삭제하시겠습니까?")){
|
||||
contentFade("in");
|
||||
const formData = new FormData();
|
||||
formData.append('ciwKey', ciwKey);
|
||||
$.ajax({
|
||||
type : 'POST',
|
||||
data : formData,
|
||||
url : "/counterIntelligence/deleteCiWork",
|
||||
processData: false,
|
||||
contentType: false,
|
||||
beforeSend: function (xhr){
|
||||
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
|
||||
},
|
||||
success : function(result) {
|
||||
alert("삭제되었습니다.");
|
||||
contentFade("out");
|
||||
location.reload();
|
||||
},
|
||||
error : function(xhr, status) {
|
||||
alert("삭제를 실패하였습니다.")
|
||||
contentFade("out");
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function contentCheck(){
|
||||
if(!$("#workStartDate").val()){
|
||||
alert("착수일을 입력해주세요.")
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@
|
|||
<div class="col-sm-2">
|
||||
<input type="text" class="form-control form-control-sm dateSelector" id="workStartDate" name="workStartDate" th:value="${#temporals.format(ciWork.workStartDate, 'yyyy-MM-dd')}" readonly>
|
||||
</div>
|
||||
<label for="workEndDate" class="col-sm-1 col-form-label col-form-label-sm text-center">종결일</label>
|
||||
<label for="workEndDate" class="col-sm-1 col-form-label col-form-label-sm text-center">종결일(예정)</label>
|
||||
<div class="col-sm-2">
|
||||
<input type="text" class="form-control form-control-sm dateSelector" id="workEndDate" name="workEndDate" th:value="${#temporals.format(ciWork.workEndDate, 'yyyy-MM-dd')}" readonly>
|
||||
</div>
|
||||
|
|
@ -127,7 +127,10 @@
|
|||
</form>
|
||||
</div>
|
||||
<div class="modal-footer bg-light">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
|
||||
<th:block th:if="${ciWork.ciwKey ne null and accessAuth eq 'ACC003'}">
|
||||
<button type="button" class="btn btn-danger" id="deleteCiWorkBtn" th:data-ciwkey="${ciWork.ciwKey}">삭제</button>
|
||||
</th:block>
|
||||
<button type="button" class="btn btn-warning" id="saveTempBtn" data-status="DST002">임시저장</button>
|
||||
<button type="button" class="btn btn-primary" id="saveCiWorkBtn" data-status="DST007">저장</button>
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
|
||||
</div>
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
<!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/counterIntelligence/ciWork.js}"></script>
|
||||
</th:block>
|
||||
<div layout:fragment="content">
|
||||
<main>
|
||||
<div class="row justify-content-between">
|
||||
<div class="col-auto">
|
||||
<h4>방첩공작</h4>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<p class="mb-0 mt-2">외사방첩관리 > 방첩공작</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mx-0">
|
||||
<div class="col-12 card bg-light text-center">
|
||||
<div class="card-body">
|
||||
<ul class="nav nav-tabs" id="userTab" role="tablist">
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="ciWorkTab" data-bs-toggle="tab" type="button" role="tab">공작 목록</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link active" id="performanceTab" data-bs-toggle="tab" type="button" role="tab">실적</button>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content bg-white border border-top-0 p-2">
|
||||
<div class="row justify-content-start pb-1">
|
||||
<div class="col-auto">
|
||||
<select class="form-select form-select-sm" id="statisticsYear">
|
||||
<th:block th:each="year:${yearList}">
|
||||
<option th:value="${year}" th:text="|${year}년|" th:selected="${year eq searchParams.year}"></option>
|
||||
</th:block>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<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:block th:text="|${searchParams.year}년 신규 개척|"></th:block>
|
||||
</th>
|
||||
<th rowspan="2">진행중(미종결)</th>
|
||||
<th colspan="2">
|
||||
<th:block th:text="|${searchParams.year}년 종결${#temporals.year(#temporals.createNow()) eq searchParams.year?'(예정)':''}|"></th:block>
|
||||
</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>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="table-group-divider">
|
||||
<tr th:each="statistics:${ciWorkStatisticsList}">
|
||||
<td>
|
||||
<th:block th:if="${#strings.isEmpty(statistics.workRating)}">총계</th:block>
|
||||
<th:block th:unless="${#strings.isEmpty(statistics.workRating)}">
|
||||
<th:block th:each="code:${session.commonCode.get('CIWR')}">
|
||||
<th:block th:if="${code.itemCd eq statistics.workRating}" th:text="${code.itemValue}"></th:block>
|
||||
</th:block>
|
||||
</th:block>
|
||||
</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>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</html>
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
<div class="row mb-1">
|
||||
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">착수일</label>
|
||||
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(ciWork.workStartDate, 'yyyy-MM-dd')}"></label>
|
||||
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">종결일</label>
|
||||
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">종결일(예정)</label>
|
||||
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(ciWork.workEndDate, 'yyyy-MM-dd')}"></label>
|
||||
<label class="col-sm-1 col-form-label col-form-label-sm text-center fw-bold">1차재평가</label>
|
||||
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(ciWork.reRatingDate1, 'yyyy-MM-dd')}"></label>
|
||||
|
|
@ -108,6 +108,9 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="modal-footer bg-light">
|
||||
<th:block th:if="${accessAuth eq 'ACC003'}">
|
||||
<button type="button" class="btn btn-danger" id="deleteCiWorkBtn" th:data-ciwkey="${ciWork.ciwKey}">삭제</button>
|
||||
</th:block>
|
||||
<th:block th:if="${viewUserSeq eq ciWork.wrtUserSeq}">
|
||||
<button type="button" class="btn btn-warning" id="editCiWorkBtn" th:data-ciwkey="${ciWork.ciwKey}">수정</button>
|
||||
</th:block>
|
||||
|
|
|
|||
Loading…
Reference in New Issue