From 851a1a10a7f1b12216cb2a3fc5a42c54048981d0 Mon Sep 17 00:00:00 2001 From: TaehunPark Date: Fri, 13 Jan 2023 17:52:43 +0900 Subject: [PATCH] =?UTF-8?q?feat:=EC=99=B8=EC=82=AC=EC=B2=A9=EB=B3=B4?= =?UTF-8?q?=EB=A7=9D=20->=20=EC=9A=B4=EC=98=81=EA=B3=84=ED=9A=8D=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=A4=91=EA=B0=84=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dbnt/faisp/config/BaseService.java | 2 + .../com/dbnt/faisp/config/SecurityConfig.java | 1 + .../IntelligenceNetworkController.java | 155 +++++++++++++++ .../mapper/IntelligenceNetworkMapper.java | 19 ++ .../model/OperationPlan.java | 85 +++++++++ .../model/OperationPlanApprv.java | 45 +++++ .../model/OperationPlanFile.java | 47 +++++ .../OperationPlanApprvRepository.java | 17 ++ .../OperationPlanFileRepository.java | 17 ++ .../repository/OperationPlanRepository.java | 11 ++ .../service/IntelligenceNetworkService.java | 126 ++++++++++++ src/main/resources/application-dev.properties | 1 + .../resources/application-prod.properties | 1 + .../resources/application-test.properties | 1 + .../IntelligenceNetworkMapper.xml | 82 ++++++++ .../intelligenceNetwork/operationPlan.js | 138 ++++++++++++++ .../operationPlanEditModal.html | 131 +++++++++++++ .../operationPlanList.html | 179 ++++++++++++++++++ .../operationPlanViewModal.html | 166 ++++++++++++++++ 19 files changed, 1224 insertions(+) create mode 100644 src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/IntelligenceNetworkController.java create mode 100644 src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/mapper/IntelligenceNetworkMapper.java create mode 100644 src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlan.java create mode 100644 src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlanApprv.java create mode 100644 src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlanFile.java create mode 100644 src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanApprvRepository.java create mode 100644 src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanFileRepository.java create mode 100644 src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanRepository.java create mode 100644 src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/service/IntelligenceNetworkService.java create mode 100644 src/main/resources/mybatisMapper/IntelligenceNetworkMapper.xml create mode 100644 src/main/resources/static/js/igActivities/fpiMgt/intelligenceNetwork/operationPlan.js create mode 100644 src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanEditModal.html create mode 100644 src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanList.html create mode 100644 src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanViewModal.html diff --git a/src/main/java/com/dbnt/faisp/config/BaseService.java b/src/main/java/com/dbnt/faisp/config/BaseService.java index bf6295fd..de41848f 100644 --- a/src/main/java/com/dbnt/faisp/config/BaseService.java +++ b/src/main/java/com/dbnt/faisp/config/BaseService.java @@ -52,6 +52,8 @@ public class BaseService { protected String majorStatusPath; @Value("${file.dir.monitoring}") protected String monitoringPath; + @Value("${file.dir.intelligenceNetwork}") + protected String intelligenceNetworkPath; protected String calculationSize(double fileSize){ String[] units = {"bytes", "KB", "MB", "GB", "TB", "PB"}; diff --git a/src/main/java/com/dbnt/faisp/config/SecurityConfig.java b/src/main/java/com/dbnt/faisp/config/SecurityConfig.java index 454f23f2..19df475b 100644 --- a/src/main/java/com/dbnt/faisp/config/SecurityConfig.java +++ b/src/main/java/com/dbnt/faisp/config/SecurityConfig.java @@ -139,6 +139,7 @@ public class SecurityConfig{ "/sri/**", "/counterIntelligence/**", "/monitoring/**", + "/intelligenceNetwork/**", "/resetSession" ).hasRole(Role.USER.name()) // USER 접근 허용 .antMatchers( diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/IntelligenceNetworkController.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/IntelligenceNetworkController.java new file mode 100644 index 00000000..adc9aad4 --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/IntelligenceNetworkController.java @@ -0,0 +1,155 @@ +package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork; + +import com.dbnt.faisp.main.authMgt.service.AuthMgtService; +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlan; +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlanApprv; +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.service.IntelligenceNetworkService; +import com.dbnt.faisp.main.userInfo.model.UserInfo; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import java.time.LocalDateTime; +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/intelligenceNetwork") +public class IntelligenceNetworkController { // 첩보수집활동 > 해양외사모니터링 + private final IntelligenceNetworkService intelligenceNetworkService; + private final AuthMgtService authMgtService; + + @GetMapping("/operationPlanList/{type}") + public ModelAndView operationPlanList(@AuthenticationPrincipal UserInfo loginUser,@PathVariable("type") String type, OperationPlan op){ + ModelAndView mav = new ModelAndView("igActivities/fpiMgt/intelligenceNetwork/operationPlanList"); + + //메뉴권한 확인 + String accessAuth = authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/intelligenceNetwork/operationPlanList/all").get(0).getAccessAuth(); + if(type.equals("all")) { + switch (accessAuth){ + case "ACC001": // 조회 + case "ACC002": // 작성 // 자신이 작성한 문서만 열람가능 + op.setWrtUserSeq(loginUser.getUserSeq()); + break; + case "ACC003": // 관리 // 자신 외 하위 기관에서 작성한 문서 열람가능 + op.setDownOrganCdList(loginUser.getDownOrganCdList()); + mav.addObject("mgtOrganList", loginUser.getDownOrganCdList()); + break; + } + }else if(type.equals("stay") || type.equals("commit")) { + switch (accessAuth){ + case "ACC001": // 조회 + case "ACC002": // 작성 // 자신의 관서 내에서 작성한 문서만 열람가능 + op.setWrtOrgan(loginUser.getOgCd()); + break; + case "ACC003": // 관리 // 자신 외 하위 기관에서 작성한 문서 열람가능 + op.setDownOrganCdList(loginUser.getDownOrganCdList()); + mav.addObject("mgtOrganList", loginUser.getDownOrganCdList()); + break; + } + } + //결재권한 확인 + String apprvAuth = authMgtService.selectApprovalConfigList(loginUser.getUserSeq(), "/intelligenceNetwork/operationPlanList/all").get(0).getApprovalAuth(); + if(type.equals("stay")) { + if(apprvAuth==null) { + if(!accessAuth.equals("ACC003")){ + op.setWrtUserSeq(loginUser.getUserSeq()); + op.setUserType("normalStayList"); + }else{ + op.setUserType("managerStayList"); + } + }else{ + mav.addObject("userNm", loginUser.getUserNm()); + switch (apprvAuth){ + case "APC004": // 계장대행 + case "APC003": // 계장 // 결재대기 문서 조회 + case "APC002": // 부장대행 + case "APC001": // 부장 // 결재대기 문서 조회 + op.setOpState("DST002"); + break; + } + } + }else if(type.equals("commit")){ + if(apprvAuth==null) { + if(!accessAuth.equals("ACC003")){ + op.setWrtUserSeq(loginUser.getUserSeq()); + op.setUserType("normalCommitList"); + }else{ + op.setUserType("managerCommitList"); + } + }else{ + switch (apprvAuth) { + case "APC004": // 계장대행 + case "APC003": // 계장 // + case "APC002": // 부장대행 + case "APC001": // 부장 // + op.setUserType("sectionCommitList"); + break; + } + } + } + mav.addObject("accessAuth", accessAuth); + mav.addObject("apprvAuth", apprvAuth); + + op.setQueryInfo(); + mav.addObject("opList", intelligenceNetworkService.selectOperationPlanList(op)); + op.setContentCnt(intelligenceNetworkService.selectOperationPlanListCnt(op)); + op.setPaginationInfo(); + mav.addObject("type", type); + + mav.addObject("searchUrl", "/intelligenceNetwork/operationPlanList/"+type); + mav.addObject("searchParams", op); + return mav; + } + + @GetMapping("/operationPlanEditModal") + public ModelAndView operationPlanEditModal(@AuthenticationPrincipal UserInfo loginUser, OperationPlan op){ + ModelAndView mav = new ModelAndView("igActivities/fpiMgt/intelligenceNetwork/operationPlanEditModal"); + if(op.getOpKey()!=null){ + op = intelligenceNetworkService.selectOperationPlan(op.getOpKey()); + } + + mav.addObject("op", op); + return mav; + } + + @PostMapping("/saveOperationPlan") + public Integer saveOperationPlan(@AuthenticationPrincipal UserInfo loginUser,OperationPlan op, + MultipartHttpServletRequest request, @RequestParam(value = "fileSeq", required = false) List deleteFileSeq){ + op.setMultipartFileList(request.getMultiFileMap().get("uploadFiles")); + if(op.getOpKey() == null) { + op.setWrtOrgan(loginUser.getOgCd()); + op.setWrtPart(loginUser.getOfcCd()); + op.setWrtUserGrd(loginUser.getTitleCd()); + op.setWrtUserSeq(loginUser.getUserSeq()); + op.setWrtUserNm(loginUser.getUserNm()); + op.setWrtDt(LocalDateTime.now()); + } + return intelligenceNetworkService.saveOperationPlan(op,deleteFileSeq); + } + + @GetMapping("/operationPlanViewModal") + public ModelAndView operationPlanViewModal(@AuthenticationPrincipal UserInfo loginUser, OperationPlan op){ + ModelAndView mav = new ModelAndView("igActivities/fpiMgt/intelligenceNetwork/operationPlanViewModal"); + op = intelligenceNetworkService.selectOperationPlan(op.getOpKey()); + mav.addObject("op", op); + mav.addObject("userSeq",loginUser.getUserSeq()); + //메뉴권한 확인 + mav.addObject("accessAuth", authMgtService.selectAccessConfigList(loginUser.getUserSeq(), "/intelligenceNetwork/operationPlanList/all").get(0).getAccessAuth()); + mav.addObject("apprvAuth", authMgtService.selectApprovalConfigList(loginUser.getUserSeq(), "/intelligenceNetwork/operationPlanList/all").get(0).getApprovalAuth()); + return mav; + } + + @PostMapping("/operationPlanStateChange") + public Integer operationPlanStateChange(@AuthenticationPrincipal UserInfo loginUser, OperationPlanApprv apprv){ + apprv.setUserSeq(loginUser.getUserSeq()); + apprv.setUserGrd(loginUser.getTitleCd()); + apprv.setUserNm(loginUser.getUserNm()); + apprv.setSaveDt(LocalDateTime.now()); + return intelligenceNetworkService.operationPlanStateChange(apprv); + } + + +} diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/mapper/IntelligenceNetworkMapper.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/mapper/IntelligenceNetworkMapper.java new file mode 100644 index 00000000..09b38085 --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/mapper/IntelligenceNetworkMapper.java @@ -0,0 +1,19 @@ +package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlan; +import com.dbnt.faisp.main.fpiMgt.monitoring.model.MonitoringDesignation; + +import java.util.List; + +@Mapper +public interface IntelligenceNetworkMapper { + + List selectOperationPlanList(OperationPlan op); + + Integer selectOperationPlanListCnt(OperationPlan op); + + + +} diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlan.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlan.java new file mode 100644 index 00000000..474540cf --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlan.java @@ -0,0 +1,85 @@ +package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model; + +import com.dbnt.faisp.config.BaseModel; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.multipart.MultipartFile; + +import javax.persistence.*; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@Setter +@Entity +@NoArgsConstructor +@DynamicInsert +@DynamicUpdate +@Table(name = "operation_plan") +public class OperationPlan extends BaseModel { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "op_key") + private Integer opKey; + @Column(name = "op_name") + private String opName; + @Column(name = "op_birth") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate opBirth; + @Column(name = "op_position") + private String opPosition; + @Column(name = "op_job") + private String opJob; + @Column(name = "op_career") + private String opCareer; + @Column(name = "op_phone") + private String opPhone; + @Column(name = "op_address") + private String opAddress; + @Column(name = "op_rank") + private String opRank; + @Column(name = "op_etc") + private String opEtc; + @Column(name = "target_location") + private String targetLocation; + @Column(name = "vulnerability_analyze") + private String vulnerabilityAnalyze; + @Column(name = "eligibility_analyze") + private String eligibilityAnalyze; + @Column(name = "focus_collection") + private String focusCollection; + @Column(name = "op_state") + private String opState; + @Column(name = "wrt_organ") + private String wrtOrgan; + @Column(name = "wrt_part") + private String wrtPart; + @Column(name = "wrt_user_seq") + private Integer wrtUserSeq; + @Column(name = "wrt_user_grd") + 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 + private Integer fileCnt; + @Transient + private String userType; + @Transient + private List apprvList; + @Transient + private List fileList; + @Transient + private List multipartFileList; + +} diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlanApprv.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlanApprv.java new file mode 100644 index 00000000..d5b347fb --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlanApprv.java @@ -0,0 +1,45 @@ +package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model; + +import lombok.*; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; +import java.io.Serializable; +import java.time.LocalDateTime; + +@Getter +@Setter +@Entity +@NoArgsConstructor +@DynamicInsert +@DynamicUpdate +@Table(name = "operation_plan_apprv") +@IdClass(OperationPlanApprv.OperationPlanApprvId.class) +public class OperationPlanApprv { + @Id + @Column(name = "op_key") + private Integer opKey; + @Id + @Column(name = "apprv_seq") + private Integer apprvSeq; + @Column(name = "state") + private String state; + @Column(name = "user_seq") + private Integer userSeq; + @Column(name = "user_grd") + private String userGrd; + @Column(name = "user_nm") + private String userNm; + @Column(name = "save_dt") + private LocalDateTime saveDt; + + @Embeddable + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class OperationPlanApprvId implements Serializable { + private Integer opKey; + private Integer apprvSeq; + } +} diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlanFile.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlanFile.java new file mode 100644 index 00000000..70b4a9bb --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/model/OperationPlanFile.java @@ -0,0 +1,47 @@ +package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model; + +import com.dbnt.faisp.config.FileInfo; +import lombok.*; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.*; +import java.io.Serializable; + +@Getter +@Setter +@Entity +@NoArgsConstructor +@DynamicInsert +@DynamicUpdate +@Table(name = "operation_plan_file") +@IdClass(OperationPlanFile.OperationPlanFileId.class) +public class OperationPlanFile extends FileInfo { + @Id + @Column(name = "op_key") + private Integer opKey; + @Id + @Column(name = "file_seq") + private Integer fileSeq; + @Column(name = "orig_nm") + private String origNm; + @Column(name = "conv_nm") + private String convNm; + @Column(name = "file_extn") + private String fileExtn; + @Column(name = "file_size") + private String fileSize; + @Column(name = "save_path") + private String savePath; + + + @Embeddable + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class OperationPlanFileId implements Serializable { + private Integer opKey; + private Integer fileSeq; + } + +} diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanApprvRepository.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanApprvRepository.java new file mode 100644 index 00000000..afaf6207 --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanApprvRepository.java @@ -0,0 +1,17 @@ +package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository; + +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlanApprv; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + + +public interface OperationPlanApprvRepository extends JpaRepository { + + List findByOpKey(Integer opKey); + + Optional findTopByOpKeyOrderByApprvSeqDesc(Integer opKey); + + +} diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanFileRepository.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanFileRepository.java new file mode 100644 index 00000000..a2232078 --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanFileRepository.java @@ -0,0 +1,17 @@ +package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository; + +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlanFile; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + + +public interface OperationPlanFileRepository extends JpaRepository { + + List findByOpKey(Integer opKey); + + Optional findTopByOpKeyOrderByFileSeqDesc(Integer opKey); + +} diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanRepository.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanRepository.java new file mode 100644 index 00000000..984d57b0 --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/repository/OperationPlanRepository.java @@ -0,0 +1,11 @@ +package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository; + +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlan; + +import org.springframework.data.jpa.repository.JpaRepository; + + + +public interface OperationPlanRepository extends JpaRepository { + +} diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/service/IntelligenceNetworkService.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/service/IntelligenceNetworkService.java new file mode 100644 index 00000000..7740832a --- /dev/null +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/intelligenceNetwork/service/IntelligenceNetworkService.java @@ -0,0 +1,126 @@ +package com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.service; + + +import com.dbnt.faisp.config.BaseService; + +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.mapper.IntelligenceNetworkMapper; +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlan; +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlanApprv; +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.model.OperationPlanFile; +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository.OperationPlanApprvRepository; +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository.OperationPlanFileRepository; +import com.dbnt.faisp.main.fpiMgt.intelligenceNetwork.repository.OperationPlanRepository; +import com.dbnt.faisp.main.userInfo.service.UserAlarmService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class IntelligenceNetworkService extends BaseService { + private final UserAlarmService userAlarmService; + private final OperationPlanApprvRepository operationPlanApprvRepository; + private final OperationPlanFileRepository operationPlanFileRepository; + private final OperationPlanRepository operationPlanRepository; + private final IntelligenceNetworkMapper intelligenceNetworkMapper; + + @Transactional + public Integer saveOperationPlan(OperationPlan op, List deleteFileSeq) { + Integer opKey = operationPlanRepository.save(op).getOpKey(); + if(deleteFileSeq != null && deleteFileSeq.size()>0){ + deleteOperationPlanFile(opKey, deleteFileSeq); + } + if(op.getMultipartFileList()!=null){ + saveOperationPlanUploadFiles(opKey, op.getMultipartFileList()); + } + if(op.getOpState().equals("DST002")){ + //작성완료일 때 계장 결재 사용자에게 알림 발송. + userAlarmService.sendAlarmToApprvUser(opKey, op.getWrtOrgan(), "APC001", 32, "외사첩보망 견문관리 운영계획에 결재대기 문서가 있습니다."); + userAlarmService.sendAlarmToApprvUser(opKey, op.getWrtOrgan(), "APC002", 32, "외사첩보망 견문관리 운영계획에 결재대기 문서가 있습니다."); + userAlarmService.sendAlarmToApprvUser(opKey, op.getWrtOrgan(), "APC003", 32, "외사첩보망 견문관리 운영계획에 결재대기 문서가 있습니다."); + userAlarmService.sendAlarmToApprvUser(opKey, op.getWrtOrgan(), "APC004", 32, "외사첩보망 견문관리 운영계획에 결재대기 문서가 있습니다."); + } + return opKey; + } + + private void deleteOperationPlanFile(Integer opKey, List deleteFileSeq) { + List operationPlanFileList = operationPlanFileRepository.findByOpKey(opKey); + for(OperationPlanFile file: operationPlanFileList){ + if(deleteFileSeq.contains(file.getFileSeq())){ + deleteStoredFile(new File(file.getSavePath(), file.getConvNm())); + operationPlanFileRepository.delete(file); + } + } + } + + private void saveOperationPlanUploadFiles(Integer opKey, List multipartFileList){ + OperationPlanFile lastFileInfo = operationPlanFileRepository.findTopByOpKeyOrderByFileSeqDesc(opKey).orElse(null); + int fileSeq = lastFileInfo==null?1:(lastFileInfo.getFileSeq()+1); + for(MultipartFile file : multipartFileList){ + String saveName = UUID.randomUUID().toString(); + String path = locationPath+intelligenceNetworkPath; + saveFile(file, new File(path+File.separator+saveName)); + + String originalFilename = file.getOriginalFilename(); + int extnIdx = originalFilename.lastIndexOf("."); + OperationPlanFile fileInfo = new OperationPlanFile(); + fileInfo.setOpKey(opKey); + fileInfo.setFileSeq(fileSeq++); + fileInfo.setOrigNm(originalFilename.substring(0, extnIdx)); + fileInfo.setFileExtn(originalFilename.substring(extnIdx+1)); + fileInfo.setConvNm(saveName); + fileInfo.setFileSize(calculationSize(file.getSize())); + fileInfo.setSavePath(path); + operationPlanFileRepository.save(fileInfo); + } + } + + public List selectOperationPlanList(OperationPlan op) { + return intelligenceNetworkMapper.selectOperationPlanList(op); + } + + public Integer selectOperationPlanListCnt(OperationPlan op) { + return intelligenceNetworkMapper.selectOperationPlanListCnt(op); + } + + public OperationPlan selectOperationPlan(Integer opKey) { + OperationPlan savedOperationPlan = operationPlanRepository.findById(opKey).orElse(null); + if (savedOperationPlan != null) { + savedOperationPlan.setFileList(operationPlanFileRepository.findByOpKey(opKey)); + savedOperationPlan.setApprvList(operationPlanApprvRepository.findByOpKey(opKey)); + } + return savedOperationPlan; + } + + @Transactional + public Integer operationPlanStateChange(OperationPlanApprv apprv) { + OperationPlan saveOperationPlan = operationPlanRepository.findById(apprv.getOpKey()).orElse(null); + saveOperationPlan.setOpState(apprv.getState()); + OperationPlanApprv lastApprv = operationPlanApprvRepository.findTopByOpKeyOrderByApprvSeqDesc(apprv.getOpKey()).orElse(null); + apprv.setApprvSeq(lastApprv==null?1:lastApprv.getApprvSeq()+1); + operationPlanApprvRepository.save(apprv); + + switch (apprv.getState()){ + case "DST003": + case "DST005": + // 반려시 작성자에게 반려 알림 발송 + userAlarmService.sendAlarmToWrtUser(saveOperationPlan.getOpKey(), saveOperationPlan.getWrtUserSeq(), 32,"외사첩보망 견문관리 운영계획에 문서가 반려되었습니다."); + break; + case "DST004": + case "DST006": + // 부장승인시 작성자에게 승인 알림 발송 + userAlarmService.sendAlarmToWrtUser(saveOperationPlan.getOpKey(), saveOperationPlan.getWrtUserSeq(), 32,"외사첩보망 견문관리 운영계획에 문서가 승인되었습니다."); + break; + } + return apprv.getOpKey(); + } + + + + +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 6b608379..2ada3b1a 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -28,6 +28,7 @@ file.dir.cia.edu=/cia/edu file.dir.activityCase=/activityCase file.dir.majorStatus=/majorStatus file.dir.monitoring=/monitoring +file.dir.intelligenceNetwork=/intelligenceNetwork editor.img.view=/file/editorFileDisplay?fileNm= diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index dd431e44..3d3fdea0 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -28,6 +28,7 @@ file.dir.cia.edu=/cia/edu file.dir.activityCase=/activityCase file.dir.majorStatus=/majorStatus file.dir.monitoring=/monitoring +file.dir.intelligenceNetwork=/intelligenceNetwork editor.img.view=/file/editorFileDisplay?fileNm= diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index e3eb20e9..a2d51a31 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -27,6 +27,7 @@ file.dir.cia.edu=/cia/edu file.dir.activityCase=/activityCase file.dir.majorStatus=/majorStatus file.dir.monitoring=/monitoring +file.dir.intelligenceNetwork=/intelligenceNetwork editor.img.view=/file/editorFileDisplay?fileNm= diff --git a/src/main/resources/mybatisMapper/IntelligenceNetworkMapper.xml b/src/main/resources/mybatisMapper/IntelligenceNetworkMapper.xml new file mode 100644 index 00000000..29092538 --- /dev/null +++ b/src/main/resources/mybatisMapper/IntelligenceNetworkMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + and op.wrt_user_seq = #{wrtUserSeq} + + + and op.wrt_user_nm like '%'||#{wrtUserNm}||'%' + + + and op.wrt_organ = #{wrtOrgan} + + + and op.op_state = #{opState} + + + and op.wrt_dt >= #{startDate}::date + + + and op.wrt_dt <= #{endDate}::date+1 + + + and op.wrt_organ in + + #{organCd} + + + + + and op_state in ('DST002') + + + and op_state in ('DST003', 'DST004', 'DST005', 'DST006') + + + and op_state in ('DST003', 'DST004', 'DST005', 'DST006') + + + and op_state in ('DST002') + + + and op_state in ('DST003', 'DST004', 'DST005', 'DST006') + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/js/igActivities/fpiMgt/intelligenceNetwork/operationPlan.js b/src/main/resources/static/js/igActivities/fpiMgt/intelligenceNetwork/operationPlan.js new file mode 100644 index 00000000..95b4fb58 --- /dev/null +++ b/src/main/resources/static/js/igActivities/fpiMgt/intelligenceNetwork/operationPlan.js @@ -0,0 +1,138 @@ +$(function(){ + $("#dateSelectorDiv").datepicker({ + format: "yyyy-mm-dd", + language: "ko", + autoclose: true + }); +}) + +$(document).on('click', '#allTab', function (){ + location.href = "/intelligenceNetwork/operationPlanList/all"; +}) +$(document).on('click', '#stayTab', function (){ + location.href = "/intelligenceNetwork/operationPlanList/stay"; +}) +$(document).on('click', '#commitTab', function (){ + location.href = "/intelligenceNetwork/operationPlanList/commit"; +}) + +$(document).on('click', '#addBtn', function (){ + getoOerationPlanEditModal(null); +}) + +function getoOerationPlanEditModal(opKey){ + $.ajax({ + url: '/intelligenceNetwork/operationPlanEditModal', + data: {opKey: opKey}, + type: 'GET', + dataType:"html", + success: function(html){ + $("#operationPlanEditModalContent").empty().append(html) + $("#opBirth").datepicker({ + format: "yyyy-mm-dd", + language: "ko", + autoclose: true + }); + setUploadDiv(); + $("#operationPlanEditModal").modal('show'); + }, + error:function(){ + + } + }); +} + +$(document).on('click', '#editBtn', function (){ + $("#operationPlanViewModal").modal('hide'); + getoOerationPlanEditModal($(this).attr("data-opkey")); +}) + +$(document).on('click', '#saveBtn', function (){ + if(confirm("저장하시겠습니까?")){ + saveOperationPlan('DST002'); + } +}) + +$(document).on('click', '#saveTempBtn', function (){ + if(confirm("임시저장 하시겠습니까?")){ + saveOperationPlan('DST001'); + } +}) + +function saveOperationPlan(opState){ + contentFade("in"); + const formData = new FormData($("#operationPlanEditForm")[0]); + for(const file of files) { + if(!file.isDelete) + formData.append('uploadFiles', file, file.name); + } + $(".text-decoration-line-through").each(function (idx, el){ + formData.append('fileSeq', $(el).attr("data-fileseq")); + }) + formData.append('opState', opState); + $.ajax({ + type : 'POST', + data : formData, + url : "/intelligenceNetwork/saveOperationPlan", + processData: false, + contentType: false, + success : function(result) { + alert("저장되었습니다."); + contentFade("out"); + location.reload(); + }, + error : function(xhr, status) { + alert("저장에 실패하였습니다.") + contentFade("out"); + } + }) +} + +$(document).on('click', '.operationPlanTr', function (){ + getOperationPlanViewModal(Number($(this).find(".opKey").val())); +}) + +function getOperationPlanViewModal(opKey){ + $.ajax({ + url: '/intelligenceNetwork/operationPlanViewModal', + data: {opKey: opKey}, + type: 'GET', + dataType:"html", + success: function(html){ + $("#operationPlanViewModalBody").empty().append(html) + $("#operationPlanViewModal").modal('show'); + }, + error:function(){ + + } + }); +} + +$(document).on('click', '.apprvBtn', function (){ + $("#viewModalApprvValue").val($(this).attr("data-planstate")); + const approval = $(this).val(); + if(confirm(approval+"하시겠습니까?")){ + const formData = new FormData($("#apprvForm")[0]); + contentFade("in") + $.ajax({ + type : 'POST', + data : formData, + url : "/intelligenceNetwork/operationPlanStateChange", + processData: false, + contentType: false, + beforeSend: function (xhr){ + xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val()); + }, + success : function(result) { + alert(approval+"되었습니다"); + getOperationPlanViewModal(result); + contentFade("out"); + }, + error : function(xhr, status) { + alert(approval+"처리를 실패하였습니다."); + contentFade("out"); + } + }) + } +}) + diff --git a/src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanEditModal.html b/src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanEditModal.html new file mode 100644 index 00000000..a66ab166 --- /dev/null +++ b/src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanEditModal.html @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanList.html b/src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanList.html new file mode 100644 index 00000000..9e3fafd5 --- /dev/null +++ b/src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanList.html @@ -0,0 +1,179 @@ + + + + + +
+
+ + +
+

운영계획서

+

첩보수집활동 > 외사첩보망 견문관리 > 계획수립

+
+
+
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
정보협력자 구성등록일상태관리관
결제여부
성명생년월일근무처연락처등급
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ + + +
+ \ No newline at end of file diff --git a/src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanViewModal.html b/src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanViewModal.html new file mode 100644 index 00000000..88f5da35 --- /dev/null +++ b/src/main/resources/templates/igActivities/fpiMgt/intelligenceNetwork/operationPlanViewModal.html @@ -0,0 +1,166 @@ + + + + + \ No newline at end of file