Files
GateDge2023_ljy/03.珠海市汇威精密制造有限公司/HUIWEI.Python/SAL_SaleOrder/BillEventPlugInEx.py
PastSaid 5472714e30 aa
2024-08-29 09:42:49 +08:00

254 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
--AND t0.FNUMBER = 'SFTP202407071' --测试
AND t0.FNUMBER = 'SFTP202407311'
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"]);
# 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/";
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("-","")
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()
requestDate = saleOrder["F_ora_Date"]
if requestDate != None:
if message == "":
POAckItem.DeliveryDate = str(DateTimeFormatUtils.ToString(requestDate,"yyyyMMdd"))
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"
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"])
if tempNum == saleOrderEntry.Count:
raise Exception("交期均已回复!");
if message != "":
raise Exception(message)
if POAckLineItem.Count == 0:
raise Exception("无提交数据");
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
helper.Put(sendPath + fileName, FSFTPPutPath + fileName);
# raise Exception(FSFTPPutPath)
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)))
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))