OWL ITS + 탐지시스템(인터넷 진흥원)
- 업체메일 발송 시 파트너의 메일주소가 없을 경우 필터링 해주기
- 전체 프로젝트로 선택 되어있는 경우에도 이슈 만들때 이슈타입과 프로젝트가 선택되도록 수정
14개 파일 변경됨
102 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/mapper/ProjectMapper.java 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/ProjectService.java 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/ProjectServiceImpl.java 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/condition/ProjectCondition.java 13 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/ProjectController.java 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/project-template.xml 15 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAdd.controller.js 32 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueSendMailPartners.controller.js 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/components/project/project.service.js 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueAdd.html 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueAddDown.html 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueModify.html 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueSendMailPartners.html 4 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/ProjectMapper.java
@@ -33,4 +33,6 @@
    List<Map<String, Object>> checkIncludeProject(ProjectCondition projectCondition);
    List<Map<String, Object>> findChildrenProject(Long parentProjectId);
    Map<String, Object> findByIssueType(ProjectCondition projectCondition);
}
src/main/java/kr/wisestone/owl/service/ProjectService.java
@@ -24,6 +24,8 @@
    List<ProjectVo> findProject(Map<String, Object> resJsonData,
                                ProjectCondition condition, Pageable pageable);
    void findIssueType(Map<String, Object> resJsonData, ProjectCondition condition);
    void detailProject(Map<String, Object> resJsonData, ProjectCondition projectCondition);
    Project findByProjectKey(String projectKey);
