文章目录
前言
学习情况总结
一、Inbound WebService的创建
一个Web Service是 一个部署在网络上的业务逻辑,可以通过某种网络协议进行访问。
a) 通过WSDL【Web Service Description Language】来指定一个WS
b) 通过SOAP【Simple Object Access Protocol】来传输
c) 通过XML来存储内容
以上三个是WS的核心技术。
WSDL由发布者提供,它提供了WS的各种操作、操作的输入输出参数结构以及与WS通讯的机制。
一个WSDL文件被发布成一个XML的实例。
SOAP是一个轻量级的协议,它用于在分布式环境下进行结构化数据的交换传递。服务使用者按照一定的格式提交请求【Request】,服务提供者提供响应【Response】。
总结:通过WSDL、SOAP、XML技术来实现接口
1.对应关系
如上图所示:IO对应BO,IC对应BC,ICF对应BCF
如上图所示:WS和BS一一对应。
2.通过BS创建Inbound WebService(入栈WS)
创建IO
-
通过向导新建New Object->EAI->Integration Object
-
选择相应的Project,选择Source System为:EAI Siebel Wizard
-
选择BC、Include Component、Container Naming、Lower CamelCase for XML Tags
-
不发布,取消勾选Deploy
-
为需要的BC创建Key,然后创建Key Field字段(?作用)
创建BS
-
选择Class为CSSEAIDataSyncService,勾选External Use(Display Name在创建Inbound的时候选择BS的时候会用到)
-
为BS创建两条User Property,
Application Services Interface:Y
Internal Integration Object:NGC Order Header BO【上述建立的IO名称】 -
创建方法和以及参数,复杂参数的类型要选择IO型,再选择刚才创建的IO。标准方法QueryById,参数要按照下图
-
其他标准方法以及参数如下
创建Inbound WebService
- 浏览器中:管理-Web服务->入站Web服务,新建一条记录,命名空间填http://siebel.com/CustomUI,名称是IO名
- 服务端口新建一条记录,名称是 BS名称 ,服务名称是BS的 Display Name,实施类型选 业务服务 ,地址http://localhost:8888/eai_chs/start.swe?SWEExtSource=WebService&SWEExtCmd=Execute&WSSOAP=1,联编SOAP_RPC_LITERAL
- 操作里选择创建的方法,验证类型填无,名称需要加个前缀(否则影响唯一性验证)
- 将界面拉到最上方,清除缓存,生成WSDL,打开文档自动生成器,导入刚才的WSDL,生成新WSDL
测试
-
使用SoapUI测试接口,创建Project,选择新生成的带头结构的WSDL
-
选择需要测试的方法
- 修改endpoint为建立的Inbound WebService服务端口的地址,此处是http://localhost:8888/eai_chs/start.swe?SWEExtSource=WebService&SWEExtCmd=Execute&WSSOAP=1
- 修改XML的参数,并运行测试,头文件要填相应的账号密码
- 观察报文,200 OK代表无误,有数据传回,或者直接看返回值
二、Outbound WebService的调用
1.调用OA接口实例
-
找到要调用的BS,查找需要调用的方法和参数,找到对应的IO
-
找到IO的IC和IC Field,记录相应字段,在代码里组合
var psIn = TheApplication().NewPropertySet();
var psOut = TheApplication().NewPropertySet();
//IO层
var siebelMsg = TheApplication().NewPropertySet();
siebelMsg.SetType("getUserIdRequest:parameters");//BS方法的参数名
siebelMsg.SetProperty("MessageId","1");
siebelMsg.SetProperty("MessageType","Integration Object");
siebelMsg.SetProperty("IntObjectName","getUserId");//IO名
siebelMsg.SetProperty("IntObjectFormat","Siebel Hierarchical");//对应storage type
//第一层
//构造IC对象数组
var ListOfgetUserId = TheApplication().NewPropertySet();
ListOfgetUserId.SetType("ListOfgetUserId");
var getUserId = TheApplication().NewPropertySet();
getUserId.SetType("getUserId");//IC名
getUserId.SetProperty("in0","loginid2");//参数名、参数值
getUserId.SetProperty("in1",Login);//参数名、参数值
//构造IO
//固定步骤
ListOfgetUserId.AddChild(getUserId);
siebelMsg.AddChild(ListOfgetUserId);
psIn.AddChild(siebelMsg);
//参数准备完毕,开始调用
bsOAWorkflow.InvokeMethod("getUserId",psIn,psOut);
三、接口日志的记录
//接口日志对象
var bsXML=TheApplication().GetService("EAI XML Converter");
var psInxml=TheApplication().NewPropertySet();
var psOutxml=TheApplication().NewPropertySet();
var bsSys=TheApplication().GetService("NGC System Service");
var sLogId = "";
//接口入参日志
bsXML.InvokeMethod("PropSetToXML",psIn,psInxml);
sLogId = bsSys.Log("接口显示名" , "" , "Running" , "" , psInxml.GetValue().substring(0,4000) , "");
//此处调用接口
//bsZCRM_ZZ.InvokeMethod("ZcrmWtc",psIn,psOut);
//接口出参日志
bsXML.InvokeMethod("PropSetToXML",psOut,psOutxml);
bsSys.Log("接口显示名" , sLogId , "Success" , psOutxml.GetValue().substring(0,16349) , psInxml.GetValue().substring(0,4000) ,"");
catch(e)
{
//接口异常日志
bsSys.Log("拉取未投产数据" , sLogId , "Error" , e.message.substring(0,16349) , psInxml.GetValue().substring(0,4000) , "" );
throw e.message;
}
四、REST API的使用
主要是移动端对BC、BS的调用接口
- 浏览器:系统管理->Rest集成,如果是调用BC:接口代码既BO的大写,BO、BC填写相应的名称;若果是调用BS,BO、BC不填只用填BS即可,方法分为标准方法和BS客户化方法,方法和字段分别填写方法和参数即可
五、数据批量导入的使用
- 配置模板文件TXT,示例如下:
BOName:Service Request,BCName:Service Request,Imdata1:Status:F,Imdata2:Account:P#Name,Imdata3:NGC All WOEG Amount:F,Imdata4:INS Product:F,Imdata5:Area:F,Imdata6:Sub-Area:F
斜体字符为自定义字段,指定BO、BC之后,配置要导入的字段普通字段和静态PK用 :F结尾,动态PK用**😛#pickmap指定的值**
- 系统管理-文件模板中,自定义模板编码,创建文件模板,并上传模板文件
-
编辑想要导入的数据csv,字段顺序要一一对应,Import Status固定填New,Import Type插入的话就填Insert,Import Name自定义,Code和Batch要和导入数据头对应
-
在系统管理-导入数据界面,自定义批次号和Code(上下要一致才可导入),导入csv,创建数据头,即可点导入
六、开发环境迁移到测试
-
从EDOC上下载迁移清单,用siebel小工具,先去重,再分对象来进行or链接,一般or链接对象在十个左右
-
本地在DEV TOOLS中选择对象,右键Add to Archive,等所有对象添加完毕之后,选择sif存储路径,一般存储到桌面,命名规则是添加日期和次数后缀,如objects2022110201.sif,最后点save
-
本地打开UAT TOOLS,导航栏点击Tools,Import From Archive(s),冲突选项选择Overwrite,最后Import
-
远程桌面,桌面object文件夹复制备份一次,新文件夹命名为日期和FD后缀
-
在远程桌面使用UAT TOOLS,编译对象,编译路径务必选择刚才新建文件夹下的srf
-
编译完成后,打开BvSsh远程ssh工具,账号密码都为siebel,点击终端启停测试环境服务器,停命令**. ./stopsiebsrvr.sh**(点之间有空格),启命令**. ./startsrvr.sh**
-
远程ssh工具使用ftp功能上传srf,先把右边服务器上的包备份,加上日期批次后缀即可,服务器包路径为**/data/app/siebel/ses/siebsrvr/objects/chs**。左边选择刚才编译好的包,右边备份完毕之后即可Upload
-
通过终端工具启动服务器,启命令**. ./startsrvr.sh**,至此
tips:
Symbolic String也要导入,导入后其他对象需要重新编译才可生效,建议直接先导入
Table不仅需要编译,还需要在UAT进行Apply
Tablede Apply账密为SIEBEL/SIEBELUAT123#,ODBC为CRMUAT
七、测试环境迁移到正式
- 迁移清单路径如下
- 远程桌面,桌面object文件夹复制备份一次,新文件夹命名为日期和FD/GY后缀(取决于发哪个)
- UAT只编译要迁移的对象,启停服务器,(换包?)
- 移交测试,测试没问题就下一步
- 打包迁移的对象,Add to Archive,在prod导入
- prod环境只用Apply表,不用编译
- 更新迁移清单状态
- 通知运维发版(唐师傅),将Object文件夹下要发的文件路径截图给运维即可
Tips:正式环境账号SIEBEL,密码SIEBEL123,服务器是CRMPROD
八、服务请求Excel批量导入功能
配置模板
- 配置模板文件TXT,示例如下:
BOName:Service Request,BCName:Service Request,Imdata1:Status:F,Imdata2:Account:P#Name,Imdata3:NGC All WOEG Amount:F,Imdata4:INS Product:F,Imdata5:Area:F,Imdata6:Sub-Area:F
斜体字符为自定义字段,指定BO、BC之后,配置要导入的字段普通字段和静态PK用 :F结尾,动态PK用**😛#pickmap指定的值**
- 系统管理-文件模板中,自定义模板编码,创建文件模板,并上传模板文件
配置后端
-
需要搭建新的导入界面时,需要新建2个Applet(参考NGC FD Import Charge List Applet、NGC FD Charge Import Data List Applet),一个View(参考NGC Import Charge View),修改Screen(把View挂上去即可),修改数据导入附件BC的安全性(NGC FD Import Attachment)
-
编辑WebApple代码,导入临时表函数,自定义以下内容(直接copy风电的导入模板后修改以下内容即可)
-
导入正式表同理,自定义以下内容
- 在服务NGC FD Analyze Data Service中编辑或者添加映射关系,例子如下:
/******************************************************************************
*==============================================================================
*创建时间:20221028
*创 建 人:DINGWJ
*入参说明:
*出参说明:
*方法简介:服务请求导入参数列表
*逻辑说明:
*备注说明:
*==============================================================================
*******************************************************************************/
function GetFDSRFieldName(propertyname)
{
var psData = TheApplication().NewPropertySet();
psData.SetProperty("服务请求编号","Imdata1");
psData.SetProperty("供应商服务编号","Imdata2");
psData.SetProperty("组织","Imdata4");
psData.SetProperty("创建时间","Imdata5");
psData.SetProperty("联系人","Imdata3");
return psData.GetProperty(propertyname);
}
-
修改AnalyzeData函数,添加判断条件
-
Excel表格的字段名需要和步骤3中写的映射关系一致,例子如下(这几个代码和截图没有关联关系)
九、服务器故障解决
开发环境服务器无法启动
停开发-虚拟机任务管理器-详细信息-搜索javaw-结束进程-启开发
测试环境服务器无法启动
-
停服务器**. ./stopsiebsrvr.sh**
-
停网关**. ./stopgateway.sh**
-
查看所有siebel相关进程 ps -ef |grep sieb,如果有,则代表没有服务器完全停掉,需要手动关停(第一个数字是pid)
-
关闭siebel相关进程 pkill -15 siebel,或者killall siebel
-
启动服务器**. ./startgateway.sh**,. ./startsiebsrvr.sh
遇到问题及其解决方案
- 接口测试时,SOAPUI显示404 document was not found
服务器地址问题,目前填入本地地址即可解决测试问题http://win-h4n9npi29s8:8888?SWEExtSource=WebService&WSSOAP=1 - 不存在包含 ‘http://siebel.com/CustomUI:NGCQueryById’ 操作的有效 Web 服务。返回值500
TOOLS的DEBUG环境要注意,调用接口的时候在开发环境(本地没有),测试本地接口的时候需要DEBUG本地环境才能调通 - 导入时报错,“setField的第一个值无效,应该为文本类型”
是附件Excel格式问题,需要对格式进行整理。选择末尾空列,按住Ctrl+Shift+→,选中全部空列,右键删除即可,行同理。 - 导入时,数字后被强制加了.0,导致pick字段不匹配
选择列的数据,点击数据-分列-下一步-下一步-文本,将数字以文本格式存储即可 - 迁移时,or链接显示的数量不对
有几种情况
- 迁移清单的对象类型错误
- or链接过长,一般在十个左右
- 无法识别字符** ’ ,需要写成 * **,括号有时也有问题
- 有重复项
- ActivateField之后,GetFieldValue取不到值
激活要在查询之前做,一般with(bc)下面就直接激活,然后方便对字段进行其他操作 - 写入数据无效
Set之后记得WriteRecord();
心得总结
代码有很多细节需要注意,然后很多功能具体去做的时候,也有一些地方需要做客户化的修改。