OWL ITS + 탐지시스템(인터넷 진흥원)
jhjang
2021-12-14 fe2b018f2c33d4444ed8a9c731f78e8f9ec6aadc
Merge remote-tracking branch 'origin/master'
21개 파일 변경됨
256 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/mapper/DepartmentMapper.java 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/DepartmentRepository.java 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/UserDepartmentService.java 3 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java 4 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/DepartmentServiceImpl.java 11 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 38 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/UserDepartmentServiceImpl.java 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueVo.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/issue-template.xml 24 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAdd.controller.js 6 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAddRelation.controller.js 20 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueList.controller.js 14 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueModify.controller.js 21 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueSendMailPartners.controller.js 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/utils/autoComplete.controller.js 18 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/companyField/companyFieldAdd.html 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/companyField/companyFieldModify.html 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueAddRelation.html 31 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueListNormal.html 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueModify.html 32 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/DepartmentMapper.java
@@ -21,8 +21,6 @@
    Long findBydepartmentId(Long Id);
    Long countInDepartment(Long Id);
    List<Map<String, Object>> findByDepartmentIds(UserCondition condition);
    List<Map<String, Object>> findProjectDepartment(DepartmentCondition departmentCondition);
src/main/java/kr/wisestone/owl/repository/DepartmentRepository.java
@@ -2,7 +2,8 @@
import kr.wisestone.owl.domain.Department;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
public interface DepartmentRepository extends JpaRepository<Department, Long> {
    Long countById(@Param("id")Long id);
}
src/main/java/kr/wisestone/owl/service/UserDepartmentService.java
@@ -6,6 +6,7 @@
import kr.wisestone.owl.web.form.UserDepartmentForm;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Map;
public interface UserDepartmentService extends AbstractService<UserDepartment, Long, JpaRepository<UserDepartment, Long>> {
@@ -13,4 +14,6 @@
    void userDepartmentDetail(Map<String, Object> resJsonData, UserCondition make);
    void userDepartmentModify(UserDepartmentForm userDepartmentForm);
    List<UserDepartment> findByDepartmentId(Long id);
}
src/main/java/kr/wisestone/owl/service/impl/CompanyFieldServiceImpl.java
@@ -212,15 +212,13 @@
        for (Map<String, Object> result : results) {
            CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(result, CompanyFieldVo.class);
            if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1){
                //IspField ispField = this.ispFieldRepository.getOne(companyFieldVo.getIspId());
                IspField ispField = this.ispFieldService.getIsp(companyFieldVo.getIspId());
                if(ispField != null){
                    IspFieldVo ispFieldVo = ConvertUtil.copyProperties(ispField, IspFieldVo.class);
                    companyFieldVo.setIspFieldVo(ispFieldVo);
                }
            }
            if(companyFieldVo.getHostingId() != null && companyFieldVo.getIspId() != -1){
                //HostingField hostingField = this.hostingFieldRepository.getOne(companyFieldVo.getHostingId());
            if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1){
                HostingField hostingField = this.hostingFieldService.getHosting(companyFieldVo.getHostingId());
                if(hostingField != null){
                    HostingFieldVo hostingFieldVo = ConvertUtil.copyProperties(hostingField, HostingFieldVo.class);
src/main/java/kr/wisestone/owl/service/impl/DepartmentServiceImpl.java
@@ -2,6 +2,7 @@
import kr.wisestone.owl.domain.*;
import kr.wisestone.owl.mapper.DepartmentMapper;
import kr.wisestone.owl.repository.UserDepartmentRepository;
import kr.wisestone.owl.service.*;
import kr.wisestone.owl.web.condition.DepartmentCondition;
import kr.wisestone.owl.web.condition.UserCondition;
@@ -38,6 +39,9 @@
    @Autowired
    private DepartmentRepository departmentRepository;
    @Autowired
    private UserDepartmentService userDepartmentService;
    @Autowired
    private DepartmentMapper departmentMapper;
@@ -233,7 +237,12 @@
    @Override
    public boolean countInDepartment(Long id) {
        return this.departmentMapper.countInDepartment(id) > 0;
        boolean result = false;
        List<UserDepartment> usingDepartments = this.userDepartmentService.findByDepartmentId(id);
        if(usingDepartments != null && usingDepartments.size() > 0){
            result = true;
        }
        return result;
    }
    //  DepartmentVos 데이터를 엑셀에서 표시할 수 있는 데이터로 변경한다.
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -12,6 +12,7 @@
import kr.wisestone.owl.domain.enumType.IssueHistoryType;
import kr.wisestone.owl.domain.enumType.IssueStatusType;
import kr.wisestone.owl.exception.OwlRuntimeException;
import kr.wisestone.owl.mapper.DepartmentMapper;
import kr.wisestone.owl.mapper.IssueMapper;
import kr.wisestone.owl.mapper.ProjectMapper;
import kr.wisestone.owl.repository.IssueRelationRepository;
@@ -175,6 +176,9 @@
    @Autowired
    private UserDepartmentRepository userDepartmentRepository;
    @Autowired
    private DepartmentMapper departmentMapper;
    @Autowired
    private WorkflowDepartmentRepository workflowDepartmentRepository;
@@ -694,8 +698,22 @@
            for(UserDepartment myDepartment : myDepartments){
                myDepartmentIds.add(myDepartment.getDepartmentId());
            }
        } else {
            myDepartmentIds.add(-1L);
        }
        issueCondition.setMyDepartmentIds(myDepartmentIds);
    }
    void SetAllDepartmentId(IssueCondition issueCondition){
        List<Long> departmentIds = Lists.newArrayList();
        List<Map<String, Object>> departmentList = this.departmentMapper.find(null);
        if(departmentList != null && departmentList.size() > 0){
            for(Map<String, Object> department : departmentList){
                departmentIds.add((Long) department.get("id"));
            }
        }
        issueCondition.setMyDepartmentIds(departmentIds);
    }
    void SetWorkflowDepartment(List<IssueVo> issueVos){
@@ -754,16 +772,16 @@
        Long totalCount = 0L;
        UserLevel userLevel = this.userLevelService.getUserLevel(user.getUserLevel().getId());
//        if (this.userWorkspaceService.checkWorkspaceManager(user)
//                || MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE_PROJECT_ALL)) {
            results = this.issueMapper.find(issueCondition);
            totalCount = this.issueMapper.count(issueCondition);
//        }
//        } else{
//            this.SetMyDepartmentId(issueCondition);
//            results = this.issueMapper.findByDepartment(issueCondition);
//            totalCount = this.issueMapper.countByDepartment(issueCondition);
//        }
        if (this.userWorkspaceService.checkWorkspaceManager(user)
                || MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE_PROJECT_ALL)) {
            this.SetAllDepartmentId(issueCondition);
        } else{
            this.SetMyDepartmentId(issueCondition);
            /*results = this.issueMapper.findByDepartment(issueCondition);
            totalCount = this.issueMapper.countByDepartment(issueCondition);*/
        }
        results = this.issueMapper.find(issueCondition);
        totalCount = this.issueMapper.count(issueCondition);
        //  튜닝 전 - 0.8, 0.9, 0.9, 0.9, 0.9
