com.hbc.api.trade.order.service.OrderService.java Source code

Java tutorial

Introduction

Here is the source code for com.hbc.api.trade.order.service.OrderService.java

Source

/*
 * Copyright (c) 2015-2016, CCLX.COM. All rights reserved.
 * WANDA GROUP PROPRIETARY/CONFIDENTIAL. 
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is private property; you can't redistribute it and/or modify it
 * under the terms of the LICENSE you obtained from
 *
 *    http://www.cclx.com/
 * 
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. 
 *
 * Author: Jongly Ran
 * Revision: 1.0
 */
package com.hbc.api.trade.order.service;

import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.hbc.api.trade.TradeFinalStr;
import com.hbc.api.trade.bdata.common.IDGenerotor;
import com.hbc.api.trade.bdata.common.util.TimeConverter;
import com.hbc.api.trade.bdata.mapper.basedata.gen.bean.CityBean;
import com.hbc.api.trade.bdata.mapper.basedata.gen.bean.ContinentBean;
import com.hbc.api.trade.bdata.mapper.basedata.gen.bean.CountryBean;
import com.hbc.api.trade.bdata.mapper.coup.gen.bean.CouponBean;
import com.hbc.api.trade.order.OrderPal;
import com.hbc.api.trade.order.enums.TradeReturnCodeEnum;
import com.hbc.api.trade.order.enums.bean.OperationType;
import com.hbc.api.trade.order.enums.deliver.DeliverType;
import com.hbc.api.trade.order.enums.deliver.IsReadable;
import com.hbc.api.trade.order.enums.deliver.OrderDeliverStatus;
import com.hbc.api.trade.order.enums.deliver.OrderSerialFlag;
import com.hbc.api.trade.order.enums.deliver.UrgentFlag;
import com.hbc.api.trade.order.enums.order.CarGroupFlag;
import com.hbc.api.trade.order.enums.order.FlightIsCustom;
import com.hbc.api.trade.order.enums.order.GoodType;
import com.hbc.api.trade.order.enums.order.GuideCommentStatus;
import com.hbc.api.trade.order.enums.order.OrderKafkaOpt;
import com.hbc.api.trade.order.enums.order.OrderLogType;
import com.hbc.api.trade.order.enums.order.OrderSource;
import com.hbc.api.trade.order.enums.order.OrderStatus;
import com.hbc.api.trade.order.enums.order.OrderType;
import com.hbc.api.trade.order.enums.order.SystemCommentStatus;
import com.hbc.api.trade.order.enums.order.UserCommentStatus;
import com.hbc.api.trade.order.enums.order.VisaType;
import com.hbc.api.trade.order.enums.ota.AgentChannelEnum;
import com.hbc.api.trade.order.exception.TradeException;
import com.hbc.api.trade.order.mapping.gen.OrderBeanMapper;
import com.hbc.api.trade.order.mapping.gen.bean.OrderBean;
import com.hbc.api.trade.order.mapping.gen.bean.OrderBeanExample;
import com.hbc.api.trade.order.mapping.genx.UpdateOrderBeanMapper;
import com.hbc.api.trade.order.mapping.genx.xbean.OrderLogParamBean;
import com.hbc.api.trade.order.service.alarm.OrderAlarmService;
import com.hbc.api.trade.order.service.kafka.TradeKafkaMsgSender;
import com.hbc.api.trade.order.validator.OrderValidator;
import com.hbc.api.trade.pay.mapping.gen.bean.TradePayment;
import com.hbc.api.trade.settle.enums.AccountEnums;
import com.hbc.api.trade.third.CouponServiceParty;
import com.hbc.api.trade.third.LControllerService;
import com.hbc.api.trade.third.UserFundAccountService;
import com.hbc.api.trade.third.restful.IMService;
import com.hbc.api.trade.third.restful.UCenterService;
import com.hbc.api.trade.third.restful.UCenterService.Entity;

/**
 * @author Jongly Ran
 */
@Service
public class OrderService {
    protected final static Logger log = LoggerFactory.getLogger(OrderService.class);

    @Autowired
    protected OrderBeanMapper orderBeanMapper;
    @Autowired
    protected LControllerService controllerService;
    @Autowired
    protected OrderLogService orderLogService;
    @Autowired
    protected OrderServiceTime orderServiceTime;

    @Autowired
    protected UpdateOrderBeanMapper updateOrderBeanMapper;
    @Autowired
    protected TradeKafkaMsgSender tradeKafkaMsgSender;
    @Autowired
    protected CouponServiceParty couponServiceParty;
    @Autowired
    protected UserFundAccountService userFundAccountService;
    @Autowired
    private IMService imService;
    @Autowired
    PriceMarkService priceMarkService;

