package com.xinwei.process.controller;

import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.annotation.Resource; import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import com.xinwei.process.constant.ChangeConstants;
import com.xinwei.process.constant.ChangeConstants.ServiceType;
import com.xinwei.process.entity.ApprovalResult;
import com.xinwei.process.entity.CommonBiz;
import com.xinwei.process.entity.Project;
import com.xinwei.process.entity.StateInfo;
import com.xinwei.process.service.CommitteeApprovalService;
import com.xinwei.process.service.CommonBizService;
import com.xinwei.process.service.DepartleaderApprovalService;
import com.xinwei.process.service.ProcessService;
import com.xinwei.process.service.ProjectService;
import com.xinwei.process.service.UserTaskService;
import com.xinwei.security.entity.User;
import com.xinwei.security.vo.ResultVO;
import com.xinwei.util.JsonUtil; /**
* 项目变更控制器
*
*/
@Controller
@RequestMapping("/changeproject")
public class ChangeProjectController extends BaseController {//
@Resource
private ProjectService projectService;
@Resource
private ProcessService processServiceImpl;// 流程相关服务
@Resource
private CommonBizService commonBizService;// 变更服务
@Resource
private ProjectService projectServiceImpl;// 项目相关服务
@Resource
private DepartleaderApprovalService departleaderApprovalServiceImpl;// 部门领导审批相关服务
@Resource
private CommitteeApprovalService committeeApprovalServiceImpl;// 决策委员会审批相关服务
@Resource
private UserTaskService userTaskServiceImpl;// 用户任务相关服务 @Value("${committee}")
private String committee;// 决策委员会人员ID
@Value("${departLeader}")
private String departLeader;// 部门经理ID private Logger logger = LoggerFactory
.getLogger(ChangeProjectController.class); /**
* 保存变更(包括修改后保存)
*
* @param CommonBiz
* @return
*/
@RequestMapping(value = "/createChange", method = { RequestMethod.GET,
RequestMethod.POST })
public @ResponseBody String postChangeRequest(CommonBiz commonBiz) {
ResultVO<Object> result = new ResultVO<>();
String changeCurrentState = "";
// 根据project获取项目经理ID,仅仅该项目经理能够提取变更;
Project project = projectService.selectByPrimaryKey(commonBiz
.getProjectId());
User user = getCurrentUser();
logger.debug(user.getId() + "manager:" + project.getProjectManagerId());
if (user.getId().longValue() != project.getProjectManagerId()
.longValue()) {
// 构造没有权限提出变更申请
result.setResult(ChangeConstants.ErrorCode.NOT_AUTHORITY_CHANGE);
return result.toString();
} if (!StringUtils.isBlank(changeCurrentState)
&& !changeCurrentState
.equals(ChangeConstants.State.CODE_ENDEVENT)) {
// 判断project表格中状态,如果状态不是"申请变更",不允许提交;
result.setResult(ChangeConstants.ErrorCode.STATUS_NOT_ALLOW_CHANGE);
return result.toString();
} else {
// 新增
if (isNewChange(project)) {
createNewChange(commonBiz, project);
} else {// 修改
modifyChange(commonBiz, project);
} // 响应客户端
result.setOthers("dataId", commonBiz.getDataId());
return result.toString();
}
} /**
*
* @param commonBiz
* @param project
* @return
*/
protected int createNewChange(CommonBiz commonBiz, Project project) {
// CommonBiz更新这里连得创建者,创建时间,设置状态,更改人,更改时间
User user = getCurrentUser();
commonBiz.setCreatePerson(user.getId().toString());
commonBiz.setCreateTime(Calendar.getInstance().getTime());
commonBiz.setUpdatePerson(user.getUsername());
commonBiz.setUpdateTime(Calendar.getInstance().getTime());
commonBiz
.setStatus(ChangeConstants.State.CODE_COMMITTEE_APPROVALCHANGE);
commonBiz.setServiceType(ServiceType.TYPE_XMBIANGENG);
// 保存变更
String dataId = commonBizService.save(commonBiz); Map<String, Object> variables = new HashMap<String, Object>(); // 指定项目经理
variables.put("projectManager", project.getProjectManagerId()
.toString());
// 指定决策委员会
variables.put("committee", committee);
// 指定部门经理
variables.put("departLeader", departLeader); variables.put(ChangeConstants.ActivitiContextKey.ChangeServiceID,
commonBiz.getDataId());
// 创建一个流程,并启动该流程实例(在启动流程实例时,将当前CommonBiz的ID作为businessKey),将流程实例ID保存到CommonBiz;
ProcessInstance processInstance = processServiceImpl.startProcess(
ChangeConstants.getProcessKey(project.getCategoryId()), project
.getProjectId().toString(),
commonBiz.getCreatePerson(), variables); // 设置CommonBiz对象的流程实例ID
commonBiz.setProcessInstanceId(processInstance.getId());
commonBizService.update(commonBiz); // 设置主项目表中的变更流程的状态
List<Task> currentTask = userTaskServiceImpl
.findActiveTaskByProcessInstanceId(processInstance.getId());
String state = userTaskServiceImpl
.getStateByTaskDefinitionKey(currentTask.get(0)
.getTaskDefinitionKey());
// 修改project表中: 项目更改数据ID&变更流程实例ID&变更的流程当前状态信息
projectServiceImpl.updateProjectChangeByProjectId(dataId,
processInstance.getId(), project
.makeChangeCurrentStateFromStatusInfo(state,
currentTask.get(0).getId(), currentTask.get(0)
.getName()), commonBiz.getProjectId());
return 0;
} /**
*
* @param commonBiz
* @param project
* @return
*/
protected int modifyChange(CommonBiz commonBiz, Project project) {
// CommonBiz更新这里连得创建者,设置状态,更改人,更改时间
User user = getCurrentUser();
commonBiz.setUpdatePerson(user.getUsername());
commonBiz.setUpdateTime(Calendar.getInstance().getTime()); // 更新之前设置流程变量
CommonBiz oldEntity = commonBizService.selectByPrimaryKey(commonBiz
.getDataId()); // 获取老的任务,获取结果
List<Task> currentTask = userTaskServiceImpl
.findActiveTaskByProcessInstanceId(commonBiz
.getProcessInstanceId());
// 获取task对象
Task task = currentTask.get(0); // 更新流程实例
commonBizService.updateProcessInstanceAndTaskIdByDataId(
oldEntity.getProcessInstanceId(), task.getId(),
commonBiz.getDataId()); // 设置主项目表中的CurrentChangeStatus的状态
updateProjectCurrentChangeStatus(commonBiz, project,
ProjectService.CHANGEPREVIOUSSTATE); // 获取评审结论
String stringResult = commonBiz.getResult(); ApprovalResult approvalResult = JsonUtil.fromJson(stringResult,
ApprovalResult.class); Map<String, Object> variables = new HashMap<String, Object>();
variables.put(task.getTaskDefinitionKey()
+ ChangeConstants.ActivitiContextKey.result,
approvalResult.getResult()); userTaskServiceImpl.completeTask(task.getId(), variables); // 流程结束
if ("cancel".endsWith(approvalResult.getResult())) {// endChangeProcess
// 构建StateInfo对象
StateInfo endProcessStateInfo = new StateInfo();
endProcessStateInfo.setState(ChangeConstants.State.CODE_ENDEVENT);
endProcessStateInfo.setStateName(ChangeConstants.State.ENDEVENT);
endProcessStateInfo.setTaskId("");
// 更改流程当前任务状态信息
String endStatus = JsonUtil.toJson(endProcessStateInfo);
String status = endStatus;
String changeCurrentState = endStatus; commonBizService.updateChangeStatusByDataId(status,
commonBiz.getDataId());
projectServiceImpl.updateProjectPropertyByProjectId(
ProjectService.CHANGECURRENTSTATE, changeCurrentState,
commonBiz.getProjectId());
return 0;
} else {// 重新来一圈
updateProjectCurrentChangeStatus(commonBiz, project,
ProjectService.CHANGECURRENTSTATE);
} return 0;
} private void updateProjectCurrentChangeStatus(CommonBiz commonBiz,
Project project, String changeProperty) {
List<Task> currentTask;
currentTask = userTaskServiceImpl
.findActiveTaskByProcessInstanceId(commonBiz
.getProcessInstanceId()); String state = userTaskServiceImpl
.getStateByTaskDefinitionKey(currentTask.get(0)
.getTaskDefinitionKey()); commonBizService.updateChangeStatusByDataId(project
.makeChangeCurrentStateFromStatusInfo(state, currentTask.get(0)
.getId(), state), commonBiz.getDataId()); projectServiceImpl.updateProjectPropertyByProjectId(changeProperty,
project.makeChangeCurrentStateFromStatusInfo(state, currentTask
.get(0).getId(), currentTask.get(0).getName()),
commonBiz.getProjectId());
} protected boolean isNewChange(Project project) {
if (StringUtils.isBlank(project.getChangeCurrentStateFromStatusInfo())
|| project.getChangeCurrentStateFromStatusInfo()
.compareToIgnoreCase(
ChangeConstants.State.CODE_STARTEVENT) == 0
|| project.getChangeCurrentStateFromStatusInfo()
.compareToIgnoreCase(
ChangeConstants.State.CODE_ENDEVENT) == 0)
return true;
return false;
} /**
* 决策委员会审批变更 B001 、部门经理审批变更 B002
*
* @param id
*/
@RequestMapping(value = "/approvalChange", method = { RequestMethod.GET,
RequestMethod.POST })
public @ResponseBody String approvalChange(CommonBiz commonBiz) {
ResultVO<Object> result = new ResultVO<>();
// 设置项目更改流程先前状态信息
Task perTask = updateChangeStatusInfo(commonBiz,
ProjectService.CHANGEPREVIOUSSTATE); // 设置部门经理审批变更流程变量
Map<String, Object> variables = new HashMap<String, Object>();
// 获取评审结论
String stringResult = commonBiz.getResult(); ApprovalResult approvalResult = JsonUtil.fromJson(stringResult,
ApprovalResult.class);
variables.put(perTask.getTaskDefinitionKey()
+ ChangeConstants.ActivitiContextKey.result,
approvalResult.getResult()); userTaskServiceImpl.completeTask(perTask.getId(), variables); // 设置项目更改流程当前状态信息
Task currTask = updateChangeStatusInfo(commonBiz,
ProjectService.CHANGECURRENTSTATE);
String perstate = "";
if (currTask != null) {
perstate = userTaskServiceImpl.getStateByTaskDefinitionKey(perTask
.getTaskDefinitionKey());
String currstate = userTaskServiceImpl
.getStateByTaskDefinitionKey(currTask
.getTaskDefinitionKey());
// 决策委员会或者部门经理
logger.debug("审批变更状态:" + perstate + "-->" + currstate); } else {
logger.debug("流程结束:" + "Status:endChangeProcess");
} return result.toString();
} private Task updateChangeStatusInfo(CommonBiz commonBiz, String porperty) {
Task task = null;
try {
// 设置主项目表中的变更流程的状态
List<Task> currentTask = userTaskServiceImpl
.findActiveTaskByProcessInstanceId(commonBiz
.getProcessInstanceId());
// 获取项目对象
Project project = projectService.selectByPrimaryKey(commonBiz
.getProjectId()); String status = "";
String changeCurrentState = "";
String defKey = "";
if (currentTask.size() == 0) {
logger.debug("当前任务列表为空,无法更新状态信息!"); // 构建StateInfo对象
StateInfo endProcessStateInfo = new StateInfo();
endProcessStateInfo
.setState(ChangeConstants.State.CODE_ENDEVENT);
endProcessStateInfo
.setStateName(ChangeConstants.State.ENDEVENT);
endProcessStateInfo.setTaskId("");
// 更改流程当前任务状态信息
String endStatus = JsonUtil.toJson(endProcessStateInfo);
status = endStatus;
changeCurrentState = endStatus; } else {
// 获取task对象
task = currentTask.get(0);
defKey = userTaskServiceImpl
.getStateByTaskDefinitionKey(currentTask.get(0)
.getTaskDefinitionKey());
status = project.makeChangeCurrentStateFromStatusInfo(defKey,
currentTask.get(0).getId(), defKey);
}
commonBizService.updateChangeStatusByDataId(status,
commonBiz.getDataId());
projectServiceImpl.updateProjectPropertyByProjectId(porperty,
status, commonBiz.getProjectId());
} catch (Exception e) {
e.printStackTrace();
}
return task;
} /**
* 根据projectId查询CommonBiz对象
*
* @param projectId
* 项目ID
* @return
*/
@RequestMapping(value = "/getCommonBizByProjectId", method = {
RequestMethod.GET, RequestMethod.POST })
public @ResponseBody String getCommonBizByProjectId(Long projectId) {
ResultVO<Project> resultVO = new ResultVO<Project>();
try {
CommonBiz commonBiz = commonBizService
.getCommonBizByProjectId(projectId);
resultVO.setOthers("commonBiz", commonBiz);
} catch (Exception e) {
resultVO.setResult(resultVO.FAILURE);
e.printStackTrace();
}
return resultVO.toString();
}
}

