2024-07-16 10:33:50 +08:00
|
|
|
|
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 == "tbSendPoAckToSFTP":
|
|
|
|
|
|
|
|
|
|
|
|
billObj = this.View.Model.DataObject;
|
|
|
|
|
|
if billObj.CustId_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
|
2024-08-29 09:42:49 +08:00
|
|
|
|
--AND t0.FNUMBER = 'SFTP202407071' --测试
|
|
|
|
|
|
AND t0.FNUMBER = 'SFTP202407311'
|
2024-07-16 10:33:50 +08:00
|
|
|
|
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"]);
|
2024-08-29 09:42:49 +08:00
|
|
|
|
|
|
|
|
|
|
# FSFTPPutPath = str(row["FSFTPPUTPATH"]);
|
|
|
|
|
|
# FSFTPPutPath = FSFTPPutPath + '/LEXMKORDERACK/'
|
|
|
|
|
|
# 测试地址
|
|
|
|
|
|
# FSFTPPutPath = '/HUIWE_SFTP_TST/LEXMK_SFTP_TST/LEXMKORDERACK/'
|
|
|
|
|
|
# 正式地址
|
|
|
|
|
|
FSFTPPutPath = '/HUIWE_SFTP_PRD/LEXMK_SFTP_PRD/LEXMKORDERACK/'
|
|
|
|
|
|
|
2024-07-16 10:33:50 +08:00
|
|
|
|
# //存放地址
|
2024-08-29 09:42:49 +08:00
|
|
|
|
sendPath = row["FSFTPBEFORESAVEPATH"] + "/SEND/POACK/";
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
helper = SFTPHelper(FSFTPLinkPath, FSFTPUser, FSFTPPassword, FSFTPPort)
|
|
|
|
|
|
|
|
|
|
|
|
purchaseOrderAck = PurchaseOrderAck()
|
|
|
|
|
|
purchaseOrderAck.TradingPartnerMetadata = PurchaseOrderAckTradingPartnerMetadata()
|
|
|
|
|
|
purchaseOrderAck.TradingPartnerMetadata.SenderName = "Huiwei";
|
|
|
|
|
|
purchaseOrderAck.TradingPartnerMetadata.ReceiverName = "Lexmark";
|
|
|
|
|
|
|
|
|
|
|
|
# billObj = this.View.Model.DataObject;
|
|
|
|
|
|
|
|
|
|
|
|
POAckHeader = PurchaseOrderAckHeader()
|
|
|
|
|
|
POAckHeader.OrderType = "ORDERS ACK"
|
|
|
|
|
|
POAckHeader.PurchaseOrderNumber = billObj["FHeadPO"]
|
|
|
|
|
|
POAckHeader.EndUserOrderNumber = billObj["BillNo"]
|
|
|
|
|
|
POAckHeader.PurchaseOrderDate = (str(billObj["Date"])[0:10]).replace("-","")
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
if POAckHeader.PurchaseOrderNumber == None or POAckHeader.PurchaseOrderNumber.strip() == "":
|
|
|
|
|
|
raise Exception("回复交期失败!PO#:不能为空!")
|
|
|
|
|
|
|
2024-07-16 10:33:50 +08:00
|
|
|
|
POAckLineItem = List[PurchaseOrderAckLineItem]()
|
|
|
|
|
|
|
|
|
|
|
|
saleOrderEntry = billObj.SaleOrderEntry
|
|
|
|
|
|
|
|
|
|
|
|
message = "";
|
2024-08-29 09:42:49 +08:00
|
|
|
|
tempNum = 0
|
2024-07-16 10:33:50 +08:00
|
|
|
|
for saleOrder in saleOrderEntry:
|
|
|
|
|
|
# 已回复交期
|
|
|
|
|
|
IsReplyDelDate = saleOrder["FIsReplyDeliveryDate"]
|
|
|
|
|
|
if IsReplyDelDate == 1:
|
2024-08-29 09:42:49 +08:00
|
|
|
|
tempNum = tempNum + 1;
|
2024-07-16 10:33:50 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
POAckItem = PurchaseOrderAckLineItem()
|
|
|
|
|
|
requestDate = saleOrder["F_ora_Date"]
|
|
|
|
|
|
if requestDate != None:
|
|
|
|
|
|
if message == "":
|
|
|
|
|
|
POAckItem.DeliveryDate = str(DateTimeFormatUtils.ToString(requestDate,"yyyyMMdd"))
|
2024-08-29 09:42:49 +08:00
|
|
|
|
|
|
|
|
|
|
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
|
2024-07-16 10:33:50 +08:00
|
|
|
|
POAckItem.ItemQuantity = saleOrder["Qty"]
|
|
|
|
|
|
POAckItem.ItemUOM = "EA"
|
2024-08-29 09:42:49 +08:00
|
|
|
|
|
|
|
|
|
|
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;
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
POAckLineItem.Add(POAckItem)
|
|
|
|
|
|
else:
|
2024-08-29 09:42:49 +08:00
|
|
|
|
message += "产品编码:{0},回复交期未填写!/r/n".format(saleOrder["MaterialId"]["Number"])
|
|
|
|
|
|
|
|
|
|
|
|
if tempNum == saleOrderEntry.Count:
|
|
|
|
|
|
raise Exception("交期均已回复!");
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
if message != "":
|
|
|
|
|
|
raise Exception(message)
|
|
|
|
|
|
|
|
|
|
|
|
if POAckLineItem.Count == 0:
|
2024-08-29 09:42:49 +08:00
|
|
|
|
raise Exception("无提交数据");
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
purchaseOrderAck.Header = POAckHeader
|
|
|
|
|
|
purchaseOrderAck.LineItem = POAckLineItem
|
|
|
|
|
|
|
|
|
|
|
|
# 转换成XML字符串数据
|
|
|
|
|
|
ackXmlStr = XmlSerializerHelper.Serialize(purchaseOrderAck);
|
|
|
|
|
|
xmldoc = XmlDocument();
|
|
|
|
|
|
|
|
|
|
|
|
# 加载成XML文件
|
|
|
|
|
|
xmldoc.LoadXml(ackXmlStr);
|
|
|
|
|
|
fileName = "POACK" + POAckHeader.PurchaseOrderNumber + GetFileName()
|
|
|
|
|
|
|
|
|
|
|
|
# 保存XML文件
|
|
|
|
|
|
xmldoc.Save(sendPath + fileName);
|
|
|
|
|
|
|
|
|
|
|
|
# 推送对应文件到SFTP
|
2024-08-29 09:42:49 +08:00
|
|
|
|
helper.Put(sendPath + fileName, FSFTPPutPath + fileName);
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
# raise Exception(FSFTPPutPath)
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
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)
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
AddSftpOpRecord(fileName,sendPath,POAckHeader.PurchaseOrderNumber,billObj.BillNo,billObj.Id,"PoAck")
|
|
|
|
|
|
|
|
|
|
|
|
this.View.ShowMessage("POACK推送完成,PO:{0},文件名:{1}".format(POAckHeader.PurchaseOrderNumber,fileName))
|
|
|
|
|
|
|
2024-08-29 09:42:49 +08:00
|
|
|
|
|
2024-07-16 10:33:50 +08:00
|
|
|
|
def GetFileName():
|
|
|
|
|
|
fileName = ""
|
|
|
|
|
|
dateTime = DateTime.Now
|
|
|
|
|
|
# fileName = fileName + dateTime.ToString("yyyyMMdd") + str(DateTimeFormatUtils.GetTimestamp(dateTime))
|
2024-08-29 09:42:49 +08:00
|
|
|
|
fileName = "{0}_{1}_{2}.xml".format(fileName,dateTime.ToString("yyyyMMdd"),str(DateTimeFormatUtils.GetTimestamp(dateTime)))
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
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
|
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"] = "1";
|
|
|
|
|
|
newObj["FResMsg"] = "";
|
|
|
|
|
|
|
|
|
|
|
|
ObjList=List[DynamicObject]();#单据的数据包集合
|
|
|
|
|
|
|
|
|
|
|
|
ObjList.Add(newObj);
|
|
|
|
|
|
#注意!调用保存时,传入的必须是完整的单据数据包
|
|
|
|
|
|
#Q:既然是Save方法,为什么还要传操作代码"Save"呢?
|
|
|
|
|
|
#A:Save方法调用的是单据操作列表中,"操作类型=保存"的操作,可以为单据添加多个"操作类型=保存"的操作。
|
|
|
|
|
|
#例如,可以添加一个"OnlySave",这个操作不注册任何服务插件和服务端服务,仅用于保存单据数据到数据库
|
2024-08-29 09:42:49 +08:00
|
|
|
|
saveRslt = BusinessDataServiceHelper.Save(this.Context, meta.BusinessInfo,ObjList.ToArray(), None, "Save");
|
2024-07-16 10:33:50 +08:00
|
|
|
|
|
|
|
|
|
|
# raise Exception(JsonUtil.Serialize(newObj))
|