외사경찰 정원/현원 현황 작업중.

강석 최 2022-11-16 18:52:26 +09:00
parent ca2acee2a9
commit 2bd584cc8c
11 changed files with 412 additions and 35 deletions

View File

@ -153,6 +153,10 @@ public class FaispController {
@GetMapping("/personnelStatus") @GetMapping("/personnelStatus")
public ModelAndView personnelStatus(@AuthenticationPrincipal UserInfo loginUser, PersonnelStatus personnelStatus){ public ModelAndView personnelStatus(@AuthenticationPrincipal UserInfo loginUser, PersonnelStatus personnelStatus){
ModelAndView mav = new ModelAndView("faisp/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){ if(personnelStatus.getYear()==null){
personnelStatus.setYear(Integer.toString(LocalDateTime.now().getYear())); personnelStatus.setYear(Integer.toString(LocalDateTime.now().getYear()));
} }
@ -161,12 +165,33 @@ public class FaispController {
List<CodeMgt> jtList = codeMgtService.selectCodeMgtList("JT"); List<CodeMgt> jtList = codeMgtService.selectCodeMgtList("JT");
jtList.sort((o1, o2) -> o2.getItemCd().compareTo(o1.getItemCd())); jtList.sort((o1, o2) -> o2.getItemCd().compareTo(o1.getItemCd()));
mav.addObject("jtList", jtList); mav.addObject("jtList", jtList);
mav.addObject("mgtOgList", loginUser.getDownOrganCdList());
List<PersonnelStatus> statusList = userInfoService.selectPersonnelStatusList(personnelStatus); List<PersonnelStatus> statusList = userInfoService.selectPersonnelStatusList(personnelStatus);
statusList = calcStatusList(statusList); statusList = calcStatusList(statusList);
mav.addObject("statusSummary", makeStatusSummary(statusList));
mav.addObject("statusList", statusList); mav.addObject("statusList", statusList);
return mav; 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<PersonnelStatus> personnelStatusList){
userInfoService.savePersonnelStatus(loginUser, personnelStatusList);
}
@GetMapping("/careerMgt") @GetMapping("/careerMgt")
public ModelAndView careerMgt(@AuthenticationPrincipal UserInfo loginUser, UserInfo userInfo, HttpServletResponse response){ public ModelAndView careerMgt(@AuthenticationPrincipal UserInfo loginUser, UserInfo userInfo, HttpServletResponse response){
ModelAndView mav = new ModelAndView("faisp/careerMgt"); ModelAndView mav = new ModelAndView("faisp/careerMgt");
@ -225,4 +250,27 @@ public class FaispController {
} }
return statusList; return statusList;
} }
private PersonnelStatus makeStatusSummary(List<PersonnelStatus> 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;
}
} }

View File

@ -29,4 +29,6 @@ public interface UserInfoMapper {
UserInfoHistory selectpoliceHistoryView(UserInfoHistory userInfoHistory); UserInfoHistory selectpoliceHistoryView(UserInfoHistory userInfoHistory);
List<PersonnelStatus> selectPersonnelStatusList(PersonnelStatus personnelStatus); List<PersonnelStatus> selectPersonnelStatusList(PersonnelStatus personnelStatus);
PersonnelStatus nowPersonnelStatus(String ogCd);
} }

View File