activiti 项目变更控制器的更多相关文章

  1. Eclipse构建Activiti项目,类导入提示功能不能使用

    Eclipse新建一个新的Activiti项目(Activiti项目默认使用Maven管理项目),接着配置好pom.xml添加需要的jar包依赖,引入依赖之后发现在测试类中没有提示导入所需要的包的选项 ...

  2. PHP获取项目所有控制器方法名称

    PHP获取项目所有控制器方法名称 //获取模块下所有的控制器和方法写入到权限表 public function initperm() { $modules = array('admin'); //模块 ...

  3. 启动Activiti项目报错:org.activiti.engine.ActivitiObjectNotFoundException: no deployed process definition found with id '22501'

    背景 启动activiti项目时,出现错误org.activiti.engine.ActivitiObjectNotFoundException: no deployed process defini ...

  4. 创建Activiti项目

    1.创建项目 2.导入Activiti的jar包 项目上右击创建lib文件夹 将jar包复制进lib文件夹 3.导入数据库连接jar包 4.使用代码创建Activiti用来存放流程数据的23张表 pa ...

  5. ASP.NET MVC3 Areas 分离项目 同名控制器(同名Controller) 演示demo

    为什么需要分离? 我们知道MVC项目各部分职责比较清晰,相比较ASP.NET Webform而言,MVC项目的业务逻辑和页面展现较好地分离开来,这样的做法有许多优点,比如可测试,易扩展等等.但是在实际 ...

  6. 使用eclipse和maven创建activiti项目基础配置

    项目组最近的项目使用到了activiti工作流,到处查找了一些资料后,初步完成任务.但是我所做的事只是在搭好的环境中调用接口和方法操作,因此自己尝试着也从搭建环境入手,以下是成功实现以后的记录. 实现 ...

  7. VS2017 MVC项目,新建控制器提示未能加载文件或程序集“Dapper.Contrib解决方法

    VS2017中MVC项目中,右键新建控制器时,提示 未能加载文件或程序集“Dapper.Contrib, Version=1.50.0.0, Culture=neutral, PublicKeyTok ...

  8. 1027代码审计平台 2-sonarscanner项目变更

    修改version,可以获得新版本的解析数据,与以往结果比对,获取bug.漏洞.代码不规范.覆盖率等变化,重点关注新增的bug及问题分布 version参数修改 1.对sonar-project.pr ...

  9. activiti_change_ok

    package com.xinwei.process.controller; import java.util.Calendar; import java.util.HashMap; import j ...

