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))