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/faStatistics/crackdownsStatus/AsfCovController.java b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/AsfCovController.java index 3bd3cb74..47167030 100644 --- a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/AsfCovController.java +++ b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/AsfCovController.java @@ -38,6 +38,7 @@ public class AsfCovController { mav.addObject("searchParams", asfCov); asfCov.setQueryInfo(); + // mav.addObject("asfCov", asfCov); mav.addObject("asfCovList", asfCovService.selectAsfCovList(asfCov)); asfCov.setPaginationInfo(); return mav; @@ -66,28 +67,27 @@ public class AsfCovController { public ModelAndView asfCovViewModal(@AuthenticationPrincipal UserInfo loginUser, AsfCov asfCov){ ModelAndView mav= new ModelAndView("faStatistics/asfCov/asfCovViewModal"); - asfCov = asfCovService.selectAsfCov(asfCov.getAsfCovKey()); mav.addObject("userSeq",loginUser.getUserSeq()); - mav.addObject("asfCov", asfCov); - + mav.addObject("asfCov", asfCovService.selectAsfCov(asfCov.getAsfCovKey())); + mav.addObject("asfCovHistory", asfCovService.selectAsfCovHistory(asfCov.getAsfCovKey())); return mav; } - @GetMapping("/asfCovHistoryViewModal") - public ModelAndView asfCovHistoryViewModal(@AuthenticationPrincipal UserInfo loginUser, AsfCov asfCov){ - ModelAndView mav = new ModelAndView("faStatistics/asfCov/asfCovHistoryViewModal"); - asfCov = asfCovService.selectAsfCov(asfCov.getAsfCovKey()); - mav.addObject("userSeq",loginUser.getUserSeq()); - mav.addObject("asfCovList", asfCovService.selectAsfCovList(asfCov)); - mav.addObject("asfCov", asfCov); - return mav; - } +// @GetMapping("/asfCovHistoryViewModal") +// public ModelAndView asfCovHistoryViewModal(@AuthenticationPrincipal UserInfo loginUser, AsfCov asfCov){ +// ModelAndView mav = new ModelAndView("faStatistics/asfCov/asfCovHistoryViewModal"); +// asfCov = asfCovService.selectAsfCov(asfCov.getAsfCovKey()); +// mav.addObject("userSeq",loginUser.getUserSeq()); +// mav.addObject("asfCovList", asfCovService.selectAsfCovList(asfCov)); +// return mav; +// } @GetMapping("/asfCovHistoryDetail") public ModelAndView asfCovHistoryDetail(@AuthenticationPrincipal UserInfo loginUser, AsfCov asfCov){ ModelAndView mav = new ModelAndView("faStatistics/asfCov/asfCovHistoryDetail"); asfCov = asfCovService.selectAsfCov(asfCov.getAsfCovKey()); mav.addObject("userSeq",loginUser.getUserSeq()); + mav.addObject("asfCovHistory", asfCovService.selectAsfCovHistory(asfCov.getAsfCovKey())); mav.addObject("asfCov", asfCov); return mav; } diff --git a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/mapper/AsfCovMapper.java b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/mapper/AsfCovMapper.java index 7cdeb03d..71a1ae50 100644 --- a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/mapper/AsfCovMapper.java +++ b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/mapper/AsfCovMapper.java @@ -14,4 +14,5 @@ public interface AsfCovMapper { // ArrestType selectArrestType(AsfCov asfCov); List selectAsfCovListWhere(AsfCov asfCov); + List selectAsfCovHistory(Integer asfCovKey); } diff --git a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/model/asfCov/AsfCov.java b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/model/asfCov/AsfCov.java index 4d111747..39525535 100644 --- a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/model/asfCov/AsfCov.java +++ b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/model/asfCov/AsfCov.java @@ -36,7 +36,7 @@ public class AsfCov extends BaseModel { private Integer cdsKey; @Column(name ="person_cnt") - private Integer personCnt; + private Integer personCnt=0; @Column(name ="pressurized_yn") private String pressurizedYn; @@ -45,10 +45,10 @@ public class AsfCov extends BaseModel { private String pressurizedN; @Column(name ="person_negative_cnt") - private Integer personNegativeCnt; + private Integer personNegativeCnt=0; @Column(name ="person_positive_cnt") - private Integer personPositiveCnt; + private Integer personPositiveCnt=0; @Column(name ="asfcov_action_detail") private String asfcovActionDetail; diff --git a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/service/AsfCovService.java b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/service/AsfCovService.java index d5221464..62099b65 100644 --- a/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/service/AsfCovService.java +++ b/src/main/java/com/dbnt/faisp/main/faStatistics/crackdownsStatus/service/AsfCovService.java @@ -14,6 +14,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; @@ -54,14 +55,6 @@ public class AsfCovService extends BaseService { return asfCov; } -// public List selectCrackdownStatusVersionList(Integer asfCovKey) { -// return asfCovRepository.findByAsfCovKey(asfCovKey); -// } -// -// public CrackdownStatusVersion selectCrackdownStatusVersion(Integer versionNo, Integer asfCovKey) { -// return asfCovRepository.findByVersionNoAndAsfCovKey(versionNo, asfCovKey); -// } - @Transactional public Integer saveContent(AsfCov asfCov) { if(asfCov.getAsfCovKey()==null){ @@ -70,6 +63,7 @@ public class AsfCovService extends BaseService { asfCov.setVersionNo(1); }else{ asfCov.setVersionNo(asfCov.getVersionNo()+1); + asfCov.setWrtDt(LocalDateTime.now()); } asfCovRepository.save(asfCov); return asfCov.getAsfCovKey(); @@ -82,4 +76,7 @@ public class AsfCovService extends BaseService { } + public List selectAsfCovHistory(Integer asfCovKey) { + return asfCovMapper.selectAsfCovHistory(asfCovKey); + } } 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/AsfCovMapper.xml b/src/main/resources/mybatisMapper/AsfCovMapper.xml index 52fc5ce6..1c602dad 100644 --- a/src/main/resources/mybatisMapper/AsfCovMapper.xml +++ b/src/main/resources/mybatisMapper/AsfCovMapper.xml @@ -57,62 +57,23 @@ cs.cds_key , cs.case_num , cs.napo_dt - , cs.napo_sea_point_lon - , cs.napo_sea_point_lat - , cs.napo_sea_point_detail - , cs.invasion_type - , cs.nll , cs.case_agency , cs.case_police_officer , cs.crackdown_boat , cs.crackdown_police - , cs.mmsi - , cs.field_ivsgt - , cs.obstr_exspd_cnt - , cs.person_damage_cnt - , cs.person_damage_amount - , cs.person_damage_detail - , cs.material_damage_cnt - , cs.material_damage_amount - , cs.material_damage_detail - , cs.field_ivsgt_napo_dt - , cs.field_ivsgt_release_dt - , cs.field_ivsgt_time_taken - , cs.pressurized_start_dt - , cs.pressurized_end_dt - , cs.distance , fb.fb_key , fb.boat_name_kr , fb.boat_name_cn - , fb.ton_cnt - , fb.fishery_type - , fb.boat_material - , fb.boat_nny_sung - , fb.boat_nny_si - , fb.offense_quantity - , fb.offense_amount - , fb.offense_illegal_waste_quantity - , fb.dambo_unpaid_amount - , fb.dambo_payment - , fb.payment_payment_dt - , fb.confiscation_frame - , fb.confiscation_width - , fb.confiscation_jo - , fb.confiscation_gae - , fb.confiscation_etc - , fb.catch_fish_species - , fb.catch_cnt - , fb.offense_fish_species - , fb.offense_catch_cnt , fb.status FROM asfcov_status a - INNER JOIN crackdown_status cs - ON a.cds_key = cs.cds_key - - INNER JOIN fishing_boat fb - ON a.cds_key = fb.cds_key - + inner join (select asfcov_key, max(version_no) as lastVersion + from asfcov_status + group by asfcov_key) b on a.asfcov_key = b.asfcov_key and a.version_no = b.lastVersion + INNER JOIN crackdown_status cs + ON a.cds_key = cs.cds_key + INNER JOIN fishing_boat fb + ON a.cds_key = fb.cds_key order by a.asfcov_key desc limit #{rowCnt} offset #{firstIndex} @@ -126,6 +87,17 @@ - + \ No newline at end of file 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/faStatistics/asfCov.js b/src/main/resources/static/js/faStatistics/asfCov.js index c5658a49..c56ea857 100644 --- a/src/main/resources/static/js/faStatistics/asfCov.js +++ b/src/main/resources/static/js/faStatistics/asfCov.js @@ -75,7 +75,7 @@ $(function(){ $(document).on('click', '#deleteMajorBtn', function (){ - const asfCovKey = $('#processResultEditBody').find(".asfCovKey").val(); + const asfCovKey = $('#asfCovEditModalContent').find(".asfCovKey").val(); console.log(asfCovKey); if(confirm("삭제하시겠습니까?")){ //contentFade("in"); @@ -109,10 +109,6 @@ function getEditModal(asfCovKey){ type: 'GET', dataType:"html", success: function(html){ - const crackdownPolice = $("#crackdownPolice").val() - if(crackdownPolice){ - getCrackdownBoatOption(crackdownPolice) - } $("#asfCovEditModalContent").empty().append(html); $("#asfCovEditModal").modal('show'); $("#editContent").empty().append(html); @@ -124,10 +120,13 @@ function getEditModal(asfCovKey){ }); } -function getViewModal(asfCovKey){ +function getViewModal(asfCovKey,versionNo){ $.ajax({ url: '/faStatistics/asfCovViewModal', - data: {asfCovKey: asfCovKey}, + data: { + versionNo : versionNo, + asfCovKey : asfCovKey + }, type: 'GET', dataType:"html", success: function(html){ @@ -223,10 +222,30 @@ $(document).on('change', '#searchFormPolice', function (){ } }) -$(document).on('click', '.version-tr', function (){ - $(this).find('input[name="versionNo"]').prop('checked', true); - const versionNo = $(this).find('input[name="versionNo"]').val(); - const asfCovKey = $('#asfCovEditForm').find('input[name="cdsKey"]').val(); +// $(function(){ +// const searchFormBoat = $("#pressurizedN") +// if(searchFormBoat.val()!==""){ +// searchFormBoat.find("."+$("#pressurizedYn").val()).show(); +// searchFormBoat.removeAttr("disabled"); +// } +// +// }); +// +// $(document).on('change', '#pressurizedYn', function (){ +// const searchFormBoat = $("#pressurizedN") +// searchFormBoat.find("option").hide() +// if(this.value !== ""){ +// searchFormBoat.removeAttr("disabled") +// searchFormBoat.find("."+this.value).show(); +// }else{ +// searchFormBoat.attr("disabled", "disabled") +// } +// }) + +$(document).on('click', '.versionInfoTr', function (){ + $(this).find(".versionNo").prop('checked', true); + const versionNo = $(this).find(".versionNo").val(); + const asfCovKey = $(this).find(".asfCovKey").val(); getHistoryDetail(versionNo, asfCovKey); }); @@ -235,32 +254,12 @@ function getHistoryDetail(versionNo, asfCovKey){ url: '/faStatistics/asfCovHistoryDetail', data: { versionNo : versionNo, - asfCovKe : asfCovKey + asfCovKey : asfCovKey }, type: 'GET', dataType:"html", success: function(html){ - $("#historyDetailDiv").empty().append(html); - }, - error:function(e){ - ajaxErrorAction(e); - } - }); -} - -$(document).on('click', '#history-tab', function (){ - getHistoryViewModal($('#asfCovEditForm').find('input[name="asfCovKey"]').val()); -}); - -function getHistoryViewModal(asfCovKey){ - $.ajax({ - url: '/faStatistics/asfCovHistoryViewModal', - data: {asfCovKey: asfCovKey}, - type: 'GET', - dataType:"html", - success: function(html){ - $("#asfCovViewModalContent").empty().append(html) - $("#asfCovViewModal").modal('show'); + $("#asfcovVersionInfoDiv").empty().append(html); }, error:function(e){ ajaxErrorAction(e); @@ -271,3 +270,4 @@ function getHistoryViewModal(asfCovKey){ + 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/faStatistics/asfCov/asfCov.html b/src/main/resources/templates/faStatistics/asfCov/asfCov.html index c76788fe..721d220b 100644 --- a/src/main/resources/templates/faStatistics/asfCov/asfCov.html +++ b/src/main/resources/templates/faStatistics/asfCov/asfCov.html @@ -112,9 +112,9 @@ - - - + + + @@ -130,14 +130,19 @@ - - - + + + + + + + + - + diff --git a/src/main/resources/templates/faStatistics/asfCov/asfCovEditModal.html b/src/main/resources/templates/faStatistics/asfCov/asfCovEditModal.html index 984cdf7a..ebd4cda7 100644 --- a/src/main/resources/templates/faStatistics/asfCov/asfCovEditModal.html +++ b/src/main/resources/templates/faStatistics/asfCov/asfCovEditModal.html @@ -78,7 +78,7 @@ - + @@ -97,29 +97,29 @@
- +
- +
- +
-
+
diff --git a/src/main/resources/templates/faStatistics/asfCov/asfCovHistoryDetail.html b/src/main/resources/templates/faStatistics/asfCov/asfCovHistoryDetail.html index fee29b43..ffb9e688 100644 --- a/src/main/resources/templates/faStatistics/asfCov/asfCovHistoryDetail.html +++ b/src/main/resources/templates/faStatistics/asfCov/asfCovHistoryDetail.html @@ -1,69 +1,91 @@ -
- 나포정보 -
-
- -
- + +
+ +
+ +
+ +
+
+ +
+
-
-
- -
- -
-
- -
- -
- -
- -
- -
-
-
- -
- + + + - - + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ +
-
- - - - - - - \ No newline at end of file diff --git a/src/main/resources/templates/faStatistics/asfCov/asfCovHistoryViewModal.html b/src/main/resources/templates/faStatistics/asfCov/asfCovHistoryViewModal.html index fdb76676..e69de29b 100644 --- a/src/main/resources/templates/faStatistics/asfCov/asfCovHistoryViewModal.html +++ b/src/main/resources/templates/faStatistics/asfCov/asfCovHistoryViewModal.html @@ -1,201 +0,0 @@ - - - - - - - -
-
- -
-
- - \ No newline at end of file diff --git a/src/main/resources/templates/faStatistics/asfCov/asfCovViewModal.html b/src/main/resources/templates/faStatistics/asfCov/asfCovViewModal.html index cd49e5ae..efa80a1e 100644 --- a/src/main/resources/templates/faStatistics/asfCov/asfCovViewModal.html +++ b/src/main/resources/templates/faStatistics/asfCov/asfCovViewModal.html @@ -1,182 +1,130 @@ -