/src/main/java/com/wcs/common/filenet/ce/ProcessUtil.java

https://github.com/YuanZhencai/tms · Java · 448 lines · 367 code · 47 blank · 34 comment · 27 complexity · 088c1139056bd08f88c4e3e623e50c01 MD5 · raw file

  1. package com.wcs.common.filenet.ce;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.security.auth.Subject;
  5. import org.apache.commons.logging.Log;
  6. import org.apache.commons.logging.LogFactory;
  7. import com.filenet.api.core.Connection;
  8. import com.filenet.api.core.Domain;
  9. import com.filenet.api.core.Factory;
  10. import com.filenet.api.core.ObjectStore;
  11. import com.filenet.api.util.UserContext;
  12. import com.wcs.base.util.DateUtil;
  13. import com.wcs.common.filenet.env.Env;
  14. import com.wcs.common.filenet.env.EnvInit;
  15. import com.wcs.common.filenet.env.SysCfg;
  16. import com.wcs.common.filenet.pe.RosterHelper;
  17. import com.wcs.common.filenet.pe.SessionHelper;
  18. import com.wcs.common.filenet.pe.WorkflowHelper;
  19. import com.wcs.common.filenet.pe.queue.QueueHelper;
  20. import filenet.vw.api.VWAttachment;
  21. import filenet.vw.api.VWDataField;
  22. import filenet.vw.api.VWException;
  23. import filenet.vw.api.VWFetchType;
  24. import filenet.vw.api.VWFieldType;
  25. import filenet.vw.api.VWLog;
  26. import filenet.vw.api.VWLogElement;
  27. import filenet.vw.api.VWLogQuery;
  28. import filenet.vw.api.VWLoggingOptionType;
  29. import filenet.vw.api.VWMapDefinition;
  30. import filenet.vw.api.VWParameter;
  31. import filenet.vw.api.VWProcess;
  32. import filenet.vw.api.VWQueue;
  33. import filenet.vw.api.VWQueueQuery;
  34. import filenet.vw.api.VWRoster;
  35. import filenet.vw.api.VWRosterElement;
  36. import filenet.vw.api.VWRosterQuery;
  37. import filenet.vw.api.VWSession;
  38. import filenet.vw.api.VWStepElement;
  39. import filenet.vw.api.VWStepHistory;
  40. import filenet.vw.api.VWStepProcessorInfo;
  41. import filenet.vw.api.VWWorkObject;
  42. import filenet.vw.api.VWWorkObjectNumber;
  43. import filenet.vw.api.VWWorkflowDefinition;
  44. import filenet.vw.api.VWWorkflowHistory;
  45. public class ProcessUtil {
  46. private String WorkflowNumber = "";
  47. private VWSession vs = null;
  48. private Connection ceConn = null;
  49. private Log logger = LogFactory.getLog(ProcessUtil.class);
  50. public ProcessUtil() {
  51. EnvInit env = new EnvInit();
  52. env.setJVMParameters();
  53. ceConn = initCE();
  54. vs = initPE();
  55. }
  56. private Connection initCE() {
  57. String ceUrl = SysCfg.getStrConfig("CE.CEURL");
  58. Connection ceConn1 = Factory.Connection.getConnection(ceUrl);
  59. String ceAdminUser = SysCfg.getStrConfig("CE.filenetCeAdminUserName");
  60. String ceAdminPassword = SysCfg.getStrConfig("CE.filenetCeAdminUserPasswd");
  61. logger.info(ceAdminUser);
  62. logger.info(ceAdminPassword);
  63. Subject subject = UserContext.createSubject(ceConn1, ceAdminUser, ceAdminPassword, "FileNetP8");
  64. UserContext uc = UserContext.get();
  65. uc.pushSubject(subject);
  66. return ceConn1;
  67. }
  68. private VWSession initPE() {
  69. String peAdminUser = SysCfg.getStrConfig("PE.FilenetPeAdminUserName");
  70. String peAdminPassword = SysCfg.getStrConfig("PE.FilenetPeAdminUserPasswd");
  71. return SessionHelper.logon(peAdminUser, peAdminPassword);
  72. }
  73. /**
  74. *
  75. * <p>Description: 创建工作流程实例</p>
  76. * @param workName
  77. * @param vs
  78. * @return
  79. * @throws VWException
  80. */
  81. public VWStepElement createWorkFlow(String workName) {
  82. try {
  83. VWStepElement launchStep = WorkflowHelper.createWorkflow(workName, vs);
  84. launchStep.doDispatch();
  85. WorkflowNumber = launchStep.getWorkflowNumber();
  86. logger.info(WorkflowNumber);
  87. logger.info(launchStep.getWorkObjectNumber());
  88. return launchStep;
  89. } catch (VWException e) {
  90. logger.error("createWorkFlow方法 创建工作流程实例出现异常", e);
  91. }
  92. return null;
  93. }
  94. /**
  95. *
  96. * <p>Description: 员工提交报销申请</p>
  97. * @param queueName
  98. * @param workNum
  99. */
  100. public void employeeSubmit(String queueName, String workNum, String param, boolean paramValue, String comment) {
  101. try {
  102. VWStepElement step = QueueHelper.getStepElementByWorkObjectNumber(vs.getQueue(queueName), new VWWorkObjectNumber(
  103. workNum), VWQueue.QUERY_NO_OPTIONS);
  104. step.setComment("员工报销申请测试");
  105. logger.info("节点元素名称---" + step.getStepName());
  106. logger.info("WorkWorkflowNumber---" + step.getWorkflowNumber());
  107. // 字段类型 ,用户自定义字段
  108. VWParameter[] ps = step.getParameters(VWFieldType.ALL_FIELD_TYPES, VWStepElement.FIELD_USER_DEFINED);
  109. logger.info("参数 -------");
  110. QueueHelper.lockStepElement(vs, step);
  111. step.setComment(comment);
  112. step.setParameterValue(param, paramValue, true);
  113. for (VWParameter vp : ps) {
  114. if (vp.getName().contains("_Exer")) {
  115. String name = vp.getName();
  116. step.setParameterValue(name, "shenbo", true);
  117. }
  118. }
  119. step.doDispatch();
  120. } catch (VWException e) {
  121. logger.error("employeeSubmit方法 员工提交报销申请出现异常", e);
  122. }
  123. }
  124. public void vwStepExcution(String workNum, String param, boolean paramValue, int flag, String commonet) {
  125. VWWorkObject vobj;
  126. try {
  127. vobj = RosterHelper.vwfetchWorkObject(Env.getVWSession(), workNum, 0);
  128. // 得到当前任务节点
  129. VWStepElement step = vobj.fetchStepElement();
  130. step.doLock(true);
  131. step.setComment(commonet);
  132. if (flag == 1) {
  133. step.setParameterValue(param, paramValue, true);
  134. }
  135. step.doDispatch();
  136. } catch (VWException e) {
  137. logger.error("vwStepExcution方法 执行任务节点出现异常", e);
  138. }
  139. }
  140. public void vwStepExcution(String workNum,String commonet){
  141. try {
  142. VWWorkObject vobj = RosterHelper.vwfetchWorkObject(vs, workNum, 0);
  143. VWStepElement step = vobj.fetchStepElement();
  144. step.doLock(true);
  145. step.setComment(commonet);
  146. step.doDispatch();
  147. } catch (VWException e) {
  148. logger.error("vwStepExcution方法 执行任务节点出现异常", e);
  149. }
  150. }
  151. public ObjectStore getOS() {
  152. String ceUsername = SysCfg.getStrConfig("CE.filenetCeAdminUserName");
  153. String password = SysCfg.getStrConfig("CE.filenetCeAdminUserPasswd");
  154. String ceUrl = SysCfg.getStrConfig("CE.CEURL").replace("\\", "");
  155. String objectStore = SysCfg.getStrConfig("CE.ObjectStore");
  156. CEConnection ce = new CEConnection();
  157. ce.establishConnection(ceUsername, password, "FileNetP8", ceUrl);
  158. return ce.fetchOS(objectStore);
  159. }
  160. public void findWorkClassNames() {
  161. try {
  162. String[] workClassNames = vs.fetchWorkClassNames(true);
  163. for (String className : workClassNames) {
  164. logger.info(className + ",");
  165. }
  166. } catch (VWException e) {
  167. logger.error("findWorkClassNames方法 查找所有工作流程名称出现异常", e);
  168. }
  169. }
  170. public void findVwStepList(String queueName, String filter, Object[] substitutionVars) {
  171. try {
  172. VWQueue queue = vs.getQueue(queueName);
  173. queue.setBufferSize(1);
  174. VWQueueQuery qQuery = queue.createQuery(null, null, null, VWQueue.QUERY_NO_OPTIONS, filter, substitutionVars,
  175. VWFetchType.FETCH_TYPE_STEP_ELEMENT);
  176. while (qQuery.hasNext()) {
  177. VWStepElement st = (VWStepElement) qQuery.next();
  178. logger.info(st.getStepName());
  179. }
  180. } catch (VWException e) {
  181. logger.error("findVwStepList方法 查找所有队列内的工作项出现异常", e);
  182. }
  183. }
  184. public void findVwStepList(String queueName) {
  185. try {
  186. VWQueue queue = vs.getQueue(queueName);
  187. int queryFlag = VWQueue.QUERY_READ_LOCKED;
  188. int queryType = VWFetchType.FETCH_TYPE_STEP_ELEMENT;
  189. VWQueueQuery qQuery = queue.createQuery(null, null, null, queryFlag, null, null, queryType);
  190. while (qQuery.hasNext()) {
  191. VWStepElement st = (VWStepElement) qQuery.next();
  192. logger.info("我的手件箱的节点步奏元素----" + st.getStepName() + " | --");
  193. }
  194. } catch (VWException e) {
  195. logger.error("findVwStepList方法出现异常", e);
  196. }
  197. }
  198. /**
  199. *
  200. * <p>Description: </p>
  201. */
  202. public void finvwRoster() {
  203. try {
  204. // 得到默认的花名册
  205. VWRoster vwRoster = vs.getRoster("DefaultRoster");
  206. vwRoster.setBufferSize(25);
  207. VWRosterQuery rosterQuery = vwRoster.createQuery(null, null, null, 0, null, null,
  208. VWFetchType.FETCH_TYPE_ROSTER_ELEMENT);
  209. while (rosterQuery.hasNext()) {
  210. VWRosterElement rosterElement = (VWRosterElement) rosterQuery.next();
  211. logger.info("花名册-----" + rosterElement.getStepName());
  212. }
  213. if (rosterQuery.hasNext()) {
  214. VWRosterElement rosterElement = (VWRosterElement) rosterQuery.next();
  215. VWWorkObject vwworkObject = rosterElement.fetchWorkObject(false, false);
  216. logger.info(vwworkObject.getWorkflowName());
  217. }
  218. } catch (VWException e) {
  219. logger.error("finvwRoster方法 得到默认的花名册出现异常", e);
  220. }
  221. }
  222. public void findQueueNameList() {
  223. String[] queueName;
  224. try {
  225. queueName = vs.fetchQueueNames(VWSession.QUEUE_PROCESS);
  226. if (queueName.length > 0) {
  227. for (String str : queueName) {
  228. logger.info("queueName -- " + str + ",");
  229. }
  230. }
  231. } catch (VWException e) {
  232. logger.error("findQueueNameList方法 得到所有队列名称出现异常", e);
  233. }
  234. }
  235. public void findProcessStepInfoList() {
  236. VWStepProcessorInfo[] processInfo;
  237. try {
  238. processInfo = vs.fetchStepProcessors(VWStepProcessorInfo.PROCESSOR_STEP);
  239. if (processInfo.length > 0) {
  240. for (VWStepProcessorInfo info : processInfo) {
  241. logger.info("流程节点Id --- " + info.getId());
  242. }
  243. }
  244. } catch (VWException e) {
  245. logger.error("findProcessStepInfoList方法出现异常", e);
  246. }
  247. }
  248. public VWWorkObject findWorkObject(String flowNumber) {
  249. String filter = "F_WobNum = :WobNum";
  250. Object[] substitutionVars = { new VWWorkObjectNumber(flowNumber) };
  251. VWRoster vwRoster;
  252. try {
  253. vwRoster = vs.getRoster("DefaultRoster");
  254. VWRosterQuery rQuery = vwRoster.createQuery(null, null, null, VWRoster.QUERY_NO_OPTIONS, filter, substitutionVars,
  255. VWFetchType.FETCH_TYPE_WORKOBJECT);
  256. if (rQuery.hasNext()) {
  257. return (VWWorkObject) rQuery.next();
  258. }
  259. } catch (VWException e) {
  260. logger.error("findWorkObject方法出现异常", e);
  261. }
  262. return null;
  263. }
  264. public void testRetrieveWorkflowInstance(String flowNumber) throws VWException {
  265. String filter = "F_WobNum = :WobNum";
  266. Object[] substitutionVars = { new VWWorkObjectNumber(flowNumber) };
  267. VWRoster vwRoster = vs.getRoster("DefaultRoster");
  268. VWRosterQuery rQuery = vwRoster.createQuery(null, null, null, VWRoster.QUERY_NO_OPTIONS, filter, substitutionVars,
  269. VWFetchType.FETCH_TYPE_WORKOBJECT);
  270. while (rQuery.hasNext()) {
  271. VWWorkObject workObject = (VWWorkObject) rQuery.next();
  272. printFlowInstance(workObject);
  273. }
  274. }
  275. private void printFlowInstance(VWWorkObject flowInstance) throws VWException {
  276. logger.info("\t*******************");
  277. logger.info("\tWork Class Name: " + flowInstance.getWorkClassName());
  278. logger.info("\tWorkflow Number: " + flowInstance.getWorkflowNumber());
  279. logger.info("\tSubject: " + flowInstance.getSubject());
  280. logger.info("\tLaunch Date: " + flowInstance.getLaunchDate());
  281. logger.info("\tAll Data Fields: ");
  282. VWDataField[] dataFields = flowInstance.getDataFields(VWWorkObject.FIELD_USER_DEFINED,
  283. VWWorkObject.FIELD_USER_AND_SYSTEM_DEFINED);
  284. printDataFields(dataFields);
  285. }
  286. private void printDataFields(VWDataField[] dataFields) throws VWException {
  287. for (int i = 0; i < dataFields.length; i++) {
  288. logger.info(dataFields[i].getName() + "=" + dataFields[i].getValue() + ", ");
  289. }
  290. logger.info("\n");
  291. }
  292. // ----------------------------新Demo关于TMS实际业务相关-----------------------------------//
  293. public void findWokInstanceByQueue(String queueName) {
  294. try {
  295. VWQueue queue = vs.getQueue(queueName);
  296. int queryFlag = VWQueue.QUERY_READ_LOCKED;
  297. int queryType = VWFetchType.FETCH_TYPE_WORKOBJECT;
  298. VWQueueQuery qQuery = queue.createQuery(null, null, null, queryFlag, null, null, queryType);
  299. while (qQuery.hasNext()) {
  300. VWWorkObject vobj = (VWWorkObject) qQuery.next();
  301. logger.info("节点元素名称 " + vobj.getStepName() + " 工作实例编号 " + vobj.getWorkflowNumber());
  302. logger.info(vobj.getWorkflowName());
  303. logger.info(DateUtil.dateToStrShort(DateUtil.dateToDateTime(vobj.getDateReceived())));
  304. VWStepElement step = vobj.fetchStepElement();
  305. VWParameter[] pa = step.getParameters(VWFieldType.FIELD_TYPE_STRING, VWStepElement.FIELD_USER_DEFINED);
  306. step.doLock(true);
  307. if (pa != null) {
  308. for (VWParameter vwp : pa) {
  309. if (vwp.getName().contains("_Exer")) {
  310. step.setParameterValue(vwp.getName(), "shenbo", true);
  311. }
  312. step.doSave(false);
  313. logger.info("参数名字-----" + vwp.getName() + "-------参数值--" + vwp.getValue());
  314. }
  315. }
  316. }
  317. } catch (VWException e) {
  318. logger.error("findWokInstanceByQueue方法出现异常", e);
  319. }
  320. }
  321. public VWWorkflowHistory vwFindWorkflowHistory(String workObjNum, int queryflag) {
  322. try {
  323. // 得到工作对象
  324. VWWorkObject workObject = RosterHelper.vwfetchWorkObject(vs, workObjNum, queryflag);
  325. // 得到流程对象
  326. VWProcess vwProcess = workObject.fetchProcess();
  327. VWWorkflowDefinition vwdefine = vwProcess.fetchWorkflowDefinition(false);
  328. VWMapDefinition[] vwdefineMap = vwdefine.getMaps();
  329. for (VWMapDefinition d : vwdefineMap) {
  330. logger.info("mapId == " + d.getMapId());
  331. VWWorkflowHistory vwhistory = vwProcess.fetchFilteredWorkflowHistory(d.getMapId(),
  332. VWProcess.FILTER_COMPLETED_STEP_HISTORY);
  333. while (vwhistory.hasNext()) {
  334. VWStepHistory vwstep = vwhistory.next();
  335. logger.info("节点名称-----" + vwstep.getStepName());
  336. }
  337. }
  338. } catch (VWException e) {
  339. logger.error("vwFindWorkflowHistory方法出现异常", e);
  340. }
  341. return null;
  342. }
  343. /**
  344. *
  345. * <p>Description: 测试附件</p>
  346. * @param queueName
  347. */
  348. public void testAttachment(String queueName, String workObjNum, String paramName) {
  349. try {
  350. VWStepElement step = QueueHelper.getStepElementByWorkObjectNumber(vs.getQueue(queueName), new VWWorkObjectNumber(
  351. workObjNum), VWQueue.QUERY_NO_OPTIONS);
  352. String[] params = step.getParameterNames();
  353. for (String str : params) {
  354. logger.info("节点参数名字 " + str + " || ");
  355. }
  356. VWAttachment[] vwattach = (VWAttachment[]) step.getParameterValue(paramName);
  357. logger.info("附件大小--" + vwattach.length);
  358. for (VWAttachment vw : vwattach) {
  359. logger.info("附件版本---" + vw.getVersion());
  360. logger.info("附件ID----" + vw.getId());
  361. }
  362. } catch (VWException e) {
  363. logger.error("testAttachment方法出现异常", e);
  364. }
  365. }
  366. public ObjectStore getObjectStore(String objStore) {
  367. Domain domain = Factory.Domain.fetchInstance(ceConn, SysCfg.getStrConfig("CE.domain"), null);
  368. return Factory.ObjectStore.fetchInstance(domain, objStore, null);
  369. }
  370. public void testEndProcess() {
  371. }
  372. /**
  373. * 日志查询Wob
  374. * @throws Exception
  375. */
  376. public List<VWLogElement> vwEventLogWob(String filter, Object[] substitutionVars) throws Exception {
  377. VWLog log = vs.fetchEventLog("DefaultEventLog");
  378. List<VWLogElement> les = new ArrayList<VWLogElement>();
  379. VWLogQuery lq = log.startQuery(null, null, null, VWLog.QUERY_NO_OPTIONS, filter, substitutionVars);
  380. // 得到系统所有流程className
  381. while (lq.hasNext()) {
  382. VWLogElement le = lq.next();
  383. logger.info("" + lq.fetchCount());
  384. logger.info("wobNum:" + le.getWorkFlowNumber());
  385. logger.info("stepName:" + le.getStepName());
  386. logger.info("sequence:" + le.getSequenceNumber());
  387. logger.info("eventType:" + le.getEventType());
  388. logger.info("eventTypeName:" + VWLoggingOptionType.getLocalizedString(le.getEventType()));
  389. logger.info("className:" + le.getWorkClassName());
  390. logger.info("userName:" + le.getUserName());
  391. logger.info("Parameters:");
  392. String[] paras = le.getFieldNames();
  393. for (String p : paras) {
  394. logger.info(p + "|");
  395. }
  396. logger.info("");
  397. les.add(le);
  398. }
  399. return les;
  400. }
  401. }