From ebfd37816a332308519b30af5bfb017c5052be69 Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 목, 13 1월 2022 17:34:35 +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 |  585 +++++++++++++++++++++++++++++++++------------------------
 1 files changed, 338 insertions(+), 247 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 b132251..fefabe8 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -11,14 +11,14 @@
 import kr.wisestone.owl.domain.enumType.EmailType;
 import kr.wisestone.owl.domain.enumType.IssueHistoryType;
 import kr.wisestone.owl.domain.enumType.IssueStatusType;
+import kr.wisestone.owl.exception.ApiAuthException;
+import kr.wisestone.owl.exception.ApiParameterException;
 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;
-import kr.wisestone.owl.repository.UserDepartmentRepository;
-import kr.wisestone.owl.repository.WorkflowDepartmentRepository;
+import kr.wisestone.owl.repository.*;
 import kr.wisestone.owl.service.*;
 import kr.wisestone.owl.util.*;
 import kr.wisestone.owl.util.DateUtil;
@@ -33,6 +33,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;
@@ -83,6 +85,9 @@
 
     @Autowired
     private CompanyFieldService companyFieldService;
+
+    @Autowired
+    private CompanyFieldCategoryService companyFieldCategoryService;
 
     @Autowired
     private IspFieldService ispFieldService;
@@ -178,6 +183,15 @@
     private IssueMapper issueMapper;
 
     @Autowired
+    private IssueCompanyRepository issueCompanyRepository;
+
+    @Autowired
+    private IssueIspRepository issueIspRepository;
+
+    @Autowired
+    private IssueHostingRepository issueHostingRepository;
+
+    @Autowired
     private ExcelConditionCheck excelConditionCheck;
 
     @Autowired
@@ -194,6 +208,12 @@
 
     @Autowired
     private WorkflowDepartmentRepository workflowDepartmentRepository;
+
+    @Autowired
+    private IssueRelationMapper issueRelationMapper;
+
+    @Autowired
+    private WorkflowTransitionService workflowTransitionService;
 
     @Override
     protected JpaRepository<Issue, Long> getRepository() {
@@ -223,14 +243,14 @@
 
     private IssueForm convertToIssueForm(IssueApiForm issueApiForm, User user) {
         if (issueApiForm.getIssueTypeId() == null) {
-            throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_ISSUE_TYPE_ERROR));
+            throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_ISSUE_TYPE_ERROR));
         }
 
         IssueForm issueForm = ConvertUtil.copyProperties(issueApiForm, IssueForm.class);
 //        issueForm.setFiles(issueApiForm.getFiles());
         IssueType issueType = this.issueTypeService.getIssueType(issueApiForm.getIssueTypeId());
         if (issueType == null){
-            throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_ISSUE_TYPE_ERROR));
+            throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_ISSUE_TYPE_ERROR));
         }
 
         Workflow workflow = issueType.getWorkflow();
@@ -244,13 +264,16 @@
                 }
             }
         } else if (issueApiForm.getIssueStatusId() == null){
-            throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_ISSUE_STATUS_NOT_EXIST));
+            throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_ISSUE_STATUS_NOT_EXIST));
+        } else if (!this.workflowTransitionService.contains(issueApiForm.getIssueStatusId(), workflow.getId())) {
+            //�씠�뒋 �긽�깭 �쑀�슚�꽦 �솗�씤
+            throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_ISSUE_STATUS_NOT_EXIST_IN_WORKFLOW));
         }
 
         // �봽濡쒖젥�듃 �엯�젰
         Project project = issueType.getProject();
         if (project == null){
-            throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_PROJECT_ERROR));
+            throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_PROJECT_ERROR));
         }
         issueForm.setProjectId(project.getId());
 
@@ -280,24 +303,10 @@
             if (customFieldApiOverlaps != null && customFieldApiOverlaps.size() > 0) {
                 for (int i = 0; i < customFieldApiOverlaps.size(); i++) {
                     CustomFieldApiOverlap customFieldApiOverlap = customFieldApiOverlaps.get(i);
-                    CustomField customField = customFieldApiOverlap.getCustomField();
-                    if (customField.getCustomFieldType() == CustomFieldType.SITE) {
-                        for (Map<String, Object> map : issueApiForm.getCustomFieldValues()) {
-                            if (customField.getId().equals(MapUtil.getLong(map, "customFieldId"))) {
-                                String fullUrl = MapUtil.getString(map, "useValue");
-                                String url = CommonUtil.getUrl(fullUrl);
-                                if (!url.equals("")) {
-                                    issueApiForm.setUrl(fullUrl);
-                                    break;
-                                }
-                            }
-                        }
-
-                    }
                     issueApiForm.addUseIssueCustomFieldId(customFieldApiOverlap.getCustomField().getId());
                 }
 
-                // 以묐났�맂 �씠�뒋寃��깋
+                // 醫낅즺�긽�깭媛� �븘�땶 以묐났�맂 �긽�쐞 �씠�뒋寃��깋
                 List<Issue> issues = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId());
                 int size = issues.size();
                 if (size > 0) {
@@ -315,7 +324,7 @@
             // �궗�슜�옄 �젙�쓽 �븘�뱶 �꽕�젙
             issueForm.setIssueCustomFields(issueApiForm.getCustomFieldValues());
             //  媛숈� �룄硫붿씤 �뾽泥� 李얘린
-            this.findCompanyField(issueForm, issueApiForm.getUrl());
+            this.findCompanyField(issueForm);
 
             // api �엯�젰媛� �쟻�슜
             ConvertUtil.copyProperties(issueApiForm, issueForm);
@@ -323,44 +332,54 @@
             return issueForm;
 
         } else {
-            throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_USER_ERROR));
+            throw new ApiAuthException(this.messageAccessor.getMessage(MsgConstants.API_USER_ERROR));
         }
     }
 
