강석 최 2022-09-05 14:58:00 +09:00
commit fb12964682
9 changed files with 738 additions and 0 deletions

View File

@ -0,0 +1,54 @@
package com.dbnt.faisp.controller;
import com.dbnt.faisp.authMgt.AuthMgtService;
import com.dbnt.faisp.codeMgt.CodeMgtService;
import com.dbnt.faisp.menuMgt.MenuMgtService;
import com.dbnt.faisp.menuMgt.model.MenuMgt;
import com.dbnt.faisp.organMgt.OrganConfigService;
import com.dbnt.faisp.translator.TranslatorService;
import com.dbnt.faisp.translator.model.Translator;
import com.dbnt.faisp.userInfo.UserInfoService;
import com.dbnt.faisp.userInfo.model.UserInfo;
import lombok.RequiredArgsConstructor;
import java.util.List;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@RestController
@RequiredArgsConstructor
@RequestMapping("/translator")
public class TranslatorController {
private final MenuMgtService menuMgtService;
private final UserInfoService userInfoService;
private final AuthMgtService authMgtService;
private final CodeMgtService codeMgtService;
private final TranslatorService translatorSevice;
private final OrganConfigService organConfigService;
@GetMapping("/info")
public ModelAndView translatorInfo(@AuthenticationPrincipal UserInfo loginUser,Translator translator) {
ModelAndView mav = new ModelAndView("translator/translator");
translator.setOrganCdList(organConfigService.selectOrganListWhereUserOgCd(loginUser.getOgCd()));
System.out.println("@@="+translator.getOrganCdList());
translator.setQueryInfo();
mav.addObject("translatorList", translatorSevice.selectTranslatorList(translator));
translator.setContentCnt(translatorSevice.selectTranslatorListCnt(translator));
translator.setPaginationInfo();
mav.addObject("searchParams", translator);
return mav;
}
@PostMapping("/insertTranslatorInfo")
public String insertTranslatorInfo(@AuthenticationPrincipal UserInfo loginUser,Translator translator) {
translator.setWrtNm(loginUser.getUserId());
translator.setWrtOrgan(loginUser.getOgCd());
return translatorSevice.insertTranslatorInfo(translator);
}
}

View File

@ -0,0 +1,42 @@
package com.dbnt.faisp.translator;
import com.dbnt.faisp.menuMgt.mapper.MenuMgtMapper;
import com.dbnt.faisp.menuMgt.model.MenuMgt;
import com.dbnt.faisp.menuMgt.repository.MenuMgtRepository;
import com.dbnt.faisp.translator.mapper.TranslatorMapper;
import com.dbnt.faisp.translator.model.Translator;
import com.dbnt.faisp.translator.repository.TranslatorRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.persistence.Transient;
import java.time.LocalDateTime;
import java.util.*;
@Service
@RequiredArgsConstructor
public class TranslatorService {
private final TranslatorRepository translatorRepository;
private final TranslatorMapper translatorMapper;
public String insertTranslatorInfo(Translator translator) {
translator.setWrtDt(LocalDateTime.now());
return translatorRepository.save(translator).getTrName();
}
public List<Translator> selectTranslatorList(Translator translator) {
return translatorMapper.selectTranslatorList(translator);
}
public Integer selectTranslatorListCnt(Translator translator) {
return translatorMapper.selectTranslatorListCnt(translator);
}
}

View File

@ -0,0 +1,16 @@
package com.dbnt.faisp.translator.mapper;
import com.dbnt.faisp.translator.model.Translator;
import com.dbnt.faisp.userInfo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface TranslatorMapper {
List<Translator> selectTranslatorList(Translator translator);
Integer selectTranslatorListCnt(Translator translator);
}

View File

