From a8a8d35b27df67e169c8b1aab45edec1c1b25eae Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 목, 02 12월 2021 21:48:04 +0900
Subject: [PATCH] - 이메일 실시간 발송 - 이슈 리스트에서 하위일감 개수 표시 - 이슈 리스트에서 하위 이슈는 안보이게

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java       |   41 ++++++++-
 src/main/java/kr/wisestone/owl/vo/IssueVo.java                          |    9 ++
 src/main/webapp/WEB-INF/i18n/mail_ko_KR.properties                      |    1 
 src/main/resources/mails/issueSendEmail.html                            |    8 +
 src/main/java/kr/wisestone/owl/service/impl/SystemEmailServiceImpl.java |   12 +++
 src/main/webapp/scripts/app/user/userModify.controller.js               |    1 
 src/main/resources/mails/issueAddEmail.html                             |    8 +
 src/main/java/kr/wisestone/owl/scheduler/Scheduler.java                 |    4 
 src/main/resources/mybatis/query-template/issue-template.xml            |    1 
 src/main/webapp/views/user/userModify.html                              |    3 
 src/main/resources/mails/issueRemoveEmail.html                          |    8 +
 src/main/resources/mails/issueSendEmailTemplate1.html                   |    8 +
 src/main/java/kr/wisestone/owl/service/ProjectRoleService.java          |    4 
 src/main/resources/mails/issueSendEmailTemplate3.html                   |    8 +
 src/main/webapp/scripts/app/issue/issueAddTableConfig.controller.js     |   14 ++-
 src/main/java/kr/wisestone/owl/service/impl/ProjectServiceImpl.java     |   81 ++++++++++++++++----
 src/main/java/kr/wisestone/owl/repository/UserDepartmentRepository.java |    2 
 src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java |   10 +-
 src/main/webapp/scripts/app/issue/issueList.controller.js               |    7 +
 src/main/resources/mails/issueSendEmailTemplate2.html                   |    8 +
 src/main/webapp/i18n/ko/global.json                                     |    1 
 21 files changed, 195 insertions(+), 44 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/repository/UserDepartmentRepository.java b/src/main/java/kr/wisestone/owl/repository/UserDepartmentRepository.java
index 58d22c3..77828bf 100644
--- a/src/main/java/kr/wisestone/owl/repository/UserDepartmentRepository.java
+++ b/src/main/java/kr/wisestone/owl/repository/UserDepartmentRepository.java
@@ -11,6 +11,8 @@
 public interface UserDepartmentRepository extends JpaRepository<UserDepartment, Long> {
     List<UserDepartment> findByUserId(Long userId);
 
+    List<UserDepartment> findByDepartmentId(Long departmentId);
+
     @Transactional
     void removeByUserId(@Param("userId") Long userId);
 }
diff --git a/src/main/java/kr/wisestone/owl/scheduler/Scheduler.java b/src/main/java/kr/wisestone/owl/scheduler/Scheduler.java
index e855cfc..c4e0163 100644
--- a/src/main/java/kr/wisestone/owl/scheduler/Scheduler.java
+++ b/src/main/java/kr/wisestone/owl/scheduler/Scheduler.java
@@ -89,8 +89,8 @@
         this.systemEmailService.reservationSendEmail();
     }
 
