From 4af75fe18d97960fabea0fadb28a69c01a038bc4 Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 화, 25 1월 2022 17:01:37 +0900
Subject: [PATCH] - 파트너명 특수문자 입력 가능하도록 수정 - 이슈 import/export 시 파트너 정보 추가 - 이슈상세 - 메일 기록 추가

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java        |  219 +++++++++++++++++++++++++++++++-----
 src/main/webapp/views/hostingField/hostingFieldAdd.html                  |    3 
 src/main/webapp/views/ispField/ispFieldAdd.html                          |    3 
 src/main/java/kr/wisestone/owl/service/CompanyFieldService.java          |    2 
 src/main/webapp/views/ispField/ispFieldModify.html                       |    3 
 src/main/java/kr/wisestone/owl/constant/MsgConstants.java                |    1 
 src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties                   |    1 
 src/main/webapp/scripts/app/issue/issueDetail.controller.js              |   27 ++++
 src/main/webapp/views/companyField/companyFieldModify.html               |    3 
 src/main/java/kr/wisestone/owl/domain/IssueCompany.java                  |    8 +
 src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java |    7 +
 src/main/webapp/i18n/ko/global.json                                      |    2 
 src/main/webapp/views/hostingField/hostingFieldModify.html               |    3 
 src/main/webapp/views/issue/issueDetail.html                             |   65 ++++++++--
 src/main/webapp/WEB-INF/i18n/code_ko_KR.properties                       |    3 
 src/main/webapp/views/companyField/companyFieldAdd.html                  |    4 
 16 files changed, 296 insertions(+), 58 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
index bf7f998..2822e75 100644
--- a/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
+++ b/src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -183,6 +183,7 @@
 
     public static final String EXCEL_IMPORT_COMPANY_NAME_IS_NULL = "EXCEL_IMPORT_COMPANY_NAME_IS_NULL";   //  �떎�쓬 �뿊�� �씪�씤�뿉�꽌 �뾽泥대챸�씠 �엯�젰吏� �븡�븯�뒿�땲�떎.
     public static final String EXCEL_IMPORT_URL_IS_NULL = "EXCEL_IMPORT_URL_IS_NULL";   //  �떎�쓬 �뿊�� �씪�씤�뿉�꽌 URL�씠 �엯�젰吏� �븡�븯�뒿�땲�떎.
+    public static final String EXCEL_IMPORT_COMPANY_NOT_EXIST = "EXCEL_IMPORT_COMPANY_NOT_EXIST";   //  �떎�쓬 �뿊�� �씪�씤�뿉�꽌 �엯�젰�맂 �뾽泥대챸�쑝濡� 寃��깋�릺�뒗 �뾽泥닿� �뾾�뒿�땲�떎.
     public static final String EXCEL_IMPORT_ISP_NOT_EXIST = "EXCEL_IMPORT_ISP_NOT_EXIST";   //  �떎�쓬 �뿊�� �씪�씤�뿉�꽌 �엯�젰�맂 ISP紐낆쑝濡� 寃��깋�릺�뒗 ISP媛� �뾾�뒿�땲�떎.
     public static final String EXCEL_IMPORT_HOSTING_NOT_EXIST = "EXCEL_IMPORT_HOSTING_NOT_EXIST";   //  �떎�쓬 �뿊�� �씪�씤�뿉�꽌 �엯�젰�맂 �샇�뒪�똿紐낆쑝濡� 寃��깋�릺�뒗 �샇�뒪�똿�씠 �뾾�뒿�땲�떎.
     public static final String EXCEL_IMPORT_PARENT_SECTOR_NOT_EQUAL = "EXCEL_IMPORT_PARENT_SECTOR_NOT_EQUAL";   //  �떎�쓬 �뿊�� �씪�씤�뿉�꽌 �엯�젰�맂 �뾽醫�(以묐텇瑜�)�� �뾽醫�(��遺꾨쪟)�뿉 �냽�빐�엳吏� �븡�뒿�땲�떎.
diff --git a/src/main/java/kr/wisestone/owl/domain/IssueCompany.java b/src/main/java/kr/wisestone/owl/domain/IssueCompany.java
index 3b2815f..51e8ba6 100644
--- a/src/main/java/kr/wisestone/owl/domain/IssueCompany.java
+++ b/src/main/java/kr/wisestone/owl/domain/IssueCompany.java
@@ -25,6 +25,7 @@
     private Long childSectorId;
     private Long regionId;
     private Long statusId;
+    private String statusName;
 
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "issue_id")
@@ -159,4 +160,11 @@
         this.statusId = statusId;
     }
 
+    public String getStatusName() {
+        return statusName;
+    }
+
+    public void setStatusName(String statusName) {
+        this.statusName = statusName;
+    }
 }
diff --git a/src/main/java/kr/wisestone/owl/service/CompanyFieldService.java b/src/main/java/kr/wisestone/owl/service/CompanyFieldService.java
index 00d8255..66e5cbf 100644
--- a/src/main/java/kr/wisestone/owl/service/CompanyFieldService.java
+++ b/src/main/java/kr/wisestone/owl/service/CompanyFieldService.java
@@ -40,4 +40,6 @@
     void importExcel(MultipartFile multipartFile) throws Exception;
 
     CompanyFieldVo CreateCompanyFieldCategory(CompanyFieldVo companyFieldVo, CompanyField companyField);
+
+    List<CompanyField> findAll();
 }
diff --git a/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
index 80f374d..e6ee02f 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
@@ -142,6 +142,13 @@
         return this.companyFieldMapper.find(condition);
     }
 
