基于Oracle Agile PLM系统的二次开发——延期项目提醒

基于Oracle Agile PLM系统的二次开发——延期项目提醒

.PLM概述

在今天由于全球化竞争、提升客户满意度以及业务脚步的快速提升都市足以强迫任一单位必须将产品快速的导入市场也就是挤压产品的利润周期。

此外,为了降低成本和提升效率,各个企业都在全球各地增加人力以及供应伙伴,以提升企业的竞争力。在这种高度竞争的市场环境下,企业的成功要素就包含了:

1.快速推出产品

2.更积极有效的管理产品与流程

3.提交最高质量与最高效用的产品

4在更加复杂的全球供应链有效的进行沟通与协同作业

解决方案就是针对上述的挑战的解决方案并提供各个产业在现今竞争激烈的环境拔得头筹。同时Agile PLM解决方案也可使企业完整管理从产品设计、询价、制造、销售与售后服务的整个环节。在这每一个解决方案的主要核心就是产品纪录Product Record也就是在产品利润周期内各阶段的必要数据。例如对产品定义而言,则包含BOM表、零部件属性、图纸及模型、规范、型录及版本变更历史﹔就策略采购而言,就包含如AML,零部件价格以及产品价格历史等﹔就产品支持、服务和维修方面,则包含产品服务指令、质量数据及缺陷数据等。

解决方案由下列商业就绪(Business Ready)的解决方案所组成:

AProduct Collaboration(产品协同)

1.Product Cost Management(产品管理)

2.Product Service & Improvement(产品服务及改善)

3.Product Portfolio Management(产品组合管理)

4.Product Governance & Compliance(产品管理与法令)

5Engineering Collaboration(工程协同)

每一个解决方案都提供企业体在供应炼各方面的高度透明度,强化客户与供货商降低成本、提升效率并更快制造出更好、更具利润产品的能力。所有Agile解决方案都是构筑在Agile PLM Platform上。Agile PLM Platform是一个功能强大的标准化、安全以及可扩张性的架构平台。这个平台可确保客户快速且价格低廉(cost effective)的实施上线。

本功能是PLM自身并不具备,而在生产管理过程中又是必需的。将本功能集成以后,将改变原有系统手动检查,比对,整理和发送邮件的状态。

二.本次开发的概况

需求:项目延期(延期天数精准到小数点后两位)超过5天的,发送邮件及站内信给项目所有者的直接主管;

项目延期超过10天的,发送邮件及站内信给项目所有者的直接主管和间接主管。

邮件格式:(包括但不限于)

主题:项目类型,项目名,是否延期

内容:项目父,根,项目组名,项目组角色,计划完成时间等。