@ -0,0 +1,87 @@
package com.dbnt.faisp.translator.model;
import com.dbnt.faisp.authMgt.model.AccessConfig;
import com.dbnt.faisp.authMgt.model.ApprovalConfig;
import com.dbnt.faisp.config.BaseModel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Getter
@Setter
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "translator_info")
public class Translator extends BaseModel implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "translator_key")
private Integer translatorKey;
@Column(name = "version_no")
private Integer versionNo;
@Column(name = "ogdp1")
private String ogdp1;
@Column(name = "tr_lang")
private String trLang;
@Column(name = "tr_career")
private String trCareer;
@Column(name = "tr_name")
private String trName;
@Column(name = "tr_sex")
private String trSex;
@Column(name = "tr_phone")
private String trPhone;
@Column(name = "tr_nny")
private String trNny;
@Column(name = "tr_age")
private String trAge;
@Column(name = "tr_edu")
private String trEdu;
@Column(name = "tr_cft")
private String trCft;
@Column(name = "tr_visa")
private String trVisa;
@Column(name = "apt_dt")
private String aptDt;
@Column(name = "dml_yn")
private String dmlYn;
@Column(name = "remark")
private String remark;
@Column(name = "wrt_nm")
private String wrtNm;
@Column(name = "wrt_dt")
private LocalDateTime wrtDt;
@Column(name = "wrt_organ")
private String wrtOrgan;
@Override
public String toString() {
return "Translator [translatorKey=" + translatorKey + ", versionNo=" + versionNo + ", ogdp1=" + ogdp1 + ", trLang="
+ trLang + ", trCareer=" + trCareer + ", trName=" + trName + ", trSex=" + trSex + ", trPhone=" + trPhone
+ ", trNny=" + trNny + ", trAge=" + trAge + ", trCft=" + trCft + ", trVisa=" + trVisa + ", aptDt=" + aptDt
+ ", dmlYn=" + dmlYn + ", remark=" + remark + ", wrtNm=" + wrtNm + ", wrtDt=" + wrtDt + "]";
}
}

View File

@ -0,0 +1,13 @@
package com.dbnt.faisp.translator.repository;
import com.dbnt.faisp.translator.model.Translator;
import com.dbnt.faisp.userInfo.model.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface TranslatorRepository extends JpaRepository<Translator, Integer> {
}

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dbnt.faisp.translator.mapper.TranslatorMapper">
<select id="selectTranslatorList" resultType="Translator" parameterType="Translator">
select
translator_key,
(select item_value from code_mgt where item_cd = ogdp1) as ogdp1,
(select item_value from code_mgt where item_cd = tr_lang) as tr_lang,
tr_career,
tr_name,
(select item_value from code_mgt where item_cd = tr_sex) as tr_sex,
tr_age,
(select item_value from code_mgt where item_cd = tr_nny) as tr_nny,
(select item_value from code_mgt where item_cd = tr_edu) as tr_edu,
tr_cft,
(select item_value from code_mgt where item_cd = tr_visa) as tr_visa,
dml_yn,
apt_dt,
tr_phone
from translator_info
where wrt_organ in
<foreach collection="organCdList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
order by translator_key desc
limit #{rowCnt} offset #{firstIndex}
</select>
<select id="selectTranslatorListCnt" resultType="int" parameterType="Translator">
select count(*)
from translator_info
where wrt_organ in
<foreach collection="organCdList" item="item" index="index" separator="," open="(" close=")">
#{item}
</foreach>
</select>
</mapper>

View File

