WeaverOAMessageUtils.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. package com.kingdee.eas.custom.integration.weaveroa.utils;
  2. import com.kingdee.bos.BOSException;
  3. import com.kingdee.bos.Context;
  4. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  5. import com.kingdee.bos.dao.ormapping.SQLAccessException;
  6. import com.kingdee.bos.metadata.entity.*;
  7. import com.kingdee.bos.util.BOSObjectType;
  8. import com.kingdee.bos.util.BOSUuid;
  9. import com.kingdee.eas.base.message.AssignReadFactory;
  10. import com.kingdee.eas.base.message.AssignReadInfo;
  11. import com.kingdee.eas.base.message.IAssignRead;
  12. import com.kingdee.eas.base.message.MsgStatus;
  13. import com.kingdee.eas.base.message.webservice.WSMessage;
  14. import com.kingdee.eas.base.message.webservice.WfrAssignMessage;
  15. import com.kingdee.eas.base.message.webservice.WfrProcMessage;
  16. import com.kingdee.eas.base.permission.IUser;
  17. import com.kingdee.eas.base.permission.UserFactory;
  18. import com.kingdee.eas.base.permission.UserInfo;
  19. import com.kingdee.eas.basedata.org.HROrgUnitInfo;
  20. import com.kingdee.eas.common.EASBizException;
  21. import com.kingdee.eas.custom.integration.base.util.EncryptUtil;
  22. import com.kingdee.eas.custom.integration.base.util.SHRApiUtils;
  23. import com.kingdee.eas.custom.integration.weaveroa.*;
  24. import com.kingdee.eas.custom.integration.weaveroa.bizEnum.InstanceStatusEnum;
  25. import com.kingdee.eas.custom.integration.weaveroa.bizEnum.IsRemarkEnum;
  26. import com.kingdee.eas.custom.integration.weaveroa.bizEnum.ViewTypeEnum;
  27. import com.kingdee.eas.hr.base.AbstractHRBillBaseInfo;
  28. import com.kingdee.eas.hr.base.HRBillStateEnum;
  29. import com.kingdee.shr.base.syssetting.util.BaseMetaDataUtil;
  30. import org.slf4j.Logger;
  31. import org.slf4j.LoggerFactory;
  32. import org.springframework.web.util.UriComponentsBuilder;
  33. import java.io.UnsupportedEncodingException;
  34. import java.net.URLEncoder;
  35. import java.nio.charset.StandardCharsets;
  36. import java.sql.Time;
  37. /**
  38. * @Description 泛微OA消息工具类
  39. * @Date 2026/3/10 16:08
  40. * @Created by HeYuan
  41. */
  42. public class WeaverOAMessageUtils {
  43. private static Logger logger = LoggerFactory.getLogger(WeaverOAMessageUtils.class);
  44. //HR组织
  45. private static final HROrgUnitInfo HRORGUNITINFO = new HROrgUnitInfo();
  46. static {
  47. HRORGUNITINFO.setId(BOSUuid.read("00000000-0000-0000-0000-000000000000CCE7AED4"));
  48. }
  49. /**
  50. * 流程任务完成
  51. *
  52. * @param wfrMmessage
  53. * @return
  54. */
  55. public static boolean completedApproveMessage(WfrProcMessage wfrMmessage) {
  56. logger.error("completedApproveMessage 开始");
  57. try {
  58. Context ctx = SHRApiUtils.getContext(wfrMmessage.getCtx());
  59. //
  60. String billID = wfrMmessage.getBillID();
  61. BOSObjectType bosType = BOSUuid.read(billID).getType();
  62. AbstractHRBillBaseInfo billInfo = (AbstractHRBillBaseInfo) BaseMetaDataUtil.getBizInterface(ctx, bosType).getValue(new ObjectUuidPK(billID));
  63. //单据状态
  64. HRBillStateEnum billState = billInfo.getBillState();
  65. IWeaverOAApprovalInstance iWeaverOAApprovalInstance = WeaverOAApprovalInstanceFactory.getLocalInstance(ctx);
  66. FilterInfo filterInfo = new FilterInfo();
  67. filterInfo.getFilterItems().add(new FilterItemInfo("instanceId", wfrMmessage.getProcInstId()));
  68. SelectorItemCollection sic = new SelectorItemCollection();
  69. sic.add("*");
  70. sic.add("taskList.*");
  71. EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  72. WeaverOAApprovalInstanceCollection instanceCollection = iWeaverOAApprovalInstance.getWeaverOAApprovalInstanceCollection(viewInfo);
  73. if (!instanceCollection.isEmpty()) {
  74. WeaverOAApprovalInstanceInfo instanceInfo = instanceCollection.get(0);
  75. if (HRBillStateEnum.AUDITED.equals(billState)) {
  76. //审批通过
  77. instanceInfo.setInstanceStatus(InstanceStatusEnum.APPROVED);
  78. } else if (HRBillStateEnum.AUDITEND.equals(billState)) {
  79. //审批不通过
  80. instanceInfo.setInstanceStatus(InstanceStatusEnum.REJECTED);
  81. }
  82. WeaverOAApprovalInstanceTaskListCollection taskList = instanceInfo.getTaskList();
  83. for (int i = 0; i < taskList.size(); i++) {
  84. WeaverOAApprovalInstanceTaskListInfo instanceTaskListInfo = taskList.get(i);
  85. instanceTaskListInfo.setViewtype(ViewTypeEnum.READ);
  86. instanceTaskListInfo.setIsremark(IsRemarkEnum.COMPLETED);
  87. //流程结束,需要将所有节点更新为归档
  88. instanceTaskListInfo.setNodename("归档");
  89. }
  90. //保存
  91. iWeaverOAApprovalInstance.save(instanceInfo);
  92. }
  93. } catch (Exception e) {
  94. e.printStackTrace();
  95. logger.error("流程任务完成 completedApprovMessage 报错: {}", e.getMessage(), e);
  96. return false;
  97. }
  98. return true;
  99. }
  100. /**
  101. * 更新节点消息查看类型
  102. *
  103. * @param ctx
  104. * @return
  105. */
  106. public static boolean updateNodeMessageViewType(String id, MsgStatus msgStatus, Context ctx) {
  107. logger.error("updateNodeMessageViewType 开始, id {} , msgStatus {}", id, msgStatus.getAlias());
  108. ctx = SHRApiUtils.getContext(ctx);
  109. String bosType = BOSUuid.read(id).getType().toString();
  110. logger.error("updateNodeMessageViewType bosType {}", bosType);
  111. if ("9623EB51".equals(bosType)) {
  112. try {
  113. //任务阅读表
  114. IAssignRead assignReadIns = AssignReadFactory.getLocalInstance(ctx);
  115. AssignReadInfo assignReadInfo = assignReadIns.getAssignReadInfo(new ObjectUuidPK(id));
  116. //节点任务id
  117. String assignId = assignReadInfo.getAssignID().toString();
  118. IWeaverOAApprovalInstance iWeaverOAApprovalInstance = WeaverOAApprovalInstanceFactory.getLocalInstance(ctx);
  119. IWeaverOAApprovalInstanceTaskList iWeaverOAApprovalInstanceTaskList = WeaverOAApprovalInstanceTaskListFactory.getLocalInstance(ctx);
  120. FilterInfo filterInfo = new FilterInfo();
  121. filterInfo.getFilterItems().add(new FilterItemInfo("flowid", assignId));
  122. SelectorItemCollection sic = new SelectorItemCollection();
  123. sic.add("*");
  124. sic.add("parent.instanceStatus");
  125. sic.add("parent.id");
  126. EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  127. //审批实例任务列表
  128. WeaverOAApprovalInstanceTaskListCollection instanceTaskListCol = iWeaverOAApprovalInstanceTaskList.getWeaverOAApprovalInstanceTaskListCollection(viewInfo);
  129. if (!instanceTaskListCol.isEmpty()) {
  130. WeaverOAApprovalInstanceTaskListInfo instanceTaskListInfo = instanceTaskListCol.get(0);
  131. WeaverOAApprovalInstanceInfo parent = instanceTaskListInfo.getParent();
  132. //流程实例状态
  133. if (InstanceStatusEnum.PENDING.equals(parent.getInstanceStatus())) {
  134. if (MsgStatus.READED.equals(msgStatus)) {
  135. //已读
  136. instanceTaskListInfo.setViewtype(ViewTypeEnum.READ);
  137. } else {
  138. //未读
  139. instanceTaskListInfo.setViewtype(ViewTypeEnum.UNREAD);
  140. }
  141. SelectorItemCollection updateSic = new SelectorItemCollection();
  142. updateSic.add("viewtype");
  143. //更新
  144. iWeaverOAApprovalInstanceTaskList.updatePartial(instanceTaskListInfo, updateSic);
  145. //触发同步审批实例
  146. iWeaverOAApprovalInstance.syncApprovalInstance(parent.getId().toString());
  147. }
  148. }
  149. } catch (Exception e) {
  150. e.printStackTrace();
  151. logger.error("updateNodeMessageViewType 报错: {}", e.getMessage(), e);
  152. return false;
  153. }
  154. }
  155. return true;
  156. }
  157. /**
  158. * 节点任务取消
  159. *
  160. * @param wfrMmessage
  161. * @return
  162. */
  163. public static boolean nodeCanceledApproveMessage(WfrAssignMessage wfrMmessage) {
  164. logger.error("nodeCanceledApproveMessage 开始");
  165. try {
  166. Context ctx = SHRApiUtils.getContext(wfrMmessage.getCtx());
  167. //
  168. //流程任务id
  169. String assignId = wfrMmessage.getAssignId();
  170. IWeaverOAApprovalInstance iWeaverOAApprovalInstance = WeaverOAApprovalInstanceFactory.getLocalInstance(ctx);
  171. IWeaverOAApprovalInstanceTaskList iWeaverOAApprovalInstanceTaskList = WeaverOAApprovalInstanceTaskListFactory.getLocalInstance(ctx);
  172. FilterInfo filterInfo = new FilterInfo();
  173. filterInfo.getFilterItems().add(new FilterItemInfo("flowid", assignId));
  174. SelectorItemCollection sic = new SelectorItemCollection();
  175. sic.add("*");
  176. sic.add("parent.instanceStatus");
  177. sic.add("parent.id");
  178. EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  179. //审批实例任务列表
  180. WeaverOAApprovalInstanceTaskListCollection instanceTaskListCol = iWeaverOAApprovalInstanceTaskList.getWeaverOAApprovalInstanceTaskListCollection(viewInfo);
  181. if (!instanceTaskListCol.isEmpty()) {
  182. WeaverOAApprovalInstanceTaskListInfo instanceTaskListInfo = instanceTaskListCol.get(0);
  183. WeaverOAApprovalInstanceInfo parent = instanceTaskListInfo.getParent();
  184. //流程实例状态
  185. if (InstanceStatusEnum.PENDING.equals(parent.getInstanceStatus())) {
  186. //已办
  187. instanceTaskListInfo.setIsremark(IsRemarkEnum.PROCESSED);
  188. //已读
  189. instanceTaskListInfo.setViewtype(ViewTypeEnum.READ);
  190. //保存
  191. iWeaverOAApprovalInstanceTaskList.save(instanceTaskListInfo);
  192. //触发同步审批实例
  193. iWeaverOAApprovalInstance.syncApprovalInstance(parent.getId().toString());
  194. }
  195. }
  196. } catch (Exception e) {
  197. e.printStackTrace();
  198. logger.error("节点任务转交 nodeCanceledApproveMessage 报错: {}", e.getMessage(), e);
  199. return false;
  200. }
  201. return true;
  202. }
  203. /**
  204. * 节点任务完成
  205. *
  206. * @param wfrMmessage
  207. * @return
  208. */
  209. public static boolean nodeCompletedApproveMessage(WfrAssignMessage wfrMmessage) {
  210. logger.error("nodeCompletedApproveMessage 开始");
  211. try {
  212. Context ctx = SHRApiUtils.getContext(wfrMmessage.getCtx());
  213. //流程任务id
  214. String assignId = wfrMmessage.getAssignId();
  215. IWeaverOAApprovalInstance iWeaverOAApprovalInstance = WeaverOAApprovalInstanceFactory.getLocalInstance(ctx);
  216. IWeaverOAApprovalInstanceTaskList iWeaverOAApprovalInstanceTaskList = WeaverOAApprovalInstanceTaskListFactory.getLocalInstance(ctx);
  217. FilterInfo filterInfo = new FilterInfo();
  218. filterInfo.getFilterItems().add(new FilterItemInfo("flowid", assignId));
  219. SelectorItemCollection sic = new SelectorItemCollection();
  220. sic.add("*");
  221. sic.add("parent.instanceStatus");
  222. sic.add("parent.id");
  223. EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  224. //审批实例任务列表
  225. WeaverOAApprovalInstanceTaskListCollection instanceTaskListCol = iWeaverOAApprovalInstanceTaskList.getWeaverOAApprovalInstanceTaskListCollection(viewInfo);
  226. if (!instanceTaskListCol.isEmpty()) {
  227. WeaverOAApprovalInstanceTaskListInfo instanceTaskListInfo = instanceTaskListCol.get(0);
  228. WeaverOAApprovalInstanceInfo parent = instanceTaskListInfo.getParent();
  229. //流程实例状态
  230. if (InstanceStatusEnum.PENDING.equals(parent.getInstanceStatus())) {
  231. //已办
  232. instanceTaskListInfo.setIsremark(IsRemarkEnum.PROCESSED);
  233. //已读
  234. instanceTaskListInfo.setViewtype(ViewTypeEnum.READ);
  235. //保存
  236. iWeaverOAApprovalInstanceTaskList.save(instanceTaskListInfo);
  237. //触发同步审批实例
  238. iWeaverOAApprovalInstance.syncApprovalInstance(parent.getId().toString());
  239. }
  240. }
  241. } catch (Exception e) {
  242. e.printStackTrace();
  243. logger.error("节点任务完成 nodeCompletedApprovMessage 报错: {}", e.getMessage(), e);
  244. return false;
  245. }
  246. return true;
  247. }
  248. /**
  249. * 撤销流程
  250. *
  251. * @param wfrProcMessage
  252. * @return
  253. */
  254. public static boolean abortedApproveMessage(WfrProcMessage wfrProcMessage) {
  255. logger.error("abortedApproveMessage 开始");
  256. try {
  257. Context ctx = SHRApiUtils.getContext(wfrProcMessage.getCtx());
  258. IWeaverOAApprovalInstance iWeaverOAApprovalInstance = WeaverOAApprovalInstanceFactory.getLocalInstance(ctx);
  259. //审批实例
  260. FilterInfo filterInfo = new FilterInfo();
  261. filterInfo.getFilterItems().add(new FilterItemInfo("instanceId", wfrProcMessage.getProcInstId()));
  262. SelectorItemCollection sic = new SelectorItemCollection();
  263. sic.add("*");
  264. sic.add("taskList.*");
  265. EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, sic, null);
  266. WeaverOAApprovalInstanceCollection instanceCollection = iWeaverOAApprovalInstance.getWeaverOAApprovalInstanceCollection(viewInfo);
  267. if (!instanceCollection.isEmpty()) {
  268. WeaverOAApprovalInstanceInfo instanceInfo = instanceCollection.get(0);
  269. WeaverOAApprovalInstanceTaskListCollection taskList = instanceInfo.getTaskList();
  270. for (int i = 0; i < taskList.size(); i++) {
  271. WeaverOAApprovalInstanceTaskListInfo instanceTaskListInfo = taskList.get(i);
  272. //流程处理状态
  273. IsRemarkEnum isremark = instanceTaskListInfo.getIsremark();
  274. if (!IsRemarkEnum.COMPLETED.equals(isremark)) {
  275. //流程任务处理状态设置为办结
  276. instanceTaskListInfo.setIsremark(IsRemarkEnum.COMPLETED);
  277. //流程查看状态 设置为已读
  278. instanceTaskListInfo.setViewtype(ViewTypeEnum.READ);
  279. }
  280. //流程结束,需要将所有节点更新为归档
  281. instanceTaskListInfo.setNodename("归档");
  282. }
  283. //流程状态更新为 审批人撤销
  284. instanceInfo.setInstanceStatus(InstanceStatusEnum.CANCELED);
  285. //保存
  286. iWeaverOAApprovalInstance.save(instanceInfo);
  287. }
  288. } catch (Exception e) {
  289. e.printStackTrace();
  290. logger.error("撤销流程 abortedApprovMessage 报错: {}", e.getMessage(), e);
  291. return false;
  292. }
  293. return true;
  294. }
  295. /**
  296. * 发送审批消息
  297. *
  298. * @param message
  299. * @return
  300. */
  301. public static boolean addApproveMessage(WSMessage message) {
  302. logger.error("addApproveMessage 开始");
  303. //流程实例id
  304. String procInstId = message.getProcInstId();
  305. try {
  306. Context ctx = SHRApiUtils.getContext(message.getContext());
  307. //飞书应用默认配置
  308. WeaverOAConfigInfo defaultConfig = WeaverOAUtil.getDefaultConfig();
  309. //接收人账号
  310. String recieveNumber = message.getRecieveNumber();
  311. logger.info("addApproveMessage 账号加密前: {}", recieveNumber);
  312. String encryptRecieveNumber = EncryptUtil.encryptStr(recieveNumber);
  313. logger.info("addApproveMessage 账号加密后: {}", encryptRecieveNumber);
  314. //PC 端的三方审批实例跳转链接。
  315. String pcLink = getPcLink(defaultConfig, message, encryptRecieveNumber);
  316. //移动端的三方审批实例跳转链接。
  317. String mobileLink = getMobileLink(defaultConfig, message, encryptRecieveNumber);
  318. //发起人
  319. IUser iUser = UserFactory.getLocalInstance(ctx);
  320. UserInfo sender = iUser.getUserInfo("where number='" + message.getSenderNumber() + "'");
  321. IWeaverOAApprovalInstance iWeaverOAApprovalInstance = WeaverOAApprovalInstanceFactory.getLocalInstance(ctx);
  322. WeaverOAApprovalInstanceCollection instanceCol = getApprovalInstanceCollection(procInstId, iWeaverOAApprovalInstance);
  323. WeaverOAApprovalInstanceInfo instanceInfo = null;
  324. //标题
  325. String title = message.getTitle().replace("\r", "\\r").replace("\n", "\\n");
  326. if (instanceCol.isEmpty()) {
  327. //没有,新增
  328. instanceInfo = new WeaverOAApprovalInstanceInfo();
  329. instanceInfo.setInstanceId(procInstId);
  330. instanceInfo.setHrOrgUnit(HRORGUNITINFO);
  331. //审批实例状态
  332. instanceInfo.setInstanceStatus(InstanceStatusEnum.PENDING);
  333. //标题
  334. instanceInfo.setTitle(title);
  335. //发起人
  336. instanceInfo.setSender(sender);
  337. //获取单据对象
  338. EntityObjectInfo entityObjectInfo = BaseMetaDataUtil.getEntityObjectInfo(ctx, BOSUuid.read(message.getBillId()).getType());
  339. //单据类型
  340. instanceInfo.setBillType(entityObjectInfo.getDisplayName());
  341. //异构系统标识
  342. instanceInfo.setSyscode(defaultConfig.getSyscode());
  343. try {
  344. //保存
  345. iWeaverOAApprovalInstance.save(instanceInfo);
  346. } catch (SQLAccessException e) {
  347. logger.error("addApproveMessage 保存审批实例报错: {}", e.getMessage(), e);
  348. if (!e.getMessage().contains("IX_CT_WEA_WeaverOAAI")) {
  349. throw e;
  350. }
  351. //并发场景下 实例id重复,说明已经存在实例数据.
  352. instanceCol = getApprovalInstanceCollection(procInstId, iWeaverOAApprovalInstance);
  353. if (instanceCol.isEmpty()) {
  354. throw new RuntimeException("并发情况下未能获取审批实例: " + procInstId);
  355. }
  356. //审批实例
  357. instanceInfo = instanceCol.get(0);
  358. } catch (Exception e) {
  359. logger.error("addApproveMessage 保存审批实例报错: {}", e.getMessage(), e);
  360. throw e;
  361. }
  362. } else {
  363. //审批实例
  364. instanceInfo = instanceCol.get(0);
  365. }
  366. //当前节点
  367. String actName = message.getActName();
  368. //保存任务列表
  369. IWeaverOAApprovalInstanceTaskList iWeaverOAApprovalInstanceTaskList = WeaverOAApprovalInstanceTaskListFactory.getLocalInstance(ctx);
  370. WeaverOAApprovalInstanceTaskListCollection weaverOAApprovalInstanceTaskList = iWeaverOAApprovalInstanceTaskList.getWeaverOAApprovalInstanceTaskListCollection(
  371. "where parent.id='" + instanceInfo.getId() + "' and nodename <> '" + actName + "'"
  372. );
  373. if (!weaverOAApprovalInstanceTaskList.isEmpty()) {
  374. SelectorItemCollection updateSic = new SelectorItemCollection();
  375. updateSic.add("nodename");
  376. for (int i = 0; i < weaverOAApprovalInstanceTaskList.size(); i++) {
  377. WeaverOAApprovalInstanceTaskListInfo weaverOAApprovalInstanceTaskListInfo = weaverOAApprovalInstanceTaskList.get(i);
  378. weaverOAApprovalInstanceTaskListInfo.setNodename(actName);
  379. //更新现有节点的节点名称
  380. iWeaverOAApprovalInstanceTaskList.updatePartial(weaverOAApprovalInstanceTaskListInfo, updateSic);
  381. }
  382. }
  383. WeaverOAApprovalInstanceTaskListInfo task = createTask(ctx, message, pcLink, mobileLink);
  384. task.setParent(instanceInfo);
  385. iWeaverOAApprovalInstanceTaskList.save(task);
  386. //同步
  387. iWeaverOAApprovalInstance.syncApprovalInstance(instanceInfo.getId().toString());
  388. } catch (Exception e) {
  389. e.printStackTrace();
  390. return false;
  391. }
  392. return true;
  393. }
  394. /**
  395. * 根据实例id获取审批实例
  396. *
  397. * @param procInstId
  398. * @param iWeaverOAApprovalInstance
  399. * @return
  400. * @throws BOSException
  401. */
  402. private static WeaverOAApprovalInstanceCollection getApprovalInstanceCollection(
  403. String procInstId,
  404. IWeaverOAApprovalInstance iWeaverOAApprovalInstance
  405. ) throws BOSException {
  406. FilterInfo filterInfo = new FilterInfo();
  407. filterInfo.getFilterItems().add(new FilterItemInfo("instanceId", procInstId));
  408. EntityViewInfo viewInfo = EntityViewInfo.getInstance(filterInfo, null, null);
  409. WeaverOAApprovalInstanceCollection instanceCol = iWeaverOAApprovalInstance.getWeaverOAApprovalInstanceCollection(viewInfo);
  410. return instanceCol;
  411. }
  412. /**
  413. * 创建任务数据
  414. *
  415. * @param ctx
  416. * @param message
  417. * @param pcLink
  418. * @param mobileLink
  419. * @return
  420. * @throws BOSException
  421. * @throws EASBizException
  422. */
  423. private static WeaverOAApprovalInstanceTaskListInfo createTask(
  424. Context ctx,
  425. WSMessage message,
  426. String pcLink,
  427. String mobileLink
  428. ) throws BOSException, EASBizException {
  429. IUser iUser = UserFactory.getLocalInstance(ctx);
  430. //标题
  431. String title = message.getTitle().replace("\r", "\\r").replace("\n", "\\n");
  432. //发送时间
  433. Time sendTime = new Time(message.getSendTime().getTime());
  434. //审批人
  435. UserInfo reciever = iUser.getUserByID(new ObjectUuidPK(message.getRecieverID()));
  436. //发送人
  437. UserInfo sender = iUser.getUserInfo("where number='" + message.getSenderNumber() + "'");
  438. //接收时间
  439. Time receiveTime = new Time(message.getReceiveTime().getTime());
  440. WeaverOAApprovalInstanceTaskListInfo taskListInfo = new WeaverOAApprovalInstanceTaskListInfo();
  441. //任务id
  442. taskListInfo.setFlowid(message.getSourceID());
  443. //标题
  444. taskListInfo.setRequestname(title);
  445. //获取单据对象
  446. EntityObjectInfo entityObjectInfo = BaseMetaDataUtil.getEntityObjectInfo(ctx, BOSUuid.read(message.getBillId()).getType());
  447. //流程类型名称
  448. taskListInfo.setWorkflowname(entityObjectInfo.getDisplayName());
  449. //步骤名称(节点名称)
  450. taskListInfo.setNodename(message.getActName());
  451. //PC端链接
  452. taskListInfo.setPcurl(pcLink);
  453. //移动端链接
  454. taskListInfo.setAppurl(mobileLink);
  455. //流程处理状态 待办
  456. taskListInfo.setIsremark(IsRemarkEnum.TODO);
  457. //流程查看状态
  458. taskListInfo.setViewtype(ViewTypeEnum.UNREAD);
  459. //创建人
  460. taskListInfo.setCreator(sender);
  461. //创建日期时间
  462. taskListInfo.setCreatedatetime(sendTime);
  463. //接收人
  464. taskListInfo.setReceiver(reciever);
  465. //接收日期时间
  466. taskListInfo.setReceivedatetime(receiveTime);
  467. return taskListInfo;
  468. }
  469. /**
  470. * 获取pc待办地址
  471. *
  472. * @param message
  473. * @return
  474. * @throws UnsupportedEncodingException
  475. * @throws BOSException
  476. * @throws EASBizException
  477. */
  478. private static String getPcLink(
  479. WeaverOAConfigInfo defaultConfig,
  480. WSMessage message,
  481. String encryptRecieveNumber
  482. ) throws BOSException {
  483. try {
  484. String shrServerName = defaultConfig.getSHRServerName();
  485. String utf8String = StandardCharsets.UTF_8.toString();
  486. //构建重定向地址
  487. String redirectUrl = UriComponentsBuilder.fromUriString(shrServerName + "/easweb/webviews/workflow/transferApprove.jsp")
  488. .queryParam("AssignmentId", URLEncoder.encode(message.getSourceID(), utf8String))//任务id
  489. .queryParam("billID", URLEncoder.encode(message.getBillId(), utf8String))//单据id
  490. .build(true)
  491. .toUriString();
  492. //构建pc端链接
  493. String targetUrl = UriComponentsBuilder.fromUriString(shrServerName + "/qy/weaverOA/V9/ssoSHRByNumber/")
  494. .queryParam("number", URLEncoder.encode(encryptRecieveNumber, utf8String))
  495. .queryParam("redirectUrl", URLEncoder.encode(redirectUrl, utf8String))
  496. .queryParam("platform", "pc")//平台
  497. .build(true)
  498. .toUriString();
  499. logger.error("getPcLink targetUrl: {}", targetUrl);
  500. return targetUrl;
  501. } catch (Exception e) {
  502. e.printStackTrace();
  503. throw new BOSException(e.getMessage());
  504. }
  505. }
  506. /**
  507. * 获取移动端待办地址
  508. *
  509. * @param message
  510. * @return
  511. * @throws BOSException
  512. * @throws EASBizException
  513. * @throws UnsupportedEncodingException
  514. */
  515. private static String getMobileLink(
  516. WeaverOAConfigInfo defaultConfig,
  517. WSMessage message,
  518. String encryptRecieveNumber
  519. ) throws BOSException {
  520. try {
  521. String shrServerName = defaultConfig.getSHRServerName();
  522. String utf8String = StandardCharsets.UTF_8.toString();
  523. //构建重定向地址
  524. String redirectUrl = UriComponentsBuilder.fromUriString("https://mbos.kdeascloud.com/mbos/mbosw/getWorkflowUrl")
  525. .queryParam("assignId", URLEncoder.encode(message.getSourceID(), utf8String))//任务id
  526. .queryParam("eid", URLEncoder.encode(defaultConfig.getMEid(), utf8String))//mbos企业id
  527. .queryParam("storeEid", "21231")
  528. .queryParam("name", URLEncoder.encode("approveui.navui", utf8String))
  529. .queryParam("billID", URLEncoder.encode(message.getBillId(), utf8String))
  530. .build(true)
  531. .toUriString();
  532. //构建移动端链接
  533. String targetUrl = UriComponentsBuilder.fromUriString(shrServerName + "/qy/weaverOA/V9/ssoSHRByNumber/")
  534. .queryParam("number", URLEncoder.encode(encryptRecieveNumber, utf8String))
  535. .queryParam("redirectUrl", URLEncoder.encode(redirectUrl, utf8String))
  536. .queryParam("platform", "mobile")//平台
  537. .build(true)
  538. .toUriString();
  539. logger.error("getMobileLink targetUrl : {}", targetUrl);
  540. return targetUrl;
  541. } catch (Exception e) {
  542. e.printStackTrace();
  543. throw new BOSException(e.getMessage());
  544. }
  545. }
  546. }