核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
private  static  void  getStatus(IAgileSession session, String num) {
try  {
IProgram program = (IProgram) session.getObject(IProgram.OBJECT_TYPE, num);
if  (program !=  null ) {
ITable tblSch = program.getTable(ProgramConstants.TABLE_SCHEDULE);
Iterator itSch = tblSch.iterator();
while  (itSch.hasNext()) {
IRow rowSch = (IRow) itSch.next();
Map map = rowSch.getValues();
String sub_num = (String) map.get(ProgramConstants.ATT_SCHEDULE_NUMBER);
String type = rowSch.getValue(ProgramConstants.ATT_SCHEDULE_TYPE).toString();
if ( "任务" .equals(type)) {
String statusOverall = rowSch.getValue(ProgramConstants.ATT_SCHEDULE_OVERALL_STATUS).toString();
IDataObject dataObjectTask = rowSch.getReferent();
if (dataObjectTask  instanceof  IProgram){
}
if  (STATUS_OVERALL_CH.equals(statusOverall)) {
String owner = rowSch.getValue(ProgramConstants.ATT_SCHEDULE_OWNER).toString();
IUser[] users = MailUtils.getSupervisor(session, owner);
IUser[] directors = {users[ 0 ]};
//If only status overall is abnormal,then mail to owner
MailUtils.add(mailMap, owner,sub_num);
//if delayed time of this task has surpassed six days,then mail to its owner and owner's director
IProgram programTask = (IProgram) session.getObject(IProgram.OBJECT_TYPE, sub_num);
ITable tblGnrInfo = programTask.getTable(ProgramConstants.TABLE_GENERALINFO);
Iterator itGnrInfo = tblGnrInfo.iterator();
ITable tblTeam = programTask.getTable(ProgramConstants.TABLE_TEAM);
Iterator itTeam = tblTeam.iterator();
IRow rowTeam =  null ;
while (itTeam.hasNext()){
rowTeam = (IRow) itTeam.next();
Map mapTeam = rowTeam.getValues();
}
while (itGnrInfo.hasNext()){
IRow rowGnrInfo = (IRow) itGnrInfo.next();
Map mapGnrInfo = rowGnrInfo.getValues();
String status = rowGnrInfo.getValue(ProgramConstants.ATT_GENERAL_INFO_STATUS).toString();
//three kinds of status in all
if (STATUS_NOT_START_CH.equals(status)){
SimpleDateFormat df =  new  SimpleDateFormat( "yyyy-mm-dd hh:mm:ss" );
String dateSchedule = rowGnrInfo.getValue(ProgramConstants.ATT_GENERAL_INFO_SCHEDULE_START_DATE).toString();
double  dayNumDelayed = MailUtils.getWorkDays( new  Date(dateSchedule),  new  Date());
if (dayNumDelayed >= DAYS_DELAY_ALARM_THRESHOLD_INDIRECT){
programTask.send(users,  new  MailTaskTemplate(rowSch, rowGnrInfo, rowTeam).toString());
System.out.println( "Has sent a email about delayed task:"  +
rowSch.getValue(ProgramConstants.ATT_SCHEDULE_NAME) +  "to director & indirector:"  + users[ 0 ].getName() +
" & "  + users[ 1 ].getName() +  " successfully" );
else  if (dayNumDelayed >= DAY_DELAYED_ALARM_THRESHOLD_DIRECT){
programTask.send(directors,  new  MailTaskTemplate(rowSch, rowGnrInfo, rowTeam).toString());
System.out.println( "Has sent a email about delayed task:"  +
rowSch.getValue(ProgramConstants.ATT_SCHEDULE_NAME) +  " to director:"  + directors[ 0 ].getName() +  " successfully" );
}
} else  if (STATUS_FINISHED_CH.equals(status)){
//has finished but delayed,overall status and schedule status is normal!!!
} else  if (status.contains(STATUS_PROCESSING_CH)){
//processing:1.startTime is delayed or duration is delayed
double  scheduleDuration = Double.parseDouble(rowGnrInfo.getValue(ProgramConstants.ATT_GENERAL_INFO_SCHEDULE_DURATION).toString());
double  actualDuration = Double.parseDouble(rowGnrInfo.getValue(ProgramConstants.ATT_GENERAL_INFO_ACTUAL_DURATION_VARIANCE_WORK_DAYS).toString());
double  delayDaysStarted = Double.parseDouble(rowGnrInfo.getValue(ProgramConstants.ATT_GENERAL_INFO_ACTUAL_START_VARIANCE_WORK_DAYS).toString());
if (delayDaysStarted >= DAYS_DELAY_ALARM_THRESHOLD_INDIRECT || actualDuration - scheduleDuration >= DAYS_DELAY_ALARM_THRESHOLD_INDIRECT){
programTask.send(directors,  new  MailTaskTemplate(rowSch, rowGnrInfo, rowTeam).toString());
System.out.println( "Has sent a email about delayed task:"  +
rowSch.getValue(ProgramConstants.ATT_SCHEDULE_NAME) +  " to director and indirector:"  + users[ 0 ].getName() +
" & "  + users[ 1 ].getName()  +  " successfully" );
else  if (delayDaysStarted >= DAY_DELAYED_ALARM_THRESHOLD_DIRECT || actualDuration - scheduleDuration >= DAY_DELAYED_ALARM_THRESHOLD_DIRECT){
programTask.send(users,  new  MailTaskTemplate(rowSch, rowGnrInfo, rowTeam).toString());
System.out.println( "Has sent a email about delayed task:"  +
rowSch.getValue(ProgramConstants.ATT_SCHEDULE_NAME) +  " to director:"  + directors[ 0 ].getName() +  " successfully" );
}
}
rowGnrInfo.getValue(ProgramConstants.ATT_GENERAL_INFO_SCHEDULE_START_DATE);
}
}
}
//if type equals phase,then recurse phase to get task
if  ( "阶段" .equals(type)) {
getStatus(session, sub_num);
}
}
else  {
System.out.println( "Program num maybe error" );
}
catch  (Exception ex) {
ex.printStackTrace();
}
}

设计思想:

schedule表中查出给定项目(IProgram pgm),由pgm得到scheduletbl_sch,由于项目是树形结构,tbl_sch条目列表是pgm直属的阶段(phase),任务(task)或关口(gate),如果某条目是phase,则递归调用,直到条目为任务。取出任务的generalnfoschedule,team三个表,其中前两个是前期判断需要的,team用来组织邮件。如果任务的GeneralInfo.总体状态为不正常,则判断是否为因延期导致的不正常:如果GeneralInfo.status为未开始,则使用当前时间与计划开始时间取延迟的工作日天数;如果GeneralInfo.status为已开始,则需要分别判断计划持续时间(schedule.actualDuration-schedule. scheduleDuration)以及当前时间与计划开始时间的工作日天数,按照需求规则发送站内信和邮件。获得直接和间接主管的方法为,通过programschedule表得到owner,然后新建一个IQuery(最新API中有通过sql的方式可以直接得到所有或某些user,本代码采用查全部user表,然后与owner比对,得到owner对应的user,从IUser表的第二页得到直接主管和间接主管的姓名,再将主管的姓名与userList比对,得到user)发送站内信和邮件的方式采用IDataObject(几乎本程序所有对象IProgram,ITable,IRow,IUser实现并重写了其发送站内信和邮件的send方法)。

在参考1中可以下载到agile的示例代码,而本代码中所有与agile相关的接口使用方法在示例代码中均可以看到。

参考:1.Oracle Agile PLM 示例代码http://www.oracle.com/technetwork/cn/indexes/samplecode/agileplm-sample-520945-zhs.html

2.Agile PLM系统介绍http://www.docin.com/p-332463717.html

3.ORACLEAgilePLM方案介绍http://wenku.baidu.com/view/26c6a717cc7931b765ce15c0.html



     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1275083,如需转载请自行联系原作者




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值