diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/AffairController.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/AffairController.java index 81f2ac5d..75663380 100644 --- a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/AffairController.java +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/AffairController.java @@ -8,6 +8,7 @@ import com.dbnt.faisp.main.fpiMgt.affair.model.AffairRating; import com.dbnt.faisp.main.fpiMgt.affair.model.TypeStatistics; import com.dbnt.faisp.main.fpiMgt.affair.service.AffairService; import com.dbnt.faisp.main.userInfo.model.UserInfo; +import com.dbnt.faisp.util.Utils; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; @@ -35,12 +36,7 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 @GetMapping("/affairMgt") public ModelAndView affairMgtPage(@AuthenticationPrincipal UserInfo loginUser, AffairBoard affairBoard){ ModelAndView mav; - if(affairBoard.getDashboardFlag()){ - mav = new ModelAndView("igActivities/fpiMgt/affair/affairMgtDashboard"); - affairBoard.setRowCnt(5); - }else{ - mav = new ModelAndView("igActivities/fpiMgt/affair/affairMgt"); - } + mav = new ModelAndView("igActivities/fpiMgt/affair/affairMgt"); mav.addObject("page", "main"); mav.addObject("searchUrl", "/affair/affairMgt"); //메뉴권한 확인 @@ -50,6 +46,7 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 case "ACC001": // 조회 case "ACC002": // 작성 affairBoard.setWrtUserSeq(loginUser.getUserSeq()); + affairBoard.setRatingOrgan(loginUser.getOgCd()); break; case "ACC003": // 관리 // 자신 외 하위 기관에서 작성한 문서 열람가능 affairBoard.setDownOrganCdList(loginUser.getDownOrganCdList()); @@ -59,7 +56,6 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 //결재권한 확인 String apprvAuth = authMgtService.selectApprovalConfigList (loginUser.getUserSeq(), "/affair/affairMgt?affairCategory="+affairBoard.getAffairCategory()).get(0).getApprovalAuth(); - affairBoard.setRatingOrgan(loginUser.getOgCd()); mav.addObject("accessAuth", accessAuth); mav.addObject("apprvAuth", apprvAuth); @@ -82,6 +78,7 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 switch (accessAuth){ case "ACC001": // 조회 case "ACC002": // 작성 + affairBoard.setRatingOrgan(loginUser.getOgCd()); break; case "ACC003": // 관리 // 자신 외 하위 기관에서 작성한 문서 열람가능 affairBoard.setDownOrganCdList(loginUser.getDownOrganCdList()); @@ -91,7 +88,6 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 //결재권한 확인 String apprvAuth = authMgtService.selectApprovalConfigList (loginUser.getUserSeq(), "/affair/affairMgt?affairCategory="+affairBoard.getAffairCategory()).get(0).getApprovalAuth(); - affairBoard.setRatingOrgan(loginUser.getOgCd()); if(apprvAuth==null) { if(!accessAuth.equals("ACC003")){ affairBoard.setWrtUserSeq(loginUser.getUserSeq()); @@ -135,6 +131,7 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 switch (accessAuth){ case "ACC001": // 조회 case "ACC002": // 작성 + affairBoard.setRatingOrgan(loginUser.getOgCd()); break; case "ACC003": // 관리 // 자신 외 하위 기관에서 작성한 문서 열람가능 affairBoard.setDownOrganCdList(loginUser.getDownOrganCdList()); @@ -144,7 +141,6 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 //결재권한 확인 String apprvAuth = authMgtService.selectApprovalConfigList (loginUser.getUserSeq(), "/affair/affairMgt?affairCategory="+affairBoard.getAffairCategory()).get(0).getApprovalAuth(); - affairBoard.setRatingOrgan(loginUser.getOgCd()); if(apprvAuth==null) { if(!accessAuth.equals("ACC003")){ affairBoard.setWrtUserSeq(loginUser.getUserSeq()); @@ -212,6 +208,14 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 affairBoard.setAffairStatus(rating.getAffairStatus()); } } + if(Utils.isEmpty(affairBoard.getAffairStatus())){ + for(AffairRating rating: affairBoard.getRateList()){ + if(rating.getOrganUp()==null || !rating.getOrganUp().equals("T")){ + affairBoard.setAffairStatus(rating.getAffairStatus()); + break; + } + } + } mav.addObject("affair", affairBoard); mav.addObject("userSeq",loginUser.getUserSeq()); mav.addObject("userOrgan", loginUser.getOgCd()); @@ -237,6 +241,10 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 public Integer affairStateChange(@AuthenticationPrincipal UserInfo loginUser, @RequestBody List ratingList){ return affairService.affairStateChange(loginUser, ratingList); } + @PostMapping("/modifyAffairRating") + public Integer modifyAffairRating(@AuthenticationPrincipal UserInfo loginUser, AffairBoard affairBoard){ + return affairService.updateAffairRating(loginUser, affairBoard.getRateList()); + } @GetMapping("/statistics") public ModelAndView statistics(@AuthenticationPrincipal UserInfo loginUser, TypeStatistics typeStatistics){ diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/model/AffairRating.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/model/AffairRating.java index be5531c1..7f838e37 100644 --- a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/model/AffairRating.java +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/model/AffairRating.java @@ -3,6 +3,7 @@ package com.dbnt.faisp.main.fpiMgt.affair.model; import lombok.*; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; +import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.io.Serializable; @@ -28,6 +29,7 @@ public class AffairRating{ @Column(name = "section_nm") private String sectionNm; @Column(name = "section_apprv_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime sectionApprvDt; @Column(name = "section_apprv") private String sectionApprv; @@ -38,6 +40,7 @@ public class AffairRating{ @Column(name = "head_nm") private String headNm; @Column(name = "head_apprv_dt") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime headApprvDt; @Column(name = "head_apprv") private String headApprv; diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/repository/AffairRatingRepository.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/repository/AffairRatingRepository.java index 605e774d..7300417e 100644 --- a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/repository/AffairRatingRepository.java +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/repository/AffairRatingRepository.java @@ -8,4 +8,6 @@ import java.util.List; public interface AffairRatingRepository extends JpaRepository { List findByAffairKeyOrderByRatingOrganAsc(Integer affairKey); + + void deleteByAffairKey(Integer affairKey); } diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/service/AffairService.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/service/AffairService.java index 89bae287..576a4231 100644 --- a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/service/AffairService.java +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/service/AffairService.java @@ -7,8 +7,10 @@ import com.dbnt.faisp.main.fpiMgt.affair.mapper.AffairMapper; import com.dbnt.faisp.main.fpiMgt.affair.model.*; import com.dbnt.faisp.main.fpiMgt.affair.repository.*; import com.dbnt.faisp.main.hashTag.service.HashTagService; +import com.dbnt.faisp.main.organMgt.service.OrganConfigService; import com.dbnt.faisp.main.userInfo.model.UserInfo; import com.dbnt.faisp.main.userInfo.service.UserAlarmService; +import com.dbnt.faisp.util.Utils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -26,6 +28,7 @@ public class AffairService extends BaseService { // 견문보고 private final UserAlarmService userAlarmService; private final HashTagService hashTagService; + private final OrganConfigService organConfigService; private final AffairBoardRepository affairBoardRepository; private final AffairFileRepository affairFileRepository; private final AffairRatingRepository affairRatingRepository; @@ -131,10 +134,12 @@ public class AffairService extends BaseService { // 견문보고 savedRating.setAffairStatus(rating.getSectionApprv()); switch (rating.getSectionApprv()){ case "DST004": + //부장 결재자에게 대기문서 알림 생성 userAlarmService.sendAlarmToApprvUser(savedRating.getAffairKey(), savedRating.getRatingOrgan(), "APC001", 30, "견문보고에 결재대기 문서가 있습니다."); userAlarmService.sendAlarmToApprvUser(savedRating.getAffairKey(), savedRating.getRatingOrgan(), "APC002", 30, "견문보고에 결재대기 문서가 있습니다."); break; case "DST003": + //작성자에게 반려 알림 생성 AffairBoard affairBoard = affairBoardRepository.findById(rating.getAffairKey()).orElse(new AffairBoard()); userAlarmService.sendAlarmToWrtUser(savedRating.getAffairKey(), affairBoard.getWrtUserSeq(), 30, affairBoard.getTitle()+" 문서가 반려되었습니다."); break; @@ -147,9 +152,9 @@ public class AffairService extends BaseService { // 견문보고 savedRating.setAffairRate(rating.getAffairRate()); savedRating.setOrganUp(rating.getOrganUp()==null?"F":rating.getOrganUp()); savedRating.setAffairStatus(rating.getHeadApprv()); + if(savedRating.getOrganUp().equals("T")){ - List organList = loginUser.getUpOrganCdList(); - String upOrgan = organList.get(organList.indexOf(savedRating.getRatingOrgan())-1); + String upOrgan = organConfigService.selectParentOrgan(loginUser.getOgCd()); AffairRating upRating = new AffairRating(); upRating.setRatingOrgan(upOrgan); upRating.setAffairKey(savedRating.getAffairKey()); @@ -161,6 +166,7 @@ public class AffairService extends BaseService { // 견문보고 userAlarmService.sendAlarmToApprvUser(savedRating.getAffairKey(), upOrgan, "APC004", 30, "견문보고에 결재대기 문서가 있습니다."); } + // 작성자에게 문서 결제 알림 생성. AffairBoard affairBoard = affairBoardRepository.findById(rating.getAffairKey()).orElse(new AffairBoard()); switch (rating.getHeadApprv()){ case "DST006": @@ -177,6 +183,75 @@ public class AffairService extends BaseService { // 견문보고 return ratingList.size()>1?0:ratingList.get(0).getAffairKey(); } + @Transactional + public Integer updateAffairRating(UserInfo loginUser, List ratingList) { + int i= ratingList.size(); + boolean deleteFlag = false; + do{ + i--; + AffairRating rating = ratingList.get(i); + if(deleteFlag){ + affairRatingRepository.delete(rating); + }else{ + if(Utils.isEmpty(rating.getSectionApprv())){ + rating.setSectionNm(null); + rating.setSectionTitle(null); + rating.setSectionApprvDt(null); + rating.setHeadNm(null); + rating.setHeadTitle(null); + rating.setHeadApprv(null); + rating.setHeadApprvDt(null); + rating.setAffairRate(null); + rating.setOrganUp(null); + deleteFlag = true; + }else{ + if(Utils.isEmpty(rating.getSectionNm())){ + rating.setSectionNm(loginUser.getUserNm()); + rating.setSectionTitle(loginUser.getTitleCd()); + rating.setSectionApprvDt(LocalDateTime.now()); + } + } + if(Utils.isEmpty(rating.getHeadApprv())){ + rating.setHeadNm(null); + rating.setHeadTitle(null); + rating.setHeadApprvDt(null); + rating.setAffairRate(null); + }else{ + if(Utils.isEmpty(rating.getHeadNm())){ + rating.setHeadNm(loginUser.getUserNm()); + rating.setHeadTitle(loginUser.getTitleCd()); + rating.setHeadApprvDt(LocalDateTime.now()); + } + } + if(!rating.getRatingOrgan().equals("OG001")){ + if(rating.getOrganUp()==null || rating.getOrganUp().equals("F")){ + deleteFlag = true; + }else { + String upOrgan = organConfigService.selectParentOrgan(rating.getRatingOrgan()); + AffairRating upRating = new AffairRating(); + upRating.setRatingOrgan(upOrgan); + upRating.setAffairKey(rating.getAffairKey()); + upRating.setAffairStatus("DST002"); + affairRatingRepository.save(upRating); + // 상보시 상위관서 계장 결재권한 사용자에게 알림 생성 + userAlarmService.sendAlarmToApprvUser(rating.getAffairKey(), upOrgan, "APC003", 30, "견문보고에 결재대기 문서가 있습니다."); + userAlarmService.sendAlarmToApprvUser(rating.getAffairKey(), upOrgan, "APC004", 30, "견문보고에 결재대기 문서가 있습니다."); + } + } + if(!Utils.isEmpty(rating.getHeadApprv())){ + rating.setAffairStatus(rating.getHeadApprv()); + }else if(!Utils.isEmpty(rating.getSectionApprv())) { + rating.setAffairStatus(rating.getSectionApprv()); + }else{ + rating.setAffairStatus("DST002"); + } + affairRatingRepository.save(rating); + } + }while (i!=0); + + return ratingList.get(0).getAffairKey(); + } + public FileInfo selectAffairFile(Integer parentKey, Integer fileSeq) { return affairFileRepository.findById(new AffairFile.AffairFileId(parentKey, fileSeq)).orElse(null); } @@ -218,4 +293,5 @@ public class AffairService extends BaseService { // 견문보고 public List selectArrCntList(TypeStatistics typeStatistics) { return affairMapper.selectArrCntList(typeStatistics); } + } diff --git a/src/main/java/com/dbnt/faisp/main/organMgt/service/OrganConfigService.java b/src/main/java/com/dbnt/faisp/main/organMgt/service/OrganConfigService.java index 1b5834d6..2f0cebc9 100644 --- a/src/main/java/com/dbnt/faisp/main/organMgt/service/OrganConfigService.java +++ b/src/main/java/com/dbnt/faisp/main/organMgt/service/OrganConfigService.java @@ -37,6 +37,9 @@ public class OrganConfigService { upOrganList.add(ogCd); return upOrganList; } + public String selectParentOrgan(String ogCd){ + return organConfigRepository.findById(ogCd).orElse(new OrganConfig()).getParentOrgan(); + } public List selectOrganList() { List codeList = codeMgtService.selectCodeMgtList("OG"); diff --git a/src/main/resources/mybatisMapper/AffairMapper.xml b/src/main/resources/mybatisMapper/AffairMapper.xml index 63f0b927..b316e666 100644 --- a/src/main/resources/mybatisMapper/AffairMapper.xml +++ b/src/main/resources/mybatisMapper/AffairMapper.xml @@ -43,12 +43,12 @@ and a.wrt_dt <= #{endDate}::date+1 - - and c.rating_organ = #{ratingOrgan} - - - and (c.organ_up != 'T' or c.organ_up is null) - + + and c.rating_organ = #{ratingOrgan} + + + and (c.organ_up != 'T' or c.organ_up is null) + and a.wrt_organ in diff --git a/src/main/resources/static/js/igActivities/fpiMgt/affair/affairMgt.js b/src/main/resources/static/js/igActivities/fpiMgt/affair/affairMgt.js index 8272b7f8..7a2c5744 100644 --- a/src/main/resources/static/js/igActivities/fpiMgt/affair/affairMgt.js +++ b/src/main/resources/static/js/igActivities/fpiMgt/affair/affairMgt.js @@ -42,6 +42,66 @@ $(document).on('click', '#editAffairBtn', function (){ $("#affairViewModal").modal('hide'); getAffairEditModal(Number($("#affairViewBody").find("[name='affairKey']").val())); }) +$(document).on('click', '#modifyRatingViewBtn', function (){ + const modifyRatingDiv = $("#modifyRatingDiv") + const ratingViewDiv = $("#ratingViewDiv") + if(modifyRatingDiv.attr("data-state")==="hide"){ + modifyRatingDiv.attr("data-state", "show") + modifyRatingDiv.show(); + ratingViewDiv.hide(); + }else{ + modifyRatingDiv.attr("data-state", "hide") + modifyRatingDiv.hide(); + ratingViewDiv.show(); + } +}) +$(document).on('change', '.sectionApprv', function (){ + if(this.value === "" || this.value==="DST003"){ + $(this).parents(".affairRatingRow").find("input, select").attr("disabled", "disabled") + $(this).removeAttr("disabled") + }else{ + $(this).parents(".affairRatingRow").find("input, select").removeAttr("disabled") + } +}) +$(document).on('change', '.headApprv', function (){ + if(this.value === "" || this.value==="DST005"){ + $(this).parents(".row").find("input, select").attr("disabled", "disabled") + $(this).removeAttr("disabled") + }else{ + $(this).parents(".row").find("input, select").removeAttr("disabled") + } +}) +$(document).on('change', '.organUp', function (){ + if(!this.checked){ + if(confirm("상위관서 결재정보가 삭제됩니다. 계속하시겠습니까?")){ + const ratingOrgan = $(this).parents(".affairRatingRow").attr("data-ratingorgan") + $.each($(".affairRatingRow"), function (idx, row){ + if($(row).attr("data-ratingorgan")===ratingOrgan){ + return false; + }else{ + $(row).find("input, select").attr("disabled", "disabled") + } + }) + }else{ + this.checked = true; + } + }else{ + const affairRatingRow = $(".affairRatingRow"); + let nextRowFlag = true; + for(let i=affairRatingRow.length-1; i>=0; i--){ + const row = $(affairRatingRow[i]); + if(nextRowFlag){ + row.find("input, select").removeAttr("disabled") + } + if(row.find('.organUp')[0] !== undefined){ + nextRowFlag = row.find('.organUp')[0].checked; + } + } + } +}) +$(document).on('click', '#modifyRatingBtn', function (){ + modifyAffairRating(); +}) $(document).on('change', '#autoDeleteSelector', function (){ let deleteDt = ""; @@ -245,6 +305,55 @@ function saveAffair(affairStatus){ } } +function modifyAffairRating(){ + if(confirm("결재 상태를 수정하시겠습니까?")){ + contentFade("in"); + const formData = new FormData(); + $.each($(".affairRatingRow"), function (idx, div){ + const row = $(div); + formData.append('rateList['+idx+'].affairKey', $("#viewModalAffairKey").val()); + formData.append('rateList['+idx+'].ratingOrgan', row.attr("data-ratingorgan")); + if(row.find(".sectionApprv").length>0){ + formData.append('rateList['+idx+'].sectionTitle', row.find(".sectionTitle").val()); + formData.append('rateList['+idx+'].sectionNm', row.find(".sectionNm").val()); + formData.append('rateList['+idx+'].sectionApprv', row.find(".sectionApprv").val()); + formData.append('rateList['+idx+'].sectionApprvDt', row.find(".sectionApprvDt").val()); + formData.append('rateList['+idx+'].sectionEtc', row.find(".sectionEtc").val()); + } + if(row.find(".headApprv").length>0){ + formData.append('rateList['+idx+'].headTitle', row.find(".headTitle").val()); + formData.append('rateList['+idx+'].headNm', row.find(".headNm").val()); + formData.append('rateList['+idx+'].headApprv', row.find(".headApprv").val()); + formData.append('rateList['+idx+'].headApprvDt', row.find(".headApprvDt").val()); + formData.append('rateList['+idx+'].affairRate', row.find(".affairRate").val()); + if(row.find(".organUp").length>0){ + formData.append('rateList['+idx+'].organUp', row.find(".organUp")[0].checked?'T':'F'); + } + formData.append('rateList['+idx+'].headEtc', row.find(".headEtc").val()); + } + }) + $.ajax({ + type : 'POST', + data : formData, + url : "/affair/modifyAffairRating", + processData: false, + contentType: false, + beforeSend: function (xhr){ + xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val()); + }, + success : function(result) { + alert("수정되었습니다."); + contentFade("out"); + getAffairViewModal(result); + }, + error : function(xhr, status) { + alert("수정에 실패하였습니다.") + contentFade("out"); + } + }) + } +} + function affairStateChange(ratingList){ contentFade("in") $.ajax({ diff --git a/src/main/resources/templates/igActivities/fpiMgt/affair/affairEditModal.html b/src/main/resources/templates/igActivities/fpiMgt/affair/affairEditModal.html index 8a238673..8b879f93 100644 --- a/src/main/resources/templates/igActivities/fpiMgt/affair/affairEditModal.html +++ b/src/main/resources/templates/igActivities/fpiMgt/affair/affairEditModal.html @@ -8,7 +8,7 @@
- + @@ -117,57 +117,6 @@
- - - -
-
- -
-
- -
-
- -
평가 정보가 없습니다.
-
- - -
-
- -
- - - - -
-
-
- -
- -
-
-
-
-
-
-
-
-