OWL ITS + 탐지시스템(인터넷 진흥원)
이민희
2022-02-18 71b8c61b79be17f9ac886b947051d3256a32f159
이슈유형 설정에 상위 이슈 업체/ISP/호스팅 상속 기능 추가
1개 파일 추가됨
21개 파일 변경됨
337 ■■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/domain/IssueType.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 79 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueTypeVo.java 10 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueVo.java 10 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/IssueForm.java 14 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/IssueTypeForm.java 17 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/migration/V1_6__alter_data.sql 3 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/issue-template.xml 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/issueType-template.xml 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/assets/styles/main.css 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 8 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAddDown.controller.js 34 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueDetail.controller.js 32 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueImportExcel.controller.js 29 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueList.controller.js 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueModify.controller.js 23 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issueType/issueTypeAdd.controller.js 12 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issueType/issueTypeModify.controller.js 14 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueDetail.html 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issueType/issueTypeAdd.html 11 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issueType/issueTypeModify.html 12 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/domain/IssueType.java
@@ -22,6 +22,7 @@
    private String description;
    private String color;
    private Long usePartner;
    private Boolean inheritPartners;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "workspace_id")
@@ -144,4 +145,12 @@
    public void setIssueTypeApiEndStatuses(Set<IssueTypeApiEndStatus> issueTypeApiEndStatuses) {
        this.issueTypeApiEndStatuses = issueTypeApiEndStatuses;
    }
    public Boolean getInheritPartners() {
        return inheritPartners;
    }
    public void setInheritPartners(Boolean inheritPartners) {
        this.inheritPartners = inheritPartners;
    }
}
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -47,9 +47,7 @@
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;
import static kr.wisestone.owl.domain.enumType.CustomFieldType.*;
@@ -1276,6 +1274,9 @@
    private void setMapToIssueVo(List<Map<String, Object>> results, List<IssueVo> issueVos, IssueCondition issueCondition, User user) {
        for (Map<String, Object> result : results) {
            IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class);
            if (MapUtil.getString(result, "inheritPartners") != null && MapUtil.getString(result, "inheritPartners").equals("1")) {
                issueVo.setInheritPartners(true);
            }
            issueVos.add(issueVo);
            issueCondition.addIssueIds(String.valueOf(issueVo.getId()));
        }
