cn.buk.hotel.service.HotelServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for cn.buk.hotel.service.HotelServiceImpl.java

Source

/*
* Distributable under LGPL v3 license.
* See terms of license at https://github.com/Yunfeng/schotel/blob/master/LICENSE
*/
package cn.buk.hotel.service;

import cn.buk.hotel.dao.CityDao;
import cn.buk.hotel.dao.HotelDao;
import cn.buk.hotel.dto.*;
import cn.buk.hotel.entity.*;
import cn.buk.hotel.sc.HotelSearchCriteria;
import cn.buk.util.DateUtil;
import cn.buk.util.EncryptUtil;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * @author william dai(yunfeng2005@gmail.com)
 * @website http://www.buk.cn/
 * Date: 14-10-29
 * Time: ?1:41
 */
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class HotelServiceImpl implements HotelService {

    private static Logger logger = Logger.getLogger(HotelServiceImpl.class);

    private HotelDao hotelDao;
    private CityDao cityDao;

    private static final CacheManager cacheManager = CacheManager.getInstance();

    private static Cache getCache() {
        String cacheName = "hotelSearchCache";
        Cache cache = cacheManager.getCache(cacheName);
        if (cache == null) {
            cacheManager.addCache(cacheName);
            cache = cacheManager.getCache(cacheName);
        }

        return cache;
    }

    @Override
    public int createHotelInfo(HotelInfo hotelInfo) {
        return hotelDao.createHotelInfo(hotelInfo);
    }

    @Override
    public HotelInfo getHotelInfoByHotelCode(String hotelCode) {
        return hotelDao.getHotelInfoByHotelCode(hotelCode);
    }

    @Override
    public HotelSearchResult searchHotel(String cityCode, Date checkInDate, Date checkOutDate, String hotelName,
            int pageNo, String star, int districtId, int zoneId) {
        HotelSearchResult searchResult = new HotelSearchResult();

        if (checkInDate.getTime() < DateUtil.getCurDate().getTime())
            checkInDate = DateUtil.getCurDate();
        if (checkInDate.getTime() >= checkOutDate.getTime())
            checkOutDate = DateUtil.add(checkInDate, 1);

        City city = cityDao.getCityByCode(cityCode);
        Date baseTime = DateUtil.getCurDateTime();
        int cityId = city.getOpenApiId();

        List<HotelInfoDto> dtos = new ArrayList<HotelInfoDto>();
        HotelSearchCriteria sc = new HotelSearchCriteria();
        sc.setCityId(cityId);
        sc.setCheckInDate(checkInDate);
        sc.setCheckOutDate(checkOutDate);
        sc.setHotelName(hotelName);
        sc.getPage().setPageNo(pageNo);
        sc.setStar(star);
        sc.setDistrictId(districtId);
        sc.setZoneId(zoneId);

        /**
         * ?
         */
        String cacheKey = null;
        try {
            String scToString = sc.toString();
            cacheKey = EncryptUtil.MD5Encoding(scToString);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        if (cacheKey != null) {
            logger.debug("cacheKey: " + cacheKey);
            net.sf.ehcache.Element cacheElement = getCache().get(cacheKey);
            if (cacheElement != null) {
                searchResult = (HotelSearchResult) cacheElement.getObjectValue();
                logger.debug("Nothing for key: " + searchResult);
                return searchResult;
            } else {
                logger.debug("Nothing for key: " + cacheKey);
            }
        }

        List<HotelInfo> hotelInfos = hotelDao.searchAvailableHotel(sc);
        int span0 = DateUtil.getPastTime(baseTime);

        //?????
        int bookingDays = DateUtil.getPastDays(checkOutDate, checkInDate);
        int bookingAdvancedDays = DateUtil.getPastDays(checkInDate, DateUtil.getCurDate());

        Date baseTime2 = DateUtil.getCurDateTime();
        for (HotelInfo hotelInfo : hotelInfos) {
            //
            HotelInfoDto dto = new HotelInfoDto();
            dtos.add(dto);
            dto.setHotelCode(hotelInfo.getHotelCode());
            dto.setHotelName(hotelInfo.getHotelName());
            dto.setHotelAddress(hotelInfo.getAddress());
            dto.setHotelStarRate(hotelInfo.getHotelStarRate());
            dto.setHotelUserRate(hotelInfo.getHotelUserRate());

            Date baseTime1 = DateUtil.getCurDateTime();
            //??
            List<HotelMultimediaInfo> medias = hotelDao.getHotelMultimediaList(hotelInfo.getId());
            for (HotelMultimediaInfo media : medias) {
                if (media.getMediaType().equalsIgnoreCase("image")
                        && media.getCategory() == HotelMultimediaInfo.HOTEL_PICTURE_EXTERIOR_VIEW)
                    dto.setHotelExteriorPictureUrl(media.getUrl());
                else if (media.getMediaType().equalsIgnoreCase("text")
                        && media.getCategory() == HotelMultimediaInfo.HOTEL_TEXT_DESC)
                    dto.setHotelDesc(media.getDescription().trim());
            }

            //

            List<HotelRatePlan> ratePlans = hotelDao.searchAvailableHotelRatePlan(hotelInfo.getId(), checkInDate,
                    checkOutDate);

            //ratePlanCoderoomTypeCode?,invBlockCode?  yfdai 2015-1-8
            List<HotelGuestRoom> rooms = hotelDao.getHotelRoomInfoList(hotelInfo.getId());
            for (HotelGuestRoom room : rooms) {
                for (HotelRatePlan rp : ratePlans) {
                    if (rp.getHotelRatePlanRates() == null || rp.getHotelRatePlanRates().size() == 0)
                        continue;
                    if (!room.getRoomTypeCode().equalsIgnoreCase(Integer.toString(rp.getRatePlanCode())))
                        continue;

                    //???
                    if (rp.getHotelRatePlanBookingRules() != null && rp.getHotelRatePlanBookingRules().size() > 0) {
                        HotelRatePlanBookingRule rule = rp.getHotelRatePlanBookingRules().get(0);
                        if (rule.getMinAdvancedBookingOffset() > 0
                                && rule.getMinAdvancedBookingOffset() > bookingAdvancedDays)
                            continue;
                        if (rule.getMaxAdvancedBookingOffset() > 0
                                && rule.getMaxAdvancedBookingOffset() > bookingAdvancedDays)
                            continue;
                        if (rule.getLengthOfStay() > 0 && rule.getLengthOfStay() > bookingDays)
                            continue;
                    }

                    //offer??
                    if (rp.getHotelRatePlanOffers() != null && rp.getHotelRatePlanOffers().size() > 0) {
                        boolean b = true;
                        for (HotelRatePlanOffer offer : rp.getHotelRatePlanOffers()) {
                            //1002-
                            if (offer.getOfferCode() == 1002)
                                continue;
                            //1001- 
                            if (offer.getOfferCode() == 1001) {
                                if (offer.getRatePlanOfferRules() != null
                                        && offer.getRatePlanOfferRules().size() > 0) {
                                    //<!-- ?-->
                                    //<!-- StartEnd?RestrictionTypbooking?RestrictionDateCode 501502???-->
                                    for (HotelRatePlanOfferRule rule : offer.getRatePlanOfferRules()) {
                                        for (HotelRatePlanOfferRuleDateRestriction restriction : rule
                                                .getRatePlanOfferRuleDateRestrictions()) {
                                            DateRange dateRange = restriction.getDateRange();
                                            if (dateRange == null || dateRange.getRestrictionDateCode() == null)
                                                continue;
                                            if (!dateRange.getRestrictionType().equalsIgnoreCase("booking"))
                                                continue;
                                            if (dateRange.getRestrictionDateCode() == null)
                                                continue;
                                            if (dateRange.getRestrictionDateCode().equalsIgnoreCase("501")) {
                                                //
                                                if (DateUtil.isLowerEqualDate(dateRange.getStartTime()))
                                                    b = false;
                                                if (DateUtil.isGreaterEqualDate(dateRange.getEndTime()))
                                                    b = false;

                                            } else if (dateRange.getRestrictionDateCode().equalsIgnoreCase("502")) {
                                                //
                                                if (DateUtil.isLowerEqualOnlyTime(dateRange.getStartTime()))
                                                    b = false;
                                                if (DateUtil.isGreaterEqualOnlyTime(dateRange.getEndTime()))
                                                    b = false;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if (!b)
                            continue;
                    }

                    HotelRatePlanDto rpDto = new HotelRatePlanDto();

                    rpDto.setRatePlanCode(rp.getRatePlanCode());
                    rpDto.setRatePlanName(rp.getName());

                    rpDto.setInvBlockCode(room.getInvBlockCode());
                    rpDto.setRoomTypeCode(Integer.toString(rp.getRatePlanCode()));

                    rpDto.setRoomTypeName(room.getRoomTypeName());
                    if (room.getBedTypeCode() != null)
                        rpDto.setBedTypeCode(Integer.parseInt(room.getBedTypeCode()));

                    for (HotelGuestRoomAmenity amenity : room.getHotelGuestRoomAmenities()) {
                        HotelRoomAmenityDto amenityDto = new HotelRoomAmenityDto();
                        amenityDto.setAmenityCode(amenity.getCode());
                        amenityDto.setAmenityName(amenity.getDescription());

                        rpDto.getAmenities().add(amenityDto);
                    }

                    //rpDto.setRoomTypeName(rp.getName());
                    int price = 0;
                    for (HotelRatePlanRate rate0 : rp.getHotelRatePlanRates()) {
                        //price += rate.getHotelRatePlanRateBaseByGuestAmounts().get(0).getAmountBeforeTax();
                        HotelRatePlanRateDto rate1 = new HotelRatePlanRateDto();
                        rpDto.getRates().add(rate1);

                        rate1.setStartDate(rate0.getStartDate());
                        rate1.setPrice(rate0.getHotelRatePlanRateBaseByGuestAmounts().get(0).getAmountBeforeTax());
                        rate1.setBreakfast(rate0.getBreakfast());

                        //
                        if (rate0.getHotelRatePlanRatePromotions() != null
                                && rate0.getHotelRatePlanRatePromotions().size() > 0) {
                            rate1.setRebateAmount(rate0.getHotelRatePlanRatePromotions().get(0).getAmount());
                            rate1.setRebateDesc(rate0.getHotelRatePlanRatePromotions().get(0).getDescription());
                        }
                        //?
                        if (rate0.getHotelRatePlanRateGuaranteePolicies() != null
                                && rate0.getHotelRatePlanRateGuaranteePolicies().size() > 0) {
                            rate1.setGuaranteeCode(
                                    rate0.getHotelRatePlanRateGuaranteePolicies().get(0).getGuaranteeCode());
                            rate1.setHoldTime(rate0.getHotelRatePlanRateGuaranteePolicies().get(0).getHoldTime());
                        }
                        //?
                        if (rate0.getHotelRatePlanRateCancelPolicies() != null
                                && rate0.getHotelRatePlanRateCancelPolicies().size() > 0) {
                            HotelRatePlanRateCancelPolicy policy = rate0.getHotelRatePlanRateCancelPolicies()
                                    .get(0);
                            rate1.setCancelPolicyStart(policy.getStartTime());
                            rate1.setCancelPolicyEnd(policy.getEndTime());
                            rate1.setCancelPenaltyAmount((int) policy.getAmount());
                        }
                    }
                    rpDto.calcAveragePrice();

                    int breakfast = rp.getHotelRatePlanRates().get(0).getBreakfast();
                    int breakfastCount = rp.getHotelRatePlanRates().get(0).getNumberOfBreakfast();
                    if (breakfast == 0)
                        breakfastCount = 0;
                    rpDto.setBreakfast(breakfastCount);

                    dto.addRatePlan(rpDto);
                }
            }
            int span4 = DateUtil.getPastTime(baseTime1);
            logger.info("elapsed time span4: " + span4 + " ms.");
        }
        int span2 = DateUtil.getPastTime(baseTime2);
        int spanTotal = DateUtil.getPastTime(baseTime);
        logger.info("elapsed time: total=" + spanTotal + "ms, span0=" + span0 + ", span2=" + span2 + ".");

        searchResult.setHotels(dtos);
        searchResult.setPageNo(sc.getPage().getPageNo());
        searchResult.setPageTotal(sc.getPage().getPageTotal());
        searchResult.setRowCount(sc.getPage().getRowCount());

        if (cacheKey != null) {
            getCache().put(new net.sf.ehcache.Element(cacheKey, searchResult));
            logger.debug("Put object into cache with key " + cacheKey);
        }

        return searchResult;
    }

    @Override
    public HotelAvailResult checkHotelAvail(String hotelCode, Date checkInDate, Date checkOutDate,
            String ratePlanCode, int roomQuantity, int guestCount, Date lateArrivalTime) {
        return null;
    }

    @Override
    public List<LocationDto> getLocations(String cityCode, String locationType) {
        City city = cityDao.getCityByCode(cityCode);
        int cityId = city.getOpenApiId();

        List<LocationDto> dtos = new ArrayList<LocationDto>();

        if (locationType.equalsIgnoreCase("district")) {
            List<District> districts = hotelDao.getDistrictByCityId(cityId);
            for (District district : districts) {
                LocationDto dto = new LocationDto();
                dtos.add(dto);

                dto.setId(district.getDistrictId());
                dto.setName(district.getName());
            }
        } else if (locationType.equalsIgnoreCase("zone")) {
            List<Zone> zones = hotelDao.getZoneByCityId(cityId);
            for (Zone zone : zones) {
                LocationDto dto = new LocationDto();
                dtos.add(dto);

                dto.setId(zone.getZoneId());
                dto.setName(zone.getName());
            }
        }

        return dtos;

    }

    @Override
    public HotelRoomInfoResult getHotelRoomInfo(String hotelCode, String ratePlanCode, Date checkInDate,
            Date checkOutDate) {
        HotelInfo hotelInfo = hotelDao.getHotelInfoByHotelCode(hotelCode);

        HotelInfoDto dto = new HotelInfoDto();
        dto.setHotelCode(hotelInfo.getHotelCode());
        dto.setHotelName(hotelInfo.getHotelName());
        dto.setHotelAddress(hotelInfo.getAddress());
        dto.setHotelStarRate(hotelInfo.getHotelStarRate());
        dto.setHotelUserRate(hotelInfo.getHotelUserRate());

        //Date baseTime1 = DateUtil.getCurDateTime();
        //??
        List<HotelMultimediaInfo> medias = hotelDao.getHotelMultimediaList(hotelInfo.getId());
        for (HotelMultimediaInfo media : medias) {
            if (media.getMediaType().equalsIgnoreCase("image")
                    && media.getCategory() == HotelMultimediaInfo.HOTEL_PICTURE_EXTERIOR_VIEW)
                dto.setHotelExteriorPictureUrl(media.getUrl());
            else if (media.getMediaType().equalsIgnoreCase("text")
                    && media.getCategory() == HotelMultimediaInfo.HOTEL_TEXT_DESC)
                dto.setHotelDesc(media.getDescription().trim());
        }

        //?
        HotelRoomDto roomDto = new HotelRoomDto();

        HotelRatePlan ratePlan = hotelDao.getHotelRatePlanInfo(hotelInfo.getId(), ratePlanCode);
        roomDto.setRoomTypeName(ratePlan.getName());

        HotelGuestRoom room = hotelDao.getHotelRoomInfo(hotelInfo.getId(), ratePlanCode);
        roomDto.setFloor(room.getFloor());
        roomDto.setBedTypeCode(room.getBedTypeCode());
        roomDto.setRoomSize(room.getRoomSize());

        HotelRoomInfoResult hotelRoomInfoResult = new HotelRoomInfoResult();
        hotelRoomInfoResult.setHotelInfo(dto);
        hotelRoomInfoResult.setRoomInfo(roomDto);

        //
        HotelRatePlan hotelRatePlan = hotelDao.searchAvailableHotelRatePlan(hotelInfo.getId(), checkInDate,
                checkOutDate, Integer.parseInt(ratePlanCode));
        roomDto.setPrice(hotelRatePlan.getHotelRatePlanRates().get(0).getHotelRatePlanRateBaseByGuestAmounts()
                .get(0).getAmountBeforeTax());

        return hotelRoomInfoResult;
    }

    @Override
    public int createHotelOrder(HotelOrder hotelOrder) {
        return hotelDao.createHotelOrder(hotelOrder);
    }

    public HotelDao getHotelDao() {
        return hotelDao;
    }

    public void setHotelDao(HotelDao hotelDao) {
        this.hotelDao = hotelDao;
    }

    public CityDao getCityDao() {
        return cityDao;
    }

    public void setCityDao(CityDao cityDao) {
        this.cityDao = cityDao;
    }

    public void stopService() {
        try {
            //cacheManager.clearAll();
            System.out.println("cacheManager.shutdown();");
            cacheManager.shutdown();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}