From 0dca48e62f053d2fa725649ee2842412a9b4f476 Mon Sep 17 00:00:00 2001
From: wyu <kknd09321@nate.com>
Date: 목, 06 1월 2022 11:42:18 +0900
Subject: [PATCH] Merge branch 'master' of http://192.168.0.25:9001/r/owl-kisa

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java    |   47 ++++-
 src/main/java/kr/wisestone/owl/vo/IssueVo.java                       |   74 +++++++++
 src/main/java/kr/wisestone/owl/web/controller/GanttController.java   |    5 
 src/main/resources/mybatis/query-template/issueRelation-template.xml |   50 ++++++
 src/main/java/kr/wisestone/owl/service/impl/GanttServiceImpl.java    |    4 
 src/main/java/kr/wisestone/owl/repository/IssueRepository.java       |    5 
 src/main/java/kr/wisestone/owl/service/GanttService.java             |    2 
 src/main/webapp/scripts/app/issue/issueDetail.controller.js          |   67 +++++++-
 src/main/java/kr/wisestone/owl/vo/PageVo.java                        |   62 +++++++
 src/main/java/kr/wisestone/owl/constant/Constants.java               |    2 
 src/main/java/kr/wisestone/owl/mapper/IssueRelationMapper.java       |   25 +++
 src/main/java/kr/wisestone/owl/service/IssueService.java             |    2 
 src/main/webapp/scripts/components/utils/resource.provider.js        |    8 +
 src/main/java/kr/wisestone/owl/web/controller/IssueController.java   |    5 
 src/main/webapp/views/issue/issueDetail.html                         |   66 ++++++++
 src/main/java/kr/wisestone/owl/util/PageUtil.java                    |   20 ++
 16 files changed, 414 insertions(+), 30 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/constant/Constants.java b/src/main/java/kr/wisestone/owl/constant/Constants.java
