diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/FaispController.java b/src/main/java/com/dbnt/faisp/main/userInfo/FaispController.java index f5585478..dca47335 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/FaispController.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/FaispController.java @@ -153,6 +153,10 @@ public class FaispController { @GetMapping("/personnelStatus") public ModelAndView personnelStatus(@AuthenticationPrincipal UserInfo loginUser, PersonnelStatus personnelStatus){ ModelAndView mav = new ModelAndView("faisp/personnelStatus"); + //메뉴권한 확인 + String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faisp/personnelStatus").get(0).getAccessAuth(); + mav.addObject("accessAuth", accessAuth); + if(personnelStatus.getYear()==null){ personnelStatus.setYear(Integer.toString(LocalDateTime.now().getYear())); } @@ -161,12 +165,33 @@ public class FaispController { List jtList = codeMgtService.selectCodeMgtList("JT"); jtList.sort((o1, o2) -> o2.getItemCd().compareTo(o1.getItemCd())); mav.addObject("jtList", jtList); - mav.addObject("mgtOgList", loginUser.getDownOrganCdList()); List statusList = userInfoService.selectPersonnelStatusList(personnelStatus); statusList = calcStatusList(statusList); + mav.addObject("statusSummary", makeStatusSummary(statusList)); mav.addObject("statusList", statusList); return mav; } + + @GetMapping("/personnelStatusRow") + public ModelAndView personnelStatusRow(@AuthenticationPrincipal UserInfo loginUser){ + ModelAndView mav = new ModelAndView("faisp/personnelStatusRow"); + mav.addObject("mgtOrganList", loginUser.getDownOrganCdList()); + return mav; + } + @GetMapping("/selectPersonnelStatus") + public PersonnelStatus selectPersonnelStatus(PersonnelStatus personnelStatus){ + return userInfoService.selectPersonnelStatusLastVersion(personnelStatus); + } + @GetMapping("/nowPersonnelStatus") + public PersonnelStatus nowPersonnelStatus(String ogCd){ + return userInfoService.nowPersonnelStatus(ogCd); + } + @PostMapping("/savePersonnelStatus") + @ResponseBody + public void savePersonnelStatus(@AuthenticationPrincipal UserInfo loginUser, @RequestBody List personnelStatusList){ + userInfoService.savePersonnelStatus(loginUser, personnelStatusList); + } + @GetMapping("/careerMgt") public ModelAndView careerMgt(@AuthenticationPrincipal UserInfo loginUser, UserInfo userInfo, HttpServletResponse response){ ModelAndView mav = new ModelAndView("faisp/careerMgt"); @@ -225,4 +250,27 @@ public class FaispController { } return statusList; } + + private PersonnelStatus makeStatusSummary(List statusList) { + PersonnelStatus statusSummary = new PersonnelStatus(); + for(PersonnelStatus status: statusList){ + statusSummary.setSumMax(statusSummary.getSumMax()+status.getSumMax()); + statusSummary.setSumNow(statusSummary.getSumNow()+status.getSumNow()); + statusSummary.setJt007Max(statusSummary.getJt007Max()+ status.getJt007Max()); + statusSummary.setJt007Now(statusSummary.getJt007Now()+ status.getJt007Now()); + statusSummary.setJt006Max(statusSummary.getJt006Max()+ status.getJt006Max()); + statusSummary.setJt006Now(statusSummary.getJt006Now()+ status.getJt006Now()); + statusSummary.setJt005Max(statusSummary.getJt005Max()+ status.getJt005Max()); + statusSummary.setJt005Now(statusSummary.getJt005Now()+ status.getJt005Now()); + statusSummary.setJt004Max(statusSummary.getJt004Max()+ status.getJt004Max()); + statusSummary.setJt004Now(statusSummary.getJt004Now()+ status.getJt004Now()); + statusSummary.setJt003Max(statusSummary.getJt003Max()+ status.getJt003Max()); + statusSummary.setJt003Now(statusSummary.getJt003Now()+ status.getJt003Now()); + statusSummary.setJt002Max(statusSummary.getJt002Max()+ status.getJt002Max()); + statusSummary.setJt002Now(statusSummary.getJt002Now()+ status.getJt002Now()); + statusSummary.setJt001Max(statusSummary.getJt001Max()+ status.getJt001Max()); + statusSummary.setJt001Now(statusSummary.getJt001Now()+ status.getJt001Now()); + } + return statusSummary; + } } diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/mapper/UserInfoMapper.java b/src/main/java/com/dbnt/faisp/main/userInfo/mapper/UserInfoMapper.java index 6ba07f2d..83c09b9e 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/mapper/UserInfoMapper.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/mapper/UserInfoMapper.java @@ -29,4 +29,6 @@ public interface UserInfoMapper { UserInfoHistory selectpoliceHistoryView(UserInfoHistory userInfoHistory); List selectPersonnelStatusList(PersonnelStatus personnelStatus); + + PersonnelStatus nowPersonnelStatus(String ogCd); } diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/model/PersonnelStatus.java b/src/main/java/com/dbnt/faisp/main/userInfo/model/PersonnelStatus.java index 28ae858f..8e1b82f9 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/model/PersonnelStatus.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/model/PersonnelStatus.java @@ -26,7 +26,7 @@ public class PersonnelStatus extends BaseModel { private String ogCd; @Id @Column(name = "version_no") - private Integer versionNo; + private Integer versionNo = 0; @Column(name = "jt007_max") private Integer jt007Max = 0; @Column(name = "jt007_now") @@ -69,9 +69,10 @@ public class PersonnelStatus extends BaseModel { private LocalDateTime wrtDt; @Transient - private Integer sumMax; + private Integer sumMax = 0; @Transient - private Integer sumNow; + private Integer sumNow = 0; + @Embeddable @Data @NoArgsConstructor diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/repository/PersonnelStatusRepository.java b/src/main/java/com/dbnt/faisp/main/userInfo/repository/PersonnelStatusRepository.java index 2c4ea957..3503089a 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/repository/PersonnelStatusRepository.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/repository/PersonnelStatusRepository.java @@ -3,6 +3,8 @@ package com.dbnt.faisp.main.userInfo.repository; import com.dbnt.faisp.main.userInfo.model.PersonnelStatus; import org.springframework.data.jpa.repository.JpaRepository; -public interface PersonnelStatusRepository extends JpaRepository { +import java.util.Optional; +public interface PersonnelStatusRepository extends JpaRepository { + Optional findTop1ByYearAndOgCdOrderByVersionNoDesc(String year, String ogCd); } diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/service/UserInfoService.java b/src/main/java/com/dbnt/faisp/main/userInfo/service/UserInfoService.java index 576a6f10..433932d8 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/service/UserInfoService.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/service/UserInfoService.java @@ -9,6 +9,7 @@ import com.dbnt.faisp.main.userInfo.model.PersonnelStatus; import com.dbnt.faisp.main.userInfo.model.UserInfo; import com.dbnt.faisp.main.userInfo.model.UserInfoHistory; import com.dbnt.faisp.main.userInfo.repository.DashboardConfigRepository; +import com.dbnt.faisp.main.userInfo.repository.PersonnelStatusRepository; import com.dbnt.faisp.main.userInfo.repository.UserInfoHistoryRepository; import com.dbnt.faisp.main.userInfo.repository.UserInfoRepository; import com.dbnt.faisp.util.ParamMap; @@ -33,6 +34,7 @@ public class UserInfoService implements UserDetailsService { private final UserInfoRepository userInfoRepository; private final UserInfoHistoryRepository userInfoHistoryRepository; private final DashboardConfigRepository dashboardConfigRepository; + private final PersonnelStatusRepository personnelStatusRepository; private final UserInfoMapper userInfoMapper; @Transactional @@ -296,4 +298,29 @@ public class UserInfoService implements UserDetailsService { public List selectPersonnelStatusList(PersonnelStatus personnelStatus) { return userInfoMapper.selectPersonnelStatusList(personnelStatus); } + + public PersonnelStatus selectPersonnelStatusLastVersion(PersonnelStatus personnelStatus) { + return personnelStatusRepository + .findTop1ByYearAndOgCdOrderByVersionNoDesc + (personnelStatus.getYear(), personnelStatus.getOgCd()).orElse(personnelStatus); + } + + @Transactional + public void savePersonnelStatus(UserInfo loginUser, List personnelStatusList) { + for(PersonnelStatus status: personnelStatusList){ + PersonnelStatus lastVersion = personnelStatusRepository.findTop1ByYearAndOgCdOrderByVersionNoDesc(status.getYear(), status.getOgCd()).orElse(null); + status.setVersionNo(lastVersion==null?1:(lastVersion.getVersionNo()+1)); + status.setOrganCd(loginUser.getOgCd()); + status.setPartCd(loginUser.getOfcCd()); + status.setWrtUserSeq(loginUser.getUserSeq()); + status.setWrtUserNm(loginUser.getUserNm()); + status.setWrtUserGrd(loginUser.getTitleCd()); + status.setWrtDt(LocalDateTime.now()); + } + personnelStatusRepository.saveAll(personnelStatusList); + } + + public PersonnelStatus nowPersonnelStatus(String ogCd) { + return userInfoMapper.nowPersonnelStatus(ogCd); + } } diff --git a/src/main/resources/mybatisMapper/UserInfoMapper.xml b/src/main/resources/mybatisMapper/UserInfoMapper.xml index 83265201..f9e28c1c 100644 --- a/src/main/resources/mybatisMapper/UserInfoMapper.xml +++ b/src/main/resources/mybatisMapper/UserInfoMapper.xml @@ -228,4 +228,40 @@ order by c.organ_type, c.parent_organ, c.organ_cd + \ No newline at end of file diff --git a/src/main/resources/static/css/common.css b/src/main/resources/static/css/common.css index f7724f71..14093413 100644 --- a/src/main/resources/static/css/common.css +++ b/src/main/resources/static/css/common.css @@ -95,4 +95,9 @@ } #subModalBody{ white-space: nowrap; +} +.statusInput::-webkit-outer-spin-button, +.statusInput::-webkit-inner-spin-button{ + -webkit-appearance: none; + margin: 0; } \ No newline at end of file diff --git a/src/main/resources/static/js/faisp/personnelStatus.js b/src/main/resources/static/js/faisp/personnelStatus.js index 8acd2384..5cdc808f 100644 --- a/src/main/resources/static/js/faisp/personnelStatus.js +++ b/src/main/resources/static/js/faisp/personnelStatus.js @@ -1,3 +1,150 @@ $(document).on('change', '#year', function (){ $("#searchFm").submit(); -}) \ No newline at end of file +}) + +$(document).on('click', '#personnelStatusEditModalBtn', function (){ + $("#personnelStatusEditModal").modal('show') +}) + +$(document).on('click', '#personnelStatusAddBtn', function (){ + $.ajax({ + url: '/faisp/personnelStatusRow', + type: 'GET', + dataType:"html", + success: function(html){ + $("#personnelStatusEditDiv").append(html) + }, + error:function(){ + + } + }); +}) + +$(document).on('click', '.personnelStatusRemoveBtn', function (){ + $(this).parents(".personnelStatusRow").remove(); +}) + +$(document).on('change', '.ogCd', function (){ + const personnelStatusRow = $(this).parents(".personnelStatusRow"); + if(this.value !== ''){ + personnelStatusRow.find(".nowPersonnelStatusBtn")[0].className = "btn btn-sm btn-success nowPersonnelStatusBtn"; + $.ajax({ + url: '/faisp/selectPersonnelStatus', + type: 'GET', + data: {year: $("#year").val(), ogCd: this.value}, + dataType:"json", + success: function(data){ + personnelStatusRow.find(".jt007Max").val(data.jt007Max); + personnelStatusRow.find(".jt007Now").val(data.jt007Now); + personnelStatusRow.find(".jt006Max").val(data.jt006Max); + personnelStatusRow.find(".jt006Now").val(data.jt006Now); + personnelStatusRow.find(".jt005Max").val(data.jt005Max); + personnelStatusRow.find(".jt005Now").val(data.jt005Now); + personnelStatusRow.find(".jt004Max").val(data.jt004Max); + personnelStatusRow.find(".jt004Now").val(data.jt004Now); + personnelStatusRow.find(".jt003Max").val(data.jt003Max); + personnelStatusRow.find(".jt003Now").val(data.jt003Now); + personnelStatusRow.find(".jt002Max").val(data.jt002Max); + personnelStatusRow.find(".jt002Now").val(data.jt002Now); + personnelStatusRow.find(".jt001Max").val(data.jt001Max); + personnelStatusRow.find(".jt001Now").val(data.jt001Now); + }, + error:function(){ + + } + }); + }else{ + personnelStatusRow.find(".nowPersonnelStatusBtn")[0].className = "btn btn-sm btn-success nowPersonnelStatusBtn disabled"; + } +}) + +$(document).on('click', '.nowPersonnelStatusBtn', function (){ + const personnelStatusRow = $(this).parents(".personnelStatusRow"); + $.ajax({ + url: '/faisp/nowPersonnelStatus', + type: 'GET', + data: {ogCd: personnelStatusRow.find(".ogCd").val()}, + dataType:"json", + success: function(data){ + if(data === null){ + alert("결과가 없습니다.") + }else{ + personnelStatusRow.find(".jt007Now").val(data.jt007Now); + personnelStatusRow.find(".jt006Now").val(data.jt006Now); + personnelStatusRow.find(".jt005Now").val(data.jt005Now); + personnelStatusRow.find(".jt004Now").val(data.jt004Now); + personnelStatusRow.find(".jt003Now").val(data.jt003Now); + personnelStatusRow.find(".jt002Now").val(data.jt002Now); + personnelStatusRow.find(".jt001Now").val(data.jt001Now); + } + }, + error:function(){ + alert("조회에 실패하였습니다.") + } + }); +}) + +$(document).on('click', '#saveBtn', function (){ + if($(".ogCd").length===0){ + alert("저장할 항목이 없습니다.") + }else{ + if(personnelStatusOgCdCheck()){ + if(confirm("저장하시겠습니까?")){ + contentFade("in"); + const personnelStatusList = []; + $.each($(".personnelStatusRow"), function(idx, personnelStatus){ + const row = $(personnelStatus); + personnelStatusList.push({}); + personnelStatusList[idx].year = $("#year").val(); + personnelStatusList[idx].ogCd = row.find(".ogCd").val() + personnelStatusList[idx].jt007Max = row.find(".jt007Max").val() + personnelStatusList[idx].jt007Now = row.find(".jt007Now").val() + personnelStatusList[idx].jt006Max = row.find(".jt006Max").val() + personnelStatusList[idx].jt006Now = row.find(".jt006Now").val() + personnelStatusList[idx].jt005Max = row.find(".jt005Max").val() + personnelStatusList[idx].jt005Now = row.find(".jt005Now").val() + personnelStatusList[idx].jt004Max = row.find(".jt004Max").val() + personnelStatusList[idx].jt004Now = row.find(".jt004Now").val() + personnelStatusList[idx].jt003Max = row.find(".jt003Max").val() + personnelStatusList[idx].jt003Now = row.find(".jt003Now").val() + personnelStatusList[idx].jt002Max = row.find(".jt002Max").val() + personnelStatusList[idx].jt002Now = row.find(".jt002Now").val() + personnelStatusList[idx].jt001Max = row.find(".jt001Max").val() + personnelStatusList[idx].jt001Now = row.find(".jt001Now").val() + }) + $.ajax({ + type : 'POST', + data : JSON.stringify(personnelStatusList), + url : "/faisp/savePersonnelStatus", + contentType: 'application/json', + beforeSend: function (xhr){ + xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val()); + }, + success : function() { + alert("저장되었습니다."); + contentFade("out"); + location.reload(); + }, + error : function(xhr, status) { + alert("저장에 실패하였습니다."); + contentFade("out"); + } + }) + } + } + } +}) + +function personnelStatusOgCdCheck(){ + let flag = true; + $.each($(".ogCd"), function(idx, selectBox){ + if($(selectBox).val()===''){ + + flag = false; + } + }) + if(!flag){ + alert("관서가 지정되지 않은 항목이 있습니다.") + } + return flag; +} \ No newline at end of file diff --git a/src/main/resources/templates/faStatistics/processResult/processResultHistoryDetail.html b/src/main/resources/templates/faStatistics/processResult/processResultHistoryDetail.html index 2ac8c702..1201deab 100644 --- a/src/main/resources/templates/faStatistics/processResult/processResultHistoryDetail.html +++ b/src/main/resources/templates/faStatistics/processResult/processResultHistoryDetail.html @@ -1,5 +1,5 @@ - +
diff --git a/src/main/resources/templates/faisp/personnelStatus.html b/src/main/resources/templates/faisp/personnelStatus.html index 95be1ee4..91fea366 100644 --- a/src/main/resources/templates/faisp/personnelStatus.html +++ b/src/main/resources/templates/faisp/personnelStatus.html @@ -14,7 +14,7 @@
-
+
+
+ +
@@ -50,13 +53,23 @@ - cnt - cnt - cnt - - cnt - cnt - + + + + + + + + + + + + + + + + + @@ -69,29 +82,24 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + -
-
- -
-
@@ -102,9 +110,47 @@