운영계획 중간저장

DESKTOP-NQTA8OG\lcks0 2022-09-06 18:01:01 +09:00
parent 729017c9e1
commit da4a021844
14 changed files with 298 additions and 117 deletions

View File

@ -0,0 +1,24 @@
package com.dbnt.faisp.config;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Transient;
import java.time.LocalDateTime;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
public class BaseBoard extends BaseModel {
@Column(name = "wrt_organ")
private String wrtOrgan;
@Column(name = "wrt_nm")
private String wrtNm;
@Column(name = "wrt_dt")
private LocalDateTime wrtDt;
}

View File

@ -61,7 +61,8 @@ public class SecurityConfig{
http.authorizeRequests() // 페이지 권한 설정 http.authorizeRequests() // 페이지 권한 설정
.antMatchers( .antMatchers(
"/dashboard", "/dashboard",
"/refreshSession" "/refreshSession",
"/fpiMgt/**"
).hasRole(Role.USER.name()) // USER, ADMIN 접근 허용 ).hasRole(Role.USER.name()) // USER, ADMIN 접근 허용
.antMatchers( .antMatchers(
"/codeMgt/**", "/codeMgt/**",

View File

@ -5,11 +5,13 @@ import com.dbnt.faisp.fpiMgt.monthPlan.model.BoardPlan;
import com.dbnt.faisp.userInfo.model.UserInfo; import com.dbnt.faisp.userInfo.model.UserInfo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping("/fpiMgt") @RequestMapping("/fpiMgt")
@ -27,4 +29,25 @@ public class FpiMgtController { // 외사경찰견문관리
mav.addObject("searchParams", boardPlan); mav.addObject("searchParams", boardPlan);
return mav; return mav;
} }
@GetMapping("/planEditModal")
public ModelAndView planEditModal(@AuthenticationPrincipal UserInfo loginUser, BoardPlan boardPlan){
ModelAndView mav = new ModelAndView("igActivities/fpiMgt/monthPlan/planEditModal");
if(boardPlan.getPlanKey()!=null){
boardPlan = monthPlanService.selectBoardPlan(boardPlan.getPlanKey());
}else{
boardPlan.setWrtOrgan(loginUser.getOgCd());
boardPlan.setWrtNm(loginUser.getUserNm());
boardPlan.setWrtDt(LocalDateTime.now());
}
mav.addObject("plan", boardPlan);
return mav;
}
@PostMapping("/savePlan")
public Integer savePlan(BoardPlan boardPlan,
@RequestParam(value = "planInfos", required = false) List<String> planInfos,
@RequestParam(value = "detailPlanInfos", required = false)List<String> detailPlanInfos){
return 0;
}
} }

View File

@ -1,10 +1,25 @@
package com.dbnt.faisp.fpiMgt.monthPlan; package com.dbnt.faisp.fpiMgt.monthPlan;
import com.dbnt.faisp.fpiMgt.monthPlan.model.BoardPlan;
import com.dbnt.faisp.fpiMgt.monthPlan.model.PlanFile;
import com.dbnt.faisp.fpiMgt.monthPlan.repository.BoardPlanRepository;
import com.dbnt.faisp.fpiMgt.monthPlan.repository.PlanFileRepository;
import com.dbnt.faisp.fpiMgt.monthPlan.repository.PlanMainInfoRepository;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class MonthPlanService { // 월간계획 public class MonthPlanService {
private final BoardPlanRepository boardPlanRepository;
private final PlanFileRepository planFileRepository;
private final PlanMainInfoRepository planMainInfoRepository;
public BoardPlan selectBoardPlan(Integer planKey) {
BoardPlan savedPlan = boardPlanRepository.findById(planKey).orElse(null);
savedPlan.setFileList(planFileRepository.findByPlanKey(planKey));
savedPlan.setMainInfoList(planMainInfoRepository.findByPlanKey(planKey));
return savedPlan;
}
} }

View File