@@ -2126,6 +2127,15 @@
        this.issueIspService.modifyIssueIspField(issue, issueForm, detectIssueChange);
        //  HOSTING 정보 저장
        this.issueHostingService.modifyIssueHostingField(issue, issueForm, detectIssueChange);
        //  파트너정보 하위이슈 상속
        List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId());
        if (issueForm.getInheritYn() != null && issueForm.getInheritYn()
                && downIssues != null && downIssues.size() > 0) {
            for (Issue downIssue : downIssues) {
                this.inheritPartners(downIssue, issue);
            }
        }
        //  이슈 이력 등록
        if (!StringUtils.isEmpty(detectIssueChange.toString())) {
@@ -3167,6 +3177,11 @@
                issue = this.issueRepository.saveAndFlush(issue);
                if (issueForm.getInheritYn() != null && issueForm.getInheritYn() && issue.getParentIssue() != null) {
                    //  상위이슈의 파트너 정보 상속
                    this.inheritPartners(issue, issue.getParentIssue());
                }
                saveIssueForm.setId(issue.getId());
                IssueDepartment issueDepartment = new IssueDepartment();
@@ -4153,11 +4168,71 @@
                this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb);
                issue.setParentIssue(null);
            }
            if (issueDownForm.getInheritYn() != null && issueDownForm.getInheritYn() && issue.getParentIssue() != null) {
                //  상위이슈의 파트너 정보 상속받기
                issue = this.inheritPartners(issue, parentIssue);
            }
            this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString()); //parentIssue = myIssue(기록은 현재 상세페이지에 해야하니까)
            this.issueRepository.saveAndFlush(issue);
        }
    }
    /**
     * 상위이슈의 파트너 정보 상속받기
     * @param issue Issue
     * @param parentIssue Issue
     * @return Issue
     */
    private Issue inheritPartners(Issue issue, Issue parentIssue) {
        if (parentIssue != null) {
            if (parentIssue.getIssueType().getInheritPartners()) {
                IssueCompany issueCompany = new IssueCompany();
                IssueIsp issueIsp = new IssueIsp();
                IssueHosting issueHosting = new IssueHosting();
                if (parentIssue.getIssueCompanies() != null && parentIssue.getIssueCompanies().size() > 0) {
                    issue.getIssueCompanies().clear();
                    issue.getIssueCompanies().addAll(parentIssue.getIssueCompanies());
                    Iterator<IssueCompany> itrCompany = issue.getIssueCompanies().iterator();
                    ConvertUtil.copyProperties(itrCompany.next(), issueCompany, "id");
                    issueCompany.setIssue(issue);
                    issueCompany.setCompanyField(parentIssue.getIssueCompanies().iterator().next().getCompanyField());
                    this.issueCompanyRepository.saveAndFlush(issueCompany);
                } else {
                    this.issueCompanyRepository.deleteByIssueId(issue.getId());
                    this.issueCompanyRepository.flush();
                }
                if (parentIssue.getIssueIspFields() != null && parentIssue.getIssueIspFields().size() > 0) {
                    issue.getIssueIspFields().clear();
                    issue.getIssueIspFields().addAll(parentIssue.getIssueIspFields());
                    Iterator<IssueIsp> itrIsp = issue.getIssueIspFields().iterator();
                    ConvertUtil.copyProperties(itrIsp.next(), issueIsp, "id");
                    issueIsp.setIssue(issue);
                    issueIsp.setIspField(parentIssue.getIssueIspFields().iterator().next().getIspField());
                    this.issueIspRepository.saveAndFlush(issueIsp);
                } else {
                    this.issueIspRepository.deleteByIssueId(issue.getId());
                    this.issueIspRepository.flush();
                }
                if (parentIssue.getIssueHostingFields() != null && parentIssue.getIssueHostingFields().size() > 0) {
                    issue.getIssueHostingFields().clear();
                    issue.getIssueHostingFields().addAll(parentIssue.getIssueHostingFields());
                    Iterator<IssueHosting> itrHosting = issue.getIssueHostingFields().iterator();
                    ConvertUtil.copyProperties(itrHosting.next(), issueHosting, "id");
                    issueHosting.setIssue(issue);
                    issueHosting.setHostingField(parentIssue.getIssueHostingFields().iterator().next().getHostingField());
                    this.issueHostingRepository.saveAndFlush(issueHosting);
                } else {
                    this.issueHostingRepository.deleteByIssueId(issue.getId());
                    this.issueHostingRepository.flush();
                }
            }
        }
        return issue;
    }
    @Override
    public void findPartner(Map<String, Object> resJsonData, Map<String, Object> params) {
        Long issueTypeId = MapUtil.getLong(params, "issueTypeId");
src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java
@@ -155,6 +155,8 @@
        issueType.setUsePartner(issueTypeForm.getUsePartner());
        issueType.setInheritPartners(issueTypeForm.getInheritPartners());
        return this.issueTypeRepository.saveAndFlush(issueType);
    }