src/main/java/kr/wisestone/owl/service/impl/ProjectServiceImpl.java
@@ -401,6 +401,13 @@
        return projectVos;
    }
    //  이슈유형에 속한 프로젝트 목록을 조회한다.
    @Override
    @Transactional(readOnly = true)
    public void findIssueType(Map<String, Object> resJsonData, ProjectCondition condition) {
        resJsonData.put(Constants.RES_KEY_CONTENTS, this.projectMapper.findByIssueType(condition));
    }
    void setChildrenProject(List<ProjectVo> projectVos, User user) {
        int projectCount = projectVos.size();
        for (int i=0; i< projectCount; i++) {
src/main/java/kr/wisestone/owl/web/condition/ProjectCondition.java
@@ -27,6 +27,7 @@
    private List<Long> userIds = Lists.newArrayList();
    private List<Long> departmentIds = Lists.newArrayList();
    private List<Long> myDepartmentIds; // 내가 속해있는 부서 ID
    private Long issueTypeId;
    public ProjectCondition(){}
@@ -55,6 +56,10 @@
        if (MapUtil.getLongs(conditions, "departmentIds") != null) {
            condition.setDepartmentIds(MapUtil.getLongs(conditions, "departmentIds"));
        }
        if (MapUtil.getLong(conditions, "issueTypeId") != null) {
            condition.setIssueTypeId(MapUtil.getLong(conditions, "issueTypeId"));
        }
        return condition;
@@ -187,4 +192,12 @@
    public void setMyDepartmentIds(List<Long> myDepartmentIds) {
        this.myDepartmentIds = myDepartmentIds;
    }
    public Long getIssueTypeId() {
        return issueTypeId;
    }
    public void setIssueTypeId(Long issueTypeId) {
        this.issueTypeId = issueTypeId;
    }
}
src/main/java/kr/wisestone/owl/web/controller/ProjectController.java
@@ -107,6 +107,18 @@
        return this.setSuccessMessage(resJsonData);
    }
    //  참여 프로젝트 조회
    @RequestMapping(value = "/project/findIssueType", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> findIssueType(@RequestBody Map<String, Map<String, Object>> params) {
        Map<String, Object> resJsonData = new HashMap<>();
        this.projectService.findIssueType(resJsonData, ProjectCondition.make(params.get(Constants.REQ_KEY_CONTENT)));
        return this.setSuccessMessage(resJsonData);
    }
    //  프로젝트 상세 조회
    @RequestMapping(value = "/project/detail", produces = MediaType.APPLICATION_JSON_VALUE)
    public
src/main/resources/mybatis/query-template/project-template.xml
@@ -639,6 +639,21 @@
        WHERE pc.parent_project_id = #{parent_project_id}
    </select>
    <select id="findByIssueType" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.ProjectCondition">
        SELECT
            p.id as id,
            p.name as name,
            p.description as description,
            p.status as status,
            p.start_date as startDate,
            p.end_date as endDate,
            p.project_key as projectKey
        FROM
            project p
                INNER JOIN issue_type it ON it.project_id = p.id
        WHERE it.id = #{issueTypeId}
    </select>
    <!--    프로젝트 삭제 -->
    <!--<delete id="deleteProject" parameterType="java.util.HashMap">
        &lt;!&ndash;    프로젝트에 연결된 사용자 정의 필드 정보 삭제   &ndash;&gt;
src/main/webapp/i18n/ko/global.json
@@ -299,7 +299,8 @@
        "CommonSendIssueMail": "일반 메일 발송",
        "SendIssueMail": "메일 발송 입력",
        "sendIssueSelectedUsers": "프로젝트에 참여하고 있는 다른 사용자에게 이슈 정보를 보냅니다.",
        "sendIssueSelectedPartners": "해당 이슈의 속해 있는 파트너 담당자에게 이슈 정보를 보냅니다.",
        "sendIssueSelectedPartners": "해당 이슈에 속해 있는 파트너 담당자에게 이슈 정보를 보냅니다.",
        "sendIssueSelectedNotPartners": "해당 이슈에 속해 있는 파트너 담당자가 없습니다.",
        "sendMail": "이메일 발송",
        "changedHistory": "이슈 변경 이력 상세정보",
        "noChangeHistory": "이슈 변경 정보가 없습니다.",
src/main/webapp/scripts/app/issue/issueAdd.controller.js
@@ -9,9 +9,9 @@
    ],
    function (app, angular) {
        app.controller('issueAddController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', '$uibModal', '$injector',
            '$controller', '$tableProvider', 'SweetAlert', '$timeout', '$stateParams', '$q', 'Issue', 'User', 'AttachedFile', 'IssueType', 'Priority', 'Severity', 'IssueTypeCustomField', '$filter', '$state',
            '$controller', '$tableProvider', 'SweetAlert', '$timeout', '$stateParams', '$q', 'Issue', 'User', 'AttachedFile', 'Project', 'IssueType', 'Priority', 'Severity', 'IssueTypeCustomField', '$filter', '$state',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, $uibModal,  $injector, $controller, $tableProvider, SweetAlert, $timeout,
                      $stateParams, $q, Issue, User, AttachedFile, IssueType, Priority, Severity, IssueTypeCustomField, $filter, $state) {
                      $stateParams, $q, Issue, User, AttachedFile, Project, IssueType, Priority, Severity, IssueTypeCustomField, $filter, $state) {
                $scope.fn = {
                    cancel : cancel,    //  팝업 창 닫기
@@ -27,6 +27,7 @@
                    onFileSelect : onFileSelect,    //  파일 첨부
                    infiniteAddForm : infiniteAddForm,  //  계속 생성
                    imageUpload : imageUpload,  //  섬머노트 이미지 업로드
                    getProject : getProject,    //프로젝트 가져오기(전체 프로젝트 일 경우 사용)
                    getIssueTypes : getIssueTypes,  //  이슈 타입 목록 가져오기
                    getPriorities : getPriorities,  //  우선순위 목록 가져오기
                    getSeverities : getSeverities,  //  중요도 목록 가져오기
@@ -840,13 +841,35 @@
                    $(document).unbind("keydown");  //  단축키 이벤트 제거
                }
                //  프로젝트 가져오기(전체 프로젝트 일 경우 사용)
                function getProject() {
                    var deferred = $q.defer();
                    Project.findIssueType($resourceProvider.getContent({issueTypeId : $rootScope.getCurrentIssueTypeId()},
                        $resourceProvider.getPageContent(0, 1000))).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.vm.form.projects.push(result.data.data);
                            $scope.vm.projectName = result.data.data.name;
                            $scope.fn.getIssueTypeOfProject();
                        }
                        else {
                            SweetAlert.swal($filter("translate")("issue.failedToIssueTypeListLookup"), result.data.message.message, "error"); // 이슈 타입 목록 조회 실패
                        }
                        deferred.resolve(result.data.data);
                    });
                    return deferred.promise;
                }
                //  이슈 유형 목록
                function getIssueTypes() {
                    var deferred = $q.defer();
                    if (!$rootScope.isDefined($scope.vm.form.projects[0])) {
                    /*if (!$rootScope.isDefined($scope.vm.form.projects[0])) {
                        return;
                    }
                    }*/
                    IssueType.find($resourceProvider.getContent({},
                        $resourceProvider.getPageContent(0, 1000))).then(function (result) {
@@ -1062,6 +1085,7 @@
                function startExecute() {
                    var promises = {
                        getProject : $scope.fn.getProject(),
                        getIssueTypes : $scope.fn.getIssueTypes(),
                        getPriorities : $scope.fn.getPriorities(),
                        getSeverities : $scope.fn.getSeverities(),
src/main/webapp/scripts/app/issue/issueSendMailPartners.controller.js
@@ -225,7 +225,7 @@
                                        nameArr.push(name);
                                        idArr.push(id);
                                    }
                                } else {
                                } else if(account != null) {
                                    accountArr.push(account);
                                    nameArr.push(name);
                                    idArr.push(id);
src/main/webapp/scripts/components/project/project.service.js
@@ -26,6 +26,12 @@
                    return response;
                });
            },
            findIssueType : function (conditions) {
                return $http.post("project/findIssueType", conditions).then(function (response) {
                    $log.debug("이슈유형에 속해있는 프로젝트 : ", response);
                    return response;
                });
            },
            add : function (conditions) {
                return $http.post("project/add", conditions).then(function (response) {
                    $log.debug("프로젝트 생성 결과 : ", response);
src/main/webapp/views/issue/issueAdd.html
@@ -41,7 +41,6 @@
                                                source="fn.getProjectList(vm.projectName, vm.form.projects, vm.autoCompletePage.project.page, fn.getProjectListCallBack)"
                                                page="vm.autoCompletePage.project.page"
                                                total-page="vm.autoCompletePage.project.totalPage"
                                                input-disabled="$root.workProject.id !== -1 && vm.form.projects != null ? vm.form.projects.length > 0 : false"
                                                translation-texts="{ empty : 'common.emptyProject' }"
                                                extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
@@ -62,7 +61,6 @@
                                        ng-change="fn.getIssueTypeCustomFields()"
                                        ng-style="{ 'color' : fn.getOptionColor(vm.issueTypes, vm.form.issueTypeId) }"
                                        required
                                        ng-disabled="$root.workProject.id !== -1"
                                        >
                                    <option value="" translate="common.selectTarget" ng-style="{ 'color' : '#353535' }"><span
                                            translate="common.selectTarget">대상 선택</span>
src/main/webapp/views/issue/issueAddDown.html
@@ -40,7 +40,6 @@
                                                source="fn.getProjectList(vm.projectName, vm.form.projects, vm.autoCompletePage.project.page, fn.getProjectListCallBack)"
                                                page="vm.autoCompletePage.project.page"
                                                total-page="vm.autoCompletePage.project.totalPage"
                                                input-disabled="vm.form.projects != null ? vm.form.projects.length > 0 : false"
                                                translation-texts="{ empty : 'common.emptyProject' }"
                                                extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
src/main/webapp/views/issue/issueModify.html
@@ -39,7 +39,6 @@
                                                source="fn.getProjectList(vm.projectName, vm.form.projects, vm.autoCompletePage.project.page, fn.getProjectListCallBack)"
                                                page="vm.autoCompletePage.project.page"
                                                total-page="vm.autoCompletePage.project.totalPage"
                                                input-disabled="vm.form.projects != null ? vm.form.projects.length > 0 : false"
                                                translation-texts="{ empty : 'common.emptyProject' }"
                                                extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '',
                                                type : '', maxlength : 200, autoResize : false, stopRemoveBodyEvent : true }"></js-autocomplete-single>
src/main/webapp/views/issue/issueSendMailPartners.html
@@ -11,7 +11,9 @@
    <div class="modal-body">
        <form role="form" name="issueSendForm">
            <div class="form-group">
                <small translate="issue.sendIssueSelectedPartners">프로젝트에 참여하고 있는 다른 사용자에게 이슈 정보를 보냅니다.</small>
                <div ng-if="vm.form.account[0].account.length < 1" class="help-block form-text text-danger"
                     translate="issue.sendIssueSelectedNotPartners">해당 이슈에 속해 있는 파트너 담당자가 없습니다.</div>
                <small ng-if="vm.form.account[0].account.length > 0" translate="issue.sendIssueSelectedPartners">해당 이슈에 속해 있는 파트너 담당자에게 이슈 정보를 보냅니다.</small>
                <div class="select3-selection__choicediv">
                    <span class="select3-selection__choice" ng-repeat="user in vm.form.account[0].account track by $index">
                        <span>{{vm.form.account[0].name[$index]}}({{user}})</span>