-    private void findCompanyField(IssueForm issueForm, String url) {
+    private IssueForm findCompanyField(IssueForm issueForm) {
         if(issueForm.getIssueCustomFields() != null && issueForm.getIssueCustomFields().size() > 0) {
             CompanyFieldCondition condition = new CompanyFieldCondition();
-            condition.setUrl(url);
             List<Map<String, Object>> companyFields = this.companyFieldService.find(condition);
             List<Map<String, Object>> issueCompanyFields = Lists.newArrayList();
             List<Map<String, Object>> issueIspFields = Lists.newArrayList();
             List<Map<String, Object>> issueHostingFields = Lists.newArrayList();
 
-            if (companyFields != null && companyFields.size() > 0) {
-                Map<String, Object> companyFieldMap = companyFields.get(0);
-                companyFieldMap.put("companyId", companyFieldMap.get("id"));
-
-                issueCompanyFields.add(companyFieldMap);
+            for (Map<String, Object> issueCustomField : issueForm.getIssueCustomFields()) {
+                Long customFieldId = MapUtil.getLong(issueCustomField, "customFieldId");
+                CustomField customField = this.customFieldService.getCustomField(customFieldId);
+                if(customField != null && customField.getCustomFieldType().toString().equals("SITE") && customField.getName().equals("�룄硫붿씤")) {
+                    String useValue = issueCustomField.get("useValue").toString();
+                    if(companyFields != null && companyFields.size() > 0) {
+                        for (Map<String, Object> companyField : companyFields) {
+                            CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class);
+                            if(useValue.equals(companyFieldVo.getUrl())) {
+                                companyField.put("companyId", companyField.get("id"));
+                                issueCompanyFields.add(companyField);
+                                if(companyFieldVo.getIspId() != null) {
+                                    Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId());
+                                    if (ispField != null) {
+                                        ispField.put("ispId", ispField.get("id"));
+                                        issueIspFields.add(ispField);
+                                    }
+                                }
+                                if(companyFieldVo.getHostingId() != null) {
+                                    Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId());
+                                    if (hostingField != null) {
+                                        hostingField.put("hostingId", hostingField.get("id"));
+                                        issueHostingFields.add(hostingField);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
                 issueForm.setIssueCompanyFields(issueCompanyFields);
-
-                IspField ispField = this.ispFieldService.getIsp(MapUtil.getLong(companyFieldMap, "ispId"));
-                if (ispField != null) {
-                    Map<String, Object> ispFieldMap = ConvertUtil.convertObjectToMap(ispField);
-                    ispFieldMap.put("ispId", ispField.getId());
-                    issueIspFields.add(ispFieldMap);
-                }
-
-                HostingField hostingField = this.hostingFieldService.getHosting(MapUtil.getLong(companyFieldMap, "hostingId"));
-                if (hostingField != null) {
-                    Map<String, Object> hostingFieldMap = ConvertUtil.convertObjectToMap(hostingField);
-                    hostingFieldMap.put("hostingId", hostingField.getId());
-                    issueHostingFields.add(hostingFieldMap);
-                }
-
                 issueForm.setIssueIspFields(issueIspFields);
                 issueForm.setIssueHostingFields(issueHostingFields);
             }
         }
+
+        return issueForm;
     }
 
     private User convertToUser(String token) {
@@ -386,7 +405,14 @@
         } else {
             // 媛��긽 �긽�쐞 �씠�뒋 異붽�
             IssueForm parentIssueForm = issueForm.clone();
+            // 媛��긽 �긽�쐞 �씠�뒋 異붽�
             parentIssueForm.setUseIssueCustomFields(issueApiForm.getUseIssueCustomFieldIds());
+            //  媛숈� �룄硫붿씤 �뾽泥� 李얘린
+            IssueForm partners = this.findCompanyField(parentIssueForm);
+            parentIssueForm.setIssueCompanyFields(partners.getIssueCompanyFields());
+            parentIssueForm.setIssueIspFields(partners.getIssueIspFields());
+            parentIssueForm.setIssueHostingFields(partners.getIssueHostingFields());
+
             Issue issue = addIssue(user, parentIssueForm, null);
             issues.add(issue);
             // �븯�쐞 �씠�뒋 異붽�
@@ -419,7 +445,9 @@
             IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator();
             Collections.sort(issueCustomFieldValueForms, comp);
 
+            List<String> userValues = Lists.newArrayList();
             for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
+                userValues.add(issueCustomFieldValueForm.getUseValue());
                 for(CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
                     if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) {
                         if (useIdx > 0) {
@@ -433,7 +461,9 @@
 
             IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
             issueCustomFieldValueCondition.setUseValue(concatUseValue);
+            issueCustomFieldValueCondition.setUseValues(userValues);
             issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId());
+            issueCustomFieldValueCondition.setIssueStatusType("CLOSE");
             List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
             if (results != null && results.size() > 0) {
                 for (Map<String, Object> result : results) {
@@ -503,7 +533,6 @@
         this.issueIspService.modifyIssueIspField(issue, issueForm);
         //  HOSTING �젙蹂� ���옣
         this.issueHostingService.modifyIssueHostingField(issue, issueForm);
-
 
         //  泥⑤� �뙆�씪 ���옣
         //  multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎.
@@ -721,7 +750,7 @@
     }
 
     //  �씠�뒋 �젙蹂대�� �씠硫붿씪 �쟾�넚�뿉 �궗�슜�븯湲� �쐞�빐 Map �삎�깭濡� 蹂��솚�븳�떎.
-    private void makeIssueMapToIssue(Issue issue, Map<String, Object> issueMap) {
+    public void makeIssueMapToIssue(Issue issue, Map<String, Object> issueMap) {
         issueMap.put("title", issue.getTitle());
         issueMap.put("issueNumber", issue.getIssueNumber());
         issueMap.put("issueTypeName", issue.getIssueType().getName());
@@ -913,22 +942,19 @@
             return Lists.newArrayList();
         }
 
-        //  �뒠�떇 �쟾 - 1.3 / 1.2 / 1.1
-        //  �뒠�떇 �썑 (�떒�씪/�떎以� 寃��깋 議곌굔 3媛� 湲곗�) - 0.49 / 0.41 / 0.47 / 0.41
-
         List<IssueVo> issueVos = Lists.newArrayList();  //  �씠�뒋 紐⑸줉 �뜲�씠�꽣 ���옣 而щ젆�뀡
         //  �궗�슜�옄 �젙�쓽 �븘�뱶濡� 寃��깋�븳 �씠�뒋 �븘�씠�뵒 媛�
         List<String> issueKeys = Lists.newArrayList(issueIds);
         issueCondition.setIssueIds(issueKeys);
-
-        issueCondition.setLoginUserId(this.webAppUtil.getLoginId());
-        issueCondition.setWorkspaceId(this.userService.getUser(this.webAppUtil.getLoginId()).getLastWorkspaceId());
         User user = this.webAppUtil.getLoginUserObject();
+
+        issueCondition.setLoginUserId(user.getId());
+        issueCondition.setWorkspaceId(user.getLastWorkspaceId());
 
 
         List<Map<String, Object>> results = Lists.newArrayList();
         Long totalCount = 0L;
-        UserLevel userLevel = this.userLevelService.getUserLevel(user.getUserLevel().getId());
+//        UserLevel userLevel = this.userLevelService.getUserLevel(user.getUserLevel().getId());
 
 //        if (!this.userWorkspaceService.checkWorkspaceManager(user)
 //                && !MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE)) { //理쒓퀬愿�由ъ옄 & �봽濡쒖젥�듃,�씠�뒋 愿�由ъ옄 �씪 寃쎌슦 紐⑤뱺 �씠�뒋 蹂닿린
@@ -938,17 +964,18 @@
 //            results = this.issueMapper.findByDepartment(issueCondition);
 //            totalCount = this.issueMapper.countByDepartment(issueCondition);
 //        }*/
+//        StopWatch serviceStart = new StopWatch();
+//        serviceStart.start();
         results = this.issueMapper.find(issueCondition);
+//         serviceStart.stop();
+//        log.error("result : " + serviceStart.toString());
+
+//        serviceStart = new StopWatch();
+//        serviceStart.start();
         totalCount = this.issueMapper.count(issueCondition);
 
-
-        //  �뒠�떇 �쟾 - 0.8, 0.9, 0.9, 0.9, 0.9
-        /*StopWatch serviceStart = new StopWatch();
-        serviceStart.start();*/
-        //  �뒠�떇 �쟾 - 1.1, 1.1, 1.3, 1.2
-
-        /*serviceStart.stop();
-        log.debug("serviceENd1 : " + serviceStart.getTime());*/
+//        serviceStart.stop();
+//        log.error("totalCount : " + serviceStart.toString());
 
         int totalPage = (int) Math.ceil((totalCount - 1) / pageable.getPageSize()) + 1;
         //  �씠�뒋 �븘�씠�뵒 珥덇린�솕
@@ -964,8 +991,8 @@
             this.setDownIssues(user, issueVos);
             this.setRelationIssues(issueVos);
         }
-        this.setCountDownIssues(issueVos);
 
+        this.setCountDownIssues(issueVos);
         this.SetWorkflowDepartment(issueVos); //�썙�겕�뵆濡쒖슦�뿉 �꽕�젙�븳 �떞�떦遺��꽌 媛��졇�삤湲�
 
         resJsonData.put(Constants.RES_KEY_CONTENTS, issueVos);
@@ -1462,11 +1489,24 @@
     @Transactional(readOnly = true)
     public void detailIssue(Map<String, Object> resJsonData, IssueCondition issueCondition) {
         IssueVo issueVo = new IssueVo();
+        Pageable relPageable = issueCondition.getRelPageable();
+        Pageable downPageable = issueCondition.getDownPageable();
 
         if (issueCondition.getId() != null) {
             Issue issue = this.getIssue(issueCondition.getId());
             issueVo = ConvertUtil.copyProperties(issue, IssueVo.class);
             User user = this.webAppUtil.getLoginUserObject();
+
+            if (relPageable != null) {
+                issueVo.setRelPageNumber(relPageable.getPageNumber());
+                issueVo.setRelPageSize(relPageable.getPageSize());
+                issueVo.setRelPage(relPageable.getPageNumber() * relPageable.getPageSize());
+            }
+            if (downPageable != null) {
+                issueVo.setDownPageNumber(downPageable.getPageNumber());
+                issueVo.setDownPage(downPageable.getPageNumber() * downPageable.getPageSize());
+                issueVo.setDownPageSize(downPageable.getPageSize());
+            }
 
             switch (issueCondition.getDeep()) {
                 case "01": //  �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭,  �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦遺��꽌, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� �뀑�똿�븳�떎.
@@ -1483,17 +1523,15 @@
                     this.setIssueCustomFields(issue, issueVo);  //  �궗�슜�옄 �젙�쓽 �븘�뱶 媛� �젙蹂� �뀑�똿
                     this.setRelationIssue(issue, issueVo);        //�뿰愿� �씪媛� �뀑�똿
                     this.setDownIssues(issue, issueVo); //�븯�쐞 �씠�뒋 �꽭�똿
-
                     break;
 
                 case "02": //  �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭,  �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂�, �뙎湲�, 湲곕줉�쓣 �뀑�똿�븳�떎.
                     this.setIssueDetail(issueVo, issue, user);    //  �씠�뒋 �긽�꽭 �젙蹂대�� �뀑�똿�븳�떎.
-                    this.setIssueTableConfigs(issue, issueVo);
+                    this.setIssueTableConfigs(issue, issueVo, issueCondition);
                     issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class));
                     break;
             }
         }
-
         //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
         log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_DETAIL));
 
@@ -1501,8 +1539,9 @@
     }
 
     // �뀒�씠釉� �꽕�젙 �뀑�똿
-    private void setIssueTableConfigs(Issue issue, IssueVo issueVo) {
-        Long IssueTypeId = issue.getIssueType().getId();
+    private void setIssueTableConfigs(Issue issue, IssueVo issueVo, IssueCondition issueCondition) {
+        //Long IssueTypeId = issue.getIssueType().getId();
+        Long IssueTypeId = issueCondition.getIssueTypeId();
 
         for (int tableConfigType : IssueTableConfig.IssueTableTypes) {
             if (tableConfigType != IssueTableConfig.ISSUE_TABLE_TYPE_MAIN) {
@@ -1522,8 +1561,21 @@
 
     // �븯�쐞 �씠�뒋 �젙蹂대�� �뀑�똿�븳�떎
     private void setDownIssues(Issue issue, IssueVo issueVo) {
-        List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId());
-        if(downIssues != null && downIssues.size()>0){
+        Page<Issue> downIssues = null;
+
+        List<Issue> downIssueList = this.issueRepository.findByParentIssueId(issue.getId());
+        if(downIssueList != null && downIssueList.size() > 0) {
+            int startPage = 0;
+            if (issueVo.getDownPage() != 0) {
+                startPage = (int) Math.floor(issueVo.getDownPage()/issueVo.getDownPageSize());
+            }
+            Pageable pageable = PageRequest.of(startPage, issueVo.getDownPageSize());
+            downIssues = this.issueRepository.findByParentIssueId(issue.getId(), pageable);
+        }
+        if(downIssues != null){
+            issueVo.setDownTotalPage(downIssues.getTotalPages());
+            issueVo.setDownTotalCount(downIssues.getTotalElements());
+
             List<IssueVo> resultList = new ArrayList<>();
             for(Issue downIssue : downIssues){
                 IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
@@ -1540,6 +1592,8 @@
                 this.setIssueCustomFields(downIssue, downIssueVo);   // �궗�슜�옄�젙�쓽�븘�뱶 �젙蹂� �꽭�똿
                 this.setIssueHistory(downIssue, downIssueVo);   //  �씠�뒋 湲곕줉 �젙蹂� �뀑�똿
                 this.setIssueComments(downIssue, downIssueVo);  //  �뙎湲� �젙蹂� �뀑�똿
+
+                downIssueVo.setModifyPermissionCheck(issueVo.getModifyPermissionCheck());
 
                 resultList.add(downIssueVo);
             }
@@ -1621,13 +1675,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();
 
-                Issue relationIssue = issueRelation.getRelationIssue();
+        List<Map<String, Object>> results = this.issueRelationMapper.findByIssueId(issueVo);
+        Long totalCount = this.issueRelationMapper.count(issueVo);
 
+        if (issue != null && issueVo != null && results.size() > 0) {
+            int totalPage = (int) Math.ceil((totalCount - 1) / issueVo.getRelPageSize()) + 1;
+            issueVo.setRelTotalPage(totalPage);
+            issueVo.setRelTotalCount(totalCount);
+            for (Map<String, Object> result : results) {
+                IssueRelationVo issueRelationVo = ConvertUtil.convertMapToClass(result, IssueRelationVo.class);
+                Issue relationIssue = this.findOne(MapUtil.getLong(result, "relationIssueId"));
                 IssueVo relIssueVo = ConvertUtil.copyProperties(relationIssue, IssueVo.class);
                 Project project = this.projectService.getProject(relationIssue.getProject().getId());
                 relIssueVo.setProjectId(project.getId());
@@ -1643,6 +1702,8 @@
                 IssueStatusVo issueStatusVo = ConvertUtil.copyProperties(relationIssue.getIssueStatus(), IssueStatusVo.class, "issueStatusType");
                 issueStatusVo.setIssueStatusType(relationIssue.getIssueStatus().getIssueStatusType().toString());
                 issueRelationVo.setIssueStatusVo(issueStatusVo);
+
+                issueRelationVo.setModifyPermissionCheck(issueVo.getModifyPermissionCheck());
 
                 this.setRegister(relationIssue, relIssueVo); // �벑濡앹옄
                 this.setIssueDepartment(relationIssue, relIssueVo);  //  �떞�떦遺��꽌 �젙蹂� �뀑�똿
@@ -1760,6 +1821,7 @@
         List<Issue> resultIssueVos = Lists.newArrayList();
         String comma = ",";
 
+        List<String> userValues = Lists.newArrayList();
         if (issueCustomFieldValueForms.size() > 0) {
             IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator();
             Collections.sort(issueCustomFieldValueForms, comp);
@@ -1767,6 +1829,7 @@
             String concatUseValue = "";
             for (int i = 0; i < issueCustomFieldValueForms.size(); i++) {
                 IssueCustomFieldValueForm issueCustomFieldValueForm = issueCustomFieldValueForms.get(i);
+                userValues.add(issueCustomFieldValueForm.getUseValue());
                 if (i > 0) {
                     concatUseValue = concatUseValue.concat(comma);
                 }
@@ -1775,6 +1838,7 @@
 
             IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
             issueCustomFieldValueCondition.setUseValue(concatUseValue);
+            issueCustomFieldValueCondition.setUseValues(userValues);
             issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId());
             List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
             if (results != null && results.size() > 0) {
@@ -1817,14 +1881,15 @@
                 Issue parentIssue = modifyIssue.getParentIssue();
                 IssueType issueType = modifyIssue.getIssueType();
 
+                Set<IssueTypeApiEndStatus> issueTypeApiEndStatuses = issueType.getIssueTypeApiEndStatuses();
+                IssueTypeApiEndStatus issueStatus = null;
+                if (issueTypeApiEndStatuses != null && issueTypeApiEndStatuses.size() > 0) {
+                    issueStatus = issueTypeApiEndStatuses.iterator().next();
+                } else {
+                    throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_COMPLETE_ISSUE_STATUS_NOT_EXIST));
+                }
+
                 if (parentIssue != null) {
-                    Set<IssueTypeApiEndStatus> issueTypeApiEndStatuses = issueType.getIssueTypeApiEndStatuses();
-                    IssueTypeApiEndStatus issueStatus = null;
-                    if (issueTypeApiEndStatuses != null && issueTypeApiEndStatuses.size() > 0) {
-                        issueStatus = issueTypeApiEndStatuses.iterator().next();
-                    } else {
-                        throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.API_COMPLETE_ISSUE_STATUS_NOT_EXIST));
-                    }
 
                     IssueCondition issueCondition = new IssueCondition(issueVo.getId(), parentIssue.getId());
                     List<Map<String, Object>> results = this.issueMapper.findNotCompleteByParentIssueId(issueCondition);
@@ -1897,6 +1962,13 @@
     // �씠�뒋 �닔�젙(API�슜)
     private Issue modifyIssueForApi(User user, IssueForm issueForm, List<MultipartFile> multipartFiles) {
         CheckIssueData checkIssueData = this.checkIssue(user, issueForm);
+
+        if (issueForm.getComment() != null && !issueForm.getComment().equals("")) { //�뙎湲� 異붽�
+            IssueCommentForm issueCommentForm = new IssueCommentForm();
+            issueCommentForm.setDescription(issueForm.getComment());
+            issueCommentForm.setIssueId(issueForm.getId());
+            this.issueCommentService.addIssueComment(issueCommentForm, user);
+        }
 
         // �씠�뒋 �씠�젰 �궓湲곌린
         this.addIssueHistoryModify(user, issueForm, checkIssueData, multipartFiles);
@@ -2733,6 +2805,26 @@
             CompanyField companyField = issueCompany.getCompanyField();
             if (companyField != null) {
                 issueCompanyVo.setCompanyId(issueCompany.getCompanyField().getId());
+                if (issueCompany.getCompanyTypeId() != null) {
+                    CompanyFieldCategory companyType = this.companyFieldCategoryService.find(issueCompany.getCompanyTypeId());
+                    issueCompanyVo.setCompanyTypeName(companyType.getUseValue());
+                }
+                if (issueCompany.getParentSectorId() != null) {
+                    CompanyFieldCategory parentSector = this.companyFieldCategoryService.find(issueCompany.getParentSectorId());
+                    issueCompanyVo.setParentSectorName(parentSector.getUseValue());
+                }
+                if (issueCompany.getChildSectorId() != null) {
+                    CompanyFieldCategory childSector = this.companyFieldCategoryService.find(issueCompany.getChildSectorId());
+                    issueCompanyVo.setChildSectorName(childSector.getUseValue());
+                }
+                if (issueCompany.getRegionId() != null) {
+                    CompanyFieldCategory region = this.companyFieldCategoryService.find(issueCompany.getRegionId());
+                    issueCompanyVo.setRegionName(region.getUseValue());
+                }
+                if (issueCompany.getStatusId() != null) {
+                    CompanyFieldCategory status = this.companyFieldCategoryService.find(issueCompany.getStatusId());
+                    issueCompanyVo.setStatusName(status.getUseValue());
+                }
             }
             issueCompanyVos.add(issueCompanyVo);
         }
@@ -2875,11 +2967,8 @@
         excelInfo.setFileName(this.messageAccessor.message("common.registerExcelIssue")); // �뿊��濡� �씠�뒋 �벑濡앺븯湲�
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.title"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // �젣紐�
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.content"), 40, ExportExcelAttrVo.ALIGN_CENTER)); // �궡�슜
-        excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.projectKey"), 10, ExportExcelAttrVo.ALIGN_LEFT)); // �봽濡쒖젥�듃 �궎
-        excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.issueType"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �씠�뒋 ���엯
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.priority"), 5, ExportExcelAttrVo.ALIGN_CENTER)); // �슦�꽑�닚�쐞
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.importance"), 5, ExportExcelAttrVo.ALIGN_CENTER)); // 以묒슂�룄
-        excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.department"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �떞�떦遺��꽌
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.startDate"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �떆�옉�씪
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.endDate"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // 醫낅즺�씪
         //  �봽濡쒖젥�듃�뿉 �뿰寃곕맂 �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� 異붿텧�븯�뿬 �뿊�� download �뀥�뵆由우쓣 留뚮뱺�떎.
@@ -2903,7 +2992,7 @@
     //  �뿊�� import 濡� �씠�뒋瑜� �벑濡앺븳�떎.
     @Override
     @Transactional
-    public void importExcel(MultipartFile multipartFile) throws Exception {
+    public void importExcel(IssueForm issueForm, MultipartFile multipartFile) throws Exception {
         /*StopWatch serviceStart = new StopWatch();
         serviceStart.start();*/
 
@@ -2914,19 +3003,16 @@
             //  �뾽濡쒕뱶 �뙆�씪 �솗�옣�옄 泥댄겕
             this.verifyMultipartFileExtension(multipartFile);
 
-            Map<String, Project> projectMaps = new HashMap<>(); //  �봽濡쒖젥�듃 紐⑥쓬
-            Map<String, IssueType> issueTypeMaps = new HashMap<>(); //  �씠�뒋 ���엯 紐⑥쓬
             Map<String, Priority> priorityMaps = new HashMap<>();   //  �슦�꽑 �닚�쐞 紐⑥쓬
             Map<String, Severity> severityMaps = new HashMap<>();   //  以묒슂�룄 紐⑥쓬
-            Map<String, Object> userMaps = new HashMap<>(); //  �궗�슜�옄 紐⑥쓬
             Map<String, DepartmentVo> departmentMaps = new HashMap<>(); //  遺��꽌 紐⑥쓬
             Map<String, CustomField> customFieldMaps = new HashMap<>();
-            Map<String, IssueStatus> issueStatusReadyMaps = new HashMap<>();   //  �긽�깭 �냽�꽦 '��湲�'�씤 �씠�뒋 �긽�깭
             Map<Long, Long> issueNumberMaps = new HashMap<>();  //  �씠�뒋 踰덊샇 紐⑥쓬
             Map<String, Long> issueTypeCustomFieldMaps = new HashMap<>(); //  �씠�뒋 ���엯 + �궗�슜�옄 �젙�쓽 �븘�뱶 �뿰寃� �젙蹂�
+
             Workspace workspace = this.workspaceService.getWorkspace(this.userService.getUser(this.webAppUtil.getLoginId()).getLastWorkspaceId());  //  �씠�뒋瑜� �꽔�쑝�젮�뒗 �뾽臾� 怨듦컙
             //  �씠�뒋�쓽 二쇱슂 �냽�꽦�쓣 map �뿉 ���옣�븯�뿬 �뿊�� import �뿉�꽌 吏��젙�븳 ���긽(�씠�뒋 �냽�꽦)�쓣 鍮좊Ⅴ寃� 李얠쓣 �닔 �엳寃� �븳�떎.
-            this.IssueAttributeMapToList(projectMaps, issueTypeMaps, priorityMaps, severityMaps, userMaps, departmentMaps, customFieldMaps, issueNumberMaps, issueTypeCustomFieldMaps, issueStatusReadyMaps);
+            this.IssueAttributeMapToList(issueForm, priorityMaps, severityMaps, departmentMaps, customFieldMaps, issueTypeCustomFieldMaps);
             //  0.237 - 0.230
 
             List<IssueForm> issueForms = Lists.newArrayList();
@@ -2969,7 +3055,14 @@
                 //  1踰� �뿤�뜑遺��꽣 �뜲�씠�꽣 �쁺�뿭
                 if (rowIndex > 1) {
                     //  �씠�뒋濡� �벑濡앺븯湲� �쐞�빐 IssueForm �뿉 �뜲�씠�꽣瑜� �뀑�똿�븳�떎.
-                    issueForms.add(this.setIssueFormToExcelField(row, (rowIndex + 1), issueStatusReadyMaps, projectMaps, issueTypeMaps, priorityMaps, severityMaps, userMaps, departmentMaps, customFieldMaps, issueNumberMaps, headers));
+                    IssueForm newIssueForm = this.setIssueFormToExcelField(row, (rowIndex + 1), priorityMaps, severityMaps, departmentMaps, customFieldMaps, headers);
+                    ConvertUtil.copyProperties(issueForm, newIssueForm);
+
+
+
+                    issueForms.add(newIssueForm);
+
+
                 }
             }
 
@@ -2980,7 +3073,50 @@
 
 
             //  �씠�뒋 �벑濡�
-            this.issueMapper.insertBatch(issueForms);
+//            this.issueMapper.insertBatch(issueForms);
+
+            for (IssueForm saveIssueForm : issueForms) {
+                Issue issue = new Issue();
+                ConvertUtil.copyProperties(saveIssueForm, issue);
+
+                IssueType issueType = this.issueTypeService.getIssueType(saveIssueForm.getIssueTypeId());
+                Workflow workflow = issueType.getWorkflow();
+
+                Project project = this.projectService.getProject(saveIssueForm.getProjectId());
+                Long issueNumber = this.issueNumberGeneratorService.generateIssueNumber(project);
+
+                IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(workflow);
+
+                issue.setPriority(this.priorityService.getPriority(saveIssueForm.getPriorityId()));
+                issue.setSeverity(this.severityService.getSeverity(saveIssueForm.getSeverityId()));
+                issue.setIssueStatus(issueStatus);
+                issue.setIssueType(issueType);
+                issue.setProject(project);
+                issue.setIssueNumber(issueNumber);
+                if (saveIssueForm.getParentIssueId() != null && saveIssueForm.getParentIssueId() > -1) {
+                    issue.setParentIssue(this.getIssue(saveIssueForm.getParentIssueId()));
+                }
+
+                issue = this.issueRepository.saveAndFlush(issue);
+
+                saveIssueForm.setId(issue.getId());
+
+                IssueDepartment issueDepartment = new IssueDepartment();
+                issueDepartment.setIssue(issue);
+                issueDepartment.setWorkspace(workspace);
+
+                List<Long> departmentsIds = this.workflowDepartmentService.findFirstDepartmentIds(workflow);
+                if (departmentsIds != null && departmentsIds.size() > 0) {
+                    for (Long departmentId : departmentsIds) {
+                        issueDepartment.setDepartment(this.departmentService.getDepartment(departmentId));
+                    }
+                    issue.addIssueDepartment(issueDepartment);
+                }
+
+                saveIssueForm.setIssueStatusId(issueStatus.getId());
+            }
+
+
             //  0.416 - 0.439
 
             //  1.373 ~ 1.394
@@ -2999,8 +3135,6 @@
             this.bulkInsertIssueCustomFieldValue(issueForms, issueTypeCustomFieldMaps);
             //  3.628 - 3.445
 
-            // �뾽泥�,ISP,�샇�뒪�똿 異붽�
-
             /*serviceStart.stop();
             log.debug("2李� ���옣 �떆媛� : " + serviceStart.getTime());*/
 
@@ -3010,7 +3144,8 @@
             //  reverse index �뾽�뜲�씠�듃
             this.issueMapper.updateBatch(issueForms);
             //  利앷��맂 �씠�뒋 踰덊샇瑜� �뾽�뜲�씠�듃 �븳�떎.
-            this.issueNumberGeneratorService.updateIssueNumber(issueNumberMaps);
+//            issueNumberMaps.put(issueForm.getProjectId(), issueForm.getProjectId());
+//            this.issueNumberGeneratorService.updateIssueNumber(issueNumberMaps);
         }
     }
 
@@ -3111,6 +3246,29 @@
                 issueCustomField.put("registerId", this.webAppUtil.getLoginId());
                 issueCustomFieldValueMaps.add(issueCustomField);
             }
+            IssueForm partners = this.findCompanyField(issueForm); // 媛숈� �룄硫붿씤 �뾽泥� 李얘린
+            Issue issue = this.findOne(issueForm.getId());
+            if (partners.getIssueCompanyFields() != null && partners.getIssueCompanyFields().size() > 0) {
+                for (Map<String, Object> company : partners.getIssueCompanyFields()) {
+                    IssueCompany issueCompany = ConvertUtil.convertMapToClass(company, IssueCompany.class);
+                    issueCompany.setIssue(issue);
+                    this.issueCompanyRepository.saveAndFlush(issueCompany);
+                }
+            }
+            if (partners.getIssueIspFields() != null && partners.getIssueIspFields().size() > 0) {
+                for (Map<String, Object> isp : partners.getIssueIspFields()) {
+                    IssueIsp issueIsp = ConvertUtil.convertMapToClass(isp, IssueIsp.class);
+                    issueIsp.setIssue(issue);
+                    this.issueIspRepository.saveAndFlush(issueIsp);
+                }
+            }
+            if (partners.getIssueHostingFields() != null && partners.getIssueHostingFields().size() > 0) {
+                for (Map<String, Object> hosting : partners.getIssueHostingFields()) {
+                    IssueHosting issueHosting = ConvertUtil.convertMapToClass(hosting, IssueHosting.class);
+                    issueHosting.setIssue(issue);
+                    this.issueHostingRepository.saveAndFlush(issueHosting);
+                }
+            }
         }
 
         if (issueCustomFieldValueMaps.size() > 0) {
@@ -3119,48 +3277,15 @@
     }
 
     //  �씠�뒋�쓽 二쇱슂 �냽�꽦�쓣 map �뿉 ���옣�븯�뿬 �뿊�� import �뿉�꽌 吏��젙�븳 ���긽(�씠�뒋 �냽�꽦)�쓣 鍮좊Ⅴ寃� 李얠쓣 �닔 �엳寃� �븳�떎.
-    private void IssueAttributeMapToList(Map<String, Project> projectMaps, Map<String, IssueType> issueTypeMaps, Map<String, Priority> priorityMaps, Map<String, Severity> severityMaps,
-                                         Map<String, Object> userMaps, Map<String, DepartmentVo> departmentMaps, Map<String, CustomField> customFieldMaps, Map<Long, Long> issueNumberMaps, Map<String, Long> issueTypeCustomFieldMaps, Map<String, IssueStatus> issueStatusReadyMaps) {
-        //  �봽濡쒖젥�듃 �궎濡� 諛붾줈 李얠쓣 �닔 �엳寃� 以�鍮�
-        List<Project> projects = this.projectService.findByWorkspaceId();
-        List<Long> projectIds = Lists.newArrayList();
+    private void IssueAttributeMapToList(IssueForm issueForm, Map<String, Priority> priorityMaps, Map<String, Severity> severityMaps,
+                                         Map<String, DepartmentVo> departmentMaps, Map<String, CustomField> customFieldMaps,Map<String, Long> issueTypeCustomFieldMaps) {
 
-        for (Project project : projects) {
-            projectIds.add(project.getId());
-            //  �빐�떦 �봽濡쒖젥�듃�뿉�꽌 �깮�꽦�릺�뒗 �떎�쓬 �씠�뒋 踰덊샇瑜� �깮�꽦�빐�삩�떎.
-            issueNumberMaps.put(project.getId(), this.issueNumberGeneratorService.generateIssueNumber(project));
-            projectMaps.put(project.getProjectKey(), project);
+        Project project = this.projectService.getProject(issueForm.getProjectId());
 
-            for (IssueTypeCustomField issueTypeCustomField : project.getIssueTypeCustomFields()) {
-                //  鍮좊Ⅴ寃� 李얘린 �쐞�빐 �씠�뒋 ���엯 �븘�씠�뵒 + �궗�슜�옄 �젙�쓽 �븘�뱶 �븘�씠�뵒瑜� �궎濡� �븳�떎.
-                String makeKey = issueTypeCustomField.getIssueType().getId().toString() + issueTypeCustomField.getCustomField().getId().toString();
-                issueTypeCustomFieldMaps.put(makeKey, issueTypeCustomField.getId());
-            }
-
-            //  �봽濡쒖젥�듃�뿉 李몄뿬�븯�뒗 �궗�슜�옄 �젙蹂�
-            List<Map<String, Object>> users = this.userService.findProjectMember(project);
-            Map<String, Object> userMap = new HashMap<>();
-            //  �궗�슜�옄 �젙蹂대�� Map �뿉 ���옣
-            for (Map<String, Object> user : users) {
-                userMap.put(CommonUtil.decryptAES128(MapUtil.getString(user, "account")), MapUtil.getLong(user, "userId"));
-            }
-            userMaps.put(project.getProjectKey(), userMap);
-        }
-
-        //  �씠�뒋 �쑀�삎�쓣 諛붾줈 李얠쓣 �닔 �엳寃� 以�鍮�
-        List<IssueType> issueTypes = this.issueTypeService.findByWorkspaceId();
-        for (IssueType issueType : issueTypes) {
-            issueTypeMaps.put(issueType.getName(), issueType);
-
-            IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(issueType.getWorkflow());
-            issueStatusReadyMaps.put(issueType.getId().toString(), issueStatus);
-
-            //  �썙�겕�뵆濡쒖슦�뿉 �냽�빐�엳�뒗 遺��꽌 �젙蹂�
-            List<DepartmentVo> departments = this.departmentService.findWorkflowDepartment(issueType.getId());
-            //  遺��꽌 �젙蹂대�� ���옣
-            for (DepartmentVo department : departments) {
-                departmentMaps.put(department.getDepartmentName(), department);
-            }
+        for (IssueTypeCustomField issueTypeCustomField : project.getIssueTypeCustomFields()) {
+            //  鍮좊Ⅴ寃� 李얘린 �쐞�빐 �씠�뒋 ���엯 �븘�씠�뵒 + �궗�슜�옄 �젙�쓽 �븘�뱶 �븘�씠�뵒瑜� �궎濡� �븳�떎.
+            String makeKey = issueTypeCustomField.getIssueType().getId().toString() + issueTypeCustomField.getCustomField().getId().toString();
+            issueTypeCustomFieldMaps.put(makeKey, issueTypeCustomField.getId());
         }
 
         //  �슦�꽑�닚�쐞瑜� 諛붾줈 李얠쓣 �닔 �엳寃� 以�鍮�
@@ -3183,8 +3308,9 @@
     }
 
     //  �뿊�� �븘�뱶�뿉 �엳�뒗 �젙蹂대�� �씠�뒋 form �쑝濡� �삷湲대떎.
-    private IssueForm setIssueFormToExcelField(Row row, int rowIndex, Map<String, IssueStatus> issueStatusReadyMaps, Map<String, Project> projectMaps, Map<String, IssueType> issueTypeMaps, Map<String,
-            Priority> priorityMaps, Map<String, Severity> severityMaps, Map<String, Object> userMaps, Map<String, DepartmentVo> departmentMaps, Map<String, CustomField> customFieldMaps, Map<Long, Long> issueNumberMaps, List<String> headers) {
+    private IssueForm setIssueFormToExcelField(Row row, int rowIndex, Map<String, Priority> priorityMaps,
+                                               Map<String, Severity> severityMaps, Map<String, DepartmentVo> departmentMaps,
+                                               Map<String, CustomField> customFieldMaps, List<String> headers) {
         IssueForm issueForm = new IssueForm();
         issueForm.setRegisterId(this.webAppUtil.getLoginId());
         Project project = null;
@@ -3208,23 +3334,12 @@
 
                     break;
 
-                case 2:    //  �봽濡쒖젥�듃 �궎�� �씠�뒋 踰덊샇
-                    project = this.setIssueFormProjectKeyAndIssueNumber(cell, issueForm, projectMaps, issueNumberMaps, rowIndex);
-                    break;
-
-                case 3:
-                    //  �씠�뒋 ���엯�쓣 IssueForm �뿉 ���옣�븳�떎.
-                    this.setIssueFormIssueType(cell, issueTypeMaps, issueForm, rowIndex);
-                    //  �씠�뒋 ���엯�뿉 �뿰寃곕맂 �썙�겕�뵆濡쒖슦�쓽 �긽�깭 �냽�꽦 '��湲�' �씤 �긽�깭瑜� issueForm �뿉 ���옣�븳�떎.
-                    this.setIssueFormIssueStatus(issueStatusReadyMaps, issueForm, rowIndex);
-                    break;
-
-                case 4:
+                case 2:
                     //  �슦�꽑�닚�쐞瑜� IssueForm �뿉 ���옣�븳�떎.
                     this.setIssueFormPriority(cell, priorityMaps, issueForm, rowIndex);
                     break;
 
-                case 5:
+                case 3:
                     //  以묒슂�룄瑜� IssueForm �뿉 ���옣�븳�떎.
                     this.setIssueFormSeverity(cell, severityMaps, issueForm, rowIndex);
                     break;
@@ -3232,21 +3347,15 @@
                     //  �떞�떦�옄瑜� IssueForm �뿉 ���옣�븳�떎.
                     this.setIssueFormAssignee(cell, userMaps, issueForm, project);
                     break;*/
-                case 6:
-                    //  �떞�떦遺��꽌瑜� IssueForm �뿉 ���옣�븳�떎.
-                    if (cell != null) {
-                        this.setIssueFormDepartment(cell, departmentMaps, issueForm, project);
-                    }
-                    break;
-                case 7:
+                case 4:
                     //  �떆�옉�씪�쓣 IssueForm �뿉 ���옣�븳�떎.
-                    if (cell != null) {
+                    if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
                         this.setIssueFormPeriod(cell, issueForm, true, rowIndex);
                     }
                     break;
-                case 8:
+                case 5:
                     //  醫낅즺�씪�쓣 IssueForm �뿉 ���옣�븳�떎.
-                    if (cell != null) {
+                    if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
                         this.setIssueFormPeriod(cell, issueForm, false, rowIndex);
                     }
                     break;
@@ -3271,17 +3380,6 @@
         //  �젣紐� �쑀�슚�꽦 泥댄겕
         this.verifyTitle(title);
         issueForm.setTitle(title);
-    }
-
-    //  �봽濡쒖젥�듃 �궎, �씠�뒋 怨좎쑀 踰덊샇, �떞�떦�옄瑜� IssueForm �뿉 ���옣�븳�떎.
-    private Project setIssueFormProjectKeyAndIssueNumber(Cell cell, IssueForm issueForm, Map<String, Project> projectMaps, Map<Long, Long> issueNumberMaps, int rowIndex) {
-        //  �봽濡쒖젥�듃 �븘�씠�뵒瑜� IssueForm �뿉 ���옣�븳�떎.
-        Project project = this.setIssueFormProject(cell, projectMaps, issueForm, rowIndex);
-
-        //  �씠�뒋 怨좎쑀 踰덊샇瑜� IssueForm �뿉 ���옣�븳�떎.
-        this.setIssueFormIssueNumber(issueForm, issueNumberMaps, project, rowIndex);
-
-        return project;
     }
 
     //  �봽濡쒖젥�듃 �븘�씠�뵒瑜� IssueForm �뿉 ���옣�븳�떎.
@@ -3317,34 +3415,6 @@
         issueNumberMaps.put(project.getId(), ++issueNumber);  //  �씠�뒋 踰덊샇瑜� 1�뵫 利앷� �떆�궓�떎.
     }
 
-    //  �씠�뒋 ���엯�쓣 IssueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormIssueType(Cell cell, Map<String, IssueType> issueTypeMaps, IssueForm issueForm, int rowIndex) {
-        if (cell == null) {
-            throw new OwlRuntimeException(
-                    this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISSUE_TYPE_IS_NULL, rowIndex));
-        }
-
-        IssueType issueType = issueTypeMaps.get(CommonUtil.convertExcelStringToCell(cell));
-
-        if (issueType == null) {
-            throw new OwlRuntimeException(
-                    this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISSUE_TYPE_NOT_EXIST, rowIndex));
-        }
-
-        issueForm.setIssueTypeId(issueType.getId());
-    }
-
-    //  �씠�뒋 ���엯�뿉 �뿰寃곕맂 �썙�겕�뵆濡쒖슦�쓽 �긽�깭 �냽�꽦 '��湲�' �씤 �긽�깭瑜� issueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormIssueStatus(Map<String, IssueStatus> issueStatusReadyMaps, IssueForm issueForm, int rowIndex) {
-        IssueStatus issueStatus = issueStatusReadyMaps.get(issueForm.getIssueTypeId().toString());
-
-        if (issueStatus == null) {
-            throw new OwlRuntimeException(
-                    this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISSUE_STATUS_READY_NOT_EXIST, rowIndex));
-        }
-
-        issueForm.setIssueStatusId(issueStatus.getId());
-    }
 
     //  �슦�꽑�닚�쐞瑜� IssueForm �뿉 ���옣�븳�떎.
     private void setIssueFormPriority(Cell cell, Map<String, Priority> priorityMaps, IssueForm issueForm, int rowIndex) {
@@ -3395,35 +3465,13 @@
             issueForm.setUserIds(userIds);
         }
     }
-
-    //  �떞�떦遺��꽌瑜� IssueForm �뿉 ���옣�븳�떎.
-    private void setIssueFormDepartment(Cell cell, Map<String, DepartmentVo> departmentMaps, IssueForm issueForm, Project project) {
-        if (cell != null) {
-            String[] splitDepartment = CommonUtil.convertExcelStringToCell(cell).split("#");
-
-            //  媛믪씠 怨듬갚�씠硫� 以묒�
-            String cellValue = CommonUtil.convertExcelStringToCell(cell);
-            if (StringUtils.isEmpty(cellValue)) {
-                return;
-            }
-
-            List<Long> departmentIds = Lists.newArrayList();
-
-            for (String department : splitDepartment) {
-                DepartmentVo departmentVo = departmentMaps.get(department);
-                departmentIds.add(departmentVo.getId());
-            }
-            issueForm.setDepartmentIds(departmentIds);
-        }
-    }
-
     //  �떆�옉�씪, 醫낅즺�씪�쓣 IssueForm �뿉 ���옣�븳�떎.
     private void setIssueFormPeriod(Cell cell, IssueForm issueForm, Boolean checkStartDate, int rowIndex) {
         if (cell != null && !cell.toString().equals("")) {
 
             //  媛믪씠 怨듬갚�씠硫� 以묒�
             String cellValue = CommonUtil.convertExcelStringToCell(cell);
-            if (StringUtils.isEmpty(cellValue)) {
+            if (StringUtils.isEmpty(cellValue) || !cell.toString().equals("null")) {
                 return;
             }
 
@@ -3452,7 +3500,7 @@
         }
     }
 
-    //  �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� IssueForm �뿉 ���옣�븳�떎.
+    //  �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� IssueForm �뿉 ���옣�븳�떎.-
     private void setIssueFormCustomFieldValue(Cell cell, Map<String, CustomField> customFieldMaps, IssueForm issueForm, String customFieldName, int rowIndex) {
         if (cell != null) {
             String cellValue = CommonUtil.convertExcelStringToCell(cell);
@@ -3618,6 +3666,37 @@
         this.systemEmailService.sendEmail(emailTemplateForm.getTitle(), emailTemplateForm.getTemplate(), sendMails, null);
 
         this.issueHistoryService.detectSendIssueMail(IssueHistoryType.SEND, emailTemplateForm.getSendEmails(), sb);
+        this.issueHistoryService.addIssueHistory(issue, IssueHistoryType.SEND, sb.toString());
+    }
+
+    @Override
+    public void sendCommonEmail(EmailCommonForm emailCommonForm) {
+        if (emailCommonForm.getSendEmails().size() < 1) {
+            throw new OwlRuntimeException(
+                    this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SEND_USER));
+        } else if (emailCommonForm.getIssueId() == null) {
+            throw new OwlRuntimeException(
+                    this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_EXIST));
+        }
+
+        Issue issue = this.getIssue(emailCommonForm.getIssueId());
+
+        //  諛쒖떊�옄 �몴�떆
+        User user = this.webAppUtil.getLoginUserObject();
+        UserVo toUser = this.webAppUtil.getLoginUser();
+
+        //  �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏�
+        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_ANOTHER_USER_SEND_EMAIL));
+        StringBuilder sb = new StringBuilder();
+
+        Locale locale = CommonUtil.getUserLanguage(user.getLanguage());
+        String[] sendMails = ConvertUtil.ToArray(emailCommonForm.getSendEmails());
+        for(int i=0; i < sendMails.length; i++) {
+            sendMails[i] = CommonUtil.decryptAES128(sendMails[i]);
+        }
+        this.systemEmailService.sendEmail(emailCommonForm.getTitle(), emailCommonForm.getDescription(), sendMails, null);
+
+        this.issueHistoryService.detectSendIssueMail(IssueHistoryType.SEND, emailCommonForm.getSendEmails(), sb);
         this.issueHistoryService.addIssueHistory(issue, IssueHistoryType.SEND, sb.toString());
     }
 
@@ -3789,44 +3868,56 @@
     @Transactional
     @Override
     public void modifyParentIssue(IssueForm issueDownForm) {
-        Issue issue = this.getIssue(issueDownForm.getId()); //�븯�쐞 �씠�뒋
+        //Issue issue = this.getIssue(issueDownForm.getId()); //�븯�쐞 �씠�뒋
         Long newParentIssueId = issueDownForm.getParentIssueId(); //蹂�寃쏀븷 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋
-
         StringBuilder sb = new StringBuilder();
 
-        Issue parentIssue = issue.getParentIssue(); //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋
-        if(parentIssue != null && parentIssue.getId().equals(newParentIssueId)){ //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋媛� 議댁옱 �븷 寃쎌슦
-            this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb);
-            this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString());
-        }
+        for (Long downId : issueDownForm.getIds()) {
+            Issue issue = this.getIssue(downId);
 
-        if (newParentIssueId != null) { // 異붽� �븷 寃쎌슦
-            parentIssue = this.getIssue(newParentIssueId); //�긽�쐞�씠�뒋(myIssue)
-            issue.setParentIssue(parentIssue); //myIssue瑜� �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋濡� set
-            this.issueHistoryService.detectDownIssues(IssueHistoryType.ADD, issue, sb); //issue = �븯�쐞�씠�뒋
-        } else{
-            // �궘�젣 �븷 寃쎌슦
-            this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb);
-            issue.setParentIssue(null);
+            Issue parentIssue = issue.getParentIssue(); //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋
+            if(parentIssue != null && parentIssue.getId().equals(newParentIssueId)){ //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋媛� 議댁옱 �븷 寃쎌슦
+                this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb);
+                this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString());
+            }
+
+            if (newParentIssueId != null) { // 異붽� �븷 寃쎌슦
+                parentIssue = this.getIssue(newParentIssueId); //�긽�쐞�씠�뒋(myIssue)
+                issue.setParentIssue(parentIssue); //myIssue瑜� �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋濡� set
+                this.issueHistoryService.detectDownIssues(IssueHistoryType.ADD, issue, sb); //issue = �븯�쐞�씠�뒋
+            } else{
+                // �궘�젣 �븷 寃쎌슦
+                this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb);
+                issue.setParentIssue(null);
+            }
+            this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString()); //parentIssue = myIssue(湲곕줉�� �쁽�옱 �긽�꽭�럹�씠吏��뿉 �빐�빞�븯�땲源�)
+            this.issueRepository.saveAndFlush(issue);
         }
