외사첩보망, 외사모니터링 조회모달 결재버튼 오류 수정.

master
강석 최 2023-06-07 18:31:10 +09:00
parent 77bc993246
commit 1ecc311a7c
7 changed files with 236 additions and 194 deletions

View File

@ -136,10 +136,10 @@ public class IntelligenceNetworkController {
}
@GetMapping("/operationPlanViewModal")
public ModelAndView operationPlanViewModal(@AuthenticationPrincipal UserInfo loginUser, OperationPlan op){
public ModelAndView operationPlanViewModal(@AuthenticationPrincipal UserInfo loginUser, OperationPlan operationPlan){
ModelAndView mav = new ModelAndView("igActivities/intelligenceNetwork/operationPlanViewModal");
op = intelligenceNetworkService.selectOperationPlan(op.getOpKey());
mav.addObject("op", op);
operationPlan = intelligenceNetworkService.selectOperationPlan(operationPlan.getOpKey());
mav.addObject("operationPlan", operationPlan);
mav.addObject("userSeq",loginUser.getUserSeq());
mav.addObject("viewOrgan",loginUser.getOgCd());
//메뉴권한 확인

View File

@ -47,93 +47,93 @@ public class IntelligenceNetworkService extends BaseService {
@Transactional
public Integer saveOperationPlan(OperationPlan op, List<Integer> deleteFileSeq) {
Integer opKey = operationPlanRepository.save(op).getOpKey();
if(deleteFileSeq != null && deleteFileSeq.size()>0){
deleteOperationPlanFile(opKey, deleteFileSeq);
}
if(op.getMultipartFileList()!=null){
saveOperationPlanUploadFiles(opKey, op.getMultipartFileList());
}
if(op.getOpState().equals("DST002")){
//작성완료일 때 부장 결재 사용자에게 알림 발송.
userAlarmService.sendAlarmToApprvUser(opKey, op.getWrtOrgan(), "APC001", 32, "외사첩보망 견문관리 운영계획에 결재대기 문서가 있습니다.");
userAlarmService.sendAlarmToApprvUser(opKey, op.getWrtOrgan(), "APC002", 32, "외사첩보망 견문관리 운영계획에 결재대기 문서가 있습니다.");
}
return opKey;
Integer opKey = operationPlanRepository.save(op).getOpKey();
if(deleteFileSeq != null && deleteFileSeq.size()>0){
deleteOperationPlanFile(opKey, deleteFileSeq);
}
if(op.getMultipartFileList()!=null){
saveOperationPlanUploadFiles(opKey, op.getMultipartFileList());
}
if(op.getOpState().equals("DST002")){
//작성완료일 때 부장 결재 사용자에게 알림 발송.
userAlarmService.sendAlarmToApprvUser(opKey, op.getWrtOrgan(), "APC001", 32, "외사첩보망 견문관리 운영계획에 결재대기 문서가 있습니다.");
userAlarmService.sendAlarmToApprvUser(opKey, op.getWrtOrgan(), "APC002", 32, "외사첩보망 견문관리 운영계획에 결재대기 문서가 있습니다.");
}
return opKey;
}
private void deleteOperationPlanFile(Integer opKey, List<Integer> deleteFileSeq) {
List<OperationPlanFile> operationPlanFileList = operationPlanFileRepository.findByOpKey(opKey);
for(OperationPlanFile file: operationPlanFileList){
if(deleteFileSeq.contains(file.getFileSeq())){
deleteStoredFile(new File(file.getSavePath(), file.getConvNm()));
operationPlanFileRepository.delete(file);
}
}
List<OperationPlanFile> operationPlanFileList = operationPlanFileRepository.findByOpKey(opKey);
for(OperationPlanFile file: operationPlanFileList){
if(deleteFileSeq.contains(file.getFileSeq())){
deleteStoredFile(new File(file.getSavePath(), file.getConvNm()));
operationPlanFileRepository.delete(file);
}
}
}
private void saveOperationPlanUploadFiles(Integer opKey, List<MultipartFile> multipartFileList){
OperationPlanFile lastFileInfo = operationPlanFileRepository.findTopByOpKeyOrderByFileSeqDesc(opKey).orElse(null);
int fileSeq = lastFileInfo==null?1:(lastFileInfo.getFileSeq()+1);
for(MultipartFile file : multipartFileList){
String saveName = UUID.randomUUID().toString();
String path = locationPath+intelligenceNetworkPath;
saveFile(file, new File(path+File.separator+saveName));
OperationPlanFile lastFileInfo = operationPlanFileRepository.findTopByOpKeyOrderByFileSeqDesc(opKey).orElse(null);
int fileSeq = lastFileInfo==null?1:(lastFileInfo.getFileSeq()+1);
for(MultipartFile file : multipartFileList){
String saveName = UUID.randomUUID().toString();
String path = locationPath+intelligenceNetworkPath;
saveFile(file, new File(path+File.separator+saveName));
String originalFilename = file.getOriginalFilename();
int extnIdx = originalFilename.lastIndexOf(".");
OperationPlanFile fileInfo = new OperationPlanFile();
fileInfo.setOpKey(opKey);
fileInfo.setFileSeq(fileSeq++);
fileInfo.setOrigNm(originalFilename.substring(0, extnIdx));
fileInfo.setFileExtn(originalFilename.substring(extnIdx+1));
fileInfo.setConvNm(saveName);
fileInfo.setFileSize(calculationSize(file.getSize()));
fileInfo.setSavePath(path);
operationPlanFileRepository.save(fileInfo);
}
}
String originalFilename = file.getOriginalFilename();
int extnIdx = originalFilename.lastIndexOf(".");
OperationPlanFile fileInfo = new OperationPlanFile();
fileInfo.setOpKey(opKey);
fileInfo.setFileSeq(fileSeq++);
fileInfo.setOrigNm(originalFilename.substring(0, extnIdx));
fileInfo.setFileExtn(originalFilename.substring(extnIdx+1));
fileInfo.setConvNm(saveName);
fileInfo.setFileSize(calculationSize(file.getSize()));
fileInfo.setSavePath(path);
operationPlanFileRepository.save(fileInfo);
}
}
public List<OperationPlan> selectOperationPlanList(OperationPlan op) {
return intelligenceNetworkMapper.selectOperationPlanList(op);
return intelligenceNetworkMapper.selectOperationPlanList(op);
}
public Integer selectOperationPlanListCnt(OperationPlan op) {
return intelligenceNetworkMapper.selectOperationPlanListCnt(op);
return intelligenceNetworkMapper.selectOperationPlanListCnt(op);
}
public OperationPlan selectOperationPlan(Integer opKey) {
OperationPlan savedOperationPlan = operationPlanRepository.findById(opKey).orElse(null);
if (savedOperationPlan != null) {
savedOperationPlan.setFileList(operationPlanFileRepository.findByOpKey(opKey));
savedOperationPlan.setApprvList(operationPlanApprvRepository.findByOpKey(opKey));
}
return savedOperationPlan;
OperationPlan operationPlan = operationPlanRepository.findById(opKey).orElse(null);
if (operationPlan != null) {
operationPlan.setFileList(operationPlanFileRepository.findByOpKey(opKey));
operationPlan.setApprvList(operationPlanApprvRepository.findByOpKey(opKey));
}
return operationPlan;
}
@Transactional
public Integer operationPlanStateChange(OperationPlanApprv apprv) {
OperationPlan saveOperationPlan = operationPlanRepository.findById(apprv.getOpKey()).orElse(null);
saveOperationPlan.setOpState(apprv.getState());
OperationPlanApprv lastApprv = operationPlanApprvRepository.findTopByOpKeyOrderByApprvSeqDesc(apprv.getOpKey()).orElse(null);
apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1);
operationPlanApprvRepository.save(apprv);
OperationPlan saveOperationPlan = operationPlanRepository.findById(apprv.getOpKey()).orElse(null);
saveOperationPlan.setOpState(apprv.getState());
OperationPlanApprv lastApprv = operationPlanApprvRepository.findTopByOpKeyOrderByApprvSeqDesc(apprv.getOpKey()).orElse(null);
apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1);
operationPlanApprvRepository.save(apprv);
switch (apprv.getState()){
case "DST005":
// 반려시 작성자에게 반려 알림 발송
userAlarmService.sendAlarmToWrtUser(saveOperationPlan.getOpKey(), saveOperationPlan.getWrtUserSeq(), 32,"외사첩보망 견문관리 운영계획에 문서가 반려되었습니다.");
break;
case "DST006":
// 부장승인시 작성자에게 승인 알림 발송
userAlarmService.sendAlarmToWrtUser(saveOperationPlan.getOpKey(), saveOperationPlan.getWrtUserSeq(), 32,"외사첩보망 견문관리 운영계획에 문서가 승인되었습니다.");
break;
}
return apprv.getOpKey();
switch (apprv.getState()){
case "DST005":
// 반려시 작성자에게 반려 알림 발송
userAlarmService.sendAlarmToWrtUser(saveOperationPlan.getOpKey(), saveOperationPlan.getWrtUserSeq(), 32,"외사첩보망 견문관리 운영계획에 문서가 반려되었습니다.");
break;
case "DST006":
// 부장승인시 작성자에게 승인 알림 발송
userAlarmService.sendAlarmToWrtUser(saveOperationPlan.getOpKey(), saveOperationPlan.getWrtUserSeq(), 32,"외사첩보망 견문관리 운영계획에 문서가 승인되었습니다.");
break;
}
return apprv.getOpKey();
}
public OperationPlanFile selectOperationPlanFile(Integer parentKey, Integer fileSeq) {
return operationPlanFileRepository.findById(new OperationPlanFileId(parentKey,fileSeq)).orElse(null);
return operationPlanFileRepository.findById(new OperationPlanFileId(parentKey,fileSeq)).orElse(null);
}
@Transactional
@ -142,65 +142,65 @@ public class IntelligenceNetworkService extends BaseService {
}
public IntelligenceAnalyze selectAffairCnt(IntelligenceAnalyze ia) {
return intelligenceNetworkMapper.selectAffairCnt(ia);
return intelligenceNetworkMapper.selectAffairCnt(ia);
}
@Transactional
public Integer saveIntelligenceAnalyze(IntelligenceAnalyze ia) {
Integer iaKey = intelligenceAnalyzeRepository.save(ia).getIaKey();
IntelligenceAnalyzeToAffair iata = new IntelligenceAnalyzeToAffair();
iata.setIaKey(iaKey);
for(Integer affairKey : ia.getAffairList()) {
iata.setAffairKey(affairKey);
intelligenceAnalyzeToAffairRepository.save(iata);
}
if(ia.getIaState().equals("DST002")){
//작성완료일 때 부장 결재 사용자에게 알림 발송.
userAlarmService.sendAlarmToApprvUser(iaKey, ia.getWrtOrgan(), "APC001", 34, "외사첩보망 견문관리 운영실적에 결재대기 문서가 있습니다.");
userAlarmService.sendAlarmToApprvUser(iaKey, ia.getWrtOrgan(), "APC002", 34, "외사첩보망 견문관리 운영실적에 결재대기 문서가 있습니다.");
}
return iaKey;
Integer iaKey = intelligenceAnalyzeRepository.save(ia).getIaKey();
IntelligenceAnalyzeToAffair iata = new IntelligenceAnalyzeToAffair();
iata.setIaKey(iaKey);
for(Integer affairKey : ia.getAffairList()) {
iata.setAffairKey(affairKey);
intelligenceAnalyzeToAffairRepository.save(iata);
}
if(ia.getIaState().equals("DST002")){
//작성완료일 때 부장 결재 사용자에게 알림 발송.
userAlarmService.sendAlarmToApprvUser(iaKey, ia.getWrtOrgan(), "APC001", 34, "외사첩보망 견문관리 운영실적에 결재대기 문서가 있습니다.");
userAlarmService.sendAlarmToApprvUser(iaKey, ia.getWrtOrgan(), "APC002", 34, "외사첩보망 견문관리 운영실적에 결재대기 문서가 있습니다.");
}
return iaKey;
}
public List<IntelligenceAnalyze> selectIntelligenceAnalyzeList(IntelligenceAnalyze ia) {
return intelligenceNetworkMapper.selectIntelligenceAnalyzeList(ia);
return intelligenceNetworkMapper.selectIntelligenceAnalyzeList(ia);
}
public Integer selectIntelligenceAnalyzeListCnt(IntelligenceAnalyze ia) {
return intelligenceNetworkMapper.selectIntelligenceAnalyzeListCnt(ia);
return intelligenceNetworkMapper.selectIntelligenceAnalyzeListCnt(ia);
}
public IntelligenceAnalyze selectIntelligenceAnalyze(IntelligenceAnalyze ia) {
return intelligenceNetworkMapper.selectIntelligenceAnalyze(ia);
return intelligenceNetworkMapper.selectIntelligenceAnalyze(ia);
}
public List<Integer> selectIntelligenceAnalyzeAffairKey(IntelligenceAnalyze ia) {
return intelligenceNetworkMapper.selectIntelligenceAnalyzeAffairKey(ia);
return intelligenceNetworkMapper.selectIntelligenceAnalyzeAffairKey(ia);
}
public List<IntelligenceAnalyzeApprv> selectIntelligenceAnalyzeApprv(IntelligenceAnalyze ia) {
return intelligenceAnalyzeApprvRepository.findByIaKey(ia.getIaKey());
return intelligenceAnalyzeApprvRepository.findByIaKey(ia.getIaKey());
}
@Transactional
public Integer intelligenceAnalyzeChange(IntelligenceAnalyzeApprv apprv) {
IntelligenceAnalyze saveIntelligenceAnalyze = intelligenceAnalyzeRepository.findById(apprv.getIaKey()).orElse(null);
saveIntelligenceAnalyze.setIaState(apprv.getState());
IntelligenceAnalyzeApprv lastApprv = intelligenceAnalyzeApprvRepository.findTopByIaKeyOrderByApprvSeqDesc(apprv.getIaKey()).orElse(null);
apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1);
intelligenceAnalyzeApprvRepository.save(apprv);
IntelligenceAnalyze saveIntelligenceAnalyze = intelligenceAnalyzeRepository.findById(apprv.getIaKey()).orElse(null);
saveIntelligenceAnalyze.setIaState(apprv.getState());
IntelligenceAnalyzeApprv lastApprv = intelligenceAnalyzeApprvRepository.findTopByIaKeyOrderByApprvSeqDesc(apprv.getIaKey()).orElse(null);
apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1);
intelligenceAnalyzeApprvRepository.save(apprv);
switch (apprv.getState()){
case "DST005":
// 반려시 작성자에게 반려 알림 발송
userAlarmService.sendAlarmToWrtUser(saveIntelligenceAnalyze.getIaKey(), saveIntelligenceAnalyze.getWrtUserSeq(), 34,"외사첩보망 견문관리 운영실적에 문서가 반려되었습니다.");
break;
case "DST006":
// 부장승인시 작성자에게 승인 알림 발송
userAlarmService.sendAlarmToWrtUser(saveIntelligenceAnalyze.getIaKey(), saveIntelligenceAnalyze.getWrtUserSeq(), 34,"외사첩보망 견문관리 운영실적에 문서가 승인되었습니다.");
break;
}
return apprv.getIaKey();
switch (apprv.getState()){
case "DST005":
// 반려시 작성자에게 반려 알림 발송
userAlarmService.sendAlarmToWrtUser(saveIntelligenceAnalyze.getIaKey(), saveIntelligenceAnalyze.getWrtUserSeq(), 34,"외사첩보망 견문관리 운영실적에 문서가 반려되었습니다.");
break;
case "DST006":
// 부장승인시 작성자에게 승인 알림 발송
userAlarmService.sendAlarmToWrtUser(saveIntelligenceAnalyze.getIaKey(), saveIntelligenceAnalyze.getWrtUserSeq(), 34,"외사첩보망 견문관리 운영실적에 문서가 승인되었습니다.");
break;
}
return apprv.getIaKey();
}
@Transactional
@ -210,51 +210,51 @@ public class IntelligenceNetworkService extends BaseService {
@Transactional
public Integer saveFireExtensionReport(FireExtensionReport fer) {
Integer ferKey = fireExtensionReportRepository.save(fer).getFerKey();
if(fer.getFerState().equals("DST002")){
//작성완료일 때 부장 결재 사용자에게 알림 발송.
userAlarmService.sendAlarmToApprvUser(ferKey, fer.getWrtOrgan(), "APC001", 35, "외사첩보망 견문관리 외사첩보망 해고(연장)보고에 결재대기 문서가 있습니다.");
userAlarmService.sendAlarmToApprvUser(ferKey, fer.getWrtOrgan(), "APC002", 35, "외사첩보망 견문관리 외사첩보망 해고(연장)보고에 결재대기 문서가 있습니다.");
}
return ferKey;
Integer ferKey = fireExtensionReportRepository.save(fer).getFerKey();
if(fer.getFerState().equals("DST002")){
//작성완료일 때 부장 결재 사용자에게 알림 발송.
userAlarmService.sendAlarmToApprvUser(ferKey, fer.getWrtOrgan(), "APC001", 35, "외사첩보망 견문관리 외사첩보망 해고(연장)보고에 결재대기 문서가 있습니다.");
userAlarmService.sendAlarmToApprvUser(ferKey, fer.getWrtOrgan(), "APC002", 35, "외사첩보망 견문관리 외사첩보망 해고(연장)보고에 결재대기 문서가 있습니다.");
}
return ferKey;
}
public List<FireExtensionReport> selectIFireExtensionReportList(FireExtensionReport fer) {
return intelligenceNetworkMapper.selectIFireExtensionReportList(fer);
return intelligenceNetworkMapper.selectIFireExtensionReportList(fer);
}
public Integer selectIFireExtensionReportListCnt(FireExtensionReport fer) {
return intelligenceNetworkMapper.selectIFireExtensionReportListCnt(fer);
return intelligenceNetworkMapper.selectIFireExtensionReportListCnt(fer);
}
public FireExtensionReport selectFireExtensionReportInfo(FireExtensionReport fer) {
FireExtensionReport savedFireExtensionReport = fireExtensionReportRepository.findByFerKey(fer.getFerKey()).orElse(null);
if (savedFireExtensionReport != null) {
savedFireExtensionReport.setOperationPlan(operationPlanRepository.findById(savedFireExtensionReport.getOpKey()).orElse(null));
savedFireExtensionReport.setApprvList(fireExtensionReportApprvRepository.findByFerKey(fer.getFerKey()));
}
return savedFireExtensionReport;
FireExtensionReport savedFireExtensionReport = fireExtensionReportRepository.findByFerKey(fer.getFerKey()).orElse(null);
if (savedFireExtensionReport != null) {
savedFireExtensionReport.setOperationPlan(operationPlanRepository.findById(savedFireExtensionReport.getOpKey()).orElse(null));
savedFireExtensionReport.setApprvList(fireExtensionReportApprvRepository.findByFerKey(fer.getFerKey()));
}
return savedFireExtensionReport;
}
@Transactional
public Integer fireExtensionReportStateChange(FireExtensionReportApprv apprv) {
FireExtensionReport saveFireExtensionReport = fireExtensionReportRepository.findById(apprv.getFerKey()).orElse(null);
saveFireExtensionReport.setFerState(apprv.getState());
FireExtensionReportApprv lastApprv = fireExtensionReportApprvRepository.findTopByFerKeyOrderByApprvSeqDesc(apprv.getFerKey()).orElse(null);
apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1);
fireExtensionReportApprvRepository.save(apprv);
FireExtensionReport saveFireExtensionReport = fireExtensionReportRepository.findById(apprv.getFerKey()).orElse(null);
saveFireExtensionReport.setFerState(apprv.getState());
FireExtensionReportApprv lastApprv = fireExtensionReportApprvRepository.findTopByFerKeyOrderByApprvSeqDesc(apprv.getFerKey()).orElse(null);
apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1);
fireExtensionReportApprvRepository.save(apprv);
switch (apprv.getState()){
case "DST005":
// 반려시 작성자에게 반려 알림 발송
userAlarmService.sendAlarmToWrtUser(saveFireExtensionReport.getFerKey(), saveFireExtensionReport.getWrtUserSeq(), 35,"외사첩보망 견문관리 외사첩보망 해고(연장)보고에 문서가 반려되었습니다.");
break;
case "DST006":
// 부장승인시 작성자에게 승인 알림 발송
userAlarmService.sendAlarmToWrtUser(saveFireExtensionReport.getFerKey(), saveFireExtensionReport.getWrtUserSeq(), 35,"외사첩보망 견문관리 외사첩보망 해고(연장)보고에 문서가 승인되었습니다.");
break;
}
return apprv.getFerKey();
switch (apprv.getState()){
case "DST005":
// 반려시 작성자에게 반려 알림 발송
userAlarmService.sendAlarmToWrtUser(saveFireExtensionReport.getFerKey(), saveFireExtensionReport.getWrtUserSeq(), 35,"외사첩보망 견문관리 외사첩보망 해고(연장)보고에 문서가 반려되었습니다.");
break;
case "DST006":
// 부장승인시 작성자에게 승인 알림 발송
userAlarmService.sendAlarmToWrtUser(saveFireExtensionReport.getFerKey(), saveFireExtensionReport.getWrtUserSeq(), 35,"외사첩보망 견문관리 외사첩보망 해고(연장)보고에 문서가 승인되었습니다.");
break;
}
return apprv.getFerKey();
}
@Transactional

