외사경찰 경력현황 작업완료.

강석 최 2022-11-21 18:28:43 +09:00
parent 61f001f3cb
commit 3ceedad5c6
22 changed files with 584 additions and 169 deletions

View File

@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
@RequiredArgsConstructor
@RequestMapping("/kwms")
@ -73,4 +74,11 @@ public class KwmsController {
return mav;
}
@GetMapping("/kwmsCareerModal")
public ModelAndView kwmsCareerModal(Integer userSeq, String dicCode){
ModelAndView mav = new ModelAndView("faisp/career/kwmsCareerModal");
mav.addObject("crcList", codeMgtService.selectCodeMgtList("CRC", ""));
mav.addObject("careerList", kwmsService.selectUserCareerList(userSeq, dicCode));
return mav;
}
}

View File

@ -1,6 +1,5 @@
package com.dbnt.faisp.kwms.model;
import com.dbnt.faisp.config.BaseModel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@ -11,6 +10,7 @@ import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Getter
@ -35,9 +35,9 @@ public class VHordYundongStat {
@Column(name = "JIKGEUP_CD")
private String jikgeupCd;
@Column(name = "START_DATE")
private LocalDateTime startDate;
private LocalDate startDate;
@Column(name = "END_DATE")
private LocalDateTime endDate;
private LocalDate endDate;
@Column(name = "WORK_DAY")
private Integer workDay;
@Column(name = "WORK_MONTH")

View File

@ -8,5 +8,5 @@ import java.util.List;
public interface VHordYundongStatRepository extends JpaRepository<VHordYundongStat, String> {
List<VHordYundongStat> findByDicCode(String dicCode);
List<VHordYundongStat> findByDicCodeOrderByStartDateDesc(String dicCode);
}

View File

@ -1,21 +1,29 @@
package com.dbnt.faisp.kwms.service;
import com.dbnt.faisp.kwms.model.VEmployee;
import com.dbnt.faisp.kwms.model.VHordYundongStat;
import com.dbnt.faisp.kwms.repository.VEmployeeRepository;
import com.dbnt.faisp.kwms.repository.VHordYundongStatRepository;
import com.dbnt.faisp.main.codeMgt.service.CodeMgtService;
import com.dbnt.faisp.main.userInfo.model.UserCareer;
import com.dbnt.faisp.main.userInfo.model.UserInfo;
import com.dbnt.faisp.main.userInfo.repository.UserCareerRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
@Service
@RequiredArgsConstructor
public class KwmsService {
private final VEmployeeRepository vEmployeeRepository;
private final VHordYundongStatRepository vHordRepository;
private final CodeMgtService codeMgtService;
private final UserCareerRepository careerRepository;
public UserInfo selectEmpInfo(String dicCode){
VEmployee empInfo = vEmployeeRepository.findByDicCode(dicCode).orElse(null);
@ -32,13 +40,13 @@ public class KwmsService {
userInfo.setUserNm(empInfo.getEmpNm());
userInfo.setSex(empInfo.getSex().strip().equals("F")?"SEX001":"SEX002");
String[] positionAry = empInfo.getCallBuseoNm().split(" ");
userInfo.setOgCd(codeMgtService.searchCode("OG", positionAry[0]));
userInfo.setOgCd(codeMgtService.searchCodeToCategoryAndValue("OG", positionAry[0]));
if (positionAry.length>1){
userInfo.setOfcCd(codeMgtService.searchCode("OFC", positionAry[1]));
userInfo.setOfcCd(codeMgtService.searchCodeToCategoryAndValue("OFC", positionAry[1]));
}
userInfo.setTitleCd(codeMgtService.searchCode("JT", empInfo.getJikgeup()));
userInfo.setOutturnCd(codeMgtService.searchCode("OTC", empInfo.getGyunggwa()));
userInfo.setSeriesCd(codeMgtService.searchCode("SRC", empInfo.getJikbyul()));
userInfo.setTitleCd(codeMgtService.searchCodeToCategoryAndValue("JT", empInfo.getJikgeup()));
userInfo.setOutturnCd(codeMgtService.searchCodeToCategoryAndValue("OTC", empInfo.getGyunggwa()));
userInfo.setSeriesCd(codeMgtService.searchCodeToCategoryAndValue("SRC", empInfo.getJikbyul()));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
empInfo.setBirthDate(
@ -48,4 +56,32 @@ public class KwmsService {
userInfo.setTitleInDate(LocalDate.parse(empInfo.getHnJikgeupImyngil(), formatter));
return userInfo;
}
public List<UserCareer> selectUserCareerList(Integer userSeq, String dicCode) {
List<VHordYundongStat> statList = vHordRepository.findByDicCodeOrderByStartDateDesc(dicCode);
List<UserCareer> savedList = careerRepository.findByUserSeqOrderByStartDateDesc(userSeq);
List<UserCareer> careerList = new ArrayList<>();
for(VHordYundongStat stat: statList){
boolean savedFlag = false;
for(UserCareer savedCareer: savedList){
if (stat.getHordYundongCd().equals(savedCareer.getHordCd())) {
savedFlag = true;
break;
}
}
if(!savedFlag){
UserCareer career = new UserCareer();
career.setDesignationCd(codeMgtService.searchCodeToCategoryAndValue("DSN", stat.getImyongGubunNm()));
career.setWorkPositionStr(stat.getImyongbuseoChongching());
career.setWorkTitle(codeMgtService.searchCodeToCategoryAndValue("JT", stat.getImyongJikgeupNm()));
career.setStartDate(stat.getStartDate());
career.setEndDate(stat.getEndDate());
career.setWorkDay(stat.getWorkDay()==null?0:stat.getWorkDay());
career.setWorkMonth(stat.getWorkMonth()==null?0:stat.getWorkMonth());
career.setHordCd(stat.getHordYundongCd());
careerList.add(career);
}
}
return careerList;
}
}

View File

@ -4,12 +4,14 @@ import com.dbnt.faisp.main.codeMgt.model.CodeMgt;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface CodeMgtRepository extends JpaRepository<CodeMgt, CodeMgt.CodeMgtId> {
List<CodeMgt> findByCategoryCdOrderByItemCdAsc(String categoryCd);
List<CodeMgt> findByCategoryCdAndUseChkOrderByItemCdAsc(String categoryCd, String useChk);
Optional<CodeMgt> findByCategoryCdAndItemValue(String categoryCd, String itemValue);
List<CodeMgt> findByUseChkOrderByItemCdAsc(String useChk);
List<CodeMgt> findByOrderByItemCdAsc();
}

View File

@ -67,13 +67,8 @@ public class CodeMgtService{
}
return codeList;
}
public String searchCode(String categoryCd, String value){
List<CodeMgt> codeList = selectCodeMgtList(categoryCd, "");
for(CodeMgt code: codeList){
if(code.getItemValue().equals(value)){
return code.getItemCd();
}
}
return null;
public String searchCodeToCategoryAndValue(String categoryCd, String value){
CodeMgt code = codeMgtRepository.findByCategoryCdAndItemValue(categoryCd, value).orElse(null);
return code==null?null:code.getItemCd();
}
}

View File

@ -19,6 +19,7 @@ import java.time.LocalDateTime;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
@ -205,7 +206,7 @@ public class FaispController {
}
//메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faisp/policeList").get(0).getAccessAuth();
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faisp/careerMgt").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
userInfo.setQueryInfo();
mav.addObject("policeList", userInfoService.selectPoliceList(userInfo));
@ -217,15 +218,16 @@ public class FaispController {
return mav;
}
@GetMapping("/careerModal")
public ModelAndView careerModal(@AuthenticationPrincipal UserInfo loginUser, UserInfo userInfo){
public ModelAndView careerModal(@AuthenticationPrincipal UserInfo loginUser, UserCareer career){
ModelAndView mav = new ModelAndView("faisp/career/careerModal");
//메뉴권한 확인
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faisp/educationMgt").get(0).getAccessAuth();
String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faisp/careerMgt").get(0).getAccessAuth();
mav.addObject("accessAuth", accessAuth);
mav.addObject("selectedTab", career.getCareerCd());
mav.addObject("crcList", codeMgtService.selectCodeMgtList("CRC", ""));
mav.addObject("userInfo", userInfoService.selectPoliceInfo(userInfo.getUserSeq()));
/*mav.addObject("eduList", userInfoService.selectEduList());*/
mav.addObject("userInfo", userInfoService.selectPoliceInfo(career.getUserSeq()));
mav.addObject("careerList", userInfoService.selectCareerList(career.getUserSeq()));
mav.addObject("userSeq", loginUser.getUserSeq());
return mav;
}
@ -240,6 +242,32 @@ public class FaispController {
mav.addObject("career", career);
return mav;
}
@PostMapping("/saveCareer")
public void saveCareer(@AuthenticationPrincipal UserInfo loginUser, UserCareer career){
career.setWrtOrgan(loginUser.getOgCd());
career.setWrtPart(loginUser.getOfcCd());
career.setWrtUserSeq(loginUser.getUserSeq());
career.setWrtUserGrd(loginUser.getTitleCd());
career.setWrtUserNm(loginUser.getUserNm());
career.setWrtDt(LocalDateTime.now());
userInfoService.saveCareer(career);
}
@PostMapping("/saveCareerList")
public void saveCareerList(@AuthenticationPrincipal UserInfo loginUser, UserCareer info){
for(UserCareer career: info.getCareerList()){
career.setWrtOrgan(loginUser.getOgCd());
career.setWrtPart(loginUser.getOfcCd());
career.setWrtUserSeq(loginUser.getUserSeq());
career.setWrtUserGrd(loginUser.getTitleCd());
career.setWrtUserNm(loginUser.getUserNm());
career.setWrtDt(LocalDateTime.now());
}
userInfoService.saveCareerList(info.getCareerList());
}
@PostMapping("/deleteCareer")
public void deleteCareer(UserCareer career){
userInfoService.deleteCareer(career);
}
@GetMapping("/educationMgt")
public ModelAndView educationMgt(@AuthenticationPrincipal UserInfo loginUser, UserInfo userInfo, HttpServletResponse response){

View File

@ -9,6 +9,7 @@ import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Getter
@ -56,15 +57,19 @@ public class UserCareer{
@Column(name = "wrt_part")
private String wrtPart;
@Column(name = "wrt_user_seq")
private String wrtUserSeq;
private Integer wrtUserSeq;
@Column(name = "wrt_user_grd")
private Integer wrtUserGrd;
private String wrtUserGrd;
@Column(name = "wrt_user_nm")
private String wrtUserNm;
@Column(name = "wrt_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private LocalDateTime wrtDt;
@Transient
List<UserCareer> careerList;
@Embeddable
@Data
@NoArgsConstructor

View File

@ -112,6 +112,18 @@ public class UserInfo extends BaseModel implements UserDetails{
private String excel;
@Transient
private String rownum;
@Transient
private Integer crc001Sum;
@Transient
private Integer crc002Sum;
@Transient
private Integer crc003Sum;
@Transient
private Integer crc004Sum;
@Transient
private Integer crc005Sum;
@Transient
private Integer crc006Sum;
@Transient
private List<AccessConfig> accessConfigList;

View File

@ -3,7 +3,12 @@ package com.dbnt.faisp.main.userInfo.repository;
import com.dbnt.faisp.main.userInfo.model.UserCareer;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface UserCareerRepository extends JpaRepository<UserCareer, UserCareer.UserCareerId> {
Optional<UserCareer> findTop1ByUserSeqOrderByCareerSeqDesc(Integer userSeq);
List<UserCareer> findByUserSeqOrderByStartDateDesc(Integer userSeq);
}

View File

@ -1,20 +1,10 @@
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.fipTarget.model.ShipInfo;
import com.dbnt.faisp.main.userInfo.mapper.UserInfoMapper;
import com.dbnt.faisp.main.userInfo.model.DashboardConfig;
import com.dbnt.faisp.main.userInfo.model.PersonnelStatus;
import com.dbnt.faisp.main.userInfo.model.UserEdu;
import com.dbnt.faisp.main.userInfo.model.*;
import com.dbnt.faisp.main.userInfo.model.UserEdu.UserEduId;
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.UserEduRepository;
import com.dbnt.faisp.main.userInfo.repository.UserInfoHistoryRepository;
import com.dbnt.faisp.main.userInfo.repository.UserInfoRepository;
import com.dbnt.faisp.main.userInfo.repository.*;
import com.dbnt.faisp.util.ParamMap;
import lombok.RequiredArgsConstructor;
@ -28,6 +18,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.List;
@Service
@ -38,6 +30,7 @@ public class UserInfoService implements UserDetailsService {
private final UserInfoHistoryRepository userInfoHistoryRepository;
private final DashboardConfigRepository dashboardConfigRepository;
private final PersonnelStatusRepository personnelStatusRepository;
private final UserCareerRepository userCareerRepository;
private final UserEduRepository userEduRepository;
private final UserInfoMapper userInfoMapper;
@ -335,6 +328,31 @@ public class UserInfoService implements UserDetailsService {
return userInfoMapper.selectPoliceInfo(userSeq);
}
public void saveCareer(UserCareer career) {
UserCareer lastCareer = userCareerRepository.findTop1ByUserSeqOrderByCareerSeqDesc(career.getUserSeq()).orElse(null);
career.setCareerSeq(lastCareer==null?1:(lastCareer.getCareerSeq()+1));
career.setWorkMonth((int) ChronoUnit.MONTHS.between(career.getStartDate(), career.getEndDate()));
career.setWorkDay((int) ChronoUnit.DAYS.between(career.getStartDate(), career.getEndDate()));
userCareerRepository.save(career);
}
public void saveCareerList(List<UserCareer> careerList) {
UserCareer lastCareer = userCareerRepository.findTop1ByUserSeqOrderByCareerSeqDesc(careerList.get(0).getUserSeq()).orElse(null);
int careerSeq = lastCareer==null?1:(lastCareer.getCareerSeq()+1);
for(UserCareer career: careerList){
career.setCareerSeq(careerSeq++);
}
userCareerRepository.saveAll(careerList);
}
public List<UserCareer> selectCareerList(Integer userSeq) {
return userCareerRepository.findByUserSeqOrderByStartDateDesc(userSeq);
}
public void deleteCareer(UserCareer career) {
userCareerRepository.deleteById(new UserCareer.UserCareerId(career.getUserSeq(), career.getCareerSeq()));
}
@Transactional
public int saveEdu(@AuthenticationPrincipal UserInfo loginUser,List<UserEdu> userEdu) {
int userSeq = 0;
@ -372,4 +390,5 @@ public class UserInfoService implements UserDetailsService {
userEduRepository.deleteById(new UserEduId(userEdu.getEduSeq(), userEdu.getUserSeq()));
return userEdu.getUserSeq();
}
}

View File

@ -102,21 +102,38 @@
<select id="selectPoliceList" resultType="UserInfo" parameterType="UserInfo">
select (ROW_NUMBER() OVER(order by user_nm desc)) AS rownum,
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
a.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,
b.crc001Sum,
b.crc002Sum,
b.crc003Sum,
b.crc004Sum,
b.crc005Sum,
b.crc006Sum
from user_info a
left outer join (
select user_seq,
sum(case when career_cd = 'CRC001' then work_month else 0 end) as crc001Sum,
sum(case when career_cd = 'CRC002' then work_month else 0 end) as crc002Sum,
sum(case when career_cd = 'CRC003' then work_month else 0 end) as crc003Sum,
sum(case when career_cd = 'CRC004' then work_month else 0 end) as crc004Sum,
sum(case when career_cd = 'CRC005' then work_month else 0 end) as crc005Sum,
sum(case when career_cd = 'CRC006' then work_month else 0 end) as crc006Sum
from user_career
group by user_seq
) b on a.user_seq = b.user_seq
<include refid="selectPoliceListWhere"></include>
order by rownum desc
<if test='excel != "Y"'>

View File

@ -45,7 +45,7 @@ $(document).on('click', '#saveCellPhone', function (){
success : function(result) {
alert("저장되었습니다.");
contentFade("out");
location.reload();
location.reload();
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
@ -98,7 +98,7 @@ $(document).on('click', '#updateCellPhone', function (){
success : function(result) {
alert("수정되었습니다.");
contentFade("out");
showModal(result);
showModal(result);
},
error : function(xhr, status) {
alert("수정에 실패하였습니다.")

View File

@ -135,7 +135,7 @@ $(document).on('click', '#updateUse', function (){
success : function(data) {
alert("수정되었습니다.");
contentFade("out");
showMdifyModal(data.useNo,data.useType,data.mgtOrgan);
showMdifyModal(data.useNo,data.useType,data.mgtOrgan);
},
error : function(xhr, status) {
alert("수정에 실패하였습니다.")

View File

@ -13,26 +13,14 @@ $(document).on('click', '#notPoliceTab', function (){
})
$(document).on('click', '.policeTr', function (){
$.ajax({
url: '/faisp/careerModal',
data: {userSeq: $(this).find(".userSeq").val()},
type: 'GET',
dataType:"html",
success: function(html){
$("#careerModalContent").empty().append(html);
$("#careerModal").modal('show');
},
error:function(){
}
});
getCareerModal($(this).find(".userSeq").val(), "CRC001")
});
$(document).on('click', '.careerAddBtn', function (){
$.ajax({
url: '/faisp/careerFormModal',
data: {
userSeq: $("#editModelUserSeq").val(),
userSeq: $("#mngModelUserSeq").val(),
careerCd: $(this).attr("data-careercd")
},
type: 'GET',
@ -51,9 +39,63 @@ $(document).on('click', '.careerAddBtn', function (){
}
});
})
$(document).on('click', '.kwmsCareerBtn', function (){
getKwmsCareerModal($("#mngModelUserSeq").val(), $("#mngModelDicCode").val())
})
$(document).on('click', '#kwmsModalSelectBtn', function (){
const selectedList = [];
$.each($(".careerSelector"), function (idx, selector){
if($(selector).val()!==''){
selectedList.push(selector);
}
})
if(selectedList.length>0){
if(confirm("저장하시겠습니까?")){
const formData = new FormData();
$.each(selectedList, function (idx, selector){
const kwmsCareerTr = $(selector).parents(".kwmsCareerTr")
const userSeq = $("#mngModelUserSeq").val();
formData.append("careerList["+idx+"].userSeq", userSeq)
formData.append("careerList["+idx+"].careerCd", selector.value)
formData.append("careerList["+idx+"].designationCd", kwmsCareerTr.find(".designationCd").val())
formData.append("careerList["+idx+"].workPositionStr", kwmsCareerTr.find(".workPositionStr").val())
formData.append("careerList["+idx+"].workTitle", kwmsCareerTr.find(".workTitle").val())
formData.append("careerList["+idx+"].startDate", kwmsCareerTr.find(".startDate").val())
formData.append("careerList["+idx+"].endDate", kwmsCareerTr.find(".endDate").val())
formData.append("careerList["+idx+"].workDay", kwmsCareerTr.find(".workDay").val())
formData.append("careerList["+idx+"].workMonth", kwmsCareerTr.find(".workMonth").val())
formData.append("careerList["+idx+"].hordCd", kwmsCareerTr.find(".hordCd").val())
})
$.ajax({
type : 'POST',
data : formData,
url : "/faisp/saveCareerList",
processData: false,
contentType: false,
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function(result) {
alert("저장되었습니다.");
$("#kwmsCareerModal").modal('hide');
getCareerModal($("#mngModelUserSeq").val(), "CRC001");
contentFade("out");
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.");
contentFade("out");
}
})
}
}else{
alert("불러올 경력의 구분을 선택해주세요.")
}
})
$(document).on('change', '#positionCheckBox', function (){
const selfInputDiv = $("#selfInputDiv");
const selectInputDiv = $("#selectInputDiv");
const selfInputDiv = $(".selfInputDiv");
const selectInputDiv = $(".selectInputDiv");
if(this.checked){
selfInputDiv.show();
selfInputDiv.find("input").removeAttr("disabled");
@ -68,10 +110,88 @@ $(document).on('change', '#positionCheckBox', function (){
})
$(document).on('click', '#saveBtn', function (){
if(checkValue()){
contentFade("in");
const formData = new FormData($("#careerForm")[0]);
$.ajax({
type : 'POST',
data : formData,
url : "/faisp/saveCareer",
processData: false,
contentType: false,
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function(result) {
alert("저장되었습니다.");
$("#careerFormModal").modal('hide');
getCareerModal($("#mngModelUserSeq").val(), $("#careerForm").find("#careerCd").val());
contentFade("out");
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.");
contentFade("out");
}
})
}
})
$(document).on('click', '.deleteCareerBtn', function (){
if(confirm("삭제하시겠습니까?")){
contentFade("in");
const userSeq = $("#mngModelUserSeq").val()
const tabCd = $(this).attr("data-tab")
$.ajax({
type : 'POST',
url : "/faisp/deleteCareer",
data : {
userSeq: userSeq,
careerSeq: $(this).attr("data-careerseq")
},
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function(data) {
alert("삭제 되었습니다.");
getCareerModal(userSeq, tabCd);
contentFade("out");
},
error : function(xhr, status) {
alert("삭제를 실패하였습니다");
contentFade("out");
}
})
}
})
function getCareerModal(userSeq, careerCd){
$.ajax({
url: '/faisp/careerModal',
data: {userSeq: userSeq, careerCd: careerCd},
type: 'GET',
dataType:"html",
success: function(html){
$("#careerModalContent").empty().append(html);
$("#careerModal").modal('show');
},
error:function(){
}
});
}
function getKwmsCareerModal(userSeq, dicCode){
$.ajax({
url: '/kwms/kwmsCareerModal',
data: {userSeq: userSeq, dicCode: dicCode},
type: 'GET',
dataType:"html",
success: function(html){
$("#kwmsCareerModalContent").empty().append(html);
$("#kwmsCareerModal").modal('show');
},
error:function(){
}
});
}
function checkValue(){
let flag = true;
const form = $("#careerForm");

View File

@ -77,7 +77,7 @@ $(document).on('click', '#saveShipInfo', function (){
success : function(result) {
alert("저장되었습니다.");
contentFade("out");
location.reload();
location.reload();
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")

View File

@ -94,7 +94,7 @@ $(document).on('click', '#savePasswordBtn', function (){
const formData = new FormData($("#modifyPasswordForm")[0]);
contentFade("in")
$.ajax({
type : 'PUT',
type : 'POST',
data : formData,
url : "/info/passwordModify",
processData: false,

View File

@ -40,6 +40,7 @@
</th:block>
</div>
</div>
<hr>
<div class="mb-3 row">
<label for="title" class="col-sm-2 col-form-label col-form-label-sm text-center">제목</label>
<div class="col-sm-10">
@ -51,12 +52,14 @@
<div class="col-sm-10" id="content" th:utext="${faRpt.content}">
</div>
</div>
<hr>
<div class="mb-3 row">
<label for="hashTags" class="col-sm-2 col-form-label col-form-label-sm text-center">해시태그</label>
<div class="col-sm-10">
<input type="text" class="form-control form-control-sm border-0" id="hashTags" name="hashTags" th:value="${faRpt.hashTags}" readonly>
</div>
</div>
<hr>
<div class="row mb-3">
<label for="fileTable" class="col-sm-2 col-form-label col-form-label-sm text-center">업로드 자료</label>
<div class="col-sm-10">

View File

@ -5,81 +5,78 @@
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="careerForm" action="#" method="POST"></form>
<input type="hidden" name="userSeq" th:value="${career.userSeq}">
<div class="row my-1">
<label for="careerCd" 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="careerCd" name="careerCd">
<th:block th:each="code:${crcList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${code.itemCd eq career.careerCd}"></option>
</th:block>
</select>
<form id="careerForm" action="#" method="POST">
<input type="hidden" name="userSeq" th:value="${career.userSeq}">
<div class="row my-1">
<label for="careerCd" 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="careerCd" name="careerCd">
<th:block th:each="code:${crcList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}" th:selected="${code.itemCd eq career.careerCd}"></option>
</th:block>
</select>
</div>
<label for="designationCd" 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="designationCd" name="designationCd">
<option value="">선택</option>
<th:block th:each="code:${dsnList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>
</div>
<label for="designationCd" 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="designationCd" name="designationCd">
<option value="">선택</option>
<th:block th:each="code:${dsnList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>
</div>
<div class="row my-1">
<label class="col-sm-2 col-form-label col-form-label-sm text-center fs-13">근무지</label>
<div class="col-sm-10">
<div class="row border m-0 py-1">
<div class="col-12">
<input type="checkbox" id="positionCheckBox">
<label for="positionCheckBox" class="col-sm-2 col-form-label col-form-label-sm px-2">직접입력</label>
</div>
<div class="col-12" id="selfInputDiv" style="display: none">
<input type="text" class="form-control form-control-sm" id="workPositionStr" name="workPositionStr">
</div>
<div class="col-12" id="selectInputDiv">
<div class="row">
<label for="workOrgan" class="col-sm-1 col-form-label col-form-label-sm text-center fs-13">관서</label>
<div class="col-sm-3">
<select class="form-select form-select-sm" id="workOrgan" name="workOrgan">
<option value="">선택</option>
<th:block th:each="code:${ogList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>
<label for="workPart" class="col-sm-1 col-form-label col-form-label-sm text-center fs-13">부서</label>
<div class="col-sm-3">
<select class="form-select form-select-sm" id="workPart" name="workPart">
<option value="">선택</option>
<th:block th:each="code:${ofcList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>
<label for="workTitle" class="col-sm-1 col-form-label col-form-label-sm text-center fs-13">직급</label>
<div class="col-sm-3">
<select class="form-select form-select-sm" id="workTitle" name="workTitle">
<option value="">선택</option>
<th:block th:each="code:${jtList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>
<div class="row my-1">
<label class="col-sm-2 col-form-label col-form-label-sm text-center fs-13">근무지</label>
<div class="col-sm-10">
<div class="row border m-0 py-1">
<div class="col-12">
<input type="checkbox" id="positionCheckBox">
<label for="positionCheckBox" class="col-sm-2 col-form-label col-form-label-sm px-2">직접입력</label>
</div>
<div class="col-8 selfInputDiv" style="display: none">
<input type="text" class="form-control form-control-sm" id="workPositionStr" name="workPositionStr">
</div>
<label for="workOrgan" class="selectInputDiv col-sm-1 col-form-label col-form-label-sm text-center fs-13">관서</label>
<div class="col-sm-3 selectInputDiv">
<select class="form-select form-select-sm" id="workOrgan" name="workOrgan">
<option value="">선택</option>
<th:block th:each="code:${ogList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>
<label for="workPart" class="selectInputDiv col-sm-1 col-form-label col-form-label-sm text-center fs-13">부서</label>
<div class="col-sm-3 selectInputDiv">
<select class="form-select form-select-sm" id="workPart" name="workPart">
<option value="">선택</option>
<th:block th:each="code:${ofcList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>
<label for="workTitle" class="col-sm-1 col-form-label col-form-label-sm text-center fs-13">직급</label>
<div class="col-sm-3">
<select class="form-select form-select-sm" id="workTitle" name="workTitle">
<option value="">선택</option>
<th:block th:each="code:${jtList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</div>
</div>
</div>
</div>
</div>
<div class="row my-1">
<label for="dateSelectorDiv" class="col-sm-2 col-form-label col-form-label-sm text-center fs-13">근무일</label>
<div class="col-sm-4">
<div class="input-group w-auto input-daterange" id="dateSelectorDiv">
<input type="text" class="form-control form-control-sm" id="startDate" name="startDate" placeholder="시작일" autocomplete="off" readonly>
<input type="text" class="form-control form-control-sm" id="endDate" name="endDate" placeholder="종료일" autocomplete="off" readonly>
<div class="row my-1">
<label for="dateSelectorDiv" class="col-sm-2 col-form-label col-form-label-sm text-center fs-13">근무일</label>
<div class="col-sm-4">
<div class="input-group w-auto input-daterange" id="dateSelectorDiv">
<input type="text" class="form-control form-control-sm" id="startDate" name="startDate" placeholder="시작일" autocomplete="off" readonly>
<input type="text" class="form-control form-control-sm" id="endDate" name="endDate" placeholder="종료일" autocomplete="off" readonly>
</div>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer row justify-content-between">
<div class="col-auto">

View File

@ -94,28 +94,71 @@
</tr>
</thead>
<tbody class="table-group-divider">
<tr class="policeTr" th:each="list:${policeList}">
<input type="hidden" class="userSeq" th:value="${list.userSeq}">
<td th:text="${list.rownum}"></td>
<td th:text="${list.titleCd}"></td>
<td th:text="${list.userNm}"></td>
<td th:text="${list.organNm}"></td>
<td th:text="${list.ofcCd}"></td>
<td th:text="${list.birthDate}"></td>
<td th:text="${list.sex}"></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<tr class="policeTr" th:each="police:${policeList}">
<input type="hidden" class="userSeq" th:value="${police.userSeq}">
<td th:text="${police.rownum}"></td>
<td th:text="${police.titleCd}"></td>
<td th:text="${police.userNm}"></td>
<td th:text="${police.organNm}"></td>
<td th:text="${police.ofcCd}"></td>
<td th:text="${police.birthDate}"></td>
<td th:text="${police.sex}"></td>
<td>
<th:block th:if="${police.crc001Sum ne null and police.crc001Sum ne 0}">
<th:block th:if="${police.crc001Sum > 12}">
<th:block th:text="|${police.crc001Sum/12}년 ${police.crc001Sum%12}개월|"></th:block>
</th:block>
<th:block th:unless="${police.crc001Sum > 12}">
<th:block th:text="|${police.crc001Sum}개월|"></th:block>
</th:block>
</th:block>
</td>
<td>
<th:block th:if="${police.crc002Sum ne null and police.crc002Sum ne 0}">
<th:block th:if="${police.crc002Sum > 12}">
<th:block th:text="|${police.crc002Sum/12}년 ${police.crc002Sum%12}개월|"></th:block>
</th:block>
<th:block th:unless="${police.crc002Sum > 12}">
<th:block th:text="|${police.crc002Sum}개월|"></th:block>
</th:block>
</th:block>
</td>
<td>
<th:block th:if="${police.crc003Sum ne null and police.crc003Sum ne 0}">
<th:block th:if="${police.crc003Sum > 12}">
<th:block th:text="|${police.crc003Sum/12}년 ${police.crc003Sum%12}개월|"></th:block>
</th:block>
<th:block th:unless="${police.crc003Sum > 12}">
<th:block th:text="|${police.crc003Sum}개월|"></th:block>
</th:block>
</th:block>
</td>
<td>
<th:block th:if="${police.crc004Sum ne null and police.crc004Sum ne 0}">
<th:block th:if="${police.crc004Sum > 12}">
<th:block th:text="|${police.crc004Sum/12}년 ${police.crc004Sum%12}개월|"></th:block>
</th:block>
<th:block th:unless="${police.crc004Sum > 12}">
<th:block th:text="|${police.crc004Sum}개월|"></th:block>
</th:block>
</th:block>
</td>
<td>
<th:block th:if="${police.crc005Sum ne null and police.crc005Sum ne 0}">
<th:block th:if="${police.crc005Sum > 12}">
<th:block th:text="|${police.crc005Sum/12}년 ${police.crc005Sum%12}개월|"></th:block>
</th:block>
<th:block th:unless="${police.crc005Sum > 12}">
<th:block th:text="|${police.crc005Sum}개월|"></th:block>
</th:block>
</th:block>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row justify-content-between">
<div class="col-auto">
</div>
<div class="row justify-content-center">
<div class="col-auto">
<nav aria-label="Page navigation">
<ul class="pagination">
@ -141,10 +184,6 @@
</ul>
</nav>
</div>
<div class="col-auto">
<button type="button" class="btn btn-success" id="outBtn" th:if="${userStatus eq 'USC003'} and ${accessAuth eq 'ACC003'}">전출</button>
<button type="button" class="btn btn-success" id="inBtn" th:if="${accessAuth eq 'ACC003'} and (${userStatus eq 'USC006'} or ${userStatus eq 'USC007'})">전입</button>
</div>
</div>
</div>
</div>
@ -172,6 +211,13 @@
</div>
</div>
<div class="modal fade" id="kwmsCareerModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="kwmsCareerModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="kwmsCareerModalContent">
</div>
</div>
</div>
</div>
</html>

View File

@ -1,11 +1,12 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header">
<h5 class="modal-title" th:text="|${userInfo.ogCd} ${userInfo.ofcCd} ${userInfo.titleCd} ${userInfo.userNm}|"></h5>
<h5 class="modal-title" th:text="|${userInfo.ogCd} ${userInfo.ofcCd eq null?'':userInfo.ofcCd} ${userInfo.titleCd eq null?'':userInfo.titleCd} ${userInfo.userNm}|"></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="hidden" id="editModelUserSeq" th:value="${userInfo.userSeq}">
<input type="hidden" id="mngModelUserSeq" th:value="${userInfo.userSeq}">
<input type="hidden" id="mngModelDicCode" th:value="${userInfo.dicCode}">
<div class="card">
<div class="card-body text-center">
<ul class="nav nav-tabs" id="userTab" role="tablist">
@ -13,21 +14,21 @@
<li class="nav-item" role="presentation">
<button class="nav-link" type="button" role="tab" data-bs-toggle="tab" th:id="|${code.itemCd}Tab|"
th:data-bs-target="${#strings.concat('#', code.itemCd, 'TabPanel')}" th:aria-controls="|${code.itemCd}TabPanel|"
th:aria-selected="${idx.index eq 0?'true':'false'}" th:classappend="${idx.index eq 0?'active':''}"
th:aria-selected="${code.itemCd eq selectedTab?'true':'false'}" th:classappend="${code.itemCd eq selectedTab?'active':''}"
th:text="${code.itemValue}"></button>
</li>
</th:block>
</ul>
<div class="tab-content border border-top-0">
<th:block th:each="code, idx:${crcList}">
<div class="tab-pane fade p-2" th:classappend="${idx.index eq 0?'show active':''}"
<div class="tab-pane fade p-2" th:classappend="${code.itemCd eq selectedTab?'show active':''}"
th:id="|${code.itemCd}TabPanel|" role="tabpanel"
th:aria-labelledby="|${code.itemCd}Tab|" tabindex="0">
<table class="table table-hover">
<thead>
<tr>
<th>임용구분</th>
<th>근무지</th>
<th colspan="2">근무지</th>
<th>직급</th>
<th>시작일</th>
<th>종료일</th>
@ -38,11 +39,66 @@
<th></th>
</tr>
</thead>
<tbody th:id="|${code.itemValue}Tbody|">
<tbody>
<th:block th:each="career:${careerList}">
<th:block th:if="${code.itemCd eq career.careerCd}">
<tr>
<td>
<th:block th:each="code:${session.commonCode.get('DSN')}">
<th:block th:if="${code.itemCd eq career.designationCd}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<th:block th:if="${#strings.isEmpty(career.workPositionStr)}">
<th:block th:each="code:${session.commonCode.get('OG')}">
<th:block th:if="${code.itemCd eq career.workOrgan}">
<td th:text="${code.itemValue}"></td>
</th:block>
</th:block>
<th:block th:each="code:${session.commonCode.get('OFC')}">
<th:block th:if="${code.itemCd eq career.workPart}">
<td th:text="${code.itemValue}"></td>
</th:block>
</th:block>
</th:block>
<th:block th:unless="${#strings.isEmpty(career.workPositionStr)}">
<td colspan="2" th:text="${career.workPositionStr}"></td>
</th:block>
<th:block th:each="code:${session.commonCode.get('JT')}">
<th:block th:if="${code.itemCd eq career.workTitle}">
<td th:text="${code.itemValue}"></td>
</th:block>
</th:block>
<td th:text="${#temporals.format(career.startDate, 'yyyy-MM-dd')}"></td>
<td th:text="${#temporals.format(career.endDate, 'yyyy-MM-dd')}"></td>
<td th:text="${career.workDay}"></td>
<td th:text="${career.workMonth}"></td>
<td>
<th:block th:each="code:${session.commonCode.get('OG')}">
<th:block th:if="${code.itemCd eq career.wrtOrgan}">
<th:block th:text="${code.itemValue}"></th:block>
</th:block>
</th:block>
<th:block th:each="code:${session.commonCode.get('OFC')}">
<th:block th:if="${code.itemCd eq career.workPart}">
<th:block th:text="${code.itemValue}"></th:block>
</th:block>
</th:block>
<th:block th:text="${career.wrtUserNm}"></th:block>
</td>
<td th:text="${#temporals.format(career.wrtDt, 'yyyy-MM-dd HH:mm:ss')}"></td>
<td>
<button type="button" class="btn btn-sm btn-outline-danger deleteCareerBtn"
th:data-careerseq="${career.careerSeq}" th:data-tab="${code.itemCd}">
<i class="bi bi-trash"></i>
</button>
</td>
</tr>
</th:block>
</th:block>
</tbody>
<tfoot>
<tr>
<td colspan="9">
<td colspan="11">
<div class="row justify-content-center">
<div class="col-auto">
<button type="button" class="btn btn-sm btn-primary careerAddBtn" th:data-careercd="${code.itemCd}">추가</button>

View File

@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<div class="modal-header">
<h5 class="modal-title">인사시스템 경력정보</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="card">
<div class="card-body text-center">
<table class="table table-hover">
<thead>
<tr>
<th>경력구분</th>
<th>임용구분</th>
<th>근무지</th>
<th>직급</th>
<th>시작일</th>
<th>종료일</th>
<th>일수</th>
<th>개월수</th>
</tr>
</thead>
<tbody>
<tr class="kwmsCareerTr" th:each="career:${careerList}">
<input type="hidden" class="designationCd" th:value="${career.designationCd}">
<input type="hidden" class="workPositionStr" th:value="${career.workPositionStr}">
<input type="hidden" class="workTitle" th:value="${career.workTitle}">
<input type="hidden" class="startDate" th:value="${career.startDate}">
<input type="hidden" class="endDate" th:value="${career.endDate}">
<input type="hidden" class="workDay" th:value="${career.workDay}">
<input type="hidden" class="workMonth" th:value="${career.workMonth}">
<input type="hidden" class="hordCd" th:value="${career.hordCd}">
<td>
<select class="form-select form-select-sm careerSelector">
<option value="">선택</option>
<th:block th:each="code:${crcList}">
<option th:value="${code.itemCd}" th:text="${code.itemValue}"></option>
</th:block>
</select>
</td>
<td>
<th:block th:each="code:${session.commonCode.get('DSN')}">
<th:block th:if="${code.itemCd eq career.designationCd}" th:text="${code.itemValue}"></th:block>
</th:block>
</td>
<td th:text="${career.workPositionStr}"></td>
<th:block th:each="code:${session.commonCode.get('JT')}">
<th:block th:if="${code.itemCd eq career.workTitle}">
<td th:text="${code.itemValue}"></td>
</th:block>
</th:block>
<td th:text="${#temporals.format(career.startDate, 'yyyy-MM-dd')}"></td>
<td th:text="${#temporals.format(career.endDate, 'yyyy-MM-dd')}"></td>
<td th:text="${career.workDay}"></td>
<td th:text="${career.workMonth}"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="modal-footer justify-content-between">
<button type="button" class="btn btn-primary" id="kwmsModalSelectBtn">선택</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
</div>
</html>