+    //  紐⑤뱺 �뾽泥댁젙蹂대�� 議고쉶�븳�떎. �씠�뒋 �뿊�� import �뿉�꽌 �궗�슜
+    @Override
+    @Transactional(readOnly = true)
+    public List<CompanyField> findAll() {
+        return this.companyFieldRepository.findAll();
+    }
+
     /**
      * companyFieldCategory Name �꽕�젙
      * @param companyFieldVo CompanyFieldVo
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 a772639..765ab69 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -2755,6 +2755,9 @@
         excelInfo.addAttrInfos(new ExportExcelAttrVo("register", this.messageAccessor.message("common.register"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // �벑濡앹옄
         excelInfo.addAttrInfos(new ExportExcelAttrVo("period", this.messageAccessor.message("common.period"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // 湲곌컙
         excelInfo.addAttrInfos(new ExportExcelAttrVo("modifyDate", this.messageAccessor.message("common.modifyDate"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // 理쒖쥌 蹂�寃쎌씪
+        excelInfo.addAttrInfos(new ExportExcelAttrVo("companyName", this.messageAccessor.message("common.company"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // �뾽泥�
+        excelInfo.addAttrInfos(new ExportExcelAttrVo("ispName", this.messageAccessor.message("common.isp"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // ISP
+        excelInfo.addAttrInfos(new ExportExcelAttrVo("hostingName", this.messageAccessor.message("common.hosting"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // �샇�뒪�똿
 
 
         //  �궗�슜�옄 �젙�쓽 �븘�뱶瑜� �궗�슜�븳 �씠�뒋瑜� 李얜뒗�떎. 留뚯빟 �씠�뒋媛� �뾾�떎硫� �뿬湲곗꽌 �씠�뒋 議고쉶媛� �걹�궃�떎.
@@ -2855,8 +2858,12 @@
                     issueCompanyVo.setRegionName(region.getUseValue());
                 }
                 if (issueCompany.getStatusId() != null && issueCompany.getStatusId() != -1) {
-                    CompanyFieldCategory status = this.companyFieldCategoryService.find(issueCompany.getStatusId());
-                    issueCompanyVo.setStatusName(status.getUseValue());
+                    if (issueCompany.getStatusName() != null && !issueCompany.getStatusName().equals("")) {
+                        issueCompanyVo.setStatusName(issueCompany.getStatusName());
+                    } else {
+                        CompanyFieldCategory status = this.companyFieldCategoryService.find(issueCompany.getStatusId());
+                        issueCompanyVo.setStatusName(status.getUseValue());
+                    }
                 }
             }
             issueCompanyVos.add(issueCompanyVo);
@@ -2927,6 +2934,9 @@
                 result.put("departments", CommonUtil.convertDepartmentVosToString(issueVo.getDepartmentVos()));
                 result.put("priorityName", issueVo.getPriorityName());
                 result.put("severityName", issueVo.getSeverityName());
+                result.put("companyName", issueVo.getCompanyName());
+                result.put("ispName", issueVo.getIspName());
+                result.put("hostingName", issueVo.getHostingName());
 
                 UserVo register = this.userService.removeSensitiveUser(issueVo.getRegisterId());
                 //  �벑濡앹옄
@@ -3004,6 +3014,9 @@
         excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.importance"), 5, 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)); // 醫낅즺�씪
+        excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.company"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �뾽泥�
+        excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.isp"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // ISP
+        excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.hosting"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �샇�뒪�똿
         //  �봽濡쒖젥�듃�뿉 �뿰寃곕맂 �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� 異붿텧�븯�뿬 �뿊�� download �뀥�뵆由우쓣 留뚮뱺�떎.
         this.makeIssueExcelTemplateCustomFields(excelInfo, conditions);
         //  �뿊���뿉 �꽔�쓣 �뜲�씠�꽣 - IssueVos �뜲�씠�꽣瑜� �뿊���뿉�꽌 �몴�떆�븷 �닔 �엳�뒗 �뜲�씠�꽣濡� 蹂�寃쏀븳�떎.
@@ -3043,9 +3056,14 @@
             Map<Long, Long> issueNumberMaps = new HashMap<>();  //  �씠�뒋 踰덊샇 紐⑥쓬
             Map<String, Long> issueTypeCustomFieldMaps = new HashMap<>(); //  �씠�뒋 ���엯 + �궗�슜�옄 �젙�쓽 �븘�뱶 �뿰寃� �젙蹂�
 
+            Map<String, CompanyField> companyFieldMaps = new HashMap<>();   //�뾽泥� 紐⑥쓬
+            Map<String, IspField> ispFieldMaps = new HashMap<>();   //isp 紐⑥쓬
+            Map<String, HostingField> hostingFieldMaps = new HashMap<>();   //�샇�뒪�똿 紐⑥쓬
+
             Workspace workspace = this.workspaceService.getWorkspace(this.userService.getUser(this.webAppUtil.getLoginId()).getLastWorkspaceId());  //  �씠�뒋瑜� �꽔�쑝�젮�뒗 �뾽臾� 怨듦컙
             //  �씠�뒋�쓽 二쇱슂 �냽�꽦�쓣 map �뿉 ���옣�븯�뿬 �뿊�� import �뿉�꽌 吏��젙�븳 ���긽(�씠�뒋 �냽�꽦)�쓣 鍮좊Ⅴ寃� 李얠쓣 �닔 �엳寃� �븳�떎.
-            this.IssueAttributeMapToList(issueForm, priorityMaps, severityMaps, departmentMaps, customFieldMaps, issueTypeCustomFieldMaps);
+            this.IssueAttributeMapToList(issueForm, priorityMaps, severityMaps, departmentMaps, customFieldMaps,
+                    issueTypeCustomFieldMaps, companyFieldMaps, ispFieldMaps, hostingFieldMaps);
             //  0.237 - 0.230
 
             List<IssueForm> issueForms = Lists.newArrayList();
@@ -3088,14 +3106,11 @@
                 //  1踰� �뿤�뜑遺��꽣 �뜲�씠�꽣 �쁺�뿭
                 if (rowIndex > 1) {
                     //  �씠�뒋濡� �벑濡앺븯湲� �쐞�빐 IssueForm �뿉 �뜲�씠�꽣瑜� �뀑�똿�븳�떎.
-                    IssueForm newIssueForm = this.setIssueFormToExcelField(row, (rowIndex + 1), priorityMaps, severityMaps, departmentMaps, customFieldMaps, headers);
+                    IssueForm newIssueForm = this.setIssueFormToExcelField(row, (rowIndex + 1), priorityMaps, severityMaps, departmentMaps, customFieldMaps,
+                            companyFieldMaps, ispFieldMaps, hostingFieldMaps, headers);
                     ConvertUtil.copyProperties(issueForm, newIssueForm);
 
-
-
                     issueForms.add(newIssueForm);
-
-
                 }
             }
 
@@ -3147,6 +3162,8 @@
                 }
 
                 saveIssueForm.setIssueStatusId(issueStatus.getId());
+
+                this.setIssuePartners(saveIssueForm, issue);
             }
 
 
@@ -3160,7 +3177,7 @@
             //  �씠�뒋 �떞�떦�옄 踰뚰겕 �벑濡�
             this.bulkInsertIssueAssignee(issueForms, workspace);
             //  0.361 - 0.705
-
+            
             //  1.816
             /*StopWatch serviceStart = new StopWatch();
             serviceStart.start();*/