index da9550e..3266bde 100644
--- a/src/main/java/kr/wisestone/owl/constant/Constants.java
+++ b/src/main/java/kr/wisestone/owl/constant/Constants.java
@@ -5,6 +5,8 @@
  */
 public class Constants {
     public static final String REQ_KEY_PAGE_VO = "page";
+    public static final String REQ_KEY_RELATION_ISSUE_PAGE_VO = "relPage";
+    public static final String REQ_KEY_DOWN_ISSUE_PAGE_VO = "downPage";
     public static final String REQ_KEY_CONTENT = "content";
     public static final String RES_KEY_MESSAGE = "message";
     public static final String RES_KEY_MSG_FAIL = "fail";
diff --git a/src/main/java/kr/wisestone/owl/mapper/IssueRelationMapper.java b/src/main/java/kr/wisestone/owl/mapper/IssueRelationMapper.java
new file mode 100644
index 0000000..ee1dfb0
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/mapper/IssueRelationMapper.java
@@ -0,0 +1,25 @@
+package kr.wisestone.owl.mapper;
+
+import kr.wisestone.owl.domain.IssueRelation;
+import kr.wisestone.owl.vo.IssueVo;
+import kr.wisestone.owl.web.condition.IssueCondition;
+import kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition;
+import kr.wisestone.owl.web.condition.IssueTypeCondition;
+import kr.wisestone.owl.web.form.IssueForm;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by wisestone on 2018-01-17.
+ */
+@Repository
+public interface IssueRelationMapper {
+    List<Map<String, Object>> findByIssueId(IssueVo issueVo);
+
+    Long count(IssueVo issueVo);
+}
+
diff --git a/src/main/java/kr/wisestone/owl/repository/IssueRepository.java b/src/main/java/kr/wisestone/owl/repository/IssueRepository.java
index c5ce0e5..eaeb137 100644
--- a/src/main/java/kr/wisestone/owl/repository/IssueRepository.java
+++ b/src/main/java/kr/wisestone/owl/repository/IssueRepository.java
@@ -1,6 +1,9 @@
 package kr.wisestone.owl.repository;
 
 import kr.wisestone.owl.domain.Issue;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.repository.query.Param;
 
@@ -8,4 +11,6 @@
 
 public interface IssueRepository extends JpaRepository<Issue, Long> {
     List<Issue> findByParentIssueId(@Param("parentIssueId") Long parentIssueId);
+
+    Page<Issue> findByParentIssueId(@Param("parentIssueId") Long parentIssueId, Pageable pageable);
 }
diff --git a/src/main/java/kr/wisestone/owl/service/GanttService.java b/src/main/java/kr/wisestone/owl/service/GanttService.java
index ae3e0f4..8172c36 100644
--- a/src/main/java/kr/wisestone/owl/service/GanttService.java
+++ b/src/main/java/kr/wisestone/owl/service/GanttService.java
@@ -28,7 +28,7 @@
     List<IssueVo> findIssue(Map<String, Object> resJsonData,
                             ProjectCondition projectCondition, Pageable pageable);
 
-    void detailIssue(Map<String, Object> resJsonData, IssueCondition issueCondition);
+    void detailIssue(Map<String, Object> resJsonData, IssueCondition issueCondition, Pageable relPageable, Pageable downPageable);
 
     Issue modifyIssue(IssueForm issueForm, List<MultipartFile> files);
 
diff --git a/src/main/java/kr/wisestone/owl/service/IssueService.java b/src/main/java/kr/wisestone/owl/service/IssueService.java
index 1221d84..c47ce15 100644
--- a/src/main/java/kr/wisestone/owl/service/IssueService.java
+++ b/src/main/java/kr/wisestone/owl/service/IssueService.java
@@ -56,7 +56,7 @@
     List<IssueVo> findChartIssue(Map<String, Object> resJsonData,
                                  ProjectCondition condition, Pageable pageable);
 
-    void detailIssue(Map<String, Object> resJsonData, IssueCondition issueCondition);
+    void detailIssue(Map<String, Object> resJsonData, IssueCondition issueCondition, Pageable relPageable, Pageable downPageable);
 
     Issue modifyIssue(IssueForm issueForm, List<MultipartFile> files);
 
diff --git a/src/main/java/kr/wisestone/owl/service/impl/GanttServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/GanttServiceImpl.java
index 5abe8c5..602e6e9 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/GanttServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/GanttServiceImpl.java
@@ -95,8 +95,8 @@
     //  �씠�뒋 �긽�꽭 �젙蹂대�� 議고쉶�븳�떎.
     @Override
     @Transactional(readOnly = true)
-    public void detailIssue(Map<String, Object> resJsonData, IssueCondition issueCondition) {
-        issueService.detailIssue(resJsonData, issueCondition);
+    public void detailIssue(Map<String, Object> resJsonData, IssueCondition issueCondition, Pageable relPageable, Pageable downPageable) {
+        issueService.detailIssue(resJsonData, issueCondition, relPageable, downPageable);
     }
 
     //  �씠�뒋瑜� �닔�젙�븳�떎.
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
index 05f35c1..7be00d2 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -14,6 +14,7 @@
 import kr.wisestone.owl.exception.OwlRuntimeException;
 import kr.wisestone.owl.mapper.DepartmentMapper;
 import kr.wisestone.owl.mapper.IssueMapper;
+import kr.wisestone.owl.mapper.IssueRelationMapper;
 import kr.wisestone.owl.mapper.ProjectMapper;
 import kr.wisestone.owl.repository.IssueRelationRepository;
 import kr.wisestone.owl.repository.IssueRepository;
@@ -33,6 +34,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.messaging.simp.SimpMessagingTemplate;
@@ -194,6 +197,9 @@
 
     @Autowired
     private WorkflowDepartmentRepository workflowDepartmentRepository;
+
+    @Autowired
+    private IssueRelationMapper issueRelationMapper;
 
     @Override
     protected JpaRepository<Issue, Long> getRepository() {
@@ -1466,13 +1472,19 @@
     //  �씠�뒋 �긽�꽭 �젙蹂대�� 議고쉶�븳�떎.
     @Override
     @Transactional(readOnly = true)
-    public void detailIssue(Map<String, Object> resJsonData, IssueCondition issueCondition) {
+    public void detailIssue(Map<String, Object> resJsonData, IssueCondition issueCondition, Pageable relPageable, Pageable downPageable) {
         IssueVo issueVo = new IssueVo();
 
         if (issueCondition.getId() != null) {
             Issue issue = this.getIssue(issueCondition.getId());
             issueVo = ConvertUtil.copyProperties(issue, IssueVo.class);
             User user = this.webAppUtil.getLoginUserObject();
+
+            issueVo.setRelPage(relPageable.getPageNumber() * relPageable.getPageSize());
+            issueVo.setRelPageSize(relPageable.getPageSize());
+
+            issueVo.setDownPage(downPageable.getPageNumber() * downPageable.getPageSize());
+            issueVo.setDownPageSize(downPageable.getPageSize());
 
             switch (issueCondition.getDeep()) {
                 case "01": //  �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭,  �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦遺��꽌, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� �뀑�똿�븳�떎.
@@ -1489,7 +1501,6 @@
                     this.setIssueCustomFields(issue, issueVo);  //  �궗�슜�옄 �젙�쓽 �븘�뱶 媛� �젙蹂� �뀑�똿
                     this.setRelationIssue(issue, issueVo);        //�뿰愿� �씪媛� �뀑�똿
                     this.setDownIssues(issue, issueVo); //�븯�쐞 �씠�뒋 �꽭�똿
-
                     break;
 
                 case "02": //  �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭,  �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂�, �뙎湲�, 湲곕줉�쓣 �뀑�똿�븳�떎.
@@ -1499,11 +1510,19 @@
                     break;
             }
         }
+        Long relTotalCount = issueVo.getRelTotalCount();
+        int relTotalPage = issueVo.getRelTotalPage();
 
+        Long downTotalCount = issueVo.getDownTotalCount();
+        int downTotalPage = issueVo.getDownTotalPage();
         //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
         log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_DETAIL));
 
         resJsonData.put(Constants.RES_KEY_CONTENTS, issueVo);
+        resJsonData.put(Constants.REQ_KEY_RELATION_ISSUE_PAGE_VO, new ResPage(relPageable.getPageNumber(), relPageable.getPageSize(),
+                relTotalPage, relTotalCount));
+        resJsonData.put(Constants.REQ_KEY_DOWN_ISSUE_PAGE_VO, new ResPage(downPageable.getPageNumber(), downPageable.getPageSize(),
+                downTotalPage, downTotalCount));
     }
 
     // �뀒�씠釉� �꽕�젙 �뀑�똿
@@ -1528,8 +1547,13 @@
 
     // �븯�쐞 �씠�뒋 �젙蹂대�� �뀑�똿�븳�떎
     private void setDownIssues(Issue issue, IssueVo issueVo) {
-        List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId());
-        if(downIssues != null && downIssues.size()>0){
+        //List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId());
+        int startPage = (int) Math.floor(issueVo.getDownPage()/issueVo.getDownPageSize());
+        Pageable pageable = PageRequest.of(startPage, issueVo.getDownPageSize());
+        Page<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId(), pageable);
+        issueVo.setDownTotalPage(downIssues.getTotalPages());
+        issueVo.setDownTotalCount(downIssues.getTotalElements());
+        if(downIssues != null){
             List<IssueVo> resultList = new ArrayList<>();
             for(Issue downIssue : downIssues){
                 IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
@@ -1629,13 +1653,18 @@
 
     // �뿰愿� �씠�뒋 �젙蹂대�� �뀑�똿�븳�떎
     private void setRelationIssue(Issue issue, IssueVo issueVo) {
-        Set<IssueRelation> issueRelations = issue.getIssueRelations();
-        if (issue != null && issueVo != null && issueRelations.size() > 0) {
-            for (IssueRelation issueRelation : issueRelations) {
-                IssueRelationVo issueRelationVo = ConvertUtil.copyProperties(issueRelation, IssueRelationVo.class);
+        //Set<IssueRelation> issueRelations = issue.getIssueRelations();
+        List<Map<String, Object>> results = this.issueRelationMapper.findByIssueId(issueVo);
+        Long totalCount = this.issueRelationMapper.count(issueVo);
 
-                Issue relationIssue = issueRelation.getRelationIssue();
+        int totalPage = (int) Math.ceil((totalCount - 1) / issueVo.getRelPageSize()) + 1;
+        issueVo.setRelTotalPage(totalPage);
+        issueVo.setRelTotalCount(totalCount);
 
+        if (issue != null && issueVo != null && results.size() > 0) {
+            for (Map<String, Object> result : results) {
+                IssueRelationVo issueRelationVo = ConvertUtil.convertMapToClass(result, IssueRelationVo.class);
+                Issue relationIssue = this.findOne(issueRelationVo.getId());
                 IssueVo relIssueVo = ConvertUtil.copyProperties(relationIssue, IssueVo.class);
                 Project project = this.projectService.getProject(relationIssue.getProject().getId());
                 relIssueVo.setProjectId(project.getId());
diff --git a/src/main/java/kr/wisestone/owl/util/PageUtil.java b/src/main/java/kr/wisestone/owl/util/PageUtil.java
index 6d78294..ee91b1b 100644
--- a/src/main/java/kr/wisestone/owl/util/PageUtil.java
+++ b/src/main/java/kr/wisestone/owl/util/PageUtil.java
@@ -28,17 +28,31 @@
         }
 
         if (pageVo.getPage() == null || pageVo.getPage() < 0) {
-            throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.PAGE_NEGATIVE_OR_NULL));
+            if (pageVo.getRelPage() == null || pageVo.getRelPage() < 0
+                    || pageVo.getDownPage() == null || pageVo.getDownPage() < 0) {
+                throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.PAGE_NEGATIVE_OR_NULL));
+            }
         }
 
         if (pageVo.getPageSize() == null || pageVo.getPageSize() < 0) {
-            throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.PAGE_SIZE_NEGATIVE_OR_NULL));
+            if (pageVo.getRelPageSize() == null || pageVo.getRelPageSize() < 0
+                    || pageVo.getDownPageSize() == null || pageVo.getDownPageSize() < 0) {
+                throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.PAGE_SIZE_NEGATIVE_OR_NULL));
+            }
         }
     }
 
 	public Pageable convertPageable(PageVo pageVo) {
         return PageRequest.of(pageVo.getPage(), pageVo.getPageSize());
 	}