-    //  �씠硫붿씪 �떎�떆媛� 諛쒖넚 - 10珥덈쭏�떎 �떎�뻾
-    @Scheduled(fixedDelay = 10000)
+    //  �씠硫붿씪 �떎�떆媛� 諛쒖넚 - 1遺꾨쭏�떎 �떎�뻾
+    @Scheduled(cron = "0 * * * * *")
     public void realTimeEmailSystem() {
         //  �떎�떆媛� �씠硫붿씪 諛쒖넚
         this.systemEmailService.realTimeSendEmail();
diff --git a/src/main/java/kr/wisestone/owl/service/ProjectRoleService.java b/src/main/java/kr/wisestone/owl/service/ProjectRoleService.java
index c7d13d0..11f5c03 100644
--- a/src/main/java/kr/wisestone/owl/service/ProjectRoleService.java
+++ b/src/main/java/kr/wisestone/owl/service/ProjectRoleService.java
@@ -10,8 +10,8 @@
 
 public interface ProjectRoleService extends AbstractService<ProjectRole, Long, JpaRepository<ProjectRole, Long>>{
 
-    //void addDefaultProjectRole(Project project, List<User> managers, List<User> users);
-    void addDefaultProjectRole(Project project, List<User> managers, List<Department> departments);
+    void addDefaultProjectRoleUser(Project project, List<User> managers, List<User> users);
+    void addDefaultProjectRoleDepartment(Project project, List<User> managers, List<Department> departments);
 
     ProjectRole findByProjectIdAndRoleType(Long projectId, String roleType);
 }
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 934520a..75a9cfb 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -373,7 +373,6 @@
         projectRoleUserMap.put("statuses", Lists.newArrayList("02"));   //  愿�由ъ옄 議고쉶
         //  愿�由ъ옄 �젙蹂� �뀑�똿
         List<Map<String, Object>> projectRoleUsers = this.projectRoleUserService.findProjectRoleUser(projectRoleUserMap);
-
         if (projectRoleUsers != null && !projectRoleUsers.isEmpty()) {
             for (Map<String, Object> projectRoleUser : projectRoleUsers) {
                 UserVo userVo = ConvertUtil.convertMapToClass(projectRoleUser, UserVo.class);
@@ -407,7 +406,7 @@
             departsBuilder.append(issueDepartment.getDepartment().getDepartmentName());
             departsBuilder.append("\n");
         }
-        issueMap.put("departsBuilder", departsBuilder.toString());
+        issueMap.put("departments", departsBuilder.toString());
 
         //  湲곌컙
         if (!StringUtils.isEmpty(issue.getStartDate())) {
@@ -558,6 +557,8 @@
         //  Map �뿉 �엳�뒗 �뜲�씠�꽣瑜� IssueVo �뜲�씠�꽣濡� 蹂��솚�븳�떎.
         this.setMapToIssueVo(results, issueVos, issueCondition);
 
+        this.setCountDownIssues(results, issueVos);
+
         resJsonData.put(Constants.RES_KEY_CONTENTS, issueVos);
         resJsonData.put(Constants.REQ_KEY_PAGE_VO, new ResPage(pageable.getPageNumber(), pageable.getPageSize(),
                 totalPage, totalCount));
@@ -565,6 +566,27 @@
         //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
         log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_FIND));
         return issueVos;
+    }
+
+    private void setCountDownIssues(List<Map<String, Object>> results, List<IssueVo> issueVos) {
+        for (Map<String, Object> result : results){
+            List<Issue> downIssues = this.issueRepository.findByParentIssueId((Long) result.get("id")); //�븯�쐞�씠�뒋 媛��졇�삤湲�
+            if(downIssues != null && downIssues.size() > 0){ //�긽�쐞�씠�뒋 媛�吏�怨� �엳�뒗 �븷�뱾�씠 �엳�쑝硫�
+                for(Issue downIssue : downIssues){
+                    Long parentIssueId = downIssue.getParentIssue().getId();
+                    int downIssueCount = 1;
+                    Issue parentIssue = this.getIssue(parentIssueId);
+                    IssueVo parentIssueVo = ConvertUtil.copyProperties(parentIssue, IssueVo.class);
+                    parentIssueVo.setDownIssueCount(downIssueCount);
+
+                    for(IssueVo issueVo : issueVos){
+                        if(issueVo.getId().equals(parentIssueVo.getId())){
+                            issueVo.setDownIssueCount(parentIssueVo.getDownIssueCount());
+                        }
+                    }
+                }
+            }
+        }
     }
 
     //  �씠�뒋 紐⑸줉�쓣 議고쉶�븳�떎(李⑦듃�슜 - �뿰愿��씪媛먰룷�븿)
@@ -669,6 +691,17 @@
     private void setMapToIssueVo(List<Map<String, Object>> results, List<IssueVo> issueVos, IssueCondition issueCondition) {
         for (Map<String, Object> result : results) {
             IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class);
+            /*Issue downIssue = this.getIssue((Long) result.get("id"));
+            if(downIssue.getParentIssue() != null){ //�긽�쐞 �씠�뒋媛� �엳�쑝硫�
+                Long parentIssueId = downIssue.getParentIssue().getId();
+
+                int downIssueCount = 1;
+                Issue parentIssue = this.getIssue(parentIssueId);
+                IssueVo parentIssueVo = ConvertUtil.copyProperties(parentIssue, IssueVo.class);
+                parentIssueVo.setDownIssueCount(downIssueCount);
+
+                issueVos.add(parentIssueVo);
+            }*/
             issueVos.add(issueVo);
             issueCondition.addIssueIds(String.valueOf(issueVo.getId()));
         }
@@ -1897,15 +1930,11 @@
                         result.put("customField_" + issueCustomFieldValueVo.getCustomFieldVo().getId().toString(), useValue + ", " + issueCustomFieldValueVo.getUseValue());
                     }
                 }
-
-                //�뾽泥�, ISP, �샇�뒪�똿 異붽�
-
                 results.add(result);
             } catch (Exception e) {
                 log.error("�뿊�� �떎�슫濡쒕뱶 �삤瑜� 諛쒖깮");
             }
         }
-
         return results;
     }
 
diff --git a/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java
index c36dc52..e62af13 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java
@@ -37,23 +37,23 @@
     }
 
     //  湲곕낯, 愿�由ъ옄 �봽濡쒖젥�듃 �뿭�븷�쓣 �깮�꽦�븳�떎.