-        this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString()); //parentIssue = myIssue(湲곕줉�� �쁽�옱 �긽�꽭�럹�씠吏��뿉 �빐�빞�븯�땲源�)
-        this.issueRepository.saveAndFlush(issue);
     }
 
     @Override
     public void findPartner(Map<String, Object> resJsonData, Map<String, Object> params) {
         Long issueTypeId = MapUtil.getLong(params, "issueTypeId");
-        IssueType issueType = this.issueTypeService.getIssueType(issueTypeId); // �씠�뒋�쓽 �씠�뒋�쑀�삎 媛앹껜
-        Integer using = issueType.getUsePartner() != null ? issueType.getUsePartner().intValue() : 0; // �씠�뒋�쑀�삎蹂꾨줈 �궗�슜以묒씤 �뾽泥�/ISP/�샇�뒪�똿 媛�
-
         List<UsePartnerVo> usePartnerVos = Lists.newArrayList();
+        Integer using = 0;
+
+        if (issueTypeId != null) {
+            IssueType issueType = this.issueTypeService.getIssueType(issueTypeId); // �씠�뒋�쓽 �씠�뒋�쑀�삎 媛앹껜
+            using = issueType.getUsePartner() != null ? issueType.getUsePartner().intValue() : 0; // �씠�뒋�쑀�삎蹂꾨줈 �궗�슜以묒씤 �뾽泥�/ISP/�샇�뒪�똿 媛�
+        } else {
+            for (int partner : UsePartner.partners) {
+                using += partner;
+            }
+        }
+
         for (Integer usePartner : UsePartner.partners) { //1(�뾽泥�), 2(ISP), 4(�샇�뒪�똿)
             UsePartnerVo usePartnerVo = UsePartner.checkUsePartner(using, usePartner);
             if (usePartnerVo != null) {
                 usePartnerVos.add(usePartnerVo);
             }
-            resJsonData.put(Constants.RES_KEY_CONTENTS, usePartnerVos);
         }
+
+        resJsonData.put(Constants.RES_KEY_CONTENTS, usePartnerVos);
     }
 
     @Override

--
Gitblit v1.8.0