src/main/java/kr/wisestone/owl/service/impl/UserDepartmentServiceImpl.java
@@ -89,6 +89,11 @@
        this.userDepartmentRepository.saveAll(list);
    }
    @Override
    public List<UserDepartment> findByDepartmentId(Long id) {
        return this.userDepartmentRepository.findByDepartmentId(id);
    }
    // 사용자 부서 ID로 조회한다.
//    @Override
src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -56,6 +56,7 @@
    private String modifyByName;    //  변경자 정보 - 이슈 변경 정보 상세 확인에서 사용
    private WorkflowStatusVo workflowStatusVo;
    private IssueVo parentIssueVo;
    private Long parentIssueId;
    private int downIssueCount;
    private int downIssueAllCount;
    private List<Long> workflowDepartmentIds; // 워크플로우에 설정한 담당부서 ID
@@ -521,4 +522,12 @@
            this.issueTableConfigVos.add(issueTableConfigVo);
        }
    }
    public Long getParentIssueId() {
        return parentIssueId;
    }
    public void setParentIssueId(Long parentIssueId) {
        this.parentIssueId = parentIssueId;
    }
}
src/main/resources/mybatis/query-template/issue-template.xml
@@ -45,6 +45,7 @@
        LEFT OUTER JOIN issue_custom_field_value issue_custom FORCE INDEX(issueIdIndex) ON issue.id = issue_custom.issue_id
        LEFT OUTER JOIN issue_department isd FORCE INDEX(issueIdIndex) ON issue.id = isd.issue_id
        LEFT OUTER JOIN issue_user issue_user FORCE INDEX(issueIdIndex) ON issue.id = issue_user.issue_id
        LEFT OUTER JOIN user_department ud ON ud.department_id = isd.department_id
        LEFT OUTER JOIN (SELECT issue_id, COUNT(id) as attachedFileCount FROM attached_file GROUP BY issue_id)
        temp_attached_file on (temp_attached_file.issue_id = issue.id)
        LEFT OUTER JOIN (SELECT issue_id, COUNT(id) as issueCommentCount FROM issue_comment GROUP BY issue_id)
