feat:외사경찰 -> 외사경찰현황 초기셋팅 및 회원가입시 user_info_history 저장

TaehunPark 2022-11-07 13:23:10 +09:00
parent 689c61eed0
commit 3d997e5d4f
9 changed files with 652 additions and 1 deletions

View File

@ -0,0 +1,65 @@
package com.dbnt.faisp.main.userInfo;
import com.dbnt.faisp.main.authMgt.service.AuthMgtService;
import com.dbnt.faisp.main.codeMgt.service.CodeMgtService;
import com.dbnt.faisp.main.userInfo.model.UserInfo;
import com.dbnt.faisp.main.userInfo.service.UserInfoService;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@RestController
@RequiredArgsConstructor
@RequestMapping("/faisp")
public class FaispController {
private final AuthMgtService authMgtService;
private final CodeMgtService codeMgtService;
private final UserInfoService userInfoService;
@GetMapping("/policeList")
public ModelAndView partInfoList(@AuthenticationPrincipal UserInfo loginUser,UserInfo userInfo, HttpServletResponse response) {
ModelAndView mav = new ModelAndView("faisp/policeList");
userInfo.setDownOrganCdList(loginUser.getDownOrganCdList());
if(userInfo.getUserStatus() == null) {
userInfo.setUserStatus("USC003");
}
//메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faisp/policeList").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
userInfo.setQueryInfo();
mav.addObject("policeList", userInfoService.selectPoliceList(userInfo));
userInfo.setContentCnt(userInfoService.selectPoliceListCnt(userInfo));
userInfo.setPaginationInfo();
mav.addObject("mgtOrganList", loginUser.getDownOrganCdList());
mav.addObject("userSatus", userInfo.getUserStatus());
mav.addObject("searchParams", userInfo);
return mav;
}
@GetMapping("/policeEditModal")
public ModelAndView menuEditModal(UserInfo userInfo){
ModelAndView mav = new ModelAndView("/faisp/policeEditModal");
mav.addObject("ogList", codeMgtService.selectCodeMgtList("OG"));
mav.addObject("ofcList", codeMgtService.selectCodeMgtList("OFC"));
mav.addObject("titleList", codeMgtService.selectCodeMgtList("JT"));
mav.addObject("outturnList", codeMgtService.selectCodeMgtList("OTC"));
mav.addObject("seriesList", codeMgtService.selectCodeMgtList("SRC"));
mav.addObject("languageList", codeMgtService.selectCodeMgtList("LNG"));
mav.addObject("statusList", codeMgtService.selectCodeMgtList("USC"));
mav.addObject("userInfo", userInfoService.selectUserInfo(userInfo.getUserSeq()));
return mav;
}
}

View File

@ -17,4 +17,8 @@ public interface UserInfoMapper {
List<ParamMap> selectManagerList(ParamMap param);
List<DashboardConfig> selectDashboardConfigList(Integer userSeq);
List<UserInfo> selectPoliceList(UserInfo userInfo);
Integer selectPoliceListCnt(UserInfo userInfo);
}

View File

