From 51365e66857e4b7a1d783b0309e20e855e393ae5 Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 금, 10 12월 2021 10:10:26 +0900
Subject: [PATCH] 이슈전체보기/프로젝트전체보기 권한 설정

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java |  273 ++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 194 insertions(+), 79 deletions(-)

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 416ded3..76e1126 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -3,11 +3,9 @@
 import com.google.common.collect.Lists;
 import com.sun.org.apache.bcel.internal.generic.NEW;
 import kr.wisestone.owl.common.ExcelConditionCheck;
+import kr.wisestone.owl.common.IssueCustomFieldValueFormComparator;
 import kr.wisestone.owl.config.CommonConfiguration;
-import kr.wisestone.owl.constant.Constants;
-import kr.wisestone.owl.constant.ElasticSearchConstants;
-import kr.wisestone.owl.constant.MsgConstants;
-import kr.wisestone.owl.constant.UsePartner;
+import kr.wisestone.owl.constant.*;
 import kr.wisestone.owl.data.CheckIssueData;
 import kr.wisestone.owl.domain.*;
 import kr.wisestone.owl.domain.enumType.CustomFieldType;
@@ -17,6 +15,7 @@
 import kr.wisestone.owl.exception.OwlRuntimeException;
 import kr.wisestone.owl.mapper.IssueMapper;
 import kr.wisestone.owl.mapper.ProjectMapper;
+import kr.wisestone.owl.repository.IssueRelationRepository;
 import kr.wisestone.owl.repository.IssueRepository;
 import kr.wisestone.owl.repository.UserDepartmentRepository;
 import kr.wisestone.owl.repository.WorkflowDepartmentRepository;
@@ -57,6 +56,9 @@
 
     @Autowired
     private ProjectService projectService;
+
+    @Autowired
+    private IssueTableConfigService issueTableConfigService;
 
     @Autowired
     private IssueStatusService issueStatusService;
@@ -149,10 +151,16 @@
     private UserWorkspaceService userWorkspaceService;
 
     @Autowired
+    private UserLevelService userLevelService;
+
+    @Autowired
     private WorkflowDepartmentService workflowDepartmentService;
 
     @Autowired
     private IssueRelationService issueRelationService;
+
+    @Autowired
+    private IssueRelationRepository issueRelationRepository;
 
     @Autowired
     private ExcelView excelView;
@@ -256,11 +264,8 @@
 
             List<IssueVo> issueVos = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
             int size = issueVos.size();
-            if (size == 1) {
+            if (size > 0) {
                 issueForm.setParentIssueId(issueVos.get(0).getId());
-            } else if (size > 1) {
-                throw new OwlRuntimeException(
-                        this.messageAccessor.getMessage(MsgConstants.API_OVERLAP_ERROR));
             }
 
             issueForm.setIsApi(Issue.IS_API_YES);
@@ -321,39 +326,36 @@
     }
 
     // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋
-    private List<IssueVo> findIssue(IssueApiForm issueApiForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
+    private List<IssueVo> findIssue(IssueApiForm issueApiform, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) {
+        List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
+        List<IssueVo> resultIssueVos = Lists.newArrayList();
+        String comma = ",";
 
-        List<IssueVo> resultIssueVos = new ArrayList<>();
+        if (issueCustomFieldValueForms.size() > 0) {
+            String concatUseValue = "";
+            int useIdx = 0;
 
-        if (customFieldApiOverlaps != null && customFieldApiOverlaps.size() > 0) {
-            for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
-                for (IssueCustomFieldValueForm issueCustomFieldValue : issueApiForm.getIssueCustomFieldValues()) {
-                    IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
-                    issueCustomFieldValueCondition.setUseParentIssueId(true);
-                    if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValue.getCustomFieldId())) {
-                        issueCustomFieldValueCondition.setUseValue(issueCustomFieldValue.getUseValue());
+            IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator();
+            Collections.sort(issueCustomFieldValueForms, comp);
 
-                        List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
-                        if (results != null && results.size() > 0) {
-                            List<IssueVo> findIssueVos = new ArrayList<>();
-                            Collections.copy(resultIssueVos, findIssueVos);
-                            resultIssueVos.clear();
-                            for (Map<String, Object> result : results) {
-                                IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class);
-                                if (findIssueVos.size() == 0) {
-                                    resultIssueVos.add(issueVo);
-                                } else {
-                                    IssueVo findIssueVo = findIssueVo(findIssueVos, issueVo.getId());
-                                    if (findIssueVo != null) {
-                                        resultIssueVos.add(findIssueVo);
-                                    }
-                                }
-                            }
-                        } else {
-                            resultIssueVos.clear();
-                            return resultIssueVos;
+            for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
+                for(CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
+                    if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) {
+                        if (useIdx > 0) {
+                            concatUseValue = concatUseValue.concat(comma);
                         }
+                        concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue());
+                        useIdx++;
                     }
+                }
+            }
+
+            IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
+            issueCustomFieldValueCondition.setUseValue(concatUseValue);
+            List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
+            if (results != null && results.size() > 0) {
+                for (Map<String, Object> result : results) {
+                    resultIssueVos.add(ConvertUtil.convertMapToClass(result, IssueVo.class));
                 }
             }
         }
