287 lines
11 KiB
Python
287 lines
11 KiB
Python
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 == "tbSendPoASNToSFTP":
|
||
|
||
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.FNUMBER = 'SFTP202407311'
|
||
AND t0.FDOCUMENTSTATUS = 'C'
|
||
AND t0.FFORBIDSTATUS = 'A'
|
||
ORDER BY t0.FID
|
||
""";
|
||
|
||
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)
|
||
|
||
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.strip() == "" 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;
|
||
|
||
asnItem.Serial_No = item.FLexSN+item.FLexSN1
|
||
ASNLineItem.Add(asnItem);
|
||
|
||
if message != "":
|
||
raise Exception(message)
|
||
|
||
ASNObj.Header = ASNHeader;
|
||
ASNObj.LineItem = ASNLineItem.ToArray();
|
||
|
||
# 转换成xml字符串
|
||
ASNXmlStr = XmlSerializerHelper.Serialize(ASNObj);
|
||
|
||
# 创建XML文件
|
||
xmldoc = XmlDocument();
|
||
# 加载成XML文件
|
||
xmldoc.LoadXml(ASNXmlStr)
|
||
# 文件名
|
||
fileName = "ASN" + ASNHeader.LEX_PO + GetFileName()
|
||
|
||
# 保存XML文件
|
||
xmldoc.Save(sendPath + fileName);
|
||
|
||
# 推送到SFTP
|
||
helper.Put(sendPath + fileName, FSFTPPutPath + fileName);
|
||
|
||
# raise Exception(FSFTPPutPath)
|
||
|
||
updSql = """/*dialect*/
|
||
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["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)) |