@ -0,0 +1,121 @@
package com.dbnt.faisp.main.userInfo.model;
import com.dbnt.faisp.config.BaseModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Getter
@Setter
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@IdClass(UserInfoHistory.UserInfoHistoryId.class)
@Table(name = "user_info_history")
public class UserInfoHistory extends BaseModel implements Serializable{
@Id
@Column(name = "user_seq")
private Integer userSeq;
@Id
@Column(name = "version_no")
private Integer versionNo;
@Column(name = "dic_code")
private String dicCode;
@Column(name = "user_id")
private String userId;
@Column(name = "user_nm")
private String userNm;
@Column(name = "birth_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate birthDate;
@Column(name = "sex")
private String sex;
@Column(name = "email")
private String email;
@Column(name = "phone_no")
private String phoneNo;
@Column(name = "area_cd")
private String areaCd;
@Column(name = "og_cd")
private String ogCd;
@Column(name = "ofc_cd")
private String ofcCd;
@Column(name = "title_cd")
private String titleCd;
@Column(name = "group_cd")
private String groupCd;
@Column(name = "series_cd")
private String seriesCd;
@Column(name = "ofc_head_yn")
private String ofcHeadYn;
@Column(name = "hiring_cd")
private String hiringCd;
@Column(name = "employ_cd")
private String employCd;
@Column(name = "outturn_cd")
private String outturnCd;
@Column(name = "work_cd")
private String workCd;
@Column(name = "job_in_cd")
private String jobInCd;
@Column(name = "language_cd")
private String languageCd;
@Column(name = "police_in_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate policeInDate;
@Column(name = "organ_in_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate organInDate;
@Column(name = "ofc_in_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate ofcInDate;
@Column(name = "title_in_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate titleInDate;
@Column(name = "user_status")
private String userStatus;
@Column(name = "wrt_organ")
private String wrtOrgan;
@Column(name = "wrt_part")
private String wrtPart;
@Column(name = "wrt_title")
private String wrtTitle;
@Column(name = "wrt_user_seq")
private Integer wrtUserSeq;
@Column(name = "wrt_nm")
private String wrtNm;
@Column(name = "wrt_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private LocalDateTime wrtDt;
@Embeddable
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class UserInfoHistoryId implements Serializable {
private Integer userSeq;
private Integer versionNo;
}
}

View File

@ -0,0 +1,15 @@
package com.dbnt.faisp.main.userInfo.repository;
import com.dbnt.faisp.main.userInfo.model.UserInfoHistory;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserInfoHistoryRepository extends JpaRepository<UserInfoHistory, UserInfoHistory.UserInfoHistoryId> {
UserInfoHistory findByUserSeq(Integer userSeq);
}

View File

@ -1,10 +1,13 @@
package com.dbnt.faisp.main.userInfo.service;
import com.dbnt.faisp.config.Role;
import com.dbnt.faisp.main.fipTarget.model.PartInfo;
import com.dbnt.faisp.main.userInfo.mapper.UserInfoMapper;
import com.dbnt.faisp.main.userInfo.model.DashboardConfig;
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.UserInfoHistoryRepository;
import com.dbnt.faisp.main.userInfo.repository.UserInfoRepository;
import com.dbnt.faisp.util.ParamMap;
@ -24,6 +27,7 @@ import java.util.List;
public class UserInfoService implements UserDetailsService {
private final UserInfoRepository userInfoRepository;
private final UserInfoHistoryRepository userInfoHistoryRepository;
private final DashboardConfigRepository dashboardConfigRepository;
private final UserInfoMapper userInfoMapper;
@ -36,7 +40,46 @@ public class UserInfoService implements UserDetailsService {
userInfo.setUserStatus("USC002");
userInfo.setPassword(convertPassword(userInfo.getPassword()));
userInfo.setWrtDt(LocalDateTime.now());
return userInfoRepository.save(userInfo).getUserId();
UserInfo result = userInfoRepository.save(userInfo);
UserInfoHistory dbHis = userInfoHistoryRepository.findByUserSeq(result.getUserSeq());
if(dbHis == null) {
UserInfoHistory hisTmp = new UserInfoHistory();
hisTmp.setUserSeq(result.getUserSeq());
hisTmp.setVersionNo(1);
hisTmp.setDicCode(result.getDicCode());
hisTmp.setUserId(result.getUserId());
hisTmp.setUserNm(result.getUserNm());
hisTmp.setBirthDate(result.getBirthDate());
hisTmp.setSex(result.getSex());
hisTmp.setEmail(result.getEmail());
hisTmp.setPhoneNo(result.getPhoneNo());
hisTmp.setAreaCd(result.getAreaCd());
hisTmp.setOgCd(result.getOgCd());
hisTmp.setOfcCd(result.getOfcCd());
hisTmp.setTitleCd(result.getTitleCd());
hisTmp.setGroupCd(result.getGroupCd());
hisTmp.setSeriesCd(result.getSeriesCd());
hisTmp.setOfcHeadYn(result.getOfcHeadYn());
hisTmp.setHiringCd(result.getHiringCd());
hisTmp.setEmployCd(result.getEmployCd());
hisTmp.setOutturnCd(result.getOutturnCd());
hisTmp.setWorkCd(result.getWorkCd());
hisTmp.setJobInCd(result.getJobInCd());
hisTmp.setLanguageCd(result.getLanguageCd());
hisTmp.setPoliceInDate(result.getPoliceInDate());
hisTmp.setOrganInDate(result.getOrganInDate());
hisTmp.setOfcInDate(result.getOfcInDate());
hisTmp.setTitleInDate(result.getTitleInDate());
hisTmp.setUserStatus(result.getUserStatus());
hisTmp.setWrtOrgan(result.getOgCd());
hisTmp.setWrtPart(result.getOfcCd());
hisTmp.setWrtTitle(result.getTitleCd());
hisTmp.setWrtUserSeq(result.getUserSeq());
hisTmp.setWrtNm(result.getUserNm());
hisTmp.setWrtDt(result.getWrtDt());
userInfoHistoryRepository.save(hisTmp);
}
return result.getUserId();
}
@Transactional
public void updateUserInfo(UserInfo userInfo){
@ -188,4 +231,11 @@ public class UserInfoService implements UserDetailsService {
}
dashboardConfigRepository.saveAll(configList);
}
public List<UserInfo> selectPoliceList(UserInfo userInfo) {
return userInfoMapper.selectPoliceList(userInfo);
}
public Integer selectPoliceListCnt(UserInfo userInfo) {
return userInfoMapper.selectPoliceListCnt(userInfo);
}
}

View File

@ -80,4 +80,58 @@
where b.user_seq = #{userSeq}
order by b.order_num
</select>
<sql id="selectPoliceListWhere">
<where>
user_status = #{userStatus}
and og_cd in
<foreach collection="downOrganCdList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</where>
</sql>
<select id="selectPoliceList" resultType="UserInfo" parameterType="UserInfo">
select user_seq,
(select item_value from code_mgt where item_cd = title_cd) as title_cd,
user_nm,
og_cd,
(select item_value from code_mgt where item_cd = og_cd) as organ_nm,
(select item_value from code_mgt where item_cd = ofc_cd) as ofc_cd,
birth_date,
(select item_value from code_mgt where item_cd = sex) as sex,
police_in_date,
title_in_date,
ofc_in_date,
(select item_value from code_mgt where item_cd = outturn_cd) as outturn_cd,
(select item_value from code_mgt where item_cd = job_in_cd) as job_in_cd,
wrt_dt
from user_info
<include refid="selectPoliceListWhere"></include>
order by user_seq desc
limit #{rowCnt} offset #{firstIndex}
</select>
<select id="selectPoliceListCnt" resultType="Integer" parameterType="UserInfo">
select count(*)
from(
select user_seq,
(select item_value from code_mgt where item_cd = title_cd) as title_cd,
user_nm,
og_cd,
(select item_value from code_mgt where item_cd = og_cd) as organ_nm,
(select item_value from code_mgt where item_cd = ofc_cd) as ofc_cd,
birth_date,
(select item_value from code_mgt where item_cd = sex) as sex,
police_in_date,
title_in_date,
ofc_in_date,
(select item_value from code_mgt where item_cd = outturn_cd) as outturn_cd,
(select item_value from code_mgt where item_cd = job_in_cd) as job_in_cd,
wrt_dt
from user_info
<include refid="selectPoliceListWhere"></include>
order by user_seq desc
) a
</select>
</mapper>

View File

@ -0,0 +1,22 @@
$(document).on('click', '.policeTr', function (){
const userSeq = (Number($(this).find(".userSeq").val()));
console.log(userSeq);
showModal(userSeq);
});
function showModal(userSeq){
$.ajax({
url: '/faisp/policeEditModal',
data: {userSeq: userSeq},
type: 'GET',
dataType:"html",
success: function(html){
$("#policeEditModalContent").empty().append(html);
$("#policeEditModal").modal('show');
},
error:function(){
}
});
}

View File

@ -0,0 +1,149 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header">
<h5 class="modal-title" id="menuEditModalLabel">외사경찰 수정</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="userInfoUpdate" action="#" method="post">
<input type="hidden" name="userSeq" id="userSeq" class="userSeq" th:value="${userInfo.userSeq}">
<input type="hidden" name="userStatus" th:value="${userInfo.userStatus}">
<div class="mb-3 mt-3 row">
<label for="dicCode" class="col-sm-2 col-form-label col-form-label-sm text-center ">공무원식별번호</label>
<div class="col-sm-4">
<input type="text" class="form-control form-control-sm" id="dicCode" name="dicCode" autocomplete="off" th:value="${userInfo.dicCode}">
</div>
</div>
<div class="mb-3 row">
<label for="userId" class="col-sm-2 col-form-label col-form-label-sm text-center ">아이디</label>
<div class="col-sm-4">
<input type="text" class="form-control form-control-sm" id="userId" name="userId" autocomplete="off" th:value="${userInfo.userId}" readonly>
<label for="userId" style="font-size: 12px">아이디는 수정할 수 없습니다.</label>
</div>
<label for="userNm" class="col-sm-2 col-form-label col-form-label-sm text-center">이름</label>
<div class="col-sm-4">
<input type="text" class=" form-control form-control-sm" id="userNm" name="userNm" autocomplete="off" th:value="${userInfo.userNm}">
</div>
</div>
<div class="mb-3 row">
<label for="phoneNo" class="col-sm-2 col-form-label col-form-label-sm text-center">휴대전화</label>
<div class="col-sm-4">
<input type="tel" class="form-control form-control-sm" id="phoneNo" name="phoneNo" th:value="${userInfo.phoneNo}">
</div>
<label for="email" class="col-sm-2 col-form-label col-form-label-sm text-center">이메일</label>
<div class="col-sm-4">
<input type="email" class="form-control form-control-sm" id="email" name="email" th:value="${userInfo.email}">
</div>
</div>
<div class="mb-3 row">
<label for="sex" class="col-sm-2 col-form-label col-form-label-sm text-center">성별</label>
<div class="col-sm-4">
<select class="form-select form-select-sm" id="sex" name="sex">
<option value="M" th:selected="${userInfo.sex eq 'M'}"></option>
<option value="F" th:selected="${userInfo.sex eq 'F'}"></option>
</select>
</div>
</div>
<div class="mb-3 row">
<label for="birthDate" class="col-sm-2 col-form-label col-form-label-sm text-center">생년월일</label>
<div class="col-sm-4">
<input type="text" class="form-control form-control-sm dateSelector" id="birthDate" name="birthDate" th:value="${userInfo.birthDate}" readonly>
</div>
<label for="policeInDate" class="col-sm-2 col-form-label col-form-label-sm text-center">해양경찰배명일</label>
<div class="col-sm-4">
<input type="text" class="form-control form-control-sm dateSelector" id="policeInDate" name="policeInDate" th:value="${userInfo.policeInDate}" readonly>
</div>
</div>
<div class="mb-3 row">
<label for="ogCd" class="col-sm-2 col-form-label col-form-label-sm text-center">관서</label>
<div class="col-sm-4">
<select class="form-select form-select-sm" id="ogCd" name="ogCd">
<option value="">--선택--</option>
<th:block th:each="code:${ogList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${code.itemCd eq userInfo.ogCd}"></option>
</th:block>
</select>
</div>
<label for="organInDate" class="col-sm-2 col-form-label col-form-label-sm text-center">현관서전입일</label>
<div class="col-sm-4">
<input type="text" class="form-control form-control-sm dateSelector" id="organInDate" name="organInDate" th:value="${userInfo.organInDate}" readonly>
</div>
</div>
<div class="mb-3 row">
<label for="ofcCd" class="col-sm-2 col-form-label col-form-label-sm text-center">부서</label>
<div class="col-sm-4">
<select class="form-select form-select-sm" id="ofcCd" name="ofcCd">
<option value="">--선택--</option>
<th:block th:each="code:${ofcList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${code.itemCd eq userInfo.ofcCd}"></option>
</th:block>
</select>
</div>
<label for="ofcInDate" class="col-sm-2 col-form-label col-form-label-sm text-center">현부서임용일</label>
<div class="col-sm-4">
<input type="text" class="form-control form-control-sm dateSelector" id="ofcInDate" name="ofcInDate" th:value="${userInfo.ofcInDate}" readonly>
</div>
</div>
<div class="mb-3 row">
<label for="ogCd" class="col-sm-2 col-form-label col-form-label-sm text-center">계급</label>
<div class="col-sm-4">
<select class="form-select form-select-sm" id="titleCd" name="titleCd">
<option value="">--선택--</option>
<th:block th:each="code:${titleList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${code.itemCd eq userInfo.titleCd}"></option>
</th:block>
</select>
</div>
<label for="titleInDate" class="col-sm-2 col-form-label col-form-label-sm text-center">현계급임용일</label>
<div class="col-sm-4">
<input type="text" class="form-control form-control-sm dateSelector" id="titleInDate" name="titleInDate" th:value="${userInfo.titleInDate}" readonly>
</div>
</div>
<div class="mb-3 row">
<label for="outturnCd" class="col-sm-2 col-form-label col-form-label-sm text-center">경과</label>
<div class="col-sm-4">
<select class="form-select form-select-sm" id="outturnCd" name="outturnCd">
<option value="">--선택--</option>
<th:block th:each="code:${outturnList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${code.itemCd eq userInfo.outturnCd}"></option>
</th:block>
</select>
</div>
<label for="seriesCd" class="col-sm-2 col-form-label col-form-label-sm text-center">직별</label>
<div class="col-sm-4">
<select class="form-select form-select-sm" id="seriesCd" name="seriesCd">
<option value="">--선택--</option>
<th:block th:each="code:${seriesList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${code.itemCd eq userInfo.seriesCd}"></option>
</th:block>
</select>
</div>
</div>
<div class="mb-3 row">
<label for="languageCd" class="col-sm-2 col-form-label col-form-label-sm text-center">외국어특채</label>
<div class="col-sm-4">
<select class="form-select form-select-sm" id="languageCd" name="languageCd">
<option value="">--선택--</option>
<th:block th:each="code:${languageList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${code.itemCd eq userInfo.languageCd}"></option>
</th:block>
</select>
</div>
</div>
</form>
</div>
<div class="modal-footer row justify-content-between">
<div class="col-auto">
<th:block th:if="${userInfo.userStatus eq 'USC003'}">
<button type="button" class="btn btn-info" id="syncToKwmsBtn" th:disabled="${#strings.isEmpty(userInfo.dicCode)}">인사시스템 정보 불러오기</button>
<th:block th:if="${#strings.isEmpty(userInfo.dicCode)}">
<label for="syncToKwmsBtn" style="font-size: 12px">공무원식별번호가 필요합니다.</label>
</th:block>
</th:block>
</div>
<div class="col-auto">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
<button type="button" class="btn btn-warning" id="updateBtn">수정</button>
</div>
</div>
</html>

View File

@ -0,0 +1,171 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/layout}">
<th:block layout:fragment="script">
<script type="text/javascript" th:src="@{/js/faisp/police.js}"></script>
</th:block>
<div layout:fragment="content">
<main class="pt-3">
<h4>現 외사경찰 현황</h4>
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<div class="row mx-0">
<div class="col-12 card text-center">
<div class="card-body">
<form id="searchFm" method="get" th:action="@{/faisp/policeList}">
<input type="hidden" name="excel">
<input type="hidden" name="pageIndex" id="pageIndex" th:value="${searchParams.pageIndex}">
<div class="row justify-content-between pe-3 py-1">
<div class="col-auto">
<select class="form-select" name="rowCnt" id="rowCnt">
<th:block th:each="num : ${#numbers.sequence(1,5)}">
<option th:value="${num*10}" th:text="${num*10}" th:selected="${searchParams.rowCnt==num*10}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<button type="button" class="btn btn-success" id="goExcel">엑셀다운</button>
</div>
</div>
<div class="row justify-content-end pe-3 py-1">
<div class="col-auto">
<div class="row justify-content-end">
<div class="col-auto" th:if="${accessAuth eq 'ACC003'}">
<select class="form-select form-select-sm" name="mgtOrgan">
<option value="">관서</option>
</select>
</div>
<div class="col-auto">
<select class="form-select form-select-sm" name="detailType">
<option value="">성별</option>
<th:block th:each="commonCode:${session.commonCode.get('PVREUSE')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" placeholder="이름" name="useNo">
</div>
<input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색">
</div>
</div>
</div>
</form>
<div class="row justify-content-start">
<div class="col-12">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="affairTab" data-bs-toggle="tab" type="button" role="tab">現외사경찰</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="stayTab" data-bs-toggle="tab" type="button" role="tab">前외사경찰</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="commitTab" data-bs-toggle="tab" type="button" role="tab">非외사경찰</button>
</li>
</ul>
<div class="card">
<div class="card-body">
<div class="row">
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>순번</th>
<th>계급</th>
<th>성명</th>
<th></th>
<th>현부서<br></th>
<th>생년월일</th>
<th>성별</th>
<th>최초<br>임용</th>
<th>현 계급<br>임용</th>
<th>현 부서<br>임용</th>
<th>수사경과<br>보유여부</th>
<th>외사경력</th>
<th>입직<br>경로</th>
<th>최종<br>수정일</th>
<th>전출<input type="checkbox"></th>
</tr>
</thead>
<tbody class="table-group-divider">
<tr class="policeTr" th:each="list:${policeList}">
<th:block>
<input type="hidden" class="userSeq" th:value="${list.userSeq}">
</th:block>
<td th:text="${list.userSeq}"></td>
<td th:text="${list.titleCd}"></td>
<td th:text="${list.userNm}"></td>
<td th:text="${list.ogCd}"></td>
<td th:text="${list.ofcCd}"></td>
<td th:text="${list.birthDate}"></td>
<td th:text="${list.sex}"></td>
<td th:text="${list.policeInDate}"></td>
<td th:text="${list.titleInDate}"></td>
<td th:text="${list.ofcInDate}"></td>
<td th:text="${list.outturnCd}"></td>
<td></td>
<td th:text="${list.jobInCd}"></td>
<td th:text="${#temporals.format(list.wrtDt, 'yyyy-MM-dd HH:mm')}"></td>
</tr>
</tbody>
</table>
</div>
<div class="row justify-content-between">
<div class="col-auto">
</div>
<div class="col-auto">
<nav aria-label="Page navigation">
<ul class="pagination">
<th:block th:if="${searchParams.pageIndex>3}">
<li class="page-item" th:data-pageindex="${(searchParams.pageIndex)-3}">
<a class="page-link" href="#" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
</th:block>
<th:block th:each="num : ${#numbers.sequence(searchParams.startNum, searchParams.endNum)}">
<li class="page-item" th:data-pageindex="${num}" th:classappend="${searchParams.pageIndex==num?'active':''}">
<a class="page-link" href="#" th:text="${num}"></a>
</li>
</th:block>
<th:block th:if="${searchParams.maxNum>searchParams.endNum+2}">
<li class="page-item" th:data-pageindex="${(searchParams.pageIndex)+3}">
<a class="page-link" href="#" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</th:block>
</ul>
</nav>
</div>
<div class="col-auto">
<button type="button" class="btn btn-success"id="addPvre" th:if="${accessAuth eq 'ACC003'}">전출</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<div class="modal fade" id="policeEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="userEditModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content" id="policeEditModalContent">
<div class="modal-header">
</div>
<div class="modal-body">
<div class="tab-content border border-top-0" id="configCellPhone">
</div>
</div>
</div>
</div>
</div>
</div>
</html>