@@ -743,10 +745,13 @@
         issueCondition.setWorkspaceId(this.userService.getUser(this.webAppUtil.getLoginId()).getLastWorkspaceId());
         User user = this.webAppUtil.getLoginUserObject();
 
+
         List<Map<String, Object>> results = Lists.newArrayList();
         Long totalCount = 0L;
+        UserLevel userLevel = this.userLevelService.getUserLevel(user.getUserLevel().getId());
 
-        if (this.userWorkspaceService.checkWorkspaceManager(user)) {
+        if (this.userWorkspaceService.checkWorkspaceManager(user)
+                || MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE_ALL)) {
             results = this.issueMapper.find(issueCondition);
             totalCount = this.issueMapper.count(issueCondition);
         } else{
@@ -766,6 +771,7 @@
 
         int totalPage = (int) Math.ceil((totalCount - 1) / pageable.getPageSize()) + 1;
         //  �씠�뒋 �븘�씠�뵒 珥덇린�솕
+        issueCondition.setIsApi(issueCondition.getIsApi());
         issueCondition.setIssueIds(Lists.newArrayList());
         //  Map �뿉 �엳�뒗 �뜲�씠�꽣瑜� IssueVo �뜲�씠�꽣濡� 蹂��솚�븳�떎.
         this.setMapToIssueVo(results, issueVos, issueCondition, user);
@@ -1222,6 +1228,7 @@
 
                 case "02": //  �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭,  �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂�, �뙎湲�, 湲곕줉�쓣 �뀑�똿�븳�떎.
                     this.setIssueDetail(issueVo, issue);    //  �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎.
+                    this.setIssueTableConfigs(issue, issueVo);
                     issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class));
                     break;
             }
@@ -1232,6 +1239,26 @@
 
         resJsonData.put(Constants.RES_KEY_CONTENTS, issueVo);
     }