@ -0,0 +1,83 @@
$(document).on('click', '#saveBtn', function (){
if(confirm("저장하시겠습니까?")){
contentFade("in");
const formData = new FormData($("#translatorInsert")[0]);
$.ajax({
type : 'POST',
data : formData,
url : "/translator/insertTranslatorInfo",
processData: false,
contentType: false,
success : function(result) {
alert("저장되었습니다.\n담당자 승인 후 로그인 가능합니다.")
contentFade("out");
location.reload;
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
contentFade("out");
}
})
}
})
function valueCheck(form){
const targetForm = $("#"+form);
const userId = targetForm.find("#userId").val();
const password = targetForm.find("#modalPassword");
const passwordConfirm = targetForm.find("#passwordConfirm");
const userNm = targetForm.find("#userNm").val();
const ogCd = targetForm.find("#ogCd").val();
const ofcCd = targetForm.find("#ofcCd").val();
let returnFlag = true;
if(!userId){
alert("아이디를 입력해주세요.");
returnFlag = false;
}else{
const idReg = /^[a-z]+[a-z0-9]{5,19}$/g;
if(!idReg.test(userId)){
returnFlag = false;
alert("아이디 조건이 맞지 않습니다.")
}
}
if(!password[0].disabled && !password.val()){
alert("비밀번호를 입력해주세요.");
returnFlag = false;
}
if(!password[0].disabled && !passwordConfirm.val()){
alert("비밀번호 확인을 입력해주세요.");
returnFlag = false;
}
if(!userNm){
alert("이름 입력해주세요.");
returnFlag = false;
}
if(returnFlag){
const passwordReg = /^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+]).{8,16}$/;
if(!password[0].disabled){
if(!passwordReg.test(password.val())){
alert("비밀번호 조건이 맞지 않습니다.")
returnFlag = false;
}else{
if(password.val() !== passwordConfirm.val()){
alert("비밀번호가 같지 않습니다.");
returnFlag = false;
}
}
}
}
if(!ogCd){
alert("관서를 선택해주세요.");
returnFlag = false;
}
if(!ofcCd){
alert("부서를 선택해주세요.");
returnFlag = false;
}
return returnFlag;
}

View File

