OWL ITS + 탐지시스템(인터넷 진흥원)
- 이슈 상세 화면에서 이슈 상태 변경시 워크플로우에 지정된 담당부서를 불러오도록 수정
- 이슈 상태 변경 저장시 담당부서도 변경되도록 수정
9개 파일 변경됨
117 ■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/service/WorkflowDepartmentService.java 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 8 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueStatusServiceImpl.java 10 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/WorkflowDepartmentServiceImpl.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/WorkflowServiceImpl.java 9 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueDetail.controller.js 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueModifyStatus.controller.js 58 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/views/issue/issueModifyStatus.html 18 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/WorkflowDepartmentService.java
@@ -21,6 +21,7 @@
    WorkflowDepartment getWorkflowDepartment(Long id);
    List<WorkflowDepartmentVo> find(WorkflowDepartmentCondition condition);
    List<WorkflowDepartmentVo> find(Long workflowId, Long issueStatusId);
    void modify(Workflow workflow, List<IssueStatusVo> issueStatusVos);
    void remove(Long workflowId);
}
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -1783,6 +1783,14 @@
            //  이슈 상태 변경
            this.modifyIssueStatus(issueForm);
        }
        // 담당 부서 수정
        if (issueForm.getDepartmentIds().size() > 0) {
            Issue issue = this.getIssue(issueForm.getId());
            Project project = this.projectService.getProject(issueForm.getProjectId());
            this.issueDepartmentService.modifyIssueDepartment(issue, project.getWorkspace(), issueForm.getDepartmentIds());
        }
    }
    //  이슈 Import 용 엑셀 템플릿 다운로드
src/main/java/kr/wisestone/owl/service/impl/IssueStatusServiceImpl.java
@@ -45,6 +45,9 @@
    private WorkflowTransitionService workflowTransitionService;
    @Autowired
    private WorkflowDepartmentService workflowDepartmentService;
    @Autowired
    private IssueTypeService issueTypeService;
    @Autowired
@@ -545,12 +548,18 @@
                if (count < 1) {
                    IssueStatusVo issueStatusVo = new IssueStatusVo(workflowTransitionVo.getTargetStatusId(), workflowTransitionVo.getTargetStatusName());
                    issueStatusVos.add(issueStatusVo);
                    List<WorkflowDepartmentVo> workflowDepartments = this.workflowDepartmentService.find(workflow.getId(), issueStatusVo.getId());
                    issueStatusVo.setWorkflowDepartmentVos(workflowDepartments);
                }
                else {
                    //  두번째 이슈부터 첫번째 이슈에서 이동 가능했던 상태 중 없는 대상을 찾는다.
                    for (IssueStatusVo issueStatusVo : issueStatusVos) {
                        if (issueStatusVo.getId().equals(workflowTransitionVo.getTargetStatusId())) {
                            tempIssueStatusVos.add(issueStatusVo);
                            List<WorkflowDepartmentVo> workflowDepartments = this.workflowDepartmentService.find(workflow.getId(), issueStatusVo.getId());
                            issueStatusVo.setWorkflowDepartmentVos(workflowDepartments);
                        }
                    }
                }