+
+    // �뀒�씠釉� �꽕�젙 �뀑�똿
+    private void setIssueTableConfigs(Issue issue, IssueVo issueVo) {
+        Long IssueTypeId = issue.getIssueType().getId();
+
+        for (int tableConfigType : IssueTableConfig.IssueTableTypes) {
+            if (tableConfigType != IssueTableConfig.ISSUE_TABLE_TYPE_MAIN) {
+                issueVo.addIssueTableConfigVo(createIssueTableConfigVo(IssueTypeId, tableConfigType));
+            }
+        }
+    }
+
+    private IssueTableConfigVo createIssueTableConfigVo(Long issueTypeId, int tableConfigType) {
+        IssueTableConfig issueTableConfig = this.issueTableConfigService.findByUserIdAndWorkspaceIdAndIssueTypeIdAndIssueTableType(issueTypeId, tableConfigType);
+        if (issueTableConfig != null) {
+            return ConvertUtil.copyProperties(issueTableConfig, IssueTableConfigVo.class);
+        }
+        return new IssueTableConfigVo();
+    }
+
 
     // �븯�쐞 �씠�뒋 �젙蹂대�� �뀑�똿�븳�떎
     private void setDownIssues(Issue issue, IssueVo issueVo) {
@@ -1455,42 +1482,25 @@
     public List<IssueVo> findIssue(IssueApiForm issueApiform) {
 
         List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
-        List<IssueVo> resultIssueVos = new ArrayList<>();
+        List<IssueVo> resultIssueVos = Lists.newArrayList();
+        String comma = ",";
 
-        IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
-        issueCustomFieldValueCondition.setUseParentIssueId(false);
         if (issueCustomFieldValueForms.size() > 0) {
-            for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
-
-                CustomField customField = this.customFieldService.getCustomField(issueCustomFieldValueForm.getCustomFieldId());
-                CustomFieldType customFieldType = CustomFieldType.DATETIME;
-                if (customFieldType.equals(customField.getCustomFieldType())) {
-                    continue;
+            String concatUseValue = "";
+            for (int i = 0; i < issueCustomFieldValueForms.size(); i++) {
+                IssueCustomFieldValueForm issueCustomFieldValueForm = issueCustomFieldValueForms.get(i);
+                if (i > 0) {
+                    concatUseValue = concatUseValue.concat(comma);
                 }
-//                issueCustomFieldValueCondition.addUseValue(issueCustomFieldValueForm.getUseValue());
-                issueCustomFieldValueCondition.setUseValue(issueCustomFieldValueForm.getUseValue());
-                List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
-                if (results != null && results.size() > 0) {
-                    List<IssueVo> findIssueVos = new ArrayList<>();
-                    Collections.copy(resultIssueVos, findIssueVos);
-                    resultIssueVos.clear();
-                    for (Map<String, Object> result : results) {
-                        IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class);
+                concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue());
+            }
 
-                        issueVo.setParentIssueVo(this.getParentIssueVo(MapUtil.getLong(result, "parentIssueId")));
-
-                        if (findIssueVos.size() == 0) {
-                            resultIssueVos.add(issueVo);
-                        } else {
-                            IssueVo findIssueVo = findIssueVo(findIssueVos, issueVo.getId());
-                            if (findIssueVo != null) {
-                                resultIssueVos.add(findIssueVo);
-                            }
-                        }
-                    }
-                } else {
-                    resultIssueVos.clear();
-                    return resultIssueVos;
+            IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
+            issueCustomFieldValueCondition.setUseValue(concatUseValue);
+            List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
+            if (results != null && results.size() > 0) {
+                for (Map<String, Object> result : results) {
+                    resultIssueVos.add(ConvertUtil.convertMapToClass(result, IssueVo.class));
                 }
             }
         }
@@ -1516,18 +1526,33 @@
         User user = this.convertToUser(issueApiForm.getToken());
         IssueForm issueForm = this.convertToIssueForm(issueApiForm, user);
 
-
         List<IssueVo> issueVos = this.findIssue(issueApiForm);
         if (issueVos != null && issueVos.size() > 0) {
             List<Issue> issue = Lists.newArrayList();
             for (IssueVo issueVo : issueVos) {
                 IssueVo parentIssueVo = issueVo.getParentIssueVo();
-                if (parentIssueVo != null) {
-                    issueForm.setId(parentIssueVo.getId());
-                } else {
-                    issueForm.setId(issueVo.getId());
+                issueForm.setId(issueVo.getId());
+
+                // �옄�룞 醫낅즺 �긽�깭 �꽕�젙�씠 �릺�뼱 �엳吏� �븡�쑝硫� �삤瑜섎컻�깮
+                Issue modifyIssue = this.modifyIssueForApi(user, issueForm, files);
+                Issue parentIssue = modifyIssue.getParentIssue();
+                IssueType issueType = modifyIssue.getIssueType();
+                IssueStatus issueStatus = issueType.getIssueStatus();
+                if (issueStatus == null) {
+                    throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_COMPLETE_ISSUE_STATUS_NOT_EXIST));
                 }
-                issue.add(this.modifyIssueForApi(user, issueForm, files));
+
+                if (parentIssue != null) {
+                    IssueCondition issueCondition = new IssueCondition(issueVo.getId(), parentIssue.getId());
+                    List<Map<String, Object>> results = this.issueMapper.findNotCompleteByParentIssueId(issueCondition);
+                    // �븯�쐞 �씪媛먯씠 紐⑤몢 醫낅즺 �긽�깭�씪�븣 �긽�쐞 �씪媛먮룄 醫낅즺 泥섎━
+                    if (results == null || results.size() == 0) {
+                        parentIssue.setIssueStatus(issueType.getIssueStatus());
+                        this.issueRepository.saveAndFlush(parentIssue);
+                    }
+                }
+
+                issue.add(modifyIssue);
             }
             return issue;
         } else {
@@ -1610,6 +1635,7 @@
             this.issueHistoryService.detectIssueStatus(issue, issueForm, detectIssueChange, oldIssueStatus, issueStatus);
         }
 
+        // db�뿉 ���옣
         issue = this.saveIssue(issueForm, checkIssueData);
 
         //  �씠�뒋 �씠�젰 �벑濡�
@@ -1850,6 +1876,9 @@
         //hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ASSIGNEE, issueVo, issueUserVos);
         //  �떞�떦�옄媛� �뾾�쑝硫� 紐⑤뱺 �궗�슜�옄媛� �닔�젙 沅뚰븳�쓣 媛뽯뒗�떎.
 
+        hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ALL_ISSUE_MANAGER, issueVo, null, null, user);
+        hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ALL_PROJECT_MANAGER, issueVo, null, null, user);
+
         return hasPermission;
     }
 
