public with sharing class NFM502Controller implements Queueable {
	public String rowData_id;
	//add staic sushanhu 20220302 start
	public static String transUrl;
	public static String transId;
	public static String token;
	public static List<String> sfRecordIds =new List<String>();
	//add staic sushanhu 20220302 end
	public NFM502Controller(String rowData_id) {
		this.rowData_id = rowData_id;
	}

	public static Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
	public void execute(QueueableContext context) {
		// 通过Rowdata.Id来检索日志中的内容（千里马数据等）
		BatchIF_Log__c rowData = [Select Id, Name, Log__c, ErrorLog__c, Log2__c, Log3__c,
		                          Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c,
		                          Log10__c, Log11__c, Log12__c, MessageGroupNumber__c, retry_cnt__c,
		                          NFM501Future_Count__c,
		                          NFM501_Web_Annex_Count__c
		                          from BatchIF_Log__c where RowDataFlg__c = true and Id = :rowData_id];
		//存放报错信息
		BatchIF_Log__c iflog502 = new BatchIF_Log__c();
		iflog502.Type__c = 'NFM501';
		iflog502.RowDataFlg__c = false;
		iflog502.Log__c = ' ';
		iflog502.ErrorLog__c = ' ';
		iflog502.MessageGroupNumber__c = rowData.MessageGroupNumber__c;
		insert iflog502;
		NFM502Controller.WebAnnexGain(rowData.Id, iflog502.Id, false);
	}
	@future(callout = true)
	public static void WebAnnexGain(String rowData_id, String iflog502_id, boolean Manual_execution502) {
		BatchIF_Log__c rowData = [Select Id, Name, Log__c, ErrorLog__c, Log2__c, Log3__c,
		                          Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c, Log10__c,
		                          Log11__c, Log12__c, MessageGroupNumber__c, retry_cnt__c,
		                          NFM501Future_Count__c,
		                          NFM501_Web_Annex_Count__c from BatchIF_Log__c
		                          where RowDataFlg__c = true and Id = :rowData_id];
		BatchIF_Log__c iflog502 = [Select Id, Name, Log__c, ErrorLog__c, Log2__c, Log3__c,
		                           Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c, Log10__c,
		                           Log11__c, Log12__c, MessageGroupNumber__c, retry_cnt__c,
		                           NFM501Future_Count__c,
		                           NFM501_Web_Annex_Count__c from BatchIF_Log__c
		                           where Id = :iflog502_id];

		iflog502.Log__c = iflog502.Log__c == null ? '' : iflog502.Log__c;
		iflog502.ErrorLog__c = iflog502.ErrorLog__c == null ? '' : iflog502.ErrorLog__c;
		rowData.Log__c = rowData.Log__c == null ? '' : rowData.Log__c;
		rowData.ErrorLog__c = rowData.ErrorLog__c == null ? '' : rowData.ErrorLog__c;

		// Savepoint sp = Database.setSavepoint();
		try {
			//update 同staic 20220302 satrt
			// String token;
			//update 同staic 20220302 end
			Datetime oldTime;
			// 从转换表中获取token
			BatchIF_Transfer__c token502 = [Select ID, NFM501_Token__c
			                                FROM BatchIF_Transfer__c Where Table__c = 'NFM501Token'];
			token = token502.NFM501_Token__c;
			// 从转换表中获取获取完token的时间
			BatchIF_Transfer__c oldTime502 = [Select ID, NFM501_Gain_End_Time__c
			                                  FROM BatchIF_Transfer__c Where Table__c = 'NFM501GainEndTime'];
			oldTime = oldTime502.NFM501_Gain_End_Time__c;
			// 对日志中的数据进行解析
			String WebUrl = NFMUtil.QLMgetRowDataStr(rowData);
			NFM501Controller.AllData getQLMData502 = (NFM501Controller.AllData)
			        JSON.deserialize(WebUrl, NFM501Controller.AllData.class);
			if (getQLMData502 == null) {
				return;
			}

			// 判断token是否失效（失效条件为30分钟之后），如果失效，重新获取
			Long timeslot;
			Datetime newTime = System.now();
			if (oldTime == null) {
				timeslot = 2800000;
			} else {
				// 当前时间与获取token结束时间的时间差
				timeslot = newTime.getTime() - oldTime.getTime();
			}
			// System.debug('++++1++++' + token + '  : ' + timeslot);
			if (string.isblank(token) || timeslot > 1800000) {
				// NFMUtil.response response = NFMUtil.receiveToken();
				//update to aws token sushanhu 20220301  start
				NFMUtil.response response = NFMUtil.getAWSToken();
				//判断rowdata中数据获取成功与否，如果失败重发三次，如果大于三次则手动操作
				if (String.isBlank(response.responseBody)) {
					System.debug('response.responseBody:' + response.responseBody);
					iflog502.ErrorLog__c = '502token:' + response.responseBody;
					// rowData.NFM501_Web_Annex_Count__c = 0;
					if (!Manual_execution502) {
						NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
					}
					//更新日志数据
					System.debug('123@@@');
					return;
				}
				token = response.responseBody;
				oldTime = Datetime.now();
				token502.NFM501_Token__c = token;
				oldTime502.NFM501_Gain_End_Time__c = oldTime;
				//update to aws token sushanhu 20220301  end
			}

			//关联附件与招投标项目（通过Id）
			//1.读出招投标中的唯一标识（projecId），将全部招投标projectId存入ProjectIdList
			List<String> ProjectIdList = new List<String>();
			for (NFM501Controller.ListItem ProId : getQLMData502.data.list1) {
				ProjectIdList.add(ProId.projectId);
			}
			System.debug('---===ProjectIdList' + ProjectIdList);
			//2.取其对应的
			List<Tender_information__c> TIList =
			    [Select Id, ProjectId__c, InfoType__c
			     FROM Tender_information__c
			     Where ProjectId__c in :ProjectIdList];
			System.debug('---===2345TIList' + TIList);
			Set<Id> TenIdSet = new Set<Id>();

			Map<String, Tender_information__c> TenMap = new Map<String, Tender_information__c>();
			for (Tender_information__c Ten : TIList) {
				TenMap.put(Ten.ProjectId__c, Ten);
				TenIdSet.add(Ten.Id);
			}

			//循环URL
			// List<Attachment> TenAttList = new List<Attachment>();
			//update to aws pi sushanhu 20220301 start
			List<FileAddress__c> fileList = new List<FileAddress__c>();
			List<String> queryUrlList = new List<String>();
			Map<String, NFM501Controller.ListItem> queryMap = new Map<String, NFM501Controller.ListItem>();
			//update to aws pi sushanhu 20220301 end
			for (NFM501Controller.ListItem QLMWebAtt : getQLMData502.data.list1) {
				if (QLMWebAtt.projectId == null) {
					iflog502.ErrorLog__c += 'Error! [' + QLMWebAtt.projectId + ']NotExist. This information is skipped.\n';
					continue;
				}
				if (QLMWebAtt.areaProvince.equals('香港特别行政区')
				        || QLMWebAtt.areaProvince.equals('澳门特别行政区')
				        || QLMWebAtt.areaProvince.equals('台湾省')) {
					iflog502.ErrorLog__c += 'Error! [' + QLMWebAtt.areaProvince +
					                        ']Is 香港特别行政区(澳门特别行政区,台湾省). This information is skipped.\n';
					continue;
				}
				//update to aws pi sushanhu 20220301 start
				queryUrlList.add(QLMWebAtt.infoQianlimaUrl);
				queryMap.put(QLMWebAtt.infoQianlimaUrl,QLMWebAtt);
				//update to aws pi sushanhu 20220301 start
			// 	//调用接口3
			// 	NFMUtil.response response = NFMUtil.getQLMData(NFMUtil.NFM502_ENDPOINT + QLMWebAtt.infoQianlimaUrl, token);
			// 	if (String.isBlank(response.responseBody)) {
			// 		System.debug('response.responseBody:' + response.responseBody);
			// 		iflog502.ErrorLog__c = '502接口调用：' + response.status;
			// 		rowData.NFM501_Web_Annex_Count__c = 0;
			// 		if (!Manual_execution502) {
			// 			NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
			// 		}
			// 		//更新日志数据
			// 		update token502;
			// 		update oldTime502;
			// 		return;
			// 	}

			// 	//解析后的code报错处理
			// 	string NFM502responseBody = response.responseBody;
			// 	Map<String, Object> Body502 = (Map<String, Object>) JSON.deserializeUntyped(NFM502responseBody);
			// 	if (!Body502.get('code').equals('0')) {
			// 		System.debug('-------9-------');
			// 		iflog502.ErrorLog__c = '502解析：' + Body502.get('msg').tostring() ;
			// 		if (!Manual_execution502) {
			// 			NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
			// 		}
			// 		update token502;
			// 		update oldTime502;
			// 		return;
			// 	}
			// 	System.debug('Body502.data:' + Body502.get('data').tostring() + '---------'
			// 	             + Body502.get('msg').tostring() + '-------' + Body502.get('code').tostring());

			// 	//获取网页信息转存为附件
			// 	//截切数据（使数据成为解析的格式）
			// 	Integer start = NFM502responseBody.indexOf('"infoHtml":"');
			// 	Integer theEnd = NFM502responseBody.lastIndexOf('"},"msg');
			// 	NFM502responseBody = NFM502responseBody.substring(start + 12, theEnd);
			// 	//将其转换为附件
			// 	// System.debug('---------' + NFM502responseBody);
			// 	Attachment WebAtt = new Attachment();
			// 	// System.debug('projectId:' + QLMWebAtt.projectId);
				// if (TenMap.containskey(QLMWebAtt.projectId)) {
				// 	WebAtt.ParentId = TenMap.get(QLMWebAtt.projectId).Id;
				// 	WebAtt.Body = Blob.valueOf(NFM502responseBody);
				// 	WebAtt.Name = TenMap.get(QLMWebAtt.projectId).InfoType__c + ':' + QLMWebAtt.infoTitle + '.html';
				// 	TenAttList.add(WebAtt);
				// }
			 }
			//update to aws pi  sushanhu 20220301 start
			PIHelper.piIntegration pi =PIHelper.getPIIntegrationInfo('NFM502');
			transUrl=pi.searchUrl;
			//调用接口3
			system.debug('Payload for NFM 520:'+JSON.serialize(queryUrlList));
			NFMUtil.response response = NFMUtil.getAWSQLMData(pi.newUrl ,JSON.serialize(queryUrlList), token);
			Map<String, Object> result = (Map<String, Object>)JSON.deserializeUntyped(response.responseBody);
			String statusCode =(String)result.get('status');
			transId =(String)result.get('txId');
			if (!'0'.equals(statusCode)) {
				System.debug('response.responseBody:' + response.responseBody);
				iflog502.ErrorLog__c = '502接口调用：' + (String)result.get('message');
				rowData.NFM501_Web_Annex_Count__c = 0;
				if (!Manual_execution502) {
					NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
				}
				//更新日志数据
				update token502;
				update oldTime502;
				return;
			}

			//解析后的code报错处理
			string NFM502responseBody = response.responseBody;
			Map<String, Object> Body502 = (Map<String, Object>) JSON.deserializeUntyped(NFM502responseBody);
			if (!String.valueOf(Body502.get('status')).equals('0')) {
				System.debug('-------9-------');
				iflog502.ErrorLog__c = '502解析：' + Body502.get('message').tostring() ;
				if (!Manual_execution502) {
					NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
				}
				update token502;
				update oldTime502;
				return;
			}
			System.debug('Body502.data:' + Body502.get('object').tostring() + '---------'
						 + Body502.get('message').tostring() + '-------' + Body502.get('status').tostring());

			//获取aws返回的地址并存储
			
			Map<String, Object> fileMap = (Map<String, Object >)result.get('object');
			for(String url:queryUrlList){
				NFM501Controller.ListItem QLMWebAtt = queryMap.get(url);
				if (TenMap.containskey(QLMWebAtt.projectId)) {
					FileAddress__c file =new FileAddress__c();
					file.ParentRecordId__c = TenMap.get(QLMWebAtt.projectId).Id;
					file.FileName__c = TenMap.get(QLMWebAtt.projectId).InfoType__c + ':' + QLMWebAtt.infoTitle + '.html';
					file.DownloadLink__c =pi.undeleteUrl+(String)fileMap.get(url)+'&fileName='+file.FileName__c;
					file.ViewLink__c = pi.queryUrl+(String)fileMap.get(url) ;
					file.AWS_File_Key__c =(String)fileMap.get(url) ;
					fileList.add(file);
				}
			}
			
			//删除同名的附件
			List<String> UrlList = new List<String>();
			for (NFM501Controller.ListItem UrlName : getQLMData502.data.list1) {
				if (TenMap.containskey(UrlName.projectId)) {
					UrlList.add(TenMap.get(UrlName.projectId).InfoType__c + ':' + UrlName.infoTitle + '.html');
				}
			}

			List<FileAddress__c> DeleFileList = [select id, FileName__c, ParentRecordId__c from FileAddress__c
			                                where FileName__c in :UrlList and ParentRecordId__c in :TenIdSet];
			if (DeleFileList.size() > 0) {
				delete DeleFileList;
			}
			System.debug('----1----' + fileList);
			if (fileList.size() > 0) {
				upsert fileList;
			}
			//确认事务
			 
			for (FileAddress__c file : fileList) {
				system.debug('file--'+json.serialize(file));
				system.debug('file.id'+file.Id);
				sfRecordIds.add(file.Id);
			}
			//update to aws pi  sushanhu 20220301 end
			//  PIHelper.confirmFileTrans('NFM502',1,JSON.serialize(sfRecordIds),transId,token,transUrl);
			PIHelper.insertConfirmTrans('NFM502',1,JSON.serialize(sfRecordIds),transId,0,transUrl,null);
			// if (!confirm) {
			// 	//回滚
			// }
			rowData.NFM501_Web_Annex_Count__c = 0;
		} catch (Exception ex) {
			// Database.rollback(sp);
			// System.debug(Logginglevel.ERROR, 'QLMData_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
			// System.debug(Logginglevel.ERROR, 'QLMData_' + rowData.MessageGroupNumber__c + ':' + ex.getStackTraceString());
			// logstr += '\n' + ex.getMessage();
			//add 事务确认 sushanhu 20220302 satrt
			//  PIHelper.confirmFileTrans('NFM502',0,'',transId,token,transUrl);
			 PIHelper.insertConfirmTrans('NFM502',0,JSON.serialize(sfRecordIds),transId,0,transUrl,null);
			//add 事务确认 sushanhu 20220302 end
			iflog502.ErrorLog__c = '502抛出异常：' + ex.getMessage() + '\n'
			                       + ex.getStackTraceString() + '\n' + iflog502.ErrorLog__c;
			if (!Manual_execution502) {
				NFM501Controller.againSendExceptionRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData,
				        '502抛出异常：' + ex.getMessage() + '\n' + ex.getStackTraceString()
				        + '\n' + rowData.ErrorLog__c +
				        '错误次数已经超过自动收信设定的最大次数，请手动收信');
			}
		}
		update rowData;
		System.debug('+++++++5+++++++' + rowData);
		System.debug('+++++++3+++++++' + iflog502.Log__c);
		System.debug('+++++++2+++++++' + iflog502.ErrorLog__c);
		//如果存入信息超出限制，用省略号代替
		if (iflog502.Log__c.length() > 131072) {
			iflog502.Log__c = iflog502.Log__c.subString(0, 131065) + ' ...';
		}
		if (iflog502.ErrorLog__c.length() > 32768) {
			iflog502.ErrorLog__c = iflog502.ErrorLog__c.subString(0, 32760) + ' ...';
		}
		upsert iflog502;
	}
	public static void test() {
		integer i = 0;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;
		i++;

	}
}