This commit is contained in:
PastSaid
2024-08-29 09:42:49 +08:00
parent fa480006a8
commit 5472714e30
66 changed files with 7417 additions and 243 deletions

View File

@@ -0,0 +1,166 @@
import clr
clr.AddReference("System")
clr.AddReference("System.Xml")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.DataEntity")
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("Kingdee.BOS.Contracts")
clr.AddReference("Kingdee.BOS.ServiceHelper")
clr.AddReference("HandleUtils")
clr.AddReference("HUIWEI.Lexmark.sftp.SDK")
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Contracts import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Metadata import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Util import *
from Kingdee.BOS.Core.Util import *
from System import *
from System.Xml import *
from System.ComponentModel import *
from System.Collections.Generic import *
from System.Text import*
from Kingdee.BOS.ServiceHelper import *
from HandleUtils import *
from HUIWEI.Lexmark.sftp.SDK.Domain import *
def BarItemClick(e):
if e.BarItemKey == "tbSendPoInvoicToSFTP":
billObj = this.View.Model.DataObject;
if billObj.CustomerID_Id != 957286:
return
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.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 = 'SFTP202407071'
AND t0.FDOCUMENTSTATUS = 'C'
AND t0.FFORBIDSTATUS = 'A'
""";
data = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL)
row = data[0]
# //用户
FSFTPUser = row["FSFTPUSER"];
# //客户
FSFTPClient = row["FSFTPCLIENT"];
# //密码
FSFTPPassword = row["FSFTPPASSWORD"];
# //登录地址
FSFTPLinkPath = row["FSFTPLINKPATH"];
# //端口号
FSFTPPort = int(row["FSFTPPORT"]);
# //推送地址 /HUIWE_SFTP_TST/LEXMK_SFTP_TST/LEXMKASNXML
FSFTPPutPath = str(row["FSFTPPUTPATH"]);
FSFTPPutPath = FSFTPPutPath + '/LEXMKASNXML/'
# FSFTPPutPath = '/HUIWE_SFTP_TST/LEXMK_SFTP_TST/LEXMKASNXML/'
# raise Exception(FSFTPPutPath)
# //存放地址
sendPath = row["FSFTPBEFORESAVEPATH"]+ "/SEND/ASN/";
helper = SFTPHelper(FSFTPLinkPath, FSFTPUser, FSFTPPassword, FSFTPPort)
PONumber = ""
InvoicObj = A();
message = "";
# 转换成xml字符串
InvoicXmlStr = XmlSerializerHelper.Serialize(InvoicObj);
# 创建XML文件
xmldoc = XmlDocument();
# 加载成XML文件
xmldoc.LoadXml(InvoicXmlStr)
# 文件名
fileName = "ASN" + PONumber + GetFileName()
# 保存XML文件
xmldoc.Save(sendPath + fileName);
# 推送到SFTP
helper.Put(sendPath + fileName, FSFTPPutPath + fileName);
AddSftpOpRecord(fileName,sendPath,PONumber,billObj.BillNo,billObj.Id,"ASN")
this.View.ShowMessage("ASN推送完成PO{0},文件名:{1}".format(ASNHeader.LEX_PO,fileName))
def GetFileName():
fileName = ""
dateTime = DateTime.Now
# fileName = fileName + dateTime.ToString("yyyyMMdd") + str(DateTimeFormatUtils.GetTimestamp(dateTime))
fileName = "{0}_{1}_{2}.xml".format(fileName,dateTime.ToString("yyyyMMdd"),str(DateTimeFormatUtils.GetTimestamp(dateTime)))
return fileName
# 写记录
def AddSftpOpRecord(FFileName,FFilePath,FPO,FERPBillNo,FERPBillId,FFileTypeText):
formID="ora_SftpOperationRecord";#单据FormId
meta = MetaDataServiceHelper.Load(this.Context, formID);#读取单据的元数据
objType=meta.BusinessInfo.GetDynamicObjectType();#获取单据数据包的对象类型
newObj = DynamicObject(objType)
newObj["FReceiveOrSend"] = "2"
newObj["FFileName"] = FFileName
newObj["FFilePath"] = FFilePath
newObj["FDate"] = DateTime.Now
newObj["FPO"] = FPO
newObj["FERPBillNo"] = FERPBillNo
newObj["FERPBillId"] = FERPBillId
newObj["FFileTypeText"] = FFileTypeText
newObj["FIsSuccess"] = "1";
newObj["FResMsg"] = "";
ObjList=List[DynamicObject]();#单据的数据包集合
ObjList.Add(newObj);
#注意!调用保存时,传入的必须是完整的单据数据包
#Q:既然是Save方法为什么还要传操作代码"Save"呢?
#A:Save方法调用的是单据操作列表中,"操作类型=保存"的操作,可以为单据添加多个"操作类型=保存"的操作。
#例如,可以添加一个"OnlySave",这个操作不注册任何服务插件和服务端服务,仅用于保存单据数据到数据库
saveRslt = BusinessDataServiceHelper.Save(this.Context, meta.BusinessInfo,ObjList.ToArray(), None, "Save");
# raise Exception(JsonUtil.Serialize(newObj))

View File

@@ -11,7 +11,6 @@ clr.AddReference("HandleUtils")
clr.AddReference("HUIWEI.Lexmark.sftp.SDK")
from Kingdee.BOS import *
# from Kingdee.BOS.App import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Contracts import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
@@ -36,7 +35,6 @@ def BarItemClick(e):
billObj = this.View.Model.DataObject;
if billObj.CustId_Id != 957286:
return
# raise Exception(JsonUtil.Serialize(billObj))
sqlL = """/*dialect*/
WITH #辅助资料 AS (
@@ -72,7 +70,8 @@ FROM T_CLIENT_SFTP_LINK t0
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 = 'SFTP202407071'
--AND t0.FNUMBER = 'SFTP202407071' --测试
AND t0.FNUMBER = 'SFTP202407311'
AND t0.FDOCUMENTSTATUS = 'C'
AND t0.FFORBIDSTATUS = 'A'
""";
@@ -91,11 +90,16 @@ WHERE 1=1
FSFTPLinkPath = row["FSFTPLINKPATH"];
# //端口号
FSFTPPort = int(row["FSFTPPORT"]);
# //推送地址/HUIWE_SFTP_TST/LEXMK_SFTP_TST/LEXMKORDERACK
FSFTPPutPath = row["FSFTPPUTPATH"] + "/LEXMKORDERACK";
# FSFTPPutPath = str(row["FSFTPPUTPATH"]);
# FSFTPPutPath = FSFTPPutPath + '/LEXMKORDERACK/'
# 测试地址
# FSFTPPutPath = '/HUIWE_SFTP_TST/LEXMK_SFTP_TST/LEXMKORDERACK/'
# 正式地址
FSFTPPutPath = '/HUIWE_SFTP_PRD/LEXMK_SFTP_PRD/LEXMKORDERACK/'
# //存放地址
sendPath = row["FSFTPBEFORESAVEPATH"]+ "/SEND/POACK/";
sendPath = row["FSFTPBEFORESAVEPATH"] + "/SEND/POACK/";
helper = SFTPHelper(FSFTPLinkPath, FSFTPUser, FSFTPPassword, FSFTPPort)
@@ -112,15 +116,20 @@ WHERE 1=1
POAckHeader.EndUserOrderNumber = billObj["BillNo"]
POAckHeader.PurchaseOrderDate = (str(billObj["Date"])[0:10]).replace("-","")
if POAckHeader.PurchaseOrderNumber == None or POAckHeader.PurchaseOrderNumber.strip() == "":
raise Exception("回复交期失败PO#:不能为空!")
POAckLineItem = List[PurchaseOrderAckLineItem]()
saleOrderEntry = billObj.SaleOrderEntry
message = "";
tempNum = 0
for saleOrder in saleOrderEntry:
# 已回复交期
IsReplyDelDate = saleOrder["FIsReplyDeliveryDate"]
if IsReplyDelDate == 1:
tempNum = tempNum + 1;
continue;
POAckItem = PurchaseOrderAckLineItem()
@@ -128,26 +137,47 @@ WHERE 1=1
if requestDate != None:
if message == "":
POAckItem.DeliveryDate = str(DateTimeFormatUtils.ToString(requestDate,"yyyyMMdd"))
POAckItem.ItemLineNumber = saleOrder["FCPOItemNo"]
poItemNo = saleOrder["FCPOItemNo"]
if poItemNo == None or poItemNo == "":
message += "{0}行,产品编码:{1},客户序列号不存在!",format(saleOrder["Seq"] ,POAckItem.MaterialNumber)
# poItemNo = str(saleOrder["Seq"]).rjust(4,'0').ljust(5,'0')
continue;
POAckItem.ItemLineNumber = poItemNo
POAckItem.ItemQuantity = saleOrder["Qty"]
POAckItem.ItemUOM = "EA"
materialId = saleOrder["MaterialId"]
specification = materialId["Specification"]
for speci in specification:
if speci.Key == 2052:
POAckItem.MaterialNumber = speci.Value
break;
materialNumber= saleOrder["FLexMaterialNumber"]
# if materialNumber == None or materialNumber == "":
# message += "产品编码:{0},客户产品编码无效!/r/n".format(saleOrder["MaterialId"]["Number"])
# break;
# POAckItem.MaterialNumber = materialNumber
if materialNumber != None or materialNumber != "":
POAckItem.MaterialNumber = materialNumber
else:
materialId = saleOrder["MaterialId"]
specification = materialId["Specification"]
for speci in specification:
if speci.Key == 2052:
POAckItem.MaterialNumber = speci.Value
break;
POAckLineItem.Add(POAckItem)
else:
message += "物料编码:{0},回复交期未填写!/r/n".format(saleOrder["MaterialId"]["Number"])
message += "产品编码:{0},回复交期未填写!/r/n".format(saleOrder["MaterialId"]["Number"])
if tempNum == saleOrderEntry.Count:
raise Exception("交期均已回复!");
if message != "":
raise Exception(message)
if POAckLineItem.Count == 0:
return;
raise Exception("无提交数据");
purchaseOrderAck.Header = POAckHeader
purchaseOrderAck.LineItem = POAckLineItem
@@ -164,28 +194,30 @@ WHERE 1=1
xmldoc.Save(sendPath + fileName);
# 推送对应文件到SFTP
helper.Put(sendPath + fileName, FSFTPPutPath);
helper.Put(sendPath + fileName, FSFTPPutPath + fileName);
# updSql = """
# UPDATE t0e SET t0e.FIsReplyDeliveryDate = '1'
# FROM T_SAL_ORDER t0
# INNER JOIN T_SAL_ORDERENTRY t0e on t0e.FID = t0.FID
# WHERE t0.FID = {0}
# AND t0e.FIsReplyDeliveryDate != '1'
# """.format(billObj.Id)
# raise Exception(FSFTPPutPath)
# num = DBServiceHelper.Execute(this.Context, updSql)
updSql = """/*dialect*/
UPDATE t0e SET t0e.FIsReplyDeliveryDate = '1'
FROM T_SAL_ORDER t0
INNER JOIN T_SAL_ORDERENTRY t0e on t0e.FID = t0.FID
WHERE t0.FID = {0}
AND t0e.FIsReplyDeliveryDate != '1'
""".format(billObj.Id)
num = DBServiceHelper.Execute(this.Context, updSql)
AddSftpOpRecord(fileName,sendPath,POAckHeader.PurchaseOrderNumber,billObj.BillNo,billObj.Id,"PoAck")
this.View.ShowMessage("POACK推送完成PO{0},文件名:{1}".format(POAckHeader.PurchaseOrderNumber,fileName))
def GetFileName():
fileName = ""
dateTime = DateTime.Now
# fileName = fileName + dateTime.ToString("yyyyMMdd") + str(DateTimeFormatUtils.GetTimestamp(dateTime))
fileName = "{0}{1}{2}.xml".format(fileName,dateTime.ToString("yyyyMMdd"),str(DateTimeFormatUtils.GetTimestamp(dateTime)))
fileName = "{0}_{1}_{2}.xml".format(fileName,dateTime.ToString("yyyyMMdd"),str(DateTimeFormatUtils.GetTimestamp(dateTime)))
return fileName
@@ -201,6 +233,7 @@ def AddSftpOpRecord(FFileName,FFilePath,FPO,FERPBillNo,FERPBillId,FFileTypeText)
newObj["FReceiveOrSend"] = "2"
newObj["FFileName"] = FFileName
newObj["FFilePath"] = FFilePath
newObj["FDate"] = DateTime.Now
newObj["FPO"] = FPO
newObj["FERPBillNo"] = FERPBillNo
newObj["FERPBillId"] = FERPBillId
@@ -215,6 +248,6 @@ def AddSftpOpRecord(FFileName,FFilePath,FPO,FERPBillNo,FERPBillId,FFileTypeText)
#Q:既然是Save方法为什么还要传操作代码"Save"呢?
#A:Save方法调用的是单据操作列表中,"操作类型=保存"的操作,可以为单据添加多个"操作类型=保存"的操作。
#例如,可以添加一个"OnlySave",这个操作不注册任何服务插件和服务端服务,仅用于保存单据数据到数据库
saveRslt=BusinessDataServiceHelper.Save(this.Context, meta.BusinessInfo,ObjList.ToArray(), None, "Save");
saveRslt = BusinessDataServiceHelper.Save(this.Context, meta.BusinessInfo,ObjList.ToArray(), None, "Save");
# raise Exception(JsonUtil.Serialize(newObj))

