# 统一待办接口
# 接口调用方式
需要在OA Java主程序中调用本接口,依赖OA中相关实例。
# 应用场景
客户需要与第三方系统进行统一待办集成:将OA中产生的待办数据推送到第三方系统,同时如果OA中已经处理、终止数据则也需要同步通知第三方进行相应操作、
传统的开发模式是:监听OA中的所有相关Event事件,分别编写处理动作。传统开发模式的困难点是:接口多,代码量高,容易遗失场景。
期望:技术上只需要监听一个Event事件,系统中的待办、已办、终止、回退、撤销等一系列操作都触发给这个Event,开发在一个接口中完成三方同步的动作。
# 解决方案
标准产品提供了com.seeyon.apps.zhifei.event.ExtIntegrationExtendEvent统一待办事件接口完成上述诉求!
接口能力:支持协同、公文、会议、新闻、公告、调查、讨论模块的发起、提交、撤销、终止等操作。
注:标准产品有命名为ExtIntegrationEvent的接口,此接口属于旧接口;V8.2以上用户均推荐使用ExtIntegrationExtendEvent接口,此接口适配范围更广。
# 开发示例
监听统一待办Event非常简单,参照如下代码实现即可:
public class TodoTaskEvenListener {
/**编写一个事件监听ExtIntegrationExtendEvent**/
@ListenEvent(event = ExtIntegrationExtendEvent.class, async = true)
public void onExtIntegrationEvent(ExtIntegrationExtendEvent event) throws BusinessException {
ExtSummary extSummary = event.getExtSummary();
// 监听到对象时,执行对应的业务逻辑操作,比如将对象推送给第三方
todo(extSummary);
}
}
参照源码示例:\apps-weixin\src\main\java\com\seeyon\apps\weixin\todotask\listener\TodoTaskEvenListener.java
# 参数解释
ExtIntegrationExtendEvent.getExtSummary()返回ExtSummary对象,是一条流程数据基础信息,对象中的数据类似于COL_SUMMARY,相关属性如下:
public class ExtSummary {
private String extSummarySubject;// 协同的标题
private String extSummaryId;// 协同summaryId
private Integer extSummaryFlowState;//实例状态 = 流程状态 (总状态)OA流程状态枚举参考 CollaborationEnum.flowState
private String extSummaryStartMemberId;//协同发起人ID
private Long extSummaryStartDate;//协同发起时间 时间戳
private Long extSummaryReceiveDate;//协同接受时间 时间戳
private Long extSummaryFinishDate;//流程结束时间
private Long extSummaryUpdateDate;//流程更新时间,此条数据当前操作人员的oa系统中的id
private Long extSummaryHandleUserId;//此条数据当前操作人员的oa系统中的id
private String oaAppCode; // 具体功能模块,比如自由协同、公文、表单模板,对应枚举 ApplicationCategoryEnum
private String extSummaryPcUrl; //发起节点Pc端跳转链接
private String extSummaryMobileUrl; //发起节点手机端跳转链接
private String extSummaryAccountId; //当前协同的AccountId
private Map extraParams;//额外参数,比如协同处理的意见
private List<ExtAffair> ExtAffairs;// oa事务列表
}
ExtSummary.extSummaryFlowState表示整个流程的状态,对应枚举CollaborationEnum.flowState,协同和公文均是这个状态,相关属性如下:
public static enum flowState {
run, // 运行中,对应数值0
terminate, // 终止结束,对应数值1
cancel, // 取消(实际没有用,通过affair的state=2/substate来决定),对应数值2
finish, // 正常结束,对应数值3
deleted; // 被删除(公文:结束后归档,再从档案中删除),对应数值4
}
ExtSummary.getExtAffairs()返回多条节点对象ExtAffair,类似于CTP_AFFAIR,相关属性如下:
public class ExtAffair {
private String ctpAffairId;//OA个人事项(节点)Id
private Long ctpAffairMemberId;// OA个人事项人员ID
private Long ctpProxyMemberId;// OA个人事项代理人ID
private int ctpAffairState;// 当前流程节点处理的状态 OA处理人状态枚举参考 StateEnum,详见本文档后续参数解释
private int ctpAffairSubState;// 当前流程节点处理的状态 OA处理人副状态枚举参考 SubStateEnum,详见本文档后续参数解释
private Long ctpAffairCreateDate;// 个人事务创建时间
private Long ctpAffairReceiveDate;//事项接受时间 时间戳
private Long ctpAffairCompleteDate;//事项完成时间 时间戳
private Long ctpAffairUpdateDate;// 个人事务更新时间,比如处理状态变了
private String pcUrl;//pc端穿透地址
private String mobileUrl;//移动端穿透地址
private boolean isDelete = false; // 已办&已发是否被删除
private Map extraParams;//额外参数,比如协同处理的意见
}
ExtAffair.ctpAffairState流程节点处理状态,对应枚举StateEnum参数:
public enum StateEnum {
col_waitSend(1), // 协同-待发
col_sent(2), // 协同-已发
col_pending(3), // 协同-待办
col_pending_repeat_auto_deal(30), //待办-重复处理自动跳过
col_done(4), // 协同-已办
col_cancel(5), // 协同-撤销
col_stepBack(6), // 协同-回退
col_takeBack(7), // 协同-取回
col_competeOver(8), // 协同-竞争执行结束
col_competedOthersCanView(11), //竞争执行完,但是其他人可以查看。
col_stepStop(15), //协同-终止
col_itemRemoved(16),//事项被删除,不是列表里面的逻辑删除,而是直接从流程图中被删除了,这个人不在流程中了。例如督办里面复合节点的具体人员的删除功能。
mt_attend(9), //会议-参与
mt_unAttend(10), //会议-不参与
edoc_exchange_send(3), //公文交换-待发送
edoc_exchange_sent(4), //公文交换-已发送
edoc_exchange_receive(3), //公文交换-待签收
edoc_exchange_received(4), //公文交换-已签收
edoc_exchange_register(3), //公文交换--待登记
edoc_exchange_registered(4), //公文交换--已登记
edoc_exchange_withdraw(18), //公文交换--被撤销
inquiry_no_audit(20), //调查--待审核
bul_toaudit(21), // 公告--待审核
news_toaudit(22), // 新闻--待审核
info_failure(23), //信息报送-失效
info_stepBack(24); //信息报送-退件
}
ExtAffair.ctpAffairSubState流程节点二级处理状态,对应枚举SubStateEnum参数:
public enum SubStateEnum {
col_normal(0), // 协同-子状态-正常
col_waitSend_draft(1), // 协同-待发-草稿
col_waitSend_stepBack(2), // 协同-待发-被回退
col_waitSend_cancel(3), // 协同-待发-被撤销
col_waitSend_sendBack(4), //公文-退回拟稿人
col_cancel(5), //协同-撤销
col_pending_takeBack(6),//协同-待办-取回
col_pending_Back(7),//协同-待办-被回退
col_pending_unRead(11), // 协同-待办-未读
col_pending_read(12), // 协同-待办-已读
col_pending_ZCDB(13), // 协同-待办-暂存待办
col_pending_assign(14), //协同-待办-知会
//col_pending_stepBack_ZCDB(15), //协同-待办-被回退-暂存待办
col_pending_specialBack(15),//协同-待办-主动指定回退的状态,我指定回退给别人,这是我的状态
// 张家强 虽然是pending,但待发状态substate也是16,考虑改名或加详细注释
col_pending_specialBacked(16),//协同-待办--被指定回退到的事项,别人回退给我,这是我的状态
col_pending_specialBackCenter(17),//协同-待办--被指定回退到的事项,又指定回退给别人,中间事项的状态,比如A->B->C->D,D指定回退给C,C又制定回退给B。那么此时C的状态就是17。
col_pending_specialBackToSenderCancel(18),//协同-待发--指定回退到发起人并且选择流程重走,这是发起人的状态
col_pending_specialBackToSenderReGo(19),//公文--在办时,指定退回(直接提交给我)普通节点
col_done_stepStop(21), // 协同-已办-流程被终止
col_done_delete(22), //协同-已办-删除
col_done_pighone(23), //协同-已办 -归档
col_done_overtimeskip(24),//协同-已办 -超期跳过
col_done_activeStepStop(25), // 协同-已办-流程主动终止
meeting_pending_join(31), //会议-待办-参加
meeting_pending_unJoin(32), //会议-待办-不参加
meeting_pending_pause(33), //会议-待办-待定
meeting_pending_periodicity(34), // 周期性会议
edoc_pending_exchange_back(40); // 公文-待办-签收流程回退到发起人,发起人的事项
}
# 问题和方案
问题:干预人处理待办未触发统一待办Event
详细描述:ExtIntegrationExtendEvent待办监听接口如果有超级节点,且超级节点转干预人处理的时候,干预人收到待办的时候能监听到待办数据,但是干预人处理待办的时候监听不到处理事件。
方案回复:V9.0版本已经标准适配,更早版本项目上如有需求,请参考V9.0源码自行向下合并下代码:apps-collaboration\src\main\java\com\seeyon\apps\collaboration\manager\ColManagerImpl.java#transFinishAndZcdb
。
