using HandleUtils; using HUIWEI.Lexmark.sftp.SDK.Domain; 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 Kingdee.BOS.WebApi.DataEntities; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.App; using Kingdee.BOS.Orm; 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 ,t0.FEncoding ,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/"; var encoding = row["FEncoding"].Long2Int(); //设置上下文组织 ctx.CurrentOrganizationInfo = new OrganizationInfo(); ctx.CurrentOrganizationInfo.ID = row["FSALEORGID"].Long2Int(); if (encoding == 0) encoding = 65001; //encoding = 1252; if (!Directory.Exists(receivePath)) Directory.CreateDirectory(receivePath); SFTPHelper helper = new SFTPHelper(FSFTPLinkPath, FSFTPUser, FSFTPPassword, FSFTPPort); //%LEXMK_SFTP_PRD%HUIWE_SFTP_PRD%BINARY% 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(encoding))) { 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); } var receiveResult = ReceiveLog(ctx, fileName, moveReceivePath, poNo, billNo, billId, orderTypePath, result ? "1" : "-1", resMsg); if (receiveResult != null && !receiveResult.IsSuccess) { Logger.Info($"服务器插件:{schedule.Name},日志记录", JsonUtil.Serialize(receiveResult)); } } 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 // ,t0.FDOCUMENTSTATUS //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}' //"; var sqlL = $@"/*dialect*/ EXEC PROC_SELECT_SAL_ORDER_BY_LEX '{purchaseOrder.Header.PurchaseOrderNumber}' "; var dbSet = DBServiceHelper.ExecuteDynamicObject(ctx, sqlL); string result = string.Empty; //Logger.Info("AAAAAA", purchaseOrder.Header.OrderType); if (purchaseOrder.Header.OrderType.Equals("ORDERS")) { if (dbSet == null || dbSet.Count == 0) result = Add(ctx, purchaseOrder, sftpBaseInfo); } else { if (dbSet != null && dbSet.Count > 0) { var data = dbSet[0]; var documentStatus = data["FDOCUMENTSTATUS"] == null ? "" : data["FDOCUMENTSTATUS"].ToString(); var doUnAudit = data["DoUnAudit"] == null ? "" : data["DoUnAudit"].ToString(); //如果但是是审核状态先反审核 if (doUnAudit.Equals("Y") && (documentStatus.Equals("C"))) { //审核\反审核id为10001的物料数据 //获取单据状态转换服务 ISetStatusService setStatusService = ServiceHelper.GetService(); //获取元数据服务 IMetaDataService metaDataService = ServiceHelper.GetService(); //构建id为10001的数据集合 List> lstKeyValuePairs = new List>(); KeyValuePair keyValuePair = new KeyValuePair(data["FID"], ""); lstKeyValuePairs.Add(keyValuePair); //获取物料元数据 FormMetadata materialMetaData = metaDataService.Load(ctx, "SAL_SaleOrder") as FormMetadata; //反审核 IOperationResult unAuditResult = setStatusService.SetBillStatus(ctx, materialMetaData.BusinessInfo, lstKeyValuePairs, null, "UnAudit"); } result = Update(ctx, purchaseOrder, sftpBaseInfo, dbSet); } } if (!result.Contains("{")) { resMsg = result; return false; } ResultData 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}"); } else { resMsg = JsonUtil.SerializeWithOutNull(res.ResponseStatus.Errors); Logger.Info("EID转换", $"客户订单号:{purchaseOrder.Header.PurchaseOrderNumber},错误信息:{resMsg}"); } return res.ResponseStatus.IsSuccess; } return false; } /// /// app层代码 /// /// /// /// /// /// /// /// private bool AddOrUpdate(Context ctx, PurchaseOrderDoamin purchaseOrder, DynamicObject sftpBaseInfo, ref string BillNo, ref long BillId, ref string resMsg) { BillNo = ""; BillId = 0; resMsg = ""; var header = purchaseOrder.Header; var lineItem = purchaseOrder.LineItem; try { var sqlL = $@"/*dialect*/ EXEC PROC_SELECT_SAL_ORDER_BY_LEX '{purchaseOrder.Header.PurchaseOrderNumber}' "; var dbSet = DBServiceHelper.ExecuteDynamicObject(ctx, sqlL); string result = string.Empty; //获取元数据服务 IMetaDataService metaDataService = ServiceHelper.GetService(); //获取物料元数据 FormMetadata saleOrderMetaData = metaDataService.Load(ctx, "SAL_SaleOrder") as FormMetadata; DynamicObject dataObj = null; var dynaicObjType = saleOrderMetaData.BusinessInfo.GetDynamicObjectType(); if (purchaseOrder.Header.OrderType.Equals("ORDERS")) { if (dbSet == null || dbSet.Count == 0) { ////代码调用的话再Option中传入忽略警告参数 //OperateOption operation = OperateOption.Create(); operation.SetIgnoreWarning(true); dataObj = new DynamicObject(dynaicObjType); result = AddSalOrder(ctx, purchaseOrder, sftpBaseInfo, dataObj); } else { var data = dbSet[0]; resMsg = $"客户订单号:{purchaseOrder.Header.PurchaseOrderNumber}已存在,ERP销售订单号:{data["FBILLNO"]},请重新核对数据!"; return false; } } else { if (dbSet != null && dbSet.Count > 0) { var data = dbSet[0]; var documentStatus = data["FDOCUMENTSTATUS"] == null ? "" : data["FDOCUMENTSTATUS"].ToString(); var doUnAudit = data["DoUnAudit"] == null ? "" : data["DoUnAudit"].ToString(); BillId = data["FID"].Long2Int(); //如果但是是审核状态先反审核 if (doUnAudit.Equals("Y") && (documentStatus.Equals("C"))) { //审核\反审核id为10001的物料数据 //获取单据状态转换服务 ISetStatusService setStatusService = ServiceHelper.GetService(); var lstDict = new Dictionary { { BillId, "" } }; //反审核 IOperationResult unAuditResult = setStatusService.SetBillStatus(ctx, saleOrderMetaData.BusinessInfo, lstDict.ToList(), null, "UnAudit"); if (unAuditResult == null || !unAuditResult.IsSuccess) { var unAuditResMsg = unAuditResult.OperateResult.ToList(); var r = unAuditResMsg[0]; } } //获取加载数据服务 IViewService viewService = ServiceHelper.GetService(); var option = OperateOption.Create(); option.SetThrowExceptionWhenNotFind(false);//内码不存在时返回null //var saleOrderObj = viewService.LoadSingle(ctx, BillId, dynaicObjType, option); dataObj = viewService.LoadSingle(ctx, BillId, dynaicObjType, option); result = UpdateSalOrder(ctx, purchaseOrder, sftpBaseInfo, dataObj); } } } catch (Exception ex) { throw ex; } return true; } private string AddSalOrder(Context ctx, PurchaseOrderDoamin purchaseOrder, DynamicObject sftpBaseInfo, DynamicObject dataObj) { try { } catch (Exception ex) { } finally { } return ""; } private string UpdateSalOrder(Context ctx, PurchaseOrderDoamin purchaseOrder, DynamicObject sftpBaseInfo, DynamicObject dataObj) { try { } catch (Exception ex) { } finally { } return ""; } /// /// 更新 /// /// /// /// 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*/ EXEC CHECK_MATERIAL_BY_LEX {sftpBaseInfo["FSALEORGID"].Long2Int()},'{string.Join(",", materials)}' "; // 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("FLexMaterialNumber", item.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 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*/ EXEC CHECK_MATERIAL_BY_LEX {sftpBaseInfo["FSALEORGID"].Long2Int()},'{string.Join(",", materials)}' "; var datas = DBServiceHelper.ExecuteDynamicObject(ctx, materialSqlL); if (datas == null || datas.Count == 0) return $"对应客户产品:{string.Join(",", materials)},不存在。"; // 通过循环创建单据体行: 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)); if (material == null) return $"对应客户产品:{materialNumber},不存在。"; //要货日期 entryRow.Add("F_PAEZ_Datetime", requestedDeliveryDate); //客户订单号 entryRow.Add("F_PAEZ_Text ", header.PurchaseOrderNumber); //客户订单行号 entryRow.Add("FCPOItemNo", item.ItemLineNumber); entryRow.Add("FLexMaterialNumber", item.MaterialNumber); 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); Logger.Info($"服务器插件:EDI 返回结果日志记录", result); 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 IOperationResult 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["FDate"] = DateTime.Now; 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"); Logger.Info($"服务器插件:EDI日志记录信息(ReceiveLog)", JsonUtil.SerializeWithOutNull(saveRslt)); return saveRslt; } } }