@@ -172,6 +173,15 @@
        </choose>
        <choose>
            <when test="departmentIds.size != 0 and myDepartmentIds != null and myDepartmentIds.size != 0">
                AND isd.department_id IN
                <foreach collection="myDepartmentIds" item="item" index="index" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </when>
        </choose>
        <choose>
            <when test="registerIds.size != 0">
                AND issue.register_id IN
                <foreach collection="registerIds" item="item" index="index" separator="," open="(" close=")">
@@ -208,7 +218,7 @@
        </if>
    </select>
    <select id="findByDepartment" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCondition">
    <!--<select id="findByDepartment" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCondition">
        SELECT
        DISTINCT issue.id as id,
        issue.register_id as registerId,
@@ -401,7 +411,7 @@
        <if test="page != null and !page.equals('')">
            limit #{pageSize} offset #{page};
        </if>
    </select>
    </select>-->
    <!--<select id="count" resultType="java.lang.Long" parameterType="kr.wisestone.owl.web.condition.IssueCondition">
        SELECT
@@ -542,6 +552,7 @@
        FROM issue issue
        LEFT OUTER JOIN issue_department isd ON issue.id = isd.issue_id
        LEFT OUTER JOIN issue_status iss ON iss.id = issue.issue_status_id
        LEFT OUTER JOIN user_department ud ON ud.department_id = isd.department_id
        WHERE 1=1
        AND issue.parent_issue_id IS NULL
        <if test="title != null and !title.equals('') ">
@@ -639,6 +650,15 @@
        </choose>
        <choose>
            <when test="departmentIds.size != 0 and myDepartmentIds != null and myDepartmentIds.size != 0">
                AND isd.department_id IN
                <foreach collection="myDepartmentIds" item="item" index="index" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </when>
        </choose>
        <choose>
            <when test="registerIds.size != 0">
                AND issue.register_id IN
                <foreach collection="registerIds" item="item" index="index" separator="," open="(" close=")">
