package org.java.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.IdentityService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.apache.logging.log4j.core.helpers.UUIDUtil;
import org.java.dao.PurOrderMapper;
import org.java.service.PurOrderService;
import org.java.util.ResourcesUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 采购业务实现类
*
* @author Administrator
*
*/
@Service
public class PurOrderServiceImpl implements PurOrderService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private PurOrderMapper purOrderMapper;
@Autowired
private TaskService taskService;
@Autowired
private IdentityService identityService;
/**
* 创建采购单 是完成的任务: 1、启动一个流程实例 2、向业务表中 添加一条业务数据(并且在业务表与工作流的表之间建立关联 )
*/
public void createPurOrder(Map<String, Object> m) {
// 获得要启动的流程定义的 key
String processDefinitionKey = ResourcesUtil.getValue("diagram/process",
"definitionProcessKey");
// 通过uuid,产生一个随机字符串,作为工作流的businessKey(业务字段),用于与业务表关联。同时,它也是业务表的主键
String businessKey = UUIDUtil.getTimeBasedUUID().toString();
//设置任务的发起人
String userId = (String) m.get("userId");
identityService.setAuthenticatedUserId(userId);
// 启动流程实列
ProcessInstance instance = runtimeService.startProcessInstanceByKey(
processDefinitionKey, businessKey);
// (#{id},#{name},#{price},#{content},#{createtime},#{status},#{userid},#{processinstanceid},#{endtime})
/*************************** 向业务表中添加数据 **************************************************/
// 向map中,存放需要的数据
m.put("id", businessKey);
m.put("createtime", new Date());
m.put("processinstanceid", instance.getProcessInstanceId());
purOrderMapper.createPurOrder(m);
System.out.println("创建成功");
}
/**
* 查询当前用户的任务列表
*/
public List<Map<String, Object>> queryTaskList(String userId) {
// 创建查询接口
TaskQuery query = taskService.createTaskQuery();
// 指定查询哪一个业务流程的任务--------------processDefintionKey
// String processDefinitionKey =
// ResourcesUtil.getValue("diagram/process","definitionProcessKey");
// query.processDefinitionKey(processDefinitionKey);
// 指定查询哪一个用户负责的任务
query.taskAssignee(userId);
// 查询-----查询的结果中,只包含工作流的数据,不包含任何业务数据
List<Task> taskList = query.orderByTaskId().asc().list();
// 创建集合,用于包含工作流的信息以及对应的业务数据
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 对所有的task循 环,分别取得每 一个task对应的业务数据
for (Task t : taskList) {
// 通过任务task,查询出当前任务对应的流程实例
ProcessInstance instance = runtimeService
.createProcessInstanceQuery()
.processInstanceId(t.getProcessInstanceId()).singleResult();
// 得到流程实例的businessKey,也就是业务表的主键,通过它查询业务表
String businessKey = instance.getBusinessKey();
// 根据businessKey查询业务表
Map<String, Object> m = purOrderMapper
.queryPurOrderByBusinessKey(businessKey);
// 把Task的一些相关信息,封装到map返回
m.put("taskId", t.getId());// 任务ID
m.put("taskName", t.getName());// 任务名称
m.put("processDefintionId", t.getProcessInstanceId());// 流程实例id
m.put("startTime", t.getCreateTime());// 任务开始时间
m.put("assignee", t.getAssignee());// 任务负责人
m.put("defKey", t.getTaskDefinitionKey());// 任务标识,用于标识当前任务,执行到了哪一个阶段
list.add(m);
}
return list;
}
/**
* 返回所有正在运行的流程实例,包含业务数据
*/
public List<Map<String, Object>> showProcessInstance() {
// 创建流程实例查询接口
ProcessInstanceQuery query = runtimeService
.createProcessInstanceQuery();
// 查询所有正在运行的流程实例
List<ProcessInstance> instancelist = query.list();
// 创建集合,用于包含工作流的信息以及对应的业务数据
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (ProcessInstance instance : instancelist) {
// 根据业务主键,查询对应的业务数据
// 得到流程实例的businessKey,也就是业务表的主键,通过它查询业务表
String businessKey = instance.getBusinessKey();
// 根据businessKey查询业务表
Map<String, Object> m = purOrderMapper
.queryPurOrderByBusinessKey(businessKey);
// 把流程实例的相关信息,封装到map中
m.put("processInstanceId", instance.getProcessInstanceId());// 实例ID
m.put("processDefinitionId", instance.getProcessDefinitionId());// 定义ID
m.put("activityId", instance.getActivityId());// 活动节点Id,运行到哪一个阶段
m.put("businessKey", instance.getBusinessKey());// 业务主键
list.add(m);
}
return list;
}
/**
* 查询采购单 详情,用于审核
*/
public Map<String, Object> purOrderAudit(String purOrderId) {
return purOrderMapper.queryPurOrderById(purOrderId);
}
/**
* 提交审核意见
*/
public void submitAudit(Map<String, Object> m) {
// 生成审核单的id
String id = UUIDUtil.getTimeBasedUUID().toString();
m.put("id", id);// 审核单的id
m.put("createtime", new Date());
purOrderMapper.submitAudit(m);
/*******************************************************************/
String auditType = (String) m.get("auditType");
String status = (String) m.get("status");
Map<String,Object> variables = new HashMap<String, Object>();
// variables.put(auditType,status);
if(auditType.equals("firstAudit")){
variables.put("firstAudit",status);
}
if(auditType.equals("secondAudit")){
variables.put("secondAudit",status);
}
if(auditType.equals("thirdAudit")){
variables.put("thirdAudit",status);
}
// 获得任务Id
String taskId = (String) m.get("taskId");
// 完成任务
taskService.complete(taskId,variables);
}
/**
* 提交采购单,同时,设置流程变量
*/
public void submitPurOrder(String taskId) {
// 通过taskId获得对应的业务数据
TaskQuery query = taskService.createTaskQuery();
// 查询出指定的任务
Task task = query.taskId(taskId).singleResult();
// 获得任务对应的流程实例,通过流程实例,获得业务主键businessKey
ProcessInstance instance = runtimeService.createProcessInstanceQuery()
.processInstanceId(task.getProcessInstanceId()).singleResult();
//获得业务主键
String businessKey = instance.getBusinessKey();
//根据业务主键,查询业务数据
Map<String,Object> variables = purOrderMapper.queryPurOrderByBusinessKey(businessKey);
//提交采购单,同时设置流程变量
taskService.complete(taskId, variables);
System.out.println("采购单已提交");
}
/**
* 查询可拾取任务列表
*/
public List<Map<String, Object>> queryClaimTaskList(String userId) {
TaskQuery query = taskService.createTaskQuery();
query.taskCandidateUser(userId);//设置候选人
List<Task> taskList = query.list();
// 创建集合,用于包含工作流的信息以及对应的业务数据
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 对所有的task循 环,分别取得每 一个task对应的业务数据
for (Task t : taskList) {
// 通过任务task,查询出当前任务对应的流程实例
ProcessInstance instance = runtimeService
.createProcessInstanceQuery()
.processInstanceId(t.getProcessInstanceId()).singleResult();
// 得到流程实例的businessKey,也就是业务表的主键,通过它查询业务表
String businessKey = instance.getBusinessKey();
// 根据businessKey
**基于Activiti的采购审批流程详解** 在信息技术领域,工作流管理系统被广泛应用于自动化和优化组织内部的各种业务流程。Activiti是一款开源的工作流引擎,它提供了强大的流程定义、执行和监控能力,尤其适合构建复杂的审批流程。本示例将重点介绍如何使用Activiti实现一个采购审批流程。 我们要理解什么是Activiti。Activiti是由Alfresco公司开发的一个基于Java的BPMN 2.0规范的工作流引擎,它可以处理各种业务流程模型,包括采购审批这样的企业内部流程。BPMN(Business Process Modeling Notation)是一种国际标准,用于绘制和描述业务流程图,使得非技术人员也能理解流程的逻辑。 在"基于Activiti的采购审批流程"中,我们首先需要设计采购审批的流程图。这通常涉及到以下步骤:采购申请提交、部门经理审批、财务部门审核、最高领导批准,以及最后的采购执行。每个步骤都可以通过Activiti中的用户任务(User Task)来表示,同时可以设置相应的条件流转规则,如部门经理审批通过后才能进入财务部门审核等。 接下来,我们需要创建数据表结构来存储流程实例、任务实例、历史任务等信息。Activiti提供了一套默认的数据表,但也可以根据项目需求进行定制。这些表将记录流程实例的生命周期,包括启动、暂停、继续、结束等状态,以及每个任务的执行者、完成时间等信息。 在代码实现部分,我们将利用Activiti提供的API进行流程的启动、查询、干预和结束操作。例如,当采购员提交申请时,代码会启动一个新的流程实例;当审批人完成任务时,代码会更新任务状态并可能触发下一步的流转。此外,还可以通过监听器(Listener)或服务任务(Service Task)来实现自定义的业务逻辑,比如发送审批邮件通知。 工具类在本示例中扮演了重要的角色,它们通常是为简化与Activiti交互而编写的辅助类。例如,可能会有专门用来获取当前任务的工具类,或者用于启动和结束流程实例的工具类。这些工具类可以使代码更加模块化,提高可读性和复用性。 在注释方面,清晰的注释是保证其他开发者能够快速理解和维护代码的关键。每个类、方法和变量都应该有明确的注释,解释其功能和使用场景。对于初学者来说,这将极大地帮助他们理解和学习Activiti的使用。 压缩包中的"工作流"文件可能包含了所有上述组件,包括流程定义文件(.bpmn)、Java源代码、数据库脚本、配置文件等。使用者可以通过导入这些资源到开发环境中,直接运行示例,观察和学习采购审批流程的运作过程。 基于Activiti的采购审批流程示例是一个实用的学习资源,它涵盖了流程设计、数据存储、代码实现和注释等多个方面,可以帮助开发者快速掌握Activiti在实际业务中的应用。通过深入研究和实践,我们可以更好地理解和运用工作流技术,提升企业的业务流程管理效率。


















































































































- 1
- 2
- 3
- 4
- 5
- 6
- 8

- 粉丝: 7
- 资源: 17
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- TenuxOS_uTOS-Puertea_1741167668.zip
- 家政服务小程序V2.8.58开源+前端.zip
- net_1741167351.zip
- 物联网家居_MQTT_学习Demo_微信小程序_1741167001.zip
- 互联网技术_网页端可视化操作系统_PHP_HTML_1741167337.zip
- 智能家居_远程控制_温湿度监测_System_1741167104.zip
- Fankekeke_smart_home_cos_1741167643.zip
- 智能家居_米家风格_mpvue_iview_zanui_学习_1741166987.zip
- 智能家居_STM32_毕业设计_控制显示交互安防代码_1741167393.zip
- aseveny_SmartBluetoothLamp_1741167662.zip
- 智能家居_智能控制器_安卓端_家居自动化_1741167122.zip
- 智能家居_虚拟传感器_Nodejs_Vue3_数据应用_1741167467.zip
- 物联网平台_设备集成管理解决方案_1741167286.zip
- al-one_hass-xiaomi-miot_1741166869.zip
- 智能家居_QML_设备管理_交互界面_1741167245.zip
- 智能家居_开源方案_LEHome_室内定位与控制_1741166904.zip



- 1
- 2
前往页