-    /*@Override
+    @Override
     @Transactional
-    public void addDefaultProjectRole(Project project, List<User> managers, List<User> users) {
+    public void addDefaultProjectRoleUser(Project project, List<User> managers, List<User> users) {
         ProjectRole projectRole = this.addProjectRole(project, "湲곕낯 �봽濡쒖젥�듃 �뿭�븷", ProjectRole.TYPE_DEFAULT, Permission.ROLE_TYPE_PROJECT_JOIN);
         ProjectRole managerProjectRole = this.addProjectRole(project, "�봽濡쒖젥�듃 愿�由ъ옄 �뿭�븷", ProjectRole.TYPE_MANAGER, Permission.ROLE_TYPE_PROJECT_MANAGER);
         //  �봽濡쒖젥�듃 愿�由ъ옄 ���옣
         this.projectRoleAssociatedUser(managers, managerProjectRole);
         //  �봽濡쒖젥�듃 �씪諛� �궗�슜�옄 ���옣
-        //this.projectRoleAssociatedUser(users, projectRole);
+        this.projectRoleAssociatedUser(users, projectRole);
 
         this.projectRoleRepository.flush();
-    }*/
+    }
 
     //  �봽濡쒖젥�듃 �뿭�븷 �깮�꽦(愿�由ъ옄, �떞�떦遺��꽌)
     @Override
     @Transactional
-    public void addDefaultProjectRole(Project project, List<User> managers, List<Department> departments) {
+    public void addDefaultProjectRoleDepartment(Project project, List<User> managers, List<Department> departments) {
         ProjectRole projectRole = this.addProjectRole(project, "湲곕낯 �봽濡쒖젥�듃 �뿭�븷", ProjectRole.TYPE_DEFAULT, Permission.ROLE_TYPE_PROJECT_JOIN);
         ProjectRole managerProjectRole = this.addProjectRole(project, "�봽濡쒖젥�듃 愿�由ъ옄 �뿭�븷", ProjectRole.TYPE_MANAGER, Permission.ROLE_TYPE_PROJECT_MANAGER);
         //  �봽濡쒖젥�듃 愿�由ъ옄 ���옣
diff --git a/src/main/java/kr/wisestone/owl/service/impl/ProjectServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/ProjectServiceImpl.java
index c57ce01..255db28 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/ProjectServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/ProjectServiceImpl.java
@@ -48,6 +48,9 @@
     private DepartmentService departmentService;
 
     @Autowired
+    private UserDepartmentService userDepartmentService;
+
+    @Autowired
     private ProjectRoleService projectRoleService;
 
     @Autowired
@@ -117,7 +120,7 @@
         project.setDefaultYn(true);
         this.projectRepository.saveAndFlush(project);
         //  �봽濡쒖젥�듃 湲곕낯 �뿭�븷怨� 愿�由ъ옄 �뿭�븷�쓣 �깮�꽦�븳�떎. 愿�由ъ옄�뒗 �깮�꽦�븳 �궗�슜�옄
-        this.projectRoleService.addDefaultProjectRole(project, Lists.newArrayList(user), Lists.newArrayList());
+        this.projectRoleService.addDefaultProjectRoleUser(project, Lists.newArrayList(user), Lists.newArrayList());
         //  媛� �봽濡쒖젥�듃�쓽 �씠�뒋 踰덊샇瑜� �옄�룞�쑝濡� �깮�꽦�븳�떎.
         this.issueNumberGeneratorService.generateIssueNumber(project);
 
@@ -183,16 +186,8 @@
             sendEmails.add(user.getAccount());
         }
 
-        List<Department> departments = Lists.newArrayList();
-        //  遺��꽌 �벑濡�
-        for (Long departmentId : projectForm.getDepartmentIds()) {
-            Department department = this.departmentService.getDepartment(departmentId);
-            departments.add(department);
-        }
-
         //  湲곕낯, 愿�由ъ옄 �봽濡쒖젥�듃 �뿭�븷�쓣 �깮�꽦�븯怨� �궗�슜�옄瑜� �빐�떦 �뿭�븷�뿉 諛곗젙�븳�떎.
-        //this.projectRoleService.addDefaultProjectRole(project, managers, users);
-        this.projectRoleService.addDefaultProjectRole(project, managers, departments);
+        this.projectRoleService.addDefaultProjectRoleUser(project, managers, users);
 
         //  �봽濡쒖젥�듃 李몄뿬�옄�뱾�뿉寃� �씠硫붿씪 諛쒖넚�쓣 �삁�빟�븳�떎.
         Map<String, Object> projectMap = new HashMap<>();
@@ -220,15 +215,22 @@
         }
 
         List<Department> departments = Lists.newArrayList();
