diff --git a/src/main/java/com/dbnt/faisp/config/SecurityConfig.java b/src/main/java/com/dbnt/faisp/config/SecurityConfig.java index ebb09b1f..c281ee13 100644 --- a/src/main/java/com/dbnt/faisp/config/SecurityConfig.java +++ b/src/main/java/com/dbnt/faisp/config/SecurityConfig.java @@ -87,7 +87,8 @@ public class SecurityConfig{ "/affair/**", "/affairResult/**", "/faStatistics/**", - "/translator/**" + "/translator/**", + "/faisp/**" ).hasRole(Role.USER.name()) // USER 접근 허용 .antMatchers( "/authMgt/**", diff --git a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/FishingBoatController.java b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/FishingBoatController.java index 7ede4a0e..71c431d6 100644 --- a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/FishingBoatController.java +++ b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/FishingBoatController.java @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import java.time.LocalDateTime; +import java.util.List; @RestController @RequiredArgsConstructor @@ -27,28 +28,20 @@ public class FishingBoatController { private final CodeMgtService codeMgtService; @RequestMapping("/fishingBoat") - public ModelAndView fishingBoat(@AuthenticationPrincipal UserInfo loginUser, FishingBoat fishingBoat) { + public ModelAndView fishingBoat(@AuthenticationPrincipal UserInfo loginUser, CrackdownStatus crackdownStatus) { ModelAndView mav = new ModelAndView("faStatistics/fishingBoat/fishingBoatMgt"); //메뉴권한 확인 String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faStatistics/fishingBoat").get(0).getAccessAuth(); - mav.addObject("accessAuth", accessAuth); - fishingBoat.setQueryInfo(); - /*List processResultList = processResultService.selectProcessResultList(fishingBoat); + crackdownStatus.setQueryInfo(); + List crackdownStatusList = fishingBoatService.selectCrackdownStatusList(crackdownStatus); - for (ProcessResult pr:processResultList) { - pr.setCrackdownStatus(crackdownStatusRepository.findByCdsKey(pr.getCdsKey())); - pr.setFishingBoat(fishingBoatRepository.findByCdsKey(pr.getCdsKey())); - pr.setViolationList(violationRepository.findByFbKey(pr.getFishingBoat().getFbKey())); - } - - mav.addObject("processResultList", processResultList); - fishingBoat.setContentCnt(processResultService.selectProcessResultListCnt(fishingBoat)); - */ - fishingBoat.setPaginationInfo(); - mav.addObject("searchParams", fishingBoat); + mav.addObject("crackdownStatusList", crackdownStatusList); + crackdownStatus.setContentCnt(fishingBoatService.selectCrackdownStatusListCnt(crackdownStatus)); + crackdownStatus.setPaginationInfo(); + mav.addObject("searchParams", crackdownStatus); return mav; } diff --git a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/repository/ViolationVersionRepository.java b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/repository/ViolationVersionRepository.java index 1b4bf710..1aa4e47c 100644 --- a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/repository/ViolationVersionRepository.java +++ b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/repository/ViolationVersionRepository.java @@ -3,6 +3,8 @@ package com.dbnt.faisp.main.faStatistics.crackdownsStatus.repository; import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.fishingBoat.ViolationVersion; import org.springframework.data.jpa.repository.JpaRepository; -public interface ViolationVersionRepository extends JpaRepository { +import java.util.Optional; +public interface ViolationVersionRepository extends JpaRepository { + Optional findTop1ByFbKeyOrderByVersionNoDesc(Integer fbKey); } diff --git a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/service/FishingBoatService.java b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/service/FishingBoatService.java index 00de7965..fac341bc 100644 --- a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/service/FishingBoatService.java +++ b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/service/FishingBoatService.java @@ -8,15 +8,18 @@ import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.crackdownStatus.C import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.fishingBoat.FishingBoat; import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.fishingBoat.FishingBoatVersion; import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.fishingBoat.Violation; +import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.fishingBoat.ViolationVersion; import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.processResult.ProcessResult; +import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.processResult.ProcessResultVersion; import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.sailor.Sailor; +import com.dbnt.faisp.main.faStatistics.crackdownsStatus.model.sailor.SailorVersion; import com.dbnt.faisp.main.faStatistics.crackdownsStatus.repository.*; -import com.fasterxml.jackson.databind.util.BeanUtil; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; @Service @@ -31,8 +34,16 @@ public class FishingBoatService extends BaseService { private final ViolationRepository violationRepository; private final ViolationVersionRepository violationVersionRepository; private final ProcessResultRepository processResultRepository; + private final ProcessResultVersionRepository processResultVersionRepository; private final SailorRepository sailorRepository; + private final SailorVersionRepository sailorVersionRepository; + public List selectCrackdownStatusList(CrackdownStatus crackdownStatus){ + return crackdownStatusMapper.selectCrackdownStatusList(crackdownStatus); + } + public Integer selectCrackdownStatusListCnt(CrackdownStatus crackdownStatus){ + return crackdownStatusMapper.selectCrackdownStatusListCnt(crackdownStatus); + } public CrackdownStatus selectCrackdownStatus(Integer cdsKey) { CrackdownStatus crackdownStatus = crackdownStatusRepository.findById(cdsKey).orElse(null); crackdownStatus.setFishingBoat(fishingBoatRepository.findByCdsKey(cdsKey).orElse(new FishingBoat())); @@ -52,10 +63,13 @@ public class FishingBoatService extends BaseService { Integer cdsKey, fbKey; if (crackdownStatus.getCdsKey()==null || crackdownStatus.getCdsKey().equals(0)){ // 최초 등록시 단속현황, 처리현황, 선원정보를 같이 등록. + // 단속현황, 단속현황버전 저장. cdsKey = crackdownStatusRepository.save(crackdownStatus).getCdsKey(); CrackdownStatusVersion crackdownStatusVersion = new CrackdownStatusVersion(); BeanUtils.copyProperties(crackdownStatus, crackdownStatusVersion); + crackdownStatusVersion.setVersionNo(1); crackdownStatusVersionRepository.save(crackdownStatusVersion); + // 어선정보, 어선정보버전 저장. FishingBoat fishingBoat = crackdownStatus.getFishingBoat(); fishingBoat.setCdsKey(cdsKey); fbKey = fishingBoatRepository.save(fishingBoat).getFbKey(); @@ -63,28 +77,69 @@ public class FishingBoatService extends BaseService { BeanUtils.copyProperties(fishingBoat, fishingBoatVersion); fishingBoatVersion.setVersionNo(1); fishingBoatVersionRepository.save(fishingBoatVersion); + // 위반사항, 위반사항버전 저장. List violationList = crackdownStatus.getViolationList(); + List violationVersionList = new ArrayList<>(); int i = 1; for(Violation violation: violationList){ violation.setViolationKey(i++); violation.setFbKey(fbKey); + + ViolationVersion violationVersion = new ViolationVersion(); + BeanUtils.copyProperties(violation, violationVersion); + violationVersion.setVersionNo(1); + violationVersionList.add(violationVersion); } violationRepository.saveAll(violationList); + violationVersionRepository.saveAll(violationVersionList); + // 처리현황, 처리현황버전 저장. + ProcessResult processResult = crackdownStatus.getProcessResult(); + ProcessResultVersion processResultVersion = new ProcessResultVersion(); + processResult.setCdsKey(cdsKey); + BeanUtils.copyProperties(processResult, processResultVersion); + processResultVersion.setVersionNo(1); + Integer prKey = processResultRepository.save(processResult).getPrKey(); + processResultVersion.setPrKey(prKey); + processResultVersionRepository.save(processResultVersion); + // 선원정보, 선원정보버전 저장. List sailorList = crackdownStatus.getSailorList(); + List sailorVersionList = new ArrayList<>(); i = 1; for(Sailor sailor: sailorList){ sailor.setSailorKey(i++); sailor.setFbKey(fbKey); + + SailorVersion sailorVersion = new SailorVersion(); + BeanUtils.copyProperties(sailor, sailorVersion); + sailorVersion.setVersionNo(1); + sailorVersionList.add(sailorVersion); } sailorRepository.saveAll(sailorList); + sailorVersionRepository.saveAll(sailorVersionList); }else{ // 업데이트시에는 어선정보만 수정. cdsKey = crackdownStatus.getCdsKey(); - FishingBoatVersion lastVersion = fishingBoatVersionRepository.findTop1ByFbKeyOrderByVersionNoDesc(crackdownStatus.getFishingBoat().getFbKey()).orElse(null); - int versionNo = lastVersion.getVersionNo(); + FishingBoat fishingBoat = crackdownStatus.getFishingBoat(); FishingBoatVersion newInfo = new FishingBoatVersion(); - - fbKey = fishingBoatRepository.save(crackdownStatus.getFishingBoat()).getFbKey(); + BeanUtils.copyProperties(fishingBoat, newInfo); + FishingBoatVersion lastFishingBoatVersion = fishingBoatVersionRepository.findTop1ByFbKeyOrderByVersionNoDesc(crackdownStatus.getFishingBoat().getFbKey()).orElse(null); + newInfo.setVersionNo(lastFishingBoatVersion.getVersionNo()+1); + fishingBoatRepository.save(fishingBoat); + fishingBoatVersionRepository.save(newInfo); + // 위반사항 + List violationList = crackdownStatus.getViolationList(); + List violationVersionList = new ArrayList<>(); + int i=1; + ViolationVersion lastViolationVersion = violationVersionRepository.findTop1ByFbKeyOrderByVersionNoDesc(fishingBoat.getFbKey()).orElse(null); + for(Violation violation: violationList){ + violation.setViolationKey(i); + ViolationVersion violationVersion = new ViolationVersion(); + BeanUtils.copyProperties(violation, violationVersion); + violationVersion.setVersionNo(lastViolationVersion.getVersionNo()+1); + violationVersionList.add(violationVersion); + } + violationRepository.saveAll(violationList); + violationVersionRepository.saveAll(violationVersionList); } return cdsKey; } diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/FaispController.java b/src/main/java/com/dbnt/faisp/main/userInfo/FaispController.java index deb8c24c..a29d4fc8 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/FaispController.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/FaispController.java @@ -1,13 +1,21 @@ package com.dbnt.faisp.main.userInfo; +import com.dbnt.faisp.kwms.service.KwmsService; import com.dbnt.faisp.main.authMgt.service.AuthMgtService; import com.dbnt.faisp.main.codeMgt.service.CodeMgtService; +import com.dbnt.faisp.main.fipTarget.model.PartInfo; +import com.dbnt.faisp.main.fipTarget.model.ShipInfo; import com.dbnt.faisp.main.userInfo.model.UserInfo; +import com.dbnt.faisp.main.userInfo.model.UserInfoHistory; import com.dbnt.faisp.main.userInfo.service.UserInfoService; +import com.dbnt.faisp.util.ParamMap; +import com.dbnt.faisp.util.Utils; import lombok.RequiredArgsConstructor; +import java.io.IOException; +import java.util.List; import javax.servlet.http.HttpServletResponse; @@ -23,15 +31,44 @@ public class FaispController { private final AuthMgtService authMgtService; private final CodeMgtService codeMgtService; private final UserInfoService userInfoService; + private final KwmsService kwmsService; @GetMapping("/policeList") - public ModelAndView partInfoList(@AuthenticationPrincipal UserInfo loginUser,UserInfo userInfo, HttpServletResponse response) { + public ModelAndView policeList(@AuthenticationPrincipal UserInfo loginUser,UserInfo userInfo, HttpServletResponse response) { ModelAndView mav = new ModelAndView("faisp/policeList"); userInfo.setDownOrganCdList(loginUser.getDownOrganCdList()); if(userInfo.getUserStatus() == null) { userInfo.setUserStatus("USC003"); } + //엑셀다운 + if(userInfo.getExcel() != null && userInfo.getExcel().equals("Y")){ + String[] headers = { "rownum", "title_cd", "user_nm", "organ_nm", "ofc_cd", "birth_date", "sex", "police_in_date", "title_in_date", "ofc_in_date", "outturn_cd","", "job_in_cd", "wrt_dt"}; + String[] headerNames = { "순번", "계급","성명", "청", "현부서"+System.lineSeparator()+"과", "생년월일","성별", "최초"+System.lineSeparator()+"임용", "현 계급"+System.lineSeparator()+"임용", "현 부서"+System.lineSeparator()+"임용", "수사경과"+System.lineSeparator()+"보유여부", "외사경력", "입직"+System.lineSeparator()+"경로","최종"+System.lineSeparator()+"수정일"}; + String[] columnType = {"String", "String", "String","String", "String", "String", "String", "String", "String", "String", "String", "String","String", "String"}; + String sheetName =""; + String excelFileName=""; + if(userInfo.getUserStatus().equals("USC003")) { + sheetName = "現 외사경찰 현황"; + excelFileName = "現 외사경찰 현황"; + } + if(userInfo.getUserStatus().equals("USC006")) { + sheetName = "前 외사경찰 현황"; + excelFileName = "前 외사경찰 현황"; + } + if(userInfo.getUserStatus().equals("USC007")) { + sheetName = "非 외사경찰 현황"; + excelFileName = "非 외사경찰 현황"; + } + List policeList= userInfoService.selectPoliceList(userInfo); + + try { + Utils.policelistToExcel(policeList, response, headers, headerNames, columnType, sheetName, excelFileName); + } catch (IOException e) { + + } + return null; + } //메뉴권한 확인 String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faisp/policeList").get(0).getAccessAuth(); @@ -41,13 +78,13 @@ public class FaispController { userInfo.setContentCnt(userInfoService.selectPoliceListCnt(userInfo)); userInfo.setPaginationInfo(); mav.addObject("mgtOrganList", loginUser.getDownOrganCdList()); - mav.addObject("userSatus", userInfo.getUserStatus()); + mav.addObject("userStatus", userInfo.getUserStatus()); mav.addObject("searchParams", userInfo); return mav; } @GetMapping("/policeEditModal") - public ModelAndView menuEditModal(UserInfo userInfo){ + public ModelAndView policeEditModal(@AuthenticationPrincipal UserInfo loginUser,UserInfo userInfo){ ModelAndView mav = new ModelAndView("/faisp/policeEditModal"); mav.addObject("ogList", codeMgtService.selectCodeMgtList("OG")); mav.addObject("ofcList", codeMgtService.selectCodeMgtList("OFC")); @@ -56,10 +93,57 @@ public class FaispController { mav.addObject("seriesList", codeMgtService.selectCodeMgtList("SRC")); mav.addObject("languageList", codeMgtService.selectCodeMgtList("LNG")); mav.addObject("statusList", codeMgtService.selectCodeMgtList("USC")); - + + //메뉴권한 확인 + String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/faisp/policeList").get(0).getAccessAuth(); + mav.addObject("accessAuth", accessAuth); mav.addObject("userInfo", userInfoService.selectUserInfo(userInfo.getUserSeq())); return mav; } + + @PostMapping("/updateUserInfo") + public int updateUserInfo(@AuthenticationPrincipal UserInfo loginUser,UserInfo userInfo) { + userInfoService.updateUserInfo(loginUser,userInfo); + return userInfo.getUserSeq(); + } + + @GetMapping("/policeHistory") + public ModelAndView policeHistory(@AuthenticationPrincipal UserInfo loginUser,UserInfoHistory userInfoHistory){ + ModelAndView mav = new ModelAndView("/faisp/policeHistory"); + mav.addObject("userStatus", userInfoService.selectuserStatus(userInfoHistory)); + mav.addObject("policeList", userInfoService.selectPoliceHisList(userInfoHistory)); + + return mav; + } + + @GetMapping("/policeHistoryView") + @ResponseBody + public UserInfoHistory policeHistoryView(UserInfoHistory userInfoHistory){ + return userInfoService.selectpoliceHistoryView(userInfoHistory); + } + + @PostMapping("/policeStatusUpdate") + @ResponseBody + public int userCompanion(@RequestBody List userInfo){ + return userInfoService.updateUserCompanion(userInfo); + } + + @PostMapping("/syncUserInfoToKwms") + @ResponseBody + public String syncUserInfoToKwms(@AuthenticationPrincipal UserInfo loginUser,@RequestBody List infoList){ + for(UserInfo info: infoList){ + UserInfo kwmsInfo = kwmsService.selectEmpInfo(info.getDicCode()); + if(kwmsInfo!=null){ + kwmsInfo.setUserSeq(info.getUserSeq()); + userInfoService.updateUserInfo(loginUser,kwmsInfo); + } + } + if(infoList.size()==1){ + return infoList.get(0).getUserSeq().toString(); + }else{ + return ""; + } + } } diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/MyInfoController.java b/src/main/java/com/dbnt/faisp/main/userInfo/MyInfoController.java index 2004d506..2ec0f9ea 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/MyInfoController.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/MyInfoController.java @@ -59,7 +59,7 @@ public class MyInfoController { @PostMapping("/updateSelf") public void updateSelf(@AuthenticationPrincipal UserInfo loginUser, UserInfo userInfo) { userInfo.setUserSeq(loginUser.getUserSeq()); - userInfoService.updateUserInfo(userInfo); + userInfoService.updateUserInfo(loginUser,userInfo); } @PostMapping("/syncSelfToKwms") @@ -67,7 +67,7 @@ public class MyInfoController { UserInfo kwmsInfo = kwmsService.selectEmpInfo(userInfo.getDicCode()); if(kwmsInfo!= null){ kwmsInfo.setUserSeq(loginUser.getUserSeq()); - userInfoService.updateUserInfo(kwmsInfo); + userInfoService.updateUserInfo(loginUser,kwmsInfo); } } } diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/mapper/UserInfoMapper.java b/src/main/java/com/dbnt/faisp/main/userInfo/mapper/UserInfoMapper.java index 5ccda58a..68964630 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/mapper/UserInfoMapper.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/mapper/UserInfoMapper.java @@ -2,6 +2,7 @@ package com.dbnt.faisp.main.userInfo.mapper; 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.util.ParamMap; import org.apache.ibatis.annotations.Mapper; @@ -21,4 +22,8 @@ public interface UserInfoMapper { List selectPoliceList(UserInfo userInfo); Integer selectPoliceListCnt(UserInfo userInfo); + + List selectPoliceHisList(UserInfoHistory userInfoHistory); + + UserInfoHistory selectpoliceHistoryView(UserInfoHistory userInfoHistory); } diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/model/UserInfo.java b/src/main/java/com/dbnt/faisp/main/userInfo/model/UserInfo.java index 22747808..55d9ca5d 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/model/UserInfo.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/model/UserInfo.java @@ -106,6 +106,12 @@ public class UserInfo extends BaseModel implements UserDetails{ private String positionName; @Transient private String departmentName; + @Transient + private String organNm; + @Transient + private String excel; + @Transient + private String rownum; @Transient private List accessConfigList; diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/repository/UserInfoHistoryRepository.java b/src/main/java/com/dbnt/faisp/main/userInfo/repository/UserInfoHistoryRepository.java index f8e9e699..8d77b484 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/repository/UserInfoHistoryRepository.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/repository/UserInfoHistoryRepository.java @@ -11,5 +11,7 @@ public interface UserInfoHistoryRepository extends JpaRepository { Optional findByUserSeq(Integer userSeq); Optional findByDicCode(String dicCode); + + @Query(value = "SELECT user_status FROM user_info WHERE user_seq=:userSeq", nativeQuery = true) + String getUserStatus(@Param("userSeq") Integer userSeq); } diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/service/UserInfoService.java b/src/main/java/com/dbnt/faisp/main/userInfo/service/UserInfoService.java index 1f8769d9..0d51b28d 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/service/UserInfoService.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/service/UserInfoService.java @@ -2,6 +2,7 @@ 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.UserInfo; @@ -12,6 +13,8 @@ import com.dbnt.faisp.main.userInfo.repository.UserInfoRepository; import com.dbnt.faisp.util.ParamMap; import lombok.RequiredArgsConstructor; + +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -82,7 +85,7 @@ public class UserInfoService implements UserDetailsService { return result.getUserId(); } @Transactional - public void updateUserInfo(UserInfo userInfo){ + public void updateUserInfo(UserInfo loginUser,UserInfo userInfo){ UserInfo savedInfo = userInfoRepository.findById(userInfo.getUserSeq()).orElse(null); if(savedInfo!=null){ if(userInfo.getDicCode()!=null){ @@ -145,6 +148,45 @@ public class UserInfoService implements UserDetailsService { if(userInfo.getUserStatus()!=null){ savedInfo.setUserStatus(userInfo.getUserStatus()); } + userInfoRepository.save(savedInfo); + UserInfoHistory dbHis = userInfoHistoryRepository.findTopByUserSeqOrderByVersionNoDesc(savedInfo.getUserSeq()); + if(dbHis != null) { + UserInfoHistory hisTmp = new UserInfoHistory(); + hisTmp.setUserSeq(savedInfo.getUserSeq()); + hisTmp.setVersionNo(dbHis.getVersionNo()+1); + hisTmp.setDicCode(savedInfo.getDicCode()); + hisTmp.setUserId(savedInfo.getUserId()); + hisTmp.setUserNm(savedInfo.getUserNm()); + hisTmp.setBirthDate(savedInfo.getBirthDate()); + hisTmp.setSex(savedInfo.getSex()); + hisTmp.setEmail(savedInfo.getEmail()); + hisTmp.setPhoneNo(savedInfo.getPhoneNo()); + hisTmp.setAreaCd(savedInfo.getAreaCd()); + hisTmp.setOgCd(savedInfo.getOgCd()); + hisTmp.setOfcCd(savedInfo.getOfcCd()); + hisTmp.setTitleCd(savedInfo.getTitleCd()); + hisTmp.setGroupCd(savedInfo.getGroupCd()); + hisTmp.setSeriesCd(savedInfo.getSeriesCd()); + hisTmp.setOfcHeadYn(savedInfo.getOfcHeadYn()); + hisTmp.setHiringCd(savedInfo.getHiringCd()); + hisTmp.setEmployCd(savedInfo.getEmployCd()); + hisTmp.setOutturnCd(savedInfo.getOutturnCd()); + hisTmp.setWorkCd(savedInfo.getWorkCd()); + hisTmp.setJobInCd(savedInfo.getJobInCd()); + hisTmp.setLanguageCd(savedInfo.getLanguageCd()); + hisTmp.setPoliceInDate(savedInfo.getPoliceInDate()); + hisTmp.setOrganInDate(savedInfo.getOrganInDate()); + hisTmp.setOfcInDate(savedInfo.getOfcInDate()); + hisTmp.setTitleInDate(savedInfo.getTitleInDate()); + hisTmp.setUserStatus(savedInfo.getUserStatus()); + hisTmp.setWrtOrgan(loginUser.getOgCd()); + hisTmp.setWrtPart(loginUser.getOfcCd()); + hisTmp.setWrtTitle(loginUser.getTitleCd()); + hisTmp.setWrtUserSeq(loginUser.getUserSeq()); + hisTmp.setWrtNm(loginUser.getUserNm()); + hisTmp.setWrtDt(LocalDateTime.now()); + userInfoHistoryRepository.save(hisTmp); + } } } @@ -238,4 +280,15 @@ public class UserInfoService implements UserDetailsService { public Integer selectPoliceListCnt(UserInfo userInfo) { return userInfoMapper.selectPoliceListCnt(userInfo); } + + public List selectPoliceHisList(UserInfoHistory userInfoHistory) { + return userInfoMapper.selectPoliceHisList(userInfoHistory); + } + + public UserInfoHistory selectpoliceHistoryView(UserInfoHistory userInfoHistory) { + return userInfoMapper.selectpoliceHistoryView(userInfoHistory); + } + public String selectuserStatus(UserInfoHistory userInfoHistory) { + return userInfoRepository.getUserStatus(userInfoHistory.getUserSeq()); + } } diff --git a/src/main/java/com/dbnt/faisp/main/userInfo/userMgtController.java b/src/main/java/com/dbnt/faisp/main/userInfo/userMgtController.java index 1a5143a7..a87c736c 100644 --- a/src/main/java/com/dbnt/faisp/main/userInfo/userMgtController.java +++ b/src/main/java/com/dbnt/faisp/main/userInfo/userMgtController.java @@ -8,6 +8,7 @@ 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; @@ -63,8 +64,8 @@ public class userMgtController { } @PostMapping("/updateUserInfo") - public void updateUserInfo(UserInfo userInfo) { - userInfoService.updateUserInfo(userInfo); + public void updateUserInfo(@AuthenticationPrincipal UserInfo loginUser,UserInfo userInfo) { + userInfoService.updateUserInfo(loginUser,userInfo); } @PostMapping("/userDelete") @@ -76,12 +77,12 @@ public class userMgtController { @PostMapping("/syncUserInfoToKwms") @ResponseBody - public String syncUserInfoToKwms(@RequestBody List infoList){ + public String syncUserInfoToKwms(@AuthenticationPrincipal UserInfo loginUser,@RequestBody List infoList){ for(UserInfo info: infoList){ UserInfo kwmsInfo = kwmsService.selectEmpInfo(info.getDicCode()); if(kwmsInfo!=null){ kwmsInfo.setUserSeq(info.getUserSeq()); - userInfoService.updateUserInfo(kwmsInfo); + userInfoService.updateUserInfo(loginUser,kwmsInfo); } } if(infoList.size()==1){ diff --git a/src/main/java/com/dbnt/faisp/util/Utils.java b/src/main/java/com/dbnt/faisp/util/Utils.java index 9851cae1..bbfb569f 100644 --- a/src/main/java/com/dbnt/faisp/util/Utils.java +++ b/src/main/java/com/dbnt/faisp/util/Utils.java @@ -28,6 +28,8 @@ import com.dbnt.faisp.main.equip.model.CellPhone; import com.dbnt.faisp.main.equip.model.UseList; import com.dbnt.faisp.main.fipTarget.model.PartInfo; import com.dbnt.faisp.main.fipTarget.model.PartWork; +import com.dbnt.faisp.main.userInfo.model.UserInfo; + import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; @@ -974,5 +976,98 @@ public class Utils { return emptyNames.toArray(result); } + public static void policelistToExcel(List policeList, HttpServletResponse response, String[] headers, + String[] headerNames, String[] columnType, String sheetName, String excelFileName) throws IOException { + if(Utils.isNotEmpty(policeList)) { + // 메모리에 100개의 행을 유지합니다. 행의 수가 넘으면 디스크에 적습니다. + XSSFWorkbook wb = new XSSFWorkbook(); + Sheet sheet = wb.createSheet(sheetName); + Row headerRow = sheet.createRow(0); + CellStyle cellStyle1 = wb.createCellStyle(); //쉼표들어간 숫자 양식 + CellStyle cellStyle2 = wb.createCellStyle(); //숫자양식 + CellStyle headerStyle3 = wb.createCellStyle(); + + XSSFDataFormat format = wb.createDataFormat(); + cellStyle1.setAlignment(HorizontalAlignment.CENTER); + cellStyle2.setDataFormat(format.getFormat("#,##0")); + cellStyle2.setAlignment(HorizontalAlignment.CENTER); + headerStyle3.setBorderTop(BorderStyle.THIN); + headerStyle3.setBorderBottom(BorderStyle.THIN); + headerStyle3.setBorderLeft(BorderStyle.THIN); + headerStyle3.setBorderRight(BorderStyle.THIN); + headerStyle3.setAlignment(HorizontalAlignment.CENTER); + headerStyle3.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headerStyle3.setFillForegroundColor((short)3); + headerStyle3.setFillForegroundColor(IndexedColors.LIME.getIndex()); + headerStyle3.setWrapText(true); + //로우그리기 + for(int i=0; i #{item} + + and og_cd = #{ogCd} + + + and sex = #{sex} + + + and user_nm like '%'||#{userNm}||'%' + + + + + \ No newline at end of file diff --git a/src/main/resources/static/js/common.js b/src/main/resources/static/js/common.js index 023b650d..c1e9c83e 100644 --- a/src/main/resources/static/js/common.js +++ b/src/main/resources/static/js/common.js @@ -205,9 +205,26 @@ function departmentDynamicOption(targetTagName, code, defaultOptionName='') { $(targetTagName).empty(); let option = ''; organConfigList.forEach(function (organConfig) { - if (organConfig.parentOrgan != null && organConfig.organType != 'OGC002' && organConfig.parentOrgan == code) { + if (organConfig.parentOrgan != null && organConfig.organType !== 'OGC002' && organConfig.parentOrgan === code) { option += ''; } }); $(targetTagName).append('' + option); +} + +function dateTimeCalc(startDateTime, endDateTime) { + if (startDateTime !== '' &&endDateTime !== '' && startDateTime !== undefined && endDateTime !== undefined) { + const startDate = new Date(startDateTime); + const endDate = new Date(endDateTime); + + let diffTime = endDate.getTime() - startDate.getTime(); + + const day = Math.floor(diffTime / (1000* 60 * 60 * 24)); + const hour = Math.floor((diffTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + const minute = Math.floor((diffTime % (1000 * 60 * 60)) / (1000 * 60)); + + return day + '일' + hour + '시간' + minute + '분'; + } + + return null; } \ No newline at end of file diff --git a/src/main/resources/static/js/faStatistics/crackdownStatus.js b/src/main/resources/static/js/faStatistics/crackdownStatus.js index 8e1ad386..4cda6685 100644 --- a/src/main/resources/static/js/faStatistics/crackdownStatus.js +++ b/src/main/resources/static/js/faStatistics/crackdownStatus.js @@ -504,20 +504,3 @@ function getToday() { var date = new Date(); var year = date.getFullYear(); } - -function dateTimeCalc(startDateTime, endDateTime) { - if (startDateTime != '' &&endDateTime != '' && startDateTime != undefined && endDateTime != undefined) { - const startDate = new Date(startDateTime); - const endDate = new Date(endDateTime); - - let diffTime = endDate.getTime() - startDate.getTime(); - - const day = Math.floor(diffTime / (1000* 60 * 60 * 24)); - const hour = Math.floor((diffTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); - const minute = Math.floor((diffTime % (1000 * 60 * 60)) / (1000 * 60)); - - return day + '일' + hour + '시간' + minute + '분'; - } - - return null; -} diff --git a/src/main/resources/static/js/faStatistics/fishingBoatMgt.js b/src/main/resources/static/js/faStatistics/fishingBoatMgt.js index fd5b2070..ff08edf9 100644 --- a/src/main/resources/static/js/faStatistics/fishingBoatMgt.js +++ b/src/main/resources/static/js/faStatistics/fishingBoatMgt.js @@ -125,11 +125,12 @@ function getFishingBoatEditModal(cdsKey){ }); $(".dateTimeSelector").datetimepicker({ format:'Y-m-d H:i', - lang:'kr' + lang:'kr', + step:20 }); $(".timeSelector").datetimepicker({ datepicker:false, - format:'H:i', + format:'H시간i분', lang:'kr', step:20 }); @@ -231,7 +232,7 @@ function saveFishingBoatInfo(saveYn){ success : function() { alert("저장되었습니다."); contentFade("out"); - // location.reload(); + location.reload(); }, error : function(xhr, status) { alert("저장에 실패하였습니다."); diff --git a/src/main/resources/static/js/faisp/police.js b/src/main/resources/static/js/faisp/police.js index 6814a8fb..c81a3ba9 100644 --- a/src/main/resources/static/js/faisp/police.js +++ b/src/main/resources/static/js/faisp/police.js @@ -1,7 +1,9 @@ -$(document).on('click', '.policeTr', function (){ - const userSeq = (Number($(this).find(".userSeq").val())); - console.log(userSeq); - showModal(userSeq); +$(document).on('click', '.policeTr', function (event){ + const target = event.target; + if(!(target.className === "checkBoxTd" ||$(target).parents("td").length>0)){ + const userSeq = (Number($(this).find(".userSeq").val())); + showModal(userSeq); + } }); function showModal(userSeq){ @@ -10,6 +12,84 @@ function showModal(userSeq){ data: {userSeq: userSeq}, type: 'GET', dataType:"html", + success: function(html){ + $("#policeEditModalContent").empty().append(html); + $(".dateSelector").datepicker({ + format: "yyyy-mm-dd", + language: "ko", + autoclose: true + }); + $("#policeEditModal").modal('show'); + }, + error:function(){ + + } + }); +} + +$(document).on('click', '#syncToKwmsBtn', function (){ + const dicCode = $("#dicCode").val(); + if(!dicCode){ + alert("공무원식별번호가 없습니다.") + }else{ + syncUserInfoToKwms([{ + userSeq: $("#userSeq").val(), + dicCode: dicCode + }]); + } +}) + +function syncUserInfoToKwms(userList){ + $.ajax({ + type : 'POST', + url : "/faisp/syncUserInfoToKwms", + data : JSON.stringify(userList), + contentType: 'application/json', + beforeSend: function (xhr){ + xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val()); + }, + success : function(data) { + if(userList.length===1){ + showModal(userList[0].userSeq); + } + alert("갱신 되었습니다."); + }, + error : function(xhr, status) { + alert("갱신에 실패하였습니다"); + } + }) +} + +$(document).on('click', '#updateBtn', function (){ + if(confirm("수정하시겠습니까?")){ + contentFade("in"); + const formData = new FormData($("#userInfoUpdate")[0]); + $.ajax({ + type : 'POST', + data : formData, + url : "/faisp/updateUserInfo", + processData: false, + contentType: false, + success : function(data) { + alert("수정되었습니다."); + contentFade("out"); + showModal(data); + }, + error : function(xhr, status) { + alert("수정에 실패하였습니다."); + contentFade("out"); + } + }) + } +}) + +$(document).on('click', '#historyTab', function (){ + const userSeq = (Number($(this).data('userseq'))); + $.ajax({ + url: '/faisp/policeHistory', + data: {userSeq: userSeq}, + type: 'GET', + dataType:"html", success: function(html){ $("#policeEditModalContent").empty().append(html); $("#policeEditModal").modal('show'); @@ -18,5 +98,143 @@ function showModal(userSeq){ } }); -} +}) + +$(document).on('click', '#editTab', function (){ + const userSeq = (Number($(this).data('userseq'))); + showModal(userSeq); +}) + +$(document).on('click', '.historyInfoTr', function (){ + $(this).find('.hisChk').prop('checked',true) + if($(this).find('.hisChk').prop('checked')){ + $('.hisChk').prop('checked',false); + $(this).find('.hisChk').prop('checked',true) + } + $.ajax({ + url: '/faisp/policeHistoryView', + data: { + userSeq: Number($(this).find(".userSeq").val()), + versionNo : Number($(this).find(".verNo").val()) + }, + type: 'GET', + dataType:"json", + success: function(data){ + $('#vDicCode').val(data.dicCode); + $('#vUserId').val(data.userId); + $('#vUserNm').val(data.userNm); + $('#vPhone').val(data.phoneNo); + $('#vEmail').val(data.email); + $('#vSex').val(data.sex); + $('#vBirth').val(data.birthDate); + $('#vPoliceInDate').val(data.policeInDate); + $('#vOgCd').val(data.ogCd); + $('#vOrganInDate').val(data.organInDate); + $('#vOfcCd').val(data.ofcCd); + $('#vOfcInDate').val(data.ofcInDate); + $('#vTitleCd').val(data.titleCd); + $('#vTitleInDate').val(data.titleInDate); + $('#vOutturnCd').val(data.outturnCd); + $('#vSeriesCd').val(data.seriesCd); + $('#vLanguageCd').val(data.languageCd); + }, + error:function(){ + + } + }); +}) + +$(document).on('click', '#previousTab', function (){ + const userStatus = $(this).data('userstatus'); + location.href = "/faisp/policeList?userStatus="+userStatus; +}) + +$(document).on('click', '#presentTab', function (){ + const userStatus = $(this).data('userstatus'); + location.href = "/faisp/policeList?userStatus="+userStatus; +}) +$(document).on('click', '#notPoliceTab', function (){ + const userStatus = $(this).data('userstatus'); + location.href = "/faisp/policeList?userStatus="+userStatus; +}) + +$(document).on('click', '#outBtn', function (){ + if($('input:checkbox[name=policeChk]:checked').length < 1){ + alert("전출대상을 선택해주세요") + return false; + } + if(confirm("선택한 대상을 전출처리 하시겠습니까?")){ + const checkArr = []; + $('input:checkbox[name=policeChk]:checked').each(function (idx, el){ + checkArr.push({}); + const target = $(el); + checkArr[idx].userSeq = Number(target.parents('tr').find('.userSeq').val()); + checkArr[idx].userStatus = "USC006" + }) + $.ajax({ + type : 'POST', + url : "/faisp/policeStatusUpdate", + data : JSON.stringify(checkArr), + contentType: 'application/json', + beforeSend: function (xhr){ + xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val()); + }, + success : function(data) { + alert(data+"건이 전출 처리되었습니다."); + location.reload(); + }, + error : function(xhr, status) { + alert("전출처리에 실패하였습니다"); + } + }) + } +}) + +$(document).on('click', '#inBtn', function (){ + if($('input:checkbox[name=policeChk]:checked').length < 1){ + alert("전입대상을 선택해주세요") + return false; + } + if(confirm("선택한 대상을 전입처리 하시겠습니까?")){ + const checkArr = []; + $('input:checkbox[name=policeChk]:checked').each(function (idx, el){ + checkArr.push({}); + const target = $(el); + checkArr[idx].userSeq = Number(target.parents('tr').find('.userSeq').val()); + checkArr[idx].userStatus = "USC003" + }) + $.ajax({ + type : 'POST', + url : "/faisp/policeStatusUpdate", + data : JSON.stringify(checkArr), + contentType: 'application/json', + beforeSend: function (xhr){ + xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val()); + }, + success : function(data) { + alert(data+"건이 전입 처리되었습니다."); + location.reload(); + }, + error : function(xhr, status) { + alert("전입처리에 실패하였습니다"); + } + }) + } +}) + +$(document).ready( function() { + $('#chk-all').click( function() { + $('.policeCheckBox').prop('checked',this.checked); + }); +}); + +$(document).on('click', '#goExcel', function (){ + if(confirm("엑셀로 다운로드 하시겠습니까?")){ + $('input[name=excel]').val('Y'); + $('#searchFm').submit(); + $('input[name=excel]').val(''); + }else{ + false; + } +}) diff --git a/src/main/resources/static/js/fipTarget/shipInfo.js b/src/main/resources/static/js/fipTarget/shipInfo.js index 74db528d..38fc11ba 100644 --- a/src/main/resources/static/js/fipTarget/shipInfo.js +++ b/src/main/resources/static/js/fipTarget/shipInfo.js @@ -216,10 +216,9 @@ $(document).on('click', '.historyInfoTr', function (){ $('#hOwnerNm').val(data.ownerNm); $('#hShipNm').val(data.shipNm); $('#hShipWeight').val(data.shipWeight); - $('#hSusong').val('여객 : '+data.passengerCnt+'명'+'\n'+'화물 : '+data.freightCnt+'TEU') + $('#hSusong').val('여객 : '+data.passengerCnt+'명'+'\n'+'화물 : '+data.freightCnt+'TEU'); $('#hOperationCnt').val(data.operationCnt); $('#hCloseYn').val(data.closeYn); - console.log(data); }, error:function(){ diff --git a/src/main/resources/static/js/publicBoard/publicBoard.js b/src/main/resources/static/js/publicBoard/publicBoard.js index c1743607..6ca9145f 100644 --- a/src/main/resources/static/js/publicBoard/publicBoard.js +++ b/src/main/resources/static/js/publicBoard/publicBoard.js @@ -81,7 +81,7 @@ function getEditModal(publicKey, publicType){ dataType:"html", success: function(html){ $("#editContent").empty().append(html) - $("#content").summernote({ + /*$("#content").summernote({ lang:'ko-KR', height: 350, disableDragAndDrop: true, @@ -92,7 +92,7 @@ function getEditModal(publicKey, publicType){ ['para', ['ul', 'ol', 'paragraph']], ['table', ['table']] ] - }); + });*/ setUploadDiv(); $("#editModal").modal('show'); }, diff --git a/src/main/resources/static/js/userMgt/userMgt.js b/src/main/resources/static/js/userMgt/userMgt.js index 9d4cd8e9..d9061f8a 100644 --- a/src/main/resources/static/js/userMgt/userMgt.js +++ b/src/main/resources/static/js/userMgt/userMgt.js @@ -9,7 +9,7 @@ $(document).on('click', '#stayTab', function (){ $(document).on('click', '.userInfoTr', function (event){ if(!event.target.className.includes("heckBox")){ openEditModal($(this).find(".userSeq").val()) - } + } }) $(document).on('click', '#approvalBtn', function (){ @@ -25,6 +25,19 @@ $(document).on('click', '#approvalBtn', function (){ } }) +$(document).on('click', '#notPoliceBtn', function (){ + if(confirm("선택한 대상을 비외사경찰승인 처리 하시겠습니까?")){ + const checkArr = []; + $('input:checkbox[name=userChk]:checked').each(function (idx, el){ + checkArr.push({}); + const target = $(el); + checkArr[idx].userSeq = Number(target.parents('tr').find('.userSeq').val()); + checkArr[idx].userStatus = "USC007" + }) + userApproval(checkArr); + } +}) + $(document).on('click', '.statusBtn', function (){ const userInfoList = []; userInfoList.push({ diff --git a/src/main/resources/templates/adminPage/userMgt/userMgt.html b/src/main/resources/templates/adminPage/userMgt/userMgt.html index e8631015..177aaa63 100644 --- a/src/main/resources/templates/adminPage/userMgt/userMgt.html +++ b/src/main/resources/templates/adminPage/userMgt/userMgt.html @@ -134,8 +134,7 @@
- - + @@ -166,7 +165,12 @@
-
+
+ + + + +
diff --git a/src/main/resources/templates/equip/equipHistory.html b/src/main/resources/templates/equip/equipHistory.html index ef5cda96..be642b01 100644 --- a/src/main/resources/templates/equip/equipHistory.html +++ b/src/main/resources/templates/equip/equipHistory.html @@ -6,6 +6,7 @@ + +
-
-
+
+
@@ -376,8 +378,6 @@
- -
diff --git a/src/main/resources/templates/faStatistics/fishingBoat/fishingBoatMgt.html b/src/main/resources/templates/faStatistics/fishingBoat/fishingBoatMgt.html index d0b4f2a5..5517b947 100644 --- a/src/main/resources/templates/faStatistics/fishingBoat/fishingBoatMgt.html +++ b/src/main/resources/templates/faStatistics/fishingBoat/fishingBoatMgt.html @@ -125,7 +125,7 @@ 나포일시 나포해점 - 사건담당
경찰서 + 사건담당기관 단속경찰서 단속함정 선명 diff --git a/src/main/resources/templates/faisp/policeEditModal.html b/src/main/resources/templates/faisp/policeEditModal.html index 5ad5c529..72cf769b 100644 --- a/src/main/resources/templates/faisp/policeEditModal.html +++ b/src/main/resources/templates/faisp/policeEditModal.html @@ -1,11 +1,22 @@ + +
- +
+ + + + + \ No newline at end of file diff --git a/src/main/resources/templates/faisp/policeList.html b/src/main/resources/templates/faisp/policeList.html index 45176728..123008f8 100644 --- a/src/main/resources/templates/faisp/policeList.html +++ b/src/main/resources/templates/faisp/policeList.html @@ -7,7 +7,7 @@
-

