• 使用C#调用P6 Primavera WebService(自建服务IntegrationAPI)


    目录

    Step 1. 自建定制P6 WebService服务

    Step 2. C#调用P6定制 WebService服务 


    近日应一个朋友的邀请提供c#调用p6 webservice的案例,无奈自己已很多年没碰过C#,上一个与此有关的项目还发生在中国人民抗日战争暨世界反法西斯战争胜利70周年,想想还是翻出了自己多年前用VisualStudio写的demo,由此整理出本文。

    本文内容比较简单且核心内容也已包含,结合自己的理解只要简单修改即可运行 ...

    PS:我当时使用的P6版本是 Primavera P6 EPPM R15.1, 非常经典的一个发行版

    在使用C#调用P6 WebService前,你需要了解P6本身的一些特征

    • 从开发语言来讲, Primavera 以Java为主的Web开发体系.
    • Web Service遵守标准规范, 可以跨开发语言调用: net/Java/Pythson etc
    • Primavera用到一些Java技术体系中的开源的库/组件/框架

    因为P6本身Webservicef帆布的方法及用户的特殊需求,不得不使用原生功能重新发布了定制版的服务,所以以下开发的流程或有许些不同

    Step 1. 自建定制P6 WebService服务

    使用IntegrationAPI JAVA 编制P6对外发布的WebService服务(PS: 业务Java工程师多年前整的一个,请忽略架构是否先进

    以下是几个核心的文件内容

    • 配置config.property 
    1. apiServerIp = 192.168.1.251
    2. apiServerPort = 9099
    3. username = admin
    4. password = admin
    • 配置applicationContext.xml,
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xmlns:p="http://www.springframework.org/schema/p"
    5. xmlns:jaxws="http://cxf.apache.org/jaxws"
    6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans
    8. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    9. http://www.springframework.org/schema/context
    10. http://www.springframework.org/schema/context/spring-context-3.0.xsd
    11. http://cxf.apache.org/jaxws
    12. http://cxf.apache.org/schemas/jaxws.xsd">
    13. <import resource="classpath:META-INF/cxf/cxf.xml" />
    14. <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    15. <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    16. <bean id="ws" class="com.campin.tmws.server.service.WebServiceImpl" />
    17. <jaxws:endpoint implementor="#ws" address="/activity">
    18. <jaxws:inInterceptors>
    19. <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
    20. <bean class="com.cnpec.tmws.server.MyAuthInterceptor" />
    21. jaxws:inInterceptors>
    22. jaxws:endpoint>
    23. beans>
    •  Inteface类就不介绍,重点是重写实现 WebServiceImpl
    1. package com.campin.tmws.server.service;
    2. import java.text.DecimalFormat;
    3. import java.util.ArrayList;
    4. import java.util.Date;
    5. import java.util.List;
    6. import javax.jws.WebService;
    7. import org.apache.log4j.Logger;
    8. import com.campin.tmws.server.bean.ActivityDetail;
    9. import com.campin.tmws.server.bean.NewActivity;
    10. import com.campin.tmws.server.bean.NewActivityCodeAssignment;
    11. import com.campin.tmws.server.bean.NewActivityStep;
    12. import com.campin.tmws.server.bean.NewProject;
    13. import com.campin.tmws.server.bean.NewProjectDocument;
    14. import com.campin.tmws.util.ReadConfigFile;
    15. import com.primavera.common.value.ObjectId;
    16. import com.primavera.integration.client.EnterpriseLoadManager;
    17. import com.primavera.integration.client.RMIURL;
    18. import com.primavera.integration.client.Session;
    19. import com.primavera.integration.client.bo.BOIterator;
    20. import com.primavera.integration.client.bo.object.Activity;
    21. import com.primavera.integration.client.bo.object.ActivityCodeAssignment;
    22. import com.primavera.integration.client.bo.object.OBS;
    23. import com.primavera.integration.client.bo.object.Project;
    24. import com.primavera.integration.client.bo.object.ActivityStep;
    25. import com.primavera.integration.client.bo.object.Relationship;
    26. import com.primavera.integration.client.bo.object.User;
    27. import com.primavera.integration.client.bo.object.UserOBS;
    28. import com.primavera.integration.client.bo.object.ProjectDocument;
    29. import com.primavera.integration.common.DatabaseInstance;
    30. /**
    31. *
    32. * @ClassName: WebServiceImpl
    33. * @Description: TODO
    34. * @author Raining Campin Chou
    35. * @date 2015年11月02日
    36. *
    37. */
    38. @WebService(endpointInterface = "com.campin.tmws.server.service.WebServiceInterface", serviceName = "WebServiceImpl", targetNamespace = "http://tmws.campin.com/Primavera/P6/TMWS")
    39. public class WebServiceImpl implements WebServiceInterface {
    40. private String uname = ""; // 链接 p6 用户名
    41. private String password = ""; // 链接 p6 密码
    42. private String apiserverip = ""; // 链接 p6服务器 ip 信息
    43. private int apiserverport = 0; // 链接 p6api服务端口
    44. static Logger logger = Logger.getLogger(WebServiceImpl.class);
    45. public WebServiceImpl() {
    46. ReadConfigFile rcf = new ReadConfigFile();
    47. rcf.read();
    48. this.uname = rcf.getUsername();
    49. this.password = rcf.getPassword();
    50. this.apiserverip = rcf.getApiserverip();
    51. this.apiserverport = rcf.getApiserverport();
    52. }
    53. /**
    54. * @Title: getActivity
    55. * @Description: TODO
    56. * @param @param activityObjectId
    57. * @param @return
    58. * @return NewActivity
    59. * @throws
    60. */
    61. public NewActivity getActivity(Integer activityObjectId) {
    62. NewActivity nactv = new NewActivity();
    63. String sWhereClause = "ObjectId =" + activityObjectId;
    64. Session session = null;
    65. try {
    66. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    67. apiserverport));
    68. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    69. dbInstances[0].getDatabaseId(), uname, password);
    70. String[] actvfields = new Activity(session).getAllFields();
    71. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    72. BOIterator actvIter = elm.loadActivities(actvfields, sWhereClause, null);
    73. if (actvIter.hasNext()) {
    74. Activity actv = actvIter.next();
    75. nactv.setProjectId(actv.getProjectId());
    76. nactv.setProjectName(actv.getProjectName());
    77. nactv.setWBSCode(actv.getWBSCode());
    78. nactv.setWBSName(actv.getWBSName());
    79. nactv.setObjectId(actv.getObjectId().toInteger());
    80. nactv.setId(actv.getId());
    81. nactv.setName(actv.getName());
    82. // 工程公司非实际完成百分比,初定定为工期完成百分比
    83. nactv.setPercentComplete(new DecimalFormat("######0.000").format((actv.getPhysicalPercentComplete().doubleValue())));
    84. if (actv.getPlannedStartDate() != null) {
    85. nactv.setPlannedStartDate(actv.getPlannedStartDate().toString().substring(0, 10));
    86. }
    87. if (actv.getPlannedFinishDate() != null) {
    88. nactv.setPlannedFinishDate(actv.getPlannedFinishDate().toString().substring(0, 10));
    89. }
    90. if (actv.getActualStartDate() != null) {
    91. nactv.setActualStartDate(actv.getActualStartDate().toString().substring(0, 10));
    92. }
    93. if (actv.getActualFinishDate() != null) {
    94. nactv.setActualFinishDate(actv.getActualFinishDate().toString().substring(0, 10));
    95. }
    96. if (actv.getRemainingEarlyStartDate() != null && actv.getRemainingEarlyFinishDate() != null) {
    97. nactv.setRemainDay((int) ((actv.getRemainingEarlyFinishDate().getTime() - actv.getRemainingEarlyStartDate().getTime()) / (1000 * 24 * 60 * 60)) + 1);
    98. } else {
    99. nactv.setRemainDay(0);
    100. }
    101. }
    102. } catch (Exception e) {
    103. e.printStackTrace();
    104. } finally {
    105. if (session != null)
    106. session.logout();
    107. }
    108. return nactv;
    109. }
    110. /**
    111. * @Title: getAllActivities
    112. * @Description: TODO
    113. * @param @param username
    114. * @param @param key
    115. * @param @param projid
    116. * @param @return
    117. * @return List
    118. * @throws
    119. */
    120. @SuppressWarnings("static-access")
    121. public List getAllActivities(String username, String key, Integer projid) {
    122. List list = new ArrayList();
    123. /**
    124. * 分多种情况组合筛选条件 1 初始化过滤作业状态和作业类型 2 过滤项目 / 项目分组 , 一次性只能过滤查看一个项目 3
    125. * 过滤关键字,包括作业名称和作业代码
    126. */
    127. String sWhereClause = "Status = 'In Progress'";
    128. sWhereClause += " AND Type in('Task Dependent','Resource Dependent','Start Milestone','Finish Milestone')";
    129. if (projid > 0) {
    130. sWhereClause += " AND ProjectObjectId =" + projid + " AND Status = 'In Progress'";
    131. } else {
    132. sWhereClause += " AND ProjectObjectId in(" + getProIds(username) + ")";
    133. }
    134. if (key != null) {
    135. if (key.length() > 0) {
    136. sWhereClause += " AND ( Name LIKE '%" + key + "%' OR Id LIKE '%" + key + "%')";
    137. }
    138. }
    139. // System.out.println("************* sWhereClause: "+sWhereClause);
    140. Session session = null;
    141. try {
    142. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    143. apiserverport));
    144. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    145. dbInstances[0].getDatabaseId(), uname, password);
    146. String[] actvfields = new Activity(session).getAllFields();
    147. String sOrderBy = "ProjectName Asc and PlannedStartDate Asc";
    148. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    149. BOIterator actvIter = elm.loadActivities(actvfields, sWhereClause, sOrderBy);
    150. while (actvIter.hasNext()) {
    151. NewActivity nactv = new NewActivity();
    152. Activity actv = actvIter.next();
    153. nactv.setProjectId(actv.getProjectId());
    154. nactv.setProjectName(actv.getProjectName());
    155. nactv.setWBSCode(actv.getWBSCode());
    156. nactv.setWBSName(actv.getWBSName());
    157. nactv.setObjectId(actv.getObjectId().toInteger());
    158. nactv.setId(actv.getId());
    159. nactv.setName(actv.getName());
    160. // 工程公司非实际完成百分比,初定定为工期完成百分比
    161. nactv.setPercentComplete(new DecimalFormat("######0.000").format(actv.getPercentComplete().doubleValue()));
    162. // nactv.setActualFinishDate(actv.getPercentComplete().doubleValue());
    163. if (actv.getPlannedStartDate() != null) {
    164. nactv.setPlannedStartDate(actv.getPlannedStartDate().toString().substring(0, 10));
    165. }
    166. if (actv.getPlannedFinishDate() != null) {
    167. nactv.setPlannedFinishDate(actv.getPlannedFinishDate().toString().substring(0, 10));
    168. }
    169. if (actv.getActualStartDate() != null) {
    170. nactv.setActualStartDate(actv.getActualStartDate().toString().substring(0, 10));
    171. }
    172. if (actv.getActualFinishDate() != null) {
    173. nactv.setActualFinishDate(actv.getActualFinishDate().toString().substring(0, 10));
    174. }
    175. if (actv.getRemainingEarlyStartDate() != null && actv.getRemainingEarlyFinishDate() != null) {
    176. nactv.setRemainDay((int) ((actv.getRemainingEarlyFinishDate().getTime() - actv.getRemainingEarlyStartDate().getTime()) / (1000 * 24 * 60 * 60)) + 1);
    177. } else {
    178. nactv.setRemainDay(0);
    179. }
    180. list.add(nactv);
    181. }
    182. } catch (Exception e) {
    183. e.printStackTrace();
    184. } finally {
    185. if (session != null)
    186. session.logout();
    187. }
    188. return list;
    189. }
    190. /**
    191. * @Title: getAllActivitySizeByFilter
    192. * @Description: TODO
    193. * @param @param username
    194. * @param @param key
    195. * @param @param projid
    196. * @param @return
    197. * @return int
    198. * @throws
    199. */
    200. // 仅限过滤查询时判断总数目用
    201. private int getAllActivitySizeByFilter(String username, String key, Integer projid) {
    202. int actvlen = 0;
    203. String sWhereClause = "Status = 'In Progress'";
    204. sWhereClause += " AND Type in('Task Dependent','Resource Dependent','Start Milestone','Finish Milestone')";
    205. if (projid > 0) {
    206. sWhereClause += " AND ProjectObjectId =" + projid;
    207. } else {
    208. sWhereClause += " AND ProjectObjectId in(" + getProIds(username) + ")";
    209. }
    210. if (key != null) {
    211. if (key.length() > 0) {
    212. sWhereClause += " AND ( Name LIKE '%" + key + "%' OR Id LIKE '%" + key + "%')";
    213. }
    214. }
    215. Session session = null;
    216. try {
    217. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    218. apiserverport));
    219. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    220. dbInstances[0].getDatabaseId(), uname, password);
    221. String[] actvfields = new Activity(session).getAllFields();
    222. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    223. BOIterator actvIter = elm.loadActivities(actvfields, sWhereClause, null);
    224. actvlen = actvIter.getAll().length;
    225. } catch (Exception e) {
    226. e.printStackTrace();
    227. } finally {
    228. if (session != null)
    229. session.logout();
    230. }
    231. return actvlen;
    232. }
    233. /**
    234. * (Not Javadoc)
    235. *

      Title: getActivitySize

    236. *

      Description:

    237. * @param username
    238. * @return
    239. * @see com.campin.tmws.server.service.WebServiceInterface#getActivitySize(java.lang.String)
    240. */
    241. @Override
    242. public int getActivitySize(String username) {
    243. int result = -2;
    244. String sWhereClause = "Name = '" + username + "'";
    245. Session session = null;
    246. try {
    247. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    248. apiserverport));
    249. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    250. dbInstances[0].getDatabaseId(), uname, password);
    251. String[] userfields = new User(session).getAllFields();
    252. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    253. // 检验P6系统是否存在该帐号
    254. BOIterator userIter = elm.loadUsers(userfields, sWhereClause, null);
    255. if (userIter.hasNext()) {
    256. result = -1;
    257. }
    258. if (result == -1) {
    259. if (getUserOBSIds(username).length() > 0) {
    260. result = getAllActivitySize(username);
    261. }
    262. }
    263. } catch (Exception e) {
    264. e.printStackTrace();
    265. } finally {
    266. if (session != null)
    267. session.logout();
    268. }
    269. return result;
    270. }
    271. /**
    272. *

      Title: getActivities

    273. *

      Description:

    274. * @param username
    275. * @param pageIndex
    276. * @param pageSize
    277. * @return
    278. * @see com.campin.tmws.server.service.WebServiceInterface#getActivities(java.lang.String, int, int)
    279. */
    280. @Override
    281. public List getActivities(String username, int pageIndex, int pageSize) {
    282. int size = getAllActivitySize(username);
    283. // 当总页数末尾值大于 实际值时,作业罗列到实际值
    284. if (size < pageSize * pageIndex) {
    285. return getAllActivities(username, null, 0).subList(pageSize * (pageIndex - 1), size);
    286. }
    287. return getAllActivities(username, null, 0).subList(pageSize * (pageIndex - 1), pageSize * pageIndex);
    288. }
    289. // @Override
    290. public List getActivitiesByFilter(String username, String key, Integer projid, int pageIndex, int pageSize) {
    291. int size = getAllActivitySizeByFilter(username, key, projid);
    292. // 当总页数末尾值大于 实际值时,作业罗列到实际值
    293. if (size < pageSize * pageIndex) {
    294. return getAllActivities(username, key, projid).subList(pageSize * (pageIndex - 1), size);
    295. }
    296. return getAllActivities(username, key, projid).subList(pageSize * (pageIndex - 1), pageSize * pageIndex);
    297. }
    298. /**
    299. * (Not Javadoc)
    300. *

      Title: getActivityDetail

    301. *

      Description:

    302. * @param activityObjectId
    303. * @return
    304. * @see com.campin.tmws.server.service.WebServiceInterface#getActivityDetail(java.lang.Integer)
    305. */
    306. @Override
    307. public ActivityDetail getActivityDetail(Integer activityObjectId) {
    308. ActivityDetail ad = new ActivityDetail();
    309. ad.setActivity(getActivity(activityObjectId));
    310. ad.setActvCodeAssSize(getActivityCodeAssignment(activityObjectId).size());
    311. // ad.setActvCodeAss(getActivityCodeAssignment(activityObjectId));
    312. ad.setDocSize(getActivityDocument(activityObjectId).size());
    313. // ad.setDocs(getProjectDocument(activityObjectId));
    314. ad.setStepSize(getActivityStep(activityObjectId).size());
    315. // ad.setSteps(getActivityStep(activityObjectId));
    316. ad.setPredecessorsSize(getActivityPredecessors(activityObjectId).size());
    317. // ad.setPredecessors(getActivityPredecessors(activityObjectId));
    318. ad.setSuccessorsSize(getActivitySuccessors(activityObjectId).size());
    319. // ad.setSuccessors(getActivitySuccessors(activityObjectId));
    320. return ad;
    321. }
    322. /**
    323. * (Not Javadoc)
    324. *

      Title: getActivityCodeAssignment

    325. *

      Description:

    326. * @param activityObjectId
    327. * @return
    328. * @see com.campin.tmws.server.service.WebServiceInterface#getActivityCodeAssignment(java.lang.Integer)
    329. */
    330. @Override
    331. public List getActivityCodeAssignment(Integer activityObjectId) {
    332. List list = new ArrayList();
    333. String sWhereClause = "ActivityObjectId = " + activityObjectId;
    334. Session session = null;
    335. try {
    336. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    337. apiserverport));
    338. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    339. dbInstances[0].getDatabaseId(), uname, password);
    340. String[] Assfields = new ActivityCodeAssignment(session).getAllFields();
    341. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    342. BOIterator assIter = elm.loadActivityCodeAssignments(Assfields, sWhereClause, null);
    343. while (assIter.hasNext()) {
    344. NewActivityCodeAssignment nass = new NewActivityCodeAssignment();
    345. ActivityCodeAssignment ass = assIter.next();
    346. nass.setActivityObjectId(activityObjectId);
    347. nass.setActivityCodeTypeName(ass.getActivityName());
    348. nass.setActivityCodeValue(ass.getActivityCodeValue());
    349. nass.setActivityCodeTypeName(ass.getActivityCodeTypeName());
    350. nass.setActivityCodeDescription(ass.getActivityCodeDescription());
    351. list.add(nass);
    352. }
    353. } catch (Exception e) {
    354. e.printStackTrace();
    355. } finally {
    356. if (session != null)
    357. session.logout();
    358. }
    359. return list;
    360. }
    361. /**
    362. * (Not Javadoc)
    363. *

      Title: getActivityStep

    364. *

      Description:

    365. * @param activityObjectId
    366. * @return
    367. * @see com.campin.tmws.server.service.WebServiceInterface#getActivityStep(java.lang.Integer)
    368. */
    369. @Override
    370. public List getActivityStep(Integer activityObjectId) {
    371. List list = new ArrayList();
    372. // 传入条件查询参数
    373. String sWhereClause = "ActivityObjectId = " + activityObjectId;
    374. Session session = null;
    375. try {
    376. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    377. apiserverport));
    378. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    379. dbInstances[0].getDatabaseId(), uname, password);
    380. String[] stepfields = new ActivityStep(session).getAllFields();
    381. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    382. BOIterator stepIter = elm.loadActivitySteps(stepfields, sWhereClause, null);
    383. while (stepIter.hasNext()) {
    384. NewActivityStep nstep = new NewActivityStep();
    385. ActivityStep step = stepIter.next();
    386. nstep.setActivityObjectId(activityObjectId);
    387. nstep.setActivityName(step.getActivityName());
    388. nstep.setName(step.getName());
    389. nstep.setWeight(step.getWeight());
    390. nstep.setWeightPercent(step.getWeightPercent().doubleValue());
    391. nstep.setPercentComplete(step.getPercentComplete().doubleValue());
    392. list.add(nstep);
    393. }
    394. } catch (Exception e) {
    395. e.printStackTrace();
    396. } finally {
    397. if (session != null)
    398. session.logout();
    399. }
    400. return list;
    401. }
    402. /**
    403. * (Not Javadoc)
    404. *

      Title: getActivityDocument

    405. *

      Description:

    406. * @param activityObjectId
    407. * @return
    408. * @see com.campin.tmws.server.service.WebServiceInterface#getActivityDocument(java.lang.Integer)
    409. */
    410. @Override
    411. public List getActivityDocument(Integer activityObjectId) {
    412. List list = new ArrayList();
    413. String sWhereClause = "ActivityObjectId = " + activityObjectId;
    414. Session session = null;
    415. try {
    416. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    417. apiserverport));
    418. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    419. dbInstances[0].getDatabaseId(), uname, password);
    420. String[] docfields = new ProjectDocument(session).getAllFields();
    421. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    422. BOIterator stepIter = elm.loadProjectDocuments(docfields, sWhereClause, null);
    423. while (stepIter.hasNext()) {
    424. NewProjectDocument ndoc = new NewProjectDocument();
    425. ProjectDocument doc = stepIter.next();
    426. ndoc.setActivityObjectId(activityObjectId);
    427. ndoc.setActivityName(doc.getActivityName());
    428. ndoc.setObjectId(doc.getObjectId().toInteger());
    429. ndoc.setDocumentTitle(doc.getDocumentTitle());
    430. list.add(ndoc);
    431. }
    432. } catch (Exception e) {
    433. e.printStackTrace();
    434. } finally {
    435. if (session != null)
    436. session.logout();
    437. }
    438. return list;
    439. }
    440. /**
    441. * @Title: getUserOBSIds
    442. * @Description: TODO
    443. * @param @param username
    444. * @param @return
    445. * @return String
    446. * @throws
    447. */
    448. @SuppressWarnings("static-access")
    449. private String getUserOBSIds(String username) {
    450. // 传入条件查询参数
    451. String sWhereClause = "UserName ='" + username + "' ", ids = "";
    452. Session session = null;
    453. try {
    454. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    455. apiserverport));
    456. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    457. dbInstances[0].getDatabaseId(), uname, password);
    458. String[] userOBSfields = new UserOBS(session).getAllFields();
    459. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    460. BOIterator userOBSIter = elm.loadUserOBS(userOBSfields, sWhereClause, null);
    461. while (userOBSIter.hasNext()) {
    462. UserOBS ub = userOBSIter.next();
    463. ids += ub.getOBSObjectId() + ",";
    464. }
    465. } catch (Exception e) {
    466. e.printStackTrace();
    467. } finally {
    468. if (session != null)
    469. session.logout();
    470. }
    471. if (ids.length() > 0) {
    472. ids = ids.substring(0, ids.length() - 1);
    473. }
    474. return ids;
    475. }
    476. /**
    477. * @Title: getOBSChirdren
    478. * @Description: TODO
    479. * @param @param username
    480. * @param @return
    481. * @return String
    482. * @throws
    483. */
    484. public String getOBSChirdren(String username) {
    485. String ids = getUserOBSIds(username);
    486. String sWhereClause = "ParentObjectId in(" + ids + ")";
    487. ids += ",";
    488. Session session = null;
    489. try {
    490. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    491. apiserverport));
    492. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    493. dbInstances[0].getDatabaseId(), uname, password);
    494. String[] obsfields = new OBS(session).getAllFields();
    495. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    496. BOIterator ot1 = elm.loadOBS(obsfields, sWhereClause, null);
    497. OBS o1 = null;
    498. while (ot1.hasNext()) {
    499. o1 = ot1.next();
    500. ids += o1.getObjectId() + ",";
    501. // 第二次子节点
    502. BOIterator ot2 = o1.loadOBSChildren(new String[] { "ObjectId", "Name" }, null, null);
    503. while (ot2.hasNext()) {
    504. OBS o2 = ot2.next();
    505. ids += o2.getObjectId() + ",";
    506. // 第三次子节点
    507. BOIterator ot3 = o2.loadOBSChildren(obsfields, null, null);
    508. while (ot3.hasNext()) {
    509. OBS o3 = ot3.next();
    510. ids += o3.getObjectId() + ",";
    511. // 第四次子节点
    512. BOIterator ot4 = o3.loadOBSChildren(obsfields, null, null);
    513. while (ot4.hasNext()) {
    514. OBS o4 = ot4.next();
    515. ids += o4.getObjectId() + ",";
    516. // 第五次子节点
    517. BOIterator ot5 = o4.loadOBSChildren(obsfields, null, null);
    518. while (ot5.hasNext()) {
    519. OBS o5 = ot5.next();
    520. ids += o5.getObjectId() + ",";
    521. // 第六次子节点
    522. BOIterator ot6 = o5.loadOBSChildren(obsfields, null, null);
    523. while (ot6.hasNext()) {
    524. OBS o6 = ot6.next();
    525. ids += o6.getObjectId() + ",";
    526. // 第七次子节点
    527. BOIterator ot7 = o6.loadOBSChildren(obsfields, null, null);
    528. while (ot7.hasNext()) {
    529. OBS o7 = ot7.next();
    530. ids += o7.getObjectId() + ",";
    531. }
    532. }
    533. }
    534. }
    535. }
    536. }
    537. }
    538. } catch (Exception e) {
    539. e.printStackTrace();
    540. } finally {
    541. if (session != null)
    542. session.logout();
    543. }
    544. return ids = ids.substring(0, ids.length() - 1);
    545. }
    546. @SuppressWarnings("static-access")
    547. public String getProIds(String username) {
    548. // 传入条件查询参数
    549. String sWhereClause = "OBSObjectId in(" + getOBSChirdren(username) + ")", pids = "";
    550. Session session = null;
    551. try {
    552. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    553. apiserverport));
    554. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    555. dbInstances[0].getDatabaseId(), uname, password);
    556. String[] projfields = new Project(session).getAllFields();
    557. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    558. BOIterator projIter = elm.loadProjects(projfields, sWhereClause, null);
    559. while (projIter.hasNext()) {
    560. pids += projIter.next().getObjectId() + ",";
    561. }
    562. } catch (Exception e) {
    563. e.printStackTrace();
    564. } finally {
    565. if (session != null)
    566. session.logout();
    567. }
    568. return pids.substring(0, pids.length() - 1);
    569. }
    570. /**
    571. * @Title: getProjectList
    572. * @Description: TODO
    573. * @param @param username
    574. * @param @return
    575. * @return List
    576. * @throws
    577. */
    578. public List getProjectList(String username) {
    579. List list = new ArrayList();
    580. String sWhereClause = "OBSObjectId in(" + getOBSChirdren(username) + ")";
    581. Session session = null;
    582. try {
    583. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    584. apiserverport));
    585. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    586. dbInstances[0].getDatabaseId(), uname, password);
    587. String[] projfields = new Project(session).getAllFields();
    588. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    589. BOIterator projIter = elm.loadProjects(projfields, sWhereClause, null);
    590. while (projIter.hasNext()) {
    591. Project p = projIter.next();
    592. NewProject np = new NewProject();
    593. np.setObjectid(p.getObjectId().toInteger());
    594. np.setId(p.getId());
    595. np.setName(p.getName());
    596. list.add(np);
    597. }
    598. } catch (Exception e) {
    599. e.printStackTrace();
    600. } finally {
    601. if (session != null)
    602. session.logout();
    603. }
    604. return list;
    605. }
    606. /**
    607. * @Title: getActivityPredecessors
    608. * @Description: TODO
    609. * @param @param activityObjectId
    610. * @param @return
    611. * @return List
    612. * @throws
    613. */
    614. public List getActivityPredecessors(Integer activityObjectId) {
    615. List list = new ArrayList();
    616. Session session = null;
    617. try {
    618. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    619. apiserverport));
    620. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    621. dbInstances[0].getDatabaseId(), uname, password);
    622. String[] rsfields = new Relationship(session).getAllFields();
    623. BOIterator rsIter = new Activity(session, new ObjectId(activityObjectId)).loadPredecessorRelationships(rsfields,
    624. null, null);
    625. while (rsIter.hasNext()) {
    626. Relationship re = rsIter.next();
    627. NewActivity nactv = new NewActivity();
    628. nactv.setObjectId(re.getPredecessorActivityObjectId().toInteger());
    629. nactv.setId(re.getPredecessorActivityId());
    630. nactv.setName(re.getPredecessorActivityName());
    631. nactv.setProjectId(re.getPredecessorProjectId());
    632. nactv.setWBSName(re.getPredecessorWbsName());
    633. list.add(nactv);
    634. }
    635. } catch (Exception e) {
    636. e.printStackTrace();
    637. } finally {
    638. if (session != null)
    639. session.logout();
    640. }
    641. return list;
    642. }
    643. /**
    644. * @Title: userValidate
    645. * @Description: TODO
    646. * @param @param username
    647. * @param @return
    648. * @return int
    649. * @throws
    650. */
    651. private int userValidate(String username) {
    652. int result = -1;
    653. String sWhereClause = "Name = '" + username + "'";
    654. Session session = null;
    655. try {
    656. DatabaseInstance[] dbInstances = Session.getDatabaseInstances(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip,
    657. apiserverport));
    658. session = Session.login(RMIURL.getRmiUrl(RMIURL.STANDARD_RMI_SERVICE, apiserverip, apiserverport),
    659. dbInstances[0].getDatabaseId(), uname, password);
    660. String[] userfields = new User(session).getAllFields();
    661. EnterpriseLoadManager elm = session.getEnterpriseLoadManager();
    662. // 检验P6系统是否存在该帐号
    663. BOIterator userIter = elm.loadUsers(userfields, sWhereClause, null);
    664. while (userIter.hasNext()) {
    665. result = 0;
    666. }
    667. if (result == 0) {
    668. if (getUserOBSIds(username).length() > 0) {
    669. result = 1;
    670. }
    671. }
    672. } catch (Exception e) {
    673. e.printStackTrace();
    674. } finally {
    675. if (session != null)
    676. session.logout();
    677. }
    678. return result;
    679. }
    680. }

    以上完成编程后,最终发布定制服务如下,这里WebService用的是传统的SOAP协议

     

    Step 2. C#调用P6定制 WebService服务 

    以上定制服务顺利发布之后,后续的操作就简单多了,打开VisualStudio直接新建项目

    直接引用接口方法

    用C语言输出要显示的内容即可

    1. using wsdemo.P6EPSWBSWebService;
    2. using wsdemo.P6ProjectWebService;
    3. using wsdemo.P6ActivityService;
    4. namespace wsdemo
    5. {
    6. public partial class epsdemo : System.Web.UI.Page
    7. {
    8. protected void Page_Load(object sender, EventArgs e)
    9. {
    10. // 测试方法1(demo),根据项目代码获取项目名称
    11. EPSWBSWebService epsService = new EPSWBSWebService();
    12. Response.Write(epsService.demo("CS-Plan") + "
      "
      );
    13. P6EPSWBSWebService.NewEPS[] epss = epsService.loadEPS("kping");
    14. for (int i = 0; i < epss.Length; i++)
    15. {
    16. Response.Write(" ---------------
      "
      );
    17. Response.Write(" | EPS编号:" + epss[i].objectId);
    18. Response.Write(" | EPS编码:" + epss[i].id);
    19. Response.Write(" | EPS名称:" + epss[i].name);
    20. }
    21. 测试方法2(loadProjectByUser),根据用户登录名查询其所能看到的project
    22. //ProjectWebService projservice = new ProjectWebService();
    23. //P6ProjectWebService.NewProject[] projs = projservice.loadProjectByUser("kping");
    24. //for (int i = 0; i < projs.Length; i++)
    25. //{
    26. // Response.Write(" 项目加载测试---------------
      ");
    27. // Response.Write(" | 项目编号:" + projs[i].objectId);
    28. // Response.Write(" | 项目编码:" + projs[i].id);
    29. // Response.Write(" | 项目名称:" + projs[i].name);
    30. //}
    31. 测试方法3(loadAllActivities),根据查询某项目下所有作业信息
    32. //ActivityWebService actvservice = new ActivityWebService();
    33. //NewActivity[] actvs = actvservice.loadAllActivities(null, null, 644, true);
    34. //for (int i = 0; i < actvs.Length; i++) {
    35. // Response.Write(" 项目加载测试---------------
      ");
    36. // Response.Write(" | 作业编号:" + actvs[i].objectId);
    37. // Response.Write(" | 作业编码:" + actvs[i].id);
    38. // Response.Write(" | 作业名称:" + actvs[i].name);
    39. // Response.Write(" | 作业计划开始:" + actvs[i].plannedStartDate);
    40. // Response.Write(" | 作业计划完成:" + actvs[i].plannedFinishDate);
    41. // Response.Write(" | 作业WBS编号:" + actvs[i].WBSObjectId);
    42. // Response.Write(" | 作业项目编号:" + actvs[i].projectObjectId);
    43. //}
    44. 测试方法4(updateActivity),修改作业信息
    45. //NewActivityDetail a1 = actvservice.getActivityDetail(51992, true);
    46. //a1.activity.name = "ABCDEFGG";
    47. //a1.activity.plannedStartDate = "2016-03-10";
    48. //Response.Write("name2: " + a1.activity.name);
    49. //actvservice.updateActivity(a1.activity);
    50. 测试方法5(addActivityDirect),增加作业信息
    51. //NewActivity new1 = new NewActivity();
    52. //new1.objectId = 160322003;;
    53. //new1.WBSObjectId = 11391;
    54. //new1.name = "测试号";
    55. //new1.id = "AX001002004";
    56. //new1.name = "测试作业名称2";
    57. //new1.plannedStartDate = "2016-01-01";
    58. //new1.plannedFinishDate = "2016-01-06";
    59. //new1.actualStartDate = "2016-01-02";
    60. //actvservice.addActivityDirect(new1);
    61. }
    62. }
    63. }

    以上代码运行即可打印出所连接P6的所有项目名称信息

    PS:笔者非专职程序员,以上案例项目源码考虑特殊原因无法提供

    还是那句话,这个行业的分享不多,希望更多感兴趣的朋友一同参与,探讨或合作 !

    本人可提供Oracle 多种产品技术服务,包括产品的部署和维护及培训,欢迎与我取得联系!

    如何联系蚕豆哥_蚕豆哥的博客-CSDN博客https://campin.blog.csdn.net/article/details/52950969

  • 相关阅读:
    分享66个Python管理系统源代码总有一个是你想要的
    C# WPF入门学习主线篇(三十三)—— 使用ICommand实现命令绑定
    Vue2与Vue3实例的深入比较:响应式系统、模板编译和性能分析
    spoof_call的分析与改进
    Python 08学习之文件操作
    高级篇之ENC1V2新用法USB/RS232串口转Visca-Over-IP
    QGIS添加在线底图
    JDBC学习笔记(2)事务
    第三章 解析python中opencv,matpoltlib与pillow对JPG和PNG读取和写入(工具)
    k8s存储卷 PV和PVC
  • 原文地址:https://blog.csdn.net/kping0306/article/details/127738584