package com.banking.xc.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Random;
import com.banking.xc.utils.Log;
import com.banking.xc.utils.datetime.DateTimeUtil;
import com.banking.xc.utils.staticinfo.VacationHotCityUtil;
import android.text.TextUtils;
/**
* 旅游下单,计划核心类。
* 酒店和机票的关联是VacationSegment,不支持比如三天在某城市选择不同酒店的房间。
* @author zhangyinhang
*
*/
public class VacationPlan implements Serializable{
private final String TAG = "VacationPlan";
private boolean isLocalTrip = false;
//旅游基本信息
//订单基本信息
ArrayList<VacationSegment> vacationSegmentList;
//VacationSegment gotoSegment;
//VacationSegment gobackSegment;
ArrayList<VacationSegment> staySegments = new ArrayList<VacationSegment>();
ArrayList<VacationSegment> flightSegments = new ArrayList<VacationSegment>();
//现在在使用的分割后的日程
//ArrayList<VacationDailySegment> vacationDailySegments;
//private int planPrice;
//复杂旅程,感觉这个不靠谱
/*VacationItem vacationFlightItem;
int flightItemPosition;
GuestRoom guestRoom;
int guestRoomPosition;*/
//旅游用户
//private String startCityName;
private String startCityId;//这个是不允许改变的
//private String destCityName;
private boolean isLockedCity = false;
private boolean isSameCity = false;
private String lockedCityName;
//private int vacationPackagePrice;
private VacationPackage vacationPackage;
/**
* 这里算法可能有问题,多个segment的时候
* 这里一次性处理了Segment中出发到达城市名字,startDestDescription问题。
* @param vacationSegmentList
*/
public void init(ArrayList<VacationSegment> vacationSegmentList,ArrayList<TourDailyInfo> tourDailyInfoList,String startCityId,VacationHotCityUtil util,int mustStayDays,String startDate){
if(Log.D){
Log.d(TAG, "Vacationplan init()-->startDate"+startDate);
}
this.vacationSegmentList = vacationSegmentList;
//vacationDailySegments = new ArrayList<VacationDailySegment>();
if(vacationSegmentList!=null&&vacationSegmentList.size()>0){
for(int i=0;i<tourDailyInfoList.size();i++){
if(Log.D){
Log.d(TAG,"tourDailyInfoList.get"+i+tourDailyInfoList.get(i).getSegmentDesc()+" "+
tourDailyInfoList.get(i).getPicPath()+tourDailyInfoList.get(i).getSort());
}
}
if(tourDailyInfoList.size()==0){
if(Log.D){
Log.d(TAG,"tourDailyInfoList.size()==0");
}
}
for(int i=0;i<vacationSegmentList.size();i++){
final VacationSegment vacationSegment = vacationSegmentList.get(i);
String sCity = vacationSegment.getStartCity();
String dCity = vacationSegment.getDestCity();
if(Log.D){
Log.d(TAG, "Vacationplan init()-->出发"+sCity+"目标"+dCity);
}
/*if(TextUtils.equals(sCity, "0")){
sCity = startCityId;
}
if(TextUtils.equals(dCity, "0")){
dCity = startCityId;
}*/
if(i==0){
if(TextUtils.equals(sCity, "0")){
sCity = startCityId;
isLockedCity = false;
vacationSegment.setStartCity(sCity);
}else{
isLockedCity = true;
lockedCityName = util.getCityNameByCityCode(sCity);
}
if(TextUtils.equals(startCityId, dCity)){
isSameCity = true;
}else{
isSameCity = false;
}
}
if(i==vacationSegmentList.size()-1){
if(TextUtils.equals(dCity, "0")){
dCity = startCityId;
//isLockedCity = false;
vacationSegment.setDestCity(dCity);
}
}
if(i!=0&&i!=vacationSegmentList.size()-1){
if(TextUtils.equals(sCity, "0")){
sCity = vacationSegmentList.get(i-1).getDestCity();
vacationSegment.setStartCity(sCity);
}
if(TextUtils.equals(dCity, "0")){
dCity = vacationSegmentList.get(i+1).getStartCity();;
vacationSegment.setDestCity(dCity);
}
}
final String startCityName = util.getCityNameByCityCode(sCity);
final String destCityName = util.getCityNameByCityCode(dCity);
vacationSegment.setStartCityName(startCityName);
vacationSegment.setDestCityName(destCityName);
if(TextUtils.equals(sCity, dCity)){
vacationSegment.setCityDescription(startCityName+"本地游");
}else{
vacationSegment.setCityDescription(startCityName+" 至 "+destCityName);
}
if(TextUtils.equals(sCity, dCity)){
//TODO
//其实也需要hotel的,还没加上
vacationSegment.setSegmentKind(VacationSegment.STAY_SEGMENT_KIND);
for(int j=0;j<tourDailyInfoList.size();j++){
final String desc = tourDailyInfoList.get(j).getSegmentDesc();
if(!TextUtils.isEmpty(desc)&&desc.contains(startCityName)){
if(desc.equals(startCityName)){ //三亚
adapterSegmentDetail(vacationSegment,tourDailyInfoList.get(j));
}
}
}
}else{
vacationSegment.setSegmentKind(VacationSegment.FLIGHT_SEGMENT_KIND);
if(i==0){
//一般
for(int j=0;j<tourDailyInfoList.size();j++){
final String desc = tourDailyInfoList.get(j).getSegmentDesc();
if(!TextUtils.isEmpty(desc)&&desc.contains(destCityName)){
if(desc.contains("抵达")){ //抵达三亚
adapterSegmentDetail(vacationSegment,tourDailyInfoList.get(j));
//处理这个特殊情况
//return;
break;
}else{
}
}
}
}
if(i==vacationSegmentList.size()-1){
//一般
for(int j=0;j<tourDailyInfoList.size();j++){
final String desc = tourDailyInfoList.get(j).getSegmentDesc();
if(!TextUtils.isEmpty(desc)&&desc.contains(startCityName)){ //从三亚返回
if(desc.contains("返回")){
adapterSegmentDetail(vacationSegment,tourDailyInfoList.get(j));
//处理这个特殊情况
//return;
break;
}else{
}
}
}
}
for(int j=0;j<tourDailyInfoList.size();j++){
final String desc = tourDailyInfoList.get(j).getSegmentDesc();
if(!TextUtils.isEmpty(desc)&&desc.contains("-"+destCityName)){
adapterSegmentDetail(vacationSegment,tourDailyInfoList.get(j));
//处理这个特殊情况
//return;
}else{
if(!TextUtils.isEmpty(desc)&&desc.contains(startCityName+"-")){
adapterSegmentDetail(vacationSegment,tourDailyInfoList.get(j));
//处理这个特殊情况
//return;
}
}
}
/*final ArrayList<TourDailyInfo> tours = new ArrayList<TourDailyInfo>();
if(tourDailyInfoList.size()>touri){
tours.add(tourDailyInfoList.get(touri));
vacationSegment.setTourDailyInfoList(tours);
if(vacationSegment.getTheImageUrl() ==null){
TourDailyInfo tourDailyInfo = tourDailyInfoList.get(touri);
vacationSegment.setTheImageUrl(tourDailyInfo.getPicPath());
vacationSegment.setTheDetail(tourDailyInfo.getDailyType()+tourDailyInfo.getDescription()+tourDailyInfo.getSegmentDetail());
}
VacationDailySegment vsd = new VacationDailySegment();
vsd.setTourDailyInfo(tourDailyInfoList.get(touri));
vsd.setVacationSegment(vacationSegment);
vacationDailySegments.add(vsd);*/
}
}
initStayDays(mustStayDays,startDate);
}
}
public void initStayDays(int mustStayDays,String startDate){
int rawDaysCount = 0;
for(int i=0;i<vacationSegmentList.size();i++){
final VacationSegment vacationSegment = vacationSegmentList.get(i);
if(vacationSegment.getSegmentKind()==VacationSegment.STAY_SEGMENT_KIND){
staySegments.add(vacationSegment);
int days = 0;
try{
days = Integer.parseInt(vacationSegment.getMaxStayDays());
}catch(Exception e){
}
if(days<=0){
days = 1;
}
vacationSegment.setStayDays(days);
rawDaysCount += days;
}else{
flightSegments.add(vacationSegment);
vacationSegment.setStayDays(1);
rawDaysCount++;
}
}
if(rawDaysCount>mustStayDays){
//TODO
int gap = rawDaysCount - mustStayDays;
Random random = new Random();
boolean doMinus = false;
for(int i=0;i<gap;i++){
for(int j=0;j<staySegments.size();j++){
int days = staySegments.get(j).getStayDays();
if(days>1){
days --;
staySegments.get(j).setStayDays(days);
doMinus = true;
continue;
}
}
if(!doMinus){
//TODO
break;
}
}
}else{
if(rawDaysCount<mustStayDays){
//这个是意外,但是自驾游确实可能
vacationSegmentList.get(vacationSegmentList.size()-1).setStayDays(1+mustStayDays-rawDaysCount);
}
}
String dateTemp = startDate;
for(int i=0;i<vacationSegmentList.size();i++){
final VacationSegment vs = vacationSegmentList.get(i);
int stayDays = vs.getStayDays();
int stayGap = stayDays-1;
vs.setSegmentStartDate(dateTemp);
dateTemp = DateTimeUtil.getNDaysAfterTheDay(stayGap,dateTemp);
vs.setSegmentEndDate(dateTemp);
dateTemp = DateTimeUtil.getNDaysAfterTheDay(1, dateTemp);
if(vs.getSegmentKind()==VacationSegment.STAY_SEGMENT_KIND){
vs.setSegmentDateDes(vs.getSegmentStartDate()+"至"+vs.getSegmentEndDate());
}else{
vs.setSegmentDateDes(vs.getSegmentEndDate());
}
}
}
public void adapterSegmentDetail(VacationSegment vacationSegment,TourDailyInfo tourDailyInfo){
vacationSegment.addTourDailyInfo(tourDailyInfo);
tourDailyInfo.setVacationSegment(vacationSegment);
if(vacationSegment.getTheImageUrl()==null){
vacationSegment.setTheImageUrl(tourDailyInfo.getPicPath());
}
if(vacationSegment.getTheDetail()==null){
vacationSegment.setTheDetail(tourDailyInfo.getDailyType()+tourDailyInfo.getDescription()+tourDailyInfo.getSegmentDetail());
}
}
/*public ArrayList<VacationDailySegment> getVacationDailySegments(){
return vacationDailySegments;
}*/
public void adapterTourDailyInfo(ArrayList<VacationSegment> vacationSegmentList,ArrayList<TourDailyInfo> tourDailyInfoList){
//Segmentdesc,位置,SegmentDetail,PicPath。4个重要的点
}
/**
* 是否该段行程是固定呆在某个城市
* @return
*/
public static boolean isStaySegment(VacationSegment segment){
if(TextUtils.equals(segment.getStartCity(), segment.getDestCity())){
return true;
}
return false;
}
/**
* 是否所有行程段都有安排
* @return
*/
public boolean isWholePlan(){
return false;
}
/**
* 后期考虑去返程分开
* @param vacationItem
* @param position
*/
public void handleFlightForSegment(VacationItem vacationItem,int position){
if(vacationItem == null||position>=vacationSegmentList.size()){
return;
}
//VacationItem对象
/*vacationFlightItem = vacationItem;
flightItemPosition = position;*/
//vacationSegmentList.get(position).setSegmentStatus(VacationSegment.SELECT_FLIGHT);
VacationSegment targetSegment = vacationSegmentList.get(position);
cleanItemForSegment(targetSegment);
targetSegment.setSegmentStatus(VacationSegment.SELECT_FLIGHT);
targetSegment.setVacationItem(vacationItem);
int allPriceInt = 0;
if(!TextUtils.isEmpty(vacationItem.getItemPrice())){//getItemAllPrice()
allPriceInt = (int)(Double.parseDouble(vacationItem.getItemPrice()));
}
if(Log.D){
Log.d(TAG, "vacationItem.getItemAllPrice()"+vacationItem.getItemPrice());
Log.d(TAG, "vacationItem.getItemAllPrice().parseDouble"+Double.parseDouble(vacationItem.getItemPrice()));
Log.d(TAG, "vacationItem.getItemAllPrice() allpriceInt"+allPriceInt);
}
if(vacationItem.isRound()){
targetSegment.setFlightPrice(allPriceInt/2);
//想一下处理头尾的完整性.这样写:去程,返程
//TODO
VacationSegment otherSegment = getRoundTrip(targetSegment);
if(otherSegment!=null){
otherSegment.setSegmentStatus(VacationSegment.SELECT_FLIGHT);
cleanItemForSegment(otherSegment);
otherSegment.setVacationItem(vacationItem);
otherSegment.setFlightPrice(allPriceInt/2);
}
}else{
targetSegment.setFlightPrice(allPriceInt);
}
}
public void cleanItemForSegment(VacationSegment vs){
vs.setVacationItem(null);
vs.setFlightData(null);
vs.setSegmentStatus(VacationSegment.NONE_STATUS);
vs.setFlightPrice(0);
}
public void clearAllFlight(){
for(int i=0;i<flightSegments.size();i++){
cleanItemForSegment(flightSegments.get(i));
}
}
/**
* 获得了套餐之后,需要清空以前的机票元素
* @param data
* @param position
*/
public void handleSetPackage(VacationPackage vacationPackage){
if(vacationPackage == null){
return;
}
clearAllFlight();
setVacationPackage(vacationPackage);
}
/**
* 删除套餐之后
* @param data
* @param position
*/
public void handleDelPackage(){
setVacationPackage(null);
}
public void handleAbsoluteFlightForSegment(FlightData data,int position){
if(data == null||position>=vacationSegmentList.size()){
return;
}
VacationSegment targetSegment = vacationSegmentList.get(position);
cleanItemForSegment(targetSegment);
targetSegment.setSegmentStatus(VacationSegment.SELECT_FLIGHT);
targetSegment.setFlightData(data);
int allPriceInt = 0;
if(!TextUtils.isEmpty(data.getPrice())){//getItemAllPrice()
allPriceInt = (int)(Double.parseDouble(data.getPrice()));
}
if(Log.D){
Log.d(TAG, "vacationItem.getItemAllPrice() allpriceInt"+allPriceInt);
}
targetSegment.setFlightPrice(allPriceInt);
}
public VacationSegment getRoundTrip(VacationSegment segment){
String city1 = segment.getStartCity();
String city2 = segment.getDestCity();
for(int i=0;i<vacationSegmentList.size();i++){
final VacationSegment vs = vacationSegmentList.get(i);
if(Log.D){
Log.d(TAG,"i"+i+"vs.getDestCity(),city1"+vs.getDestCity()+city1);
Log.d(TAG,"i"+i+"vs.getStartCity(),city2"+vs.getStartCity()+city2);
}
if(vs.getSegmentKind()==VacationSegment.STAY_SEGMENT_KIND){
continue;
}
//91 1 1 91 91错 1 91 91
if(TextUtils.equals(vs.getDestCity(),city1)&&TextUtils.equals(vs.getStartCity(),city2)){
return vs;
}
}
return null;
}
public void handleGuestroomForSegment(GuestRoom guestroom,int position){
if(Log.D){
Log.d(TAG, "handleGuestroomForSegment()");
}
if(guestroom == null||position>=vacationSegmentList.size()){
return;
}
VacationSegment targetSegment = vacationSegmentList.get(position);
targetSegment.setSegmentStatus(VacationSegment.SELECT_HOTEL);
targetSegment.setGuestRoom(guestroom);
//TODO
int priceInt = 0;
final String price = guestroom.getPrice();
if(!TextUtils.isEmpty(price)){
priceInt = (int) Double.parseDouble(price);
}
targetSegment.setRoomPrice(priceInt);
//guestRoom对象
/*guestRoom = guestroom;
guestRoomPosition = position;*/
//vacationSegmentList.get(position).setSegmentStatus(VacationSegment.SELECT_HOTEL);
}
public void handleDelItem(int position){
VacationSegment targetSegment = vacationSegmentList.get(position);
targetSegment.setSegmentStatus(VacationSegment.NONE_STATUS);
if(targetSegment.getSegmentKind()==VacationSegment.STAY_SEGMENT_KIND){
targetSegment.setGuestRoom(null);
targetSegment.setRoomPrice(0);
}else{
targetSegment.setFlightData(null);
targetSegment.setVacationItem(null);
targetSegment.setFlightPrice(0);
}
//guestRoom对象
/*guestRoom = guestroom;
guestRoomPosition = position;*/
//vacationSegmentList.get(position).setSegmentStatus(VacationSegment.SELECT_HOTEL);
}
/*public VacationItem getFligtItem(){
return vacationFlightItem;
}
public GuestRoom getGuestRoom(){
return guestRoom;
}*/
public ArrayList<VacationSegment> getVacationSegmentList() {
return vacationSegmentList;
}
public boolean isLocalTrip() {
return isLocalTrip;
}
public void setLocalTrip(boolean isLocalTrip) {
this.isLocalTrip = isLocalTrip;
}
public int getPlanPrice() {
int allPrice = 0;
for(int i =0;i<vacationSegmentList.size();i++){
allPrice += vacationSegmentList.get(i).getSingleSegmentPrice();
}
int packagePrice = getVacationPackagePrice();
allPrice += packagePrice;
if(Log.D){
Log.d("","");
}
return allPrice;
}
public String getStartCityId() {
return startCityId;
}
public void setStartCityId(String startCityId) {
this.startCityId = startCityId;
}
public boolean isLockedCity() {
return isLockedCity;
}
public void setLockedCity(boolean isLockedCity) {
this.isLockedCity = isLockedCity;
}
public boolean isSameCity() {
return isSameCity;
}
public void setSameCity(boolean isSameCity) {
this.isSameCity = isSameCity;
}
public String getLockedCityName() {
return lockedCityName;
}
public void setLockedCityName(String lockedCityName) {
this.lockedCityName = lockedCityName;
}
public int getVacationPackagePrice() {
if(vacationPackage == null){
return 0;
}
final String price = vacationPackage.getItemAllPrice();
int priceInt = 0;
if(!TextUtils.isEmpty(price)){
try{
priceInt = (int) Double.parseDouble(price);
}catch(Exception e){
return 0;
}
}
return priceInt;
}
public VacationPackage getVacationPackage() {
return vacationPackage;
}
public void setVacationPackage(VacationPackage vacationPackage) {
this.vacationPackage = vacationPackage;
}
}