@@ -435,6 +437,8 @@
        issueType.setUsePartner(issueTypeForm.getUsePartner());
        issueType.setInheritPartners(issueTypeForm.getInheritPartners());
        /*if(issueTypeForm.getCompanyId() != null){
            CompanyField companyField = this.companyFieldService.getCompany(issueTypeForm.getCompanyId());
            issueType.setCompanyField(companyField);
src/main/java/kr/wisestone/owl/vo/IssueTypeVo.java
@@ -22,6 +22,8 @@
    private Boolean modifyPermissionCheck = Boolean.TRUE;   //  이슈 유형은 모든 사람들이 수정, 삭제할 수 있어서 기본 값이 True
    private Boolean inheritPartners;
    public IssueTypeVo(){}
    public Long getId() {
@@ -103,4 +105,12 @@
    public void setUsePartners(Integer usePartners) {
        this.usePartners = usePartners;
    }
    public Boolean getInheritPartners() {
        return inheritPartners;
    }
    public void setInheritPartners(Boolean inheritPartners) {
        this.inheritPartners = inheritPartners;
    }
}
src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -83,6 +83,8 @@
    private int downTotalPage = 1;
    private Long downTotalCount = 0L;
    private Boolean inheritPartners;    // 파트너정보 상속유무 체크
    public IssueVo(){}
    public Long getId() {
@@ -650,4 +652,12 @@
    public void setDownPageNumber(int downPageNumber) {
        this.downPageNumber = downPageNumber;
    }
    public Boolean getInheritPartners() {
        return inheritPartners;
    }
    public void setInheritPartners(Boolean inheritPartners) {
        this.inheritPartners = inheritPartners;
    }
}
src/main/java/kr/wisestone/owl/web/form/IssueForm.java
@@ -75,6 +75,8 @@
    private String isApi = Issue.IS_API_NO;
    private List<String> downIssuesStatus = Lists.newArrayList(); //하위이슈 상태
    private Boolean inheritYn;
    public IssueForm() {
    }
@@ -241,6 +243,10 @@
        }
        if (MapUtil.getString(params, "hostingMemo") != null) {
            form.setHostingMemo(MapUtil.getString(params, "hostingMemo"));
        }
        if (MapUtil.getBoolean(params, "inheritYn") != null) {
            form.setInheritYn(MapUtil.getBoolean(params, "inheritYn"));
        }
        return form;
@@ -719,4 +725,12 @@
    public void setStatusName(String statusName) {
        this.statusName = statusName;
    }
    public Boolean getInheritYn() {
        return inheritYn;
    }
    public void setInheritYn(Boolean inheritYn) {
        this.inheritYn = inheritYn;
    }
}
src/main/java/kr/wisestone/owl/web/form/IssueTypeForm.java
@@ -20,6 +20,7 @@
    private Long projectId;
    private List<Long> removeIds = Lists.newArrayList();
    private Long usePartner;
    private Boolean inheritPartners;
    public IssueTypeForm(){}
@@ -41,6 +42,14 @@
                } else {
                    form.usePartner += id * 2;
                }
            }
        }
        if (MapUtil.getString(params, "inheritPartners") != null) {
            if (MapUtil.getString(params, "inheritPartners").equals("true")) {
                form.setInheritPartners(true);
            } else {
                form.setInheritPartners(false);
            }
        }
@@ -114,4 +123,12 @@
    public void setUsePartner(Long usePartner) {
        this.usePartner = usePartner;
    }
    public Boolean getInheritPartners() {
        return inheritPartners;
    }
    public void setInheritPartners(Boolean inheritPartners) {
        this.inheritPartners = inheritPartners;
    }
}
src/main/resources/migration/V1_6__alter_data.sql
New file
@@ -0,0 +1,3 @@
/* issue_type 파트너 상속 true/false */
ALTER TABLE `issue_type` ADD COLUMN `inherit_partners` varchar(10) NOT NULL DEFAULT "false";
src/main/resources/mybatis/query-template/issue-template.xml
@@ -22,6 +22,7 @@
        project.project_key as projectKey,
        issue_type.id as issueTypeId,
        issue_type.name as issueTypeName,
        issue_type.inherit_partners as inheritPartners,
        issue_status.id as issueStatusId,
        issue_status.issue_status_type as issueStatusType,
        issue_status.name as issueStatusName,
src/main/resources/mybatis/query-template/issueType-template.xml
@@ -10,7 +10,8 @@
        it.description as description,
        it.color as color,
        it.project_id as projectId,
        it.use_partner AS usePartners
        it.use_partner AS usePartners,
        it.inherit_partners as inheritPartners
        FROM
        issue_type it
        INNER JOIN workspace ws on it.workspace_id = ws.id
