您的位置:首页 > 数据库 > Oracle

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

2013-08-16 16:45 696 查看
基于Oracle Agile PLM系统的二次开发——延期项目提醒.PLM概述
在今天由于全球化竞争、提升客户满意度以及业务脚步的快速提升都市足以强迫任一单位必须将产品快速的导入市场–也就是挤压产品的利润周期。此外,为了降低成本和提升效率,各个企业都在全球各地增加人力以及供应伙伴,以提升企业的竞争力。在这种高度竞争的市场环境下,企业的成功要素就包含了:1.快速推出产品2.更积极有效的管理产品与流程3.提交最高质量与最高效用的产品4在更加复杂的全球供应链有效的进行沟通与协同作业解决方案就是针对上述的挑战的解决方案并提供各个产业在现今竞争激烈的环境拔得头筹。同时Agile PLM解决方案也可使企业完整管理从产品设计、询价、制造、销售与售后服务的整个环节。在这每一个解决方案的主要核心就是产品纪录Product Record也就是在产品利润周期内各阶段的必要数据。例如对产品定义而言,则包含BOM表、零部件属性、图纸及模型、规范、型录及版本变更历史﹔就策略采购而言,就包含如AML,零部件价格以及产品价格历史等﹔就产品支持、服务和维修方面,则包含产品服务指令、质量数据及缺陷数据等。解决方案由下列商业就绪(Business Ready)的解决方案所组成:A.Product Collaboration(产品协同) 1.Product Cost Management(产品管理) 2.Product Service & Improvement(产品服务及改善) 3.Product Portfolio Management(产品组合管理) 4.Product Governance & Compliance(产品管理与法令) 5.Engineering Collaboration(工程协同) 每一个解决方案都提供企业体在供应炼各方面的高度透明度,强化客户与供货商降低成本、提升效率并更快制造出更好、更具利润产品的能力。所有Agile解决方案都是构筑在Agile PLM Platform上。Agile PLM Platform是一个功能强大的标准化、安全以及可扩张性的架构平台。这个平台可确保客户快速且价格低廉(cost effective)的实施上线。本功能是PLM自身并不具备,而在生产管理过程中又是必需的。将本功能集成以后,将改变原有系统手动检查,比对,整理和发送邮件的状态。二.本次开发的概况

需求:项目延期(延期天数精准到小数点后两位)超过5天的,发送邮件及站内信给项目所有者的直接主管;项目延期超过10天的,发送邮件及站内信给项目所有者的直接主管和间接主管。
邮件格式:(包括但不限于)
主题:项目类型,项目名,是否延期
内容:项目父,根,项目组名,项目组角色,计划完成时间等。
核心代码:

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得到schedule表tbl_sch,由于项目是树形结构,tbl_sch条目列表是pgm直属的阶段(phase),任务(task)或关口(gate),如果某条目是phase,则递归调用,直到条目为任务。取出任务的generalnfo,schedule,team三个表,其中前两个是前期判断需要的,team用来组织邮件。如果任务的GeneralInfo.总体状态为不正常,则判断是否为因延期导致的不正常:如果GeneralInfo.status为未开始,则使用当前时间与计划开始时间取延迟的工作日天数;如果GeneralInfo.status为已开始,则需要分别判断计划持续时间(schedule.actualDuration-schedule. scheduleDuration)以及当前时间与计划开始时间的工作日天数,按照需求规则发送站内信和邮件。获得直接和间接主管的方法为,通过program的schedule表得到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PLM Agile Oracle
相关文章推荐