# 说明
本章主要用于 DevOps 的工作项拓展开发说明。
工作项方案的配置已在实战篇说明,本文将不在赘述工作项类型,页面,泳道等的拓展。 本章将重点阐述定制开发过程中,工作项方案以及工作流配置里前置条件、前处理以及后处理的处理程序的编写。
# 工作项流程处理类拓展
# 编写工作流以及工作项方案中使用到的可选处理类
以工作流前置条件拦截规则为例
当工作流中多处使用到相同的规则进行状态变更的判断时,可以抽离出该部分的逻辑代码,封装成通用校验方法。
如下场景,当故事类型的工作项仅希望超级管理员能执行关闭操作,其他用户不能查看到关闭按钮。
- 在代码中编写相关逻辑
如果为产品开发时,文件存放于package com.primeton.devops.pm.helper目录下
如果为定制开发时,文件通常存放于package com.primeton.devops.custom.helper目录下
前置条件校验逻辑:为true时显示流程处理按钮,为false时不显示按钮。
开发前置条件通用类,我们需要实现IWorkitemPreconditionHandler接口,重写execute方法,返回结果为布尔类型
参考代码如下
package com.primeton.devops.custom.helper;
import java.util.Map;
import org.springframework.stereotype.Component;
import com.primeton.devops.common.DataContextThreadLocal;
import com.primeton.devops.specs.api.pm.IWorkitemPreconditionHandler;
import com.primeton.devops.specs.model.pm.Workitem;
import com.primeton.devops.specs.model.pm.WorkitemHandlerConfigItem;
/**
* 仅超级管理员可以查看
*
*/
@Component
public class OnlySysadminWorkitemPreconditionHandler implements IWorkitemPreconditionHandler {
@Override
public boolean execute(Workitem workitem, WorkitemHandlerConfigItem handlerItem,
Map userPlatformParams, Map userProjectParams) throws Exception {
if ("sysadmin".equals(DataContextThreadLocal.current().getUserName())) {
return true;
}
return false;
}
}
- 在业务字典中添加前置条件字典项
选择平台管理》业务配置》业务字典
在业务字典中查询工作项前置条件,点击新建字典项
字典项代码:填入步骤一编写的全路径类名
字典项名称:前置依赖的校验内容
描述:校验的相关描述
排序:下拉框选择时的排列顺序
- 在工作流中使用编写好的校验类
选择平台管理》模板管理》工作项模板》工作流
选择需要添加前置条件的工作项流程状态,在状态流转的条件/处理设置中添加前置条件,选择处理类
选择刚刚新增的校验类,点击保存,即可完成校验添加
- 实现效果
选择使用了该工作流、工作项方案的项目,新建一个故事
超级管理员(sysadmin)预览该故事工作项,可以查看到关闭按钮。
其他用户预览该故事工作项,查看不到关闭按钮。
- 前置条件、前处理与后处理通用校验处理类扩展实现说明
前处理和后处理的处理类实现流程与前置条件一致,先实现对应接口,在对应业务字典中添加字典项,在流程中配置,具体说明如下。
前置条件
使用场景:工作项流转时,根据不同角色或校验逻辑,显示或隐藏操作按钮。
使用位置:工作流状态流转的条件/处理设置中。
实现接口:IWorkitemPreconditionHandler
业务字典:DPS_PM_WORKITEM_HANDLER_PRECONDITION
返回类型:布尔类型
前处理
使用场景:工作项新增、编辑、删除、改派或状态变更时,判断是否有权限执行对应的操作。
使用位置:工作流状态流转的条件/处理设置中,工作项方案对应操作添加规则。
实现接口:IWorkitemBeforeHandler
业务字典:DPS_PM_WORKITEM_HANDLER_BEFORE
返回类型:布尔类型
后处理
使用场景:工作项新增、编辑、删除、改派或状态变更操作完成后,执行其他完善流程的拓展操作。
使用位置:工作流状态流转的条件/处理设置中,工作项方案对应操作添加规则。
实现接口:IWorkitemAfterHandler
业务字典:DPS_PM_WORKITEM_HANDLER_AFTER
返回类型:任意类型
# groovy脚本处理类拓展
# 新建可以在groovy脚本中使用的处理类
为了可以在工作项状态流转时,实现更多的业务处理,可以通过选择'Groovy表达式判断'处理类
在Groovy脚本中通过'helper.方法名'执行WorkitemHandlerHelper以及其子类的方法
各流程中可使用的内置变量如下
前置条件:currentUser(*当前会话中的用户username)、workitem(*新建时前置条件中的workitem数据并不完整,只包含了传递给后端的数据)
前处理:currentUser、targetWorkitem(*编辑时targetWorkitem表示更新前的工作项数据)、updateWorkitem(*编辑时updateWorkitem表示更新的工作项数据)、formData(*非workitem的属性可以通过formData参数传递)
后处理:currentUser、oldWorkitem、workitem、formData (概念如上)
- 产品开发扩展方法
开发目录为com.primeton.devops.pm.helper 可以直接通过在WorkitemHandlerHelper类中添加方法实现groovy helper.的引用。
- 定制开发扩展方法
通常定制开发代码存放在custom模块,需要在pom文件中引入pm模块依赖
通过继承WorkitemHandlerHelper类扩展方法。 代码参考如下
package com.primeton.devops.custom.helper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.primeton.devops.custom.dao.CustomDao;
import com.primeton.devops.pm.helper.WorkitemHandlerHelper;
import com.primeton.devops.specs.api.pm.controller.IWorkitemController;
import com.primeton.devops.specs.model.PageResultList;
import com.primeton.devops.specs.model.pm.Workitem;
import com.primeton.devops.specs.model.pm.WorkitemQueryModel;
import com.primeton.devops.specs.model.pm.WorkitemQueryModel.Condition;
import com.primeton.devops.specs.model.pm.WorkitemType;
/**
* 定制的WorkitemHelper
*
*/
@Component
public class CustomWorkitemHandlerHelper extends WorkitemHandlerHelper {
@Autowired
private CustomDao dao;
@Autowired
private IWorkitemController workitemController;
// 需求条目工作项状态deleted-已作废状态
private static final String RQ_ITEM_WORKITEM_STATUS_DELETED = "deleted";
// 需求条目工作项状态ppCancel-取消准生产状态
private static final String RQ_ITEM_WORKITEM_STATUS_PPCANCEL = "ppCancel";
/**
* 查询业务需求下是否有可用的需求条目
* @param targetWorkitem
* @return
* @throws Exception
*/
public Boolean isContainAvailableRqItem(Workitem targetWorkitem) throws Exception {
// 需求条目类型
WorkitemType workitemType = dao.getEntityByProperty(WorkitemType.QNAME, "workitemTypeName", "rqItem");
// 拼接查询模型
WorkitemQueryModel workitemQueryModel = new WorkitemQueryModel();
// 设置父类业务需求ID
workitemQueryModel.setParentWorkitemId(targetWorkitem.getWorkitemId());
// 设置工作项类型为需求条目
workitemQueryModel.setWorkitemTypeId(workitemType.getWorkitemTypeId());
// 设置项目id
workitemQueryModel.setProjectId(targetWorkitem.getProjectId());
// 所有状态不为【已作废】或【取消准生产】
Condition condition = new Condition();
condition.setFieldName("workitemStatus");
condition.setFieldValue(RQ_ITEM_WORKITEM_STATUS_DELETED+","+RQ_ITEM_WORKITEM_STATUS_PPCANCEL);
condition.setNot(true);
condition.setOp("in");
Condition[] conditions = {condition};
workitemQueryModel.setOtherConditions(conditions);
// 获取查询结果
workitemQueryModel.setOnlyCount(true);
PageResultList<Workitem> workitems = workitemController.queryWorkitemsByQueryModel(workitemQueryModel,0,1);
if(null!=workitems && workitems.getTotal()>0){
return true;
}
return false;
}
}
- 使用场景演示
可以通过返回值非布尔类型的方法来更新参数或者调用其他方法,比如发送邮件,推送信息,更新工作项的内容。
*工作项后会在整个流程事务结束前再更新一次工作项属性,所以可以通过直接给工作项属性赋值来更新工作项。
# 工作项属性拓展
拓展工作项数据实体属性
当数据库表中工作项表增加了属性,或者数据实体想额外扩展属性时,我们需要通过EOS开发平台更新sdo数据实体,操作流程如下。(不限于工作项,其他数据实体同理)
- 选择devops-specs模块,进入com.primeton.devops.specs.model目录,选择数据》数据模型》com.primeton.devops.specs.model》pm.datasetx》Workitem。 双击Workitem,即可在右侧窗口中定位到Workitem工作项实体位置
- 在右侧窗口中双击Workitem实体,即可查看工作项的持久化实体属性,通过属性列表旁边的按钮即可添加基本属性,引用属性等,点击确定后需要在pm.datasetx窗口内再次ctrl+s保存,才能使属性生效(为了保证数据准确,不推荐执行步骤2,推荐执行步骤3)。
- 为了保证数据实体与数据库表一致,推荐使用数据库导入更新数据库表属性。在左下角的数据库视图空白处右键新建数据库连接。
- 填写数据库信息,只要保证更新的工作项表数据准确的数据库即可。
- 连接成功后可以查看对应工作项表结构,检查是否准确。
- 将workitem表拖入右侧pm.datasetx窗口中。
- 在弹出的导入数据实体窗口勾选如下选项,点击确定。
- 再次双击pm.datasetx窗口中Workitem实体,检查新增的属性是否已经存在,点击确定后要执行ctrl+s保存pm.datasetx。
- 回到左侧资源管理器中右键pm.datasetx下的workitem实体,点击创建SDO代码。
- 弹出的窗口创建SDO代码点击确定。
- 确认覆盖选择全部为是。
- 再次查看pm.datasetx窗口中的Workitem实体,双击选择描述table,确保实体类准确,如果为空时需要浏览添加同名Impl实例类,点击确认后ctrl+s保存pm.datasetx,工作项的属性更新完成。
- 可以启动服务,选择任意工作项请求,查看工作项实体中存在新建的newProperties,工作项属性扩展成功。
← 前端开发 Maven构建版本扩展 →