+
+    public Pageable convertRelPageable(PageVo pageVo) {
+        return PageRequest.of(pageVo.getRelPage(), pageVo.getRelPageSize());
+    }
+
+    public Pageable convertDownPageable(PageVo pageVo) {
+        return PageRequest.of(pageVo.getDownPage(), pageVo.getDownPageSize());
+    }
 
 	public Pageable getDefaultPageable() {
 		return PageRequest.of(0, 300);
@@ -49,7 +63,7 @@
 	}
 
 	public PageVo getDefaultPageVo() {
-		return new PageVo(0, 300);
+		return new PageVo(0, 300,0, 300, 0, 300);
 	}
 
 	public static Pageable applySort(Pageable page, String field, Sort.Direction direction) {
diff --git a/src/main/java/kr/wisestone/owl/vo/IssueVo.java b/src/main/java/kr/wisestone/owl/vo/IssueVo.java
index e7b1957..50a4822 100644
--- a/src/main/java/kr/wisestone/owl/vo/IssueVo.java
+++ b/src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -71,6 +71,16 @@
     private String ispName;
     private String hostingName;
 
+    private int relPage;
+    private int relPageSize;
+    private int relTotalPage;
+    private Long relTotalCount;
+
+    private int downPage;
+    private int downPageSize;
+    private int downTotalPage;
+    private Long downTotalCount;
+
     public IssueVo(){}
 
     public Long getId() {
@@ -558,4 +568,68 @@
     public void setHostingName(String hostingName) {
         this.hostingName = hostingName;
     }
+
+    public int getRelPageSize() {
+        return relPageSize;
+    }
+
+    public void setRelPageSize(int relPageSize) {
+        this.relPageSize = relPageSize;
+    }
+
+    public int getDownPageSize() {
+        return downPageSize;
+    }
+
+    public void setDownPageSize(int downPageSize) {
+        this.downPageSize = downPageSize;
+    }
+
+    public int getRelPage() {
+        return relPage;
+    }
+
+    public void setRelPage(int relPage) {
+        this.relPage = relPage;
+    }
+
+    public int getDownPage() {
+        return downPage;
+    }
+
+    public void setDownPage(int downPage) {
+        this.downPage = downPage;
+    }
+
+    public int getRelTotalPage() {
+        return relTotalPage;
+    }
+
+    public void setRelTotalPage(int relTotalPage) {
+        this.relTotalPage = relTotalPage;
+    }
+
+    public int getDownTotalPage() {
+        return downTotalPage;
+    }
+
+    public void setDownTotalPage(int downTotalPage) {
+        this.downTotalPage = downTotalPage;
+    }
+
+    public Long getRelTotalCount() {
+        return relTotalCount;
+    }
+
+    public void setRelTotalCount(Long relTotalCount) {
+        this.relTotalCount = relTotalCount;
+    }
+
+    public Long getDownTotalCount() {
+        return downTotalCount;
+    }
+
+    public void setDownTotalCount(Long downTotalCount) {
+        this.downTotalCount = downTotalCount;
+    }
 }
diff --git a/src/main/java/kr/wisestone/owl/vo/PageVo.java b/src/main/java/kr/wisestone/owl/vo/PageVo.java
index f699747..8a7305a 100644
--- a/src/main/java/kr/wisestone/owl/vo/PageVo.java
+++ b/src/main/java/kr/wisestone/owl/vo/PageVo.java
@@ -5,12 +5,24 @@
     private Integer pageSize;
     private Integer totalCount;
 
+    private Integer relPage;
+    private Integer relPageSize;
+    private Integer relTotalCount;
+
+    private Integer downPage;
+    private Integer downPageSize;
+    private Integer downTotalCount;
+
     public PageVo() {
     }
 
-    public PageVo(int page, int pageSize) {
+    public PageVo(int page, int pageSize, int relPage, int relPageSize, int downPage, int downPageSize) {
         this.page = page;
         this.pageSize = pageSize;
+        this.relPage = relPage;
+        this.relPageSize = relPageSize;
+        this.downPage = downPage;
+        this.downPageSize = downPageSize;
     }
 
     public Integer getPage() {
@@ -36,4 +48,52 @@
     public void setTotalCount(Integer totalCount) {
         this.totalCount = totalCount;
     }
+
+    public Integer getRelPage() {
+        return relPage;
+    }
+
+    public void setRelPage(Integer relPage) {
+        this.relPage = relPage;
+    }
+
+    public Integer getRelPageSize() {
+        return relPageSize;
+    }
+
+    public void setRelPageSize(Integer relPageSize) {
+        this.relPageSize = relPageSize;
+    }
+
+    public Integer getRelTotalCount() {
+        return relTotalCount;
+    }
+
+    public void setRelTotalCount(Integer relTotalCount) {
+        this.relTotalCount = relTotalCount;
+    }
+
+    public Integer getDownPage() {
+        return downPage;
+    }
+
+    public void setDownPage(Integer downPage) {
+        this.downPage = downPage;
+    }
+
+    public Integer getDownPageSize() {
+        return downPageSize;
+    }
+
+    public void setDownPageSize(Integer downPageSize) {
+        this.downPageSize = downPageSize;
+    }
+
+    public Integer getDownTotalCount() {
+        return downTotalCount;
+    }
+
+    public void setDownTotalCount(Integer downTotalCount) {
+        this.downTotalCount = downTotalCount;
+    }
 }
diff --git a/src/main/java/kr/wisestone/owl/web/controller/GanttController.java b/src/main/java/kr/wisestone/owl/web/controller/GanttController.java
index f3eaaa1..015882c 100644
--- a/src/main/java/kr/wisestone/owl/web/controller/GanttController.java
+++ b/src/main/java/kr/wisestone/owl/web/controller/GanttController.java
@@ -82,7 +82,10 @@
     @ResponseBody
     Map<String, Object> detail(@RequestBody Map<String, Map<String, Object>> params) {
         Map<String, Object> resJsonData = new HashMap<>();
-        this.ganttServiceService.detailIssue(resJsonData, IssueCondition.make(params.get(Constants.REQ_KEY_CONTENT)));
+        Pageable relPageable = this.pageUtil.convertRelPageable(this.getPageVo(params));
+        Pageable downPageable = this.pageUtil.convertDownPageable(this.getPageVo(params));
+
+        this.ganttServiceService.detailIssue(resJsonData, IssueCondition.make(params.get(Constants.REQ_KEY_CONTENT)), relPageable, downPageable);
 
         return this.setSuccessMessage(resJsonData);
     }
diff --git a/src/main/java/kr/wisestone/owl/web/controller/IssueController.java b/src/main/java/kr/wisestone/owl/web/controller/IssueController.java
index 22fa9f6..ff92657 100644
--- a/src/main/java/kr/wisestone/owl/web/controller/IssueController.java
+++ b/src/main/java/kr/wisestone/owl/web/controller/IssueController.java
@@ -127,7 +127,10 @@
     @ResponseBody
     Map<String, Object> detail(@RequestBody Map<String, Map<String, Object>> params) {
         Map<String, Object> resJsonData = new HashMap<>();
-        this.issueService.detailIssue(resJsonData, IssueCondition.make(params.get(Constants.REQ_KEY_CONTENT)));
+        Pageable relPageable = this.pageUtil.convertRelPageable(this.getPageVo(params));
+        Pageable downPageable = this.pageUtil.convertDownPageable(this.getPageVo(params));
+
+        this.issueService.detailIssue(resJsonData, IssueCondition.make(params.get(Constants.REQ_KEY_CONTENT)), relPageable, downPageable);
 
         return this.setSuccessMessage(resJsonData);
     }
diff --git a/src/main/resources/mybatis/query-template/issueRelation-template.xml b/src/main/resources/mybatis/query-template/issueRelation-template.xml
new file mode 100644
index 0000000..ced98ed
--- /dev/null
+++ b/src/main/resources/mybatis/query-template/issueRelation-template.xml
@@ -0,0 +1,50 @@
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="kr.wisestone.owl.mapper.IssueRelationMapper">
+
+    <resultMap id="issueResultMap" type="kr.wisestone.owl.domain.IssueRelation">
+        <result property="id" column="id" />
+        <result property="relationIssueType" column="relationIssueType" />
+        <result property="registerId" column="registerId" />
+        <result property="registerDate" column="registerDate" />
+        <result property="modifyId" column="modifyId" />
+        <result property="modifyDate" column="modifyDate" />
+        <association property="issue" javaType="kr.wisestone.owl.domain.Issue">
+            <id property="id" column="issueId" />
+        </association>
+        <association property="relationIssue" javaType="kr.wisestone.owl.domain.Issue">
+            <result property="id" column="relationIssueId" />
+        </association>
+    </resultMap>
+
+    <select id="findByIssueId" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.vo.IssueVo">
+        SELECT
+        id AS id,
+        issue_id AS issueId,
+        relation_issue_id AS relationIssueId,
+        relation_issue_type AS relationIssueType,
+        register_id AS registerId,
+        register_date AS registerDate,
+        modify_id AS modifyId,
+        modify_date AS modifyDate
+        FROM issue_relation
+        WHERE 1=1
+        <if test="id != null and !id.equals('')">
+            AND issue_id = #{id}
+        </if>
+        <if test="relPage != null and !relPage.equals('') and relPageSize != null and !relPageSize.equals('')">
+            limit #{relPageSize} offset #{relPage};
+        </if>
+    </select>
+
+    <select id="count" resultType="java.lang.Long" parameterType="kr.wisestone.owl.vo.IssueVo">
+        SELECT
+        COUNT(DISTINCT id)
+        FROM issue_relation
+        WHERE 1=1
+        <if test="id != null and !id.equals('')">
+            AND issue_id = #{id}
+        </if>
+    </select>
+</mapper>
diff --git a/src/main/webapp/scripts/app/issue/issueDetail.controller.js b/src/main/webapp/scripts/app/issue/issueDetail.controller.js
index 865d992..dab59ac 100644
--- a/src/main/webapp/scripts/app/issue/issueDetail.controller.js
+++ b/src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -53,6 +53,7 @@
                 $scope.fn.issueBack = issueBack;
                 $scope.fn.removeRelationIssue = removeRelationIssue;
                 $scope.fn.removeDownIssue = removeDownIssue;
+                $scope.fn.changeDetailPageRowCount = changeDetailPageRowCount;    //  �럹�씠吏� 蹂�寃�
                 $scope.fn.sendCommonMail = sendCommonMail;
 
                 //  �씠�뒋 紐⑸줉 而⑦듃濡ㅻ윭 vm, fn �긽�냽 以�
@@ -90,6 +91,18 @@
                     issueHostingVos : []
                 };
 
+                $scope.vm.responseData = {
+                    data : []
+                };
+
+                $scope.vm.page = {
+                    selectedPage : 0,
+                    selectedPageRowCount : String(10),
+                    selectedRelPage : 0,
+                    selectedRelPageRowCount : String(10),
+                    selectedDownPage : 0,
+                    selectedDownPageRowCount : String(10)
+                };
 
                 $scope.vm.issueNameDown = "";       // �꽑�깮�맂 �븯�쐞 �씪媛� �씠由�
                 $scope.vm.autoCompletePageDown = {
@@ -143,6 +156,11 @@
                     }
                 }
 
