# 统一待办接口

# 接口调用方式

需要在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

编撰人:het、admin