Concrete layout from 玉湖 YHPro (tested). Adapt package names and URLs for other projects.
src/com/kingdee/eas/custom/messageWebService/
|- OAMessageWebServiceDao.java
|- config/MessageConfig.java
|- server/TodoMessageServer.java
|- server/ToBeReadMessageServer.java
|- util/MessageCommonUtil.java, DingMessageUtil.java, DingTokenManager.java
src/com/kingdee/eas/base/message/app/
|- BMCMessageControllerBeanEx.java
src/com/kingdee/eas/custom/synctask/
|- MsgSyncIDMFacadeControllerBean.java
Config: {EAS_HOME}/server/properties/yuhu/receiveOAConfig.properties
yhpro-todo-toread-flow.md — 待办/待阅支线、日志关键字、空参与竞态排查。
addMessage: sleep 8s -> assignId -> addFlow(op=1) -> assignReadRecord addCompletedMessage: sleep 8s -> if task terminal updateAgency(op=4) -> if flow terminal updateFlow(op=2) removeMessage: sleep 9s -> deleteAgency(op=3)
BaoYPro / Weaver 注意:新增待办顺序与上面不同——先短轮询 AssignmentId → saveAssignRecord → 再 delayForWf → push。详见主 skill「新增待办与 wf.delayMs 执行顺序」。不要把 YH 的「先长 sleep 再查 id」原样搬到 BaoY。
COMPLETED->complete; REJECTED/ROLLBACKED->refuse; CANCELED/TERMINATED->cancel; ABORTED->revoke; else approving
bosType 41C9B39B; 抄送(bizType 0/80)补链; 无URL→钉钉飞书; UNREADED->011; READED->012; BMCMessageControllerBeanEx hooks create
PC: /shr/api/oAToSHR?redirect=...transferApprove.jsp Mobile: MBOS -> /qy/auth/V2/sso?state= SSO: kdshrsso Option B
assignReadRecord: MsgId, assignID, billId, workflowname, procInstId OAMsgCallLog: audit request/response
cfidmusercode via T_bd_person + T_PM_User; empty -> throw