随机推荐

  1. RabbitMQ消息可靠性

    那些情况会失败 网络问题有很多原因出发失败.防火墙也可能会中断Idle连接,网络失败不是很快确定的. 硬件和软件也会导致系统崩溃.客户端软件保持运行,而逻辑错误也可能会导致channel和connec ...

  2. Verilog HDL语言实现的单周期CPU设计(全部代码及其注释)

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  3. iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...

  4. 关于lis的方案数

    求lis的时候呢,我想n^2的做法是很简单的,二分的话除了最长不上升或最长不下降子序列不好求之外(毕竟要注意细节)于是从中发现了,求lis真正的序列也是十分不好求出的尤其是字典序最大的不上升序列了,什 ...

  5. iOS如何接收服务端返回的布尔值

    if ([user[@"chat"] boolValue]) { userModel.chat = ; }else { userModel.chat = ; } 关键是要调用boo ...

  6. 转:ActiveMQ的作用总结(应用场景及优势)

    原文地址: ActiveMQ的作用总结(应用场景及优势) 业务场景说明: 消息队列在大型电子商务类网站,如京东.淘宝.去哪儿等网站有着深入的应用, 队列的主要作用是消除高并发访问高峰,加快网站的响应速 ...

  7. LeetCode 811 Subdomain Visit Count 解题报告

    题目要求 A website domain like "discuss.leetcode.com" consists of various subdomains. At the t ...

  8. Appium入门(3)__ Appium Server安装

    安装Appium 1.下载并安装:https://bitbucket.org/appium/appium.app/downloads/ 2. 系统变量PATH 增加 C:\Program Files ...

  9. AT3611 Tree MST 点分治+最小生成树

    正解:点分治+最小生成树 解题报告: 传送门! 然后这题麻油翻译,,,所以这边的建议是先说下题意呢亲 所以题意大概就是说,给一棵n个节点的树,树上每个点都有个权值,然后构造一个完全图,(u,v)之间连 ...

  10. runtime实现weak属性

    我们可以自己创建一个 A 类,然后在“宿主对象”和“值对象”建立 weak 关系的时候,偷偷地创建一个 A 类的实例 a,绑定在 “值对象” 上. 当“值对象”销毁后,这个 a 也会被销毁.而 A 类 ...