View File

@ -132,9 +132,23 @@
</div>
<div class="col-auto">
<th:block th:if="${fer.wrtOrgan eq viewOrgan}">
<th:block th:if="${(apprvAuth eq 'APC001' or apprvAuth eq 'APC002') and fer.ferState eq 'DST002'}">
<button type="button" class="btn btn-danger apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST003':'DST005'}" th:value="반려">반려</button>
<button type="button" class="btn btn-success apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST004':'DST006'}" th:value="승인">승인</button>
<th:block th:if="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004')) and fer.ferState eq 'DST002'}">
<!--계장, 계장대행 결재권한이 있으면서 결재대기상태-->
<th:block th:if="${#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')}">
<!--과장, 과장대행 결재권한이 있을경우-->
<button type="button" class="btn btn-danger apprvBtn" data-planstate="DST005">반려</button>
<button type="button" class="btn btn-success apprvBtn" data-planstate="DST006">승인</button>
</th:block>
<th:block th:unless="${#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')}">
<!--과장, 과장대행 결재권한이 없을경우-->
<button type="button" class="btn btn-danger apprvBtn" data-planstate="DST003">반려</button>
<button type="button" class="btn btn-success apprvBtn" data-planstate="DST004">승인</button>
</th:block>
</th:block>
<th:block th:if="${(#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')) and fer.ferState eq 'DST004'}">
<!--계장 권한 없이 과장, 과장대행 결재권한이 있을경우-->
<button type="button" class="btn btn-danger apprvBtn" data-planstate="DST005">반려</button>
<button type="button" class="btn btn-success apprvBtn" data-planstate="DST006">승인</button>
</th:block>
</th:block>
<th:block th:unless="${fer.ferState eq 'DST004' or fer.ferState eq 'DST006'}"><!--승인 상태일때는 수정 불가 -->

