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="";
		//测试demo
		var 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格式
    SIEBEL功能开发文档-服务报告客制化_第1张图片

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

  • 对于动态文本字段,找到对应的字符,将定制改为参数,例如**${pstxt1}**
    SIEBEL功能开发文档-服务报告客制化_第2张图片

  • 对于动态图片,需要先在relationship栏添加关联占位符**${relationshipidstring}**
    SIEBEL功能开发文档-服务报告客制化_第3张图片

  • 再在储存图片base64码的地方,添加图片编码占位符** ${imgbinarydata}**,一般是 SIEBEL功能开发文档-服务报告客制化_第4张图片

  • 对于动态表格,直接在需要添加动态表格的地方写占位符,需要写在表格控件里面才能正确插入表格
    SIEBEL功能开发文档-服务报告客制化_第5张图片

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

  • 至此,xml模板准备完毕。上传到siebel后端文件模板备用。
    SIEBEL功能开发文档-服务报告客制化_第6张图片

二、整合服务报告数据

先从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);

函数调用流程梳理

SIEBEL功能开发文档-服务报告客制化_第7张图片

你可能感兴趣的:(java,javascript,开发语言)