+        List<String> sendEmails = Lists.newArrayList(); //  硫붿씪 ���긽�옄
         //  遺��꽌 �벑濡�
         for (Long departmentId : projectForm.getDepartmentIds()) {
             Department department = this.departmentService.getDepartment(departmentId);
+            /*List<UserDepartment> userDepartments = this.userDepartmentService.getUserDepartments(departmentId);
+            if(userDepartments != null){
+                for (UserDepartment userDepartment : userDepartments){
+                    User user = this.userService.getUser(userDepartment.getUserId());
+                    sendEmails.add(user.getAccount());
+                }
+            }*/
             departments.add(department);
         }
 
-        //  湲곕낯, 愿�由ъ옄 �봽濡쒖젥�듃 �뿭�븷�쓣 �깮�꽦�븯怨� �궗�슜�옄瑜� �빐�떦 �뿭�븷�뿉 諛곗젙�븳�떎.
-        //this.projectRoleService.addDefaultProjectRole(project, managers, users);
-        this.projectRoleService.addDefaultProjectRole(project, managers, departments);
+        //  湲곕낯, 愿�由ъ옄 �봽濡쒖젥�듃 �뿭�븷�쓣 �깮�꽦�븯怨� �떞�떦遺��꽌瑜� �빐�떦 �뿭�븷�뿉 諛곗젙�븳�떎.
+        this.projectRoleService.addDefaultProjectRoleDepartment(project, managers, departments);
 
         //  �봽濡쒖젥�듃 李몄뿬�옄�뱾�뿉寃� �씠硫붿씪 諛쒖넚�쓣 �삁�빟�븳�떎.
         Map<String, Object> projectMap = new HashMap<>();
@@ -243,6 +245,8 @@
         stringBuilder.append(")");
 
         projectMap.put("projectManagerName", stringBuilder.toString());
+        //  �봽濡쒖젥�듃 �떞�떦遺��꽌 硫붿씪 諛쒖넚 �삁�빟
+        this.systemEmailService.reservationEmail(sendEmails.toArray(new String[sendEmails.size()]), EmailType.PROJECT_DEFAULT_INCLUDE, projectMap);
     }
 
 
@@ -555,7 +559,9 @@
         this.checkExcludeDepartmentAndRemoveIssueDepartment(project, existDepartmentIds, changeDepartmentIds);
 
         //  愿�由ъ옄/�씪諛� �궗�슜�옄 蹂�寃� �궡�뿭�쓣 �넻吏��븳�떎.
-        this.notificationProjectRoleUser(changeProjectManagerNotifications, changeProjectUserNotifications, project);
+        //this.notificationProjectRoleUser(changeProjectManagerNotifications, changeProjectUserNotifications, project);
+        //  愿�由ъ옄/�떞�떦遺��꽌 蹂�寃� �궡�뿭�쓣 �넻吏��븳�떎.
+        this.notificationProjectRoleDepartment(changeProjectManagerNotifications, changeProjectDepartmentNotifications, project);
 
         return project;
     }
@@ -728,7 +734,7 @@
 
     }
 
-    //  愿�由ъ옄瑜� 蹂�寃쏀븳�떎.
+    //  �떞�떦遺��꽌瑜� 蹂�寃쏀븳�떎.
     private Map<String, Object> modifyProjectDepartments(Project project, ProjectForm projectForm) {
         ProjectRole projectRole = this.projectRoleService.findByProjectIdAndRoleType(project.getId(), ProjectRole.TYPE_DEFAULT);
         List<Department> oldDepartment = Lists.newArrayList();
@@ -747,9 +753,9 @@
             department.addProjectRole(projectRole);
         }
 
-        //  �젣�쇅 ���긽�옄 李얘린, oldManager �뿉�뒗 �엳�뒗�뜲 newManager �뿉 �뾾�쑝硫� �젣�쇅 ���긽
+        //  �젣�쇅 ���긽�옄 李얘린, oldDepartment �뿉�뒗 �엳�뒗�뜲 newDepartment �뿉 �뾾�쑝硫� �젣�쇅 ���긽
         List<String> excludeDepartments = this.systemEmailService.notificationDepartmentChange(oldDepartment, newDepartment);
-        //  李몄뿬 ���긽�옄 李얘린, newManager �뿉�뒗 �엳�뒗�뜲 oldManager �뿉 �뾾�쑝硫� 珥덈�諛쏆� ���긽
+        //  李몄뿬 ���긽�옄 李얘린, newDepartment �뿉�뒗 �엳�뒗�뜲 oldDepartment �뿉 �뾾�쑝硫� 珥덈�諛쏆� ���긽
         List<String> includeDepartments = this.systemEmailService.notificationDepartmentChange(newDepartment, oldDepartment);
 
         results.put("excludeDepartments", excludeDepartments);
@@ -826,6 +832,47 @@
         this.sendEmailProjectRoleChange(this.checkDuplicationEmails(projectUserIncludeUsers, excludeManagerAndIncludeUser, excludeUserAndIncludeManager), EmailType.PROJECT_DEFAULT_INCLUDE, projectMap);
     }
 