    @Autowired
    private UCenterService ucenterService;

    @Transactional
    public void updateOrderStatus(String orderNo, OrderStatus sourceOrderStatus, OrderStatus orderStatus) {
        log.info(orderNo + " start to update orderstatus to [" + orderStatus.name + "]");
        OrderBean orderBean = updateOrderBeanMapper.forupdateByOrderNo(orderNo);
        if (orderBean == null) {
            log.error("??????" + orderNo);
            throw new TradeException(TradeReturnCodeEnum.ORDER_NOTEXIST, orderNo);
        }
        if (orderBean.getOrderStatus().equals(orderStatus.value)) {
            log.error("??DB ?? ? ["
                    + OrderStatus.getStatus(orderBean.getOrderStatus()).name + "] ????"
                    + orderNo);
            throw new TradeException(TradeReturnCodeEnum.ORDER_NONEED_UPDATE);
        }
        int ors = updateOrderBeanMapper.updateOrderStatus(orderBean.getOrderNo(), orderBean.getOrderStatus(),
                orderStatus.value, orderStatus.name);
        if (ors > 0) {
            log.info("????where?orderNo" + orderNo
                    + ", oldOrderStatus: " + orderBean.getOrderStatus() + ", newOrderStatus:" + orderStatus.value
                    + ",newOrderStatusValue:" + orderStatus.name);
            tradeKafkaMsgSender.sendToKafka(orderBean, OrderKafkaOpt.statechange);
        } else {
            log.error("???where?orderNo" + orderNo
                    + ", oldOrderStatus: " + orderBean.getOrderStatus() + ", newOrderStatus:" + orderStatus.value
                    + ",newOrderStatusValue:" + orderStatus.name);
            throw new TradeException(TradeReturnCodeEnum.ORDER_UPDATE_FAILED);
        }
        log.info("??" + orderNo + " end to update orderstatus to [" + orderStatus.name + "]");
    }

    @Transactional
    public void updateOrderCancleTime(String orderNo) {
        OrderBean orderBean = new OrderBean();
        orderBean.setOrderNo(orderNo);
        orderBean.setCancelTime(new Date());
        orderBeanMapper.updateByPrimaryKeySelective(orderBean);
    }

    @Transactional
    public void resetSerOrder(OrderBean orderBean) {
        //serialFlag
        if (OrderSerialFlag.SERIAL.value.equals(orderBean.getSerialFlag())) {
            OrderBean record = new OrderBean();
            record.setOrderNo(orderBean.getOrderNo());
            record.setSerialFlag(OrderSerialFlag.NORMAL.value);
            record.setSerialOrderNo("");
            orderBeanMapper.updateByPrimaryKeySelective(record);
            log.info("? ?   " + orderBean.getOrderNo() + "   ?");
            if (orderBean.getSerialOrderNo() != null && orderBean.getSerialOrderNo().length() > 0) {
                String serNo = orderBean.getSerialOrderNo();

                OrderBean sdrecord = new OrderBean();
                sdrecord.setOrderNo(serNo);
                sdrecord.setSerialFlag(OrderSerialFlag.NORMAL.value);
                sdrecord.setSerialOrderNo("");
                orderBeanMapper.updateByPrimaryKeySelective(sdrecord);

                log.info("? ?   " + serNo + "   ?");
            }
        }
    }

    @Transactional
    public String addOrder(OrderBean orderBean) {
        OrderValidator.validateChildSeat(orderBean);
        OrderValidator.validatePassCity(orderBean);
        CityBean cityBean = controllerService.getCityById(orderBean.getServiceCityId());
        orderServiceTime.isValidServiceTime(orderBean, cityBean);
        // OrderValidator.validateHeadCount(orderBean);
        return addOrderProccess(orderBean);
    }

