src/main/java/kr/wisestone/owl/domain/User.java
@@ -36,6 +36,7 @@ private SocialType socialType; private Long lastWorkspaceId; private Long lastProjectId; private Long lastIssueTypeId; private Date lastLoginDate; private String reservationNotifyTime; // 이메일 알림 시간 예정 private String language; @@ -162,6 +163,14 @@ this.lastProjectId = lastProjectId; } public Long getLastIssueTypeId() { return lastIssueTypeId; } public void setLastIssueTypeId(Long lastIssueTypeId) { this.lastIssueTypeId = lastIssueTypeId; } public String getAwsKey() { return awsKey; } src/main/java/kr/wisestone/owl/service/UserService.java
@@ -50,6 +50,8 @@ void updateLastProject(Map<String, Object> resJsonData, UserForm userForm); void updateLastIssueType(Map<String, Object> resJsonData, UserForm userForm); void updateLastMyWorkspace(User user); void findProjectMember(Map<String, Object> resJsonData, UserCondition userCondition); src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java
@@ -173,6 +173,7 @@ condition.setPage(pageable.getPageNumber() * pageable.getPageSize()); condition.setPageSize(pageable.getPageSize()); condition.setWorkspaceId(this.userService.getUser(this.webAppUtil.getLoginId()).getLastWorkspaceId()); List<Map<String, Object>> results = this.issueTypeMapper.find(condition); Long totalCount = this.issueTypeMapper.count(condition); int totalPage = (int) Math.ceil((totalCount - 1) / pageable.getPageSize()) + 1; src/main/java/kr/wisestone/owl/service/impl/UserServiceImpl.java
@@ -1064,6 +1064,30 @@ resJsonData.put(Constants.RES_KEY_CONTENTS, userVo); } // 마지막으로 선택한 이슈 타입 정보를 저장한다. @Override @Transactional public void updateLastIssueType(Map<String, Object> resJsonData, UserForm userForm) { User user = this.getUser(this.webAppUtil.getLoginId()); if (userForm.getLastIssueTypeId() != null) { user.setLastIssueTypeId(userForm.getLastIssueTypeId()); } this.userRepository.saveAndFlush(user); // 세션 업데이트 SecurityUtils.setUserToSession(user); // 클라이언트의 사용자 정보 업데이트 UserVo userVo = ConvertUtil.copyProperties(user, UserVo.class, "password"); if (user.getSocialType() != null) { userVo.setSocialType(user.getSocialType().toString()); } userVo.setAccount(CommonUtil.decryptAES128(userVo.getAccount())); resJsonData.put(Constants.RES_KEY_CONTENTS, userVo); } // 특정 아이디에 해당하는 사용자 목록을 가져온다. @Override @Transactional(readOnly = true) src/main/java/kr/wisestone/owl/vo/UserVo.java
@@ -20,6 +20,7 @@ private String socialType; private Long lastWorkspaceId; private Long lastProjectId; private Long lastIssueTypeId; private Long departmentId; private Boolean userSocialLogin = Boolean.FALSE; private List<ProjectVo> projectVos = Lists.newArrayList(); @@ -191,6 +192,14 @@ this.sessionActiveTime = sessionActiveTime; } public Long getLastIssueTypeId() { return lastIssueTypeId; } public void setLastIssueTypeId(Long lastIssueTypeId) { this.lastIssueTypeId = lastIssueTypeId; } public Long getLastProjectId() { return lastProjectId; } src/main/java/kr/wisestone/owl/web/condition/IssueTypeCondition.java
@@ -1,8 +1,10 @@ package kr.wisestone.owl.web.condition; import com.google.common.collect.Lists; import kr.wisestone.owl.util.ConvertUtil; import kr.wisestone.owl.util.MapUtil; import java.util.List; import java.util.Map; /** @@ -24,6 +26,8 @@ private String startDate; private String endDate; private List<Long> projectIds = Lists.newArrayList(); public IssueTypeCondition(){} @@ -138,4 +142,12 @@ public void setEndDate(String endDate) { this.endDate = endDate; } public List<Long> getProjectIds() { return projectIds; } public void setProjectIds(List<Long> projectIds) { this.projectIds = projectIds; } } src/main/java/kr/wisestone/owl/web/controller/UserController.java
@@ -181,6 +181,19 @@ return this.setSuccessMessage(resJsonData); } // 사용자의 마지막 접근 이슈 유형 정보 업데이트 @RequestMapping(value = "/user/updateLastIssueType", method = RequestMethod.POST) public @ResponseBody Map<String, Object> updateLastIssueType(@RequestBody Map<String, Map<String, Object>> params) { Map<String, Object> resJsonData = new HashMap<>(); this.userService.updateLastIssueType(resJsonData, UserForm.make(params.get(Constants.REQ_KEY_CONTENT))); return this.setSuccessMessage(resJsonData); } // 프로젝트에 참여하는 일반 사용자 목록 조회 @RequestMapping(value = "/user/findProjectMember", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) public src/main/java/kr/wisestone/owl/web/form/UserForm.java
@@ -23,6 +23,7 @@ private String socialType; private Long lastWorkspaceId; private Long lastProjectId; private Long lastIssueTypeId; private String reservationNotifyTime; private String language; private String licensekey; @@ -177,4 +178,12 @@ public void setLicensekey(String licensekey) { this.licensekey = licensekey; } public Long getLastIssueTypeId() { return lastIssueTypeId; } public void setLastIssueTypeId(Long lastIssueTypeId) { this.lastIssueTypeId = lastIssueTypeId; } } src/main/resources/migration/V1_9__Alter_Table.sql
@@ -24,6 +24,7 @@ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ALTER TABLE `user` ADD COLUMN `last_project_id` bigint(20) NULL DEFAULT '0'; ALTER TABLE `user` ADD COLUMN `last_issue_type_id` bigint(20) NULL DEFAULT '0'; ALTER TABLE `user` ADD COLUMN `last_login_date` TIMESTAMP NULL; ALTER TABLE `issue` ADD COLUMN `workflow_status_id` bigint(20) NULL DEFAULT NULL; src/main/webapp/scripts/app/common/common.controller.js
@@ -22,7 +22,8 @@ sendMessage: sendMessage, moveMenu : moveMenu, findIssueList : findIssueList, // 사이드바 이슈 목록 가져오기 changeIssueListMenu : changeIssueListMenu changeIssueListMenu : changeIssueListMenu, setLastIssueType : setLastIssueType }; $scope.vm = { @@ -48,6 +49,19 @@ findAllWorkproject(); }); function setLastIssueType() { if (User != null) { User.updateLastIssueType($resourceProvider.getContent( {lastIssueTypeId: $rootScope.getCurrentIssueTypeId()}, $resourceProvider.getPageContent(0, 0))).then(function (result) { if (result.data.message.status === "success") { } }); } } function changeIssueListMenu(issueTypeId) { $rootScope.issueTypeMenu = null; for (var issueType of $rootScope.workIssueTypes) { @@ -56,6 +70,7 @@ break; } } // sidebar 클릭시 프로젝트 아이디 설정 $rootScope.changeLastProject($rootScope.issueTypeMenu.projectVo.id); @@ -64,6 +79,11 @@ } $rootScope.$broadcast("changeIssueListMenu", $rootScope.issueTypeMenu); if ($rootScope.user.lastIssueTypeId !== issueTypeId) { $scope.fn.setLastIssueType(issueTypeId); } } function moveMenu(stateName) { @@ -222,12 +242,28 @@ useProject : true, deep : "01" // 이슈 유형에 연결된 워크플로우 정보를 찾는다. } IssueType.find($resourceProvider.getContent(conditions, $resourceProvider.getPageContent(0, 100))).then(function (result) { if (result.data.message.status === "success") { $rootScope.workIssueTypes = result.data.data; if ($rootScope.workIssueTypes != null && $rootScope.workIssueTypes.length > 0) { $rootScope.workIssueTypes.forEach(function (issueType) { var selectIssueTypeId = null; if (issueType.id === $rootScope.user.lastIssueTypeId) { selectIssueTypeId = issueType.id; $scope.fn.changeIssueListMenu(issueType.id); } if (selectIssueTypeId == null) { $scope.fn.changeIssueListMenu($rootScope.workIssueTypes[0].id); } }); } else { $state.go('dashboards.dashboard'); } } else { SweetAlert.error($filter("translate")("managementType.failedToIssueTypeList"), result.data.message.message); // "이슈 유형 목록 조회 실패" @@ -250,6 +286,7 @@ if (result.data.message.status === "success") { $rootScope.user = result.data.data; $rootScope.setCurrentIssueTypeId() $state.go($state.current, {}, {reload: true}); if ($state.current.name === "dashboards.dashboard") { src/main/webapp/scripts/components/user/user.service.js
@@ -40,6 +40,12 @@ return response; }); }, updateLastIssueType : function (conditions) { return $http.post("user/updateLastIssueType", conditions).then(function (response) { $log.debug("사용자가 마지막으로 선택한 이슈 유형 : ", response); return response; }); }, find : function (conditions) { return $http.post("user/find", conditions).then(function (response) { $log.debug("사용자 목록 데이터 : ", response);