集成接口

版权声明:版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/yehangyu0525/article/details/82887175
       前几天和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;
            }
        }
  1. 数据传至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;
            }
        }
  1. 调取对方接口,实现数据传递,增加日志(快速查找联调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;
        }
    }
  1. SAP接口URL
 <ServiceURL>
    <URLKey>SAP报工</URLKey>
    <URLValue>http://保密原因此处略:zpublickwebservice?sap-client=300</URLValue>
    <MEMO>SAP报工接口路径</MEMO>
  </ServiceURL>

猜你喜欢

转载自blog.csdn.net/yehangyu0525/article/details/82887175