@@ -3179,6 +3196,60 @@
             //  利앷��맂 �씠�뒋 踰덊샇瑜� �뾽�뜲�씠�듃 �븳�떎.
 //            issueNumberMaps.put(issueForm.getProjectId(), issueForm.getProjectId());
 //            this.issueNumberGeneratorService.updateIssueNumber(issueNumberMaps);
+        }
+    }
+
+    /**
+     * �뿊��濡� �엯�젰�븳 �뙆�듃�꼫 �젙蹂� ���옣
+     * @param issueForm IssueForm
+     */
+    private void setIssuePartners(IssueForm issueForm, Issue issue) {
+        //issueCompany �벑濡�
+        if (issueForm.getIssueCompanyFields() != null && issueForm.getIssueCompanyFields().size() > 0) {
+            for (Map<String, Object> issueCompanyMap : issueForm.getIssueCompanyFields()) {
+                CompanyField companyField =  ConvertUtil.convertMapToClass(issueCompanyMap, CompanyField.class);
+                IssueCompany issueCompany = ConvertUtil.convertMapToClass(issueCompanyMap, IssueCompany.class);
+                issueCompany.setCompanyField(companyField);
+                issueCompany.setIssue(issue);
+                this.issueCompanyRepository.saveAndFlush(issueCompany);
+
+                //  �뾽泥댁쓽 ISP媛� �엳�뒗 寃쎌슦 issueISP �벑濡�
+                if (companyField.getIspId() != null) {
+                    IspField ispField = this.ispFieldService.getIsp(companyField.getIspId());
+                    IssueIsp issueIsp = ConvertUtil.copyProperties(ispField, IssueIsp.class);
+                    issueIsp.setIspField(ispField);
+                    issueIsp.setIssue(issue);
+                    this.issueIspRepository.saveAndFlush(issueIsp);
+                }
+                //  �뾽泥댁쓽 �샇�뒪�똿�씠 �엳�뒗 寃쎌슦 issueHosting �벑濡�
+                if (companyField.getHostingId() != null) {
+                    HostingField hostingField = this.hostingFieldService.getHosting(companyField.getHostingId());
+                    IssueHosting issueHosting = ConvertUtil.copyProperties(hostingField, IssueHosting.class);
+                    issueHosting.setHostingField(hostingField);
+                    issueHosting.setIssue(issue);
+                    this.issueHostingRepository.saveAndFlush(issueHosting);
+                }
+            }
+        }
+        //issueIsp �벑濡�
+        if (issueForm.getIssueIspFields() != null && issueForm.getIssueIspFields().size() > 0) {
+            for (Map<String, Object> issueIspMap : issueForm.getIssueIspFields()) {
+                IssueIsp issueIsp = ConvertUtil.convertMapToClass(issueIspMap, IssueIsp.class);
+                IspField ispField = ConvertUtil.convertMapToClass(issueIspMap, IspField.class);
+                issueIsp.setIspField(ispField);
+                issueIsp.setIssue(issue);
+                this.issueIspRepository.saveAndFlush(issueIsp);
+            }
+        }
+        //issueHosting �벑濡�
+        if (issueForm.getIssueHostingFields() != null && issueForm.getIssueHostingFields().size() > 0) {
+            for (Map<String, Object> issueHostingMap : issueForm.getIssueHostingFields()) {
+                IssueHosting issueHosting = ConvertUtil.convertMapToClass(issueHostingMap, IssueHosting.class);
+                HostingField hostingField = ConvertUtil.convertMapToClass(issueHostingMap, HostingField.class);
+                issueHosting.setHostingField(hostingField);
+                issueHosting.setIssue(issue);
+                this.issueHostingRepository.saveAndFlush(issueHosting);
+            }
         }
     }
 
