package com.mossle.plm.web;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import com.mossle.core.auth.CurrentUserHolder;
import com.mossle.core.mapper.BeanMapper;
import com.mossle.core.page.Page;
import com.mossle.plm.persistence.domain.PlmCategory;
import com.mossle.plm.persistence.domain.PlmComment;
import com.mossle.plm.persistence.domain.PlmConfig;
import com.mossle.plm.persistence.domain.PlmIssue;
import com.mossle.plm.persistence.domain.PlmLog;
import com.mossle.plm.persistence.domain.PlmProject;
import com.mossle.plm.persistence.domain.PlmSprint;
import com.mossle.plm.persistence.domain.PlmVersion;
import com.mossle.plm.persistence.manager.PlmCategoryManager;
import com.mossle.plm.persistence.manager.PlmCommentManager;
import com.mossle.plm.persistence.manager.PlmConfigManager;
import com.mossle.plm.persistence.manager.PlmIssueManager;
import com.mossle.plm.persistence.manager.PlmLogManager;
import com.mossle.plm.persistence.manager.PlmProjectManager;
import com.mossle.plm.persistence.manager.PlmSprintManager;
import com.mossle.plm.persistence.manager.PlmVersionManager;
import com.mossle.plm.service.PlmLogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("plm")
public class PlmController {
private static Logger logger = LoggerFactory.getLogger(PlmController.class);
private PlmProjectManager plmProjectManager;
private PlmVersionManager plmVersionManager;
private PlmIssueManager plmIssueManager;
private PlmCommentManager plmCommentManager;
private PlmCategoryManager plmCategoryManager;
private PlmLogManager plmLogManager;
private PlmSprintManager plmSprintManager;
private PlmConfigManager plmConfigManager;
private PlmLogService plmLogService;
private CurrentUserHolder currentUserHolder;
private JdbcTemplate jdbcTemplate;
private BeanMapper beanMapper = new BeanMapper();
/**
* 首页显示待办任务和未结任务.
*/
@RequestMapping("index")
public String index(Model model) throws Exception {
String userId = currentUserHolder.getUserId();
// 待办任务
List<PlmIssue> todoIssues = plmIssueManager
.find("from PlmIssue where assigneeId=? and status='active' order by createTime",
userId);
model.addAttribute("todoIssues", todoIssues);
// 发起的任务
List<PlmIssue> myIssues = plmIssueManager
.find("from PlmIssue where reporterId=? and status='active' order by createTime",
userId);
model.addAttribute("myIssues", myIssues);
// sprint
List<PlmSprint> plmSprints = plmSprintManager.find("from PlmSprint");
model.addAttribute("plmSprints", plmSprints);
return "plm/index";
}
/**
* 显示所有项目.
*/
@RequestMapping("projects")
public String projects(Model model) throws Exception {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
model.addAttribute("list", list);
List<PlmCategory> plmCategories = plmCategoryManager.getAll("priority",
true);
for (PlmCategory plmCategory : plmCategories) {
Map<String, Object> map = new HashMap<String, Object>();
list.add(map);
map.put("plmCategory", plmCategory);
String hql = "from PlmProject where plmCategory=? order by priority";
map.put("plmProjects", plmProjectManager.find(hql, plmCategory));
}
return "plm/projects";
}
/**
* 显示项目详情.
*/
@RequestMapping("project")
public String project(@RequestParam("projectId") Long projectId, Model model)
throws Exception {
PlmProject plmProject = plmProjectManager.get(projectId);
model.addAttribute("plmProject", plmProject);
List<PlmVersion> plmVersions = plmVersionManager.findBy("plmProject",
plmProject);
model.addAttribute("plmVersions", plmVersions);
String hql = "from PlmIssue where plmProject=?";
Page page = plmIssueManager.pagedQuery(hql, 1, 10, plmProject);
model.addAttribute("page", page);
return "plm/project";
}
/**
* 准备,创建任务.
*/
@RequestMapping("create")
public String create(@RequestParam("projectId") Long projectId, Model model)
throws Exception {
PlmProject plmProject = plmProjectManager.get(projectId);
model.addAttribute("plmProject", plmProject);
List<PlmVersion> plmVersions = plmVersionManager.findBy("plmProject",
plmProject);
model.addAttribute("plmVersions", plmVersions);
return "plm/create";
}
/**
* 准备,修改任务.
*/
@RequestMapping("edit")
public String edit(@RequestParam("id") Long id, Model model)
throws Exception {
PlmIssue plmIssue = plmIssueManager.get(id);
model.addAttribute("plmIssue", plmIssue);
PlmProject plmProject = plmIssue.getPlmProject();
model.addAttribute("plmProject", plmProject);
return "plm/edit";
}
/**
* 创建任务.
*/
@RequestMapping("save")
public String save(@ModelAttribute PlmIssue plmIssue,
@RequestParam("projectId") Long projectId) throws Exception {
plmIssue.setPlmProject(plmProjectManager.get(projectId));
plmIssue.setReporterId(currentUserHolder.getUserId());
plmIssue.setCreateTime(new Date());
plmIssue.setStatus("active");
plmIssueManager.save(plmIssue);
plmLogService.issueCreated(plmIssue);
return "redirect:/plm/issue.do?id=" + plmIssue.getId();
}
/**
* 修改任务.
*/
@RequestMapping("update")
public String update(@ModelAttribute PlmIssue plmIssue) throws Exception {
String userId = currentUserHolder.getUserId();
PlmIssue target = plmIssueManager.get(plmIssue.getId());
PlmIssue oldIssue = new PlmIssue();
beanMapper.copy(target, oldIssue);
beanMapper.copy(plmIssue, target);
plmIssueManager.save(target);
plmLogService.issueUpdated(oldIssue, target, userId);
return "redirect:/plm/issue.do?id=" + plmIssue.getId();
}
/**
* 任务列表.
*/
@RequestMapping("issues")
public String issues(@ModelAttribute Page page, Model model)
throws Exception {
page = plmIssueManager.pagedQuery(
"from PlmIssue order by createTime desc", page.getPageNo(),
page.getPageSize());
model.addAttribute("page", page);
return "plm/issues";
}
/**
* 任务详情.
*/
@RequestMapping("issue")
public String issue(@RequestParam("id") Long id, Model model)
throws Exception {
String userId = currentUserHolder.getUserId();
model.addAttribute("currentUserId", userId);
PlmIssue plmIssue = plmIssueManager.get(id);
model.addAttribute("plmIssue", plmIssue);
model.addAttribute("plmProject", plmIssue.getPlmProject());
List<PlmComment> plmComments = plmCommentManager.find(
"from PlmComment where plmIssue=? order by createTime desc",
plmIssue);
model.addAttribute("plmComments", plmComments);
List<PlmLog> plmLogs = plmLogManager.find(
"from PlmLog where plmIssue=? order by logTime desc", plmIssue);
model.addAttribute("plmLogs", plmLogs);
return "plm/issue";
}
/**
* 保存评论.
*/
@RequestMapping("saveComment")
public String saveComment(@RequestParam("issueId") Long issueId,
@RequestParam("content") String content) throws Exception {
PlmIssue plmIssue = plmIssueManager.get(issueId);
PlmComment plmComment = new PlmComment();
plmComment.setContent(content);
plmComment.setPlmIssue(plmIssue);
plmComment.setUserId(currentUserHolder.getUserId());
plmComment.setCreateTime(new Date());
Integer priority = jdbcTemplate.queryForObject(
"select max(priority) from PLM_COMMENT where ISSUE_ID=?",
Integer.class, plmIssue.getId());
if (priority != null) {
priority++;
} else {
priority = 1;
}
plmComment.setPriority(priority);
plmCommentManager.save(plmComment);
plmLogService.commentCreated(plmComment);
return "redirect:/plm/issue.do?id=" + plmIssue.getId();
}
/**
* 更新评论.
*/
@RequestMapping("updateComment")
public String updateComment(@RequestParam("id") Long id,
@RequestParam("content") String content) throws Exception {
PlmComment plmComment = plmCommentManager.get(id);
plmComment.setContent(content);
plmCommentManager.save(plmComment);
plmLogService.commentUpdated(plmComment);
return "redirect:/plm/issue.do?id=" + plmComment.getPlmIssue().getId();
}
/**
* 完成任务.
*/
@RequestMapping("complete")
public String complete(@RequestParam("id") Long id) throws Exception {
String userId = currentUserHolder.getUserId();
PlmIssue plmIssue = plmIssueManager.get(id);
plmIssue.setStatus("complete");
plmIssue.setCompleteTime(new Date());
plmIssueManager.save(plmIssue);
plmLogService.issueCompleted(plmIssue, userId);
return "redirect:/plm/issue.do?id=" + plmIssue.getId();
}
/**
* 重开任务.
*/
@RequestMapping("reopen")
public String reopen(@RequestParam("id") Long id) throws Exception {
String userId = currentUserHolder.getUserId();
PlmIssue plmIssue = plmIssueManager.get(id);
plmIssue.setStatus("active");
plmIssue.setCompleteTime(null);
plmIssueManager.save(plmIssue);
plmLogService.issueReopened(plmIssue, userId);
return "redirect:/plm/issue.do?id=" + plmIssue.getId();
}
/**
* 领取任务.
*/
@RequestMapping("claim")
public String claim(@RequestParam("id") Long id) throws Exception {
String userId = currentUserHolder.getUserId();
PlmIssue plmIssue = plmIssueManager.get(id);
if (plmIssue == null) {
logger.info("cannot find issue {}", id);
return "redirect:/plm/issue.do?id=" + id;
}
plmIssue.setAssigneeId(currentUserHolder.getUserId());
plmIssueManager.save(plmIssue);
plmLogService.issueClaimed(plmIssue, userId);
return "redirect:/plm/issue.do?id=" + plmIssue.getId();
}
/**
* 分配任务.
*/
@RequestMapping("assign")
public String assign(@RequestParam("id") Long id,
@RequestParam("userId") String userId) throws Exception {
PlmIssue plmIssue = plmIssueManager.get(id);
PlmIssue oldIssue = new PlmIssue();
beanMapper.copy(plmIssue, oldIssue);
plmIssue.setAssigneeId(userId);
plmIssueManager.save(plmIssue);
plmLogService.issueAssigned(oldIssue, plmIssue,
currentUserHolder.getUserId());
return "redirect:/plm/issue.do?id=" + plmIssue.getId();
}
/**
* 显示所有迭代.
*/
@RequestMapping("sprints")
public String sprint(Model model) throws Exception {
List<PlmSprint> plmSprints = plmSprintManager.getAll();
model.addAttribute("plmSprints", plmSprints);
return "plm/sprints";
}
/**
* 显示迭代详情.
*/
@RequestMapping("sprint")
public String sprint(@RequestParam("sprintId") Long sprintId, Model model)
throws Exception {
PlmSprint plmSprint = plmSprintManager.get(sprintId);
model.addAttribute("plmSprint", plmSprint);
List<PlmSprint> plmSprints = plmSprintManager.findBy("plmProject",
plmSprint.getPlmProject());
List<PlmSprint> plmSprintTargets = new ArrayList<PlmSprint>();
for (PlmSprint plmSprintTarget : plmSprints) {
if (plmSprintTarget.getId().equals(sprintId)) {
continue;
}
plmSprintTargets.add(plmSprintTarget);
}
model.addAttribute("plmSprints", plmSprintTargets);
String hql = "from PlmIssue where plmSprint=?";
Page page = plmIssueManager.pagedQuery(hql, 1, 100, plmSprint);
model.addAttribute("page", page);
return "plm/sprint";
}
/**
* 新建迭代.
*/
@RequestMapping("sprint-input")
public String sprintInput(
@RequestParam(value = "id", required = false) Long id, Model model)
throws Exception {
if (id != null) {
PlmSprint plmSprint = plmSprintManager.get(id);
model.addAttribute("model", plmSprint);
}
List<PlmProject> plmProjects = plmProjectManager.getAll();
model.addAttribute("plmProjects", plmProjects);
List<PlmConfig> plmConfigs = plmConfigManager.getAll();
model.addAttribute("plmConfigs", plmConfigs);
return "plm/sprint-input";
}
/**
* 新建迭代.
*/
@RequestMapping("sprint-save")
public String sprintSave(@ModelAttribute PlmSprint plmSprint,
@RequestParam("configId") Long configId,
@RequestParam("projectId") Long projectId) {
PlmSprint dest = null;
Long id = plmSprint.getId();
if (id != null) {
dest = plmSprintManager.get(id);
beanMapper.copy(plmSprint, dest);
} else {
dest = plmSprint;
dest.setStatus("active");
}
dest.setPlmConfig(plmConfigManager.get(configId));
dest.setPlmProject(plmProjectManager.get(projectId));
plmSprintManager.save(dest);
return "redirect:/plm/sprints.do";
}
/**
* 批量修改任务的迭代.
*/
@RequestMapping("sprint-change")
public String sprintChange(@RequestParam("sprintId") Long sprintId,
@RequestParam("targetSprintId") Long targetSprintId,
@RequestParam("issueIds") List<Long> issueIds) {
PlmSprint plmSprint = plmSprintManager.get(targetSprintId);
for (Long issueId : issueIds) {
PlmIssue plmIssue = plmIssueManager.get(issueId);
plmIssue.setPlmSprint(plmSprint);
plmIssueManager.save(plmIssue);
}
return "redirect:/plm/sprint.do?sprintId=" + sprintId;
}
@Resource
public void setPlmProjectManager(PlmProjectManager plmProjectManager) {
this.plmProjectManager = plmProjectManager;
}
@Resource
public void setPlmVersionManager(PlmVersionManager plmVersionManager) {
this.plmVersionManager = plmVersionManager;
}
@Resource
public void setPlmIssueManager(PlmIssueManager plmIssueManager) {
this.plmIssueManager = plmIssueManager;
}
@Resource
public void setPlmCommentManager(PlmCommentManager plmCommentManager) {
this.plmCommentManager = plmCommentManager;
}
@Resource
public void setPlmCategoryManager(PlmCategoryManager plmCategoryManager) {
this.plmCategoryManager = plmCategoryManager;
}
@Resource
public void setPlmLogManager(PlmLogManager plmLogManager) {
this.plmLogManager = plmLogManager;
}
@Resource
public void setPlmSprintManager(PlmSprintManager plmSprintManager) {
this.plmSprintManager = plmSprintManager;
}
@Resource
public void setPlmConfigManager(PlmConfigManager plmConfigManager) {
this.plmConfigManager = plmConfigManager;
}
@Resource
public void setPlmLogService(PlmLogService plmLogService) {
this.plmLogService = plmLogService;
}
@Resource
public void setCurrentUserHolder(CurrentUserHolder currentUserHolder) {
this.currentUserHolder = currentUserHolder;
}
@Resource
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}