    @Transactional
    public String addOrderProccess(OrderBean orderBean) {
        CityBean cityBean = buildCityInfo(orderBean);
        buildServiceTime(orderBean, cityBean);
        buildCountryInfo(orderBean, cityBean);

        String orderNo = OrderPal.getOrderNoPrefix(orderBean) + IDGenerotor.generateOrderNo();
        if (OrderSource.OTA.value.equals(orderBean.getOrderSource())) {
            if (StringUtils.isBlank(orderBean.getUserId())) {
                Entity entity = ucenterService.obtainUserFundAccount(orderBean.getUserAreaCode1(),
                        orderBean.getUserMobile1(), orderBean.getAgentId(), orderBean.getAgentName(),
                        orderBean.getOrderChannel());
                orderBean.setUserId(entity.getUserId());
            }

            Integer orderChannel = orderBean.getOrderChannel();
            if (AgentChannelEnum.CTRIP_CHANNEL.value.equals(orderChannel)) {
                orderBean.setUserAccount(AccountEnums.XIECHEN_ACCOUNT.value);
            } else if (AgentChannelEnum.QUNAR_CHANNEL.value.equals(orderChannel)) {
                orderBean.setUserAccount(AccountEnums.QUNA_ACCOUNT.value);
            } else if (AgentChannelEnum.QUA_CHANNEL.value.equals(orderChannel)) {
                orderBean.setUserAccount(AccountEnums.QUA_ACCOUNT.value);
            } else {
                log.error("???orderChannel=" + orderChannel);
                throw new TradeException(TradeReturnCodeEnum.CHANNEL_FUND_ACCOUNT_NOT_SUPPORT);
            }
        } else {
            orderBean.setImToken(imService.obtainIMToken(orderNo));
            if (StringUtils.isBlank(orderBean.getUserId())) {
                Entity entity = ucenterService.obtainUserFundAccount(orderBean.getUserAreaCode1(),
                        orderBean.getUserMobile1(), orderBean.getAgentId(), orderBean.getAgentName(),
                        orderBean.getOrderChannel());
                orderBean.setUserId(entity.getUserId());
                orderBean.setUserAccount(entity.getAccountNo());
            } else {
                orderBean.setUserAccount(userFundAccountService.getUserAccount(orderBean.getUserId()));
            }
        }
        orderBean.setOrderNo(orderNo);
        buildStaticOrderBody(orderBean);
        if (OrderSource.OTA.value.equals(orderBean.getOrderSource())) {
            try {
                priceMarkService.verify(orderBean);
            } catch (Exception e) {
                orderBean.setPriceBase(orderBean.getPriceChannel());
                orderBean.setPriceGuide(orderBean.getPriceChannel());
                orderBean.setPriceGuideBase(orderBean.getPriceChannel());
                orderBean.setPriceTicket(orderBean.getPriceChannel());
                log.error("?", e);
            }
        } else {
            OrderBean orderCurBean = getCurSubOrder(orderBean);
            if (orderCurBean != null) {
                return orderCurBean.getOrderNo();
            }
            priceMarkService.verify(orderBean);
        }
        log.info("???" + JSON.toJSONString(orderBean));
        try {
            orderBeanMapper.insert(orderBean);
            tradeKafkaMsgSender.sendToKafka(orderBean, OrderKafkaOpt.add);
            saveLog(orderBean, orderNo);
            insertAlarm(orderBean);
        } catch (Exception e) {
            log.error("??", e);
            throw new TradeException(TradeReturnCodeEnum.FAILED_FOR_INSERT, "?");
        }
        log.info("???, orderNO=" + orderNo);
        return orderNo;
    }

    /**
     * ?OTA? ?2??
     * 
     * @return
     */
    public OrderBean getCurSubOrder(OrderBean orderBean) {
        OrderBeanExample orderBeanExample = new OrderBeanExample();
        OrderBeanExample.Criteria criteria = orderBeanExample.createCriteria();
        criteria.andUserIdEqualTo(orderBean.getUserId());
        Date date = new Date(System.currentTimeMillis() - 3 * 1000);
        criteria.andCreateTimeGreaterThan(date);
        criteria.andCarSeatNumEqualTo(orderBean.getCarSeatNum());
        criteria.andCarTypeIdEqualTo(orderBean.getCarTypeId());
        criteria.andOrderTypeEqualTo(orderBean.getOrderType());
        criteria.andServiceCityIdEqualTo(orderBean.getServiceCityId());
        List<OrderBean> olist = orderBeanMapper.selectByExample(orderBeanExample);

        if (olist.size() > 0) {
            return olist.get(0);
        } else {
            return null;
        }
    }