@@ -3279,27 +3350,39 @@
                 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 (issueForm.getIssueCompanyFields() == null || issueForm.getIssueCompanyFields().size() < 1) {
+                // 媛숈� �룄硫붿씤 �뾽泥� 李얘린
+                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);
+                        CompanyField companyField = ConvertUtil.convertMapToClass(company, CompanyField.class);
+                        issueCompany.setCompanyField(companyField);
+                        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.getIssueIspFields() != null && partners.getIssueIspFields().size() > 0) {
+                    for (Map<String, Object> isp : partners.getIssueIspFields()) {
+                        IssueIsp issueIsp = ConvertUtil.convertMapToClass(isp, IssueIsp.class);
+                        IspField ispField = ConvertUtil.convertMapToClass(isp, IspField.class);
+                        issueIsp.setIspField(ispField);
+                        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 (partners.getIssueHostingFields() != null && partners.getIssueHostingFields().size() > 0) {
+                    for (Map<String, Object> hosting : partners.getIssueHostingFields()) {
+                        IssueHosting issueHosting = ConvertUtil.convertMapToClass(hosting, IssueHosting.class);
+                        HostingField hostingField = ConvertUtil.convertMapToClass(hosting, HostingField.class);
+                        issueHosting.setHostingField(hostingField);
+                        issueHosting.setIssue(issue);
+                        this.issueHostingRepository.saveAndFlush(issueHosting);
+                    }
                 }
             }
         }
