2024-07-16 10:33:50 +08:00
|
|
|
|
using HandleUtils;
|
2024-08-29 09:42:49 +08:00
|
|
|
|
using HUIWEI.Lexmark.sftp.SDK.Domain;
|
2024-07-16 10:33:50 +08:00
|
|
|
|
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;
|
2024-08-29 09:42:49 +08:00
|
|
|
|
using Kingdee.BOS.Core.DynamicForm;
|
|
|
|
|
|
using Kingdee.BOS.App;
|
|
|
|
|
|
using Kingdee.BOS.Orm;
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
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
|
2024-08-29 09:42:49 +08:00
|
|
|
|
,t0.FEncoding
|
2024-07-16 10:33:50 +08:00
|
|
|
|
,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/";
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
var encoding = row["FEncoding"].Long2Int();
|
|
|
|
|
|
|
|
|
|
|
|
//设置上下文组织
|
|
|
|
|
|
ctx.CurrentOrganizationInfo = new OrganizationInfo();
|
|
|
|
|
|
ctx.CurrentOrganizationInfo.ID = row["FSALEORGID"].Long2Int();
|
|
|
|
|
|
|
|
|
|
|
|
if (encoding == 0)
|
|
|
|
|
|
encoding = 65001;
|
|
|
|
|
|
//encoding = 1252;
|
|
|
|
|
|
|
2024-07-16 10:33:50 +08:00
|
|
|
|
if (!Directory.Exists(receivePath))
|
|
|
|
|
|
Directory.CreateDirectory(receivePath);
|
|
|
|
|
|
|
|
|
|
|
|
SFTPHelper helper = new SFTPHelper(FSFTPLinkPath, FSFTPUser, FSFTPPassword, FSFTPPort);
|
2024-08-29 09:42:49 +08:00
|
|
|
|
//%LEXMK_SFTP_PRD%HUIWE_SFTP_PRD%BINARY%
|
2024-07-16 10:33:50 +08:00
|
|
|
|
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
|
|
|
|
|
|
{
|
2024-08-29 09:42:49 +08:00
|
|
|
|
using (StreamReader sr = new StreamReader(receivePath + fileName, Encoding.GetEncoding(encoding)))
|
2024-07-16 10:33:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
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));
|
|
|
|
|
|
}
|
2024-07-16 10:33:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
2024-08-29 09:42:49 +08:00
|
|
|
|
// 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}'
|
|
|
|
|
|
//";
|
|
|
|
|
|
|
2024-07-16 10:33:50 +08:00
|
|
|
|
var sqlL = $@"/*dialect*/
|
2024-08-29 09:42:49 +08:00
|
|
|
|
EXEC PROC_SELECT_SAL_ORDER_BY_LEX '{purchaseOrder.Header.PurchaseOrderNumber}'
|
2024-07-16 10:33:50 +08:00
|
|
|
|
";
|
|
|
|
|
|
var dbSet = DBServiceHelper.ExecuteDynamicObject(ctx, sqlL);
|
|
|
|
|
|
|
|
|
|
|
|
string result = string.Empty;
|
2024-08-29 09:42:49 +08:00
|
|
|
|
//Logger.Info("AAAAAA", purchaseOrder.Header.OrderType);
|
2024-07-16 10:33:50 +08:00
|
|
|
|
if (purchaseOrder.Header.OrderType.Equals("ORDERS"))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (dbSet == null || dbSet.Count == 0)
|
|
|
|
|
|
result = Add(ctx, purchaseOrder, sftpBaseInfo);
|
|
|
|
|
|
}
|
2024-08-29 09:42:49 +08:00
|
|
|
|
else
|
2024-07-16 10:33:50 +08:00
|
|
|
|
{
|
2024-08-29 09:42:49 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
2024-07-16 10:33:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
if (!result.Contains("{"))
|
|
|
|
|
|
{
|
|
|
|
|
|
resMsg = result;
|
2024-07-16 10:33:50 +08:00
|
|
|
|
return false;
|
2024-08-29 09:42:49 +08:00
|
|
|
|
}
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
ResultData resultData = JsonConvert.DeserializeObject<ResultData>(result);
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
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}");
|
2024-08-29 09:42:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
resMsg = JsonUtil.SerializeWithOutNull(res.ResponseStatus.Errors);
|
|
|
|
|
|
Logger.Info("EID转换", $"客户订单号:{purchaseOrder.Header.PurchaseOrderNumber},错误信息:{resMsg}");
|
2024-07-16 10:33:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
return res.ResponseStatus.IsSuccess;
|
|
|
|
|
|
}
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
/// <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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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 "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-07-16 10:33:50 +08:00
|
|
|
|
/// <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*/
|
2024-08-29 09:42:49 +08:00
|
|
|
|
EXEC CHECK_MATERIAL_BY_LEX {sftpBaseInfo["FSALEORGID"].Long2Int()},'{string.Join(",", materials)}'
|
2024-07-16 10:33:50 +08:00
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
|
|
// 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());
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
entryRow.Add("FLexMaterialNumber", item.MaterialNumber);
|
2024-07-16 10:33:50 +08:00
|
|
|
|
//要货日期
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <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*/
|
2024-08-29 09:42:49 +08:00
|
|
|
|
EXEC CHECK_MATERIAL_BY_LEX {sftpBaseInfo["FSALEORGID"].Long2Int()},'{string.Join(",", materials)}'
|
2024-07-16 10:33:50 +08:00
|
|
|
|
";
|
|
|
|
|
|
var datas = DBServiceHelper.ExecuteDynamicObject(ctx, materialSqlL);
|
|
|
|
|
|
if (datas == null || datas.Count == 0)
|
2024-08-29 09:42:49 +08:00
|
|
|
|
return $"对应客户产品:{string.Join(",", materials)},不存在。";
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
// 通过循环创建单据体行:
|
|
|
|
|
|
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));
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
if (material == null)
|
|
|
|
|
|
return $"对应客户产品:{materialNumber},不存在。";
|
|
|
|
|
|
|
2024-07-16 10:33:50 +08:00
|
|
|
|
//要货日期
|
|
|
|
|
|
entryRow.Add("F_PAEZ_Datetime", requestedDeliveryDate);
|
|
|
|
|
|
//客户订单号
|
|
|
|
|
|
entryRow.Add("F_PAEZ_Text ", header.PurchaseOrderNumber);
|
|
|
|
|
|
//客户订单行号
|
|
|
|
|
|
entryRow.Add("FCPOItemNo", item.ItemLineNumber);
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
entryRow.Add("FLexMaterialNumber", item.MaterialNumber);
|
|
|
|
|
|
|
2024-07-16 10:33:50 +08:00
|
|
|
|
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();
|
2024-08-29 09:42:49 +08:00
|
|
|
|
Logger.Info("测试EDI转换", jsonRoot.ToString());
|
2024-07-16 10:33:50 +08:00
|
|
|
|
var result = Save("SAL_SaleOrder", jsonRoot.ToString(), ctx);
|
2024-08-29 09:42:49 +08:00
|
|
|
|
Logger.Info($"服务器插件:EDI 返回结果日志记录", result);
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
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");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <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();
|
|
|
|
|
|
|
|
|
|
|
|
K3CloudApiClient client = new K3CloudApiClient(webApi);
|
|
|
|
|
|
|
|
|
|
|
|
string result = "登录失败,请检查与站点地址、数据中心Id,用户名及密码!";
|
|
|
|
|
|
if (Login(client, dbid, username, password))
|
|
|
|
|
|
{
|
|
|
|
|
|
result = client.Save(formid, jsonstr);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
private IOperationResult ReceiveLog(Context ctx, string FFileName, string FFilePath, string FPO, string FERPBillNo, long FERPBillId, string FFileTypeText, string FIsSuccess, string msg)
|
2024-07-16 10:33:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
//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;
|
2024-08-29 09:42:49 +08:00
|
|
|
|
newObj["FDate"] = DateTime.Now;
|
2024-07-16 10:33:50 +08:00
|
|
|
|
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");
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
Logger.Info($"服务器插件:EDI日志记录信息(ReceiveLog)", JsonUtil.SerializeWithOutNull(saveRslt));
|
|
|
|
|
|
|
|
|
|
|
|
return saveRslt;
|
2024-07-16 10:33:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|