+                //  �럹�씠吏� 蹂�寃�
+                function changeDetailPageRowCount() {
+                    $scope.fn.getIssueDetail(0,0);
+                }
+
                 function onActivate() {
                     window.scroll(0,240);
                 }
@@ -151,7 +169,7 @@
 
                  // �씠�뒋 紐⑸줉 �뜲�씠�꽣 媛깆떊
                 $scope.$on("getIssueList", function () {
-                    $scope.fn.getIssueDetail();
+                    $scope.fn.getIssueDetail(0,0);
                 });
 
                 // �븯�쐞 �씠�뒋 �궘�젣
@@ -214,7 +232,7 @@
                                     $resourceProvider.getPageContent(0, 10))).then(function (result) {
 
                                     if (result.data.message.status === "success") {
-                                        $scope.fn.getIssueDetail();
+                                        $scope.fn.getIssueDetail(0,0);
                                     }
                                     else {
                                         SweetAlert.error($filter("translate")("issue.failedToIssueDeleteIssueDown"), result.data.message.message); // "�뿰愿��씪媛� �궘�젣 �떎�뙣"
@@ -287,7 +305,7 @@
                                     $resourceProvider.getPageContent(0, 10))).then(function (result) {
 
                                     if (result.data.message.status === "success") {
-                                        $scope.fn.getIssueDetail();
+                                        $scope.fn.getIssueDetail(0,0);
                                     }
                                     else {
                                         SweetAlert.error($filter("translate")("issue.failedToIssueDeleteIssueRelation"), result.data.message.message); // "�뿰愿��씪媛� �궘�젣 �떎�뙣"
@@ -713,7 +731,7 @@
                         $resourceProvider.getPageContent(0, 10))).then(function (result) {
 
                         if (result.data.message.status === "success") {
-                            $scope.fn.getIssueDetail();
+                            $scope.fn.getIssueDetail(0,0);
                         }
                         else {
                             SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueRelation"), result.data.message.message); // "�뿰愿��씪媛� �깮�꽦 �떎�뙣"
@@ -745,7 +763,7 @@
                         $resourceProvider.getPageContent(0, 10))).then(function (result) {
 
                         if (result.data.message.status === "success") {
-                            $scope.fn.getIssueDetail();
+                            $scope.fn.getIssueDetail(0,0);
                         }
                         else {
                             SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "�뿰愿��씪媛� �깮�꽦 �떎�뙣"
@@ -771,7 +789,7 @@
                 //  });
 
                 $scope.$on("getIssueDetail", function (event, args) {
-                    $scope.fn.getIssueDetail();
+                    $scope.fn.getIssueDetail(0,0);
                 });
 
                 $scope.$watch(function() {
@@ -779,7 +797,7 @@
                 }, function() {
                     if ($rootScope.currentDetailIssueId != null) {
                         $scope.vm.viewer.id = $rootScope.currentDetailIssueId;
-                        $scope.fn.getIssueDetail();
+                        $scope.fn.getIssueDetail(0,0);
                     }
                 }, true);
 
@@ -969,19 +987,50 @@
                 }
 
                 //  �씠�뒋 �긽�꽭 �젙蹂� 議고쉶
-                function getIssueDetail() {
+                function getIssueDetail(selectedRelPage, selectedDownPage) {
                     $rootScope.spinner = true;
+                    if (selectedRelPage < 0) {
+                        selectedRelPage = 0;
+                    }
+                    if (selectedDownPage < 0) {
+                        selectedDownPage = 0;
+                    }
+                    //  �쁽�옱 �럹�씠吏� �젙蹂�
+                    var currentRelPage = 0;
+                    var currentDownPage = 0;
+
+                    //  荑좏궎�뿉 �꽑�깮�븳 �럹�씠吏� �젙蹂닿� �뾾�쑝硫� 湲곕낯 �럹�씠吏� �젙蹂� 0 �쓣 ���옣
+                    if (angular.isUndefined(selectedRelPage) || selectedRelPage === "") {
+                        currentRelPage = $scope.vm.page.selectedRelPage;
+                    }
+                    else {
+                        currentRelPage = selectedRelPage;
+                    }
+
+                    if (angular.isUndefined(selectedDownPage) || selectedDownPage === "") {
+                        currentDownPage = $scope.vm.page.selectedDownPage;
+                    }
+                    else {
+                        currentDownPage = selectedDownPage;
+                    }
+
                     //  珥덇린�솕 �빐�빞�븷 �븷紐⑹쓣 吏��젙�븯�뿬 �떎瑜� �씠�뒋瑜� �겢由��븷 �븣 珥덇린�솕�빐以��떎.
                     $scope.fn.initReload();
                     // $scope.fn.getRelTableConfigs();
                     // $scope.fn.getDownTableConfigs();
                     Issue.detail($resourceProvider.getContent(
                         {id : $scope.vm.viewer.id, deep : "02"},
-                        $resourceProvider.getPageContent(0, 1))).then(function (result) {
+                        $resourceProvider.getSubPageContent(currentRelPage, $scope.vm.page.selectedRelPageRowCount
+                            , currentDownPage, $scope.vm.page.selectedDownPageRowCount))
+                        ).then(function (result) {
 
                         if (result.data.message.status === "success") {
                             if (angular.isDefined(result.data.data)) {
 
+                                $scope.vm.page.selectedRelPage = currentRelPage + 1;
+                                $scope.vm.page.selectedDownPage = currentDownPage + 1;
+                                $scope.vm.responseData = result.data;
+
                                 $scope.vm.viewer = angular.copy(result.data.data);
                                 //  �씠�뒋 �씠誘몄� 誘몃━ 蹂닿린 留뚮뱾湲�
                                 $scope.fn.makePreviewImages(result.data.data.attachedFileVos);
diff --git a/src/main/webapp/scripts/components/utils/resource.provider.js b/src/main/webapp/scripts/components/utils/resource.provider.js
index 680301f..cf788aa 100644
--- a/src/main/webapp/scripts/components/utils/resource.provider.js
+++ b/src/main/webapp/scripts/components/utils/resource.provider.js
@@ -21,6 +21,14 @@
                                     page: page,
                                     pageSize: pageSize
                                 };
+                            },
+                            getSubPageContent: function (relPage, relPageSize, downPage, downPageSize) {
+                                return {
+                                    relPage: relPage,
+                                    relPageSize: relPageSize,
+                                    downPage: downPage,
+                                    downPageSize: downPageSize
+                                };
                             }
                         }
                     }
diff --git a/src/main/webapp/views/issue/issueDetail.html b/src/main/webapp/views/issue/issueDetail.html
index e050dd6..a8621af 100644
--- a/src/main/webapp/views/issue/issueDetail.html
+++ b/src/main/webapp/views/issue/issueDetail.html
@@ -492,7 +492,23 @@
                     <!--<div class="col-md-1">
                         <button class="btn btn-darkgrey offset-10" ng-click="fn.addRelationIssueTableConfig()" type="button"><span translate="issue.settingTableDisplay">�뀒�씠釉� �몴�떆 �꽕�젙</span></button>
                     </div>-->
-                    <div class="btn-group offset-11">
+                    <div class="col-md-3 mt-2">
+                        <div class="dataTables_length">
+                            <label>
+                                <select name="relPageRow"
+                                        tabindex="-1"
+                                        class="form-control form-control-sm"
+                                        ng-change="fn.changeDetailPageRowCount()"
+                                        ng-model="vm.page.selectedRelPageRowCount">
+                                    <option value="10">10</option>
+                                    <option value="50">50</option>
+                                    <option value="100">100</option>
+                                </select> {{vm.page.selectedRelPage}}-{{vm.responseData.relPage.totalPage}} /
+                                {{vm.responseData.relPage.totalCount | number}}<span translate="common.few">嫄�</span>
+                            </label>
+                        </div>
+                    </div>
+                    <div class="btn-group" style="left: 975px; padding: 5px">
                         <button aria-expanded="false" aria-haspopup="true"
                                 tabindex="-1"
                                 class="btn btn-secondary dropdown-toggle"
@@ -546,6 +562,21 @@
                             </button>
                         </div>
                     </div>
+                    <div class="controls-below-table text-center">
+                        <ul uib-pagination
+                            boundary-links-numbes="true"
+                            items-per-page="vm.page.selectedRelPageRowCount"
+                            total-items="vm.responseData.relPage.totalCount"
+                            ng-model="vm.page.selectedRelPage"
+                            max-size="10"
+                            ng-click="fn.getIssueDetail(vm.page.selectedRelPage - 1, vm.page.selectedDownPage - 1)"
+                            class="pagination pagination-sm"
+                            previous-text="&lt;"
+                            next-text="&gt;"
+                            first-text=""
+                            last-text="">
+                        </ul>
+                    </div>
                 </div>
 
                 <div class="row mt-30">
@@ -561,7 +592,23 @@
                     <div class="col-sm-1">
                         <button class="btn btn-darkgrey offset-10"  ng-click="fn.addDownIssueTableConfig()" type="button"><span translate="issue.settingTableDisplay">�뀒�씠釉� �몴�떆 �꽕�젙</span></button>
                     </div>-->
-                    <div class="btn-group offset-11">
+                    <div class="col-md-5 mt-2">
+                        <div class="dataTables_length">
+                            <label>
+                                <select name="downPageRow"
+                                        tabindex="-1"
+                                        class="form-control form-control-sm"
+                                        ng-change="fn.changeDetailPageRowCount()"
+                                        ng-model="vm.page.selectedDownPageRowCount">
+                                    <option value="10">10</option>
+                                    <option value="50">50</option>
+                                    <option value="100">100</option>
+                                </select> {{vm.page.selectedDownPage}}-{{vm.responseData.downPage.totalPage}} /
+                                {{vm.responseData.downPage.totalCount | number}}<span translate="common.few">嫄�</span>
+                            </label>
+                        </div>
+                    </div>
+                    <div class="btn-group" style="left: 730px; padding: 5px">
                         <button aria-expanded="false" aria-haspopup="true"
                                 tabindex="-1"
                                 class="btn btn-secondary dropdown-toggle"
@@ -605,6 +652,21 @@
                             </button>
                         </div>
                     </div>
+                    <div class="controls-below-table text-center">
+                        <ul uib-pagination
+                            boundary-links-numbes="true"
+                            items-per-page="vm.page.selectedDownPageRowCount"
+                            total-items="vm.responseData.downPage.totalCount"
+                            ng-model="vm.page.selectedDownPage"
+                            max-size="10"
+                            ng-click="fn.getIssueDetail(vm.page.selectedRelPage - 1, vm.page.selectedDownPage - 1)"
+                            class="pagination pagination-sm"
+                            previous-text="&lt;"
+                            next-text="&gt;"
+                            first-text=""
+                            last-text="">
+                        </ul>
+                    </div>
                 </div>
 
                 <h6 class="todo-content-subheader mt-30" translate="common.content">�궡�슜</h6>

--
Gitblit v1.8.0