集成接口
前几天和SAP集成,实现报工,取消报工接口,发现线上可参照资源很少,联调之后特此分享
1.界面
2.业务逻辑
业务逻辑很简单,点击SAP界面,选中并提交报工信息,将信息保存在固定格式XML中,调取SAP接口,将数据传出,成功之后SAP回传XML,在集成方面,重要的是双方要在XML格式上保持一致,互相配合保证联调成功。
3.报工按钮代码,生成XML,将数据插入XML中
/// <summary>
/// ERP报工
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnERPStart_Click(object sender, EventArgs e)
{
try
{//yehy 20180918 增加
#region SAP 报工
if (m_strSAP != "")
{
this.ProductorderReportbindingSource.EndEdit();
this.gridView2.PostEditor();
DataRow[] drOrdersSAP = dstFinishReport1.ERP_PRODUCTORDERREPORT.Select("SelectRow=True");
if (drOrdersSAP.Length > 0)
{
string strResult = "";
foreach (DataRow drOrder in drOrdersSAP)
{
#region 组织报工数据
//MemoryStream swbizData = new MemoryStream();
//XmlWriterSettings setting = new XmlWriterSettings();
//setting.Encoding = new UTF8Encoding(false);
//setting.Indent = true;
//XmlWriter xtw = XmlWriter.Create(swbizData, setting);
StringWriter swbizData = new StringWriter();
XmlTextWriter xtw = new XmlTextWriter(swbizData);
xtw.WriteStartDocument();
xtw.WriteStartElement("ROOT");
xtw.WriteStartElement("ITEM");
//xtw.WriteStartElement("INSDATA");
//操作完成的确认编号:报工时不需反馈到ERP,报工后ERP反馈该值到MES,用于取消报工
xtw.WriteStartElement("RUECK");
xtw.WriteString("");
xtw.WriteEndElement();
//订单号
xtw.WriteStartElement("AUFNR");
xtw.WriteString(drOrder["VBILLCODE"].ToString());
xtw.WriteEndElement();
//活动编号:订单工序中的活动编号,与工作中心一一对应
xtw.WriteStartElement("VORNR");
xtw.WriteString(drOrder["VORNR"].ToString());
xtw.WriteEndElement();
//已确认的总计产量(报工数量)
xtw.WriteStartElement("LMNGA");
xtw.WriteString(drOrder["REPORTAMOUNT"].ToString());
xtw.WriteEndElement();
//已确认的废品数量总计
xtw.WriteStartElement("XMNGA");
xtw.WriteString(drOrder["USELESSAMOUT"].ToString());
xtw.WriteEndElement();
//已确认的废品数量总计
xtw.WriteStartElement("RMNGA");
xtw.WriteString(drOrder["REJECTAMOUNT"].ToString());
xtw.WriteEndElement();
//差异原因 :不用关注
xtw.WriteStartElement("GRUND");
xtw.WriteString("");
xtw.WriteEndElement();
//作业单位
xtw.WriteStartElement("ILE01");
xtw.WriteString(drOrder["ILE01"].ToString());
xtw.WriteEndElement();
//作业
xtw.WriteStartElement("ISM01");
xtw.WriteString("");
xtw.WriteEndElement();
string USER = "DH_RFC_USER";//校验用户
string PASSW = "123456";//校验密码
string ITYPE = "CK_PP_I_0004";//接口代码
strResult = R_logic.MesToSapUniversalInterfaceForOrder(m_strWorkShopName, "REPORT", drOrder["VBILLCODE"].ToString(), USER, PASSW, ITYPE, "", "", "", swbizData.ToString());
m_Operate.SaveOperateInfo(" ERP报工", "FrmFinishPlanToERP.btnERPStart_Click", strResult, "");
}
if (strResult.IndexOf("成功") > -1)
{
UserMessages.ShowInfoBox("报工成功!");
//刷新下方列表数据
finishreportbindingsource_CurrentChanged(null, null);
}
}
}
#endregion
}
catch (Exception ex)
{
m_Operate.SaveOperateInfo(" SAP报工", "FrmFinishPlanToERP.btnERPStart_Click", ex.ToString(), "");
throw ex;
}
}
- 数据传至zp001中间接口
/// <summary>
/// 手动获取院SAP订单最新版
/// </summary>
/// <param name="USER"></param>
/// <param name="PASSW"></param>
/// <param name="ITYPE"></param>
/// <param name="p_OP1"></param>
/// <param name="p_OP2"></param>
/// <param name="p_OP3"></param>
/// <param name="p_bizData"></param>
/// <returns></returns>
public string MesToSapUniversalInterfaceForOrder(string p_isInclude, string p_bizOperation, string p_key, string USER, string PASSW, string ITYPE, string p_OP1, string p_OP2, string p_OP3, string p_bizData)
{//yehy 20180921 增加
try
{
using (zpp0001.zpp0001 zpp = new zpp0001.zpp0001())
{
zpp.Url = ReflectionHelper.GetUrl("zpp0001");
zpp.Credentials = System.Net.CredentialCache.DefaultCredentials;
return zpp.MesToSapUniversalInterfaceForOrder(p_isInclude, p_bizOperation, p_key,USER, PASSW, ITYPE, p_OP1, p_OP2, p_OP3, p_bizData);
}
}
catch (Exception ex)
{
throw ex;
}
}
- 调取对方接口,实现数据传递,增加日志(快速查找联调bug)
/// <summary>
/// yehy
/// </summary>
/// <param name="USER">用户名(固定格式)</param>
/// <param name="PASSW">密码(固定格式)</param>
/// <param name="ITYPE">接口</param>
/// <param name="p_OP1"></param>
/// <param name="p_OP2"></param>
/// <param name="p_OP3"></param>
/// <param name="p_bizData"></param>
/// <returns></returns>
[WebMethod]
public string MesToSapUniversalInterfaceForOrder(string p_isInclude, string p_bizOperation, string p_key, string USER, string PASSW, string ITYPE, string p_OP1, string p_OP2, string p_OP3, string p_bizData)
{
try
{
string strResult = "";//返回结果
string strTibcoFactory = "";//TIBCO需要的场所参数
string strEryFactory = "";//ERP需要的场所参数
string strWorkCenter = "";//工作中心
#region 场所参数赋值
#endregion
#region 调用接口
using (SAP.ZPUBLICKWEBSERVICE reject = new SAP.ZPUBLICKWEBSERVICE())
{
#region//获取接口服务路径
string strUrl = "";
//yehy 20180927 urlxml引入
DataRow[] drUrl = this.dstISURL.Tables[0].Select("URLKey = 'SAP报工'");
if (drUrl.Length > 0)
{
strUrl = drUrl[0]["URLValue"].ToString();
}
reject.Url = strUrl;
reject.Credentials = System.Net.CredentialCache.DefaultCredentials;
//将值放入
SAP.ZgsmDataProcess zdp = new SAP.ZgsmDataProcess();
zdp.User = USER;
zdp.Passw = PASSW;
zdp.Itype = ITYPE;
zdp.Plant = p_OP1;
zdp.Begda = p_OP2;
zdp.Endda = p_OP3;
zdp.Input = p_bizData;
#region yehy 测试xml
//DataSet dstReport1 = new DataSet();
//using (XmlReader reader = XmlReader.Create(new StringReader(p_bizData)))
//{
// dstReport1.ReadXml(reader);
//}
#endregion
#endregion
switch (ITYPE)
{
case "CK_PP_I_0004":
#region 报工
m_Operate.SaveOperateInfo("订单报工", "REPORT", "fromUnit:" + strTibcoFactory + ",toUnit:" + strTibcoFactory + ""
+ ",fromSys:MES,toSys:ERP,bizOperation:ZINT_MES_03" + ",key:" + p_key + ",bizData:" + p_bizData + "", "");// 增加日志
//报工(p_key:订单号,p_bizData:报工数据,p_OP1:预留,p_OP2:预留,p_OP4:REPORTID,用于更新状态、订单上报编号和确认计数器)
SAP.ZgsmDataProcessResponse zdpResponse = new SAP.ZgsmDataProcessResponse();
//接收response类型
zdpResponse = reject.ZgsmDataProcess(zdp);
DataSet dstReport = new DataSet();
//传回 解读是否成功xml
using (XmlReader reader = XmlReader.Create(new StringReader(zdpResponse.Output)))
{
dstReport.ReadXml(reader);
string strStatus = dstReport.Tables["ROOT"].Rows[0]["MSGTY"].ToString();//接收信息状态,S:接收成功
string strMessage = dstReport.Tables["ROOT"].Rows[0]["MSGTX"].ToString();//接收状态说明,更多用在接收出错时使用
//不返回数据 功能不需要 yehy 20180927
//string strBizData = dstReport.Tables["Result"].Rows[0]["BizData"].ToString();
if (strStatus == "S")
{
//更新订单上报编号和确认计数器
string strSqlUpdate = "update erp_productorderreport ep set ep.state = '已上报'";
SqlStruct sqlStructUpdate = new SqlStruct();
sqlStructUpdate.SqlString = strSqlUpdate;
sqlStructUpdate.CommandType = CommandType.Text;
if (strSqlUpdate.Length > 0)
{
ServiceManager.GetDatabase().ExecuteNonQuery(sqlStructUpdate);
}
strResult = "上报成功!";
}
else
{
strResult = "获取失败!失败原因:" + strMessage + "!";
}
}
#endregion
break;
case "CK_PP_I_0006":
#region 取消报工
m_Operate.SaveOperateInfo("取消报工", "CCREPORT", "fromUnit:" + strTibcoFactory + ",toUnit:" + strTibcoFactory + ""
+ ",fromSys:MES,toSys:ERP,bizOperation:ZINT_MES_04" + ",key:" + p_key + ",bizData:" + p_bizData + " ,OP1:" + p_OP1 + ",OP2:" + p_OP2 + "", "");//jiangb 20160405 增加日志
//取消报工(p_key:订单号,p_bizData:报工数据,p_OP1:预留,p_OP2:预留,p_OP4:REPORTID,用于更新状态、订单上报编号和确认计数器)
SAP.ZgsmDataProcessResponse zdpResponseno = new SAP.ZgsmDataProcessResponse();
zdpResponseno = reject.ZgsmDataProcess(zdp);
DataSet dstCCReport = new DataSet();
using (XmlReader reader = XmlReader.Create(new StringReader(zdpResponseno.Output)))
{
dstCCReport.ReadXml(reader);
string strStatus = dstCCReport.Tables["ROOT"].Rows[0]["MSGTY"].ToString();//接收信息状态,S:接收成功
string strMessage = dstCCReport.Tables["ROOT"].Rows[0]["MSGTX"].ToString();//接收状态说明,更多用在接收出错时使用
if (strStatus == "S")
{
//更新订单上报编号和确认计数器
string strSqlUpdate = "update erp_productorderreport ep set ep.state = '取消上报' ";
SqlStruct sqlStructUpdate = new SqlStruct();
sqlStructUpdate.SqlString = strSqlUpdate;
sqlStructUpdate.CommandType = CommandType.Text;
if (strSqlUpdate.Length > 0)
{
ServiceManager.GetDatabase().ExecuteNonQuery(sqlStructUpdate);
}
strResult = "取消上报成功!";
}
else
{
strResult = "获取失败!失败原因:" + strMessage + "!";
}
}
#endregion
break;
}
}
#endregion
return strResult;
}
catch (Exception ex)
{
throw ex;
}
}
- SAP接口URL
<ServiceURL>
<URLKey>SAP报工</URLKey>
<URLValue>http://保密原因此处略:zpublickwebservice?sap-client=300</URLValue>
<MEMO>SAP报工接口路径</MEMO>
</ServiceURL>