View File

@@ -12,10 +12,12 @@ clr.AddReference("HUIWEI.Lexmark.sftp.SDK")
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Contracts import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.Args import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Metadata import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Util import *
from Kingdee.BOS.Core.Util import *
from System import *
@@ -29,13 +31,13 @@ from HUIWEI.Lexmark.sftp.SDK.Domain import *
def BarItemClick(e):
if e.BarItemKey == "tbSendPoASNToSFTP":
# raise Exception(JsonUtil.Serialize(billObj))
billObj = this.View.Model.DataObject;
if billObj.CustomerID_Id != 957286:
return
if billObj["FIsReplyASN"] == "1":
return
# if billObj["FIsReplyASN"] == "1":
# return
sqlL = """/*dialect*/
WITH #辅助资料 AS (
@@ -71,9 +73,11 @@ FROM T_CLIENT_SFTP_LINK t0
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 = 'SFTP202407071'
--AND t0.FNUMBER = 'SFTP202407071' --测试
AND t0.FNUMBER = 'SFTP202407311'
AND t0.FDOCUMENTSTATUS = 'C'
AND t0.FFORBIDSTATUS = 'A'
ORDER BY t0.FID
""";
data = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL)
@@ -90,7 +94,10 @@ WHERE 1=1
# //端口号
FSFTPPort = int(row["FSFTPPORT"]);
# //推送地址 /HUIWE_SFTP_TST/LEXMK_SFTP_TST/LEXMKASNXML
FSFTPPutPath = row["FSFTPPUTPATH"] + "/LEXMKASNXML";
FSFTPPutPath = str(row["FSFTPPUTPATH"]);
FSFTPPutPath = FSFTPPutPath + '/LEXMKASNXML/'
# FSFTPPutPath = '/HUIWE_SFTP_TST/LEXMK_SFTP_TST/LEXMKASNXML/'
# raise Exception(FSFTPPutPath)
# //存放地址
sendPath = row["FSFTPBEFORESAVEPATH"]+ "/SEND/ASN/";
@@ -175,7 +182,7 @@ WHERE 1=1
# 箱数
palletsObj = item["F_ora_Text"];
pallets = 1 if palletsObj == None or palletsObj == "" else int(palletsObj);
pallets = 1 if palletsObj == None or palletsObj.strip() == "" else int(palletsObj);
asnItem.Pallets = pallets;
# 每箱数量
@@ -197,6 +204,7 @@ WHERE 1=1
asnItem.LXK_Description = nameItem.Value
break;
asnItem.Serial_No = item.FLexSN+item.FLexSN1
ASNLineItem.Add(asnItem);
if message != "":
@@ -206,20 +214,24 @@ WHERE 1=1
ASNObj.LineItem = ASNLineItem.ToArray();
# 转换成xml字符串
ackXmlStr = XmlSerializerHelper.Serialize(ASNObj);
ASNXmlStr = XmlSerializerHelper.Serialize(ASNObj);
# 创建XML文件
xmldoc = XmlDocument();
# 加载成XML文件
xmldoc.LoadXml(ASNXmlStr)
# 文件名
fileName = "ASN" + ASNHeader.LEX_PO + GetFileName()
xmldoc = XmlDocument();
xmldoc.LoadXml(ackXmlStr)
# 保存XML文件
xmldoc.Save(sendPath + fileName);
# 推送到SFTP
helper.Put(sendPath + fileName, FSFTPPutPath);
helper.Put(sendPath + fileName, FSFTPPutPath + fileName);
updSql = """
# raise Exception(FSFTPPutPath)
updSql = """/*dialect*/
UPDATE t0 SET t0.FIsReplyASN = '1'
FROM T_SAL_OUTSTOCK t0
WHERE t0.FID = {0}
@@ -228,10 +240,9 @@ WHERE t0.FID = {0}
num = DBServiceHelper.Execute(this.Context, updSql)
billObj["FIsReplyASN"] == "1";
AddSftpOpRecord(fileName,sendPath,ASNHeader.LEX_PO,billObj.BillNo,billObj.Id,"ASN ")
# billObj["FIsReplyASN"] = "1";
AddSftpOpRecord(fileName,sendPath,ASNHeader.LEX_PO,billObj.BillNo,billObj.Id,"ASN")
this.View.ShowMessage("ASN推送完成PO{0},文件名:{1}".format(ASNHeader.LEX_PO,fileName))
@@ -240,7 +251,7 @@ def GetFileName():
fileName = ""
dateTime = DateTime.Now
# fileName = fileName + dateTime.ToString("yyyyMMdd") + str(DateTimeFormatUtils.GetTimestamp(dateTime))
fileName = "{0}{1}{2}.xml".format(fileName,dateTime.ToString("yyyyMMdd"),str(DateTimeFormatUtils.GetTimestamp(dateTime)))
fileName = "{0}_{1}_{2}.xml".format(fileName,dateTime.ToString("yyyyMMdd"),str(DateTimeFormatUtils.GetTimestamp(dateTime)))
return fileName
@@ -256,6 +267,7 @@ def AddSftpOpRecord(FFileName,FFilePath,FPO,FERPBillNo,FERPBillId,FFileTypeText)
newObj["FReceiveOrSend"] = "2"
newObj["FFileName"] = FFileName
newObj["FFilePath"] = FFilePath
newObj["FDate"] = DateTime.Now
newObj["FPO"] = FPO
newObj["FERPBillNo"] = FERPBillNo
newObj["FERPBillId"] = FERPBillId
@@ -270,6 +282,6 @@ def AddSftpOpRecord(FFileName,FFilePath,FPO,FERPBillNo,FERPBillId,FFileTypeText)
#Q:既然是Save方法为什么还要传操作代码"Save"呢?
#A:Save方法调用的是单据操作列表中,"操作类型=保存"的操作,可以为单据添加多个"操作类型=保存"的操作。
#例如,可以添加一个"OnlySave",这个操作不注册任何服务插件和服务端服务,仅用于保存单据数据到数据库
saveRslt=BusinessDataServiceHelper.Save(this.Context, meta.BusinessInfo,ObjList.ToArray(), None, "Save");
saveRslt = BusinessDataServiceHelper.Save(this.Context, meta.BusinessInfo,ObjList.ToArray(), None, "Save");
# raise Exception(JsonUtil.Serialize(newObj))