View File

@ -197,9 +197,23 @@
</div>
<div class="col-auto">
<th:block th:if="${ia.wrtOrgan eq viewOrgan}">
<th:block th:if="${(apprvAuth eq 'APC001' or apprvAuth eq 'APC002') and ia.iaState eq 'DST002'}">
<button type="button" class="btn btn-danger apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST003':'DST005'}" th:value="반려">반려</button>
<button type="button" class="btn btn-success apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST004':'DST006'}" th:value="승인">승인</button>
<th:block th:if="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004')) and ia.iaState eq 'DST002'}">
<!--계장, 계장대행 결재권한이 있으면서 결재대기상태-->
<th:block th:if="${#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')}">
<!--과장, 과장대행 결재권한이 있을경우-->
<button type="button" class="btn btn-danger apprvBtn" data-planstate="DST005">반려</button>
<button type="button" class="btn btn-success apprvBtn" data-planstate="DST006">승인</button>
</th:block>
<th:block th:unless="${#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')}">
<!--과장, 과장대행 결재권한이 없을경우-->
<button type="button" class="btn btn-danger apprvBtn" data-planstate="DST003">반려</button>
<button type="button" class="btn btn-success apprvBtn" data-planstate="DST004">승인</button>
</th:block>
</th:block>
<th:block th:if="${(#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')) and ia.iaState eq 'DST004'}">
<!--계장 권한 없이 과장, 과장대행 결재권한이 있을경우-->
<button type="button" class="btn btn-danger apprvBtn" data-planstate="DST005">반려</button>
<button type="button" class="btn btn-success apprvBtn" data-planstate="DST006">승인</button>
</th:block>
</th:block>
<th:block th:unless="${ia.iaState eq 'DST004' or ia.iaState eq 'DST006'}"><!--승인 상태일때는 수정 불가 -->

