청산보고서 등록 작업중.

강석 최 2022-10-11 18:17:02 +09:00
parent 9a78cf701e
commit 455410eb65
18 changed files with 320 additions and 61 deletions

View File

@ -12,6 +12,7 @@ import com.dbnt.faisp.fpiMgt.affairPlan.repository.PlanApprvRepository;
import com.dbnt.faisp.fpiMgt.affairPlan.repository.PlanBoardRepository;
import com.dbnt.faisp.fpiMgt.affairPlan.repository.PlanFileRepository;
import com.dbnt.faisp.fpiMgt.affairPlan.repository.PlanMainInfoRepository;
import com.dbnt.faisp.fpiMgt.affairResult.repository.ClearInfoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

View File

@ -1,6 +1,9 @@
package com.dbnt.faisp.fpiMgt.affairResult;
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.service.AffairService;
import com.dbnt.faisp.fpiMgt.affairResult.model.ResultApprv;
import com.dbnt.faisp.fpiMgt.affairResult.model.ResultBoard;
import com.dbnt.faisp.fpiMgt.affairResult.model.ClearInfo;
@ -21,7 +24,9 @@ import java.util.List;
@RequestMapping("/affairResult")
public class ResultController { // 첩보수집활동 > 외사경찰 견문관리 > 계획수립
private final ResultService resultService;
private final AffairService affairService;
private final AuthMgtService authMgtService;
private final CodeMgtService codeMgtService;
@GetMapping("/resultMgt")
public ModelAndView resultMgtPage(@AuthenticationPrincipal UserInfo loginUser, ResultBoard resultBoard){
@ -166,6 +171,17 @@ public class ResultController { // 첩보수집활동 > 외사경찰 견문관
return mav;
}
@GetMapping("/affairListModal")
public ModelAndView affairListModal(@AuthenticationPrincipal UserInfo loginUser, AffairBoard affair){
ModelAndView mav = new ModelAndView("igActivities/fpiMgt/affairResult/affairListModal");
affair.setWrtUserSeq(loginUser.getUserSeq());
affair.setRatingOrgan(loginUser.getOgCd());
affair.setFirstIndex(0);
affair.setRowCnt(9999);
mav.addObject("affairList", affairService.selectAffairBoardList(affair));
return mav;
}
@GetMapping("/resultViewModal")
public ModelAndView resultViewModal(@AuthenticationPrincipal UserInfo loginUser, ResultBoard resultBoard){
ModelAndView mav = new ModelAndView("igActivities/fpiMgt/affairResult/resultViewModal");
@ -183,8 +199,7 @@ public class ResultController { // 첩보수집활동 > 외사경찰 견문관
MultipartHttpServletRequest request,
@RequestParam(value = "fileSeq", required = false) List<Integer> deleteFileSeq){
resultBoard.setMultipartFileList(request.getMultiFileMap().get("uploadFiles"));
return 0;
// return resultService.saveResultBoard(resultBoard, deleteFileSeq);
return resultService.saveResultBoard(resultBoard, deleteFileSeq);
}
@ -200,6 +215,8 @@ public class ResultController { // 첩보수집활동 > 외사경찰 견문관
public ModelAndView getClearInfoRow(ClearInfo info){
ModelAndView mav = new ModelAndView("igActivities/fpiMgt/affairResult/clearInfoRow");
mav.addObject("info", info);
mav.addObject("categoryList", codeMgtService.selectCodeMgtList("RIC"));
mav.addObject("codeList", codeMgtService.selectCodeMgtList("RID"));
return mav;
}
@GetMapping("/getResultInfoRow")

View File

@ -81,4 +81,6 @@ public class ResultBoard extends BaseModel {
private List<ClearInfo> clearInfoList;
@Transient
private List<ResultInfo> resultInfoList;
@Transient
private List<ResultToAffair> affairList;
}

View File

@ -0,0 +1,9 @@
package com.dbnt.faisp.fpiMgt.affairResult.repository;
import com.dbnt.faisp.fpiMgt.affairResult.model.ClearInfo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ClearInfoRepository extends JpaRepository<ClearInfo, ClearInfo.ClearInfoId> {
void deleteByResultKey(Integer resultKey);
}

View File

@ -0,0 +1,10 @@
package com.dbnt.faisp.fpiMgt.affairResult.repository;
import com.dbnt.faisp.fpiMgt.affairResult.model.ResultInfo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ResultInfoRepository extends JpaRepository<ResultInfo, ResultInfo.ResultInfoId> {
void deleteByResultKey(Integer resultKey);
}

View File

@ -0,0 +1,10 @@
package com.dbnt.faisp.fpiMgt.affairResult.repository;
import com.dbnt.faisp.fpiMgt.affairResult.model.ResultToAffair;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ResultToAffairRepository extends JpaRepository<ResultToAffair, ResultToAffair.ResultToAffairId> {
void deleteByResultKey(Integer resultKey);
}

View File

@ -0,0 +1,9 @@
package com.dbnt.faisp.fpiMgt.affairResult.repository;
import com.dbnt.faisp.fpiMgt.affairResult.model.ResultToPlan;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ResultToPlanRepository extends JpaRepository<ResultToPlan, ResultToPlan.ResultToPlanId> {
}

View File

@ -4,12 +4,8 @@ package com.dbnt.faisp.fpiMgt.affairResult.service;
import com.dbnt.faisp.config.BaseService;
import com.dbnt.faisp.config.FileInfo;
import com.dbnt.faisp.fpiMgt.affairResult.mapper.ResultMapper;
import com.dbnt.faisp.fpiMgt.affairResult.model.ResultApprv;
import com.dbnt.faisp.fpiMgt.affairResult.model.ResultBoard;
import com.dbnt.faisp.fpiMgt.affairResult.model.ResultFile;
import com.dbnt.faisp.fpiMgt.affairResult.repository.ResultApprvRepository;
import com.dbnt.faisp.fpiMgt.affairResult.repository.ResultBoardRepository;
import com.dbnt.faisp.fpiMgt.affairResult.repository.ResultFileRepository;
import com.dbnt.faisp.fpiMgt.affairResult.model.*;
import com.dbnt.faisp.fpiMgt.affairResult.repository.*;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -22,9 +18,13 @@ import java.util.UUID;
@Service
@RequiredArgsConstructor
public class ResultService extends BaseService { // 월간계획
private final ClearInfoRepository clearInfoRepository;
private final ResultApprvRepository resultApprvRepository;
private final ResultBoardRepository resultBoardRepository;
private final ResultFileRepository resultFileRepository;
private final ResultApprvRepository resultApprvRepository;
private final ResultInfoRepository resultInfoRepository;
private final ResultToAffairRepository resultToAffairRepository;
private final ResultToPlanRepository resultToPlanRepository;
private final ResultMapper resultMapper;
public List<ResultBoard> selectResultBoardList(ResultBoard resultBoard) {
@ -53,9 +53,32 @@ public class ResultService extends BaseService { // 월간계획
if(resultBoard.getMultipartFileList()!=null){
saveUploadFiles(resultKey, resultBoard.getMultipartFileList());
}
if (resultBoard.getClearInfoList() != null){
saveClearInfoList(resultKey, resultBoard.getClearInfoList());
}
if (resultBoard.getResultInfoList() != null){
saveResultInfoList(resultKey, resultBoard.getResultInfoList());
}
if (resultBoard.getAffairList() != null){
saveResultToAffair(resultKey, resultBoard.getAffairList());
}
return resultKey;
}
public FileInfo selectResultFile(Integer resultKey, Integer fileSeq) {
return resultFileRepository.findById(new ResultFile.ResultFileId(resultKey, fileSeq)).orElse(null);
}
@Transactional
public Integer resultStateChange(ResultApprv apprv) {
ResultBoard savedResult = resultBoardRepository.findById(apprv.getResultKey()).orElse(null);
savedResult.setResultState(apprv.getState());
ResultApprv lastApprv = resultApprvRepository.findTopByResultKeyOrderByApprvSeqDesc(apprv.getResultKey()).orElse(null);
apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1);
resultApprvRepository.save(apprv);
return apprv.getApprvSeq();
}
private void saveUploadFiles(Integer resultKey, List<MultipartFile> multipartFileList){
ResultFile lastFileInfo = resultFileRepository.findTopByResultKeyOrderByFileSeqDesc(resultKey).orElse(null);
int fileSeq = lastFileInfo==null?1:(lastFileInfo.getFileSeq()+1);
@ -88,17 +111,28 @@ public class ResultService extends BaseService { // 월간계획
}
}
public FileInfo selectResultFile(Integer resultKey, Integer fileSeq) {
return resultFileRepository.findById(new ResultFile.ResultFileId(resultKey, fileSeq)).orElse(null);
private void saveClearInfoList(Integer resultKey, List<ClearInfo> clearInfoList) {
clearInfoRepository.deleteByResultKey(resultKey);
for(ClearInfo info: clearInfoList){
info.setResultKey(resultKey);
}
clearInfoRepository.saveAll(clearInfoList);
}
@Transactional
public Integer resultStateChange(ResultApprv apprv) {
ResultBoard savedResult = resultBoardRepository.findById(apprv.getResultKey()).orElse(null);
savedResult.setResultState(apprv.getState());
ResultApprv lastApprv = resultApprvRepository.findTopByResultKeyOrderByApprvSeqDesc(apprv.getResultKey()).orElse(null);
apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1);
resultApprvRepository.save(apprv);
return apprv.getApprvSeq();
private void saveResultInfoList(Integer resultKey, List<ResultInfo> resultInfoList){
resultInfoRepository.deleteByResultKey(resultKey);
for(ResultInfo info: resultInfoList){
info.setResultKey(resultKey);
}
resultInfoRepository.saveAll(resultInfoList);
}
private void saveResultToAffair(Integer resultKey, List<ResultToAffair> resultToAffairList){
resultToAffairRepository.deleteByResultKey(resultKey);
for(ResultToAffair relation: resultToAffairList){
relation.setResultKey(resultKey);
}
resultToAffairRepository.saveAll(resultToAffairList);
}
}

View File

@ -6,15 +6,6 @@ function contentFade(action){
}
}
function sessionReload(){
$.ajax({
url: '/refreshSession',
type: 'GET',
success: function(){location.reload();},
error:function(){}
});
}
$(document).on('click', '.allChk', function (){
$(this).parents('table').find('[type="checkbox"]').prop("checked", this.checked);
})
@ -91,6 +82,20 @@ $(document).on('click', '.fileDownLink', function (){
window.open(encodeURI(url));
})
//Bootstrap multiple modal
let count = 0; // 모달이 열릴 때 마다 count 해서 z-index값을 높여줌
$(document).on('show.bs.modal', '.modal', function () {
let zIndex = 1040 + (10 * count);
$(this).css('z-index', zIndex);
setTimeout(function() {
$('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');
}, 0);
count = count + 1
});
// multiple modal Scrollbar fix
$(document).on('hidden.bs.modal', '.modal', function(){
$('.modal:visible').length && $(document.body).addClass('modal-open');
});
function setUploadDiv(){
files = [];

View File

@ -29,6 +29,61 @@ $(document).on('click', '#resultAddBtn', function (){
$("#resultDiv").append("<input type='text' class='form-control' name='resultInfos'>")
})
$(document).on('change', '#clearTitle', function (){
$("#resultTitle").val(this.value)
})
$(document).on('change', '#workStartDt', function (){
$(".workStartDtCopy").val(this.value)
})
$(document).on('change', '#workEndDt', function (){
$(".workEndDtCopy").val(this.value)
})
$(document).on('change', '#usePrice', function (){
$("#usePriceCopy").val(this.value)
})
$(document).on('click', '#affairModalBtn', function (){
const workStartDt = $("#workStartDt").val()
const workEndDt = $("#workEndDt").val()
if(!workStartDt||!workEndDt){
alert("청산보고서의 사업기간을 입력해주세요.");
}else{
$.ajax({
url: '/affairResult/affairListModal',
data: {
startDate: workStartDt,
endDate: workEndDt
},
type: 'GET',
dataType:"html",
success: function(html){
$("#affairListModalContent").empty().append(html)
$("#affairListModal").modal('show');
},
error:function(){
}
});
}
})
$(document).on('click', '.affairTr', function (){
const chkBox = $(this).find(".rowChkBox");
chkBox[0].checked = !chkBox[0].checked;
})
$(document).on('click', '#getAffairBtn', function (){
let affairListTbody = "";
$.each($(".rowChkBox:checked"), function (idx, chkBox){
const affairTr = $(chkBox).parents(".affairTr")
affairListTbody += "<tr>";
affairListTbody += "<input type='hidden' name='affairList["+idx+"].affairKey' value='"+chkBox.value+"'>";
affairListTbody += "<td>"+affairTr.find(".wrtDt")[0].innerText+"</td>";
affairListTbody += "<td>"+affairTr.find(".title")[0].innerText+"</td>";
affairListTbody += "<td>"+(affairTr.find(".affairRate")[0].innerText+(affairTr.find(".organUp")[0].innerText==="O"?"(상보)":""))+"</td>";
affairListTbody += "</tr>";
})
$("#affairListTbody").empty().append(affairListTbody);
})
$(document).on('click', '.rowDeleteBtn', function (){
const isClearInfo = $(this).parents("#clearInfoRow").length !== 0;
const infoSeq = $(this).parents(".infoRow").find(".infoSeq").val();
@ -151,7 +206,11 @@ function getResultEditModal(resultKey){
success: function(html){
$("#resultEditModalContent").empty().append(html)
$("#resultEditModal").modal('show');
$("#resultDt").datepicker({
$("#useDateSelectorDiv").datepicker({
format: "yyyy-mm-dd",
language: "ko"
});
$("#workDateSelectorDiv").datepicker({
format: "yyyy-mm-dd",
language: "ko"
});
@ -202,20 +261,56 @@ function setInfoSeq(target, infoSeq){
if(childInfoSeq-->Number(infoSeq)){
const infoRow = $(child).parent(".infoRow")
child.innerText = childInfoSeq;
infoRow[0].id = "row"+childInfoSeq;
debugger
infoRow[0].id = "row"+idx;
$.each(infoRow.find("input"), function (idx2, input){
input.name = input.name.replace("["+childInfoSeq+"]", "["+idx+"]");
if(input.name.indexOf("infoSeq")>0){
input.value -= input.value;
}
})
$.each(infoRow.find("select"), function (idx2, select){
select.name = select.name.replace("["+childInfoSeq+"]", "["+idx+"]");
})
$.each(infoRow.find("textarea"), function (idx2, textarea){
if(textarea.id !== ''){
textarea.id = "contactInfo"+idx;
}
if(textarea.name !== ''){
textarea.name = textarea.name.replace("["+childInfoSeq+"]", "["+idx+"]");
}
})
}
})
}
function contentCheck(){
let flag = true;
if(!$("#contentTitle").val()){
alert("제목을 입력해주세요.")
if(!$("#clearTitle").val()){
alert("청산보고서 제목을 입력해주세요.")
flag = false;
}
if(!$("#resultDt").val()){
alert("시행일자를 입력해주세요.")
if(!$("#workStartDt").val()){
alert("사업기간 시작일을 입력해주세요.")
flag = false;
}
if(!$("#workEndDt").val()){
alert("사업기간 종료일을 입력해주세요.")
flag = false;
}
if(!$("#planPrice").val()){
alert("계획금액을 입력해주세요.")
flag = false;
}
if(!$("#usePrice").val()){
alert("집행액을 입력해주세요.")
flag = false;
}
if($(".clearInfoSeq").length<=0){
alert("세부 집행내역을 입력해주세요.")
flag = false;
}
if($(".resultInfoSeq").length<=0){
alert("활동내용을 입력해주세요.")
flag = false;
}
flag = fileCheck(flag, files);

View File

@ -1,13 +1,10 @@
<!DOCTYPE html>
<html lang="ko"
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5" xmlns="http://www.w3.org/1999/html">
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="mx-3 pt-3" th:fragment="leftMenuFragment">
<a href="/" class="d-flex">
<img id="logo" th:src="@{/img/logo.png}" alt="logo" title="logo">
<!--<span class="fs-4">해양경찰청 파일관리 시스템</span>-->
</a>
<ul class="nav nav-pills flex-column my-3" sec:authorize="isAuthenticated()">
<ul class="nav nav-pills flex-column my-3">
<li th:each="firstMenu:${session.menuList}">
<th:block th:each="cat1Code:${session.commonCode.get('CAT1')}">
<th:block th:if="${cat1Code.itemCd eq firstMenu.cat1Cd}">

View File

@ -16,7 +16,7 @@
<div class="card-body">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link" th:classappend="${page eq 'main'?' active':''}" id="affairTab" data-bs-toggle="tab" type="button" role="tab">견문 목록</button>
<button class="nav-link" th:classappend="${page eq 'main'?' active':''}" id="affairTab" data-bs-toggle="tab" type="button" role="tab">전체 목록</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" th:classappend="${page eq 'stay'?' active':''}" id="stayTab" data-bs-toggle="tab" type="button" role="tab">결재대기목록</button>

View File

@ -16,7 +16,7 @@
<div class="card-body">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link" th:classappend="${page eq 'main'?' active':''}" id="planTab" data-bs-toggle="tab" type="button" role="tab">계획 목록</button>
<button class="nav-link" th:classappend="${page eq 'main'?' active':''}" id="planTab" data-bs-toggle="tab" type="button" role="tab">전체 목록</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" th:classappend="${page eq 'stay'?' active':''}" id="stayTab" data-bs-toggle="tab" type="button" role="tab">결재대기목록</button>

View File

@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header">
<h5 class="modal-title" id="affairListModalLabel">견문목록</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body" id="affairListBody">
<table class="table table-hover">
<thead>
<tr>
<th><input type="checkbox" class="allChk"></th>
<th>분야1</th>
<th>분야2</th>
<th>분야3</th>
<th>분야4</th>
<th>제목</th>
<th>작성일</th>
<th>첨부파일</th>
<th>상태</th>
<th>평가</th>
<th>상보</th>
</tr>
</thead>
<tbody>
<tr class="affairTr" th:each="affair:${affairList}">
<td><input type="checkbox" class="rowChkBox" th:value="${affair.affairKey}"></td>
<th:block th:each="commonCode:${session.commonCode.get('DC01')}">
<td th:if="${affair.affairType1 eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<th:block th:each="commonCode:${session.commonCode.get('DC02')}">
<td th:if="${affair.affairType2 eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<th:block th:each="commonCode:${session.commonCode.get('DC03')}">
<td th:if="${affair.affairType3 eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<th:block th:each="commonCode:${session.commonCode.get('DC04')}">
<td th:if="${affair.affairType4 eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<td class="title" th:text="${affair.title}"></td>
<td class="wrtDt" th:text="${#temporals.format(affair.wrtDt, 'yyyy-MM-dd HH:mm')}"></td>
<td th:text="${affair.fileCnt eq null?'파일 없음':#strings.concat(affair.fileCnt,' 건')}"></td>
<th:block th:each="commonCode:${session.commonCode.get('DST')}">
<td th:if="${affair.affairStatus eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<th:block th:if="${affair.affairStatus eq 'DST006'}">
<th:block th:each="ratingCode:${session.commonCode.get('AAR')}">
<td class="affairRate" th:if="${ratingCode.itemCd eq affair.affairRate}" th:text="${ratingCode.itemValue}"></td>
</th:block>
<td class="organUp" th:text="${affair.organUp eq 'T'?'O':'X'}"></td>
</th:block>
<th:block th:unless="${affair.affairStatus eq 'DST006'}">
<td></td>
<td></td>
</th:block>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
<button type="button" class="btn btn-primary" id="getAffairBtn">불러오기</button>
</div>

View File

@ -6,16 +6,16 @@
<div class="col-3">
<select class="form-select form-select-sm" th:name="${#strings.concat('clearInfoList[', info.infoSeq,'].useCatg')}">
<option value="">선택</option>
<th:block th:each="commonCode:${session.commonCode.get('RIC')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
<th:block th:each="category:${categoryList}">
<option th:value="${category.itemCd}" th:text="${category.itemValue}"></option>
</th:block>
</select>
</div>
<div class="col-3">
<select class="form-select form-select-sm" th:name="${#strings.concat('clearInfoList[', info.infoSeq,'].userDetail')}">
<option value="">선택</option>
<th:block th:each="commonCode:${session.commonCode.get('RID')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
<th:block th:each="code:${codeList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>

View File

@ -37,9 +37,9 @@
</div>
</div>
<div class="mb-3 row">
<label for="contentTitle" class="col-sm-2 col-form-label col-form-label-sm text-center">목적(제목)</label>
<label for="clearTitle" class="col-sm-2 col-form-label col-form-label-sm text-center">목적(제목)</label>
<div class="col-sm-10">
<input type="text" class="form-control form-control-sm" id="contentTitle" name="clearTitle" th:value="${result.clearTitle}">
<input type="text" class="form-control form-control-sm" id="clearTitle" name="clearTitle" th:value="${result.clearTitle}">
</div>
</div>
<div class="mb-3 row">
@ -100,7 +100,7 @@
</div>
</div>
</div>
<div class="mb-3 row">
<!--<div class="mb-3 row">
<label for="fileInputer" class="col-sm-2 col-form-label col-form-label-sm text-center">증빙서류</label>
<div class="col-sm-10" style="min-height: 70px;">
<div class="w-100 h-100 border border-info rounded text-center" id="uploadDiv">
@ -116,7 +116,7 @@
</div>
</div>
<input type="file" class="d-none" id="fileInputer" multiple>
</div>
</div>-->
<div class="mb-3 row">
<label for="clearEtc" class="col-sm-2 col-form-label col-form-label-sm text-center">비고</label>
<div class="col-sm-10">
@ -143,19 +143,20 @@
<div class="col-sm-4">
<div class="row">
<div class="col-auto me-0">
<input type="text" class="form-control form-control-sm" id="usePriceCopy">
<input type="text" class="form-control form-control-sm" id="usePriceCopy" readonly>
</div>
<label for="usePriceCopy" class="col-sm-auto col-form-label col-form-label-sm"></label>
</div>
</div>
</div>
<div class="mb-3 row justify-content-center">
<label for="resultInfoRow" class="col-sm-2 col-form-label col-form-label-sm text-center">세부<br>집행내역</label>
<label for="resultInfoRow" class="col-sm-2 col-form-label col-form-label-sm text-center">활동내용</label>
<div class="col-sm-10">
<div class="row">
<div class="col-1">no</div>
<div class="col-4">접촉 대상자</div>
<div class="col-3">접촉 대상자</div>
<div class="col-7">접촉 내용</div>
<div class="col-1"></div>
</div>
<hr class="my-1">
<div class="row">
@ -204,7 +205,7 @@
</div>
</div>
<div class="col-auto">
<input type="button" class="btn btn-sm btn-outline-primary" id="getAffairBtn" value="불러오기">
<input type="button" class="btn btn-sm btn-outline-primary" id="affairModalBtn" value="불러오기">
</div>
</div>
<div class="mb-3 row justify-content-center">
@ -217,7 +218,7 @@
<th>활용</th>
</tr>
</thead>
<tbody>
<tbody id="affairListTbody">
</tbody>
</table>

View File

@ -2,14 +2,14 @@
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="row my-1 infoRow" th:id="|row${info.infoSeq}|">
<input type="hidden" class="infoSeq resultInfoSeq" th:name="${#strings.concat('resultInfoList[', info.infoSeq,'].infoSeq')}" th:value="${info.infoSeq}">
<div class="col-1">
<button type="button" class="btn btn-sm btn-outline-danger rowDeleteBtn"><i class="bi bi-x"></i></button>
<span class="infoSeq" th:text="${info.infoSeq+1}"></span>
</div>
<div class="col-4">
<div class="col-1 infoSeq" th:text="${info.infoSeq+1}"></div>
<div class="col-3">
<input type="text" class="form-control form-control-sm" th:name="${#strings.concat('resultInfoList[', info.infoSeq,'].contactTarget')}">
</div>
<div class="col-7">
<textarea th:id="|contactInfo${info.infoSeq}|" th:name="${#strings.concat('resultInfoList[', info.infoSeq,'].contactInfo')}"></textarea>
</div>
<div class="col-1">
<button type="button" class="btn btn-sm btn-outline-danger rowDeleteBtn"><i class="bi bi-x"></i></button>
</div>
</div>

View File

@ -16,7 +16,7 @@
<div class="card-body">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link" th:classappend="${page eq 'main'?' active':''}" id="planTab" data-bs-toggle="tab" type="button" role="tab">계획 목록</button>
<button class="nav-link" th:classappend="${page eq 'main'?' active':''}" id="planTab" data-bs-toggle="tab" type="button" role="tab">전체 목록</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" th:classappend="${page eq 'stay'?' active':''}" id="stayTab" data-bs-toggle="tab" type="button" role="tab">결재대기목록</button>
@ -165,6 +165,13 @@
</div>
</div>
</div>
<div class="modal fade" id="affairListModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="affairListModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="affairListModalContent">
</div>
</div>
</div>
<div class="modal fade" id="resultViewModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="resultViewModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="resultViewBody">