    /**
     * @param orderBean
     * @param orderNo
     */
    private void buildStaticOrderBody(OrderBean orderBean) {
        orderBean.setPriceGuideBase(orderBean.getPriceGuide());
        orderBean.setOrderStatus(OrderStatus.INITSTATE.value);
        orderBean.setOrderStatusName(OrderStatus.INITSTATE.name);
        Date currentTime = new Date();
        orderBean.setCreateTime(currentTime);
        orderBean.setUpdateTime(currentTime);
        orderBean.setGuideId(TradeFinalStr.defaultGuideId);
        orderBean.setDeliverStatus(OrderDeliverStatus.init.value);
        orderBean.setDeliverType(DeliverType.Ordinary.value);
        orderBean.setPriceGuide(orderBean.getPriceChannel());
        orderBean.setUserCommentStatus(UserCommentStatus.UNSCORED.value);
        orderBean.setGuideCommentStatus(GuideCommentStatus.UNSCORED.value);
        orderBean.setSystemCommentStatus(SystemCommentStatus.UNSCORED.value);
        orderBean.setFlightIsCustom(FlightIsCustom.NORMAL.value);
        orderBean.setSerialFlag(
                orderBean.getSerialFlag() == null ? OrderSerialFlag.NORMAL.value : orderBean.getSerialFlag());
        orderBean.setIsArrivalVisa(
                orderBean.getIsArrivalVisa() == null ? VisaType.UNDEFINED.value : orderBean.getIsArrivalVisa());
        orderBean.setCargroupFlag(
                orderBean.getCargroupFlag() == null ? CarGroupFlag.NORMAL.value : orderBean.getCargroupFlag());
        orderBean.setCheckInPrice(orderBean.getCheckInPrice() == null ? 0d : orderBean.getCheckInPrice());
        orderBean.setIsReadable(IsReadable.VISIABLE.value);
        if (orderBean.getUrgentFlag() == null) {
            orderBean.setUrgentFlag(UrgentFlag.nomal.value);
        }

        // BUGFIX
        if (StringUtils.isNoneBlank(orderBean.getStartAddress()) && orderBean.getStartAddress().equals("null")) {
            orderBean.setStartAddress(null);
        }
        if (StringUtils.isNoneBlank(orderBean.getStartAddressDetail())
                && orderBean.getStartAddressDetail().equals("null")) {
            orderBean.setStartAddressDetail(null);
        }
    }

    /**
     * @param orderBean
     * @param orderType
     * @param orderNo
     */
    private void saveLog(OrderBean orderBean, String orderNo) {
        OrderLogParamBean orderLogParamBean = new OrderLogParamBean();
        boolean isAgentOrder = StringUtils.isBlank(orderBean.getAgentOpid());
        String opUserId = isAgentOrder ? orderBean.getUserId() : orderBean.getAgentOpid();
        String opUserName = isAgentOrder ? orderBean.getUserName() : orderBean.getAgentOpname();
        OrderType orderType = OrderType.getType(orderBean.getOrderType());
        orderLogParamBean.setContent(OrderLogType.SUBMIT_ORDER_CONTENT(orderBean.getAgentName(), opUserName,
                TimeConverter.formatDate(new Date()), orderType));
        orderLogParamBean.setLogType(OrderLogType.SUBMIT_ORDER.type);
        orderLogParamBean.setGuideId(opUserId);
        orderLogParamBean.setGuideName(opUserName);
        orderLogParamBean.setOpType(isAgentOrder ? OperationType.ASSISTENT.value : OperationType.CUSTOMER.value);
        orderLogParamBean.setOpUserId(opUserId);
        orderLogParamBean.setOpUserName(opUserName);
        orderLogParamBean.setOrderNo(orderNo);
        orderLogService.insertOrderLog(orderLogParamBean);
    }

    /**
     * @param orderBean
     * @param cityBean
     */
    private void buildCountryInfo(OrderBean orderBean, CityBean cityBean) {
        CountryBean country = controllerService.getCountryById(cityBean.getCountryId());
        if (country == null) {
            log.error("?countryId" + cityBean.getCountryId());
            throw new TradeException(TradeReturnCodeEnum.ORDER_COUNTRY_EXIST, "?");
        }
        orderBean.setServiceCountryName(country.getCountryName());
        orderBean.setServiceCountryId(country.getCountryId());

        ContinentBean continentBean = controllerService.geContinentById(country.getContinentId());
        if (continentBean == null) {
            log.error("??continentId" + country.getContinentId());
            throw new TradeException(TradeReturnCodeEnum.ORDER_Continent_EXIST, "?");
        }
        orderBean.setServiceContinentName(continentBean.getContinentName());
        orderBean.setServiceContinentId(continentBean.getContinentId());
    }

