881 lines
38 KiB
C#
881 lines
38 KiB
C#
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;
|
||
using System.Runtime.Remoting.Messaging;
|
||
|
||
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<string> 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<PurchaseOrderDoamin>(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);
|
||
|
||
var billDate = ConvertDateTime(purchaseOrder.Header.PurchaseOrderDate);
|
||
var newDate = DateTime.Now;
|
||
var month = (newDate.Year - billDate.Year) * 12 + (newDate.Month - billDate.Month);
|
||
|
||
if (month >= 2)
|
||
{
|
||
resMsg = "当前单据日期跨度超过两个月,请核对是否旧数据。";
|
||
return false;
|
||
}
|
||
|
||
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<ISetStatusService>();
|
||
//获取元数据服务
|
||
IMetaDataService metaDataService = ServiceHelper.GetService<IMetaDataService>();
|
||
//构建id为10001的数据集合
|
||
List<KeyValuePair<object, object>> lstKeyValuePairs = new List<KeyValuePair<object, object>>();
|
||
KeyValuePair<object, object> keyValuePair = new KeyValuePair<object, object>(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<ResultData>(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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// app层代码
|
||
/// </summary>
|
||
/// <param name="ctx"></param>
|
||
/// <param name="purchaseOrder"></param>
|
||
/// <param name="sftpBaseInfo"></param>
|
||
/// <param name="BillNo"></param>
|
||
/// <param name="BillId"></param>
|
||
/// <param name="resMsg"></param>
|
||
/// <returns></returns>
|
||
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<IMetaDataService>();
|
||
//获取物料元数据
|
||
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<ISetStatusService>();
|
||
|
||
var lstDict = new Dictionary<object, object>
|
||
{
|
||
{ 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<IViewService>();
|
||
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="ctx"></param>
|
||
/// <param name="purchaseOrder"></param>
|
||
/// <param name="sftpBaseInfo"></param>
|
||
/// <param name="dataObj"></param>
|
||
/// <returns></returns>
|
||
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 "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新
|
||
/// </summary>
|
||
/// <param name="ctx"></param>
|
||
/// <param name="purchaseOrder"></param>
|
||
/// <param name="sftpBaseInfo"></param>
|
||
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("FSettleOrgIds", new JObject { { "FNumber", "100" } });
|
||
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;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 新增
|
||
/// </summary>
|
||
/// <param name="ctx"></param>
|
||
/// <param name="purchaseOrder"></param>
|
||
/// <param name="sftpBaseInfo"></param>
|
||
/// <returns></returns>
|
||
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("FSettleOrgIds", new JObject { { "FNumber", "100" } });
|
||
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;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 时间格式转换
|
||
/// </summary>
|
||
/// <param name="dateTime"></param>
|
||
/// <returns></returns>
|
||
private string ConvertDateTimeFormat(string dateTime)
|
||
{
|
||
var dt = DateTime.ParseExact(dateTime, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
|
||
return dt.ToString("yyyy-MM-dd");
|
||
}
|
||
|
||
private DateTime ConvertDateTime(string dateTime)
|
||
{
|
||
return DateTime.ParseExact(dateTime, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
|
||
}
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="client"></param>
|
||
/// <param name="dbid">"5b59aae46cb7b1";//DBID,select FDATACENTERID from T_BAS_DATACENTER 在管理中心数据库中执行,可查到账套的DBID</param>
|
||
/// <param name="username">"administrator";//账套用户名</param>
|
||
/// <param name="password">"888888";//账套用户名密码</param>
|
||
/// <returns></returns>
|
||
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();
|
||
//BusinessDataServiceHelper.LoadSingle()
|
||
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<DynamicObject>();//#单据的数据包集合
|
||
|
||
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;
|
||
}
|
||
}
|
||
|
||
}
|