@@ -566,5 +575,4 @@
        resJsonData.put(Constants.RES_KEY_CONTENTS, issueStatusVos);
    }
}
src/main/java/kr/wisestone/owl/service/impl/WorkflowDepartmentServiceImpl.java
@@ -66,6 +66,15 @@
    }
    // 담당 부서정보를 조회한다.
    public List<WorkflowDepartmentVo> find(Long workflowId, Long issueStatusId) {
        WorkflowDepartmentCondition condition = new WorkflowDepartmentCondition();
        condition.setWorkflowId(workflowId);
        condition.setIssueStatusId(issueStatusId);
        return find(condition);
    }
    // 담당 부서정보를 조회한다.
    @Transactional(readOnly = true)
    @Override
    public List<WorkflowDepartmentVo> find(WorkflowDepartmentCondition condition) {
src/main/java/kr/wisestone/owl/service/impl/WorkflowServiceImpl.java
@@ -200,9 +200,7 @@
        for (WorkflowVo workflowVo : workflowVos) {
            Workflow workflow = this.getWorkflow(workflowVo.getId());
            WorkflowDepartmentCondition condition = new WorkflowDepartmentCondition();
            condition.setWorkflowId(workflow.getId());
            List<WorkflowDepartmentVo> workflowDepartmentVos = this.workflowDepartmentService.find(condition);
            List<WorkflowDepartmentVo> workflowDepartmentVos = this.workflowDepartmentService.find(workflow.getId(), null);
            if (workflowDepartmentVos != null && workflowDepartmentVos.size() > 0) {
                IssueStatusVo issueStatusVo = new IssueStatusVo();
                issueStatusVo.setWorkflowDepartmentVos(workflowDepartmentVos);
@@ -225,10 +223,7 @@
                case "01" : //  연관된 이슈 상태와 전이선 정보를 가져온다.
                    List<IssueStatusVo> issueStatusVos = this.issueStatusService.findByWorkflowId(workflowCondition.getId());
                    for (IssueStatusVo issueStatusVo : issueStatusVos) {
                        WorkflowDepartmentCondition condition = new WorkflowDepartmentCondition();
                        condition.setWorkflowId(workflowVo.getId());
                        condition.setIssueStatusId(issueStatusVo.getId());
                        List<WorkflowDepartmentVo> workflowDepartmentVos = this.workflowDepartmentService.find(condition);
                        List<WorkflowDepartmentVo> workflowDepartmentVos = this.workflowDepartmentService.find(workflowVo.getId(), issueStatusVo.getId());
                        issueStatusVo.setWorkflowDepartmentVos(workflowDepartmentVos);
                    }
                    workflowVo.setIssueStatusVos(issueStatusVos);
src/main/webapp/i18n/ko/global.json
@@ -251,6 +251,7 @@
        "applyTemplate": "템플릿 적용하기",
        "issueContentIsWrittenApplyTheTemplate": "이슈 내용이 작성되어 있습니다. 템플릿을 적용하겠습니까? 템플릿이 적용되면 이미 작성된 내용이 사라집니다.",
        "failedIssueStatusCheck": "이동 가능한 이슈 상태 조회 실패",
        "failedIssueStatusWorkflowDepartmentCheck": "이슈 상태 담당 부서 조회 실패",
        "failedToChangeMultipleIssueStatus": "다중 이슈 상태 변경 실패",
        "completedSavingIssueTable": "이슈 테이블 설정 저장 완료",
        "saveIssueTableSettingsInformation": "이슈 테이블 설정 정보가 저장되었습니다.",
src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -668,7 +668,8 @@
                        resolve : {
                            parameter : function () {
                                return {
                                    issueIds : [$scope.vm.viewer.id]
                                    issueIds : [$scope.vm.viewer.id],
                                    projectId : $scope.vm.viewer.projectVo.id
                                };
                            }
                        }
src/main/webapp/scripts/app/issue/issueModifyStatus.controller.js
@@ -8,25 +8,60 @@
    ],
    function (app) {
        app.controller('issueModifyStatusController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'SweetAlert', '$timeout', '$stateParams', 'parameter',
            'Issue', 'IssueStatus', '$filter',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, SweetAlert, $timeout, $stateParams, parameter, Issue, IssueStatus, $filter) {
            'Issue', 'IssueStatus', '$filter', '$injector', '$controller',
            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, SweetAlert, $timeout, $stateParams, parameter, Issue, IssueStatus, $filter, $injector, $controller) {
                //  함수 모음
                $scope.fn = {
                    cancel: cancel,    //  팝업 창 닫기
                    formSubmit: formSubmit,    //  폼 전송
                    formCheck: formCheck,  //  폼 체크
                    findNextMultiIssueStatus: findNextMultiIssueStatus  //  이동 가능한 이슈 상태를 찾는다.
                    findNextMultiIssueStatus: findNextMultiIssueStatus,  //  이동 가능한 이슈 상태를 찾는다.
                    removeDepartment : removeDepartment,     // 담당부서 삭제
                };
                //  변수 모음
                $scope.vm = {
                    issueStatusList: [],   //  변경 가능한 상태 목록
                    form: {
                        issueStatusId: "",
                        departments: [],    // 담당 부서 선택 목록
                        issueStatusId: undefined,
                        comment: ""
                    }
                    },
                    departmentName : ""
                };
                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
                // 담당부서 삭제
                function removeDepartment(index) {
                    $scope.vm.form.departments.splice(index, 1);
                }
                $scope.$watch("vm.form.issueStatusId", function (newValue) {
                    // 이슈 상태별 담당부서 표시
                    let selectIssueStatusId = $scope.vm.form.issueStatusId;
                    let issueStatusList = $scope.vm.issueStatusList;
                    $scope.vm.form.departments = [];
                    if (issueStatusList != null && $scope.vm.issueStatusList.length > 0 && selectIssueStatusId !== "") {
                        for (let i = 0; i < issueStatusList.length; i++) {
                            if (issueStatusList[i].id.toString() === selectIssueStatusId) {
                                let workflowDepartments = issueStatusList[i].workflowDepartmentVos;
                                workflowDepartments.forEach(function (workflowDepartment) {
                                    $scope.vm.form.departments.push(workflowDepartment.departmentVo);
                                });
                                break;
                            }
                        }
                        $scope.vm.issueStatusList.forEach(function (issueStatus) {
                            if (issueStatus.id === $scope.vm.form.issueStatusId) {
                            }
                        });
                    }
                });
                //  이동 가능한 이슈 상태를 찾는다.
                function findNextMultiIssueStatus() {
@@ -38,6 +73,7 @@
                        if (result.data.message.status === "success") {
                            $scope.vm.issueStatusList = result.data.data;
                        } else {
                            SweetAlert.swal($filter("translate")("issue.failedIssueStatusCheck"), result.data.message.message, "error"); // 이동 가능한 이슈 상태 조회 실패
                        }
@@ -62,7 +98,17 @@
                    var content = {
                        ids: parameter.issueIds,
                        issueStatusId: $scope.vm.form.issueStatusId,
                        comment: $scope.vm.form.comment
                        comment: $scope.vm.form.comment,
                        projectId : parameter.projectId,
                        departmentIds : (function () {
                            var departmentIds = [];
                            angular.forEach($scope.vm.form.departments, function (department) {
                                departmentIds.push(department.id);
                            });
                            return departmentIds;
                        })(),
                    };
                    Issue.modifyMultiIssueStatus($resourceProvider.getContent(content,
src/main/webapp/views/issue/issueModifyStatus.html
@@ -30,6 +30,24 @@
                </div>
            </div>
            <div class="form-group mgb5" ng-if="vm.form.issueStatusId !== undefined">
                <label class="issue-label"> <span translate="common.assigneeTeam">담당부서</span> </label>
                <js-autocomplete-multi data-input-name="departments"
                                       selected-model="vm.form.departments"
                                       search="vm.departmentName"
                                       source="fn.getUserDepartmentList(vm.departmentName, vm.form.departments)"
                                       input-disabled="false"
                                       translation-texts="{ count : 'common.userNum', empty : 'common.emptyUser' }"
                                       extra-settings="{ displayProp : 'byName' , idProp : 'id', imageable : false, maxlength : 100, autoResize : true }"></js-autocomplete-multi>
                <div class="select3-selection__choicediv mt-10">
                            <span class="select3-selection__choice" ng-repeat="department in vm.form.departments">
                                <span>{{department.byName}}</span> <!--사용자가 속해 있는 부서 이름 출력-->
                                <span class="select3-selection__choice__remove" ng-click="fn.removeDepartment($index)">×</span>
                            </span>
                </div>
            </div>
            <div class="form-group">
                <label for="issueMultiStatusModifyForm2"><span translate="common.changeReason">변경 사유</span> </label>
                <input class="form-control input-sm"