This commit is contained in:
PastSaid
2024-12-05 15:39:19 +08:00
parent 5472714e30
commit 9725ab5376
128 changed files with 46381 additions and 69 deletions

View File

@@ -0,0 +1,299 @@
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
# raise Exception(JsonUtil.Serialize(billObj))
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)
# FSFTPPutPath = '/HUIWE_SFTP_PRD/LEXMK_SFTP_PRD/LEXMKORDERACK/'
# //存放地址
sendPath = row["FSFTPBEFORESAVEPATH"]+ "/SEND/ASN/";
helper = SFTPHelper(FSFTPLinkPath, FSFTPUser, FSFTPPassword, FSFTPPort)
message = "";
ASNObj = AdvanceShipmentNotification()
ASNHeader = AdvanceShipmentNotificationHeader()
ASNHeader.Supplier = "Huiwei"
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"]
FID = billObj["Id"]
asnSqlL = """/*dialect*/
SELECT t0e.FID,t0e.FENTRYID,CONVERT(varchar(8),t1.FDATE,112) AS 'FDATE',t1.FHEADPO,t0e.FCPOITEMNO,t1e.FLEXMATERIALNUMBER,t0e.FQTY
,tte.FLEXSN AS 'FLexSN',tte.FLEXSN1 AS 'FLexSN1'
,tte.FLEXSN2 AS 'FLexSN2',tte.FLEXSN3 AS 'FLexSN3'
FROM T_SAL_OUTSTOCKENTRY tte
INNER JOIN T_SAL_OUTSTOCKENTRY_LK tte_lk on tte.FENTRYID = tte_lk.FENTRYID
AND tte_lk.FSTABLENAME = 'T_SAL_DELIVERYNOTICEENTRY'
INNER JOIN T_SAL_DELIVERYNOTICEENTRY t0e on tte_lk.FSID = t0e.FENTRYID AND tte_lk.FSBILLID = t0e.FID
INNER JOIN T_SAL_DELIVERYNOTICEENTRY_LK t0e_lk on t0e_lk.FENTRYID = t0e.FENTRYID
AND t0e_lk.FSTABLENAME = 'T_SAL_ORDERENTRY'
INNER JOIN T_SAL_ORDERENTRY t1e on t1e.FID = t0e_lk.FSBILLID AND t1e.FENTRYID = t0e_lk.FSID
INNER JOIN T_SAL_ORDER t1 on t1.FID = t1e.FID
WHERE 1 = 1
AND tte.FID = {0}
ORDER BY t1.FHEADPO,t0e.FCPOITEMNO
""".format(FID)
asnResData = DBServiceHelper.ExecuteDynamicObject(this.Context, asnSqlL)
if asnResData != None and asnResData.Count > 0:
asnPoList = List[str]()
for asn in asnResData:
if asnPoList.Contains(str(asn["FHEADPO"])) == False:
asnPoList.Add(str(asn["FHEADPO"]))
opResult = OperationResult() # 实例化一个对象
resMsg = "";
for po in asnPoList:
asnList = filter(lambda x:str(x["FHEADPO"]) == po,asnResData)
ASNLineItem = List[AdvanceShipmentNotificationLineItem]()
if asnList.Count > 0:
ASNHeader.LEX_PO = po
for item in asnList:
ASNHeader.PO_Date = str(item["FDATE"])
asnItem = AdvanceShipmentNotificationLineItem();
asnItem.Item_Line_Number = item["FCPOItemNo"];
# 销售数量
salunitQty = int(item["FQTY"]);
asnItem.Container_Qty = salunitQty;
# 箱数
asnItem.Pallets = salunitQty;
# 每箱数量
asnItem.Pallet_Qty = 1;
asnItem.Unit_Of_Measure = "EA";
# 客户物料编码
asnItem.LEX_PN = item["FLEXMATERIALNUMBER"]
# 序列号
sn1 = str(item["FLexSN1"]);
snPart1 = ("" if sn1.strip() == "" or sn1.find(",",0,1) == 0 else ",") + sn1
sn2 = str(item["FLexSN2"]);
snPart2 = ("" if sn2.strip() == "" or sn2.find(",",0,1) == 0 else ",") + sn2
sn3 = str(item["FLexSN3"]);
snPart3 = ("" if sn3.strip() == "" or sn3.find(",",0,1) == 0 else ",") + sn3
asnItem.Serial_No = str(item["FLexSN"]) + snPart1.strip() + snPart2.strip() + snPart3.strip()
ASNLineItem.Add(asnItem);
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);
AddSftpOpRecord(fileName,sendPath,ASNHeader.LEX_PO,billObj.BillNo,billObj.Id,"ASN")
resMsg += "ASN推送完成PO{0},文件名:{1}".format(ASNHeader.LEX_PO,fileName)
opResult.OperateResult.Add(OperateResult(Name = ASNHeader.LEX_PO ,Message = "ASN推送完成,文件名:{0}".format(fileName) ,SuccessStatus = True))
# this.View.ShowMessage(resMsg)
this.View.ShowOperateResult(opResult.OperateResult)
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))