+    //  �봽濡쒖젥�듃 李몄뿬, �젣�쇅 �넻吏� �젙蹂� 泥댄겕
+    private void notificationProjectRoleDepartment(Map<String, Object> changeProjectManagerNotifications, Map<String, Object> changeProjectDepartmentNotifications, Project project) {
+        List<String> projectManagerExcludeUsers = (List<String>) changeProjectManagerNotifications.get("excludeUsers");  //  愿�由ъ옄 �젣�쇅 �궗�슜�옄
+        List<String> projectManagerIncludeUsers = (List<String>) changeProjectManagerNotifications.get("includeUsers");  //  愿�由ъ옄 李몄뿬 �궗�슜�옄
+        List<String> projectDepartmentExcludeDepartments = (List<String>) changeProjectDepartmentNotifications.get("excludeDepartments");    //  �젣�쇅�맂 �떞�떦 遺��꽌
+        List<String> projectDepartmentIncludeDepartments = (List<String>) changeProjectDepartmentNotifications.get("includeDepartments");    //  李몄뿬�맂 �떞�떦 遺��꽌
+        Map<String, Object> projectMap = new HashMap<>();
+        projectMap.put("workspaceName", project.getWorkspace().getName());
+        projectMap.put("projectName", project.getName());
+        projectMap.put("registerDate", DateUtil.convertDateToStr(new Date()));
+
+        Map<String, Object> projectRoleManagerMap = new HashMap<>();
+        projectRoleManagerMap.put("id", project.getId());
+        projectRoleManagerMap.put("statuses", Lists.newArrayList("02"));   //  愿�由ъ옄 議고쉶
+
+        //  愿�由ъ옄 �젙蹂� �뀑�똿
+        List<Map<String, Object>> projectRoleManagers = this.projectRoleUserService.findProjectRoleUser(projectRoleManagerMap);
+
+        if (projectRoleManagers != null && !projectRoleManagers.isEmpty()) {
+            for (Map<String, Object> projectRoleManager : projectRoleManagers) {
+                UserVo userVo = ConvertUtil.convertMapToClass(projectRoleManager, UserVo.class);
+                StringBuilder stringBuilder = new StringBuilder();
+                stringBuilder.append(userVo.getName());
+                stringBuilder.append("(");
+                stringBuilder.append(CommonUtil.decryptAES128(userVo.getAccount()));
+                stringBuilder.append(")");
+
+                projectMap.put("projectManagerName", stringBuilder.toString());
+            }
+        }
+
+        //  愿�由ъ옄 �젣�쇅 硫붿씪
+        this.sendEmailProjectRoleChange(projectManagerExcludeUsers, EmailType.PROJECT_MANAGER_EXCLUDE, projectMap);
+        //  愿�由ъ감 李몄뿬 硫붿씪
+        this.sendEmailProjectRoleChange(projectManagerIncludeUsers, EmailType.PROJECT_MANAGER_INCLUDE, projectMap);
+        //  �떞�떦 遺��꽌 �젣�쇅 硫붿씪
+        this.sendEmailProjectRoleChange(projectDepartmentExcludeDepartments, EmailType.PROJECT_DEFAULT_EXCLUDE, projectMap);
+        //  �떞�떦 遺��꽌 李몄뿬 硫붿씪
+        this.sendEmailProjectRoleChange(projectDepartmentIncludeDepartments, EmailType.PROJECT_DEFAULT_INCLUDE, projectMap);
+    }
+
     //  以묐났�쑝濡� �굹媛��뒗 硫붿씪�씠 �엳�뒗吏� 泥댄겕�븳�떎.
     private List<String> checkDuplicationEmails(List<String> checkEmails, List<String> excludeManagerAndIncludeUser, List<String> excludeUserAndIncludeManager) {
         List<String> sendProjectManagerExcludeUserEmails = Lists.newArrayList();
diff --git a/src/main/java/kr/wisestone/owl/service/impl/SystemEmailServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/SystemEmailServiceImpl.java
index 7e6ecaa..2e4602d 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/SystemEmailServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/SystemEmailServiceImpl.java
@@ -13,10 +13,12 @@
 import kr.wisestone.owl.domain.Department;
 import kr.wisestone.owl.domain.SystemEmail;
 import kr.wisestone.owl.domain.User;
+import kr.wisestone.owl.domain.UserDepartment;
 import kr.wisestone.owl.domain.enumType.EmailType;
 import kr.wisestone.owl.exception.OwlRuntimeException;
 import kr.wisestone.owl.repository.SystemEmailRepository;
 import kr.wisestone.owl.service.SystemEmailService;
+import kr.wisestone.owl.service.UserDepartmentService;
 import kr.wisestone.owl.service.UserService;
 import kr.wisestone.owl.util.*;
 import org.apache.commons.io.FilenameUtils;
@@ -61,6 +63,9 @@
 
     @Autowired
     private SpringTemplateEngine springTemplateEngine;
+
+    @Autowired
+    private UserDepartmentService userDepartmentService;
 
     @Override
     protected JpaRepository<SystemEmail, Long> getRepository() {
@@ -332,6 +337,13 @@
             }
 
             if (excludeCheck) {
+                /*List<UserDepartment> userDepartments = this.userDepartmentService.getUserDepartments(department.getId());
+                if(userDepartments != null){
+                    for (UserDepartment userDepartment : userDepartments){
+                        User user = this.userService.getUser(userDepartment.getUserId());
+                        results.add(user.getAccount());
+                    }
+                }*/
                 results.add(department.getDepartmentName());
             }
         }