src/main/webapp/assets/styles/main.css
@@ -7769,6 +7769,10 @@
    margin-left: 3rem !important;
}
.ml--12 {
    margin-left: -12px !important;
}
.p-0 {
    padding: 0 !important;
}
src/main/webapp/i18n/ko/global.json
@@ -263,6 +263,7 @@
        "notAllowedAttachment": "첨부가 허용되지 않는 파일입니다.",
        "nameErrorAttachment": "첨부 파일명 오류",
        "succeededIssueRegistration": "이슈 등록 성공",
        "succeededDownIssueRegistration": "하위 이슈 등록 성공",
        "failedIssueRegistration": "이슈 등록 실패",
        "failedIssueModify": "이슈 수정 실패",
        "failedToProjectDetails": "프로젝트 상세 정보 조회 실패",
@@ -362,11 +363,14 @@
        "downIssueTitle": "하위 이슈 제목",
        "downIssueType": "하위 이슈 구분",
        "addDownIssue": "하위 이슈 추가",
        "modifyDownIssue": "하위 이슈 변경",
        "downIssueRemove" : "하위 이슈 삭제",
        "failedToIssueAddIssueDown": "하위 이슈 추가 실패",
        "failedToIssueDeleteIssueDown": "하위 이슈 삭제 실패",
        "errorSelectDownIssue" : "하위 이슈가 선택되지 않았습니다.",
        "failedToIssueTypeDefault": "이슈 유형 기본값 조회 실패"
        "failedToIssueTypeDefault": "이슈 유형 기본값 조회 실패",
        "inheritPartners": "업체/ISP/호스팅 정보 상속 여부",
        "wantToInheritPartnersOfParentIssue": "상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?"
    },
    "project": {
        "createProject": "프로젝트 만들기",
@@ -678,6 +682,8 @@
        "failedToReceiveEnquiry": "문의 접수 실패"
    },
    "common": {
        "ok" : "네",
        "no" : "아니오",
        "allIssueList" : "전체 이슈",
        "urgent": "긴급",
        "high": "높음",
src/main/webapp/scripts/app/issue/issueAddDown.controller.js
@@ -861,24 +861,36 @@
                    });
                }
                // 연관 이슈 추가
                // 하위 이슈 추가
                function addDownIssue(downId) {
                    /*if ($scope.vm.issueName.length == 0 || $scope.vm.form.issues.length == 0
                        || $scope.vm.issueName != $scope.vm.form.issues[0].title) {
                        SweetAlert.error($filter("translate")("issue.errorSelectRelationIssue"), "");
                        return;
                    }*/
                    var ids = [];
                    let inheritYn = false;
                    SweetAlert.swal({
                        title : $filter("translate")("issue.addDownIssue"), // 하위 이슈 추가
                        text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?
                        type : "warning",
                        showCancelButton : true,
                        confirmButtonColor : "#DD6B55",
                        confirmButtonText : $filter("translate")("common.ok"), // 네
                        cancelButtonText : $filter("translate")("common.no"), // 아니오
                        closeOnConfirm : false,
                        closeOnCancel : false
                    },
                    function (isConfirm) {
                        if (isConfirm) {
                            inheritYn = true;
                        }
                    if (downId != null) {
                        ids.push(downId);
                    }
                    var contents = {
                        //relationIssueType : $scope.vm.form.relationIssueTypeId,
                        // issueId : $rootScope.currentDetailIssueId,
                        issueId :  parameter.id,
                        ids : ids,
                        parentIssueId : parameter.id
                            parentIssueId : parameter.id,
                            inheritYn : inheritYn
                    };
                    Issue.modifyParentIssue($resourceProvider.getContent(
@@ -886,15 +898,17 @@
                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
                        if (result.data.message.status === "success") {
                                SweetAlert.close();
                            //  이슈 상세 화면 요청
                            $rootScope.$broadcast("getIssueDetail", {
                                id : parameter.id
                            });
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "연관일감 생성 실패"
                                SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "하위이슈 생성 실패"
                        }
                    });
                    });
                }
                //  팝업 창 닫기
src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -123,6 +123,9 @@
                    },
                };
                $scope.vm.inheritPartners = "";
                $scope.vm.downTotalCount = "";
                $scope.vm.relResponseData = [];
                $scope.vm.relTableConfigs = [];
                //  테이블 이벤트