@ -1,6 +1,6 @@
package com.dbnt.faisp.fpiMgt.monthPlan.model; package com.dbnt.faisp.fpiMgt.monthPlan.model;
import com.dbnt.faisp.config.BaseModel; import com.dbnt.faisp.config.BaseBoard;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
@ -8,6 +8,7 @@ import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*; import javax.persistence.*;
import java.time.LocalDate;
import java.util.List; import java.util.List;
@Getter @Getter
@ -17,28 +18,33 @@ import java.util.List;
@DynamicInsert @DynamicInsert
@DynamicUpdate @DynamicUpdate
@Table(name = "board_plan") @Table(name = "board_plan")
public class BoardPlan extends BaseModel { public class BoardPlan extends BaseBoard {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "plan_key") @Column(name = "plan_key")
private Integer planKey; private Integer planKey;
@Column(name = "cat1_cd") @Column(name = "plan_state")
private String cat1Cd; private String planState;
@Column(name = "cat2_cd") @Column(name = "content_title")
private String cat2Cd; private String contentTitle;
@Column(name = "cat3_cd") @Column(name = "plan_dt")
private String cat3Cd; private LocalDate planDt;
@Column(name = "menu_url") @Column(name = "section_nm")
private String menuUrl; private String sectionNm;
@Column(name = "approval_chk") @Column(name = "section_apprv")
private String approvalChk; private String sectionApprv;
@Column(name = "section_etc")
private String sectionEtc;
@Column(name = "head_nm")
private String headNm;
@Column(name = "head_apprv")
private String headApprv;
@Column(name = "head_etc")
private String headEtc;
@Transient @Transient
private List<BoardPlan> childList; private List<PlanMainInfo> mainInfoList;
@Transient @Transient
private Integer cat1RowspanCnt; private List<PlanFile> fileList;
@Transient
private Integer cat2RowspanCnt;
} }

View File

@ -1,14 +1,11 @@
package com.dbnt.faisp.fpiMgt.monthPlan.model; package com.dbnt.faisp.fpiMgt.monthPlan.model;
import com.dbnt.faisp.config.BaseModel; import lombok.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*; import javax.persistence.*;
import java.util.List; import java.io.Serializable;
@Getter @Getter
@Setter @Setter
@ -16,29 +13,34 @@ import java.util.List;
@NoArgsConstructor @NoArgsConstructor
@DynamicInsert @DynamicInsert
@DynamicUpdate @DynamicUpdate
@Table(name = "board_plan") @Table(name = "plan_file")
public class PlanFile extends BaseModel { @IdClass(PlanFile.PlanFileId.class)
public class PlanFile{
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "plan_key") @Column(name = "plan_key")
private Integer planKey; private Integer planKey;
@Column(name = "cat1_cd") @Id
private String cat1Cd; @Column(name = "file_seq")
@Column(name = "cat2_cd") private Integer fileSeq;
private String cat2Cd; @Column(name = "orig_nm")
@Column(name = "cat3_cd") private String origNm;
private String cat3Cd; @Column(name = "conv_nm")
@Column(name = "menu_url") private String convNm;
private String menuUrl; @Column(name = "file_extn")
@Column(name = "approval_chk") private String fileExtn;
private String approvalChk; @Column(name = "file_size")
private Integer fileSize;
@Column(name = "save_path")
private String savePath;
@Transient
private List<PlanFile> childList;
@Transient @Embeddable
private Integer cat1RowspanCnt; @Data
@Transient @NoArgsConstructor
private Integer cat2RowspanCnt; @AllArgsConstructor
public static class PlanFileId implements Serializable {
private Integer planKey;
private Integer fileSeq;
}
} }

View File

@ -1,14 +1,11 @@
package com.dbnt.faisp.fpiMgt.monthPlan.model; package com.dbnt.faisp.fpiMgt.monthPlan.model;
import com.dbnt.faisp.config.BaseModel; import lombok.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate; import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*; import javax.persistence.*;
import java.util.List; import java.io.Serializable;
@Getter @Getter
@Setter @Setter
@ -17,28 +14,25 @@ import java.util.List;
@DynamicInsert @DynamicInsert
@DynamicUpdate @DynamicUpdate
@Table(name = "board_plan") @Table(name = "board_plan")
public class PlanMainInfo extends BaseModel { @IdClass(PlanMainInfo.PlanMainInfoId.class)
public class PlanMainInfo {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "plan_key") @Column(name = "plan_key")
private Integer planKey; private Integer planKey;
@Column(name = "cat1_cd") @Id
private String cat1Cd; @Column(name = "plan_seq")
@Column(name = "cat2_cd") private Integer planSeq;
private String cat2Cd; @Column(name = "plan_type")
@Column(name = "cat3_cd") private String planType;
private String cat3Cd; @Column(name = "plan_info")
@Column(name = "menu_url") private String planInfo;
private String menuUrl;
@Column(name = "approval_chk")
private String approvalChk;
@Transient
private List<PlanMainInfo> childList;
@Transient
private Integer cat1RowspanCnt;
@Transient
private Integer cat2RowspanCnt;
@Embeddable
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class PlanMainInfoId implements Serializable {
private Integer planKey;
private Integer planSeq;
}
} }