diff --git a/src/main/java/kr/wisestone/owl/vo/IssueVo.java b/src/main/java/kr/wisestone/owl/vo/IssueVo.java
index 9fc1672..7d84a23 100644
--- a/src/main/java/kr/wisestone/owl/vo/IssueVo.java
+++ b/src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -52,6 +52,7 @@
     private String modifyByName;    //  蹂�寃쎌옄 �젙蹂� - �씠�뒋 蹂�寃� �젙蹂� �긽�꽭 �솗�씤�뿉�꽌 �궗�슜
     private WorkflowStatusVo workflowStatusVo;
     private IssueVo parentIssueVo;
+    private int downIssueCount;
 
     private List<IssueCompanyVo> issueCompanyVos;
     private List<IssueIspVo> issueIspVos;
@@ -436,4 +437,12 @@
     public void setUsePartnerVos(List<UsePartnerVo> usePartnerVos) {
         this.usePartnerVos = usePartnerVos;
     }
+
+    public int getDownIssueCount() {
+        return downIssueCount;
+    }
+
+    public void setDownIssueCount(int downIssueCount) {
+        this.downIssueCount = downIssueCount;
+    }
 }
diff --git a/src/main/resources/mails/issueAddEmail.html b/src/main/resources/mails/issueAddEmail.html
index 74ddd1c..6ccd810 100644
--- a/src/main/resources/mails/issueAddEmail.html
+++ b/src/main/resources/mails/issueAddEmail.html
@@ -59,11 +59,17 @@
                     </td>
                 </tr>
                 <tr>
-                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                    <!--<td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
                             <span th:utext="${#messages.msg('issue.add.assignee')}">�떞�떦�옄</span>
                         </div>
                         <div style="font-weight:bold;" th:utext="${assignees}"></div>
+                    </td>-->
+                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                        <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
+                            <span th:utext="${#messages.msg('issue.add.department')}">�떞�떦遺��꽌</span>
+                        </div>
+                        <div style="font-weight:bold;" th:utext="${departments}"></div>
                     </td>
                     <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; border-right: none;">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
diff --git a/src/main/resources/mails/issueRemoveEmail.html b/src/main/resources/mails/issueRemoveEmail.html
index 81db692..70e2234 100644
--- a/src/main/resources/mails/issueRemoveEmail.html
+++ b/src/main/resources/mails/issueRemoveEmail.html
@@ -59,11 +59,17 @@
                     </td>
                 </tr>
                 <tr>
-                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                    <!--<td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
                             <span th:utext="${#messages.msg('issue.add.assignee')}">�떞�떦�옄</span>
                         </div>
                         <div style="font-weight:bold;" th:utext="${assignees}"></div>
+                    </td>-->
+                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                        <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
+                            <span th:utext="${#messages.msg('issue.add.department')}">�떞�떦遺��꽌</span>
+                        </div>
+                        <div style="font-weight:bold;" th:utext="${departments}"></div>
                     </td>
                     <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; border-right: none;">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
diff --git a/src/main/resources/mails/issueSendEmail.html b/src/main/resources/mails/issueSendEmail.html
index c799117..92bf1d7 100644
--- a/src/main/resources/mails/issueSendEmail.html
+++ b/src/main/resources/mails/issueSendEmail.html
@@ -59,11 +59,17 @@
                     </td>
                 </tr>
                 <tr>
-                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                    <!--<td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
                             <span th:utext="${#messages.msg('issue.add.assignee')}">�떞�떦�옄</span>
                         </div>
                         <div style="font-weight:bold;" th:utext="${assignees}"></div>
+                    </td>-->
+                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                        <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
+                            <span th:utext="${#messages.msg('issue.add.department')}">�떞�떦遺��꽌</span>
+                        </div>
+                        <div style="font-weight:bold;" th:utext="${departments}"></div>
                     </td>
                     <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; border-right: none;">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
