using HandleUtils; using HUIWEI.Lexmark.sftp.SDK.Doamin; using Kingdee.BOS; using Kingdee.BOS.Contracts; using Kingdee.BOS.Core; using Kingdee.BOS.WebApi.Client; using Kingdee.BOS.Core.Util; using Kingdee.BOS.Log; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System.Data; using System.IO; using System.ComponentModel; using HUIWEI.Lexmark.sftp.SDK.Domain; using Kingdee.BOS.WebApi.DataEntities; using Kingdee.BOS.Core.Metadata; namespace HUIWEI.Lexmark.sftp.SDK.PO { [HotUpdate, Description("利盟EDI")] public class GetPurchaseOrderFromSFTP : IScheduleService { public void Run(Context ctx, Schedule schedule) { try { var clientNumber = schedule.Parameters; Logger.Info(schedule.Name, $"获取采购订单转换销售订单start......"); var sqlL = $@"/*dialect*/ WITH #辅助资料 AS ( SELECT t1_l.FNAME,t1e_l.FDATAVALUE,t1e.FENTRYID,t1e.FNUMBER FROM T_BAS_ASSISTANTDATA_L t1_l INNER JOIN T_BAS_ASSISTANTDATAENTRY t1e on t1_l.FID = t1e.FID INNER JOIN T_BAS_ASSISTANTDATAENTRY_L t1e_l on t1e_l.FENTRYID = t1e.FENTRYID AND t1e_l.FLOCALEID = 2052 WHERE t1_l.FLOCALEID = 2052 ) SELECT t0.FID,t0.FNUMBER,t0.FSALEORGID ,t0.FSFTPUSER,t0.FSFTPCLIENT,t0.FSFTPPASSWORD,t0.FSFTPLINKPATH,t0.FSFTPPORT ,t0.FSFTPPUTPATH,t0.FSFTPGETPATH ,t0.FSFTPBEFORESAVEPATH,t0.FSFTPAFTERSAVEPATH ,t1.FNUMBER AS 'OrgNumber' ,t2.FNUMBER AS 'CustNumber' ,t3.FNUMBER AS 'DeliveryWay' ,t4.FNUMBER AS 'DeptNumber' ,t5.FNUMBER AS 'SalerNumber' ,t6.FNUMBER AS 'SaleType' ,t7.FNUMBER AS 'CurrNumber' ,t8.FNUMBER AS 'RateType' ,t9.FNUMBER AS 'FMODESOFPACKING' ,t10.FNUMBER AS 'FMODESOFPACKING1' FROM T_CLIENT_SFTP_LINK t0 INNER JOIN T_ORG_ORGANIZATIONS t1 on t1.FORGID = t0.FSALEORGID INNER JOIN T_BD_CUSTOMER t2 on t2.FCUSTID = t0.FCUSTID LEFT JOIN #辅助资料 t3 on t3.FNAME = '交货方式' AND t3.FENTRYID = t0.FHEADDELIVERYWAY LEFT JOIN T_BD_DEPARTMENT t4 on t4.FDEPTID = t0.FSALEDEPTID LEFT JOIN V_BD_SALESMAN t5 on t5.fid = t0.FSALERID LEFT JOIN #辅助资料 t6 on t6.FNAME = '销售类别' AND t6.FENTRYID = t0.FSALETYPE LEFT JOIN T_BD_CURRENCY t7 on t7.FCURRENCYID = t0.FSETTLECURRID LEFT JOIN T_BD_RATETYPE t8 on t8.FRATETYPEID = t0.FEXCHANGETYPEID LEFT JOIN #辅助资料 t9 on t9.FNAME = '包装方式' AND t9.FENTRYID = t0.FMODESOFPACKING LEFT JOIN #辅助资料 t10 on t10.FNAME = '包装方式' AND t10.FENTRYID = t0.FMODESOFPACKING1 WHERE 1=1 AND t0.FNUMBER = '{clientNumber}' AND t0.FDOCUMENTSTATUS = 'C' AND t0.FFORBIDSTATUS = 'A' "; var data = DBServiceHelper.ExecuteDynamicObject(ctx, sqlL); var row = data[0]; //用户 var FSFTPUser = row["FSFTPUSER"].ToString(); //客户 var FSFTPClient = row["FSFTPCLIENT"].ToString(); //密码 var FSFTPPassword = row["FSFTPPASSWORD"].ToString(); //登录地址 var FSFTPLinkPath = row["FSFTPLINKPATH"].ToString(); //端口号 var FSFTPPort = row["FSFTPPORT"].Long2Int(); //推送地址 var FSFTPPutPath = row["FSFTPPUTPATH"].ToString(); //拉取地址 var FSFTPGetPath = row["FSFTPGETPATH"].ToString(); //文件接收地址 var receivePath = row["FSFTPBEFORESAVEPATH"].ToString() + "/RECEIVE/"; if (!Directory.Exists(receivePath)) Directory.CreateDirectory(receivePath); SFTPHelper helper = new SFTPHelper(FSFTPLinkPath, FSFTPUser, FSFTPPassword, FSFTPPort); helper.Mget(FSFTPGetPath, receivePath, (List fileNames) => { var diInfos = new DirectoryInfo(receivePath); var fileInfos = diInfos.GetFiles(); foreach (var fileInfo in fileInfos) { var fileName = fileInfo.Name; var result = false; var orderTypePath = ""; var moveReceivePath = ""; var poNo = ""; var billNo = ""; var billId = 0L; var resMsg = ""; try { using (StreamReader sr = new StreamReader(receivePath + fileName, Encoding.GetEncoding(1252))) { var xml = XmlUtils.LoadSecureXmlDocByReader(sr); var purchase = XmlSerializerHelper.Deserialize(xml.InnerXml); poNo = purchase.Header.PurchaseOrderNumber; if (purchase.Header.OrderType.Equals("ORDERS")) orderTypePath = "PO"; else if (purchase.Header.OrderType.Equals("ORDCHG")) orderTypePath = "POCHG"; Logger.Info(schedule.Name, $"{orderTypePath} file:{fileInfo.Name}......"); //保存单据 result = SaveBill(ctx, purchase, row, ref billNo, ref billId, ref resMsg); } if (result) moveReceivePath = $@"{receivePath}{orderTypePath}/Done/"; else moveReceivePath = $@"{receivePath}{orderTypePath}/Fail/"; if (!Directory.Exists(moveReceivePath)) Directory.CreateDirectory(moveReceivePath); File.Move(receivePath + fileName, moveReceivePath + fileName); } catch (Exception ex) { //resMsg = ex.Message; Logger.Error($"服务器插件:{schedule.Name}", ex.Message, ex); } ReceiveLog(ctx, fileName, moveReceivePath, poNo, billNo, billId, orderTypePath, result ? "1" : "-1", resMsg); } return true; }); } catch (Exception ex) { Logger.Error($"服务器插件:{schedule.Name}", ex.Message, ex); } finally { Logger.Info(schedule.Name, $"获取采购订单转换销售订单end......"); } } private bool SaveBill(Context ctx, PurchaseOrderDoamin purchaseOrder, DynamicObject sftpBaseInfo, ref string BillNo, ref long BillId, ref string resMsg) { BillNo = ""; BillId = 0; var sqlL = $@"/*dialect*/ SELECT t0.FID,t0f.FENTRYID AS FINID,t0e.FENTRYID,t0e.FCPOITEMNO,t0.FHeadPO FROM T_SAL_ORDER t0 INNER JOIN T_SAL_ORDERFIN t0f on t0f.FID = t0.FID INNER JOIN T_SAL_ORDERENTRY t0e on t0e.FID = t0.FID WHERE t0.FHeadPO = '{purchaseOrder.Header.PurchaseOrderNumber}' "; // sqlL = $@"/*dialect*/ //SELECT * FROM TMP_SALEORDER_20240628 t0 //WHERE t0.FHeadPO = '{header.PurchaseOrderNumber}' //"; var dbSet = DBServiceHelper.ExecuteDynamicObject(ctx, sqlL); string result = string.Empty; if (purchaseOrder.Header.OrderType.Equals("ORDERS")) { if (dbSet == null || dbSet.Count == 0) result = Add(ctx, purchaseOrder, sftpBaseInfo); } else if (purchaseOrder.Header.OrderType.Equals("ORDCHG")) { result = Update(ctx, purchaseOrder, sftpBaseInfo, dbSet); } if (result.IsNullOrEmpty()) return false; var resultData = JsonConvert.DeserializeObject(result); if (resultData != null) { var res = resultData.Result; if (res.ResponseStatus.IsSuccess) { var resReturn = res.NeedReturnData[0]; BillId = resReturn.FID; BillNo = resReturn.FBillNo; Logger.Info("EID转换", $"客户订单号:{purchaseOrder.Header.PurchaseOrderNumber},销售订单号:{res.Number},类型:{purchaseOrder.Header.OrderType}"); return res.ResponseStatus.IsSuccess; } resMsg = JsonUtil.SerializeWithOutNull(res.ResponseStatus); } return false; } /// /// 更新 /// /// /// /// private string Update(Context ctx, PurchaseOrderDoamin purchaseOrder, DynamicObject sftpBaseInfo, DynamicObjectCollection dbSet) { try { var header = purchaseOrder.Header; var lineItem = purchaseOrder.LineItem; var dbRow = dbSet[0]; var id = dbRow["FID"].Long2Int(); var finId = dbRow["FINID"].Long2Int(); // 开始构建Web API参数对象 // 参数根对象:包含Creator、NeedUpDateFields、Model这三个子参数 // using Newtonsoft.Json.Linq; // (需引用Newtonsoft.Json.dll) JObject jsonRoot = new JObject(); // Creator: 创建用户 jsonRoot.Add("CREATOR", "administrator"); // NeedUpDateFields: 哪些字段需要更新?为空则表示参数中全部字段,均需要更新 var needUpDateFields = new JArray(); jsonRoot.Add("NEEDUPDATEFIELDS", needUpDateFields); var needReturnFields = new JArray(); jsonRoot.Add("NEEDRETURNFIELDS", needReturnFields); ////主键id needReturnFields.Add("FID"); needReturnFields.Add("FBillNo"); needReturnFields.Add("FHeadPO"); //财务信息id needReturnFields.Add("FSaleOrderFinance.FENTRYID"); //子表id needReturnFields.Add("FSaleOrderEntry.FENTRYID"); jsonRoot.Add("ISDELETEENTRY", "TRUE"); jsonRoot.Add("SUBSYSTEMID", ""); // Model: 单据详细数据参数 JObject model = new JObject(); jsonRoot.Add("Model", model); // 开始设置单据字段值 // 必须设置的字段:主键、单据类型、主业务组织,各必录且没有设置默认值的字段 // 特别注意:字段Key大小写是敏感的,建议从BOS设计器中,直接复制字段的标识属性过来 // 单据主键:必须填写,系统据此判断是新增还是修改单据;新增单据,填0 model.Add("FID", id); JObject basedata = new JObject(); //单据类型 model.Add("FBillTypeID", new JObject { { "FNUMBER", "XSDD01_SYS" } }); model.Add("FDate", ConvertDateTimeFormat(header.PurchaseOrderDate)); //销售部门 model.Add("FSaleOrgId", new JObject { { "FNumber", sftpBaseInfo["OrgNumber"].ToString() } }); model.Add("FCustId", new JObject { { "FNumber", sftpBaseInfo["CustNumber"].ToString() } }); //交货方式 model.Add("FHeadDeliveryWay", new JObject { { "FNumber", "JHFS05_SYS" } }); model.Add("FReceiveId", new JObject { { "FNumber", sftpBaseInfo["CustNumber"].ToString() } }); model.Add("FSaleDeptId", new JObject { { "FNumber", sftpBaseInfo["DeptNumber"].ToString() } }); model.Add("FSettleId", new JObject { { "FNumber", sftpBaseInfo["CustNumber"].ToString() } }); model.Add("FChargeId", new JObject { { "FNumber", sftpBaseInfo["CustNumber"].ToString() } }); //客户单号 model.Add("FHeadPO", header.PurchaseOrderNumber); //销售员 model.Add("FSalerId", new JObject { { "FNumber", sftpBaseInfo["SalerNumber"].ToString() } }); //销售类别 model.Add("F_PAEZ_Assistant1", new JObject { { "FNumber", sftpBaseInfo["SaleType"].ToString() } }); var FSaleOrderFinance = new JObject { { "FENTRYID",finId }, { "FSettleCurrId", new JObject { { "FNumber", sftpBaseInfo["CurrNumber"].ToString() } } }, //{ "FExchangeTypeId", new JObject { { "FNumber", sftpBaseInfo["RateType"].ToString() } } }, { "FBillAmount", header.TotalAmount } }; model.Add("FSaleOrderFinance", FSaleOrderFinance); // 单据类型:必须填写,是基础资料字段 // 基础资料类型字段填值,必须再构建一个JObject对象,设置基础资料编码 // 单据编号:可以忽略,由系统根据编码规则自动生成 // 开始构建单据体参数:集合参数JArray JArray entryRows = new JArray(); // 把单据体行集合,添加到model中,以单据体Key为标识 string entityKey = "FSaleOrderEntry";//单据体的标识 model.Add(entityKey, entryRows); var requestedDeliveryDate = ConvertDateTimeFormat(header.RequestedDeliveryDate); var materials = lineItem.Select(x => x.MaterialNumber).ToList(); var materialSqlL = $@"/*dialect*/ SELECT * FROM ( SELECT t0.FMATERIALID,t0.FNUMBER,t0_l.FNAME,t0_l.FSPECIFICATION,t1.FNUMBER Unit ,CONCAT('FF',ISNULL(t0ap.FAUXPROPERTYID,0)) AS 'FAUXPROPERTYID' ,CONVERT(int,t0ap.FISENABLE) FISENABLE FROM T_BD_MATERIAL t0 INNER JOIN T_BD_MATERIAL_L t0_l on t0_l.FMATERIALID = t0.FMATERIALID AND t0_l.FLOCALEID = 2052 INNER JOIN T_BD_MATERIALSALE t0s on t0s.FMATERIALID = t0.FMATERIALID INNER JOIN T_BD_UNIT t1 on t1.FUNITID = t0s.FSALEUNITID LEFT JOIN t_BD_MaterialAuxPty t0ap on t0.FMATERIALID = t0ap.FMATERIALID WHERE 1=1 AND t0.FUSEORGID = {sftpBaseInfo["FSALEORGID"].Long2Int()} AND t0_l.FSPECIFICATION IN ('{string.Join("','", materials)}') ) t0 PIVOT ( SUM(t0.FISENABLE) FOR t0.FAUXPROPERTYID IN (FF100001,FF100002) ) t1 "; // materialSqlL = $@"/*dialect*/ //SELECT * FROM TMP_MATERIAL_20240628 WHERE FSPECIFICATION IN ('{string.Join("','", materials)}') //"; var datas = DBServiceHelper.ExecuteDynamicObject(ctx, materialSqlL).ToList(); // 通过循环创建单据体行: foreach (var item in lineItem) { // 添加新行,把新行加入到单据体行集合 JObject entryRow = new JObject(); entryRows.Add(entryRow); var itemLineNumber = item.ItemLineNumber; var materialNumber = item.MaterialNumber; var material = datas.FirstOrDefault(w => w["FSPECIFICATION"].ToString().Equals(materialNumber)); var dbEntry = dbSet.FirstOrDefault(w => w["FCPOITEMNO"].ToString().Equals(item.ItemLineNumber)); if (dbEntry != null) entryRow.Add("FENTRYID", dbEntry["FENTRYID"].Long2Int()); //要货日期 entryRow.Add("F_PAEZ_Datetime", requestedDeliveryDate); //客户订单号 entryRow.Add("F_PAEZ_Text ", header.PurchaseOrderNumber); //客户订单行号 entryRow.Add("FCPOItemNo", item.ItemLineNumber); entryRow.Add("FMaterialId", new JObject { { "FNumber", material["FNUMBER"].ToString() } }); entryRow.Add("FUnitID", new JObject { { "FNumber", material["Unit"].ToString() } }); entryRow.Add("FPriceUnitId", new JObject { { "FNumber", material["Unit"].ToString() } }); entryRow.Add("FStockUnitID", new JObject { { "FNumber", material["Unit"].ToString() } }); entryRow.Add("FSettleOrgIds", new JObject { { "FNumber", sftpBaseInfo["OrgNumber"].ToString() } }); entryRow.Add("FOutLmtUnitID", new JObject { { "FNumber", material["Unit"].ToString() } }); var FAuxPropId = new JObject(); if (material["FF100001"].Long2Int() == 1) FAuxPropId.Add("FAUXPROPID__FF100001", new JObject { { "FNumber", sftpBaseInfo["FMODESOFPACKING"].ToString() } }); if (material["FF100002"].Long2Int() == 1) FAuxPropId.Add("FAUXPROPID__FF100002", new JObject { { "FNumber", sftpBaseInfo["FMODESOFPACKING1"].ToString() } }); entryRow.Add("FAuxPropId", FAuxPropId); entryRow.Add("FPrice", item.ItemUnitPrice); entryRow.Add("FQty", item.ItemQuantity); entryRow.Add("FAmount", item.NetPrice); entryRow.Add("FOUTLMTUNIT", "SAL"); } //var dataJson = jsonRoot.ToString(); //Logger.Info("测试EDI转换", jsonRoot.ToString()); var result = Save("SAL_SaleOrder", jsonRoot.ToString(), ctx); return result; } catch (Exception ex) { throw ex; } } /// /// 新增 /// /// /// /// /// private string Add(Context ctx, PurchaseOrderDoamin purchaseOrder, DynamicObject sftpBaseInfo) { try { var header = purchaseOrder.Header; var lineItem = purchaseOrder.LineItem; var id = 0; // 开始构建Web API参数对象 // 参数根对象:包含Creator、NeedUpDateFields、Model这三个子参数 // using Newtonsoft.Json.Linq; // (需引用Newtonsoft.Json.dll) JObject jsonRoot = new JObject(); // Creator: 创建用户 jsonRoot.Add("CREATOR", "administrator"); // NeedUpDateFields: 哪些字段需要更新?为空则表示参数中全部字段,均需要更新 var needUpDateFields = new JArray(); jsonRoot.Add("NEEDUPDATEFIELDS", needUpDateFields); var needReturnFields = new JArray(); jsonRoot.Add("NEEDRETURNFIELDS", needReturnFields); //主键id needReturnFields.Add("FID"); needReturnFields.Add("FBillNo"); needReturnFields.Add("FHeadPO"); //财务信息id needReturnFields.Add("FSaleOrderFinance.FENTRYID"); //子表id needReturnFields.Add("FSaleOrderEntry.FENTRYID"); jsonRoot.Add("ISDELETEENTRY", "TRUE"); jsonRoot.Add("SUBSYSTEMID", ""); // Model: 单据详细数据参数 JObject model = new JObject(); jsonRoot.Add("Model", model); // 开始设置单据字段值 // 必须设置的字段:主键、单据类型、主业务组织,各必录且没有设置默认值的字段 // 特别注意:字段Key大小写是敏感的,建议从BOS设计器中,直接复制字段的标识属性过来 // 单据主键:必须填写,系统据此判断是新增还是修改单据;新增单据,填0 model.Add("FID", id); JObject basedata = new JObject(); //单据类型 model.Add("FBillTypeID", new JObject { { "FNUMBER", "XSDD01_SYS" } }); model.Add("FDate", ConvertDateTimeFormat(header.PurchaseOrderDate)); //销售部门 model.Add("FSaleOrgId", new JObject { { "FNumber", sftpBaseInfo["OrgNumber"].ToString() } }); model.Add("FCustId", new JObject { { "FNumber", sftpBaseInfo["CustNumber"].ToString() } }); //交货方式 model.Add("FHeadDeliveryWay", new JObject { { "FNumber", "JHFS05_SYS" } }); model.Add("FReceiveId", new JObject { { "FNumber", sftpBaseInfo["CustNumber"].ToString() } }); model.Add("FSaleDeptId", new JObject { { "FNumber", sftpBaseInfo["DeptNumber"].ToString() } }); model.Add("FSettleId", new JObject { { "FNumber", sftpBaseInfo["CustNumber"].ToString() } }); model.Add("FChargeId", new JObject { { "FNumber", sftpBaseInfo["CustNumber"].ToString() } }); var billTo = header.BillTo; var billToAddress = $"{billTo.Name} {billTo.AddressLine1} {billTo.City},{billTo.PostalCode} {billTo.Country}"; //收货方地址 model.Add("FReceiveAddress", billToAddress); //客户单号 model.Add("FHeadPO", header.PurchaseOrderNumber); //销售员 model.Add("FSalerId", new JObject { { "FNumber", sftpBaseInfo["SalerNumber"].ToString() } }); //销售类别 model.Add("F_PAEZ_Assistant1", new JObject { { "FNumber", sftpBaseInfo["SaleType"].ToString() } }); var FSaleOrderFinance = new JObject { { "FSettleCurrId", new JObject { { "FNumber", sftpBaseInfo["CurrNumber"].ToString() } } }, //{ "FExchangeTypeId", new JObject { { "FNumber", sftpBaseInfo["RateType"].ToString() } } }, { "FBillAmount", header.TotalAmount } }; model.Add("FSaleOrderFinance", FSaleOrderFinance); // 单据类型:必须填写,是基础资料字段 // 基础资料类型字段填值,必须再构建一个JObject对象,设置基础资料编码 // 单据编号:可以忽略,由系统根据编码规则自动生成 // 开始构建单据体参数:集合参数JArray JArray entryRows = new JArray(); // 把单据体行集合,添加到model中,以单据体Key为标识 string entityKey = "FSaleOrderEntry";//单据体的标识 model.Add(entityKey, entryRows); var requestedDeliveryDate = ConvertDateTimeFormat(header.RequestedDeliveryDate); var materials = lineItem.Select(x => x.MaterialNumber).ToList(); var materialSqlL = $@"/*dialect*/ SELECT * FROM ( SELECT t0.FMATERIALID,t0.FNUMBER,t0_l.FNAME,t0_l.FSPECIFICATION,t1.FNUMBER Unit ,CONCAT('FF',ISNULL(t0ap.FAUXPROPERTYID,0)) AS 'FAUXPROPERTYID' ,CONVERT(int,t0ap.FISENABLE) FISENABLE FROM T_BD_MATERIAL t0 INNER JOIN T_BD_MATERIAL_L t0_l on t0_l.FMATERIALID = t0.FMATERIALID AND t0_l.FLOCALEID = 2052 INNER JOIN T_BD_MATERIALSALE t0s on t0s.FMATERIALID = t0.FMATERIALID INNER JOIN T_BD_UNIT t1 on t1.FUNITID = t0s.FSALEUNITID LEFT JOIN t_BD_MaterialAuxPty t0ap on t0.FMATERIALID = t0ap.FMATERIALID WHERE 1=1 AND t0.FUSEORGID = {sftpBaseInfo["FSALEORGID"].Long2Int()} AND t0_l.FSPECIFICATION IN ('{string.Join("','", materials)}') ) t0 PIVOT ( SUM(t0.FISENABLE) FOR t0.FAUXPROPERTYID IN (FF100001,FF100002) ) t1 "; // materialSqlL = $@"/*dialect*/ //SELECT * FROM TMP_MATERIAL_20240628 WHERE FSPECIFICATION IN ('{string.Join("','", materials)}') //"; var datas = DBServiceHelper.ExecuteDynamicObject(ctx, materialSqlL); if (datas == null || datas.Count == 0) return ""; // 通过循环创建单据体行: foreach (var item in lineItem) { // 添加新行,把新行加入到单据体行集合 JObject entryRow = new JObject(); entryRows.Add(entryRow); var itemLineNumber = item.ItemLineNumber; var materialNumber = item.MaterialNumber; var material = datas.FirstOrDefault(w => w["FSPECIFICATION"].ToString().Equals(materialNumber)); //要货日期 entryRow.Add("F_PAEZ_Datetime", requestedDeliveryDate); //客户订单号 entryRow.Add("F_PAEZ_Text ", header.PurchaseOrderNumber); //客户订单行号 entryRow.Add("FCPOItemNo", item.ItemLineNumber); entryRow.Add("FMaterialId", new JObject { { "FNumber", material["FNUMBER"].ToString() } }); entryRow.Add("FUnitID", new JObject { { "FNumber", material["Unit"].ToString() } }); entryRow.Add("FPriceUnitId", new JObject { { "FNumber", material["Unit"].ToString() } }); entryRow.Add("FStockUnitID", new JObject { { "FNumber", material["Unit"].ToString() } }); entryRow.Add("FSettleOrgIds", new JObject { { "FNumber", sftpBaseInfo["OrgNumber"].ToString() } }); entryRow.Add("FOutLmtUnitID", new JObject { { "FNumber", material["Unit"].ToString() } }); var FAuxPropId = new JObject(); if (material["FF100001"].Long2Int() == 1) FAuxPropId.Add("FAUXPROPID__FF100001", new JObject { { "FNumber", sftpBaseInfo["FMODESOFPACKING"].ToString() } }); if (material["FF100002"].Long2Int() == 1) FAuxPropId.Add("FAUXPROPID__FF100002", new JObject { { "FNumber", sftpBaseInfo["FMODESOFPACKING1"].ToString() } }); entryRow.Add("FAuxPropId", FAuxPropId); entryRow.Add("FPrice", item.ItemUnitPrice); entryRow.Add("FQty", item.ItemQuantity); entryRow.Add("FAmount", item.NetPrice); entryRow.Add("FOUTLMTUNIT", "SAL"); } var dataJson = jsonRoot.ToString(); //Logger.Info("测试EDI转换", jsonRoot.ToString()); var result = Save("SAL_SaleOrder", jsonRoot.ToString(), ctx); return result; } catch (Exception ex) { throw ex; } } /// /// 时间格式转换 /// /// /// private string ConvertDateTimeFormat(string dateTime) { var dt = DateTime.ParseExact(dateTime, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture); return dt.ToString("yyyy-MM-dd"); } /// /// /// /// /// "5b59aae46cb7b1";//DBID,select FDATACENTERID from T_BAS_DATACENTER 在管理中心数据库中执行,可查到账套的DBID /// "administrator";//账套用户名 /// "888888";//账套用户名密码 /// public bool Login(K3CloudApiClient client, string dbid, string username, string password) { var loginResult = client.Login( dbid, username, password, 2052); return loginResult; } public string Save(string formid, string jsonstr, Context ctx) { var sqlL = @"/*dialect*/ SELECT * FROM VIEW_Lexmark_SFTP_Link_WebApi "; var datas = DBServiceHelper.ExecuteDynamicObject(ctx, sqlL); var data = datas[0]; var webApi = data["webApi"].ToString(); string dbid = data["dbid"].ToString(); string username = data["userName"].ToString(); string password = data["passwrod"].ToString(); K3CloudApiClient client = new K3CloudApiClient(webApi); string result = "登录失败,请检查与站点地址、数据中心Id,用户名及密码!"; if (Login(client, dbid, username, password)) { result = client.Save(formid, jsonstr); } return result; } private bool ReceiveLog(Context ctx, string FFileName, string FFilePath, string FPO, string FERPBillNo, long FERPBillId, string FFileTypeText, string FIsSuccess, string msg) { //AddSftpOpRecord(FFileName, FFilePath, FPO, FERPBillNo, FERPBillId, FFileTypeText): var formID = "ora_SftpOperationRecord";//单据FormId FormMetadata meta = MetaDataServiceHelper.Load(ctx, formID) as FormMetadata;//#读取单据的元数据 var objType = meta.BusinessInfo.GetDynamicObjectType();//#获取单据数据包的对象类型 var newObj = new DynamicObject(objType); newObj["FReceiveOrSend"] = "1"; newObj["FFileName"] = FFileName; newObj["FFilePath"] = FFilePath; newObj["FPO"] = FPO; newObj["FERPBillNo"] = FERPBillNo; newObj["FERPBillId"] = FERPBillId; newObj["FFileTypeText"] = FFileTypeText; newObj["FIsSuccess"] = FIsSuccess; newObj["FResMsg"] = msg; var ObjList = new List();//#单据的数据包集合 ObjList.Add(newObj); //# 注意!调用保存时,传入的必须是完整的单据数据包 //# Q:既然是Save方法,为什么还要传操作代码"Save"呢? //# A:Save方法调用的是单据操作列表中,"操作类型=保存"的操作,可以为单据添加多个"操作类型=保存"的操作。 //# 例如,可以添加一个"OnlySave",这个操作不注册任何服务插件和服务端服务,仅用于保存单据数据到数据库 var saveRslt = BusinessDataServiceHelper.Save(ctx, meta.BusinessInfo, ObjList.ToArray(), null, "Save"); return true; } } }