Files
GateDge2023_ljy/03.珠海市汇威精密制造有限公司/HUIWEI.Python/Sal_OutStock/BillEventPlugInEx.py

275 lines
11 KiB
Python
Raw Normal View History

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.Core.Metadata.EntityElement import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.Args 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 == "tbSendPoASNToSFTP":
# raise Exception(JsonUtil.Serialize(billObj))
billObj = this.View.Model.DataObject;
if billObj.CustomerID_Id != 957286:
return
if billObj["FIsReplyASN"] == "1":
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 = row["FSFTPPUTPATH"] + "/LEXMKASNXML";
# //存放地址
sendPath = row["FSFTPBEFORESAVEPATH"]+ "/SEND/ASN/";
helper = SFTPHelper(FSFTPLinkPath, FSFTPUser, FSFTPPassword, FSFTPPort)
ASNObj = AdvanceShipmentNotification()
message = "";
ASNHeader = AdvanceShipmentNotificationHeader()
ASNHeader.Supplier = "Huiwei"
# ASNHeader.Supplier = billObj["FLexASNSupplier"]
# if ASNHeader.Supplier == None or ASNHeader.Supplier == "":
# raise Exception("lexASN信息:供应商不能为空!")
# ASNHeader.Supplier = "Ninestar-Supplies";
ASNHeader.Buyer = "Lexmark";
if billObj["FLexPODate"] == None:
raise Exception("lexASN信息:订单日期不能为空")
ASNHeader.PO_Date = (str(billObj["FLexPODate"])[0:10]).replace("-","")
if billObj["FHeadPO"] == None or billObj["FHeadPO"] == "":
raise Exception("lexASN信息:PO单号不能为空")
ASNHeader.LEX_PO = billObj["FHeadPO"]
if billObj["FLexDeliveryDate"] == None:
raise Exception("lexASN信息:发货日期不能为空")
ASNHeader.Delivery_Date = (str(billObj["FLexDeliveryDate"])[0:10]).replace("-","")
if billObj["FLexShipAddress"] == None or billObj["FLexShipAddress"] == "":
raise Exception("lexASN信息:收货地址为空!")
ASNHeader.Ship_Address = billObj["FLexShipAddress"]
if billObj["FLexLotNumber"] == None or billObj["FLexLotNumber"] == "":
raise Exception("lexASN信息:批号为空!")
ASNHeader.Lot_Number = billObj["FLexLotNumber"]
if billObj["FActualEx_factoryDate"] == None:
raise Exception("lexASN信息:实际发货日期为空!")
ASNHeader.Actual_Exfactory_Date = (str(billObj["FActualEx_factoryDate"])[0:10]).replace("-","")
if billObj["FETD_HK"] == None:
raise Exception("lexASN信息:离开HK时间为空")
ASNHeader.ETD_HK = (str(billObj["FETD_HK"])[0:10]).replace("-","")
if billObj["FContainerNumber"] == None or billObj["FContainerNumber"] == "":
raise Exception("lexASN信息:集装箱号码为空!")
ASNHeader.Container_Number = billObj["FContainerNumber"]
if billObj["FContainerType"] == None or billObj["FContainerType"] == "":
raise Exception("lexASN信息:货柜规格为空!")
ASNHeader.Container_Type = billObj["FContainerType"]
if billObj["FLexCarrier"] == None or billObj["FLexCarrier"] == "":
raise Exception("lexASN信息:承运人为空!")
ASNHeader.Carrier = billObj["FLexCarrier"]
if billObj["FVesselNameOrFlight"] == None or billObj["FVesselNameOrFlight"] == "":
raise Exception("lexASN信息:船名/航次为空!")
ASNHeader.Vessel_Name_Or_Flight = billObj["FVesselNameOrFlight"]
if billObj["FBillOfLading"] == None or billObj["FBillOfLading"] == "":
raise Exception("lexASN信息:提单号为空!")
ASNHeader.Bill_Of_Lading = billObj["FBillOfLading"]
if billObj["FShippingCondition"] == None or billObj["FShippingCondition"] == "":
raise Exception("lexASN信息:运输条件为空!")
ASNHeader.Shipping_Condition = billObj["FShippingCondition"]
entry = billObj.SAL_OUTSTOCKENTRY;
ASNLineItem = List[AdvanceShipmentNotificationLineItem]()
for item in entry:
asnItem = AdvanceShipmentNotificationLineItem();
asnItem.Item_Line_Number = item["FCPOItemNo"];
# 销售数量
salunitQty = int(item["SALUNITQTY"]);
asnItem.Container_Qty = salunitQty;
# 箱数
palletsObj = item["F_ora_Text"];
pallets = 1 if palletsObj == None or palletsObj == "" else int(palletsObj);
asnItem.Pallets = pallets;
# 每箱数量
pallertQty = salunitQty / pallets;
asnItem.Pallet_Qty = int(pallertQty);
asnItem.Unit_Of_Measure = "EA";
materialId = item["MaterialID"]
specification = materialId["Specification"]
for speci in specification:
if speci.Key == 2052:
asnItem.LEX_PN = speci.Value
break;
nameObjs = materialId["Name"]
for nameItem in nameObjs:
if nameItem.Key == 2052:
asnItem.LXK_Description = nameItem.Value
break;
ASNLineItem.Add(asnItem);
if message != "":
raise Exception(message)
ASNObj.Header = ASNHeader;
ASNObj.LineItem = ASNLineItem.ToArray();
# 转换成xml字符串
ackXmlStr = XmlSerializerHelper.Serialize(ASNObj);
# 创建XML文件
# 文件名
fileName = "ASN" + ASNHeader.LEX_PO + GetFileName()
xmldoc = XmlDocument();
xmldoc.LoadXml(ackXmlStr)
xmldoc.Save(sendPath + fileName);
# 推送到SFTP
helper.Put(sendPath + fileName, FSFTPPutPath);
updSql = """
UPDATE t0 SET t0.FIsReplyASN = '1'
FROM T_SAL_OUTSTOCK t0
WHERE t0.FID = {0}
AND t0.FIsReplyASN != '1'
""".format(billObj.Id)
num = DBServiceHelper.Execute(this.Context, updSql)
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))
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["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))