@@ -3311,7 +3394,8 @@
 
     //  �씠�뒋�쓽 二쇱슂 �냽�꽦�쓣 map �뿉 ���옣�븯�뿬 �뿊�� import �뿉�꽌 吏��젙�븳 ���긽(�씠�뒋 �냽�꽦)�쓣 鍮좊Ⅴ寃� 李얠쓣 �닔 �엳寃� �븳�떎.
     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) {
+                                         Map<String, DepartmentVo> departmentMaps, Map<String, CustomField> customFieldMaps,Map<String, Long> issueTypeCustomFieldMaps,
+                                         Map<String, CompanyField> companyFieldMaps, Map<String, IspField> ispFieldMaps, Map<String, HostingField> hostingFieldMaps) {
 
         Project project = this.projectService.getProject(issueForm.getProjectId());
 
@@ -3338,6 +3422,22 @@
         for (CustomField customField : customFields) {
             customFieldMaps.put(customField.getName(), customField);
         }
+
+        //  �뾽泥� �젙蹂대�� 諛붾줈 李얠쓣 �닔 �엳寃� 以�鍮�
+        List<CompanyField> companyFields = this.companyFieldService.findAll();
+        for (CompanyField companyField : companyFields) {
+            companyFieldMaps.put(companyField.getName(), companyField);
+        }
+        //  ISP �젙蹂대�� 諛붾줈 李얠쓣 �닔 �엳寃� 以�鍮�
+        List<IspField> ispFields = this.ispFieldService.findAll();
+        for (IspField ispField : ispFields) {
+            ispFieldMaps.put(ispField.getName(), ispField);
+        }
+        //  �샇�뒪�똿 �젙蹂대�� 諛붾줈 李얠쓣 �닔 �엳寃� 以�鍮�
+        List<HostingField> hostingFields = this.hostingFieldService.findAll();
+        for (HostingField hostingField : hostingFields) {
+            hostingFieldMaps.put(hostingField.getName(), hostingField);
+        }
     }
 
     /**
@@ -3352,7 +3452,9 @@
     //  �뿊�� �븘�뱶�뿉 �엳�뒗 �젙蹂대�� �씠�뒋 form �쑝濡� �삷湲대떎.
     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) {
+                                               Map<String, CustomField> customFieldMaps, Map<String, CompanyField> companyFieldMaps,
+                                               Map<String, IspField> ispFieldMaps, Map<String, HostingField> hostingFieldMaps,
+                                               List<String> headers) {
         IssueForm issueForm = new IssueForm();
         issueForm.setRegisterId(this.webAppUtil.getLoginId());
         Project project = null;
@@ -3401,6 +3503,24 @@
                         this.setIssueFormPeriod(cell, issueForm, false, rowIndex);
                     }
                     break;
+                case 6:
+                    //  �뾽泥대�� IssueForm �뿉 ���옣�븳�떎.
+                    if (cellNullCheck(cell)) {
+                        this.setIssueFormCompanyField(cell, companyFieldMaps, issueForm, rowIndex);
+                    }
+                    break;
+                case 7:
+                    //  ISP瑜� IssueForm �뿉 ���옣�븳�떎.
+                    if (cellNullCheck(cell)) {
+                        this.setIssueFormIspField(cell, ispFieldMaps, issueForm, rowIndex);
+                    }
+                    break;
+                case 8:
+                    //  �샇�뒪�똿�쓣 IssueForm �뿉 ���옣�븳�떎.
+                    if (cellNullCheck(cell)) {
+                        this.setIssueFormHostingField(cell, hostingFieldMaps, issueForm, rowIndex);
+                    }
+                    break;
                 default:
                     //  9踰� 遺��꽣�뒗 �궗�슜�옄 �젙�쓽 �븘�뱶. �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� IssueForm �뿉 ���옣�븳�떎.
                     this.setIssueFormCustomFieldValue(cell, customFieldMaps, issueForm, headers.get(cellIndex), rowIndex);
@@ -3410,6 +3530,45 @@
         return issueForm;
     }
 
+    private void setIssueFormHostingField(Cell cell, Map<String, HostingField> hostingFieldMaps, IssueForm issueForm, int rowIndex) {
+        if (cell != null) {
+            Map<String, Object> issueHostingFields = new HashMap<>();
+            HostingField hostingFieldMap = hostingFieldMaps.get(CommonUtil.convertExcelStringToCell(cell));
+            if (hostingFieldMap == null) {
+                throw new OwlRuntimeException(
+                        this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_HOSTING_NOT_EXIST, rowIndex));
+            }
+            ConvertUtil.copyProperties(hostingFieldMap, issueHostingFields);
+            issueForm.addIssueHostingField(issueHostingFields);
+        }
+    }
+
+    private void setIssueFormIspField(Cell cell, Map<String, IspField> ispFieldMaps, IssueForm issueForm, int rowIndex) {
+        if (cell != null) {
+            Map<String, Object> issueIspFields = new HashMap<>();
+            IspField ispFieldMap = ispFieldMaps.get(CommonUtil.convertExcelStringToCell(cell));
+            if (ispFieldMap == null) {
+                throw new OwlRuntimeException(
+                        this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISP_NOT_EXIST, rowIndex));
+            }
+            ConvertUtil.copyProperties(ispFieldMap, issueIspFields);
+            issueForm.addIssueIspField(issueIspFields);
+        }
+    }
+
+    private void setIssueFormCompanyField(Cell cell, Map<String, CompanyField> companyFieldMaps, IssueForm issueForm, int rowIndex) {
+        if (cell != null) {
+            Map<String, Object> issueCompanyFields = new HashMap<>();
+            CompanyField companyFieldMap = companyFieldMaps.get(CommonUtil.convertExcelStringToCell(cell));
+            if (companyFieldMap == null) {
+                throw new OwlRuntimeException(
+                        this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_COMPANY_NOT_EXIST, rowIndex));
+            }
+            ConvertUtil.copyProperties(companyFieldMap, issueCompanyFields);
+            issueForm.addissueCompanyField(issueCompanyFields);
+        }
+    }
+
     //  �씠�뒋 �젣紐⑹쓣 IssueForm �뿉 ���옣�븳�떎.
     private void setIssueFormTitle(Cell cell, IssueForm issueForm, int rowIndex) {
         if (cell == null) {
diff --git a/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties b/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties
index 4829040..5f04771 100644
--- a/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties
+++ b/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties
@@ -26,6 +26,9 @@
 common.projectKey=\uD504\uB85C\uC81D\uD2B8 \uD0A4
 common.startDate=\uC2DC\uC791\uC77C
 common.endDate=\uC885\uB8CC\uC77C
+common.company=\uC5C5\uCCB4\uBA85
+common.isp=ISP\uBA85
+common.hosting=\uD638\uC2A4\uD305\uBA85
 common.registerDate=\uB4F1\uB85D\uC77C
 common.admin=\uAD00\uB9AC\uC790
 common.teamMember=\uD300\uC6D0
diff --git a/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties b/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
index fb92bbc..cb4c0a8 100644
--- a/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
+++ b/src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
@@ -187,6 +187,7 @@
 
 EXCEL_IMPORT_COMPANY_NAME_IS_NULL=\uB2E4\uC74C \uC5D1\uC140 \uB77C\uC778\uC5D0\uC11C \uC5C5\uCCB4\uBA85\uC774 \uC785\uB825\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \n \uB77C\uC778 \uC815\uBCF4 : {0}
 EXCEL_IMPORT_URL_IS_NULL=\uB2E4\uC74C \uC5D1\uC140 \uB77C\uC778\uC5D0\uC11C URL\uC774 \uC785\uB825\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \n \uB77C\uC778 \uC815\uBCF4 : {0}
+EXCEL_IMPORT_COMPANY_NOT_EXIST=\uB2E4\uC74C \uC5D1\uC140 \uB77C\uC778\uC5D0\uC11C \uC785\uB825\uB41C \uC5C5\uCCB4\uBA85\uC73C\uB85C \uAC80\uC0C9\uB418\uB294 \uC5C5\uCCB4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \n \uB77C\uC778 \uC815\uBCF4 : {0}
 EXCEL_IMPORT_ISP_NOT_EXIST=\uB2E4\uC74C \uC5D1\uC140 \uB77C\uC778\uC5D0\uC11C \uC785\uB825\uB41C ISP\uBA85\uC73C\uB85C \uAC80\uC0C9\uB418\uB294 ISP\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \n \uB77C\uC778 \uC815\uBCF4 : {0}
 EXCEL_IMPORT_HOSTING_NOT_EXIST=\uB2E4\uC74C \uC5D1\uC140 \uB77C\uC778\uC5D0\uC11C \uC785\uB825\uB41C \uD638\uC2A4\uD305\uBA85\uC73C\uB85C \uAC80\uC0C9\uB418\uB294 \uD638\uC2A4\uD305\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \n \uB77C\uC778 \uC815\uBCF4 : {0}
 EXCEL_IMPORT_PARENT_SECTOR_NOT_EQUAL=\uB2E4\uC74C \uC5D1\uC140 \uB77C\uC778\uC5D0\uC11C \uC785\uB825\uB41C \uC5C5\uC885(\uC911\uBD84\uB958)\uC740 \uC5C5\uC885(\uB300\uBD84\uB958)\uC5D0 \uC18D\uD574\uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \n \uB77C\uC778 \uC815\uBCF4 : {0}
diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json
index 15468f3..054a277 100644
--- a/src/main/webapp/i18n/ko/global.json
+++ b/src/main/webapp/i18n/ko/global.json
@@ -771,9 +771,11 @@
         "noDate": "湲곌컙 �뾾�쓬",
         "fullView": "�쟾泥대낫湲�",
         "comments": "�뙎湲�",
+        "mails": "硫붿씪",
         "record": "湲곕줉",
         "recordDown": "�븯�쐞�씠�뒋 湲곕줉",
         "downComments": "�븯�쐞�씠�뒋 �뙎湲�",
+        "downMails": "�븯�쐞�씠�뒋 硫붿씪",
         "noAssignee": "�떞�떦�옄媛� �뾾�뒿�땲�떎.",
         "noContent": "�궡�슜�씠 �뾾�뒿�땲�떎.",
         "noRecord": "湲곕줉�씠 �뾾�뒿�땲�떎.",
diff --git a/src/main/webapp/scripts/app/issue/issueDetail.controller.js b/src/main/webapp/scripts/app/issue/issueDetail.controller.js
index 3d12685..756ae3c 100644
--- a/src/main/webapp/scripts/app/issue/issueDetail.controller.js
+++ b/src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -1248,19 +1248,46 @@
                 function makeActiveHistory() {
                     $scope.vm.viewer.activeParentHistory = "";
                     $scope.vm.viewer.activeHistory = "";
+                    $scope.vm.viewer.activeParentMailHistory = "";
+                    var oriMailHistory = [];
+
+                    if ($scope.vm.viewer.issueHistoryVos != null && $scope.vm.viewer.issueHistoryVos.length > 0) {
+                        for (var i=0; i<$scope.vm.viewer.issueHistoryVos.length; i++) {
+                            if ($scope.vm.viewer.issueHistoryVos[i].issueHistoryType === "SEND") {
+                                oriMailHistory.push($scope.vm.viewer.issueHistoryVos[i]);
+                            }
+                        }
+                        $scope.vm.viewer.activeParentMailHistory = angular.copy(oriMailHistory);
+                    }
+
                     if ($scope.vm.viewer.issueDownVos != null && $scope.vm.viewer.issueDownVos.length > 0) {
                         $scope.vm.viewer.activeDownHistory = ""; //�븯�쐞�씠�뒋 �엳�뒪�넗由щ쭔
                         $scope.vm.viewer.downComment = ""; //�븯�쐞�씠�뒋 �뙎湲�留�
+                        $scope.vm.viewer.activeDownMailHistory = ""; //�븯�쐞�씠�뒋 硫붿씪留�
                         $scope.vm.viewer.activeDownAllHistory = ""; //�븯�쐞�씠�뒋 �엳�뒪�넗由�+�뙎湲�
                         var downTitle = "";
                         var oriDownHistory = [];
                         var oriDownCommentHistory = [];
+                        var oriDownMailHistory = [];
 
                         // �븯�쐞�씠�뒋 �엳�뒪�넗由�
                         for (var i=0; i<$scope.vm.viewer.issueDownVos.length; i++){
                             oriDownHistory.push($scope.vm.viewer.issueDownVos[i].issueHistoryVos);
                             oriDownCommentHistory.push($scope.vm.viewer.issueDownVos[i].issueCommentVos);
+
+                            //  �븯�쐞�씠�뒋 硫붿씪 湲곕줉
+                            for (var j=0; j<$scope.vm.viewer.issueDownVos[i].issueHistoryVos.length; j++) {
+                                if($scope.vm.viewer.issueDownVos[i].issueHistoryVos[j].issueHistoryType === "SEND") {
+                                    oriDownMailHistory.push($scope.vm.viewer.issueDownVos[i].issueHistoryVos[j]);
+                                }
+                            }
                         }
+                        //  �븯�쐞�씠�뒋 硫붿씪留� ���옣
+                        $scope.vm.viewer.activeDownMailHistory = angular.copy(oriDownMailHistory);
+                        $scope.vm.viewer.activeDownMailHistory.sort(function (a, b) {   //�궡由쇱감�닚
+                            return a.registerDate > b.registerDate ? -1 : a.registerDate < b.registerDate ? 1 : 0;
+                        });
+                        
                         for (var i=0; i<oriDownHistory.length; i++){
                             if ($scope.vm.viewer.activeDownHistory === "") {
                                 $scope.vm.viewer.activeDownHistory = oriDownHistory[i];
diff --git a/src/main/webapp/views/companyField/companyFieldAdd.html b/src/main/webapp/views/companyField/companyFieldAdd.html
index 4a930c8..c798aaf 100644
--- a/src/main/webapp/views/companyField/companyFieldAdd.html
+++ b/src/main/webapp/views/companyField/companyFieldAdd.html
@@ -21,13 +21,13 @@
                        class="form-control"
                        autofocus
                        kr-input
-                       input-regex="[^a-zA-Z0-9 媛�-�옡�꽦-�뀕�뀖-�뀭\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
+                       input-regex="/[^?a-zA-Z0-9/]/"
                        autocomplete="off"
                        ng-model="vm.form.name"
                        ng-maxlength="100"
                        maxlength="100"
                        required>
-                <small translate="companyField.enterSpecialCharacters">�뾽泥� �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>
+                <!--<small translate="companyField.enterSpecialCharacters">�뾽泥� �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>-->
             </div>
 
             <div class="form-group">
diff --git a/src/main/webapp/views/companyField/companyFieldModify.html b/src/main/webapp/views/companyField/companyFieldModify.html
index 3396052..df293a3 100644
--- a/src/main/webapp/views/companyField/companyFieldModify.html
+++ b/src/main/webapp/views/companyField/companyFieldModify.html
@@ -21,13 +21,12 @@
                        class="form-control"
                        autofocus
                        kr-input
-                       input-regex="[^a-zA-Z0-9 媛�-�옡�꽦-�뀕�뀖-�뀭\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                        autocomplete="off"
                        ng-model="vm.form.name"
                        ng-maxlength="100"
                        maxlength="100"
                        required>
-                <small translate="companyField.enterSpecialCharacters">�뾽泥� �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>
+                <!--<small translate="companyField.enterSpecialCharacters">�뾽泥� �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>-->
             </div>
             <div class="form-group">
                 <label for="companyFieldAddForm10" class="issue-label">
diff --git a/src/main/webapp/views/hostingField/hostingFieldAdd.html b/src/main/webapp/views/hostingField/hostingFieldAdd.html
index 96a0a2a..b5aa364 100644
--- a/src/main/webapp/views/hostingField/hostingFieldAdd.html
+++ b/src/main/webapp/views/hostingField/hostingFieldAdd.html
@@ -21,13 +21,12 @@
                        class="form-control"
                        autofocus
                        kr-input
-                       input-regex="[^a-zA-Z0-9 媛�-�옡�꽦-�뀕�뀖-�뀭\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                        autocomplete="off"
                        ng-model="vm.form.name"
                        ng-maxlength="100"
                        maxlength="100"
                        required>
-                <small translate="hostingField.enterSpecialCharacters">�샇�뒪�똿 �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>
+                <!--<small translate="hostingField.enterSpecialCharacters">�샇�뒪�똿 �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>-->
             </div>
             <div class="form-group">
                 <label for="hostingFieldAddForm10">
diff --git a/src/main/webapp/views/hostingField/hostingFieldModify.html b/src/main/webapp/views/hostingField/hostingFieldModify.html
index 9b74b0b..44fc171 100644
--- a/src/main/webapp/views/hostingField/hostingFieldModify.html
+++ b/src/main/webapp/views/hostingField/hostingFieldModify.html
@@ -21,13 +21,12 @@
                        class="form-control"
                        autofocus
                        kr-input
-                       input-regex="[^a-zA-Z0-9 媛�-�옡�꽦-�뀕�뀖-�뀭\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                        autocomplete="off"
                        ng-model="vm.form.name"
                        ng-maxlength="100"
                        maxlength="100"
                        required>
-                <small translate="hostingField.enterSpecialCharacters">�샇�뒪�똿 �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>
+                <!--<small translate="hostingField.enterSpecialCharacters">�샇�뒪�똿 �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>-->
             </div>
             <div class="form-group">
                 <label for="hostingFieldModifyForm10">
diff --git a/src/main/webapp/views/ispField/ispFieldAdd.html b/src/main/webapp/views/ispField/ispFieldAdd.html
index 509fc5e..3ab7d79 100644
--- a/src/main/webapp/views/ispField/ispFieldAdd.html
+++ b/src/main/webapp/views/ispField/ispFieldAdd.html
@@ -21,13 +21,12 @@
                        class="form-control"
                        autofocus
                        kr-input
-                       input-regex="[^a-zA-Z0-9 媛�-�옡�꽦-�뀕�뀖-�뀭\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                        autocomplete="off"
                        ng-model="vm.form.name"
                        ng-maxlength="100"
                        maxlength="100"
                        required>
-                <small translate="ispField.enterSpecialCharacters">ISP �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>
+                <!--<small translate="ispField.enterSpecialCharacters">ISP �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>-->
             </div>
             <div class="form-group">
                 <label for="ispFieldAddForm10">
diff --git a/src/main/webapp/views/ispField/ispFieldModify.html b/src/main/webapp/views/ispField/ispFieldModify.html
index 5f9d2d5..f65b565 100644
--- a/src/main/webapp/views/ispField/ispFieldModify.html
+++ b/src/main/webapp/views/ispField/ispFieldModify.html
@@ -21,13 +21,12 @@
                        class="form-control"
                        autofocus
                        kr-input
-                       input-regex="[^a-zA-Z0-9 媛�-�옡�꽦-�뀕�뀖-�뀭\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
                        autocomplete="off"
                        ng-model="vm.form.name"
                        ng-maxlength="100"
                        maxlength="100"
                        required>
-                <small translate="ispField.enterSpecialCharacters">ISP �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>
+                <!--<small translate="ispField.enterSpecialCharacters">ISP �씠由꾩뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰 �븷�닔 �뾾�뒿�땲�떎.</small>-->
             </div>
             <div class="form-group">
                 <label for="ispFieldModifyForm10">
diff --git a/src/main/webapp/views/issue/issueDetail.html b/src/main/webapp/views/issue/issueDetail.html
index 404e999..a24b54f 100644
--- a/src/main/webapp/views/issue/issueDetail.html
+++ b/src/main/webapp/views/issue/issueDetail.html
@@ -827,22 +827,30 @@
                                            ng-click="fn.updateActiveHistory()"><span
                                                 translate="common.fullView">�쟾泥대낫湲�</span></a>
                                     </li>
-                                    <!--<li class="nav-item cursor">
-                                        <a class="nav-link" ng-class="{ 'active' : vm.activeTab == 'REPLY' }"
-                                           ng-click="vm.activeTab = 'REPLY'"><span translate="common.comments">�뙎湲�</span></a>
-                                    </li>-->
                                     <li class="nav-item cursor">
                                         <a class="nav-link" ng-class="{ 'active' : vm.activeTab == 'RECODE' }"
                                            ng-click="vm.activeTab = 'RECODE'"><span translate="common.record">湲곕줉</span></a>
                                     </li>
                                     <li class="nav-item cursor">
+                                        <a class="nav-link" ng-class="{ 'active' : vm.activeTab == 'MAIL' }"
+                                           ng-click="vm.activeTab = 'MAIL'"><span translate="common.mails">硫붿씪</span></a>
+                                    </li>
+                                    <li class="nav-item cursor">
+                                        <a class="nav-link" ng-class="{ 'active' : vm.activeTab == 'REPLY' }"
+                                           ng-click="vm.activeTab = 'REPLY'"><span translate="common.comments">�뙎湲�</span></a>
+                                    </li>
+                                    <li class="nav-item cursor">
                                         <a class="nav-link" ng-class="{ 'active' : vm.activeTab == 'RECODE_DOWN' }"
                                            ng-click="vm.activeTab = 'RECODE_DOWN'"><span translate="common.recordDown">�븯�쐞�씠�뒋 湲곕줉</span></a>
                                     </li>
-                                    <!--<li class="nav-item cursor">
+                                    <li class="nav-item cursor">
+                                        <a class="nav-link" ng-class="{ 'active' : vm.activeTab == 'MAIL_DOWN' }"
+                                           ng-click="vm.activeTab = 'MAIL_DOWN'"><span translate="common.downMails">�븯�쐞�씠�뒋 硫붿씪</span></a>
+                                    </li>
+                                    <li class="nav-item cursor">
                                         <a class="nav-link" ng-class="{ 'active' : vm.activeTab == 'REPLY_DOWN' }"
                                            ng-click="vm.activeTab = 'REPLY_DOWN'"><span translate="common.downComments">�븯�쐞�씠�뒋 �뙎湲�</span></a>
-                                    </li>-->
+                                    </li>
                                 </ul>
                             </div>
 
@@ -983,6 +991,20 @@
                                         </div>
                                     </div>
                                 </div>
+
+                                <!--    硫붿씪 蹂닿린    -->
+                                <div ng-if="vm.activeTab == 'MAIL'">
+                                    <div class="no-cont2" ng-if="vm.viewer.activeParentMailHistory.length < 1" translate="common.noRecord">
+                                        湲곕줉�씠 �뾾�뒿�땲�떎.
+                                    </div>
+
+                                    <div class="ae-item" ng-repeat="issueHistory in vm.viewer.activeParentMailHistory">
+                                        <div class="aei-content" ng-if="$root.isDefined(issueHistory.issueHistoryType)">
+                                            <div dom-append dom="issueHistory.description"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
                                 <!--    �븯�쐞�씠�뒋 湲곕줉 蹂닿린    -->
                                 <div ng-if="vm.activeTab == 'RECODE_DOWN'">
                                     <div class="no-cont2" ng-if="!$root.isDefined(vm.viewer.activeDownAllHistory) || vm.viewer.activeDownAllHistory.length < 1" translate="common.noRecord">
@@ -1027,28 +1049,39 @@
                                     </div>
                                 </div>
 
+                                <!--    �븯�쐞�씠�뒋 硫붿씪 蹂닿린    -->
+                                <div ng-if="vm.activeTab == 'MAIL_DOWN'">
+                                    <div class="no-cont2" ng-if="vm.viewer.activeDownMailHistory.length < 1" translate="common.noRecord">
+                                        湲곕줉�씠 �뾾�뒿�땲�떎.
+                                    </div>
+
+                                    <div class="ae-item" ng-repeat="issueHistory in vm.viewer.activeDownMailHistory">
+                                        <div class="aei-content" ng-if="$root.isDefined(issueHistory.issueHistoryType)">
+                                            <div dom-append dom="issueHistory.description"></div>
+                                        </div>
+                                    </div>
+                                </div>
+
                                 <!--    �븯�쐞�씠�뒋 �뙎湲� 蹂닿린    -->
                                 <div ng-if="vm.activeTab == 'REPLY_DOWN'">
                                     <div class="no-cont2" ng-if="$scope.vm.viewer.downComment.length < 1"
                                          translate="common.noComments">
                                         �뙎湲��씠 �뾾�뒿�땲�떎.
                                     </div>
-                                    <div class="ae-item" ng-repeat="comment in vm.viewer.downComment">
-                                        <div class="re-title">
-                                            <div class='dot'>
-                                                �븯�쐞�씠�뒋: {{::comment.title}}
-                                            </div>
+                                    <div class="aei-content pb-3" ng-repeat="comment in vm.viewer.downComment">
+                                        <div class='dot mt-10 mb-10'>
+                                            *�븯�쐞�씠�뒋: {{::comment.title}}
                                         </div>
-                                        <div class="aei-image">
+                                        <div class="aei-image" style="position: absolute; top: 30%">
                                             <div class="user-avatar-w">
-                                                <img alt="image" ng-src="{{::comment.profile}}">
+                                                <img style="margin-top: 15px" alt="image" ng-src="{{::comment.profile}}">
                                             </div>
                                         </div>
                                         <div class="aei-content">
-                                            <h6 class="aei-title">
+                                            <h6 class="aei-title mt-1 ml-3per">
                                                 {{::comment.registerName}}
                                             </h6>
-                                            <div class="date-break">
+                                            <div class="date-break mt-2" style="margin-left: 3.3%">
                                                 <span>{{::comment.registerDate}}</span>
                                             </div>
                                             <div class="aei-delete"
@@ -1057,7 +1090,7 @@
                                                 <i class="os-icon os-icon-close"></i>
                                             </div>
                                             <div class="chat-messages">
-                                                <div class="message">
+                                                <div class="message" style="margin-left: 3.3%">
                                                     <div class="message-content">
                                                         <span class="issue-detail-word-break">{{::comment.description}}</span>
                                                     </div>

--
Gitblit v1.8.0