package com.zte.intairsp.home.internal.service.common;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import bee.base.ioc.annotation.Inject;
import bee.base.ioc.annotation.ServiceLocator;
import com.amadeus.xml.satrsp_07_1_1a.Air_MultiAvailabilityReply;
import com.zte.etcpub.common.constant.ManagementBodyConstant;
import com.zte.etcpub.common.constant.TenantConstant;
import com.zte.intairsp.home.constant.IapCacheKey;
import com.zte.intairsp.home.constant.IapConstants;
import com.zte.intairsp.home.dao.IapDataCenter;
import com.zte.intairsp.home.data.bean.IapQueryAirInfoBean;
import com.zte.intairsp.home.data.bean.IntAirFlightBean;
import com.zte.intairsp.home.data.bean.IntAirFreightInfo;
import com.zte.intairsp.home.data.bean.IntAirInfoBean;
import com.zte.intairsp.home.data.bean.IntAirPassageBean;
import com.zte.intairsp.home.data.entity.IapAgencyPriceSet;
import com.zte.intairsp.home.data.entity.IapAirFlight;
import com.zte.intairsp.home.data.entity.IapFlightPcc;
import com.zte.intairsp.home.internal.service.inf.aslan.ws.FareInfo;
import com.zte.intairsp.home.internal.service.inf.espeed.ws.airinfo.AvailableJourney;
import com.zte.intairsp.home.internal.service.inf.gds.ws.avresponse.AirAvailability_Resp;
import com.zte.intairsp.home.internal.service.inf.gds.ws.fdresponse.AVFareInfo;
import com.zte.intairsp.home.service.IapServiceCenter;
import com.zte.intairsp.home.service.common.IapAirInfoService;
import com.zte.pub.common.client.BusinessClientInvoker;
import com.zte.pub.common.constant.SvrTypeConstants;
import com.zte.pub.common.data.bean.ContextInfo;
import com.zte.pub.common.exception.ExceptionFactory;
import com.zte.pub.common.util.BusinessUtils;
import com.zte.pub.common.util.EtcThreadPoolExecutor;
import com.zte.pub.common.util.EtcThreadPoolManager;
import com.zte.pub.common.util.besta.BusinessUtil;
import com.zte.pub.common.util.help.NullU;
import com.zte.pub.common.util.help.ObjectU;
import com.zte.zas.common.data.entity.FbpConfig;
import com.zte.zas.common.data.entity.FbpInvokeService;
import com.zte.zas.common.data.entity.FbpRate;
import com.zte.zas.common.data.entity.FbpVendor;
import com.zte.zas.common.service.ZasServiceCenter;
/**
* 国际机票运价、航班查询服务
*
* @author panqingbao
*
*/
public class IapAirInfoServiceImpl implements IapAirInfoService {
private final Logger logger = LoggerFactory.getLogger(IapAirInfoServiceImpl.class);
//static EtcThreadPoolExecutor executor = new EtcThreadPoolExecutor(100, 500, 0, TimeUnit.SECONDS,
// new ArrayBlockingQueue<Runnable>(20), new ThreadPoolExecutor.DiscardOldestPolicy());
//static EtcThreadPoolExecutor fdExecutor = new EtcThreadPoolExecutor(50, 200, 0, TimeUnit.SECONDS,
// new ArrayBlockingQueue<Runnable>(20), new ThreadPoolExecutor.DiscardOldestPolicy());
static EtcThreadPoolManager fdThreadPoolManager=new EtcThreadPoolManager(25);
static EtcThreadPoolManager threadPoolManager=new EtcThreadPoolManager(50);
static EtcThreadPoolManager amadeusAVThreadPoolManager=new EtcThreadPoolManager(50);
@Inject
private IapServiceCenter iapServiceCenter;
@Inject
private IapDataCenter iapDataCenter;
@Inject
@ServiceLocator(SvrTypeConstants.ST_OSGI)
private ZasServiceCenter zasServiceCenter;
@Inject
@ServiceLocator(SvrTypeConstants.ST_OSGI)
BusinessClientInvoker invoker;
private final static String ENABLED_FLAG_Y = "Y";
private final static String TARGET_CLENT_CLASS = "com.zte.intairsp.home.business.BusinessCenter4IntairSpThr";
@Override
public void findIntAirByFDAndAV(ContextInfo context, IapQueryAirInfoBean param, String vendorCode,
List<IapAgencyPriceSet> agencyPriceList, List<IntAirInfoBean> dataListAll,
List<IapAirFlight> airFlights, String inlandFlag, FbpConfig commissionConfig, String gds,
HashMap<String, String> configs) throws Exception {
if (IapConstants.INLAND_FLAG_I.equals(inlandFlag)){
this.findIntAirByFDAndEspeedAV(context, param, vendorCode, agencyPriceList, dataListAll, airFlights, commissionConfig, configs);
}
else if (IapConstants.INLAND_FLAG_O.equals(inlandFlag)){
if (IapConstants.BOOK_SYSTEM_1A.equals(gds)){
this.findIntAirByFDAndAmadeusAV(context, param, vendorCode, agencyPriceList, dataListAll, airFlights, commissionConfig, configs);
}
else {
this.findIntAirByFDAndGwsAV(context, param, vendorCode, agencyPriceList, dataListAll, airFlights, commissionConfig, configs);
}
}
}
@SuppressWarnings("static-access")
private void findIntAirByFDAndEspeedAV(ContextInfo context, IapQueryAirInfoBean param, String vendorCode,
List<IapAgencyPriceSet> agencyPriceList, List<IntAirInfoBean> dataListAll, List<IapAirFlight> airFlights,
FbpConfig commissionConfig, HashMap<String, String> configs)
throws Exception {
// FD、AV供应商CODE是GWS
vendorCode = IapConstants.VENDOR_CODE_GWS;
String aslanVendorCode = IapConstants.VENDOR_CODE_ASLAN;
String espeedVendorCode = IapConstants.VENDOR_CODE_ESPEED;
// 取航线承运人配置
List<String> airlineList = this.getFreightAirlineList(param, airFlights);
if (!airlineList.isEmpty()) {
//ESPEED AV
boolean espeedAVFlag = false;
List<AvailableJourney> availableJourneys = new ArrayList<AvailableJourney>();
FbpInvokeService espeedInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FIND_FLIGHT, espeedVendorCode);
QueryEspeedAVAirInfoThread espeedAvThread = new QueryEspeedAVAirInfoThread(context, param, espeedVendorCode, espeedInvokeService);
espeedAvThread.start();
//List<IntAirInfoBean> avDataList = new ArrayList<IntAirInfoBean>();
List<IntAirInfoBean> aslanDataList = new ArrayList<IntAirInfoBean>();
// 国际机票配置
FbpConfig config = zasServiceCenter.getSysConfigService().findFbpConfigFromCache(IapConstants.INTAIR_DOM_FARE_CONFIG);
boolean aslanFareFlag = false;
boolean localFareFlag = false;
if (config != null && NullU.isNotNull(config.getConfigValue())){
Long managementBodyId = context.getManagementBodyId();
if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_ASLAN)
&& !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_ASLAN))){
aslanFareFlag = true;
}
if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_LOCAL)
&& !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_LOCAL))){
localFareFlag = true;
}
}
/*// AV
boolean avGoFlag = false;
boolean avReturnFlag = false;
if (IapConstants.SINGLE.equals(param.getFlightType())) {
avReturnFlag = true;
}
// 去程
List<AirAvailability_Resp> goRespList = new ArrayList<AirAvailability_Resp>();
IapQueryAirInfoBean avGoParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);
FbpInvokeService avInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_AV, vendorCode);
QueryAVAirInfoThreadPool avGoThread = new QueryAVAirInfoThreadPool(context, avGoParam, vendorCode,
airlineList, avInvokeService);
avGoThread.start();
// FD
List<AVFareInfo> aVFareInfos = new ArrayList<AVFareInfo>();
boolean fdFlag = false;
FbpInvokeService fdInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FD, vendorCode);
List<String> fDAirList = this.buildFDAirlineList(airlineList);
QueryFDFareInfoThreadPool fdThread = new QueryFDFareInfoThreadPool(context, param, vendorCode,
fDAirList, airFlights, fdInvokeService);
fdThread.start();*/
// ASLAN FARE
List<FareInfo> aslanFareInfos = new ArrayList<FareInfo>();
boolean aslanFlag = false;
FbpInvokeService aslanInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_ASLANSERVICE, aslanVendorCode);
QueryAslanFareThread aslanThread = null;
if (aslanInvokeService != null && aslanFareFlag){
aslanThread = new QueryAslanFareThread(context, param, aslanVendorCode, aslanInvokeService);
aslanThread.start();
}
/*// 回程
List<AirAvailability_Resp> returnRespList = new ArrayList<AirAvailability_Resp>();
if (IapConstants.RETURN.equals(param.getFlightType())) {
// AV
IapQueryAirInfoBean avReturnParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);
avReturnParam.setDeparture(param.getArrival());
avReturnParam.setArrival(param.getDeparture());
avReturnParam.setDepartureDate(param.getReturnDate());
QueryAVAirInfoThreadPool avReturnThread = new QueryAVAirInfoThreadPool(context, avReturnParam,
vendorCode, airlineList, avInvokeService);
avReturnThread.start();
long startTime3 = new Date().getTime();
// 实时查询运价信息。必须实时查询,不能放缓存,因为查询中有条件过滤。
freightItems = iapServiceCenter.getIapFreightService().findIapFreightItemVs(context, param);
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime3) / 1000;
if (interval > 20) {
avReturnFlag = true;
break;
}
if (avReturnThread.isRunEnd()) {
returnRespList = avReturnThread.getRespList();
avReturnFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询回程AV错误:" + e.getMessage(), e);
}
}
}
else {
// 实时查询运价信息。必须实时查询,不能放缓存,因为查询中有条件过滤。
freightItems = iapServiceCenter.getIapFreightService().findIapFreightItemVs(context, param);
}
long startTime2 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime2) / 1000;
if (interval > 20) {
avGoFlag = true;
break;
}
if (avGoThread.isRunEnd()) {
goRespList = avGoThread.getRespList();
avGoFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程AV错误:" + e.getMessage(), e);
}
}
long startTime_FD = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime_FD) / 1000;
if (interval > 20) {
fdFlag = true;
break;
}
if (fdThread.isRunEnd()) {
aVFareInfos = fdThread.getaVFareInfos();
fdFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程FD错误:" + e.getMessage(), e);
}
}*/
if (aslanFareFlag){
long startTime_ASLAN = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime_ASLAN) / 1000;
if (interval > 50) {
aslanFlag = true;
break;
}
if (aslanThread.isRunEnd()) {
aslanFareInfos = aslanThread.getFareInfos();
aslanFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程ASLAN错误:" + e.getMessage(), e);
}
}
}
long startTime_ESPEED = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime_ESPEED) / 1000;
if (interval > 50) {
espeedAVFlag = true;
break;
}
if (espeedAvThread.isRunEnd()) {
availableJourneys = espeedAvThread.getAvailableJourneys();
espeedAVFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程ESPEED AV错误:" + e.getMessage(), e);
}
}
// 处理AV、ASLANFARE
if (aslanFareFlag){
long startTime5 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime5) / 1000;
if (interval > 80) {
break;
}
if (aslanFlag && espeedAVFlag) {
if (!aslanFareInfos.isEmpty()){
// 设置税费
setAslanFareTax(param, aslanFareInfos, airFlights);
String pcc = espeedInvokeService.getAttribute1(); //OFFICENO
aslanDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByEspeedAvAndAslan(aslanFareInfos,
availableJourneys, pcc, espeedVendorCode);
}
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("组装航班等待错误:" + e.getMessage(), e);
}
}
dataListAll.addAll(aslanDataList);
}
/*// 处理AV、FD
long startTime4 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime4) / 1000;
if (interval > 30) {
break;
}
if (aslanFareFlag){
if (aslanFlag && fdFlag && avGoFlag && avReturnFlag) {
for (int i = aVFareInfos.size() - 1; i >=0; i--){
AVFareInfo aVFareInfo = aVFareInfos.get(i);
for (FareInfo fareInfo : aslanFareInfos){
if (aVFareInfo.getFIC().equals(fareInfo.getFarebasis())){
aVFareInfos.remove(aVFareInfo);
}
}
}
String pcc = avInvokeService.getAttribute4();
avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(aVFareInfos, goRespList,
returnRespList, pcc, vendorCode);
if (avDataList != null && avDataList.size() > 0 && avDataList.size() <= 500) {
}
break;
}
}
else {
if (fdFlag && avGoFlag && avReturnFlag) {
avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(aVFareInfos, goRespList,
returnRespList, pcc, vendorCode);
if (avDataList != null && avDataList.size() > 0 && avDataList.size() <= 500) {
}
break;
}
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("组装航班等待错误:" + e.getMessage(), e);
}
}
if (avDataList != null && avDataList.size() > 0) {
iapServiceCenter.getIapCurrencyService().currencyConverter(context, avDataList, param);
try {
iapServiceCenter.getIapAgencyService().reduceAgencyPrice(avDataList, agencyPriceList, param);
} catch (RuntimeException e) {
logger.error("匹配并减去代理费错误:", e);
}
}
dataListAll.addAll(avDataList);*/
// 实时查询运价信息。必须实时查询,不能放缓存,因为查询中有条件过滤。
if (localFareFlag){
try {
List<IntAirInfoBean> list = iapServiceCenter.getIapFreightSearchService().findLocalFreightByEspeed(context, param, agencyPriceList);
dataListAll.addAll(list);
} catch (Exception e) {
logger.error("ESPEED FOR FREIGHT 查询本地运价出错:" + e.getMessage(), e);
}
}
}
}
@SuppressWarnings("static-access")
private void findIntAirByFDAndGwsAV(ContextInfo context, IapQueryAirInfoBean param, String vendorCode,
List<IapAgencyPriceSet> agencyPriceList, List<IntAirInfoBean> dataListAll,
List<IapAirFlight> airFlights, FbpConfig commissionConfig, HashMap<String, String> configs) throws Exception {
// FD、AV供应商CODE是GWS
vendorCode = IapConstants.VENDOR_CODE_GWS;
String aslanVendorCode = IapConstants.VENDOR_CODE_ASLAN;
// 取航线承运人配置
List<String> airlineList = this.getFreightAirlineList(param, airFlights);
if (!airlineList.isEmpty()) {
List<IntAirInfoBean> avDataList = new ArrayList<IntAirInfoBean>();
List<IntAirInfoBean> fdDataList = new ArrayList<IntAirInfoBean>();
List<IntAirInfoBean> aslanDataList = new ArrayList<IntAirInfoBean>();
// 国际机票配置
FbpConfig config = zasServiceCenter.getSysConfigService().findFbpConfigFromCache(IapConstants.INTAIR_INT_FARE_CONFIG);
boolean aslanFareFlag = false;
boolean localFareFlag = false;
boolean fdFareFlag = false;
if (config != null && NullU.isNotNull(config.getConfigValue())){
Long managementBodyId = context.getManagementBodyId();
if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_ASLAN)
&& !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_ASLAN))){
aslanFareFlag = true;
}
if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_LOCAL)
&& !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_LOCAL))){
localFareFlag = true;
}
if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_FD)
&& !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_FD))){
fdFareFlag = true;
}
}
// AV
boolean avGoFlag = false;
boolean avReturnFlag = false;
if (IapConstants.SINGLE.equals(param.getFlightType())) {
avReturnFlag = true;
}
// 去程
List<AirAvailability_Resp> goRespList = new ArrayList<AirAvailability_Resp>();
IapQueryAirInfoBean avGoParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);
FbpInvokeService avInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_AV, vendorCode);
String pcc = avInvokeService.getAttribute4();
// 特殊PCC配置
IapFlightPcc iapFlightPcc = iapServiceCenter.getIapCommonService().getFlightPcc(context, param, IapConstants.INTERFACE_TYPE_AV);
if (iapFlightPcc != null){
String p = iapFlightPcc.getPcc();
if (NullU.isNotNull(p)){
avInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_AV + "_" + p, vendorCode);
pcc = p;
}
}
QueryAVAirInfoThreadPool avGoThread = new QueryAVAirInfoThreadPool(context, avGoParam, vendorCode,
airlineList, avInvokeService);
avGoThread.start();
// FD
List<AVFareInfo> aVFareInfos = new ArrayList<AVFareInfo>();
List<AVFareInfo> fDFareInfos = new ArrayList<AVFareInfo>();
boolean fdFlag = false;
FbpInvokeService fdInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FD, vendorCode);
if (iapFlightPcc != null){
String p = iapFlightPcc.getPcc();
if (NullU.isNotNull(p)){
fdInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FD + "_" + p, vendorCode);
pcc = p;
}
}
List<String> fDAirList = this.buildFDAirlineList(airlineList);
FbpRate rate = zasServiceCenter.getFbpRateService().getRateByCurrencyFromCache(IapConstants.IAP_CURRENCY_HKD,
IapConstants.IAP_CURRENCY_CNY);
QueryFDFareInfoThreadPool fdThread = new QueryFDFareInfoThreadPool(context, param, vendorCode,
fDAirList, airFlights, fdInvokeService, rate);
fdThread.start();
// ASLAN FARE
List<FareInfo> aslanFareInfos = new ArrayList<FareInfo>();
boolean aslanFlag = false;
FbpInvokeService aslanInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_ASLANSERVICE, aslanVendorCode);
QueryAslanFareThread aslanThread = null;
if (aslanInvokeService != null && aslanFareFlag){
aslanThread = new QueryAslanFareThread(context, param, aslanVendorCode, aslanInvokeService);
aslanThread.start();
}
// 回程
List<AirAvailability_Resp> returnRespList = new ArrayList<AirAvailability_Resp>();
if (IapConstants.RETURN.equals(param.getFlightType())) {
// AV
IapQueryAirInfoBean avReturnParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);
avReturnParam.setDeparture(param.getArrival());
avReturnParam.setArrival(param.getDeparture());
avReturnParam.setDepartureDate(param.getReturnDate());
QueryAVAirInfoThreadPool avReturnThread = new QueryAVAirInfoThreadPool(context, avReturnParam,
vendorCode, airlineList, avInvokeService);
avReturnThread.start();
long startTime3 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime3) / 1000;
if (interval > 50) {
avReturnFlag = true;
break;
}
if (avReturnThread.isRunEnd()) {
returnRespList = avReturnThread.getRespList();
avReturnFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询回程AV错误:" + e.getMessage(), e);
}
}
}
long startTime2 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime2) / 1000;
if (interval > 50) {
avGoFlag = true;
break;
}
if (avGoThread.isRunEnd()) {
goRespList = avGoThread.getRespList();
avGoFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程AV错误:" + e.getMessage(), e);
}
}
long startTime_FD = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime_FD) / 1000;
if (interval > 50) {
fdFlag = true;
break;
}
if (fdThread.isRunEnd()) {
aVFareInfos = fdThread.getaVFareInfos();
fDFareInfos = aVFareInfos;
fdFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程FD错误:" + e.getMessage(), e);
}
}
if (aslanFareFlag){
long startTime_ASLAN = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime_ASLAN) / 1000;
if (interval > 50) {
aslanFlag = true;
break;
}
if (aslanThread.isRunEnd()) {
aslanFareInfos = aslanThread.getFareInfos();
aslanFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程ASLAN错误:" + e.getMessage(), e);
}
}
}
// 处理AV、ASLANFARE
if (aslanFareFlag){
long startTime5 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime5) / 1000;
if (interval > 80) {
break;
}
if (aslanFlag && avGoFlag && avReturnFlag) {
if (!aslanFareInfos.isEmpty()){
// 设置税费
setAslanFareTax(param, aslanFareInfos, airFlights);
aslanDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAvAndAslan(aslanFareInfos,
goRespList, returnRespList, pcc, aslanVendorCode);
}
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("组装航班等待错误:" + e.getMessage(), e);
}
}
dataListAll.addAll(aslanDataList);
}
// 处理AV、FD
long startTime4 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime4) / 1000;
if (interval > 80) {
break;
}
if (aslanFareFlag){
if (aslanFlag && fdFlag && avGoFlag && avReturnFlag) {
for (int i = aVFareInfos.size() - 1; i >=0; i--){
AVFareInfo aVFareInfo = aVFareInfos.get(i);
for (FareInfo fareInfo : aslanFareInfos){
if (aVFareInfo.getFIC().equals(fareInfo.getFarebasis())){
aVFareInfos.remove(aVFareInfo);
}
}
}
avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(aVFareInfos, goRespList,
returnRespList, pcc, vendorCode);
fdDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(fDFareInfos, goRespList,
returnRespList, pcc, vendorCode);
break;
}
}
else {
if (fdFlag && avGoFlag && avReturnFlag) {
avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAv(aVFareInfos, goRespList,
returnRespList, pcc, vendorCode);
fdDataList = ObjectU.makeTargetList(avDataList, IntAirInfoBean.class);
break;
}
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("组装航班等待错误:" + e.getMessage(), e);
}
}
if (avDataList != null && avDataList.size() > 0) {
// 汇率转换,代理费计算
iapServiceCenter.getIapCurrencyService().currencyConverter(context, avDataList, param);
try {
iapServiceCenter.getIapAgencyService().reduceAgencyPrice(avDataList, agencyPriceList, param);
} catch (RuntimeException e) {
logger.error("匹配并减去代理费错误:", e);
}
// 后返处理
try {
if (NullU.isNotNull(context.getManagementBodyId()) && commissionConfig != null && NullU.isNotNull(commissionConfig.getConfigValue())
&& commissionConfig.getConfigValue().contains("," + context.getManagementBodyId() + ",")){
iapServiceCenter.getIapCommissionService().commissionProcess(context, avDataList);
}
} catch (RuntimeException e) {
logger.error("后返处理错误:", e);
}
}
if (fdFareFlag && !avDataList.isEmpty()){
dataListAll.addAll(avDataList);
}
if (localFareFlag){
// 取FD运价航班匹配
try {
List<IntAirInfoBean> list = iapServiceCenter.getIapFreightSearchService().findLocalFreightByGws(context, avGoParam, fdDataList, agencyPriceList);
dataListAll.addAll(list);
} catch (Exception e) {
logger.error("GWS FOR FREIGHT 查询本地运价出错:"+e.getMessage(), e);
}
}
}
}
@SuppressWarnings("static-access")
private void findIntAirByFDAndAmadeusAV(ContextInfo context, IapQueryAirInfoBean param, String vendorCode,
List<IapAgencyPriceSet> agencyPriceList, List<IntAirInfoBean> dataListAll,
List<IapAirFlight> airFlights, FbpConfig commissionConfig, HashMap<String, String> configs) throws Exception {
// FD供应商CODE是GWS
vendorCode = IapConstants.VENDOR_CODE_GWS;
// AV供应商CODE是AMADEUS
String amadeusVendorCode = IapConstants.VENDOR_CODE_AMADEUS;
String aslanVendorCode = IapConstants.VENDOR_CODE_ASLAN;
// 取航线承运人配置
List<String> airlineList = this.getFreightAirlineList(param, airFlights);
if (!airlineList.isEmpty()) {
List<IntAirInfoBean> avDataList = new ArrayList<IntAirInfoBean>();
List<IntAirInfoBean> fdDataList = new ArrayList<IntAirInfoBean>();
List<IntAirInfoBean> aslanDataList = new ArrayList<IntAirInfoBean>();
// 国际机票配置
FbpConfig config = zasServiceCenter.getSysConfigService().findFbpConfigFromCache(IapConstants.INTAIR_INT_FARE_CONFIG);
boolean aslanFareFlag = false;
boolean localFareFlag = false;
boolean fdFareFlag = false;
if (config != null && NullU.isNotNull(config.getConfigValue())){
Long managementBodyId = context.getManagementBodyId();
if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_ASLAN)
&& !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_ASLAN))){
aslanFareFlag = true;
}
if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_LOCAL)
&& !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_LOCAL))){
localFareFlag = true;
}
if (config.getConfigValue().contains(IapConstants.FREIGHT_SOURCE_FD)
&& !"N".equals(configs.get(managementBodyId + IapConstants.FREIGHT_SOURCE_FD))){
fdFareFlag = true;
}
}
// AV
boolean avGoFlag = false;
boolean avReturnFlag = false;
if (IapConstants.SINGLE.equals(param.getFlightType())) {
avReturnFlag = true;
}
// 去程
IapQueryAirInfoBean avGoParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);
List<Air_MultiAvailabilityReply> goRespList = new ArrayList<Air_MultiAvailabilityReply>();
IapQueryAirInfoBean avParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);
FbpInvokeService avInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_AMADEUS, amadeusVendorCode);
String pcc = avInvokeService.getAttribute4();
// Open Session
//Session session = iapServiceCenter.getIapVendorInfService().openAmadeusSession(amadeusVendorCode, avInvokeService);
//if (NullU.isNull(session)){
// return;
//}
List<String> avAirlineList = buildAmadeusAVAirlineList(airlineList);
QueryAmadeusAVThreadPool avGoThread = new QueryAmadeusAVThreadPool(context, avParam,
amadeusVendorCode, avAirlineList, avInvokeService);
avGoThread.start();
// FD
List<AVFareInfo> aVFareInfos = new ArrayList<AVFareInfo>();
List<AVFareInfo> fDFareInfos = new ArrayList<AVFareInfo>();
boolean fdFlag = false;
FbpInvokeService fdInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_FD, vendorCode);
// 还是先用伽利略PCC
//TODO
pcc = fdInvokeService.getAttribute4();
FbpRate rate = zasServiceCenter.getFbpRateService().getRateByCurrencyFromCache(IapConstants.IAP_CURRENCY_HKD,
IapConstants.IAP_CURRENCY_CNY);
List<String> fDAirList = this.buildFDAirlineList(airlineList);
QueryFDFareInfoThreadPool fdThread = new QueryFDFareInfoThreadPool(context, avGoParam, vendorCode,
fDAirList, airFlights, fdInvokeService, rate);
fdThread.start();
// ASLAN FARE
List<FareInfo> aslanFareInfos = new ArrayList<FareInfo>();
boolean aslanFlag = false;
FbpInvokeService aslanInvokeService = getServiceInfo(IapConstants.INVOKE_SERVICE_ASLANSERVICE, aslanVendorCode);
QueryAslanFareThread aslanThread = null;
if (aslanInvokeService != null && aslanFareFlag){
aslanThread = new QueryAslanFareThread(context, param, aslanVendorCode, aslanInvokeService);
aslanThread.start();
}
// 回程
List<Air_MultiAvailabilityReply> returnRespList = new ArrayList<Air_MultiAvailabilityReply>();
if (IapConstants.RETURN.equals(param.getFlightType())) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
logger.error("线程查询回程AV 延迟100错误:" + e.getMessage(), e);
}
// Open Session
/*Session returnSession = iapServiceCenter.getIapVendorInfService().openAmadeusSession(amadeusVendorCode, avInvokeService);
if (NullU.isNull(returnSession)){
return;
}*/
// AV
IapQueryAirInfoBean avReturnParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);
avReturnParam.setDeparture(param.getArrival());
avReturnParam.setArrival(param.getDeparture());
avReturnParam.setDepartureDate(param.getReturnDate());
QueryAmadeusAVThreadPool avReturnThread = new QueryAmadeusAVThreadPool(context, avReturnParam,
amadeusVendorCode, avAirlineList, avInvokeService);
avReturnThread.start();
long startTime3 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime3) / 1000;
if (interval > 50) {
avReturnFlag = true;
break;
}
if (avReturnThread.isRunEnd()) {
returnRespList = avReturnThread.getRespList();
avReturnFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询回程AV错误:" + e.getMessage(), e);
}
}
//iapServiceCenter.getIapVendorInfService().signOutAmadeusSession(amadeusVendorCode, avInvokeService, returnSession);
}
long startTime2 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime2) / 1000;
if (interval > 50) {
avGoFlag = true;
break;
}
if (avGoThread.isRunEnd()) {
goRespList = avGoThread.getRespList();
avGoFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程AV错误:" + e.getMessage(), e);
}
}
//iapServiceCenter.getIapVendorInfService().signOutAmadeusSession(amadeusVendorCode, avInvokeService, session);
long startTime_FD = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime_FD) / 1000;
if (interval > 50) {
fdFlag = true;
break;
}
if (fdThread.isRunEnd()) {
aVFareInfos = fdThread.getaVFareInfos();
fDFareInfos = aVFareInfos;
fdFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程FD错误:" + e.getMessage(), e);
}
}
if (aslanFareFlag){
long startTime_ASLAN = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime_ASLAN) / 1000;
if (interval > 50) {
aslanFlag = true;
break;
}
if (aslanThread.isRunEnd()) {
aslanFareInfos = aslanThread.getFareInfos();
aslanFlag = true;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程ASLAN错误:" + e.getMessage(), e);
}
}
}
// 处理AV、ASLANFARE
if (aslanFareFlag){
long startTime5 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime5) / 1000;
if (interval > 80) {
break;
}
if (aslanFlag && avGoFlag && avReturnFlag) {
if (!aslanFareInfos.isEmpty()){
// 设置税费
setAslanFareTax(param, aslanFareInfos, airFlights);
aslanDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAmadeusAvAndAslan(param,
aslanFareInfos, goRespList, returnRespList, pcc, aslanVendorCode);
}
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("组装航班等待错误:" + e.getMessage(), e);
}
}
//dataListAll.addAll(aslanDataList);
}
// 处理AV、FD
long startTime4 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime4) / 1000;
if (interval > 80) {
break;
}
if (aslanFareFlag){
if (aslanFlag && fdFlag && avGoFlag && avReturnFlag) {
for (int i = aVFareInfos.size() - 1; i >=0; i--){
AVFareInfo aVFareInfo = aVFareInfos.get(i);
for (FareInfo fareInfo : aslanFareInfos){
if (aVFareInfo.getFIC().equals(fareInfo.getFarebasis())){
aVFareInfos.remove(aVFareInfo);
}
}
}
avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAmadeusAv(param, aVFareInfos,
goRespList, returnRespList, pcc, vendorCode);
fdDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAmadeusAv(param, fDFareInfos,
goRespList, returnRespList, pcc, vendorCode);
break;
}
}
else {
if (fdFlag && avGoFlag && avReturnFlag) {
avDataList = iapServiceCenter.getIapVendorInfService().findIntAirInfosByAmadeusAv(param, aVFareInfos,
goRespList, returnRespList, pcc, vendorCode);
fdDataList = ObjectU.makeTargetList(avDataList, IntAirInfoBean.class);
break;
}
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("组装航班等待错误:" + e.getMessage(), e);
}
}
if (avDataList != null && avDataList.size() > 0) {
// 汇率转换,代理费计算
iapServiceCenter.getIapCurrencyService().currencyConverter(context, avDataList, param);
try {
iapServiceCenter.getIapAgencyService().reduceAgencyPrice(avDataList, agencyPriceList, param);
} catch (RuntimeException e) {
logger.error("匹配并减去代理费错误:", e);
}
// 后返处理
try {
if (NullU.isNotNull(context.getManagementBodyId()) && commissionConfig != null && NullU.isNotNull(commissionConfig.getConfigValue())
&& commissionConfig.getConfigValue().contains("," + context.getManagementBodyId() + ",")){
iapServiceCenter.getIapCommissionService().commissionProcess(context, avDataList);
}
} catch (RuntimeException e) {
logger.error("后返处理错误:", e);
}
}
if (fdFareFlag && !avDataList.isEmpty()){
dataListAll.addAll(avDataList);
}
if (localFareFlag){
// 取FD运价航班匹配
if (fdDataList != null && fdDataList.size() > 0) {
try {
List<IntAirInfoBean> list = iapServiceCenter.getIapFreightSearchService().findLocalFreightByGws(context, avParam, fdDataList, agencyPriceList);
dataListAll.addAll(list);
} catch (Exception e) {
logger.error("GWS FOR FREIGHT 查询本地运价出错:"+e.getMessage(), e);
}
}
}
}
}
/**
* 获取服务配置
* @param serviceClass
* @param vendorId
* @return
*/
private FbpInvokeService getServiceInfo(String serviceClass, String vendorCode) {
List<FbpVendor> vendors = zasServiceCenter.getFbpVendorService().findAllNtTicketVendors();
Long vendorId = null;
for (FbpVendor vendor : vendors) {
if (vendorCode.equals(vendor.getVendorCode())) {
vendorId = vendor.getVendorId();
}
}
if (vendorId == null){
throw new RuntimeException("找不到供应商信息:serviceClass=" + serviceClass);
}
FbpInvokeService result = zasServiceCenter.getIsmService().getVendorServiceInfo(vendorId, serviceClass);
if (result == null) {
throw new RuntimeException("找不到服务配置信息:serviceClass=" + serviceClass);
}
return result;
}
/**
* 缓存航班
*
* @param param
* @return
*/
private String getCacheKey(ContextInfo context, IapQueryAirInfoBean param, String vendorCode) {
StringBuffer bf = new StringBuffer("INT_AFTERDEAL_").append(vendorCode).append("_");
if (TenantConstant.TENANT_B2B_ID.compareTo(context.getTenantId()) == 0
|| ManagementBodyConstant.MANAGEMENTBODY_WSTB2B_ID.equals(context.getManagementBodyId())) {
bf.append(context.getTenantId()); // 区分租户 用户区分普通用户加价和B2B加价
}
bf.append(param.getDeparture());
bf.append("|");
bf.append(param.getArrival());
bf.append("|");
bf.append(param.getDepartureDate());
bf.append("|");
bf.append("SINGLE".equals(param.getFlightType()) ? "" : param.getReturnDate());
bf.append("|");
bf.append(param.getCabin());
bf.append("|");
bf.append(param.getAirline() == null ? "" : param.getAirline());
bf.append("|");
bf.append(param.getPassengerCount());
bf.append("|");
bf.append(param.getTransferCount());
return bf.toString();
}
/**
* 多线程查询ASLAN FARE
*
* @author panqingbao
*
*/
class QueryAslanFareThread extends Thread {
private ContextInfo context;
private IapQueryAirInfoBean param;
private String vendorCode;
private FbpInvokeService aslanInvokeService;
List<FareInfo> fareInfos;
private boolean runEnd = false;
private boolean used = false;
QueryAslanFareThread(ContextInfo context, IapQueryAirInfoBean param, String vendorCode, FbpInvokeService aslanInvokeService) {
this.context = context;
this.param = param;
this.vendorCode = vendorCode;
this.aslanInvokeService = aslanInvokeService;
}
public void run() {
runEnd = false;
try {
fareInfos = iapServiceCenter.getIapVendorInfService().findAslanFareInfo(context, param, vendorCode, aslanInvokeService);
} catch (Exception ex) {
logger.error("多线程查询ASLAN FARE错误,vendorCode=" + this.vendorCode, ex);
} finally {
runEnd = true;
}
}
public List<FareInfo> getFareInfos() {
return fareInfos;
}
public void setFareInfos(List<FareInfo> fareInfos) {
this.fareInfos = fareInfos;
}
public ContextInfo getContext() {
return context;
}
public void setContext(ContextInfo context) {
this.context = context;
}
public String getVendorCode() {
return vendorCode;
}
public void setVendorCode(String vendorCode) {
this.vendorCode = vendorCode;
}
public FbpInvokeService getAslanInvokeService() {
return aslanInvokeService;
}
public void setAslanInvokeService(FbpInvokeService aslanInvokeService) {
this.aslanInvokeService = aslanInvokeService;
}
public boolean isRunEnd() {
return runEnd;
}
public void setRunEnd(boolean runEnd) {
this.runEnd = runEnd;
}
public boolean isUsed() {
return used;
}
public void setUsed(boolean used) {
this.used = used;
}
public IapQueryAirInfoBean getParam() {
return param;
}
public void setParam(IapQueryAirInfoBean param) {
this.param = param;
}
}
/**
* 多线程查询FD
*
* @author panqingbao
*
*/
class QueryFDFareInfoThreadPool extends Thread {
private ContextInfo context;
private IapQueryAirInfoBean param;
private String vendorCode;
private List<String> airlineList;
private List<IapAirFlight> airFlights;
private FbpInvokeService fdInvokeService;
private FbpRate rate;
final List<AVFareInfo> aVFareInfos = new ArrayList<AVFareInfo>();
private boolean runEnd = false;
private boolean used = false;
QueryFDFareInfoThreadPool(ContextInfo context, IapQueryAirInfoBean param, String vendorCode,
List<String> airlineList, List<IapAirFlight> airFlights, FbpInvokeService fdInvokeService, FbpRate rate) {
this.context = context;
this.param = param;
this.vendorCode = vendorCode;
this.airlineList = airlineList;
this.airFlights = airFlights;
this.fdInvokeService = fdInvokeService;
this.rate = rate;
}
public void run() {
Thread.currentThread().setName("intairsp-FD");
runEnd = false;
try {
EtcThreadPoolExecutor fdExecutor = fdThreadPoolManager.requestThreadPool(10, 20, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(20), new ThreadPoolExecutor.DiscardOldestPolicy());
for (int i = 0; i < airlineList.size(); i++) {
String airline = airlineList.get(i);
final IapQueryAirInfoBean f_param = (IapQueryAirInfoBean) param.clone();
f_param.setAirline(airline);
fdExecutor.execute(new Runnable() {
@SuppressWarnings("static-access")
public void run() {
Thread.currentThread().setName("intairsp-FD-SUB");
try {
//List<AVFareInfo> dataList = iapServiceCenter.getIapVendorInfService().findFDAirInfo(f_context,
// f_param, f_vendorCode);
List<AVFareInfo> dataList = new ArrayList<AVFareInfo>();
QueryFDAirInfoThread fDThread = new QueryFDAirInfoThread(context, f_param, vendorCode, fdInvokeService);
fDThread.start();
long startTime = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime) / 1000;
if (interval > 20) {
fDThread = null;
break;
}
if (fDThread.isRunEnd()) {
//System.out.println(f_param.getAirline() + "==" + interval);
dataList = fDThread.getDataList();;
// 重设税费
setFareTax(f_param, dataList, airFlights, rate);
fDThread = null;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询FD错误:" + e.getMessage(), e);
}
}
aVFareInfos.addAll(dataList);
} catch (Exception ex) {
logger.error("多线程查询FD错误,vendorCode=" + vendorCode, ex);
}
}
});
}
// 等待线程池处理完毕
fdExecutor.isEndTask();
} catch (Exception ex) {
logger.error("多线程查询FD错误,vendorCode=" + this.vendorCode, ex);
} finally {
runEnd = true;
}
}
public List<AVFareInfo> getaVFareInfos() {
return aVFareInfos;
}
public ContextInfo getContext() {
return context;
}
public void setContext(ContextInfo context) {
this.context = context;
}
public String getVendorCode() {
return vendorCode;
}
public void setVendorCode(String vendorCode) {
this.vendorCode = vendorCode;
}
public boolean isRunEnd() {
return runEnd;
}
public void setRunEnd(boolean runEnd) {
this.runEnd = runEnd;
}
public boolean isUsed() {
return used;
}
public void setUsed(boolean used) {
this.used = used;
}
public IapQueryAirInfoBean getParam() {
return param;
}
public void setParam(IapQueryAirInfoBean param) {
this.param = param;
}
public List<String> getAirlineList() {
return airlineList;
}
public void setAirlineList(List<String> airlineList) {
this.airlineList = airlineList;
}
public FbpInvokeService getFdInvokeService() {
return fdInvokeService;
}
public void setFdInvokeService(FbpInvokeService fdInvokeService) {
this.fdInvokeService = fdInvokeService;
}
public List<IapAirFlight> getAirFlights() {
return airFlights;
}
public void setAirFlights(List<IapAirFlight> airFlights) {
this.airFlights = airFlights;
}
public FbpRate getRate() {
return rate;
}
public void setRate(FbpRate rate) {
this.rate = rate;
}
}
/**
* Amadeus AV airline
* @param airlineList
* @return
*/
private List<String> buildAmadeusAVAirlineList(List<String> airlineList){
List<String> airlines = new ArrayList<String>();
for (int i = 0; i < airlineList.size();) {
StringBuffer air = new StringBuffer();
int k = i;
for (int j = i; j < airlineList.size(); j++) {
if (j - k < 6) {
air.append(airlineList.get(j) + ",");
} else {
i = j;
break;
}
i = j + 1;
}
String airLine = air.toString();
airLine = airLine.substring(0, airLine.length() - 1);
airlines.add(airLine);
}
return airlines;
}
private List<String> buildFDAirlineList(List<String> airlineList){
// 三个承运人一组取FD运价
List<String> fDAirList = new ArrayList<String>();
for (int i = 0; i < airlineList.size();) {
StringBuffer air = new StringBuffer();
int k = i;
for (int j = i; j < airlineList.size(); j++) {
if (j - k < 3) {
air.append(airlineList.get(j) + ",");
} else {
i = j;
break;
}
i = j + 1;
}
String airLine = air.toString();
airLine = airLine.substring(0, airLine.length() - 1);
fDAirList.add(airLine);
}
return fDAirList;
}
private void setFareTax(IapQueryAirInfoBean f_param, List<AVFareInfo> dataList, List<IapAirFlight> airFlights, FbpRate rate){
try {
for (AVFareInfo fareInfo : dataList){
for (IapAirFlight airFlight : airFlights){
if (fareInfo.getFlightType().equals(airFlight.getFlightType())){
if (f_param.getDeparture().equals(airFlight.getFromCity())
&& f_param.getArrival().equals(airFlight.getToCity())
&& fareInfo.getAirV().equals(airFlight.getGoAirline())
&& fareInfo.getAirV().equals(airFlight.getReturnAirline())
&& String.valueOf(f_param.getTransferCount()).equals(String.valueOf(airFlight.getTransferCount()))){
if (IapConstants.IAP_CURRENCY_HKD.equals(airFlight.getCurrency())){
fareInfo.setEstTax(String.valueOf(airFlight.getTax()));
fareInfo.setQ(String.valueOf(airFlight.getQ()));
break;
}
else if (IapConstants.IAP_CURRENCY_CNY.equals(airFlight.getCurrency())){
if (NullU.isNotNull(rate) && NullU.isNotNull(rate.getSellPrice())) {
Double sellPrice = rate.getSellPrice();
sellPrice = 1 / sellPrice;
String taxStr = this.getCNYAmount(String.valueOf(airFlight.getTax()), sellPrice);
String qStr = this.getCNYAmount(String.valueOf(airFlight.getQ()), sellPrice);
fareInfo.setEstTax(taxStr);
fareInfo.setQ(qStr);
break;
}
}
}
}
}
}
}
catch (Exception ex) {
logger.error("设置FD运价税费错误 ", ex);
}
}
private void setAslanFareTax(IapQueryAirInfoBean f_param, List<FareInfo> dataList, List<IapAirFlight> airFlights){
try {
for (FareInfo fareInfo : dataList){
fareInfo.setTax(fareInfo.getAdultTax());//赋值ASLAN预估税
for (IapAirFlight airFlight : airFlights){
String flightType = fareInfo.getTravelType();
if (IapConstants.RETURN_ZHS.equals(flightType)){
flightType = IapConstants.RETURN;
if (flightType.equals(airFlight.getFlightType())){
if (f_param.getDeparture().equals(airFlight.getFromCity())
&& f_param.getArrival().equals(airFlight.getToCity())
&& fareInfo.getAirline().equals(airFlight.getGoAirline())
&& fareInfo.getAirline().equals(airFlight.getReturnAirline())
&& String.valueOf(f_param.getTransferCount()).equals(String.valueOf(airFlight.getTransferCount()))){
if (NullU.isNotNull(fareInfo.getAdultTax())){
fareInfo.setTax(fareInfo.getAdultTax());
fareInfo.setQ("0");
}
else if (IapConstants.IAP_CURRENCY_CNY.equals(airFlight.getCurrency())
&& airFlight.getTax() != null && airFlight.getTax().compareTo(0D) > 0){
fareInfo.setTax(String.valueOf(airFlight.getTax()));
fareInfo.setQ(String.valueOf(airFlight.getQ()));
}
break;
}
}
}
else if (IapConstants.SINGLE_ZHS.equals(flightType)){
flightType = IapConstants.SINGLE;
if (flightType.equals(airFlight.getFlightType())){
if (f_param.getDeparture().equals(airFlight.getFromCity())
&& f_param.getArrival().equals(airFlight.getToCity())
&& fareInfo.getAirline().equals(airFlight.getGoAirline())
&& String.valueOf(f_param.getTransferCount()).equals(String.valueOf(airFlight.getTransferCount()))){
if (NullU.isNotNull(fareInfo.getAdultTax())){
fareInfo.setTax(fareInfo.getAdultTax());
fareInfo.setQ("0");
}
else if (IapConstants.IAP_CURRENCY_CNY.equals(airFlight.getCurrency())
&& airFlight.getTax() != null && airFlight.getTax().compareTo(0D) > 0){
fareInfo.setTax(String.valueOf(airFlight.getTax()));
fareInfo.setQ(String.valueOf(airFlight.getQ()));
}
break;
}
}
}
}
}
}
catch (Exception ex) {
logger.error("设置ASLAN运价税费错误 ", ex);
}
}
/**
* 得到转换后的金额,并去掉小数点
*
* @param amount
* @param sellPrice
* @return
*/
private String getCNYAmount(String amount, Double sellPrice) {
double cnyAmount = Double.parseDouble(amount) * sellPrice;
String cnyAmountStr = String.valueOf(cnyAmount);
if (cnyAmountStr != null && cnyAmountStr.contains(".")) {
return cnyAmountStr.substring(0, cnyAmountStr.indexOf("."));
}
return cnyAmountStr;
}
/**
* 多线程查询AV
*
* @author panqingbao
*
*/
class QueryAVAirInfoThreadPool extends Thread {
private ContextInfo context;
private IapQueryAirInfoBean param;
private String vendorCode;
private List<String> airlineList;
private FbpInvokeService avInvokeService;
private List<AirAvailability_Resp> respList = new ArrayList<AirAvailability_Resp>();
private boolean runEnd = false;
private boolean used = false;
QueryAVAirInfoThreadPool(ContextInfo context, IapQueryAirInfoBean param, String vendorCode,
List<String> airlineList, FbpInvokeService avInvokeService) {
this.context = context;
this.param = param;
this.vendorCode = vendorCode;
this.airlineList = airlineList;
this.avInvokeService = avInvokeService;
}
public void run() {
Thread.currentThread().setName("intairsp-AV");
runEnd = false;
try {
EtcThreadPoolExecutor executor = threadPoolManager.requestThreadPool(20, 50, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(20), new ThreadPoolExecutor.DiscardOldestPolicy());
for (int i = 0; i < airlineList.size(); i++) {
final String airline = airlineList.get(i);
executor.execute(new Runnable() {
@SuppressWarnings("static-access")
public void run() {
Thread.currentThread().setName("intairsp-AV-SUB");
try {
AirAvailability_Resp resp = new AirAvailability_Resp();
IapQueryAirInfoBean avGoParam = ObjectU.copyAs(param, IapQueryAirInfoBean.class);
QueryAVAirInfoThread avGoThread = new QueryAVAirInfoThread(context, avGoParam,
vendorCode, airline, avInvokeService);
long startTime2 = new Date().getTime();
avGoThread.start();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTime2) / 1000;
if (interval > 20) {
avGoThread = null;
//System.out.println("AV break====" + (endTime - startTime2));
break;
}
if (avGoThread.isRunEnd()) {
//System.out.println("AV====" + avGoParam.getDeparture() + "==" + airline + "===" + (endTime - startTime2));
resp = avGoThread.getResp();
avGoThread = null;
respList.add(resp);
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程AV错误:" + e.getMessage(), e);
}
}
// 更多去程航班
if (BusinessUtils.isNotNull(resp) && BusinessUtils.isNotNull(resp.getAirAvail())
&& NullU.isNull(resp.getAirAvail().getErrorCode())
&& BusinessUtils.isNotNull(resp.getAirAvail().getMoreToken())
&& BusinessUtils.isNotNull(resp.getAirAvail().getMoreToken().getTok())) {
AirAvailability_Resp moreResp = new AirAvailability_Resp();
IapQueryAirInfoBean avMoreGoParam = ObjectU
.copyAs(param, IapQueryAirInfoBean.class);
avMoreGoParam.setTok(resp.getAirAvail().getMoreToken().getTok());
QueryAVAirInfoThread avMoreGoThread = new QueryAVAirInfoThread(context,
avMoreGoParam, vendorCode, airline, avInvokeService);
avMoreGoThread.start();
long startTimeMore2 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTimeMore2) / 1000;
if (interval > 20) {
avMoreGoThread = null;
break;
}
if (avMoreGoThread.isRunEnd()) {
//System.out.println("AVmore====" + avGoParam.getDeparture() + "==" + airline + "===" + (endTime - startTimeMore2));
moreResp = avMoreGoThread.getResp();
avMoreGoThread = null;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程AV错误:" + e.getMessage(), e);
}
}
if (moreResp != null) {
resp.setMoreResp(moreResp);
// 再多去程航班
if (BusinessUtils.isNotNull(moreResp)
&& BusinessUtils.isNotNull(moreResp.getAirAvail())
&& NullU.isNull(moreResp.getAirAvail().getErrorCode())
&& BusinessUtils.isNotNull(moreResp.getAirAvail().getMoreToken())
&& BusinessUtils.isNotNull(moreResp.getAirAvail().getMoreToken()
.getTok())) {
AirAvailability_Resp moreResp3 = new AirAvailability_Resp();
IapQueryAirInfoBean avMoreGoParam3 = ObjectU.copyAs(param,
IapQueryAirInfoBean.class);
avMoreGoParam3.setTok(moreResp.getAirAvail().getMoreToken().getTok());
QueryAVAirInfoThread avMoreGoThread3 = new QueryAVAirInfoThread(context,
avMoreGoParam3, vendorCode, airline, avInvokeService);
avMoreGoThread3.start();
long startTimeMore3 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance().getTimeInMillis();
long interval = (endTime - startTimeMore3) / 1000;
if (interval > 20) {
avMoreGoThread3 = null;
break;
}
if (avMoreGoThread3.isRunEnd()) {
moreResp3 = avMoreGoThread3.getResp();
avMoreGoThread3 = null;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程AV错误:" + e.getMessage(), e);
}
}
if (moreResp3 != null) {
moreResp.setMoreResp(moreResp3);
// 4层去程航班
if (BusinessUtils.isNotNull(moreResp3)
&& BusinessUtils.isNotNull(moreResp3.getAirAvail())
&& NullU.isNull(moreResp3.getAirAvail().getErrorCode())
&& BusinessUtils.isNotNull(moreResp3.getAirAvail()
.getMoreToken())
&& BusinessUtils.isNotNull(moreResp3.getAirAvail()
.getMoreToken().getTok())) {
AirAvailability_Resp moreResp4 = new AirAvailability_Resp();
IapQueryAirInfoBean avMoreGoParam4 = ObjectU.copyAs(param,
IapQueryAirInfoBean.class);
avMoreGoParam4.setTok(moreResp3.getAirAvail().getMoreToken()
.getTok());
QueryAVAirInfoThread avMoreGoThread4 = new QueryAVAirInfoThread(
context, avMoreGoParam4, vendorCode, airline, avInvokeService);
avMoreGoThread4.start();
long startTimeMore4 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance()
.getTimeInMillis();
long interval = (endTime - startTimeMore4) / 1000;
if (interval > 20) {
avMoreGoThread4 = null;
break;
}
if (avMoreGoThread4.isRunEnd()) {
moreResp4 = avMoreGoThread4.getResp();
avMoreGoThread4 = null;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程AV错误:" + e.getMessage(), e);
}
}
if (moreResp4 != null) {
moreResp3.setMoreResp(moreResp4);
// 5层去程航班
if (BusinessUtils.isNotNull(moreResp4)
&& BusinessUtils.isNotNull(moreResp4.getAirAvail())
&& NullU.isNull(moreResp4.getAirAvail().getErrorCode())
&& BusinessUtils.isNotNull(moreResp4.getAirAvail()
.getMoreToken())
&& BusinessUtils.isNotNull(moreResp4.getAirAvail()
.getMoreToken().getTok())) {
AirAvailability_Resp moreResp5 = new AirAvailability_Resp();
IapQueryAirInfoBean avMoreGoParam5 = ObjectU.copyAs(param,
IapQueryAirInfoBean.class);
avMoreGoParam5.setTok(moreResp4.getAirAvail()
.getMoreToken().getTok());
QueryAVAirInfoThread avMoreGoThread5 = new QueryAVAirInfoThread(
context, avMoreGoParam5, vendorCode, airline, avInvokeService);
avMoreGoThread5.start();
long startTimeMore5 = new Date().getTime();
while (true) {
long endTime = java.util.Calendar.getInstance()
.getTimeInMillis();
long interval = (endTime - startTimeMore5) / 1000;
if (interval > 20) {
avMoreGoThread5 = null;
break;
}
if (avMoreGoThread5.isRunEnd()) {
moreResp5 = avMoreGoThread5.getResp();
avMoreGoThread5 = null;
break;
}
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
logger.error("线程查询去程AV错误:" + e.getMessage(), e);
}
}
if (moreResp5 != null) {
moreResp4.setMoreResp(moreResp5);
}
}
}
}
}
}
}
}
} catch (Exception ex) {
logger.error("多线程查询AV错误,vendorCode=" + vendorCode, ex);
}
}
});
}
// 等待线程池处理完毕
executor.isEndTask();
} catch (Exception ex) {
logger.error("多线程查询AV错误,vendorCode=" + this.vendorCode, ex);
} finally {
runEnd = true;
}
}
public List<AirAvailability_Resp> getRespList() {
return respList;
}
public void setRespList(List<AirAvailability_Resp> respList) {
this.respList = respList;
}
public ContextInfo getContext() {
return context;
}
public void setContext(ContextInfo context) {
this.context = context;
}
public String getVendorCode() {
return vendorCode;
}
public void setVendorCode(String vendorCode) {
this.vendorCode = vendorCode;
}
public boolean isRunEnd() {
return runEnd;
}
public void setRunEnd(boolean runEnd) {
this.runEnd = runEnd;
}
public boolean isUsed() {
return used;
}
public void setUsed(boolean used) {
this.used = used;
}
public IapQueryAirInfoBean getParam() {
return param;
}
public void setParam(IapQueryAirInfoBean param) {
this.param = param;
}
public List<String> getAirlineList() {
return airlineList;
}
public void setAirlineList(List<String> airlineList) {
this.airlineList = airlineList;
}
public FbpInvokeService getAvInvokeService() {
return avInvokeService;
}
public void setAvInvokeService(FbpInvokeService avInvokeService) {
this.avInvokeService = avInvokeService;
}
}