SIEBEL功能开发文档-服务报告客制化

文章目录

  • 业务需求
  • 设计思路和整体方案
    • 主函数解析
  • 步骤
  • 一、定制xml模板
  • 二、整合服务报告数据
    • 普通字段
    • 图片
    • 图片拼接成xml
    • 动态表格
  • 函数调用流程梳理


业务需求

活动完成之后,业务需要根据本次活动的实际内容,一键生成服务报告,之后触发OA流程审批。


设计思路和整体方案

siebel没有直接生成PDF和Word的功能,所以只能调用jar包来生成doc格式的文档。jar包通过参数和xml模板生成文档。
整体数据流是siebel后端整合siebel信息,拼接xml格式的文档,通过jbs调用jar包,输出doc格式文档到指定的目录下。

主函数解析

//打印服务请求报告功能
function Fn_CreateReport(Inputs,Outputs)
{try{//方法入参var sId = Inputs.GetProperty("Id");//var sId="1-M7KS9"; var sAttachType = TheApplication().InvokeMethod("LookupValue","NGC_FD_DOCTYPE","Endoscopy FSR");//内窥镜检查报告var sCreate=new Date(); //打印服务报告时间var sCreateDate=sCreate.getFullYear()+""+(Number(sCreate.getMonth())+1)+""+sCreate.getDate()+""+sCreate.getHours()+""+sCreate.getMinutes()+""+sCreate.getSeconds();var index="";//测试demovar sTemplate = TheApplication().GetService("NGC System Service").GettxtTmpl("NGCFDTSTNKJTM"); //获取中文模板(路径+文件名)var sSystem=TheApplication().GetService("NGC System Service").GetParameters("OPERATING_SYSTEM");//当前操作系统类型 		var sFilePath = TheApplication().GetService("NGC System Service").GetParameters("INTERFACE_FILEPATH_T"); //文件服务器路径var sFileExt = "doc"; //文件后缀var sFileName = "NGC现场服务报告-内窥镜-一级行星二级平行-" + sCreateDate; //中文文件名称		if(sSystem=="Windows"){index = sTemplate.lastIndexOf("\\");	//Windows拆分模板路径}else{index = sTemplate.lastIndexOf("/");		//Linux拆分模板路径}	var sTemplatePath = sTemplate.substring(0, index + 1); //获取模板目录var sTemplateName = sTemplate.substring(index + 1, sTemplate.length); //获取模板文件名/*拼接模板xml,pstb和psimg为必填结构,核心模板内容由pstxt生成*/var bsJbs = TheApplication().GetService("NGC Public JBS");var psIn = TheApplication().NewPropertySet();var psOut = TheApplication().NewPropertySet();var pstxt = TheApplication().NewPropertySet();var pstb = TheApplication().NewPropertySet();var psimg = TheApplication().NewPropertySet();//添加列表	var pstb1 = TheApplication().NewPropertySet();pstb1.SetType("tableList");//添加图片var psimg1 = TheApplication().NewPropertySet();psimg1.SetType("image");/***************处理xml文本填充*******************************///获取活动及服务请求相关信息FWBG_MainGetActSerMsg(sId,pstxt);//获取人员信息var appByLoginName ="";var checkLoginName = "";Fn_GetPersonMsg(sCreate.getFullYear()+"/"+(Number(sCreate.getMonth())+1)+"/"+sCreate.getDate(),appByLoginName,pstxt,checkLoginName);//构建入参,调用word生成psimg.AddChild(psimg1);pstb.AddChild(pstb1);psIn.AddChild(pstxt);psIn.AddChild(pstb);psIn.AddChild(psimg);psIn.SetProperty("Templatepath",sTemplatePath);psIn.SetProperty("Createpath", sFilePath);psIn.SetProperty("AttachmentName", sFileName + "." + sFileExt);psIn.SetProperty("TemplateName", sTemplateName);bsJbs.InvokeMethod("GetPropertyData",psIn,psOut);docToDocx(sFilePath+sFileName,sFileExt);Fn_GenerateAttr(sFilePath+sFileName + "." + sFileExt,sFileName,sFileExt,sId,sAttachType,appByLoginName,checkLoginName)Outputs.SetProperty("Message_code",psOut.GetProperty("code"));Outputs.SetProperty("Message",psOut.GetProperty("message"));}catch(e){Outputs.SetProperty("Message_code","Error");Outputs.SetProperty("Message",e.message);}finally{psOut = null;psIn = null;bsJbs = null;}
}

流程图:参数准备-获取服务报告信息-构建jbs入参-调用jbs生成报告-生成CRM附件

步骤

一、定制xml模板

每一种服务报告的xml模板都有所区别,根据服务报告的内容、格式作区分。主要是动态表格图片比较难处理

  • 打开Word模板,所有的动态表格只保留一行即可,所有动态显示的图片删除,字段可以先用标识符占位。固定的字符和图片保持不动。将文档另存为xml格式
    在这里插入图片描述

  • 右键xml文档,使用notepad++打开,用notepad++的格式化插件格式化,插件-xml tools-pretty print

  • 对于动态文本字段,找到对应的字符,将定制改为参数,例如**${pstxt1}**
    在这里插入图片描述

  • 对于动态图片,需要先在relationship栏添加关联占位符**${relationshipidstring}**
    在这里插入图片描述

  • 再在储存图片base64码的地方,添加图片编码占位符** ${imgbinarydata}**,一般是 在这里插入图片描述

  • 对于动态表格,直接在需要添加动态表格的地方写占位符,需要写在表格控件里面才能正确插入表格
    在这里插入图片描述

  • 以上占位符都由siebel后端传递参数生成完整的xml文件。其中动态字符直接传递字符串传,动态图片和动态表格需要在siebel后端拼接好xml,将整段xml传递进去。

  • 至此,xml模板准备完毕。上传到siebel后端文件模板备用。
    在这里插入图片描述

二、整合服务报告数据

先从siebel后端整合生成服务报告所需的数据

普通字段

以资产信息为例,就是简单的定义bo、bc,取字段

//获取活动资产信息
function FWBG_GetAssetMsg(&bcFsAsset,&fjbh,&fjazsj,&bwyxrq,&clxcj,&clxxh,&clxbh,&clxzzrq,&rhxtcj,&rhypp)
{	try{with(bcFsAsset){ActivateField("Name");//风机编号ActivateField("NGC Gearbox Maker");//齿轮箱厂家ActivateField("NGC Gearbox Number");//齿轮箱编号ActivateField("Purchase Date");//齿轮箱制造日期ActivateField("NGC Lube System Brand");//润滑系统厂家ActivateField("NGC Lube Brand");//润滑油品牌ActivateField("NGC Model Number");//齿轮箱型号ActivateField("Install Date");//风机安装时间ActivateField("NGC Operate Number");//并网运行日期ClearToQuery();SetViewMode(AllView);SetSearchExpr("[Id] is not null");SetSortSpec("Created(DESCENDING)");ExecuteQuery(ForwardOnly);if (FirstRecord()) {fjbh = GetFieldValue("Name");clxcj = GetFieldValue("NGC Gearbox Maker");clxbh = GetFieldValue("NGC Gearbox Number");clxzzrq = to_date(GetFieldValue("Purchase Date"));rhxtcj = GetFieldValue("NGC Lube System Brand");rhypp = GetFieldValue("NGC Lube Brand");clxxh = GetFieldValue("NGC Model Number");fjazsj = to_date(GetFieldValue("Install Date"));bwyxrq = to_date(GetFieldValue("NGC Operate Number"));}		}}catch(e){throw e.message;}}

图片

以检查项目图片为例

//获取检查项目图片信息
function FWBG_GetActCheckMsg(&bcCheck,&bcCheckAtt,&imgattr,sCheckReq,sSeqq)
{try{	for(var i=0;i<sCheckReq.length;i++){with(bcCheck){ActivateField("NGC Activity Step");ClearToQuery();SetViewMode(AllView);SetSearchExpr("[NGC Check Requirement] = '"+ sCheckReq[i] +"'");//SetSortSpec("SeqNum(ASCENDING)");ExecuteQuery(ForwardOnly);var count = CountRecords();var sRecord = FirstRecord();                                    if(sRecord){	var sCheckId = GetFieldValue("Id");//var stepSeq = GetFieldValue("SeqNum");//var stepCom = GetFieldValue("NGC Activity Step");	with(bcCheckAtt){ClearToQuery();SetViewMode(AllView);SetSearchExpr("[NGC Activity Check Id] = '"+ sCheckId +"'");SetSortSpec("Created(DESCENDING)");ExecuteQuery(ForwardOnly);var stepRecord = FirstRecord();if(!stepRecord){imgattr[imgattr.length] = i;imgattr[imgattr.length] = i+"IMG";}else{var stepAttNum = 0;while(stepRecord){if(stepAttNum < 2 ){var index = imgattr.length;imgattr[index] = GetFieldValue("Id");stepAttNum++;stepRecord = NextRecord();}else{stepRecord = false;}}if(stepAttNum == 1){imgattr[imgattr.length] = i;}//xmlPart5 += Part5ActStep(sSeqq[i]+sCheckReq[i],"照片","rIdcst"+imgattr[imgattr.length-2],"rIdcst"+imgattr[imgattr.length-1]);	}		}		sRecord = NextRecord();}}}		}catch(e){throw e.message;}}

注意这段写法,因为图片的动态加载的顺序是固定的,也就是说图片的序号决定了图片的内容,这段处理是为了防止图片为空,序号乱序。
imgattr取图片的ID。

if(!stepRecord)
{imgattr[imgattr.length] = i;imgattr[imgattr.length] = i+"IMG";
}

图片拼接成xml

获取图片ID之后,还需要通过ID来将图片拼接成xml

//Your public declarations go here...  
//照片function XmlPhoto(ImgId)
{var xml ="\r\n" + "											\r\n" + "												\r\n" + "												\r\n" + "												\r\n" + "												\r\n" + "													\r\n" + "												\r\n" + "												\r\n" + "													\r\n" + "														\r\n" + "															\r\n" + "																\r\n" + "																\r\n" + "															\r\n" + "															\r\n" + "																+ImgId+"\" cstate=\"print\">\r\n" + "																	\r\n" + "																		\r\n" + "																			\r\n" + "																		\r\n" + "																	\r\n" + "																\r\n" + "																\r\n" + "																	\r\n" + "																\r\n" + "															\r\n" + "															\r\n" + "																\r\n" + "																	\r\n" + "																	\r\n" + "																\r\n" + "																\r\n" + "																	\r\n" + "																\r\n" + "															\r\n" + "														\r\n" + "													\r\n" + "												\r\n" + "											\r\n" + "										";return xml;
}

动态表格

以检查项目为例,动态传入参数,拼接到xml中,这段代码动态传入了图片

//Your public declarations go here...  
//服务报告part2 检查照片function XmlcheckPhoto(sCheckReq,sCheckRes,sCheckDes,sSeq,ImgId1,ImgId2)
{//设置填充色var bgColor ="00B050";switch(sCheckRes){case "未知":bgColor ="AEAAAA";break;case "未见明显异常":bgColor ="00B050";break;case "注意观察":bgColor ="FFFF00";break;case "及时修复":bgColor ="FFC000";break;case "需更换":bgColor ="FF0000";break;default:bgColor ="";break;}var xml ="\r\n" + "	\r\n" + "		\r\n" + "	\r\n" + "	\r\n" + "		\r\n" + "			\r\n" + "			\r\n" + "			\r\n" + "			\r\n" + "		\r\n" + "		\r\n" + "			\r\n" + "				\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "			\r\n" + "			\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "				"+sSeq+"\r\n" + "			\r\n" + "			\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "				"+sCheckReq+"\r\n" + "			\r\n" + "		\r\n" + "	\r\n" + "	\r\n" + "		\r\n" + "			\r\n" + "			\r\n" + "		\r\n" + "		\r\n" + "			\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "			\r\n" + "			\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "				状态\r\n" + "			\r\n" + "		\r\n" + "	\r\n" + "	\r\n" + "		\r\n" + "			\r\n" + "			+ bgColor +"\"/>\r\n" + "			\r\n" + "		\r\n" + "		\r\n" + "			\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "			\r\n" + "			\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "				"+sCheckDes+"\r\n" + "			\r\n" + "		\r\n" + "	\r\n" + "	\r\n" + "		\r\n" + "			\r\n" + "			+ bgColor +"\"/>\r\n" + "			\r\n" + "		\r\n" + "		\r\n" + "			\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "			\r\n" + "			\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "				"+sCheckDes+"\r\n" + "			\r\n" + "		\r\n" + "	\r\n" + "\r\n" + "\r\n" + "	\r\n" + "		\r\n" + "	\r\n" + "	\r\n" + "		\r\n" + "			\r\n" + "			\r\n" + "			\r\n" + "			\r\n" + "		\r\n" + "		\r\n" + "			\r\n" + "				\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "			\r\n" + "		\r\n" + "	\r\n" + "	\r\n" + "		\r\n" + "			\r\n" + "			\r\n" + "		\r\n" + "		\r\n" + "			\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "			\r\n" + "			\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "				照片\r\n" + "			\r\n" + "		\r\n" + "	\r\n" + "	\r\n" + "		\r\n" + "			\r\n" + "			\r\n" + "		\r\n" + "		\r\n" + "			\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "			\r\n" + "			\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "				"+ XmlPhoto(ImgId1) +"\r\n" + "			\r\n" + "		\r\n" + "	\r\n" + "	\r\n" + "		\r\n" + "			\r\n" + "			\r\n" + "		\r\n" + "		\r\n" + "			\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "			\r\n" + "			\r\n" + "				\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "					\r\n" + "				\r\n" + "				"+ XmlPhoto(ImgId2) +"\r\n" + "			\r\n" + "		\r\n" + "	\r\n" + "";return xml;
}

再循环拼接表格的每一行

//拼接检查结果var sCheckResXml = "";for(var k=0;k<sCheckReq.length;k++){sCheckResXml = sCheckResXml + XmlcheckResult(sCheckReq[k],sCheckRes[k],sCheckDes[k],sSeq[k]);}

最后将参数赋值给之前写的占位符即可,注意占位符含义

psIn.SetProperty("pstxt15",rhxtcj);
psIn.SetProperty("pstxt16",rhypp);
psIn.SetProperty("pstxt17",arrayTyRead[0]);
psIn.SetProperty("pstxt20",instr[0]);
psIn.SetProperty("pstxt29",XmlPhoto(ImgId[0]));
psIn.SetProperty("pstxt30",XmlPhoto(ImgId[1]));
psIn.SetProperty("pstxt31",sCheckResXml);
psIn.SetProperty("pstxt32",sCheckPhotoXml);

函数调用流程梳理

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部