活动完成之后,业务需要根据本次活动的实际内容,一键生成服务报告,之后触发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模板都有所区别,根据服务报告的内容、格式作区分。主要是动态表格和图片比较难处理
打开Word模板,所有的动态表格只保留一行即可,所有动态显示的图片删除,字段可以先用标识符占位。固定的字符和图片保持不动。将文档另存为xml格式
右键xml文档,使用notepad++打开,用notepad++的格式化插件格式化,插件-xml tools-pretty print
以上占位符都由siebel后端传递参数生成完整的xml文件。其中动态字符直接传递字符串传,动态图片和动态表格需要在siebel后端拼接好xml,将整段xml传递进去。
先从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";
}
获取图片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);