# BPM 扩展接口
版本: 1.0 | 发布日期: 30/9/2019
# 通过该接口可以扩展的功能
- 扩展 参与人的来源和关系
- 扩展公式中的参数
- 扩展条件中的参数
- 送批之前添加操作
- 变更单批核之后添加操作
- 在代码层面监控流程中的事件
# BpmHandler
public interface BpmHandler {
/*return key,mess */
public Map<String, String> extendDynamicPatorSource(String moduleName);
public Map<String, String> extendDynamicPatorShip(String moduleName);
/* return target user id*/
public Set<Long> getExtendPatorSourceValue(String moduleName, SqlEntity data, String srcField);
public Set<Long> getExtendPatorShipValue(String moduleName, SqlEntity data, String ship, long uid, long empId);
public Set<Long> getExtendPatorShipValue(String moduleName, SqlEntity data, String ship, long uid, long empId, long reportingLineId);
/*exclude lookup=user,employee field which default as source*/
public Set<String> excludeDynamicPatorSource(String moduleName);
/*return entity identify for bpm */
public String getEntityIdentify(String moduleName, SqlEntity src);
// such as ce01 business rule
public List<DynamicField> extendDynamicField(String moduleName);
public List<DynamicField> dynamicFieldCurrentValue(String moduleName, SqlEntity data);
public boolean changeNoteApproved(String moduleName, SqlEntity origin, SqlEntity changeNote, String changeNoteCode);
// return empty string means ok
public String checkBeforeSubmit(String moduleName, SqlEntity data);
}
# 1. 扩展参与人的来源
extendDynamicPatorSource
@Override
public Map<String, String> extendDynamicPatorSource(String moduleName) {
Map<String, String> extendSource = new HashMap<String, String>();
if ("employee".equals(moduleName) && CawLib.isApDebug()) {
extendSource.put(e_source, "wf.extendA");
}
return extendSource;
}
getExtendPatorSourceValue
@Override
public Set<Long> getExtendPatorSourceValue(String moduleName, SqlEntity data, String srcField) {
Set<Long> targetUser = new HashSet<Long>();
if ("employee".equals(moduleName) && data.getModuleType().equals(moduleName) && CawLib.isApDebug()) {
if (e_source.equals(srcField)) {
Long publiserId = data.getMainData().getLong(1, "createUid");
targetUser.add(publiserId);
}
}
return targetUser;
}
# 2. 扩展参与人的关系
extendDynamicPatorShip
@Override
public Map<String, String> extendDynamicPatorShip(String moduleName) {
Map<String, String> extendSource = new HashMap<String, String>();
if ("employee".equals(moduleName) && CawLib.isApDebug()) {
extendSource.put(e_ship, "wf.extendShip");
}
return extendSource;
}
getExtendPatorShipValue
// Keep this method for backward compatibility
@Override
@Deprecated
public Set<Long> getExtendPatorShipValue(String moduleName, SqlEntity data, String ship, long uid, long empId) {
Set<Long> targetUser = new HashSet<Long>();
if ("employee".equals(moduleName) && data.getModuleType().equals(moduleName) && CawLib.isApDebug()) {
if (e_ship.equals(ship)) {
if (uid > 0) {
targetUser.add(uid);
} else if (empId > 0) {
// found user id by employee id
}
}
}
return targetUser;
}
新的方法添加了一个新的参数 reportingLineId
, 如果你同时实现了两个方法, 只有新的方法会被调用
public Set<Long> getExtendPatorShipValue(String moduleName, SqlEntity data, String ship, long uid, long empId, long reportingLineId);
# 3. 扩展条件中的参数
# 4. 扩展公式中的参数
extendDynamicField
@Override
public List<DynamicField> extendDynamicField(String moduleName) {
List<DynamicField> ef = new ArrayList<DynamicField>();
if ("employee".equals(moduleName) && CawLib.isApDebug()) {
DynamicField f1 = new DynamicField("fA", "code", "messA");
DynamicField f2 = new DynamicField("fB", "code", "messB");
ef.add(f1);
ef.add(f2);
}
return ef;
}
dynamicFieldCurrentValue
@Override
public List<DynamicField> dynamicFieldCurrentValue(String moduleName, SqlEntity data) {
List<DynamicField> ef = new ArrayList<DynamicField>();
if ("employee".equals(moduleName) && CawLib.isApDebug()) {
DynamicField f1 = new DynamicField("fA", "code", "messA");
DynamicField f2 = new DynamicField("fB", "code", "messB");
f1.setValue("AAAAA");
f2.setValue("BBBBB");
ef.add(f1);
ef.add(f2);
}
return ef;
}
# 5. 流程送批之前添加操作
如果返回的结果不是空白的字符串,送批会被中止,返回的字符串会以错误信息的形式显示给用户
@Override
public String checkBeforeSubmit(String moduleName, SqlEntity data) {
if ("employee2".equals(moduleName) && CawLib.isApDebug()) {
return CawGlobal.getMess("wf.actionFailInfo2");
}
return super.checkBeforeSubmit(moduleName, data);
}
# 6. 变更单批核之后添加操作
变更单批核之后,我们会用变更单替换原始单据,这个方法在替换操作之前被调用,返回的结果用于表示替换操作是否还要继续。 返回False表示替换操作停止
@Override
public boolean changeNoteApproved(String moduleName, SqlEntity origin, SqlEntity changeNote, String changeNoteCode) {
return false;
}
# Bpm Event Listener
在BPM的界面,用户可以对不同的事件设置不同的响应,如果你需要在代码层面捕捉到这些事件并作出响应,请看下面
@CawEventListener(eventTopic = WfTopic.BpmEvent)
public class AncmBpmEventListener extends CawListenerAdapter {
@Override
public void callEvent(Object param) {
if (param == null || !(param instanceof WfPublishPara)) {
return;
}
WfPublishPara msg = (WfPublishPara) param;
if (!"ancm".equals(msg.getApvModule()) || !(WfInsState.ENDED).equals(msg.getWfInsState())) {
return;
}
long ancmId = msg.getApvRecordId();
CheckMsg ckmsg = AncmUtil.publishAncmBpm(ancmId);
if (ckmsg != null) {
CawLog.error(ckmsg.getInfo());
}
}
}