package com.sobey.cmop.mvc.web.audit;
import java.util.Map;
import javax.servlet.ServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.sobey.cmop.mvc.comm.BaseController;
import com.sobey.cmop.mvc.constant.AccountConstant;
import com.sobey.cmop.mvc.constant.AuditConstant;
import com.sobey.cmop.mvc.entity.Audit;
import com.sobey.cmop.mvc.entity.AuditFlow;
import com.sobey.cmop.mvc.entity.ServiceTag;
import com.sobey.framework.utils.Servlets;
/**
* ResourcesAuditController负责资源变更Resources审批的管理
*
* @author liukai
*
*/
@Controller
@RequestMapping(value = "/audit")
public class ResourcesAuditController extends BaseController {
private static final String REDIRECT_SUCCESS_URL = "redirect:/audit/resources/";
/**
* 显示所有的serviceTag list
*/
@RequestMapping(value = "resources")
public String list(@RequestParam(value = "page", defaultValue = "1") int pageNumber,
@RequestParam(value = "page.size", defaultValue = PAGE_SIZE) int pageSize, Model model,
ServletRequest request) {
Map<String, Object> searchParams = Servlets.getParametersStartingWith(request, REQUEST_PREFIX);
model.addAttribute("page", comm.auditService.getAuditResourcesPageable(searchParams, pageNumber, pageSize));
// 将搜索条件编码成字符串,分页的URL
model.addAttribute("searchParams", Servlets.encodeParameterStringWithPrefix(searchParams, REQUEST_PREFIX));
return "audit/resource/auditResourcesList";
}
/**
* 邮件里面执行审批操作(服务标签serviceTag)
*
* @param serviceTagId
* 服务标签ID
* @param userId
* 审批人ID
* @param result
* 审批结果
* @param opinion
* 审批意见
* @param model
* @return
*/
@RequestMapping(value = "resources/auditOk")
public String auditOk(@RequestParam(value = "serviceTagId") Integer serviceTagId,
@RequestParam(value = "userId") Integer userId, @RequestParam(value = "result") String result,
@RequestParam(value = "opinion", required = false, defaultValue = "") String opinion, Model model) {
String message;
if (comm.auditService.isAudited(comm.serviceTagService.getServiceTag(serviceTagId), userId)) { // 该服务申请已审批过.
message = "你已审批";
} else {
// 获得指定serviceTag当前审批记录
Audit audit = this.getCurrentResourcesAudit(userId, serviceTagId);
audit.setResult(result);
audit.setOpinion(opinion);
boolean flag = comm.auditService.saveAuditToResources(audit, serviceTagId, userId);
message = flag ? "审批操作成功" : "审批操作失败,请稍后重试";
}
model.addAttribute("message", message);
return "audit/auditOk";
}
/**
* 跳转到Resources审批页面.
*
* <pre>
* 通过userId来区分页面或邮件进入.
* 页面进来userId为0,这个时候取当前UserId.
* 邮件进来的UserId就不为0.
* </pre>
*
* @param serviceTagId
* 服务标签ID
* @param userId
* 审批人ID
* @param result
* 审批结果
* @param view
* 审批列表进入的是1.为null表示从邮件进入的.
* @param auditId
* auditId.
* @param model
* @return
*/
@RequestMapping(value = "/resources/{id}", method = RequestMethod.GET)
public String resources(@PathVariable("id") Integer serviceTagId,
@RequestParam(value = "userId", required = false, defaultValue = "0") Integer userId,
@RequestParam(value = "result", required = false, defaultValue = "") String result,
@RequestParam(value = "auditId", required = false, defaultValue = "0") Integer auditId,
@RequestParam(value = "view", required = false) Integer view, Model model) {
String returnUrl = "";
ServiceTag serviceTag = comm.serviceTagService.getServiceTag(serviceTagId);
if (view == null && comm.auditService.isAudited(serviceTag, userId)) { // 判断该服务申请已审批过.
model.addAttribute("message", "你已审批");
returnUrl = "audit/auditOk";
} else {
model.addAttribute("result", result);
model.addAttribute("view", view);
model.addAttribute("userId", AccountConstant.FROM_PAGE_USER_ID.equals(userId) ? getCurrentUserId() : userId);
model.addAttribute("serviceTag", serviceTag);
model.addAttribute("resourcesList",
comm.resourcesService.getCommitedResourcesListByServiceTagId(serviceTagId));
model.addAttribute("audits", comm.auditService.getAuditListByServiceTagId(serviceTagId));
model.addAttribute("changes",
comm.changeHistoryService.getChangeHistoryListByAudit(comm.auditService.getAudit(auditId)));
returnUrl = "audit/resource/auditResourcesForm";
}
return returnUrl;
}
/**
* 审批
*
* @param serviceTagId
* 服务标签ID
* @param userId
* 审批人Id
* @param result
* 审批结果
* @param opinion
* 审批内容
* @param redirectAttributes
* @return
*/
@RequestMapping(value = "/resources/{serviceTagId}", method = RequestMethod.POST)
public String saveApply(@PathVariable(value = "serviceTagId") Integer serviceTagId,
@RequestParam(value = "userId") Integer userId, @RequestParam(value = "result") String result,
@RequestParam(value = "opinion", defaultValue = "") String opinion, RedirectAttributes redirectAttributes) {
// 获得指定apply当前审批记录
Audit audit = this.getCurrentResourcesAudit(userId, serviceTagId);
audit.setOpinion(opinion);
audit.setResult(result);
boolean flag = comm.auditService.saveAuditToResources(audit, serviceTagId, userId);
String message = flag ? "审批操作成功" : "审批操作失败,请稍后重试";
redirectAttributes.addFlashAttribute("message", message);
return REDIRECT_SUCCESS_URL;
}
/**
* 获得指定serviceTag当前审批记录
*
* <pre>
* 根据serviceTagId,auditFlow获得状态为"待审批"的audit.
* 此audit为申请人或上级审批人进行操作时,插入下级审批人的audit中的临时数据.
* </pre>
*
* @param userId
* 审批人Id
* @param serviceTagId
* 标签Id
* @return
*/
private Audit getCurrentResourcesAudit(Integer userId, Integer serviceTagId) {
Integer flowType = AuditConstant.FlowType.资源申请_变更的审批流程.toInteger();
AuditFlow auditFlow = comm.auditService.findAuditFlowByUserIdAndFlowType(userId, flowType);
Integer status = AuditConstant.AuditStatus.待审批.toInteger();
return comm.auditService.findAuditByServiceTagIdAndStatusAndAuditFlow(serviceTagId, status, auditFlow);
}
}