第三方调用U9服务(DotNet平台)
一、业务场景
PLM(PDM)系统和U9ERP系统整合,PLM设计完产品后需要传入到U9ERP系统,比如要传入厂牌,料品,BOM等基础信息
二、引用U9服务
以创建料品服务为例, UFIDA.U9.ISV.Item.BatchCreateItemByDTOSRV
a)验证服务是否可用
如果能显示显示下面的图片说明服务没有问题
b)生成代理类
若使用Visual Studio 2005则需要先下载
在命令行输入SvcUtil localhost/portal/services/UFIDA.U9.ISV.Item.IBatchCreateItemByDTOSRV.svc /serializer:DataContractSerializer
如下图所示:
输入命令后输出的不上上图格式则重新再试或查看第一步服务地址是否正确
c)构架项目
1.用VS新建项目,
2.把代理类和配置文件加到项目中
3.修改fig名称为fig
4.添加System.Runtime.Serialization.dll和System.ServiceModel.dll引用
如下图所示
如果一个项目中需要用到调用多个服务,则需要合并代理类和配置文件,请参考合并代理类说明文档
三、项目实现细节
a)调用服务框架代码
//实例化代理类
UFIDAU9ISVItemIBatchCreateItemByDTOSRVClient client;
client = new UFIDAU9ISVItemIBatchCreateItemByDTOSRVClient();
UFIDAU9CBOSCMItemItemMasterData[] returnItems; //服务返回结果
UFSoft.UBF.Exceptions.MessageBase[] returnMsg; //返回异常信息,目前还没有使用此属性
object context; //上下文信息
UFIDAU9ISVItemItemMasterDTOData[] itemMasterDtos; //传入参数
try{
context = CreateContextObj();//给上下文信息赋值
itemMasterDtos = SetItemMasterDtos();//给传入参数赋值
returnItems = client.Do(out returnMsg, context, itemMasterDtos); //服务调用
}
catch (Exception ex){//异常信息捕获
throw new Exception(GetExceptionMessage(ex));
}
b)上下文信息
/// <summary>
///给上下文信息赋值
///</summary>
///<returns></returns>
private static ThreadContext CreateContextObj()
service fault{
// 实例化应用上下文对象
ThreadContext thContext = new ThreadContext();
System.Collections.Generic.Dictionary<object, object> ns = new Dictionary<object, object>();
ns.Add("OrgID", "1000911212125298"); //组织
ns.Add("UserID", "1000911217626500"); //用户
ns.Add("CultureName", "zh-CN");//语言
ns.Add("EnterpriseID", "007");//企业
thContext.nameValueHas = ns;
return thContext;
}
c)传入参数
/// <summary>
/// 给传入参数赋值
/// </summary>
/// <returns></returns>
private static UFIDAU9ISVItemItemMasterDTOData[] SetItemMasterDtos()
{
List<UFIDAU9ISVItemItemMasterDTOData> dtos = new List<UFIDAU9ISVItemItemMasterDTOData>();
foreach( i …. {
UFIDAU9ISVItemItemMasterDTOData dto = new UFIDAU9ISVItemItemMasterDTOData();
//为料品dto赋值
dto.m_code = "1-01-"+ i.ToString();
dto.m_name = "自建料品"+i.ToString();
dto.m_status = SetCommonArchiveDTO("3200"); // 状态码(关联实体类型赋值)
dto.m_inventoryUOM = SetCommonArchiveDTO("001"); // 库存主单位
dto.m_itemFormAttribute = 10;//制造件
//描述性弹性域
UFIDAU9BaseFlexFieldDescFlexFieldDescFlexSegmentsData descFlexSegs = newUFIDAU9BaseFlexFieldDescFlexFieldDescFlexSegmentsData();
descFlexSegs.m_privateDescSeg1 = "英文描述等";
dto.m_descFlexField = descFlexSegs;
…省略部分代码
//把料品dto添加到集合中
dtos.Add(dto);
}
return dtos.ToArray();
}
d)提取服务异常
如果还有异常提取有问题,请开发人员跟踪检查异常信息结构,在修改下面的方法
/// <summary>
///提取异常信息
///</summary>
///<param name="ex"></param>
private static string GetExceptionMessage(Exception ex)
{
string faultMessage = "未知错误,请查看ERP日志!";
System.TimeoutException timeoutEx = ex as System.TimeoutException;
if (timeoutEx != null){
faultMessage = "因第一次访问ERP服务,访问超时,如避免此错误,请先启动ERP系统!";
}
else{
FaultException<ServiceException> faultEx = ex as FaultException<ServiceException>;
if (faultEx == null){
faultMessage = ex.Message;
}
else{
ServiceException serviceEx = faultEx.Detail;
if (serviceEx != null && !string.IsNullOrEmpty(serviceEx.Message) && !serviceEx.Message.Equals("fault",StringComparison.OrdinalIgnoreCase)){
// 错误信息在faultEx.Message中,请提取,
// 格式为"Fault:料品不能为空,请录入\n 在....."
int startIndex = serviceEx.Message.IndexOf(":");
int endIndex = serviceEx.Message.IndexOf("\n");
if (endIndex == -1)
endIndex = serviceEx.Message.Length;
if (endIndex > 0 && endIndex > startIndex + 1){
faultMessage = serviceEx.Message.Substring(startIndex + 1, endIndex - startIndex - 1);
}
else{
faultMessage = serviceEx.Message;
}
}
}
}
return faultMessage;
}
e)公共方法
/// <summary>
///为关联实体属性赋值
///</summary>
///<param name="entityID">实体记录ID</param>
///<returns></returns>
public static UFIDAU9CBOPubControllerCommonArchiveDataDTOData SetCommonArchiveDTO(long entityID)
{
return SetCommonArchiveDTO(entityID, string.Empty);
}
///<summary>
///为关联实体属性赋值
///</summary>
///<param name="entityCode">实体记录编码</param>
///<returns></returns>
public static UFIDAU9CBOPubControllerCommonArchiveDataDTOData SetCommonArchiveDTO(string entityCode)
{
return SetCommonArchiveDTO(-1, entityCode);
}
/// <summary>
///为关联实体属性赋值
///</summary>
///<param name="entityID">实体记录ID</param>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论