@ -0,0 +1,301 @@
<!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/translator/translator.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 method="get" th:action="@{/authMgt/authMgtPage}">
<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">
<div class="row justify-content-end">
<div class="col-auto">
<select class="form-select form-select-sm" name="ogCd">
<option value="">관서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${searchParams.ogCd==commonCode.itemCd}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<select class="form-select form-select-sm" name="ofcCd">
<option value="">부서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OFC')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${searchParams.ofcCd==commonCode.itemCd}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" name="userNm" placeholder="사용자명" th:value="${searchParams.userNm}">
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" name="userId" placeholder="사용자 아이디" th:value="${searchParams.userId}">
</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">
<div class="card">
<div class="card-body">
<div class="row">
<table class="table table-striped">
<thead>
<tr>
<th>연번</th>
<th>관서명</th>
<th>언어</th>
<th>경력</th>
<th>성명</th>
<th>성별</th>
<th>나이</th>
<th>국적</th>
<th>학력</th>
<th>자격증</th>
<th>비자</th>
<th>해촉</th>
<th>위촉일</th>
<th>연락처</th>
</tr>
</thead>
<tbody>
<tr class="userInfoTr" th:each="trInfo:${translatorList}">
<td th:text="${trInfo.translatorKey}"></td>
<td th:text="${trInfo.ogdp1}"></td>
<td th:text="${trInfo.trLang}"></td>
<td th:text="${trInfo.trCareer}"></td>
<td th:text="${trInfo.trName}"></td>
<td th:text="${trInfo.trAge}"></td>
<td th:text="${trInfo.trSex}"></td>
<td th:text="${trInfo.trNny}"></td>
<td th:text="${trInfo.trEdu}"></td>
<th:block th:if="${not #strings.isEmpty(trInfo.trCft)}">
<td>O</td>
</th:block>
<th:block th:if="${#strings.isEmpty(trInfo.trCft)}">
<td>X</td>
</th:block>
<td th:text="${trInfo.trVisa}"></td>
<th:block th:if="${trInfo.dmlYn == 'Y'}">
<td></td>
</th:block>
<th:block th:if="${trInfo.dmlYn == 'N'}">
<td></td>
</th:block>
<td th:text="${trInfo.aptDt}"></td>
<td th:text="${trInfo.trPhone}"></td>
</tr>
</tbody>
</table>
</div>
<div class="row justify-content-center">
<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 class="col-auto">
<button data-bs-toggle="modal" data-bs-target="#translatorInsertModal">등록</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<div class="modal fade" id="translatorInsertModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="userInsertModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content ">
<div class="modal-header">
<h5 class="modal-title" id="translatorInsertModalLabel">통역인 등록</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form id="translatorInsert" action="#" method="post">
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<div class="mb-3 row">
<div class="mb-3 row">
<label for="ogCd" class="col-sm-2 col-form-label text-center">관서</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="ogdp1">
<option value="">선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<label for="ofcCd" class="col-sm-1 col-form-label text-center">언어</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="trLang">
<option value="">선택</option>
<th:block th:each="commonCode:${session.commonCode.get('LGG')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<label for="ofcCd" class="col-sm-1 col-form-label text-center">경력</label>
<div class="col-sm-4">
<input type="text" class="form-control" id="trCareer" name="trCareer">
</div>
</div>
<div class="mb-3 row">
<label for="ogCd" class="col-sm-2 col-form-label text-center">성명</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="trName" name="trName">
</div>
<label for="ofcCd" class="col-sm-1 col-form-label text-center">성별</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="trSex">
<option value="">선택</option>
<th:block th:each="commonCode:${session.commonCode.get('SEX')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<label for="ofcCd" class="col-sm-1 col-form-label text-center">연락처</label>
<div class="col-sm-4">
<input type="text" class="form-control" id="trPhone" name="trPhone">
</div>
</div>
<div class="mb-3 row">
<label for="ogCd" class="col-sm-2 col-form-label text-center">국적</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="trNny">
<option value="">선택</option>
<th:block th:each="commonCode:${session.commonCode.get('NNY')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<label for="ofcCd" class="col-sm-1 col-form-label text-center">나이</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="trAge" name="trAge">
</div>
<label for="ofcCd" class="col-sm-1 col-form-label text-center">학력</label>
<div class="col-sm-4">
<select class="form-select form-select-sm" name="trEdu">
<option value="">선택</option>
<th:block th:each="commonCode:${session.commonCode.get('EDU')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
</div>
<div class="mb-3 row">
<label for="ogCd" class="col-sm-2 col-form-label text-center">자격증</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="trCft" name="trCft">
</div>
<label for="ofcCd" class="col-sm-1 col-form-label text-center">비자</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="trVisa">
<option value="">선택</option>
<th:block th:each="commonCode:${session.commonCode.get('VISA')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
</th:block>
</select>
</div>
<label for="ofcCd" class="col-sm-1 col-form-label text-center">위촉일</label>
<div class="col-sm-4">
<!-- <input type="date" class="form-control" id="aptDt" name="aptDt"> -->
</div>
</div>
<label for="ogCd" class="col-sm-2 col-form-label text-center">해촉</label>
<div class="col-sm-2">
<select class="form-select form-select-sm" name="dmlYn">
<option value="">선택</option>
<option value="Y"></option>
<option value="N">아니오</option>
</select>
</div>
<div class="mb-3 row">
<label for="tel" class="col-sm-2 col-form-label text-center">비고</label>
<div class="col-sm-4">
<textarea class="form-control" id="remark"></textarea>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="closeModalBtn">닫기</button>
<button type="button" class="btn btn-primary" id="saveBtn">등록</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="authEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="authEditModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content" id="authEditModalContent">
<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">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="accessTab" data-bs-toggle="tab" data-bs-target="#accessTabPanel" type="button" role="tab" aria-controls="accessTabPanel" aria-selected="true">메뉴</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="approvalTab" data-bs-toggle="tab" data-bs-target="#approvalTabPanel" type="button" role="tab" aria-controls="approvalTabPanel" aria-selected="false">결재</button>
</li>
</ul>
<div class="tab-content border border-top-0" id="configInfo">
</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="saveAuthBtn">저장</button>
</div>
</div>
</div>
</div>
</div>
</html>

