1. package com.xinwei.process.controller;
  2.  
  3. import java.util.Calendar;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import javax.annotation.Resource;
  9.  
  10. import org.activiti.engine.runtime.ProcessInstance;
  11. import org.activiti.engine.task.Task;
  12. import org.apache.commons.lang.StringUtils;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.stereotype.Controller;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.RequestMethod;
  19. import org.springframework.web.bind.annotation.ResponseBody;
  20.  
  21. import com.xinwei.process.constant.ChangeConstants;
  22. import com.xinwei.process.constant.ChangeConstants.ServiceType;
  23. import com.xinwei.process.entity.ApprovalResult;
  24. import com.xinwei.process.entity.CommonBiz;
  25. import com.xinwei.process.entity.Project;
  26. import com.xinwei.process.entity.StateInfo;
  27. import com.xinwei.process.service.CommitteeApprovalService;
  28. import com.xinwei.process.service.CommonBizService;
  29. import com.xinwei.process.service.DepartleaderApprovalService;
  30. import com.xinwei.process.service.ProcessService;
  31. import com.xinwei.process.service.ProjectService;
  32. import com.xinwei.process.service.UserTaskService;
  33. import com.xinwei.security.entity.User;
  34. import com.xinwei.security.vo.ResultVO;
  35. import com.xinwei.util.JsonUtil;
  36.  
  37. /**
  38. * 项目变更控制器
  39. *
  40. */
  41. @Controller
  42. @RequestMapping("/changeproject")
  43. public class ChangeProjectController extends BaseController {//
  44. @Resource
  45. private ProjectService projectService;
  46. @Resource
  47. private ProcessService processServiceImpl;// 流程相关服务
  48. @Resource
  49. private CommonBizService commonBizService;// 变更服务
  50. @Resource
  51. private ProjectService projectServiceImpl;// 项目相关服务
  52. @Resource
  53. private DepartleaderApprovalService departleaderApprovalServiceImpl;// 部门领导审批相关服务
  54. @Resource
  55. private CommitteeApprovalService committeeApprovalServiceImpl;// 决策委员会审批相关服务
  56. @Resource
  57. private UserTaskService userTaskServiceImpl;// 用户任务相关服务
  58.  
  59. @Value("${committee}")
  60. private String committee;// 决策委员会人员ID
  61. @Value("${departLeader}")
  62. private String departLeader;// 部门经理ID
  63.  
  64. private Logger logger = LoggerFactory
  65. .getLogger(ChangeProjectController.class);
  66.  
  67. /**
  68. * 保存变更(包括修改后保存)
  69. *
  70. * @param CommonBiz
  71. * @return
  72. */
  73. @RequestMapping(value = "/createChange", method = { RequestMethod.GET,
  74. RequestMethod.POST })
  75. public @ResponseBody String postChangeRequest(CommonBiz commonBiz) {
  76. ResultVO<Object> result = new ResultVO<>();
  77. String changeCurrentState = "";
  78. // 根据project获取项目经理ID,仅仅该项目经理能够提取变更;
  79. Project project = projectService.selectByPrimaryKey(commonBiz
  80. .getProjectId());
  81. User user = getCurrentUser();
  82. logger.debug(user.getId() + "manager:" + project.getProjectManagerId());
  83. if (user.getId().longValue() != project.getProjectManagerId()
  84. .longValue()) {
  85. // 构造没有权限提出变更申请
  86. result.setResult(ChangeConstants.ErrorCode.NOT_AUTHORITY_CHANGE);
  87. return result.toString();
  88. }
  89.  
  90. if (!StringUtils.isBlank(changeCurrentState)
  91. && !changeCurrentState
  92. .equals(ChangeConstants.State.CODE_ENDEVENT)) {
  93. // 判断project表格中状态,如果状态不是"申请变更",不允许提交;
  94. result.setResult(ChangeConstants.ErrorCode.STATUS_NOT_ALLOW_CHANGE);
  95. return result.toString();
  96. } else {
  97. // 新增
  98. if (isNewChange(project)) {
  99. createNewChange(commonBiz, project);
  100. } else {// 修改
  101. modifyChange(commonBiz, project);
  102. }
  103.  
  104. // 响应客户端
  105. result.setOthers("dataId", commonBiz.getDataId());
  106. return result.toString();
  107. }
  108. }
  109.  
  110. /**
  111. *
  112. * @param commonBiz
  113. * @param project
  114. * @return
  115. */
  116. protected int createNewChange(CommonBiz commonBiz, Project project) {
  117. // CommonBiz更新这里连得创建者,创建时间,设置状态,更改人,更改时间
  118. User user = getCurrentUser();
  119. commonBiz.setCreatePerson(user.getId().toString());
  120. commonBiz.setCreateTime(Calendar.getInstance().getTime());
  121. commonBiz.setUpdatePerson(user.getUsername());
  122. commonBiz.setUpdateTime(Calendar.getInstance().getTime());
  123. commonBiz
  124. .setStatus(ChangeConstants.State.CODE_COMMITTEE_APPROVALCHANGE);
  125. commonBiz.setServiceType(ServiceType.TYPE_XMBIANGENG);
  126. // 保存变更
  127. String dataId = commonBizService.save(commonBiz);
  128.  
  129. Map<String, Object> variables = new HashMap<String, Object>();
  130.  
  131. // 指定项目经理
  132. variables.put("projectManager", project.getProjectManagerId()
  133. .toString());
  134. // 指定决策委员会
  135. variables.put("committee", committee);
  136. // 指定部门经理
  137. variables.put("departLeader", departLeader);
  138.  
  139. variables.put(ChangeConstants.ActivitiContextKey.ChangeServiceID,
  140. commonBiz.getDataId());
  141. // 创建一个流程,并启动该流程实例(在启动流程实例时,将当前CommonBiz的ID作为businessKey),将流程实例ID保存到CommonBiz;
  142. ProcessInstance processInstance = processServiceImpl.startProcess(
  143. ChangeConstants.getProcessKey(project.getCategoryId()), project
  144. .getProjectId().toString(),
  145. commonBiz.getCreatePerson(), variables);
  146.  
  147. // 设置CommonBiz对象的流程实例ID
  148. commonBiz.setProcessInstanceId(processInstance.getId());
  149. commonBizService.update(commonBiz);
  150.  
  151. // 设置主项目表中的变更流程的状态
  152. List<Task> currentTask = userTaskServiceImpl
  153. .findActiveTaskByProcessInstanceId(processInstance.getId());
  154. String state = userTaskServiceImpl
  155. .getStateByTaskDefinitionKey(currentTask.get(0)
  156. .getTaskDefinitionKey());
  157. // 修改project表中: 项目更改数据ID&变更流程实例ID&变更的流程当前状态信息
  158. projectServiceImpl.updateProjectChangeByProjectId(dataId,
  159. processInstance.getId(), project
  160. .makeChangeCurrentStateFromStatusInfo(state,
  161. currentTask.get(0).getId(), currentTask.get(0)
  162. .getName()), commonBiz.getProjectId());
  163. return 0;
  164. }
  165.  
  166. /**
  167. *
  168. * @param commonBiz
  169. * @param project
  170. * @return
  171. */
  172. protected int modifyChange(CommonBiz commonBiz, Project project) {
  173. // CommonBiz更新这里连得创建者,设置状态,更改人,更改时间
  174. User user = getCurrentUser();
  175. commonBiz.setUpdatePerson(user.getUsername());
  176. commonBiz.setUpdateTime(Calendar.getInstance().getTime());
  177.  
  178. // 更新之前设置流程变量
  179. CommonBiz oldEntity = commonBizService.selectByPrimaryKey(commonBiz
  180. .getDataId());
  181.  
  182. // 获取老的任务,获取结果
  183. List<Task> currentTask = userTaskServiceImpl
  184. .findActiveTaskByProcessInstanceId(commonBiz
  185. .getProcessInstanceId());
  186. // 获取task对象
  187. Task task = currentTask.get(0);
  188.  
  189. // 更新流程实例
  190. commonBizService.updateProcessInstanceAndTaskIdByDataId(
  191. oldEntity.getProcessInstanceId(), task.getId(),
  192. commonBiz.getDataId());
  193.  
  194. // 设置主项目表中的CurrentChangeStatus的状态
  195. updateProjectCurrentChangeStatus(commonBiz, project,
  196. ProjectService.CHANGEPREVIOUSSTATE);
  197.  
  198. // 获取评审结论
  199. String stringResult = commonBiz.getResult();
  200.  
  201. ApprovalResult approvalResult = JsonUtil.fromJson(stringResult,
  202. ApprovalResult.class);
  203.  
  204. Map<String, Object> variables = new HashMap<String, Object>();
  205. variables.put(task.getTaskDefinitionKey()
  206. + ChangeConstants.ActivitiContextKey.result,
  207. approvalResult.getResult());
  208.  
  209. userTaskServiceImpl.completeTask(task.getId(), variables);
  210.  
  211. // 流程结束
  212. if ("cancel".endsWith(approvalResult.getResult())) {// endChangeProcess
  213. // 构建StateInfo对象
  214. StateInfo endProcessStateInfo = new StateInfo();
  215. endProcessStateInfo.setState(ChangeConstants.State.CODE_ENDEVENT);
  216. endProcessStateInfo.setStateName(ChangeConstants.State.ENDEVENT);
  217. endProcessStateInfo.setTaskId("");
  218. // 更改流程当前任务状态信息
  219. String endStatus = JsonUtil.toJson(endProcessStateInfo);
  220. String status = endStatus;
  221. String changeCurrentState = endStatus;
  222.  
  223. commonBizService.updateChangeStatusByDataId(status,
  224. commonBiz.getDataId());
  225. projectServiceImpl.updateProjectPropertyByProjectId(
  226. ProjectService.CHANGECURRENTSTATE, changeCurrentState,
  227. commonBiz.getProjectId());
  228. return 0;
  229. } else {// 重新来一圈
  230. //更新状态
  231. updateProjectCurrentChangeStatus(commonBiz, project,
  232. ProjectService.CHANGECURRENTSTATE);
  233. }
  234. return 0;
  235. }
  236.  
  237. private void updateProjectCurrentChangeStatus(CommonBiz commonBiz,
  238. Project project, String changeProperty) {
  239. List<Task> currentTask;
  240. currentTask = userTaskServiceImpl
  241. .findActiveTaskByProcessInstanceId(commonBiz
  242. .getProcessInstanceId());
  243.  
  244. String state = userTaskServiceImpl
  245. .getStateByTaskDefinitionKey(currentTask.get(0)
  246. .getTaskDefinitionKey());
  247.  
  248. commonBizService.updateChangeStatusByDataId(project
  249. .makeChangeCurrentStateFromStatusInfo(state, currentTask.get(0)
  250. .getId(), currentTask.get(0).getName()), commonBiz.getDataId());
  251.  
  252. projectServiceImpl.updateProjectPropertyByProjectId(changeProperty,
  253. project.makeChangeCurrentStateFromStatusInfo(state, currentTask
  254. .get(0).getId(), currentTask.get(0).getName()),
  255. commonBiz.getProjectId());
  256. }
  257.  
  258. protected boolean isNewChange(Project project) {
  259. if (StringUtils.isBlank(project.getChangeCurrentStateFromStatusInfo())
  260. || project.getChangeCurrentStateFromStatusInfo()
  261. .compareToIgnoreCase(
  262. ChangeConstants.State.CODE_STARTEVENT) == 0
  263. || project.getChangeCurrentStateFromStatusInfo()
  264. .compareToIgnoreCase(
  265. ChangeConstants.State.CODE_ENDEVENT) == 0)
  266. return true;
  267. return false;
  268. }
  269.  
  270. /**
  271. * 决策委员会审批变更 B001 、部门经理审批变更 B002
  272. *
  273. * @param id
  274. */
  275. @RequestMapping(value = "/approvalChange", method = { RequestMethod.GET,
  276. RequestMethod.POST })
  277. public @ResponseBody String approvalChange(CommonBiz commonBiz) {
  278. ResultVO<Object> result = new ResultVO<>();
  279. // 设置项目更改流程先前状态信息
  280. Task perTask = updateChangeStatusInfo(commonBiz,
  281. ProjectService.CHANGEPREVIOUSSTATE);
  282.  
  283. // 设置部门经理审批变更流程变量
  284. Map<String, Object> variables = new HashMap<String, Object>();
  285. // 获取评审结论
  286. String stringResult = commonBiz.getResult();
  287.  
  288. ApprovalResult approvalResult = JsonUtil.fromJson(stringResult,
  289. ApprovalResult.class);
  290. variables.put(perTask.getTaskDefinitionKey()
  291. + ChangeConstants.ActivitiContextKey.result,
  292. approvalResult.getResult());
  293.  
  294. userTaskServiceImpl.completeTask(perTask.getId(), variables);
  295.  
  296. // 设置项目更改流程当前状态信息
  297. Task currTask = updateChangeStatusInfo(commonBiz,
  298. ProjectService.CHANGECURRENTSTATE);
  299. String perstate = "";
  300. if (currTask != null) {
  301. perstate = userTaskServiceImpl.getStateByTaskDefinitionKey(perTask
  302. .getTaskDefinitionKey());
  303. String currstate = userTaskServiceImpl
  304. .getStateByTaskDefinitionKey(currTask
  305. .getTaskDefinitionKey());
  306.  
  307. //决策委员会或者部门经理
  308. logger.debug("审批变更状态:" + perstate + "-->" + currstate);
  309.  
  310. } else {
  311. logger.debug("流程结束:" + "Status:endChangeProcess");
  312. }
  313.  
  314. return result.toString();
  315. }
  316.  
  317. private Task updateChangeStatusInfo(CommonBiz commonBiz, String porperty) {
  318. Task task = null;
  319. try {
  320. // 设置主项目表中的变更流程的状态
  321. List<Task> currentTask = userTaskServiceImpl
  322. .findActiveTaskByProcessInstanceId(commonBiz
  323. .getProcessInstanceId());
  324. // 获取项目对象
  325. Project project = projectService.selectByPrimaryKey(commonBiz
  326. .getProjectId());
  327.  
  328. String status = "";
  329. String changeCurrentState = "";
  330. String defKey = "";
  331. if (currentTask.size() == 0) {
  332. logger.debug("当前任务列表为空,无法更新状态信息!");
  333.  
  334. // 构建StateInfo对象
  335. StateInfo endProcessStateInfo = new StateInfo();
  336. endProcessStateInfo
  337. .setState(ChangeConstants.State.CODE_ENDEVENT);
  338. endProcessStateInfo
  339. .setStateName(ChangeConstants.State.ENDEVENT);
  340. endProcessStateInfo.setTaskId("");
  341. // 更改流程当前任务状态信息
  342. String endStatus = JsonUtil.toJson(endProcessStateInfo);
  343. status = endStatus;
  344. changeCurrentState = endStatus;
  345.  
  346. } else {
  347. // 获取task对象
  348. task = currentTask.get(0);
  349. defKey = userTaskServiceImpl
  350. .getStateByTaskDefinitionKey(currentTask.get(0)
  351. .getTaskDefinitionKey());
  352. status = project.makeChangeCurrentStateFromStatusInfo(defKey,
  353. currentTask.get(0).getId(), currentTask.get(0).getName());
  354. }
  355. commonBizService.updateChangeStatusByDataId(status,
  356. commonBiz.getDataId());
  357. projectServiceImpl.updateProjectPropertyByProjectId(porperty,
  358. status, commonBiz.getProjectId());
  359. } catch (Exception e) {
  360. e.printStackTrace();
  361. }
  362. return task;
  363. }
  364.  
  365. /**
  366. * 根据projectId查询CommonBiz对象
  367. *
  368. * @param projectId
  369. * 项目ID
  370. * @return
  371. */
  372. @RequestMapping(value = "/getCommonBizByProjectId", method = {
  373. RequestMethod.GET, RequestMethod.POST })
  374. public @ResponseBody String getCommonBizByProjectId(Long projectId) {
  375. ResultVO<Project> resultVO = new ResultVO<Project>();
  376. try {
  377. CommonBiz commonBiz = commonBizService
  378. .getCommonBizByProjectId(projectId);
  379. resultVO.setOthers("commonBiz", commonBiz);
  380. } catch (Exception e) {
  381. resultVO.setResult(resultVO.FAILURE);
  382. e.printStackTrace();
  383. }
  384. return resultVO.toString();
  385. }
  386. }