src/main/webapp/scripts/app/companyField/companyFieldModify.controller.js
@@ -84,14 +84,14 @@
                        name : $rootScope.preventXss($scope.vm.form.name),
                        ispId : (function () {  // ISP 아이디
                            var ispId = -1;
                            if ($scope.vm.form.issueIspFields.length > 0) {
                            if ($scope.vm.form.issueIspFields != null && $scope.vm.form.issueIspFields.length > 0) {
                                ispId = $scope.vm.form.ispId;
                            }
                            return ispId;
                        })(),
                        hostingId : (function () {  // Hosting 아이디
                            var hostingId = -1;
                            if ($scope.vm.form.issueHostingFields.length > 0) {
                            if ($scope.vm.form.issueHostingFields != null && $scope.vm.form.issueHostingFields.length > 0) {
                                hostingId = $scope.vm.form.hostingId;
                            }
                            return hostingId;
src/main/webapp/scripts/app/issue/issueAdd.controller.js
@@ -464,7 +464,7 @@
                        companyId : (function () {   //  업체 아이디
                            var companyId = -1;
                            if ($scope.vm.form.issueCompanyFields.length > 0) {
                            if ($scope.vm.form.issueCompanyFields != null && $scope.vm.form.issueCompanyFields.length > 0) {
                                companyId = $scope.vm.form.issueCompanyFields[0].id;
                            }
                            return companyId;
@@ -472,7 +472,7 @@
                        ispId : (function () {  // ISP 아이디
                            var ispId = -1;
                            if ($scope.vm.form.issueIspFields.length > 0) {
                            if ($scope.vm.form.issueIspFields != null && $scope.vm.form.issueIspFields.length > 0) {
                                ispId = $scope.vm.form.issueIspFields[0].id;
                            }
                            return ispId;
@@ -480,7 +480,7 @@
                        hostingId : (function () {  // Hosting 아이디
                            var hostingId = -1;
                            if ($scope.vm.form.issueHostingFields.length > 0) {
                            if ($scope.vm.form.issueHostingFields != null && $scope.vm.form.issueHostingFields.length > 0) {
                                hostingId = $scope.vm.form.issueHostingFields[0].id;
                            }
                            return hostingId;
src/main/webapp/scripts/app/issue/issueAddRelation.controller.js
@@ -395,6 +395,9 @@
                // 업체정보 결과 값 Event 처리(set)
                $scope.$on("companyFieldEvent", function (event, result) {
                    var ispFieldVo = result[0].ispFieldVo;
                    var hostingFieldVo = result[0].hostingFieldVo;
                    $scope.vm.companyId = result[0].id;
                    $scope.vm.companyName = result[0].name;
                    $scope.vm.companyManager = result[0].manager;
@@ -403,6 +406,21 @@
                    $scope.vm.companyUrl = result[0].url;
                    $scope.vm.companyMemo = result[0].memo;
                    $scope.vm.ispName = ispFieldVo.name;
                    $scope.vm.ispCode = ispFieldVo.code;
                    $scope.vm.ispManager = ispFieldVo.manager;
                    $scope.vm.ispTel = ispFieldVo.tel;
                    $scope.vm.ispEmail = ispFieldVo.email;
                    $scope.vm.ispUrl = ispFieldVo.url;
                    $scope.vm.ispMemo = ispFieldVo.memo;
                    $scope.vm.hostingName = hostingFieldVo.name;
                    $scope.vm.hostingCode = hostingFieldVo.code;
                    $scope.vm.hostingManager = hostingFieldVo.manager;
                    $scope.vm.hostingTel = hostingFieldVo.tel;
                    $scope.vm.hostingEmail = hostingFieldVo.email;
                    $scope.vm.hostingUrl = hostingFieldVo.url;
                    $scope.vm.hostingMemo = hostingFieldVo.memo;
                });
                // ISP정보 결과 값 Event 처리(set)
@@ -496,7 +514,7 @@
                        hostingId : (function () {
                            var hostingId = -1;
                            if ($scope.vm.form.issueHostingFields.length > 0) {
                            if ($scope.vm.form.issueHostingFields != null && $scope.vm.form.issueHostingFields.length > 0) {
                                hostingId = $scope.vm.form.issueHostingFields[0].id;
                            }
src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -624,6 +624,20 @@
                        if (result.data.message.status === "success") {
                            if (result.data.data !=  null && result.data.data.length > 0) {
                                //var resultSize = result.data.data.length;
                                for (var i = 0; i < result.data.data.length; i++) {
                                    if (result.data.data[i].parentIssueId != null) {
                                        result.data.data.splice(i, 1);
                                        i--;
                                    }else if ($scope.vm.search.issueTypeIds !== null && $scope.vm.search.issueTypeIds.length > 0
                                            && result.data.data[i].issueTypeId !== $scope.vm.search.issueTypeIds[0].fieldKey) {
                                        result.data.data.splice(i, 1);
                                        i--;
                                    }
                                }
                            }
                            if (result.data.data !=  null && result.data.data.length > 0) {
                                $scope.vm.issueTypeId = result.data.data[0].issueTypeId;
                                $scope.vm.projectKey = result.data.data[0].projectKey;
                                $scope.vm.issueNumber = result.data.data[0].issueNumber;
src/main/webapp/scripts/app/issue/issueModify.controller.js
@@ -371,6 +371,9 @@
                // 업체정보 결과 값 Event 처리(set)
                $scope.$on("companyFieldEvent", function (event, result) {
                    var ispFieldVo = result[0].ispFieldVo;
                    var hostingFieldVo = result[0].hostingFieldVo;
                    $scope.vm.companyId = result[0].id;
                    $scope.vm.companyName = result[0].name;
                    $scope.vm.companyManager = result[0].manager;
@@ -378,6 +381,22 @@
                    $scope.vm.companyEmail = result[0].email;
                    $scope.vm.companyUrl = result[0].url;
                    $scope.vm.companyMemo = result[0].memo;
                    $scope.vm.ispName = ispFieldVo.name;
                    $scope.vm.ispCode = ispFieldVo.code;
                    $scope.vm.ispManager = ispFieldVo.manager;
                    $scope.vm.ispTel = ispFieldVo.tel;
                    $scope.vm.ispEmail = ispFieldVo.email;
                    $scope.vm.ispUrl = ispFieldVo.url;
                    $scope.vm.ispMemo = ispFieldVo.memo;
                    $scope.vm.hostingName = hostingFieldVo.name;
                    $scope.vm.hostingCode = hostingFieldVo.code;
                    $scope.vm.hostingManager = hostingFieldVo.manager;
                    $scope.vm.hostingTel = hostingFieldVo.tel;
                    $scope.vm.hostingEmail = hostingFieldVo.email;
                    $scope.vm.hostingUrl = hostingFieldVo.url;
                    $scope.vm.hostingMemo = hostingFieldVo.memo;
                });
@@ -471,7 +490,7 @@
                        hostingId : (function () {
                            var hostingId = -1;
                            if ($scope.vm.form.issueHostingFields.length > 0) {
                            if ($scope.vm.form.issueHostingFields != null && $scope.vm.form.issueHostingFields.length > 0) {
                                hostingId = $scope.vm.form.issueHostingFields[0].id;
                            }
src/main/webapp/scripts/app/issue/issueSendMailPartners.controller.js
@@ -25,7 +25,7 @@
                    ispVos : parameter.ispVos,
                    hostingVos : parameter.hostingVos,
                    partners : parameter.partnersAll.slice(),
                    html : "issueSendMailPartners.html",
                    html : "",
                    form : {
                        id : parameter.issueId,  //  이슈 번호
                        projects : [{ id : parameter.projectId}],  //  프로젝트
@@ -90,6 +90,7 @@
                    })
                }
                //  사용자 삭제
                function removeMailTarget(index) {
                    $scope.vm.form.mailUsers.splice(index, 1);
src/main/webapp/scripts/components/utils/autoComplete.controller.js
@@ -133,13 +133,13 @@
                function getIssueList(query, issueTypeId, excludeList, page, callBack) {
                    var conditions = {
                        name : query,
                        issueTypeIds : (function () {
                        /*issueTypeIds : (function () {
                            var ids = [];
                            ids.push(issueTypeId);
                            return ids;
                        })(),
                        })(),*/
                        excludeIds : (function () {
                            var excludeIds = [];
@@ -175,13 +175,13 @@
                function getDownIssueList(query, issueTypeId, excludeList, page, callBack) {
                    var conditions = {
                        name : query,
                        // issueTypeIds : (function () {
                        //     var ids = [];
                        //
                        //     ids.push(issueTypeId);
                        //
                        //     return ids;
                        // })(),
                        issueTypeIds : (function () {
                            var ids = [];
                            ids.push(issueTypeId);
                            return ids;
                        })(),
                        excludeIds : (function () {
                            var excludeIds = [];
src/main/webapp/views/companyField/companyFieldAdd.html
@@ -42,7 +42,7 @@
                                    page="vm.autoCompletePage.ispField.page"
                                    total-page="vm.autoCompletePage.ispField.totalPage"
                                    input-disabled="false"
                                    translation-texts="{ empty : 'common.emptyHosting' }"
                                    translation-texts="{ empty : 'common.emptyIsp' }"
                                    broad-cast="ispFieldEvent"
                                    extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
src/main/webapp/views/companyField/companyFieldModify.html
@@ -41,7 +41,7 @@
                                        page="vm.autoCompletePage.ispField.page"
                                        total-page="vm.autoCompletePage.ispField.totalPage"
                                        input-disabled="false"
                                        translation-texts="{ empty : 'common.emptyHosting' }"
                                        translation-texts="{ empty : 'common.emptyIsp' }"
                                        broad-cast="ispFieldEvent"
                                        extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                    type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
src/main/webapp/views/issue/issueAddRelation.html
@@ -380,7 +380,8 @@
            <div ng-show="fn.containsPartner('업체')" class="row">
                <div class="col-lg-8 fontcolor_green">
                    <label class="issue-label"><span class="fontcolor_green" translate="companyField.info">업체정보</span>
                        &nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;업체 이름 클릭시 선택된 이름의 업체 정보가 조회됩니다.</span>
                        &nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;
                            &nbsp;업체 이름 클릭시 선택된 이름의 업체 정보가 조회되며, 업체정보에서 추가한 ISP, 호스팅 정보를 불러옵니다.</span>
                    </label>
                </div>
            </div>
@@ -486,7 +487,7 @@
            <div ng-show="fn.containsPartner('ISP')" class="row">
                <div class="col-lg-8 fontcolor_green">
                    <label class="issue-label"><span class="fontcolor_green" translate="ispField.info">ISP 정보</span>
                        &nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;ISP 이름 클릭시 선택된 이름의 ISP 정보가 조회됩니다.</span>
                        &nbsp;&nbsp;<!--<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;ISP 이름 클릭시 선택된 이름의 ISP 정보가 조회됩니다.</span>-->
                    </label>
                </div>
            </div>
@@ -495,7 +496,15 @@
                <div class="col-lg-4">
                    <div class="form-group mb10">
                        <label class="issue-label"> <span translate="ispField.name">ISP 이름</span> </label>
                        <js-autocomplete-single data-input-name="ispField"
                        <input name="ispName"
                               type="text"
                               class="form-control"
                               kr-input
                               autocomplete="off"
                               ng-model="vm.ispName"
                               ng-maxlength="100"
                               maxlength="100">
                        <!--<js-autocomplete-single data-input-name="ispField"
                                                selected-model="vm.form.issueIspFields"
                                                search="vm.ispName"
                                                source="fn.getIssueIspFieldList(vm.ispName, vm.form.issueIspFields, vm.autoCompletePage.ispField.page, fn.getIssueIspFieldListCallBack)"
@@ -505,7 +514,7 @@
                                                translation-texts="{ empty : 'common.emptyIsp' }"
                                                broad-cast="ispFieldEvent"
                                                extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>-->
                    </div>
                </div>
                <div class="col-lg-4">
@@ -606,7 +615,7 @@
            <div ng-show="fn.containsPartner('호스팅')" class="row">
                <div class="col-lg-8 fontcolor_green">
                    <label class="issue-label"><span class="fontcolor_green" translate="hostingField.info">호스팅 정보</span>
                        &nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;호스팅 이름 클릭시 선택된 이름의 호스팅 정보가 조회됩니다.</span>
                        &nbsp;&nbsp;<!--<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;호스팅 이름 클릭시 선택된 이름의 호스팅 정보가 조회됩니다.</span>-->
                    </label>
                </div>
            </div>
@@ -615,7 +624,15 @@
                <div class="col-lg-4">
                    <div class="form-group mb10">
                        <label class="issue-label"> <span translate="hostingField.name">호스팅 이름</span> </label>
                        <js-autocomplete-single data-input-name="hostingField"
                        <input name="hostingName"
                               type="text"
                               class="form-control"
                               kr-input
                               autocomplete="off"
                               ng-model="vm.hostingName"
                               ng-maxlength="100"
                               maxlength="100">
                        <!--<js-autocomplete-single data-input-name="hostingField"
                                                selected-model="vm.form.issueHostingFields"
                                                search="vm.hostingName"
                                                source="fn.getIssueHostingFieldList(vm.hostingName, vm.form.issueHostingFields, vm.autoCompletePage.hostingField.page, fn.getIssueHostingFieldListCallBack)"
@@ -625,7 +642,7 @@
                                                translation-texts="{ empty : 'common.emptyHosting' }"
                                                broad-cast="hostingFieldEvent"
                                                extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>-->
                    </div>
                </div>
                <div class="col-lg-4">
src/main/webapp/views/issue/issueListNormal.html
@@ -336,8 +336,8 @@
                            <!--    우측  -->
                            <div class="col-5" >
                                <span class="issue-detail-label" style="position: relative; left: 18.8rem; bottom: 5px"><span style="color: #0a7cf8">◆</span> 완료 이슈 숨기기</span>
                                <label class='switch' style="left: 19.3rem"><input type='checkbox' ng-model='vm.hideIssue' ng-click='fn.getPageList(0)'>
                                <span class="issue-detail-label" style="position: relative; left: 16.8rem; bottom: 5px"><span style="color: #0a7cf8">◆</span> 완료 이슈 숨기기</span>
                                <label class='switch' style="left: 17.3rem"><input type='checkbox' ng-model='vm.hideIssue' ng-click='fn.getPageList(0)'>
                                    <span class='slider round'></span>
                                </label>
                                <form class="form-inline justify-content-sm-end  pull-right" method="post" action="/issue/downloadExcel" name="issueListForm" >
src/main/webapp/views/issue/issueModify.html
@@ -370,7 +370,8 @@
            <div ng-show="fn.containsPartner('업체')" class="row">
                <div class="col-lg-8 fontcolor_green">
                    <label class="issue-label"><span class="fontcolor_green" translate="companyField.info">업체정보</span>
                        &nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;업체 이름 클릭시 선택된 이름의 업체 정보가 조회됩니다.</span>
                        &nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;
                            &nbsp;업체 이름 클릭시 선택된 이름의 업체 정보가 조회되며, 업체정보에서 추가한 ISP, 호스팅 정보를 불러옵니다.</span>
                    </label>
                </div>
            </div>
@@ -476,7 +477,7 @@
            <div ng-show="fn.containsPartner('ISP')" class="row">
                <div class="col-lg-8 fontcolor_green">
                    <label class="issue-label"><span class="fontcolor_green" translate="ispField.info">ISP 정보</span>
                        &nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;ISP 이름 클릭시 선택된 이름의 ISP 정보가 조회됩니다.</span>
                        <!--&nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;ISP 이름 클릭시 선택된 이름의 ISP 정보가 조회됩니다.</span>-->
                    </label>
                </div>
            </div>
@@ -485,7 +486,15 @@
                <div class="col-lg-4">
                    <div class="form-group mb10">
                        <label class="issue-label"> <span translate="ispField.name">ISP 이름</span> </label>
                        <js-autocomplete-single data-input-name="ispField"
                        <input name="ispName"
                               type="text"
                               class="form-control"
                               kr-input
                               autocomplete="off"
                               ng-model="vm.ispName"
                               ng-maxlength="100"
                               maxlength="100">
                        <!--<js-autocomplete-single data-input-name="ispField"
                                                selected-model="vm.form.issueIspFields"
                                                search="vm.ispName"
                                                source="fn.getIssueIspFieldList(vm.ispName, vm.form.issueIspFields, vm.autoCompletePage.ispField.page, fn.getIssueIspFieldListCallBack)"
@@ -495,7 +504,7 @@
                                                translation-texts="{ empty : 'common.emptyIsp' }"
                                                broad-cast="ispFieldEvent"
                                                extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>-->
                    </div>
                </div>
                <div class="col-lg-4">
@@ -596,7 +605,7 @@
            <div ng-show="fn.containsPartner('호스팅')" class="row">
                <div class="col-lg-8 fontcolor_green">
                    <label class="issue-label"><span class="fontcolor_green" translate="hostingField.info">호스팅 정보</span>
                        &nbsp;&nbsp;<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;호스팅 이름 클릭시 선택된 이름의 호스팅 정보가 조회됩니다.</span>
                        &nbsp;&nbsp;<!--<span class="select3-selection__choice" style="position: relative; bottom: 2px;"><code class="highlighter-rouge">*</code>&nbsp;&nbsp;호스팅 이름 클릭시 선택된 이름의 호스팅 정보가 조회됩니다.</span>-->
                    </label>
                </div>
            </div>
@@ -605,8 +614,17 @@
                <div class="col-lg-4">
                    <div class="form-group mb10">
                        <label class="issue-label"> <span translate="hostingField.name">호스팅 이름</span> </label>
                        <js-autocomplete-single data-input-name="hostingField"
                        <input name="hostingName"
                               type="text"
                               class="form-control"
                               kr-input
                               autocomplete="off"
                               ng-model="vm.hostingName"
                               ng-maxlength="100"
                               maxlength="100">
                        <!--<js-autocomplete-single data-input-name="hostingField"
                                                selected-model="vm.form.issueHostingFields"
                                                ng-model="vm.hostingName"
                                                search="vm.hostingName"
                                                source="fn.getIssueHostingFieldList(vm.hostingName, vm.form.issueHostingFields, vm.autoCompletePage.hostingField.page, fn.getIssueHostingFieldListCallBack)"
                                                page="vm.autoCompletePage.hostingField.page"
@@ -615,7 +633,7 @@
                                                translation-texts="{ empty : 'common.emptyHosting' }"
                                                broad-cast="hostingFieldEvent"
                                                extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>-->
                    </div>
                </div>
                <div class="col-lg-4">