diff --git a/src/main/resources/mails/issueSendEmailTemplate1.html b/src/main/resources/mails/issueSendEmailTemplate1.html
index 92598a7..8dc3421 100644
--- a/src/main/resources/mails/issueSendEmailTemplate1.html
+++ b/src/main/resources/mails/issueSendEmailTemplate1.html
@@ -59,11 +59,17 @@
                     </td>
                 </tr>
                 <tr>
-                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                    <!--<td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
                             <span th:utext="${#messages.msg('issue.add.assignee')}">�떞�떦�옄</span>
                         </div>
                         <div style="font-weight:bold;" th:utext="${assignees}"></div>
+                    </td>-->
+                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                        <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
+                            <span th:utext="${#messages.msg('issue.add.department')}">�떞�떦遺��꽌</span>
+                        </div>
+                        <div style="font-weight:bold;" th:utext="${departments}"></div>
                     </td>
                     <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; border-right: none;">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
diff --git a/src/main/resources/mails/issueSendEmailTemplate2.html b/src/main/resources/mails/issueSendEmailTemplate2.html
index a9dee1b..47edfd2 100644
--- a/src/main/resources/mails/issueSendEmailTemplate2.html
+++ b/src/main/resources/mails/issueSendEmailTemplate2.html
@@ -59,11 +59,17 @@
                     </td>
                 </tr>
                 <tr>
-                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                    <!--<td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
                             <span th:utext="${#messages.msg('issue.add.assignee')}">�떞�떦�옄</span>
                         </div>
                         <div style="font-weight:bold;" th:utext="${assignees}"></div>
+                    </td>-->
+                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                        <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
+                            <span th:utext="${#messages.msg('issue.add.department')}">�떞�떦遺��꽌</span>
+                        </div>
+                        <div style="font-weight:bold;" th:utext="${departments}"></div>
                     </td>
                     <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; border-right: none;">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
diff --git a/src/main/resources/mails/issueSendEmailTemplate3.html b/src/main/resources/mails/issueSendEmailTemplate3.html
index 631dba1..d7a1088 100644
--- a/src/main/resources/mails/issueSendEmailTemplate3.html
+++ b/src/main/resources/mails/issueSendEmailTemplate3.html
@@ -59,11 +59,17 @@
                     </td>
                 </tr>
                 <tr>
-                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                    <!--<td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
                             <span th:utext="${#messages.msg('issue.add.assignee')}">�떞�떦�옄</span>
                         </div>
                         <div style="font-weight:bold;" th:utext="${assignees}"></div>
+                    </td>-->
+                    <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; width:50%">
+                        <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
+                            <span th:utext="${#messages.msg('issue.add.department')}">�떞�떦遺��꽌</span>
+                        </div>
+                        <div style="font-weight:bold;" th:utext="${departments}"></div>
                     </td>
                     <td style="padding: 20px 40px; color: #111; border: 1px solid #e7e7e7; border-left: none; border-right: none;">
                         <div style="color: #9a9a9a; font-size: 12px; font-weight:bold; margin-bottom: 3px;">
diff --git a/src/main/resources/mybatis/query-template/issue-template.xml b/src/main/resources/mybatis/query-template/issue-template.xml
index fb6f2c4..88e0bfe 100644
--- a/src/main/resources/mybatis/query-template/issue-template.xml
+++ b/src/main/resources/mybatis/query-template/issue-template.xml
@@ -191,6 +191,7 @@
                 </foreach>
             </when>
         </choose>
+        AND issue.parent_issue_id IS NULL
         AND issue.reverse_index <![CDATA[ < ]]> 0
         AND workspace.id = #{workspaceId}
         GROUP BY issue.id
diff --git a/src/main/webapp/WEB-INF/i18n/mail_ko_KR.properties b/src/main/webapp/WEB-INF/i18n/mail_ko_KR.properties
index 3238d0f..1bc6700 100644
--- a/src/main/webapp/WEB-INF/i18n/mail_ko_KR.properties
+++ b/src/main/webapp/WEB-INF/i18n/mail_ko_KR.properties
@@ -130,6 +130,7 @@
 issue.add.issueType=\uC774\uC288 \uC720\uD615
 issue.add.issueStatus=\uC774\uC288 \uC0C1\uD0DC
 issue.add.assignee=\uB2F4\uB2F9\uC790
+issue.add.department=\uB2F4\uB2F9\uBD80\uC11C
 issue.add.schedule=\uC77C\uC815
 issue.add.priority=\uC911\uC694\uB3C4
 issue.add.severity=\uC6B0\uC120 \uC21C\uC704
diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json
index 994f964..6d14c69 100644
--- a/src/main/webapp/i18n/ko/global.json
+++ b/src/main/webapp/i18n/ko/global.json
@@ -711,6 +711,7 @@
         "changeDate": "蹂�寃쎌씪",
         "lastChangeDate": "理쒓렐 蹂�寃쎌씪",
         "registrationDate": "�벑濡앹씪",