@ -26,7 +26,7 @@ public class PersonnelStatus extends BaseModel {
private String ogCd; private String ogCd;
@Id @Id
@Column(name = "version_no") @Column(name = "version_no")
private Integer versionNo; private Integer versionNo = 0;
@Column(name = "jt007_max") @Column(name = "jt007_max")
private Integer jt007Max = 0; private Integer jt007Max = 0;
@Column(name = "jt007_now") @Column(name = "jt007_now")
@ -69,9 +69,10 @@ public class PersonnelStatus extends BaseModel {
private LocalDateTime wrtDt; private LocalDateTime wrtDt;
@Transient @Transient
private Integer sumMax; private Integer sumMax = 0;
@Transient @Transient
private Integer sumNow; private Integer sumNow = 0;
@Embeddable @Embeddable
@Data @Data
@NoArgsConstructor @NoArgsConstructor

View File

@ -3,6 +3,8 @@ package com.dbnt.faisp.main.userInfo.repository;
import com.dbnt.faisp.main.userInfo.model.PersonnelStatus; import com.dbnt.faisp.main.userInfo.model.PersonnelStatus;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
public interface PersonnelStatusRepository extends JpaRepository<PersonnelStatus, PersonnelStatus.personnelStatusId> { import java.util.Optional;
public interface PersonnelStatusRepository extends JpaRepository<PersonnelStatus, PersonnelStatus.personnelStatusId> {
Optional<PersonnelStatus> findTop1ByYearAndOgCdOrderByVersionNoDesc(String year, String ogCd);
} }

View File

@ -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.UserInfo;
import com.dbnt.faisp.main.userInfo.model.UserInfoHistory; import com.dbnt.faisp.main.userInfo.model.UserInfoHistory;
import com.dbnt.faisp.main.userInfo.repository.DashboardConfigRepository; 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.UserInfoHistoryRepository;
import com.dbnt.faisp.main.userInfo.repository.UserInfoRepository; import com.dbnt.faisp.main.userInfo.repository.UserInfoRepository;
import com.dbnt.faisp.util.ParamMap; import com.dbnt.faisp.util.ParamMap;
@ -33,6 +34,7 @@ public class UserInfoService implements UserDetailsService {
private final UserInfoRepository userInfoRepository; private final UserInfoRepository userInfoRepository;
private final UserInfoHistoryRepository userInfoHistoryRepository; private final UserInfoHistoryRepository userInfoHistoryRepository;
private final DashboardConfigRepository dashboardConfigRepository; private final DashboardConfigRepository dashboardConfigRepository;
private final PersonnelStatusRepository personnelStatusRepository;
private final UserInfoMapper userInfoMapper; private final UserInfoMapper userInfoMapper;
@Transactional @Transactional
@ -296,4 +298,29 @@ public class UserInfoService implements UserDetailsService {
public List<PersonnelStatus> selectPersonnelStatusList(PersonnelStatus personnelStatus) { public List<PersonnelStatus> selectPersonnelStatusList(PersonnelStatus personnelStatus) {
return userInfoMapper.selectPersonnelStatusList(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<PersonnelStatus> 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);
}
} }

View File

@ -228,4 +228,40 @@
</foreach> </foreach>
order by c.organ_type, c.parent_organ, c.organ_cd order by c.organ_type, c.parent_organ, c.organ_cd
</select> </select>
<select id="nowPersonnelStatus" resultType="PersonnelStatus" parameterType="string">
select a.og_cd,
sum(case
when a.title_cd = 'JT001' then 1
else 0
end) as jt001Now,
sum(case
when a.title_cd = 'JT002' then 1
else 0
end) as jt002Now,
sum(case
when a.title_cd = 'JT003' then 1
else 0
end) as jt003Now,
sum(case
when a.title_cd = 'JT004' then 1
else 0
end) as jt004Now,
sum(case
when a.title_cd = 'JT005' then 1
else 0
end) as jt005Now,
sum(case
when a.title_cd = 'JT006' then 1
else 0
end) as jt006Now,
sum(case
when a.title_cd = 'JT007' then 1
else 0
end) as jt007Now
from user_info a
where a.user_status = 'USC003'
and a.og_cd = #{ogCd}
group by a.og_cd
order by a.og_cd
</select>
</mapper> </mapper>

View File

@ -96,3 +96,8 @@
#subModalBody{ #subModalBody{
white-space: nowrap; white-space: nowrap;
} }
.statusInput::-webkit-outer-spin-button,
.statusInput::-webkit-inner-spin-button{
-webkit-appearance: none;
margin: 0;
}

View File

@ -1,3 +1,150 @@
$(document).on('change', '#year', function (){ $(document).on('change', '#year', function (){
$("#searchFm").submit(); $("#searchFm").submit();
}) })
$(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;
}

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="ko">
<div class="mb-3 row"> <div class="mb-3 row">
<label class="col-sm-2 col-form-label col-form-label-sm text-center">사건번호</label> <label class="col-sm-2 col-form-label col-form-label-sm text-center">사건번호</label>
<div class="col-4"> <div class="col-4">

View File

@ -14,7 +14,7 @@
<div class="col-12 card text-center"> <div class="col-12 card text-center">
<div class="card-body"> <div class="card-body">
<form id="searchFm" method="get" th:action="@{/faisp/personnelStatus}"> <form id="searchFm" method="get" th:action="@{/faisp/personnelStatus}">
<div class="row justify-content-start pe-3 py-1"> <div class="row justify-content-between py-1">
<div class="col-auto"> <div class="col-auto">
<select class="form-select" name="year" id="year"> <select class="form-select" name="year" id="year">
<th:block th:each="year : ${#numbers.sequence(2020, 2040)}"> <th:block th:each="year : ${#numbers.sequence(2020, 2040)}">
@ -22,6 +22,9 @@
</th:block> </th:block>
</select> </select>
</div> </div>
<div class="col-auto">
<button type="button" class="btn btn-sm btn-primary" id="personnelStatusEditModalBtn" th:if="${accessAuth ne 'ACC001'}">등록</button>
</div>
</div> </div>
</form> </form>
<div class="row justify-content-start"> <div class="row justify-content-start">
@ -50,13 +53,23 @@
</th:block> </th:block>
</tr> </tr>
<tr> <tr>
<th>cnt</th> <th th:text="${statusSummary.sumMax}"></th>
<th>cnt</th> <th th:text="${statusSummary.sumNow}"></th>
<th>cnt</th> <th th:text="${statusSummary.sumNow-statusSummary.sumMax}" th:classappend="${(statusSummary.sumNow-statusSummary.sumMax)>=0?'text-primary':'text-danger'}"></th>
<th:block th:each="code:${jtList}"> <th th:text="${statusSummary.jt007Max}"></th>
<th>cnt</th> <th th:text="${statusSummary.jt007Now}"></th>
<th>cnt</th> <th th:text="${statusSummary.jt006Max}"></th>
</th:block> <th th:text="${statusSummary.jt006Now}"></th>
<th th:text="${statusSummary.jt005Max}"></th>
<th th:text="${statusSummary.jt005Now}"></th>
<th th:text="${statusSummary.jt004Max}"></th>
<th th:text="${statusSummary.jt004Now}"></th>
<th th:text="${statusSummary.jt003Max}"></th>
<th th:text="${statusSummary.jt003Now}"></th>
<th th:text="${statusSummary.jt002Max}"></th>
<th th:text="${statusSummary.jt002Now}"></th>
<th th:text="${statusSummary.jt001Max}"></th>
<th th:text="${statusSummary.jt001Now}"></th>
</tr> </tr>
</thead> </thead>
<tbody class="table-group-divider"> <tbody class="table-group-divider">
@ -69,29 +82,24 @@
<td th:text="${status.sumMax}"></td> <td th:text="${status.sumMax}"></td>
<td th:text="${status.sumNow}"></td> <td th:text="${status.sumNow}"></td>
<td th:text="${status.sumNow-status.sumMax}" th:classappend="${status.sumNow-status.sumMax>0?'text-primary':'text-danger'}"></td> <td th:text="${status.sumNow-status.sumMax}" th:classappend="${status.sumNow-status.sumMax>0?'text-primary':'text-danger'}"></td>
<th th:text="${status.jt007Max}"></th> <td th:text="${status.jt007Max}"></td>
<th th:text="${status.jt007Now}"></th> <td th:text="${status.jt007Now}"></td>
<th th:text="${status.jt006Max}"></th> <td th:text="${status.jt006Max}"></td>
<th th:text="${status.jt006Now}"></th> <td th:text="${status.jt006Now}"></td>
<th th:text="${status.jt005Max}"></th> <td th:text="${status.jt005Max}"></td>
<th th:text="${status.jt005Now}"></th> <td th:text="${status.jt005Now}"></td>
<th th:text="${status.jt004Max}"></th> <td th:text="${status.jt004Max}"></td>
<th th:text="${status.jt004Now}"></th> <td th:text="${status.jt004Now}"></td>
<th th:text="${status.jt003Max}"></th> <td th:text="${status.jt003Max}"></td>
<th th:text="${status.jt003Now}"></th> <td th:text="${status.jt003Now}"></td>
<th th:text="${status.jt002Max}"></th> <td th:text="${status.jt002Max}"></td>
<th th:text="${status.jt002Now}"></th> <td th:text="${status.jt002Now}"></td>
<th th:text="${status.jt001Max}"></th> <td th:text="${status.jt001Max}"></td>
<th th:text="${status.jt001Now}"></th> <td th:text="${status.jt001Now}"></td>
<td th:text="${#temporals.format(status.wrtDt, 'yyyy-MM-dd HH:mm')}"></td> <td th:text="${#temporals.format(status.wrtDt, 'yyyy-MM-dd HH:mm')}"></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<div class="row justify-content-end">
<div class="col-auto">
<button type="button" class="btn btn-sm btn-primary">등록</button>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -102,9 +110,47 @@
</main> </main>
<div class="modal fade" id="personnelStatusEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="personnelStatusEditModalLabel" aria-hidden="true"> <div class="modal fade" id="personnelStatusEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="personnelStatusEditModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-scrollable"> <div class="modal-dialog modal-xxl modal-dialog-scrollable">
<div class="modal-content" id="personnelStatusEditModalContent"> <div class="modal-content" id="personnelStatusEditModalContent">
<div class="modal-header">
<h5 class="modal-title" id="personnelStatusEditModalLabel">정원/현원 현황 등록</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="row text-center justify-content-around">
<div class="col-1">관서</div>
<th:block th:each="code:${jtList}">
<div class="col-1">
<div class="row">
<div class="col-12 px-0" th:text="${code.itemValue}"></div>
<div class="col-6 px-0">정원</div>
<div class="col-6 px-0">현원</div>
</div>
</div>
</th:block>
<div class="col-2"></div>
</div>
<div class="row" id="personnelStatusEditDiv">
</div>
<div class="row justify-content-center pt-3">
<div class="col-auto">
<button type="button" class="btn btn-sm btn-primary" id="personnelStatusAddBtn">추가</button>
</div>
</div>
</div>
</div>
</div>
</div>
</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="saveBtn">저장</button>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,63 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="col-12 pb-1 personnelStatusRow">
<div class="row justify-content-around">
<div class="col-1 px-0">
<select class="form-select form-select-sm ogCd">
<option value="">선택</option>
<th:block th:each="code:${session.commonCode.get('OG')}">
<th:block th:if="${#lists.contains(mgtOrganList, code.itemCd)}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</th:block>
</select>
</div>
<div class="col-1 px-0">
<div class="input-group w-auto">
<input type="number" class="form-control form-select-sm statusInput jt007Max" min="0">
<input type="number" class="form-control form-select-sm statusInput jt007Now" min="0">
</div>
</div>
<div class="col-1 px-0">
<div class="input-group w-auto">
<input type="number" class="form-control form-select-sm statusInput jt006Max" min="0">
<input type="number" class="form-control form-select-sm statusInput jt006Now" min="0">
</div>
</div>
<div class="col-1 px-0">
<div class="input-group w-auto">
<input type="number" class="form-control form-select-sm statusInput jt005Max" min="0">
<input type="number" class="form-control form-select-sm statusInput jt005Now" min="0">
</div>
</div>
<div class="col-1 px-0">
<div class="input-group w-auto">
<input type="number" class="form-control form-select-sm statusInput jt004Max" min="0">
<input type="number" class="form-control form-select-sm statusInput jt004Now" min="0">
</div>
</div>
<div class="col-1 px-0">
<div class="input-group w-auto">
<input type="number" class="form-control form-select-sm statusInput jt003Max" min="0">
<input type="number" class="form-control form-select-sm statusInput jt003Now" min="0">
</div>
</div>
<div class="col-1 px-0">
<div class="input-group w-auto">
<input type="number" class="form-control form-select-sm statusInput jt002Max" min="0">
<input type="number" class="form-control form-select-sm statusInput jt002Now" min="0">
</div>
</div>
<div class="col-1 px-0">
<div class="input-group w-auto">
<input type="number" class="form-control form-select-sm statusInput jt001Max" min="0">
<input type="number" class="form-control form-select-sm statusInput jt001Now" min="0">
</div>
</div>
<div class="col-2 text-center">
<button type="button" class="btn btn-sm btn-success nowPersonnelStatusBtn disabled">현원 불러오기</button>
<button type="button" class="btn btn-sm btn-danger personnelStatusRemoveBtn">삭제</button>
</div>
</div>
</div>
</html>