View File

@ -10,80 +10,80 @@
<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>
</li>
<li class="nav-item" role="presentation" th:if="${#lists.size(op.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(op.fileList), ')')}"></button>
<li class="nav-item" role="presentation" th:if="${#lists.size(operationPlan.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(operationPlan.fileList), ')')}"></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="row mb-1">
<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="${op.opSdate}"></label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opSdate}"></label>
<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 op.wrtUserGrd}" th:text="|${commonCode.itemValue} ${op.wrtUserNm}|"></label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:if="${commonCode.itemCd eq operationPlan.wrtUserGrd}" th:text="|${commonCode.itemValue} ${operationPlan.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(op.wrtDt, 'yyyy-MM-dd HH:mm')}"></label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:text="${#temporals.format(operationPlan.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 op.opState}" th:text="${commonCode.itemValue}"></label>
<label class="col-sm-2 col-form-label col-form-label-sm text-start" th:if="${commonCode.itemCd eq operationPlan.opState}" th:text="${commonCode.itemValue}"></label>
</th:block>
</div>
<hr>
<div class="row mb-1"><h6 class="">■ 정보협력자 구성</h6></div>
<div class="row text-center">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">성명:</label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${op.opName}"></label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opName}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">생년월일:</label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${op.opBirth}"></label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opBirth}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">근무처(소속):</label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${op.opPosition}"></label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opPosition}"></label>
</div>
<div class="row text-center">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">직업(직위):</label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${op.opJob}"></label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opJob}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">경력:</label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${op.opCareer}"></label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opCareer}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">연락처:</label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${op.opPhone}"></label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opPhone}"></label>
</div>
<div class="row">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">주소:</label>
<label class="col-sm-7 col-form-label col-form-label-sm text-start" th:text="${op.opAddress}"></label>
<label class="col-sm-7 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opAddress}"></label>
<label class="col-sm-1 col-form-label col-form-label-sm text-center">등급:</label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${op.opRank}"></label>
<label class="col-sm-3 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opRank}"></label>
</div>
<div class="row">
<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="${op.opEtc}"></label>
<label class="col-sm-11 col-form-label col-form-label-sm text-start" th:text="${operationPlan.opEtc}"></label>
</div>
<hr>
<div class="row">
<label class="col-sm-1 col-form-label col-form-label-sm text-center">대상목표<br><br>위지</label>
<div class="col-sm-11 form-control-sm" id="contentDiv">
<div th:utext="${#strings.replace(op.targetLocation, lineSeparator, '<br>')}"></div>
<div th:utext="${#strings.replace(operationPlan.targetLocation, lineSeparator, '<br>')}"></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:utext="${#strings.replace(op.vulnerabilityAnalyze, lineSeparator, '<br>')}"></div>
<div th:utext="${#strings.replace(operationPlan.vulnerabilityAnalyze, lineSeparator, '<br>')}"></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:utext="${#strings.replace(op.eligibilityAnalyze, lineSeparator, '<br>')}"></div>
<div th:utext="${#strings.replace(operationPlan.eligibilityAnalyze, lineSeparator, '<br>')}"></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:utext="${#strings.replace(op.focusCollection, lineSeparator, '<br>')}"></div>
<div th:utext="${#strings.replace(operationPlan.focusCollection, lineSeparator, '<br>')}"></div>
</div>
</div>
</div>
@ -96,13 +96,13 @@
</tr>
</thead>
<tbody>
<th:block th:if="${#lists.isEmpty(op.fileList)}">
<th:block th:if="${#lists.isEmpty(operationPlan.fileList)}">
<tr>
<td colspan="2">파일이 없습니다.</td>
</tr>
</th:block>
<th:block th:unless="${#lists.isEmpty(op.fileList)}">
<th:block th:each="file:${op.fileList}">
<th:block th:unless="${#lists.isEmpty(operationPlan.fileList)}">
<th:block th:each="file:${operationPlan.fileList}">
<tr class="fileInfoTr">
<td><a href="#" class="fileDownLink" data-board="operationPlan"
th:data-parentkey="${file.opKey}" th:data-fileseq="${file.fileSeq}" th:text="|${file.origNm}.${file.fileExtn}|"></a></td>
@ -114,9 +114,9 @@
</table>
</div>
<div class="row">
<div class="col-12" th:unless="${#lists.isEmpty(op.apprvList)}">
<div class="col-12" th:unless="${#lists.isEmpty(operationPlan.apprvList)}">
<hr>
<th:block th:each="apprv:${op.apprvList}">
<th:block th:each="apprv:${operationPlan.apprvList}">
<div class="row">
<th:block th:each="commonCode:${session.commonCode.get('DST')}">
<label class="col-sm-2 col-form-label col-form-label-sm text-center" th:if="${commonCode.itemCd eq apprv.state}" th:text="|결재결과: ${commonCode.itemValue}|"></label>
@ -137,7 +137,7 @@
<form action="#" method="post" id="apprvForm">
<div class="row">
<div class="col-10">
<input type="hidden" name="opKey" th:value="${op.opKey}">
<input type="hidden" name="opKey" th:value="${operationPlan.opKey}">
<input type="hidden" name="state" id="viewModalApprvValue">
</div>
</div>
@ -146,22 +146,36 @@
</div>
<div class="modal-footer justify-content-between bg-light">
<div class="col-auto">
<th:block th:unless="${op.opState eq 'DST004' or op.opState eq 'DST006'}">
<th:block th:if="${userSeq eq op.wrtUserSeq or accessAuth eq 'ACC003'}">
<button type="button" class="btn btn-danger" th:data-opkey="${op.opKey}" id="deleteBtn">삭제</button>
<th:block th:unless="${operationPlan.opState eq 'DST004' or operationPlan.opState eq 'DST006'}">
<th:block th:if="${userSeq eq operationPlan.wrtUserSeq or accessAuth eq 'ACC003'}">
<button type="button" class="btn btn-danger" th:data-opkey="${operationPlan.opKey}" id="deleteBtn">삭제</button>
</th:block>
</th:block>
</div>
<div class="col-auto">
<th:block th:if="${op.wrtOrgan eq viewOrgan}">
<th:block th:if="${(apprvAuth eq 'APC001' or apprvAuth eq 'APC002') and op.opState eq 'DST002'}">
<button type="button" class="btn btn-danger apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST003':'DST005'}" th:value="반려">반려</button>
<button type="button" class="btn btn-success apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST004':'DST006'}" th:value="승인">승인</button>
<th:block th:if="${operationPlan.wrtOrgan eq viewOrgan}">
<th:block th:if="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004')) and operationPlan.opState eq 'DST002'}">
<!--계장, 계장대행 결재권한이 있으면서 결재대기상태-->
<th:block th:if="${#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')}">
<!--과장, 과장대행 결재권한이 있을경우-->
<button type="button" class="btn btn-danger apprvBtn" data-planstate="DST005">반려</button>
<button type="button" class="btn btn-success apprvBtn" data-planstate="DST006">승인</button>
</th:block>
<th:block th:unless="${#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')}">
<!--과장, 과장대행 결재권한이 없을경우-->
<button type="button" class="btn btn-danger apprvBtn" data-planstate="DST003">반려</button>
<button type="button" class="btn btn-success apprvBtn" data-planstate="DST004">승인</button>
</th:block>
</th:block>
<th:block th:if="${(#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')) and operationPlan.opState eq 'DST004'}">
<!--계장 권한 없이 과장, 과장대행 결재권한이 있을경우-->
<button type="button" class="btn btn-danger apprvBtn" data-planstate="DST005">반려</button>
<button type="button" class="btn btn-success apprvBtn" data-planstate="DST006">승인</button>
</th:block>
</th:block>
<th:block th:unless="${op.opState eq 'DST004' or op.opState eq 'DST006'}"><!--승인 상태일때는 수정 불가 -->
<th:block th:if="${userSeq eq op.wrtUserSeq or accessAuth eq 'ACC003'}"><!--작성자일 경우 수정 허용--><!--관리자일 경우 수정 허용-->
<button type="button" class="btn btn-warning" th:data-opkey="${op.opKey}" id="editBtn">수정</button>
<th:block th:unless="${operationPlan.opState eq 'DST004' or operationPlan.opState eq 'DST006'}"><!--승인 상태일때는 수정 불가 -->
<th:block th:if="${userSeq eq operationPlan.wrtUserSeq or accessAuth eq 'ACC003'}"><!--작성자일 경우 수정 허용--><!--관리자일 경우 수정 허용-->
<button type="button" class="btn btn-warning" th:data-opkey="${operationPlan.opKey}" id="editBtn">수정</button>
</th:block>
</th:block>
</div>