View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<input type="hidden" id="userSeq" th:value="${userInfo.userSeq}">
<div class="tab-pane fade show active" id="accessTabPanel" role="tabpanel" aria-labelledby="accessTab" tabindex="0">
<table class="table table-hover text-center" id="accessEditTable">
<thead>
<tr>
<th>대분류</th>
<th>중분류</th>
<th>소분류</th>
<th>관리</th>
<th>작성</th>
<th>조회</th>
</tr>
</thead>
<tbody>
<tr th:each="accessConfig:${userInfo.accessConfigList}">
<input type="hidden" class="menuKey" th:value="${accessConfig.menuKey}">
<th:block th:each="commonCode:${session.commonCode.get('CAT1')}">
<th:block th:if="${commonCode.itemCd eq accessConfig.cat1Cd}">
<td th:text="${commonCode.itemValue}"></td>
</th:block>
</th:block>
<th:block th:each="commonCode:${session.commonCode.get('CAT2')}">
<th:block th:if="${commonCode.itemCd eq accessConfig.cat2Cd}">
<td th:text="${commonCode.itemValue}"></td>
</th:block>
</th:block>
<th:block th:if="${#strings.isEmpty(accessConfig.cat3Cd)}">
<td></td>
</th:block>
<th:block th:unless="${#strings.isEmpty(accessConfig.cat3Cd)}" th:each="commonCode:${session.commonCode.get('CAT3')}">
<th:block th:if="${commonCode.itemCd eq accessConfig.cat3Cd}">
<td th:text="${commonCode.itemValue}"></td>
</th:block>
</th:block>
<td class="radioTd">
<input type="radio" th:name="${#strings.concat('accessAuth',accessConfig.menuKey)}" th:checked="${'ACC003' eq accessConfig.accessAuth}" value="ACC003">
</td>
<td class="radioTd">
<input type="radio" th:name="${#strings.concat('accessAuth',accessConfig.menuKey)}" th:checked="${'ACC002' eq accessConfig.accessAuth}" value="ACC002">
</td>
<td class="radioTd">
<input type="radio" th:name="${#strings.concat('accessAuth',accessConfig.menuKey)}" th:checked="${'ACC001' eq accessConfig.accessAuth}" value="ACC001">
</td>
</tr>
</tbody>
</table>
</div>
<div class="tab-pane fade" id="approvalTabPanel" role="tabpanel" aria-labelledby="approvalTab" tabindex="0">
<table class="table table-hover text-center" id="approvalEditTable">
<thead>
<tr>
<th>대분류</th>
<th>중분류</th>
<th>소분류</th>
<th>계장대행</th>
<th>계장</th>
<th>과장대행</th>
<th>과장</th>
</tr>
</thead>
<tbody>
<tr th:each="approvalConfig:${userInfo.approvalConfigList}">
<input type="hidden" class="menuKey" th:value="${approvalConfig.menuKey}">
<th:block th:each="commonCode:${session.commonCode.get('CAT1')}">
<th:block th:if="${commonCode.itemCd eq approvalConfig.cat1Cd}">
<td th:text="${commonCode.itemValue}">.</td>
</th:block>
</th:block>
<th:block th:each="commonCode:${session.commonCode.get('CAT2')}">
<th:block th:if="${commonCode.itemCd eq approvalConfig.cat2Cd}">
<td th:text="${commonCode.itemValue}">.</td>
</th:block>
</th:block>
<th:block th:if="${#strings.isEmpty(approvalConfig.cat3Cd)}">
<td></td>
</th:block>
<th:block th:unless="${#strings.isEmpty(approvalConfig.cat3Cd)}" th:each="commonCode:${session.commonCode.get('CAT3')}">
<th:block th:if="${commonCode.itemCd eq approvalConfig.cat3Cd}">
<td th:text="${commonCode.itemValue}"></td>
</th:block>
</th:block>
<td class="radioTd">
<input type="radio" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:checked="${'APC004' eq approvalConfig.approvalAuth}" value="APC004">
</td>
<td class="radioTd">
<input type="radio" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:checked="${'APC003' eq approvalConfig.approvalAuth}" value="APC003">
</td>
<td class="radioTd">
<input type="radio" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:checked="${'APC002' eq approvalConfig.approvalAuth}" value="APC002">
</td>
<td class="radioTd">
<input type="radio" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:checked="${'APC001' eq approvalConfig.approvalAuth}" value="APC001">
</td>
</tr>
</tbody>
</table>
</div>
</html>