+        "countDownIssue": "�븯�쐞 �씠�뒋",
         "noDate": "湲곌컙 �뾾�쓬",
         "fullView": "�쟾泥대낫湲�",
         "comments": "�뙎湲�",
diff --git a/src/main/webapp/scripts/app/issue/issueAddTableConfig.controller.js b/src/main/webapp/scripts/app/issue/issueAddTableConfig.controller.js
index 1de28b2..5fc480c 100644
--- a/src/main/webapp/scripts/app/issue/issueAddTableConfig.controller.js
+++ b/src/main/webapp/scripts/app/issue/issueAddTableConfig.controller.js
@@ -47,22 +47,28 @@
                         position : 4,
                         display : true
                     }, {
+                        name : $filter("translate")("common.countDownIssue"), // �븯�쐞�씠�뒋 移댁슫�듃
+                        key : "COUNT_DOWN_ISSUE",
+                        width : "width-100-p",
+                        position : 5,
+                        display : false
+                    }, {
                         name : $filter("translate")("common.register"), // �벑濡앹옄
                         key : "REGISTER",
                         width : "width-100-p",
-                        position : 5,
+                        position : 6,
                         display : false
                     }, {
                         name : $filter("translate")("common.period"), // 湲곌컙
                         key : "PERIOD",
                         width : "width-140-p",
-                        position : 6,
+                        position : 7,
                         display : false
                     }, {
                         name : $filter("translate")("common.lastChangeDate"), // 理쒓렐 蹂�寃쎌씪
                         key : "MODIFY_DATE",
                         width : "width-100-p",
-                        position : 7,
+                        position : 8,
                         display : false
                     }, {
                     }]
@@ -131,7 +137,7 @@
                 }
 
                 var content = {
-                    delValue : $scope.vm.issueTableConfigs.splice(7,1),
+                    delValue : $scope.vm.issueTableConfigs.splice(8,1),
                     issueTableConfigs : JSON.stringify($scope.vm.issueTableConfigs),
                     issueTypeId : $rootScope.getCurrentIssueTypeId()
                 };
diff --git a/src/main/webapp/scripts/app/issue/issueList.controller.js b/src/main/webapp/scripts/app/issue/issueList.controller.js
index e9fbec7..52e00e9 100644
--- a/src/main/webapp/scripts/app/issue/issueList.controller.js
+++ b/src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -284,6 +284,13 @@
                                 .setDAlign("text-center")
                                 .setDName("modifyDate"));
                             break;
+                        case "COUNT_DOWN_ISSUE" : //  �븯�쐞 �씠�뒋 媛쒖닔
+                            $scope.vm.tableConfigs.push($tableProvider.config()
+                                .setHName("common.countDownIssue")
+                                .setHWidth("bold " + issueTableConfig.width)
+                                .setDAlign("text-center")
+                                .setDName("downIssueCount"));
+                            break;
                     }
 
                     //  �궗�슜�옄 �젙�쓽 �븘�뱶 而щ읆
diff --git a/src/main/webapp/scripts/app/user/userModify.controller.js b/src/main/webapp/scripts/app/user/userModify.controller.js
index 8f71f34..b4c7dc5 100644
--- a/src/main/webapp/scripts/app/user/userModify.controller.js
+++ b/src/main/webapp/scripts/app/user/userModify.controller.js
@@ -85,7 +85,6 @@
                             $scope.vm.form.account = result.data.data.account;
                             $scope.vm.form.phone = result.data.data.phone;
                             if(result.data.data.reservationNotifyTime === "realTime"){
-                                $scope.vm.form.reservationNotifyTime = "";
                                 $scope.vm.form.realtimeNotify = true;
                             }else{
                                 $scope.vm.form.reservationNotifyTime = result.data.data.reservationNotifyTime;
diff --git a/src/main/webapp/views/user/userModify.html b/src/main/webapp/views/user/userModify.html
index d2649d3..a1003ab 100644
--- a/src/main/webapp/views/user/userModify.html
+++ b/src/main/webapp/views/user/userModify.html
@@ -32,7 +32,7 @@
                 </div>
             </div>
 
-            <div class="row">
+            <div ng-show="" class="row">
                 <div class="col-sm-6">
                     <div class="form-group">
                         <label for="userModifyForm3"><span translate="users.setEmailNotificationTime">�씠硫붿씪 �븣由� �떆媛� �꽕�젙</span> <code class="highlighter-rouge">*</code></label>
@@ -47,6 +47,7 @@
                                option="Y"
                                ng-disabled="vm.form.realtimeNotify"
                                ng-required="!vm.form.realtimeNotify"
+                               placeholder="�씠硫붿씪 �븣由� �떆媛꾩쓣 �꽕�젙�빐二쇱꽭�슂."
                                ng-model="vm.form.reservationNotifyTime">
                     </div>
                 </div>

--
Gitblit v1.8.0