View File

@ -124,8 +124,8 @@
</div>
</div>
<th:block th:if="${md.wrtOrgan eq viewOrgan}">
<th:block th:if="${(apprvAuth eq 'APC003' or apprvAuth eq 'APC004') and md.mdState eq 'DST002'
or (apprvAuth eq 'APC001' or apprvAuth eq 'APC002') and md.mdState eq 'DST004'}">
<th:block th:if="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004')) and md.mdState eq 'DST002'
or (#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')) and md.mdState eq 'DST004'}">
<div class="col-12">
<form action="#" method="post" id="apprvForm">
<div class="row">
@ -136,10 +136,10 @@
<input type="text" class="d-none" id="submitPrevention">
</div>
<div class="col-auto">
<input type="button" class="btn btn-sm btn-success apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST004':'DST006'}" value="승인">
<input type="button" class="btn btn-sm btn-success apprvBtn" th:data-planstate="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004'))?'DST004':'DST006'}" value="승인">
</div>
<div class="col-auto">
<input type="button" class="btn btn-sm btn-danger apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST003':'DST005'}" value="반려">
<input type="button" class="btn btn-sm btn-danger apprvBtn" th:data-planstate="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004'))?'DST003':'DST005'}" value="반려">
</div>
</div>
</form>

View File

@ -249,8 +249,8 @@
</div>
</div>
<th:block th:if="${mr.wrtOrgan eq viewOrgan}">
<th:block th:if="${(apprvAuth eq 'APC003' or apprvAuth eq 'APC004') and mr.mrState eq 'DST002'
or (apprvAuth eq 'APC001' or apprvAuth eq 'APC002') and mr.mrState eq 'DST004'}">
<th:block th:if="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004')) and mr.mrState eq 'DST002'
or (#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')) and mr.mrState eq 'DST004'}">
<div class="col-12">
<form action="#" method="post" id="apprvForm">
<hr>
@ -262,10 +262,10 @@
<input type="text" class="d-none" id="submitPrevention">
</div>
<div class="col-auto">
<input type="button" class="btn btn-sm btn-success apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST004':'DST006'}" value="승인">
<input type="button" class="btn btn-sm btn-success apprvBtn" th:data-planstate="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004'))?'DST004':'DST006'}" value="승인">
</div>
<div class="col-auto">
<input type="button" class="btn btn-sm btn-danger apprvBtn" th:data-planstate="${apprvAuth eq 'APC004'||apprvAuth eq 'APC003'?'DST003':'DST005'}" value="반려">
<input type="button" class="btn btn-sm btn-danger apprvBtn" th:data-planstate="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004'))?'DST003':'DST005'}" value="반려">
</div>
</div>
</form>