강석 최 2023-02-08 18:19:58 +09:00
commit 6b3a6ffa37
7 changed files with 188 additions and 39 deletions

View File

@ -20,7 +20,7 @@ import java.util.List;
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "monitoring_result_file")
@Table(name = "monitoring_report")
@IdClass(MonitoringReport.MonitoringReportId.class)
public class MonitoringReport extends FileInfo {
@Id
@ -49,7 +49,7 @@ public class MonitoringReport extends FileInfo {
private String savePath;
@Transient
private File file;
private MultipartFile file;
@Embeddable

View File

@ -12,6 +12,8 @@ public interface MonitoringReportRepository extends JpaRepository<MonitoringRepo
void deleteByMrKey(Integer mrKey);
List<MonitoringReport> findByMrKey(Integer mrKey);
}

View File

@ -0,0 +1,18 @@
package com.dbnt.faisp.main.fpiMgt.monitoring.repository;
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringResultClearInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface MonitoringResultClearInfoRepository extends JpaRepository<MonitoringResultClearInfo, MonitoringResultClearInfo.MonitoringResultClearInfoId> {
void deleteByMrKey(Integer mrKey);
List<MonitoringResultClearInfo> findByMrKey(Integer mrKey);
}

View File

@ -22,6 +22,7 @@ import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringDesignationFile.mon
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringReport;
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringResult;
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringResultApprv;
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringResultClearInfo;
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringResultFile;
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringResultFile.MonitoringResultFileId;
import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringResultInfo;
@ -30,19 +31,22 @@ import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringDesignationFil
import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringDesignationRepository;
import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringReportRepository;
import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringResultApprvRepository;
import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringResultClearInfoRepository;
import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringResultFileRepository;
import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringResultInfoRepository;
import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringResultRepository;
import com.dbnt.faisp.main.userInfo.model.UserAlarm;
import com.dbnt.faisp.main.userInfo.service.UserAlarmService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@ -58,6 +62,7 @@ public class MonitoringService extends BaseService {
private final MonitoringResultFileRepository monitoringResultFileRepository;
private final MonitoringResultInfoRepository monitoringResultInfoRepository;
private final MonitoringReportRepository monitoringReportRepository;
private final MonitoringResultClearInfoRepository monitoringResultClearInfoRepository;
private final MonitoringMapper monitoringMapper;
@Transactional
@ -166,6 +171,9 @@ public class MonitoringService extends BaseService {
if(mr.getMultipartFileList()!=null){
saveResultUploadFiles(mrKey, mr.getMultipartFileList());
}
if (mr.getClearInfoList() != null){
saveClearInfoList(mrKey, mr.getClearInfoList());
}
if (mr.getResultInfoList() != null){
saveResultInfoList(mrKey, mr.getResultInfoList());
}
@ -212,6 +220,14 @@ public class MonitoringService extends BaseService {
}
}
private void saveClearInfoList(Integer mrKey, List<MonitoringResultClearInfo> clearInfoList){
monitoringResultClearInfoRepository.deleteByMrKey(mrKey);
for(MonitoringResultClearInfo info: clearInfoList){
info.setMrKey(mrKey);
}
monitoringResultClearInfoRepository.saveAll(clearInfoList);
}
private void saveResultInfoList(Integer mrKey, List<MonitoringResultInfo> resultInfoList){
monitoringResultInfoRepository.deleteByMrKey(mrKey);
for(MonitoringResultInfo info: resultInfoList){
@ -221,23 +237,25 @@ public class MonitoringService extends BaseService {
}
private void saveReportList(Integer mrKey, List<MonitoringReport> reportList){
//monitoringReportRepository.deleteByMrKey(mrKey);
monitoringReportRepository.deleteByMrKey(mrKey);
for(MonitoringReport info: reportList){
MultipartFile file = (MultipartFile) info.getFile();
String saveName = UUID.randomUUID().toString();
String path = locationPath+monitoringPath;
saveFile(file, new File(path+File.separator+saveName));
String originalFilename = file.getOriginalFilename();
int extnIdx = originalFilename.lastIndexOf(".");
info.setMrKey(mrKey);
info.setOrigNm(originalFilename.substring(0, extnIdx));
info.setFileExtn(originalFilename.substring(extnIdx+1));
info.setConvNm(saveName);
info.setFileSize(calculationSize(file.getSize()));
info.setSavePath(path);
if(info.getFile() != null) {
MultipartFile file = info.getFile();
String saveName = UUID.randomUUID().toString();
String path = locationPath+monitoringPath;
saveFile(file, new File(path+File.separator+saveName));
String originalFilename = file.getOriginalFilename();
int extnIdx = originalFilename.lastIndexOf(".");
info.setOrigNm(originalFilename.substring(0, extnIdx));
info.setFileExtn(originalFilename.substring(extnIdx+1));
info.setConvNm(saveName);
info.setFileSize(calculationSize(file.getSize()));
info.setSavePath(path);
}
info.setMrKey(mrKey);
monitoringReportRepository.save(info);
}
}
}
public List<MonitoringResult> selectResultList(MonitoringResult mr) {
return monitoringMapper.selectResultList(mr);
@ -251,8 +269,10 @@ public class MonitoringService extends BaseService {
MonitoringResult savedReslut = monitoringResultRepository.findById(mrKey).orElse(null);
if (savedReslut != null) {
savedReslut.setMd(monitoringDesignationRepository.findById(savedReslut.getMdKey()).orElse(null));
savedReslut.setClearInfoList(monitoringResultClearInfoRepository.findByMrKey(mrKey));
savedReslut.setResultInfoList(monitoringResultInfoRepository.findByMrKey(mrKey));
savedReslut.setFileList(monitoringResultFileRepository.findByMrKey(mrKey));
savedReslut.setReportList(monitoringReportRepository.findByMrKey(mrKey));
savedReslut.setApprvList(monitoringResultApprvRepository.findByMrKey(mrKey));
}
return savedReslut;

View File

@ -160,6 +160,13 @@ function saveResult(mrState){
formData.append('fileSeq', $(el).attr("data-fileseq"));
})
formData.append('mrState', mrState);
$.each($("#clearInfoRow").find(".infoRow"), function (idx, div){
formData.append('clearInfoList['+(idx)+'].infoSeq', idx+1);
formData.append('clearInfoList['+(idx)+'].useCatg', $(div).find(".useCatg").val());
formData.append('clearInfoList['+(idx)+'].useDetail', $(div).find(".useDetail").val());
formData.append('clearInfoList['+(idx)+'].price', $(div).find(".price").val());
});
$.each($("#resultInfoRow").find(".infoRow"), function (idx, div){
formData.append('resultInfoList['+(idx)+'].infoSeq', idx+1);
@ -174,7 +181,9 @@ function saveResult(mrState){
formData.append('reportList['+(idx)+'].contactDate', $(div).find(".contactDate").val());
formData.append('reportList['+(idx)+'].writeDate', $(div).find(".writeDate").val());
formData.append('reportList['+(idx)+'].reportTitle', $(div).find(".reportTitle").val());
formData.append('reportList['+(idx)+'].file', $(div).find(".file").val());
if($(div).find(".file").val() != ""){
formData.append('reportList['+(idx)+'].file', $(div).find(".file")[0].files[0]);
}
});
$.ajax({
@ -248,9 +257,13 @@ $(document).on('click', '.rowDeleteBtn', function (){
})
$(document).on('click', '.rowDeleteBtn2', function (){
$(this).parents(".clearInfoRow").remove();
$(this).parents(".infoRow").remove();
})
$(document).on('click', '.rowDeleteBtn3', function (){
$(this).parents(".monitoringInfoRow").remove();
$(this).parents(".infoRow").remove();
})
$(document).on('click', '#addImgBtn', function (){
$("#upload").remove();
})

View File

@ -44,15 +44,15 @@
<label for="workDateSelectorDiv" class="col-sm-2 col-form-label col-form-label-sm text-center">사업기간</label>
<div class="col-sm-4">
<div class="input-group w-auto input-daterange" id="workDateSelectorDiv">
<input type="text" class="form-control form-control-sm" id="mrSdate" name="mrSdate" readonly>
<input type="text" class="form-control form-control-sm" id="mrEdate" name="mrEdate" readonly>
<input type="text" class="form-control form-control-sm" id="mrSdate" name="mrSdate" th:value="${mr.mrSdate}" readonly>
<input type="text" class="form-control form-control-sm" id="mrEdate" name="mrEdate" th:value="${mr.mrEdate}" readonly>
</div>
</div>
</div>
<div class="row mb-1">
<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="clearTitle" name="clearTitle">
<input type="text" class="form-control form-control-sm" id="clearTitle" name="clearTitle" th:value="${mr.clearTitle}">
</div>
</div>
<div class="row mb-1">
@ -106,7 +106,7 @@
<div class="col-sm-4">
<div class="row">
<div class="col-auto me-0">
<input type="number" class="form-control form-control-sm" id="mrPrice" name="mrPrice">
<input type="number" class="form-control form-control-sm" id="mrPrice" name="mrPrice" th:value="${mr.mrPrice}">
</div>
<label for="usePrice" class="col-sm-auto col-form-label col-form-label-sm"></label>
</div>
@ -124,12 +124,12 @@
<div class="row">
<div class="col-12" id="clearInfoRow">
<th:block th:each="info:${mr.clearInfoList}">
<div class="row my-1 clearInfoRow">
<div class="row my-1 infoRow">
<div class="col-3">
<select class="form-select form-select-sm useCatg">
<option value="">선택</option>
<th:block th:each="category:${categoryList}">
<option th:value="${category.itemCd}" th:text="${category.itemValue}"></option>
<option th:value="${category.itemCd}" th:text="${category.itemValue}" th:selected="${category.itemCd eq info.useCatg}"></option>
</th:block>
</select>
</div>
@ -137,14 +137,14 @@
<select class="form-select form-select-sm useDetail">
<option value="">선택</option>
<th:block th:each="code:${codeList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${code.itemCd eq info.useDetail}"></option>
</th:block>
</select>
</div>
<div class="col-5">
<div class="row">
<div class="col-7 pe-0">
<input type="number" class="form-control form-control-sm price">
<input type="number" class="form-control form-control-sm price" th:value="${info.price}">
</div>
<label class="col-auto"></label>
<div class="col-auto">
@ -294,17 +294,37 @@
<th:block th:each="info:${mr.reportList}">
<div class="row my-1 infoRow">
<div class="col-2">
<input type="text" class="form-control form-control-sm contactDate" placeholder="YYYY-MM-DD" readonly>
<input type="text" class="form-control form-control-sm contactDate" placeholder="YYYY-MM-DD" th:value="${info.contactDate}" readonly>
</div>
<div class="col-2">
<input type="text" class="form-control form-control-sm writeDate" placeholder="YYYY-MM-DD" readonly>
<input type="text" class="form-control form-control-sm writeDate" placeholder="YYYY-MM-DD" th:value="${info.writeDate}" readonly>
</div>
<div class="col-3">
<input type="text" class="form-control form-control-sm reportTitle">
<input type="text" class="form-control form-control-sm reportTitle" th:value="${info.reportTitle}">
</div>
<th:block th:if="${not #strings.isEmpty(info.origNm)}">
<div class="col-3">
<div class="input-group">
<input type="text" class="form-control form-control-sm" th:value="|${info.origNm}.${info.fileExtn}|" readonly>
<button type="button" class="btn btn-sm btn-danger" id="deleteImgBtn">
<i class="bi bi-x"></i>
</button>
</div>
</div>
</th:block>
<th:block th:unless="${not #strings.isEmpty(info.origNm)}">
<div class="col-3">
<input class="file" type="file">
<div class="input-group">
<input type="text" class="form-control form-control-sm" value="등록된 파일이 없습니다." readonly>
<button type="button" class="btn btn-sm btn-primary" id="addImgBtn">
<i class="bi bi-plus"></i>
</button>
</div>
</div>
<!-- <input class="file" type="file" th:unless="${not #strings.isEmpty(info.origNm)}"> -->
</th:block>
<div class="col-1">
<button type="button" class="btn btn-sm btn-outline-danger rowDeleteBtn3"><i class="bi bi-x"></i></button>
</div>
@ -361,7 +381,7 @@
</div>
<div class="d-none" id="clearIinfoFmOrigin">
<div class="row my-1 clearInfoRow" id="clearInfoFm">
<div class="row my-1 infoRow" id="clearInfoFm">
<div class="col-3">
<select class="form-select form-select-sm useCatg">
<option value="">선택</option>

View File

@ -8,14 +8,90 @@
<input type="hidden" name="affairKey" id="viewModalAffairKey">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="boardTab" data-bs-toggle="tab" data-bs-target="#boardTabPanel" type="button" role="tab" aria-controls="boardTabPanel" aria-selected="true">본문</button>
<button class="nav-link active" id="clearReportViewTab" data-bs-toggle="tab" data-bs-target="#clearReportViewTabPanel" type="button" role="tab" aria-controls="clearReportViewTabPanel" aria-selected="true">청산보고서</button>
</li>
<li class="nav-item" role="presentation" th:if="${#lists.size(mr.fileList)>0}">
<button class="nav-link" id="fileTab" data-bs-toggle="tab" data-bs-target="#fileTabPanel" type="button" role="tab" aria-controls="fileTabPanel" aria-selected="false" th:text="${#strings.concat('첨부파일(', #lists.size(mr.fileList), ')')}"></button>
<li class="nav-item" role="presentation">
<button class="nav-link" id="resultReportViewTab" data-bs-toggle="tab" data-bs-target="#resultReportViewTabPanel" type="button" role="tab" aria-controls="resultReportViewTabPanel" aria-selected="false">결과보고서</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="affairListViewTab" data-bs-toggle="tab" data-bs-target="#affairListViewTabPanel" type="button" role="tab" aria-controls="affairListViewTabPanel" aria-selected="false">견문목록&증빙자료</button>
</li>
</ul>
<div class="tab-content bg-white border border-top-0 p-2">
<div class="tab-pane fade p-2 show active" id="boardTabPanel" role="tabpanel" tabindex="0">
<div class="tab-pane fade p-2 show active" id="clearReportViewTabPanel" role="tabpanel" aria-labelledby="clearReportViewTab" tabindex="0">
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">작성자</label>
<th:block th:each="commonCode:${session.commonCode.get('JT')}">
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:if="${commonCode.itemCd eq mr.wrtUserGrd}" th:text="|${commonCode.itemValue} ${mr.wrtUserNm}|"></label>
</th:block>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">작성일</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(mr.wrtDt, 'yyyy-MM-dd HH:mm')}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">상태</label>
<th:block th:each="commonCode:${session.commonCode.get('DST')}">
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:if="${commonCode.itemCd eq mr.mrState}" th:text="${commonCode.itemValue}"></label>
</th:block>
</div>
<hr>
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">제목</label>
<label class="col-sm-11 col-form-label col-form-label-sm text-start" th:text="${mr.mrTitle}"></label>
</div>
<hr>
<div class="row mb-1"><h6 class="text-center">모니터링 대상자</h6></div>
<br>
<div class="row">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">대상지정일</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${mr.md.mdDt}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">성명</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${mr.md.mdName}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">국적</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${mr.md.mdNationality}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">소속/계급<br>(직위)</label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${mr.md.mdRank}"></label>
</div>
<hr>
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">사업기간</label>
<div class="col-sm-11 form-control-sm" id="contentDiv">
<div th:text="|${mr.mrSdate} ~ ${mr.mrEdate}|"></div>
</div>
</div>
<hr>
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">집행액</label>
<div class="col-sm-11 form-control-sm" id="contentDiv">
<div th:text="|${mr.mrPrice}원|"></div>
</div>
</div>
<hr>
<div class="row mb-1">
<label for="clearTitle" class="col-sm-1 border-end border-secondary col-form-label col-form-label-sm text-center fw-bold">세부<br>집행내역</label>
<div class="col-sm-10">
<table class="table table-sm table-hover">
<thead>
<tr>
<th>구분</th>
<th>상세</th>
<th>금액</th>
</tr>
</thead>
<tbody>
<tr th:each="clearInfo:${mr.clearInfoList}">
<th:block th:each="commonCode:${session.commonCode.get('RIC')}">
<td th:if="${clearInfo.useCatg eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<th:block th:each="commonCode:${session.commonCode.get('RID')}">
<td th:if="${clearInfo.useDetail eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<td th:text="${#strings.concat(#numbers.formatInteger(clearInfo.price, 1, 'COMMA'), '원')}"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="tab-pane fade p-2" id="resultReportViewTabPanel" role="tabpanel" aria-labelledby="resultReportViewTab" tabindex="0">
<div class="row mb-1">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">작성자</label>
<th:block th:each="commonCode:${session.commonCode.get('JT')}">
@ -80,7 +156,7 @@
</div>
</div>
</div>
<div class="tab-pane fade p-2" id="fileTabPanel" role="tabpanel" tabindex="0">
<div class="tab-pane fade p-2" id="affairListViewTabPanel" role="tabpanel" aria-labelledby="affairListViewTab" tabindex="0">
<table class="table">
<thead>
<tr>