@@ -2046,20 +2075,95 @@
         List<Issue> removeIssues = Lists.newArrayList();
 
         for (Long issueId : issueForm.getRemoveIds()) {
+            //�븯�쐞�씠�뒋 泥댄겕
+            List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId);
+            if(downIssues != null && downIssues.size() > 0){
+                for(Issue downIssue : downIssues){
+                    if(downIssue.getParentIssue() != null){
+                        downIssue.setParentIssue(null);
+                    }
+                }
+            }
+
             Issue issue = this.issueRemoves(issueId, user);
             removeIssues.add(issue);
         }
 
-        if (removeIssues.size() > 0) {
-            //this.issueRepository.deleteAll(removeIssues);
-        }
+        /*if (removeIssues.size() > 0) {
+            this.issueRepository.deleteAll(removeIssues);
+        }*/
 
         //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
         log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE));
     }
 
+    //  �씠�뒋瑜� �궘�젣�븳�떎.
+    @Override
+    @Transactional
+    public void removeAllIssues(IssueForm issueForm) {
+        //  �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎.
+        User user = this.webAppUtil.getLoginUserObject();
+        this.workspaceService.checkUseWorkspace();
+
+        if (issueForm.getRemoveIds().size() < 1) {
+            throw new OwlRuntimeException(
+                    this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT));
+        }
+
+        List<Issue> removeIssues = Lists.newArrayList();
+
+        for (Long issueId : issueForm.getRemoveIds()) {
+            //�븯�쐞�씠�뒋 泥댄겕
+            List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId);
+            if(downIssues != null && downIssues.size() > 0){
+                for(Issue downIssue : downIssues){
+                    Long downIssueId = downIssue.getId();
+                    downIssue = this.issueRemoves(downIssueId, user);
+                    removeIssues.add(downIssue);
+                }
+            }
+            Issue issue = this.issueRemoves(issueId, user);
+            removeIssues.add(issue);
+        }
+        //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
+        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE));
+    }
+
+    //  �븯�쐞�씠�뒋瑜� �궘�젣�븳�떎.
+    @Override
+    @Transactional
+    public void removeDownIssues(IssueForm issueForm) {
+        //  �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎.
+        User user = this.webAppUtil.getLoginUserObject();
+        this.workspaceService.checkUseWorkspace();
+
+        if (issueForm.getRemoveIds().size() < 1) {
+            throw new OwlRuntimeException(
+                    this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT));
+        }
+
+        List<Issue> removeIssues = Lists.newArrayList();
+        Long downIssueId = 0L;
+        for (Long issueId : issueForm.getRemoveIds()) {
+            //�궘�젣 �븷 �씠�뒋�쓽 �븯�쐞�씠�뒋 泥댄겕
+            List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId);
+            if(downIssues != null && downIssues.size() > 0){
+                for(Issue downIssue : downIssues){
+                    downIssueId = downIssue.getId();
+                }
+            }
+            Issue issue = this.issueRemoves(downIssueId, user);
+            removeIssues.add(issue);
+        }
+        //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
+        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE));
+    }
+
     private Issue issueRemoves(Long issueId, User user) {
-        Issue issue = this.getIssue(issueId);
+        Issue issue = null;
+        if(issueId != null){
+            issue = this.getIssue(issueId);
+        }
         //  �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤
         this.verifyIssueModifyPermission(issue, user);
 
@@ -2074,6 +2178,17 @@
             this.attachedFileService.removeAttachedFiles(attachedFileIds);
         }
 
+        // 吏��슱 �씠�뒋媛� �뿰愿��씠�뒋�씤吏� 泥댄겕 �썑 �뿰愿��씠�뒋 �뀒�씠釉붿뿉�꽌�룄 �궘�젣�븳�떎.
+        List<IssueRelation> issueRelationList = this.issueRelationRepository.findByRelationIssueId(issueId);
+        if (issueRelationList != null && issueRelationList.size() > 0) {
+            for(IssueRelation issueRelation : issueRelationList){
+                StringBuilder sb = new StringBuilder();
+                issueHistoryService.detectRelationIssue(IssueHistoryType.DELETE, issueRelation, sb);
+                issueHistoryService.addIssueHistory(issueRelation.getIssue(), IssueHistoryType.MODIFY, sb.toString());
+                this.issueRelationRepository.delete(issueRelation);
+            }
+        }
+
         //  �씠�뒋 �깮�꽦, �궘�젣�떆 �삁�빟 �씠硫붿씪�뿉 �벑濡앺빐�넃�뒗�떎.
         this.reservationIssueEmail(issue, EmailType.ISSUE_REMOVE);
         //  �씠�뒋 �궘�젣

--
Gitblit v1.8.0