View File

@ -0,0 +1,9 @@
package com.dbnt.faisp.fpiMgt.monthPlan.repository;
import com.dbnt.faisp.fpiMgt.monthPlan.model.BoardPlan;
import org.springframework.data.jpa.repository.JpaRepository;
public interface BoardPlanRepository extends JpaRepository<BoardPlan, Integer> {
}

View File

@ -0,0 +1,11 @@
package com.dbnt.faisp.fpiMgt.monthPlan.repository;
import com.dbnt.faisp.fpiMgt.monthPlan.model.PlanFile;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface PlanFileRepository extends JpaRepository<PlanFile, PlanFile.PlanFileId> {
List<PlanFile> findByPlanKey(Integer planKey);
}

View File

@ -0,0 +1,11 @@
package com.dbnt.faisp.fpiMgt.monthPlan.repository;
import com.dbnt.faisp.fpiMgt.monthPlan.model.PlanMainInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface PlanMainInfoRepository extends JpaRepository<PlanMainInfo, PlanMainInfo.PlanMainInfoId> {
List<PlanMainInfo> findByPlanKey(Integer planKey);
}

View File

@ -0,0 +1,72 @@
$(document).on('click', '#addPlanBtn', function (){
$.ajax({
url: '/fpiMgt/planEditModal',
data: {planKey: null},
type: 'GET',
dataType:"html",
success: function(html){
$("#planEditBody").empty().append(html)
$("#planEditModal").modal('show');
$("#planDt").datepicker({
format: "yyyy-mm-dd",
language: "ko"
});
},
error:function(){
}
});
})
$(document).on('click', '#planAddBtn', function (){
$("#planDiv").append("<input type='text' class='form-control' name='planInfos'>")
})
$(document).on('click', '#detailPlanAddBtn', function (){
const detailPlanDiv = $("#detailPlanDiv");
detailPlanDiv.append("<textarea type='text' name='detailPlanInfos'></textarea>");
const lastAppendTextarea = detailPlanDiv.children()[detailPlanDiv.children().length-1];
$(lastAppendTextarea).summernote({
lang:'ko-KR',
height: 120,
disableDragAndDrop: true,
toolbar: [
['style', ['style']],
['font', ['bold', 'underline', 'clear']],
['color', ['color']],
['para', ['ul', 'ol', 'paragraph']],
['table', ['table']]
]
});
})
$(document).on('click', '#savePlanBtn', function (){
savePlan('S')
})
$(document).on('click', '#saveTempBtn', function (){
savePlan('T')
})
function savePlan(planState){
if(confirm("저장하시겠습니까?")){
$("#planState").val(planState);
contentFade("in");
const formData = new FormData($("#planEditForm")[0]);
$.ajax({
type : 'POST',
data : formData,
url : "/fpiMgt/savePlan",
processData: false,
contentType: false,
success : function(result) {
debugger
contentFade("out");
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
contentFade("out");
}
})
}
}

View File