現 외사경찰 현황

+

@@ -15,6 +15,7 @@
+
@@ -31,21 +32,26 @@
-
- + + + + + +
- - - + +
- +
@@ -56,13 +62,13 @@
@@ -85,7 +91,12 @@ 외사경력 입직
경로 최종
수정일 - 전출 + + 전출 + + + 전입 + @@ -93,10 +104,10 @@ - + - + @@ -107,7 +118,12 @@ - + + + + + + @@ -141,7 +157,8 @@
- + +
@@ -156,12 +173,7 @@ diff --git a/src/main/resources/templates/layout/layout.html b/src/main/resources/templates/layout/layout.html index dc2e4b5a..6d80b250 100644 --- a/src/main/resources/templates/layout/layout.html +++ b/src/main/resources/templates/layout/layout.html @@ -5,6 +5,7 @@ xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"> + 해양경찰청 외사종합포털 @@ -34,6 +35,9 @@ + + + diff --git a/src/main/resources/templates/publicBoard/notice/noticeEditModal.html b/src/main/resources/templates/publicBoard/notice/noticeEditModal.html index 136dc971..ef654aad 100644 --- a/src/main/resources/templates/publicBoard/notice/noticeEditModal.html +++ b/src/main/resources/templates/publicBoard/notice/noticeEditModal.html @@ -43,6 +43,10 @@
+