@@ -810,6 +813,24 @@
                        return;
                    }
                    let inheritYn = false;
                    if ($scope.vm.inheritPartners) {
                        SweetAlert.swal({
                                title : $filter("translate")("issue.addDownIssue"), // 하위 이슈 추가
                                text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?
                                type : "warning",
                                showCancelButton : true,
                                confirmButtonColor : "#DD6B55",
                                confirmButtonText : $filter("translate")("common.ok"), // 네
                                cancelButtonText : $filter("translate")("common.no"), // 아니오
                                closeOnConfirm : false,
                                closeOnCancel : false
                            },
                            function (isConfirm) {
                                if (isConfirm) {
                                    inheritYn = true;
                                }
                    var ids = [];
                    if ($scope.vm.form.issuesDown[0].id != null) {
                        ids.push($scope.vm.form.issuesDown[0].id);
@@ -818,7 +839,8 @@
                    var contents = {
                        issueId : $rootScope.currentDetailIssueId,
                        ids : ids,
                        parentIssueId : $rootScope.currentDetailIssueId
                                    parentIssueId : $rootScope.currentDetailIssueId,
                                    inheritYn : inheritYn
                    };
                    Issue.modifyParentIssue($resourceProvider.getContent(
@@ -826,12 +848,15 @@
                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
                        if (result.data.message.status === "success") {
                                        SweetAlert.close();
                            $scope.fn.getIssueDetail(0,0);
                        }
                        else {
                            SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "연관일감 생성 실패"
                                        SweetAlert.error($filter("translate")("issue.failedToIssueAddIssueDown"), result.data.message.message); // "하위이슈 생성 실패"
                        }
                    });
                            });
                    }
                }
                 // 이슈명을 클릭하면 이슈 상세 정보를 조회한다.
