using iWareSAP.IDOC.Entity; using iWareSAP.Properties; using SAP.Middleware.Connector; using System; using System.Linq; using System.Collections.Generic; using UtilDll.UTIL; namespace iWareSAP.CLIENT.Entity { public class SapncoClient { private RfcDestination _rfcDestination = null; private string _logDir; public SapncoClient() { _logDir = Resources.LogDir + @"\ATOIS"; } /// /// Register Client /// public void RegisterRfcDestination() { try { if (_rfcDestination == null) { _rfcDestination = RfcDestinationManager.GetDestination("NCO_Destination"); } } catch (Exception ex) { LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "RegisterRfcDestination", ex.Message); } } /// /// 调用时间 /// /// /// public string InvokeRFCFunctionGetDate(string dateStr) { string date = string.Empty; try { IRfcFunction function = this._rfcDestination.Repository.CreateFunction("DATE_GET_WEEK"); function.SetParameterActive(0, true); function.SetValue("DATE", dateStr); function.Invoke(this._rfcDestination); date = function.GetValue("DATE").ToString(); } catch (RfcBaseException ex) { throw ex; } return date; } /// /// 调用Sap函数BAPI_PO_GETDETAIL1 /// (非IDOC) /// /// /// public PurchaseOrder InvokeRFCFunctionGetPoDetail(string poNumber, out string msg) { try { msg = ""; LogTextHelper.WriteLine(_logDir, "调用方法{0},poNumber={1}", "InvokeRFCFunctionGetPoDetail", poNumber); var function = _rfcDestination.Repository.CreateFunction("BAPI_PO_GETDETAIL"); function.SetParameterActive(0, true); function.SetValue("PURCHASEORDER", poNumber); function.SetValue("ACCOUNT_ASSIGNMENT", "X"); function.Invoke(_rfcDestination); var header = function.GetStructure("PO_HEADER"); var purchaseOrder = new PurchaseOrder(header); if (string.IsNullOrEmpty(purchaseOrder.PO_NUMBER)) { msg = string.Format("未找到采购单{0}", poNumber); LogTextHelper.WriteLine(_logDir, "msg={0}", msg); return null; } var details = function.GetTable("PO_ITEMS"); foreach (IRfcStructure detail in details) { purchaseOrder.Materials.Add(new PurchaseOrderMaterial(detail)); } var assignments = function.GetTable("PO_ITEM_ACCOUNT_ASSIGNMENT"); var flag = false; foreach (IRfcStructure assignment in assignments) { if (!flag) { purchaseOrder.SD_DOC = assignment.GetValue("SD_DOC") == null ? "" : assignment.GetValue("SD_DOC").ToString(); purchaseOrder.SDOC_ITEM = assignment.GetValue("SDOC_ITEM") == null ? "" : assignment.GetValue("SDOC_ITEM").ToString(); flag = true; } var poItem = assignment.GetValue("PO_ITEM") == null ? "" : assignment.GetValue("PO_ITEM").ToString(); var m = purchaseOrder.Materials.FirstOrDefault(x => x.PO_ITEM == poItem); if (m != null) { m.SD_DOC = assignment.GetValue("SD_DOC") == null ? "" : assignment.GetValue("SD_DOC").ToString(); m.SDOC_ITEM = assignment.GetValue("SDOC_ITEM") == null ? "" : assignment.GetValue("SDOC_ITEM").ToString(); } } LogTextHelper.WriteLine(_logDir, "purchaseOrder={0}", purchaseOrder); return purchaseOrder; } catch (Exception ex) { msg = ex.Message; LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "InvokeRFCFunctionGetPoDetail", ex.Message); return null; } } /// /// 发送收货确认 /// /// public string InvokeRFCFunctionPoGR(List grMaterials, out string msg) { try { msg = ""; if (grMaterials.Count <= 0) { msg = "确认物料数量不能为0"; return ""; } var function = _rfcDestination.Repository.CreateFunction("/SIE/CHN_MM_WMS_PO_GR"); function.SetParameterActive(0, true); function.SetParameterActive(1, true); function.SetValue("I_BUDAT", DateTime.Now.ToString("yyyyMMdd")); var items = function.GetTable("LT_GOODSMVT_ITEM"); grMaterials.ForEach(x => { items.Append(); items.CurrentRow.SetValue("EBELN", x.EBELN);//采购单号 items.CurrentRow.SetValue("EBELP", x.EBELP);//行号 items.CurrentRow.SetValue("MATNR", x.MATNR);//物料号 items.CurrentRow.SetValue("BWART", x.BWART);//移动类型 items.CurrentRow.SetValue("WERKS", x.WERKS);//工厂 items.CurrentRow.SetValue("LGORT", x.LGORT);//存储位置 items.CurrentRow.SetValue("MENGE", x.MENGE);//数量 }); var grStr = ""; grMaterials.ForEach(x => grStr += x.ToString() + "\r\n"); LogTextHelper.WriteLine(_logDir, "调用方法{0},grMaterials={1}", "InvokeRFCFunctionPoGR", grStr); function.Invoke(_rfcDestination); var materialDoc = function.GetValue("MATERIALDOCUMENT").ToString(); var etReturns = function.GetTable("ET_RETURN"); foreach (IRfcStructure etReturn in etReturns) { var message = etReturn.GetValue("MESSAGE") == null ? "" : etReturn.GetValue("MESSAGE").ToString(); msg = message == "Success" || message == "Successfully" ? "" : message; break; } if (string.IsNullOrEmpty(materialDoc)) { LogTextHelper.WriteLine(_logDir, "msg={0}", msg); } else { LogTextHelper.WriteLine(_logDir, "materialDoc={0}", materialDoc); } return materialDoc; } catch (Exception ex) { msg = ex.Message; LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "InvokeRFCFunctionPoGR", ex.Message); return ""; } } /// /// 发送出库确认 /// /// public string InvokeRFCFunctionWmsGI(List giMaterials, out string msg) { try { msg = ""; var function = _rfcDestination.Repository.CreateFunction("/SIE/CHN_MM_WMS_GI"); function.SetParameterActive(0, true); function.SetParameterActive(1, true); var items = function.GetTable("T_MSEG"); giMaterials.ForEach(x => { if (x.BWART.EndsWith("E")) { x.SOBKZ = "E"; x.BWART = x.BWART.Substring(0, x.BWART.Length - 1); } else if (x.BWART.EndsWith("K")) { x.SOBKZ = "K"; x.BWART = x.BWART.Substring(0, x.BWART.Length - 1); } else { x.SOBKZ = ""; } items.Append(); items.CurrentRow.SetValue("BWART", x.BWART);//移动类型 items.CurrentRow.SetValue("MATNR", x.MATNR);//物料号 items.CurrentRow.SetValue("WERKS", x.WERKS);//工厂 items.CurrentRow.SetValue("LGORT", x.LGORT);//存储位置 items.CurrentRow.SetValue("SOBKZ", x.SOBKZ);//特殊类型 items.CurrentRow.SetValue("LIFNR", x.LIFNR);//供应商 items.CurrentRow.SetValue("KDAUF", x.KDAUF);//销售订单 items.CurrentRow.SetValue("KDPOS", x.KDPOS);//销售订单项 items.CurrentRow.SetValue("ERFMG", x.ERFMG);//数量 items.CurrentRow.SetValue("ERFME", x.ERFME);//单位 items.CurrentRow.SetValue("CHARG", x.CHARG);//工作台 items.CurrentRow.SetValue("SERNR", x.SERNR);//序列号 items.CurrentRow.SetValue("AUFNR", x.AUFNR);//生产订单 items.CurrentRow.SetValue("KZEAR", x.KZEAR);//最终标识 items.CurrentRow.SetValue("RSNUM", x.RSNUM);//保留数 items.CurrentRow.SetValue("RSPOS", x.RSPOS);//保留项 items.CurrentRow.SetValue("BWTAR", x.BWTAR);//验证类型 }); var giStr = ""; giMaterials.ForEach(x => giStr += x.ToString() + "\r\n"); LogTextHelper.WriteLine(_logDir, "调用方法{0},giMaterials={1}", "InvokeRFCFunctionWmsGI", giStr); function.Invoke(_rfcDestination); var materialDoc = function.GetValue("MBLNR").ToString(); var res = function.GetValue("MJAHR").ToString(); var etReturns = function.GetTable("RETURN"); foreach (IRfcStructure etReturn in etReturns) { var message = etReturn.GetValue("MESSAGE") == null ? "" : etReturn.GetValue("MESSAGE").ToString(); msg = message == "Success" || message == "Successfully" ? "" : message; break; } if (string.IsNullOrEmpty(materialDoc)) { LogTextHelper.WriteLine(_logDir, "msg={0}", msg); } else { LogTextHelper.WriteLine(_logDir, "materialDoc={0}, res={1}", materialDoc, res); } return materialDoc; } catch (Exception ex) { msg = ex.Message; LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "InvokeRFCFunctionWmsGI", ex.Message); return ""; } } /// /// 发送出库确认 /// /// public string InvokeRFCFunctionWmsStkMov(List movMaterials, out string msg) { try { msg = ""; var function = _rfcDestination.Repository.CreateFunction("/SIE/CHN_MM_WMS_STKMOV"); function.SetParameterActive(0, true); function.SetParameterActive(1, true); var items = function.GetTable("T_MSEG"); movMaterials.ForEach(x => { if (x.BWART.EndsWith("E")) { x.SOBKZ = "E"; x.BWART = x.BWART.Substring(0, x.BWART.Length - 1); } else if (x.BWART.EndsWith("K")) { x.SOBKZ = "K"; x.BWART = x.BWART.Substring(0, x.BWART.Length - 1); } else { x.SOBKZ = ""; } items.Append(); items.CurrentRow.SetValue("BWART", x.BWART);//移动类型 items.CurrentRow.SetValue("MATNR", x.MATNR);//物料号 items.CurrentRow.SetValue("WERKS", x.WERKS);//工厂 items.CurrentRow.SetValue("LGORT", x.LGORT);//转出库位 items.CurrentRow.SetValue("SOBKZ", x.SOBKZ);//特殊类型 items.CurrentRow.SetValue("LIFNR", x.LIFNR);//供应商 items.CurrentRow.SetValue("KDAUF", x.KDAUF);//销售订单 items.CurrentRow.SetValue("KDPOS", x.KDPOS);//销售订单项 items.CurrentRow.SetValue("ERFMG", x.ERFMG);//数量 items.CurrentRow.SetValue("ERFME", x.ERFME);//单位 items.CurrentRow.SetValue("CHARG", x.CHARG);//批次 items.CurrentRow.SetValue("SERNR", x.SERNR);//序列号 items.CurrentRow.SetValue("UMLGO", x.UMLGO);//转入库位 items.CurrentRow.SetValue("BWTAR", x.BWTAR);//验证类型 }); var movStr = ""; movMaterials.ForEach(x => movStr += x.ToString() + "\r\n"); LogTextHelper.WriteLine(_logDir, "调用方法{0},movMaterials={1}", "InvokeRFCFunctionWmsStkMov", movStr); function.Invoke(_rfcDestination); var materialDoc = function.GetValue("MBLNR").ToString(); var res = function.GetValue("MJAHR").ToString(); var etReturns = function.GetTable("RETURN"); foreach (IRfcStructure etReturn in etReturns) { var message = etReturn.GetValue("MESSAGE") == null ? "" : etReturn.GetValue("MESSAGE").ToString(); msg = message == "Success" || message == "Successfully" ? "" : message; break; } if (string.IsNullOrEmpty(materialDoc)) { LogTextHelper.WriteLine(_logDir, "msg={0}", msg); } else { LogTextHelper.WriteLine(_logDir, "materialDoc={0}, res={1}", materialDoc, res); } return materialDoc; } catch (Exception ex) { msg = ex.Message; LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "InvokeRFCFunctionWmsStkMov", ex.Message); return ""; } } /// /// 调用Sap函数/SIE/CHN_MM_WMS_REVERSEGR /// (非IDOC) /// /// 物料凭证 /// public string InvokeRFCFunctionWmsReverser(string doc, out string msg) { try { msg = ""; LogTextHelper.WriteLine(_logDir, "调用方法{0},doc={1}", "InvokeRFCFunctionWmsReverser", doc); var function = _rfcDestination.Repository.CreateFunction("/SIE/CHN_MM_WMS_REVERSEGR"); function.SetParameterActive(0, true); function.SetValue("MAT_DOC_NUMBER", doc); function.Invoke(_rfcDestination); var etReturns = function.GetTable("ET_RETURN"); foreach (IRfcStructure etReturn in etReturns) { var message = etReturn.GetValue("POSTING_RESULT") == null ? "" : etReturn.GetValue("POSTING_RESULT").ToString(); msg = message.ToLower().Contains("success") ? "" : message; break; } var res = string.IsNullOrEmpty(msg) ? "Success" : "Failure"; LogTextHelper.WriteLine(_logDir, "res={0},msg={1}", res, msg); return res; } catch (Exception ex) { msg = ex.Message; LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "InvokeRFCFunctionGetPoDetail", ex.Message); return null; } } } }