# 说明

本章主要用于 DevOps 的工作项拓展开发说明。

工作项方案的配置已在实战篇说明,本文将不在赘述工作项类型,页面,泳道等的拓展。 本章将重点阐述定制开发过程中,工作项方案以及工作流配置里前置条件、前处理以及后处理的处理程序的编写。


# 工作项流程处理类拓展

# 编写工作流以及工作项方案中使用到的可选处理类

以工作流前置条件拦截规则为例

当工作流中多处使用到相同的规则进行状态变更的判断时,可以抽离出该部分的逻辑代码,封装成通用校验方法。
如下场景,当故事类型的工作项仅希望超级管理员能执行关闭操作,其他用户不能查看到关闭按钮。

  1. 在代码中编写相关逻辑

如果为产品开发时,文件存放于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;
    }
}
  1. 在业务字典中添加前置条件字典项

选择平台管理》业务配置》业务字典

在业务字典中查询工作项前置条件,点击新建字典项

字典项代码:填入步骤一编写的全路径类名
字典项名称:前置依赖的校验内容
描述:校验的相关描述
排序:下拉框选择时的排列顺序

create-workitem-handler-precondition-dict

  1. 在工作流中使用编写好的校验类

选择平台管理》模板管理》工作项模板》工作流

选择需要添加前置条件的工作项流程状态,在状态流转的条件/处理设置中添加前置条件,选择处理类

create-workitem-handler-precondition-config

选择刚刚新增的校验类,点击保存,即可完成校验添加

create-workitem-handler-precondition-config2

  1. 实现效果

选择使用了该工作流、工作项方案的项目,新建一个故事

超级管理员(sysadmin)预览该故事工作项,可以查看到关闭按钮。

create-workitem-handler-precondition-sysadmin

其他用户预览该故事工作项,查看不到关闭按钮。

create-workitem-handler-precondition-other

  1. 前置条件、前处理与后处理通用校验处理类扩展实现说明

前处理和后处理的处理类实现流程与前置条件一致,先实现对应接口,在对应业务字典中添加字典项,在流程中配置,具体说明如下。

前置条件

使用场景:工作项流转时,根据不同角色或校验逻辑,显示或隐藏操作按钮。
使用位置:工作流状态流转的条件/处理设置中。
实现接口:IWorkitemPreconditionHandler
业务字典:DPS_PM_WORKITEM_HANDLER_PRECONDITION
返回类型:布尔类型

前处理

使用场景:工作项新增、编辑、删除、改派或状态变更时,判断是否有权限执行对应的操作。
使用位置:工作流状态流转的条件/处理设置中,工作项方案对应操作添加规则。
实现接口:IWorkitemBeforeHandler
业务字典:DPS_PM_WORKITEM_HANDLER_BEFORE
返回类型:布尔类型

后处理

使用场景:工作项新增、编辑、删除、改派或状态变更操作完成后,执行其他完善流程的拓展操作。
使用位置:工作流状态流转的条件/处理设置中,工作项方案对应操作添加规则。
实现接口:IWorkitemAfterHandler
业务字典:DPS_PM_WORKITEM_HANDLER_AFTER
返回类型:任意类型


# groovy脚本处理类拓展

# 新建可以在groovy脚本中使用的处理类

为了可以在工作项状态流转时,实现更多的业务处理,可以通过选择'Groovy表达式判断'处理类

在Groovy脚本中通过'helper.方法名'执行WorkitemHandlerHelper以及其子类的方法 groovy-handler

各流程中可使用的内置变量如下

前置条件:currentUser(*当前会话中的用户username)、workitem(*新建时前置条件中的workitem数据并不完整,只包含了传递给后端的数据)
前处理:currentUser、targetWorkitem(*编辑时targetWorkitem表示更新前的工作项数据)、updateWorkitem(*编辑时updateWorkitem表示更新的工作项数据)、formData(*非workitem的属性可以通过formData参数传递)
后处理:currentUser、oldWorkitem、workitem、formData (概念如上)

  1. 产品开发扩展方法

开发目录为com.primeton.devops.pm.helper 可以直接通过在WorkitemHandlerHelper类中添加方法实现groovy helper.的引用。

groovy-workitem-handler-helper

  1. 定制开发扩展方法

通常定制开发代码存放在custom模块,需要在pom文件中引入pm模块依赖 pm-dependency

通过继承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;
	}
}

groovy-workitem-handler-helper-custom

  1. 使用场景演示

可以通过返回值非布尔类型的方法来更新参数或者调用其他方法,比如发送邮件,推送信息,更新工作项的内容。

*工作项后会在整个流程事务结束前再更新一次工作项属性,所以可以通过直接给工作项属性赋值来更新工作项。

groovy-handler2


# 工作项属性拓展

拓展工作项数据实体属性

当数据库表中工作项表增加了属性,或者数据实体想额外扩展属性时,我们需要通过EOS开发平台更新sdo数据实体,操作流程如下。(不限于工作项,其他数据实体同理)

  1. 选择devops-specs模块,进入com.primeton.devops.specs.model目录,选择数据》数据模型》com.primeton.devops.specs.model》pm.datasetx》Workitem。 双击Workitem,即可在右侧窗口中定位到Workitem工作项实体位置

workitem-extended

  1. 在右侧窗口中双击Workitem实体,即可查看工作项的持久化实体属性,通过属性列表旁边的按钮即可添加基本属性,引用属性等,点击确定后需要在pm.datasetx窗口内再次ctrl+s保存,才能使属性生效(为了保证数据准确,不推荐执行步骤2,推荐执行步骤3)。

workitem-extended

  1. 为了保证数据实体与数据库表一致,推荐使用数据库导入更新数据库表属性。在左下角的数据库视图空白处右键新建数据库连接。

workitem-extended

  1. 填写数据库信息,只要保证更新的工作项表数据准确的数据库即可。

workitem-extended

  1. 连接成功后可以查看对应工作项表结构,检查是否准确。

workitem-extended

  1. 将workitem表拖入右侧pm.datasetx窗口中。

workitem-extended

  1. 在弹出的导入数据实体窗口勾选如下选项,点击确定。

workitem-extended

  1. 再次双击pm.datasetx窗口中Workitem实体,检查新增的属性是否已经存在,点击确定后要执行ctrl+s保存pm.datasetx。

workitem-extended

  1. 回到左侧资源管理器中右键pm.datasetx下的workitem实体,点击创建SDO代码。

workitem-extended

  1. 弹出的窗口创建SDO代码点击确定。

workitem-extended

  1. 确认覆盖选择全部为是。

workitem-extended

  1. 再次查看pm.datasetx窗口中的Workitem实体,双击选择描述table,确保实体类准确,如果为空时需要浏览添加同名Impl实例类,点击确认后ctrl+s保存pm.datasetx,工作项的属性更新完成。

workitem-extended

  1. 可以启动服务,选择任意工作项请求,查看工作项实体中存在新建的newProperties,工作项属性扩展成功。

workitem-extended

上次更新: 2023-4-7 16:00:54