    /**
     * @param orderBean
     * @param orderType
     * @param cityBean
     */
    private void buildServiceTime(OrderBean orderBean, CityBean cityBean) {
        OrderType orderType = OrderType.getType(orderBean.getOrderType());
        log.info("orderType:" + orderType);
        boolean hasExpectedCompTime = false;
        switch (orderType) {
        case PICKUPORDER:
        case TRANSFER:
        case PERUSE:
            hasExpectedCompTime = true;
            log.info("?hasExpectedCompTime:" + hasExpectedCompTime);
            break;
        case COMMENDATION:
            log.info("?hasExpectedCompTime:" + hasExpectedCompTime);
            GoodType goodsType = GoodType.getType(orderBean.getOrderGoodsType());
            switch (goodsType) {
            case PERUSE:
            case PICKUPORDER:
            case TRANSFER:
                hasExpectedCompTime = true;
                break;
            default:
                hasExpectedCompTime = false;
            }
            break;
        default:
            hasExpectedCompTime = false;
        }

        if (hasExpectedCompTime) {
            // ?
            Date serviceDate = orderBean.getServiceTime();
            if (orderBean.getExpectedCompTime() == null) {
                orderBean.setExpectedCompTime(0);
            }
            Date endTime = new Date(serviceDate.getTime() + 60 * 1000 * orderBean.getExpectedCompTime());
            orderBean.setServiceEndTime(endTime);
        }
    }

    /**
     * @param orderBean
     * @param orderType
     * @return
     */
    private CityBean buildCityInfo(OrderBean orderBean) {
        CityBean cityBean = controllerService.getCityById(orderBean.getServiceCityId());
        if (cityBean == null) {
            throw new TradeException(TradeReturnCodeEnum.ORDER_PARAM_FAILED, "?ID");
        }
        orderBean.setServiceCityName(cityBean.getCityName());
        orderBean.setServiceCityEnname(cityBean.getEnName());
        orderBean.setServiceCitySpell(cityBean.getSpell());
        if (OrderType.DAILY.value.equals(orderBean.getOrderType())) {
            CityBean cityPo = controllerService.getCityById(orderBean.getServiceEndCityid());
            if (cityPo == null) {
                log.error("ID?serverEndCityId" + orderBean.getServiceEndCityid());
                throw new TradeException(TradeReturnCodeEnum.ORDER_CITY_EXIST, "");
            }
            orderBean.setServiceEndCityname(cityPo.getCityName());
        }

        orderBean.setServiceCityName(cityBean.getCityName());
        orderBean.setServiceCityEnname(cityBean.getEnName());
        orderBean.setServiceCitySpell(cityBean.getSpell());
        return cityBean;
    }

    public void updateCoupInfos(OrderBean orderBean, String coupId, TradePayment tradePayment) {
        CouponBean couponBean = couponServiceParty.getCoup(coupId);
        orderBean.setCoupId(coupId);
        orderBean.setCoupPriceInfo(tradePayment.getCouponInfo());
        orderBean.setCoupType(couponBean.getCouponType());
        updateOrderBeanMapper.addCoupOrder(orderBean);
    }

    /**
     * ?
     * 
     * @param serialFlag
     * @param serialOrderNo
     * @param orderNo
     */
    public void updateOrderSerialFlag(int serialFlag, String serialOrderNo, String orderNo) {

        updateOrderBeanMapper.updateOrderSerialFlag(serialFlag, serialOrderNo, orderNo);
    }

    @Autowired
    OrderAlarmService orderAlarmService;

    private void insertAlarm(OrderBean orderBean) {
        orderAlarmService.insertBeforeLeave(orderBean);
        orderAlarmService.insertNoService(orderBean);
    }

    /**
     * @param registerId
     */
    public void registerFlight(String registerId, String orderNo) {
        OrderBean target = new OrderBean();
        target.setFlightRegisterId(registerId);
        OrderBeanExample conditions = new OrderBeanExample();
        conditions.createCriteria().andOrderNoEqualTo(orderNo).andFlightIsCustomEqualTo(FlightIsCustom.CUSTOM.value)
                .andFlightRegisterIdIsNull();
        if (orderBeanMapper.updateByExampleSelective(target, conditions) == 0) {
            log.error("???" + orderNo);
            throw new TradeException(TradeReturnCodeEnum.FAILED_FOR_UPDATE, "??");
        }
    }

    public void updateOrder(OrderBean record) {
        if (orderBeanMapper.updateByPrimaryKeySelective(record) == 0) {
            log.error("???" + record.getOrderNo());
            throw new TradeException(TradeReturnCodeEnum.FAILED_FOR_UPDATE,
                    "?" + JSON.toJSONString(record));
        }
    }
}