activiti_change_ok的更多相关文章

随机推荐

  1. [knowledge] netmap

    900MHz的单核处理10GB的包收/发. netmap has been implemented in FreeBSD and Linux and Gbit/s network adapters. ...

  2. Visio 画图

    流程图 圆角矩形表示"开始"与"结束" 矩形表示行动方案.普通工作环节用 菱形表示问题判断或判定(审核/审批/评审)环节 平行四边形表示输入输出 箭头代表工作流 ...

  3. SpringMVC 的使用映射路径 <mvc:resources >

    以下是测试结果,可能存在纰漏,暂记录一下. 使用springMVC时,一般将DispatcherServlet请求映射配置为"/",则Spring MVC将捕获Web容器所有的请求 ...

  4. kafka后台启动的命令

    kafka如果直接启动会出现问题,就是信息会打印在控制台,就会出现在控制台. 然后关闭窗口,kafka随之关闭,然后启动以下的命令就可以实现. ./kafka-server-start.sh ../c ...

  5. 解决双系统(Window10+Ubuntu16.10)下ubuntu安装git时提示软件包git没有可安装候选问题

    选择升级系统: sudo apt-get update 升级之后再输入: sudo apt-get install git 可成功安装.

  6. 20165336 2017-2018-2 《Java程序设计》第8周学习总结

    20165336 2017-2018-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十二章 1.程序:一段静态的代码.进程:程序的一次动态执行过程,它对应了从代码加载.执行至 ...

  7. Webpack傻瓜式指南(转)

    add by zhj: 作者写了三篇文章,这是第一篇幅,另外两篇参见 https://zhuanlan.zhihu.com/p/20397902 https://zhuanlan.zhihu.com/ ...

  8. JavaScript、关于元素的offset~和client~

    1.偏移量(offset dimension)   =>offsetLeft(元素距离其父元素左边框(/上边框)的距离) =>offsetTop =>offsetWidth(元素的宽 ...

  9. SOCKS5 协议解析

    代理 根据 HTTP 1.1 的定义,proxy 是: An intermediary program which acts as both a server and a client for the ...

  10. sql server 复制、镜像常见故障处理

    sql server2008数据库复制实现数据同步常见问题 操作使用的一些技巧(事务复制类型): 1.如何修改一个已经发布的表的属性? 将发布所有订阅删除,(发布不用删除),就可以在发布属性的项目中取 ...