@@ -1176,6 +1201,9 @@
                                if ($rootScope.workProject.id > -1 && result.data.data.projectVo !== null) {
                                    $rootScope.changeLastProject(result.data.data.projectVo.id);
                                }
                                $scope.vm.inheritPartners = result.data.data.issueTypeVo.inheritPartners;
                                $scope.vm.downTotalCount = result.data.data.downTotalCount;
                            }
                        }
                        else {
src/main/webapp/scripts/app/issue/issueImportExcel.controller.js
@@ -122,6 +122,26 @@
                function formSubmit() {
                    $rootScope.spinner = true;
                    let inheritYn = false;
                    //  하위이슈 등록 & 파트너 정보 상속 일 경우 알림 창
                    if ($rootScope.isDefined($scope.vm.form.issues) && $rootScope.isDefined($scope.vm.form.issues[0])) {
                        if ($scope.vm.form.issues[0].inheritPartners != null && $scope.vm.form.issues[0].inheritPartners === true) {
                            SweetAlert.swal({
                                    title : $filter("translate")("issue.addDownIssue"), // 하위 이슈 추가
                                    text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?
                                    type : "warning",
                                    showCancelButton : true,
                                    confirmButtonColor : "#DD6B55",
                                    confirmButtonText : $filter("translate")("common.ok"), // 네
                                    cancelButtonText : $filter("translate")("common.no"), // 아니오
                                    closeOnConfirm : false,
                                    closeOnCancel : false
                                },
                                function (isConfirm) {
                                    if (isConfirm) {
                                        inheritYn = true;
                                    }
                    Issue.importExcel({
                        method : "POST",
                        file : $scope.vm.form.file,
@@ -138,10 +158,11 @@
                                        }
                                    }
                                    return id;
                                })()
                                                })(),
                                                inheritYn : inheritYn
                            }
                        },
                        fileFormDataName : "file"
                                        fileFormDataName : "file",
                    }).then(function (result) {
                            if (result.data.message.status === "success") {
                                $timeout(function () {
@@ -156,6 +177,10 @@
                                $rootScope.spinner = false;
                            }
                        });
                                });
                        }
                    }
                }
                function cancel() {
src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -848,7 +848,7 @@
                }
                //  이슈 수정 팝업 호출
                function modify(id) {
                function modify(id, downTotalCount) {
                    $uibModal.open({
                        templateUrl : 'views/issue/issueModify.html',
                        size : "lg",
@@ -858,7 +858,9 @@
                            parameter : function () {
                                return {
                                    id : id,
                                    issueTypeId : $scope.vm.viewer.issueTypeVo.id
                                    issueTypeId : $scope.vm.viewer.issueTypeVo.id,
                                    inheritPartners : $scope.vm.viewer.issueTypeVo.inheritPartners,
                                    downTotalCount : downTotalCount
                                };
                            }
                        }
src/main/webapp/scripts/app/issue/issueModify.controller.js
@@ -169,6 +169,8 @@
                    priorities : [],    //  우선순위 정보
                    severities : [],    //  중요도 정보
                    fileTableConfigs : [],   //  파일 업로드 정보 테이블
                    inheritPartners : parameter.inheritPartners,
                    downTotalCount : parameter.downTotalCount
                };
                // 연관 일감 관련
@@ -576,10 +578,29 @@
                function formSubmit() {
                    $rootScope.spinner = true;
                    let inheritYn = false;
                    if ($scope.vm.inheritPartners && $scope.vm.downTotalCount > 0) {
                        SweetAlert.swal({
                                title : $filter("translate")("issue.modifyDownIssue"), // 하위 이슈 변경
                                text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?
                                type : "warning",
                                showCancelButton : true,
                                confirmButtonColor : "#DD6B55",
                                confirmButtonText : $filter("translate")("common.ok"), // 네
                                cancelButtonText : $filter("translate")("common.no"), // 아니오
                                closeOnConfirm : false,
                                closeOnCancel : false
                            },
                            function (isConfirm) {
                                if (isConfirm) {
                                    inheritYn = true;
                                }
                    var content = {
                        id : parameter.id,
                        title : $rootScope.preventXss($scope.vm.form.title),    //  제목
                        description : $rootScope.preventXss($scope.vm.form.description),   //  내용
                                    inheritYn : inheritYn,
                        companyName : $scope.vm.companyName,
                        companyManager : $scope.vm.companyManager,
                        companyTel : $scope.vm.companyTel,
@@ -875,6 +896,8 @@
                        $rootScope.spinner = false;
                    });
                            });
                    }
                }
                function cancel() {
src/main/webapp/scripts/app/issueType/issueTypeAdd.controller.js
@@ -27,7 +27,8 @@
                        projects : [],      // 프로젝트
                        description : "",  //  설명
                        color : "#febd35", //  색상
                        companies : [] // 업체/isp/호스팅 선택 배열
                        companies : [], // 업체/isp/호스팅 선택 배열
                        inheritPartners : true    // 파트너 상속 유무
                    },
                    companyName : "",
                    projectName : "",
@@ -161,7 +162,14 @@
                        name : $rootScope.preventXss($scope.vm.form.name),
                        description : $rootScope.preventXss($scope.vm.form.description),
                        color : $scope.vm.form.color
                        color : $scope.vm.form.color,
                        inheritPartners :  (function () {
                            let inheritPartners = false;
                            if ($scope.vm.form.inheritPartners) {
                                inheritPartners = true;
                            }
                            return inheritPartners;
                        })()
                    };
                    IssueType.add($resourceProvider.getContent(
src/main/webapp/scripts/app/issueType/issueTypeModify.controller.js
@@ -33,7 +33,8 @@
                        projects : [],      // 프로젝트
                        description : "",  //  설명
                        color : "", //  색상
                        companies : [] // 업체/isp/호스팅 선택 배열
                        companies : [], // 업체/isp/호스팅 선택 배열
                        inheritPartners : ""    // 파트너 상속 유무
                    },
                    companyName : "",
                    workflowName : "",
@@ -152,7 +153,14 @@
                        })(),
                        name : $rootScope.preventXss($scope.vm.form.name),
                        description : $rootScope.preventXss($scope.vm.form.description),
                        color : $scope.vm.form.color
                        color : $scope.vm.form.color,
                        inheritPartners :  (function () {
                            let inheritPartners = false;
                            if ($scope.vm.form.inheritPartners) {
                                inheritPartners = true;
                            }
                            return inheritPartners;
                        })()
                    };
                    IssueType.modify($resourceProvider.getContent(
@@ -212,8 +220,8 @@
                                    $scope.vm.projectName = result.data.data.projectVo.name;
                                }
                                $scope.vm.form.companies = result.data.data.usePartnerVos;
                                $scope.vm.form.color = result.data.data.color;
                                $scope.vm.form.inheritPartners = result.data.data.inheritPartners;
                            }
                        }
                        else {
src/main/webapp/views/issue/issueDetail.html
@@ -107,7 +107,7 @@
                <i class="os-icon os-icon-airplay mr-20" ng-click="fn.versionView(vm.viewer.id)" data-toggle="tooltip" data-placement="right" title="이슈 변경 이력 상세 보기"></i>
<!--                <i class="os-icon os-icon-calendar-time mr-20" ng-if="vm.viewer.modifyPermissionCheck"-->
<!--                   ng-click="fn.reservation(vm.viewer.id)" data-toggle="tooltip" data-placement="right" title="이슈 발생 예약 하기"></i>-->
                <i class="os-icon os-icon-edit-1 mr-20" ng-click="fn.modify(vm.viewer.id)"
                <i class="os-icon os-icon-edit-1 mr-20" ng-click="fn.modify(vm.viewer.id, vm.viewer.downTotalCount)"
                   ng-if="vm.viewer.modifyPermissionCheck" data-toggle="tooltip" data-placement="left" title="이슈 수정 하기"></i>
                <!-- 상위 이슈가 있을때 뒤로가기 버튼 생성 -->
                <span ng-if="vm.issueIds[0] != vm.viewer.id && vm.issueIds.length != 0 && vm.issueIds.length != 1" class="issue-close mr-10" ng-click="fn.issueBack()"><i class="os-icon os-icon-arrow-left7" data-toggle="tooltip" data-placement="left" title="이슈 뒤로 이동"></i></span>
src/main/webapp/views/issueType/issueTypeAdd.html
@@ -71,12 +71,21 @@
                <div class="select3-selection__choicediv mt-10">
                                <span class="select3-selection__choice" ng-repeat="company in vm.form.companies">
                                    <span>{{company.byName}}</span> <!--사용자가 속해 있는 부서 이름 출력-->
                                    <span>{{company.byName}}</span>
                                    <span class="select3-selection__choice__remove" ng-click="fn.removeUsePartner($index)">×</span>
                                </span>
                </div>
            </div>
            <div>
                <span class="issue-label mb-0" translate="issue.inheritPartners">파트너 정보 상속</span>
            </div>
            <div class="form-group mt-5 ml--12">
                <label class='switch ml-3' style=""><input type='checkbox' ng-model='vm.form.inheritPartners'>
                    <span class='slider round'></span>
                </label>
            </div>
            <div class="form-group">
                <label for="issueTypeAddForm2"><span translate="common.color">색상</span> <code class="highlighter-rouge">*</code></label>
                <div class="input-group">
src/main/webapp/views/issueType/issueTypeModify.html
@@ -76,14 +76,20 @@
                <div class="select3-selection__choicediv mt-10">
                                <span class="select3-selection__choice" ng-repeat="company in vm.form.companies">
                                    <span>{{company.byName}}</span> <!--사용자가 속해 있는 부서 이름 출력-->
                                    <span>{{company.byName}}</span>
                                    <span class="select3-selection__choice__remove" ng-click="fn.removeUsePartner($index)">×</span>
                                </span>
                </div>
            </div>
            <div>
                <span class="issue-label mb-0" translate="issue.inheritPartners">파트너 정보 상속</span>
            </div>
            <div class="form-group mt-5 ml--12">
                <label class='switch ml-3' style=""><input type='checkbox' ng-model='vm.form.inheritPartners'>
                    <span class='slider round'></span>
                </label>
            </div>
            <div class="form-group">
                <label for="issueTypeModifyForm2"><span translate="common.color">색상</span> <code class="highlighter-rouge">*</code></label>