@ -3,7 +3,7 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/layout}"> layout:decorate="~{layout/layout}">
<th:block layout:fragment="script"> <th:block layout:fragment="script">
<script type="text/javascript" th:src="@{/js/menuMgt/menuMgt.js}"></script> <script type="text/javascript" th:src="@{/js/igActivities/fpiMgt/monthPlan.js}"></script>
</th:block> </th:block>
<div layout:fragment="content"> <div layout:fragment="content">
<main class="pt-3"> <main class="pt-3">
@ -26,7 +26,7 @@
<div class="col-auto"> <div class="col-auto">
<div class="row justify-content-end"> <div class="row justify-content-end">
<div class="col-auto"> <div class="col-auto">
<input type="text" class="form-control form-control-sm" name="menuUrl" placeholder="url" th:value="${searchParams.menuUrl}"> <input type="text" class="form-control form-control-sm">
</div> </div>
<input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색"> <input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색">
</div> </div>
@ -49,9 +49,7 @@
</table> </table>
</div> </div>
<div class="row justify-content-between"> <div class="row justify-content-between">
<div class="col-auto"> <div class="col-auto"></div>
</div>
<div class="col-auto"> <div class="col-auto">
<nav aria-label="Page navigation"> <nav aria-label="Page navigation">
<ul class="pagination"> <ul class="pagination">
@ -78,7 +76,7 @@
</nav> </nav>
</div> </div>
<div class="col-auto"> <div class="col-auto">
<input type="button" class="btn btn-success" value="등록" id="addMenuBtn" data-bs-toggle="modal" data-bs-target="#monthPlanModal"> <input type="button" class="btn btn-success" value="등록" id="addPlanBtn">
</div> </div>
</div> </div>
</div> </div>
@ -90,51 +88,20 @@
</div> </div>
</main> </main>
<div class="modal fade" id="monthPlanModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="monthPlanModalLabel" aria-hidden="true"> <div class="modal fade" id="planEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="planEditModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg"> <div class="modal-dialog modal-xl">
<div class="modal-content" id="menuEditModalContent"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">월간 계획 작성</h5> <h5 class="modal-title" id="planEditModalLabel">월간 계획 작성</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body" id="planEditBody">
<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="trCareer" name="trCareer">
</div>
<label for="ofcCd" class="col-sm-2 col-form-label text-center">작성일</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="trCareer" name="trCareer">
</div>
<label for="ofcCd" class="col-sm-2 col-form-label text-center">시행일자</label>
<div class="col-sm-2">
<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-10">
<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-10">
<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-10">
<input type="text" class="form-control" id="trCareer" name="trCareer">
</div>
</div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
<button type="button" class="btn btn-warning">임시저장</button> <button type="button" class="btn btn-warning" id="saveTempBtn">임시저장</button>
<button type="button" class="btn btn-primary">저장</button> <button type="button" class="btn btn-primary" id="savePlanBtn">저장</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<form action="#" method="post" id="planEditForm">
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<input type="hidden" name="planKey" th:value="${plan.planKey}">
<input type="hidden" name="planState" id="planState" th:value="${plan.planState}">
<div class="mb-3 row">
<label for="wrtNm" class="col-sm-2 col-form-label text-center">작성자</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="wrtNm" name="wrtNm" th:value="${plan.wrtNm}" readonly>
</div>
<label for="wrdDt" class="col-sm-2 col-form-label text-center">작성일</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="wrdDt" name="wrdDt" th:value="${#temporals.format(plan.wrtDt, 'yyyy-MM-dd HH:mm')}" readonly>
</div>
<label for="planDt" class="col-sm-2 col-form-label text-center">시행일자</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="planDt" name="planDt" th:value="${#temporals.format(plan.planDt, 'yyyy-MM-dd')}" autocomplete="off">
</div>
</div>
<div class="mb-3 row">
<label for="contentTitle" class="col-sm-2 col-form-label text-center">제목</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="contentTitle" name="contentTitle" th:value="${plan.contentTitle}">
</div>
</div>
<div class="mb-3 row justify-content-center">
<label for="planAddBtn" class="col-sm-2 col-form-label text-center">주요 사업계획</label>
<div class="col-sm-10" id="planDiv">
<!--<input type="text" class="form-control" name="planInfo">-->
</div>
<div class="col-sm-auto">
<button type="button" class="btn btn-sm btn-outline-primary" id="planAddBtn"><i class="bi bi-plus-lg"></i></button>
</div>
</div>
<div class="mb-3 row justify-content-center">
<label for="detailPlanAddBtn" class="col-sm-2 col-form-label text-center">사업개요 및 추진계획</label>
<div class="col-sm-10" id="detailPlanDiv">
<!--<textarea id="detailPlanInfo"></textarea>-->
</div>
<div class="col-sm-auto">
<button type="button" class="btn btn-sm btn-outline-primary" id="detailPlanAddBtn"><i class="bi bi-plus-lg"></i></button>
</div>
</div>
</form>

View File

@ -5,7 +5,7 @@
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"> xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>해양경찰청 파일관리 시스템</title> <title>해양경찰청 외사종합포털</title>
<!--bootstrap--> <!--bootstrap-->
<link rel="stylesheet" th:href="@{/vendor/bootstrap-5.2.0-dist/css/bootstrap.min.css}"> <link rel="stylesheet" th:href="@{/vendor/bootstrap-5.2.0-dist/css/bootstrap.min.css}">