OrderBusinessCouponServiceImpl.java 11.4 KB
package com.zteits.business.biz.impl;

import com.clouds.common.utils.DateUtil;
import com.clouds.common.utils.SequenceUtil;
import com.zteits.business.dao.*;
import com.zteits.business.domain.*;
import com.zteits.clouds.api.apibase.bean.BizResult;
import com.zteits.clouds.api.apibase.bean.PageBean;
import com.zteits.clouds.api.apibase.constants.DataStatusEnum;
import com.zteits.clouds.api.apibase.constants.ErrorType;
import com.zteits.clouds.api.apibase.constants.OrderStateEnum;
import com.zteits.clouds.api.apibase.constants.SequenceTypeEnum;
import com.zteits.clouds.api.apibase.exception.BizException;
import com.zteits.clouds.api.dto.business.dto.OrderBusinessCouponDTO;
import com.zteits.clouds.api.dto.business.param.OrderBusinessCouponAndSubRequest;
import com.zteits.clouds.api.dto.business.param.OrderBusinessCouponRequest;
import com.zteits.clouds.api.dto.clouds.param.BatchDeleteByPrimaryKeyRequest;
import com.zteits.clouds.api.service.business.OrderBusinessCouponService;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

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

@Component
public class OrderBusinessCouponServiceImpl implements OrderBusinessCouponService {

    private static final Logger logger = LoggerFactory.getLogger(H5BusinessOrderParkServiceImpl.class);

    @Autowired
    private OrderBusinessCouponDao orderBusinessCouponDao;
    @Autowired
    private OrderBusinessCouponSubDao orderBusinessCouponSubDao;
    @Autowired
    private TdCBusinessCouponRuleDao tdCBusinessCouponRuleDao;
    @Autowired
    private TdCBusinessCouponRuleParkRelDao tdCBusinessCouponRuleParkRelDao;
    /** 商户已经购买的券 td_c_business_coupon **/
    @Autowired
    private TdCBusinessCouponDao tdCBusinessCouponDao;

    /**
     * 根据支付单ID查询订单
     *
     * @param request
     * @return
     */
    @Override
    public BizResult<OrderBusinessCouponDTO> queryOrderByOrderId(OrderBusinessCouponRequest request) {
        OrderBusinessCouponDTO dto = orderBusinessCouponDao.queryOrderByOrderId(request);
        return new BizResult<>(dto);
    }

    @Override
    public BizResult<List<OrderBusinessCouponDTO>> queryOrderBusinessCoupon(OrderBusinessCouponRequest request) {
        List<OrderBusinessCouponDTO> orderBusinessCouponDTOS = new ArrayList<>();
        List<OrderBusinessCoupon> orderBusinessCoupons = orderBusinessCouponDao.queryOrderBusinessCoupon(request);
        if (CollectionUtils.isEmpty(orderBusinessCoupons)) {
            return new BizResult<>(orderBusinessCouponDTOS);
        }
        for (OrderBusinessCoupon source : orderBusinessCoupons) {
            OrderBusinessCouponDTO dto = new OrderBusinessCouponDTO();
            BeanUtils.copyProperties(source, dto);
            orderBusinessCouponDTOS.add(dto);
        }
        return new BizResult<>(orderBusinessCouponDTOS);
    }

    @Override
    public BizResult<PageBean<OrderBusinessCouponDTO>> queryOrderBusinessCouponForPage(OrderBusinessCouponRequest request) {
        PageBean<OrderBusinessCouponDTO> pageBean = new PageBean<>();
        /*PageInfo<OrderBusinessCoupon> pageInfo = orderBusinessCouponDao.queryOrderBusinessCouponForPage(request);
        if (pageInfo != null && pageInfo.getList() != null && pageInfo.getList().size() > 0) {
            PageBeanUtil.copyProperties(pageInfo, pageBean, OrderBusinessCouponDTO.class);
        }*/
        return new BizResult<>(pageBean);
    }

    @Override
    public BizResult<Boolean> batchDeleteOrderBusinessCouponByPrimaryKey(BatchDeleteByPrimaryKeyRequest request) {
        int delenum = orderBusinessCouponDao.batchDeleteOrderBusinessCouponByPrimaryKey(request.getIds(), request.getOpId(), request.getsOpName());
        return new BizResult<>(delenum > 0);
    }

    @Override
    public BizResult<Boolean> saveOrderBusinessCoupon(OrderBusinessCouponRequest request) {
        OrderBusinessCoupon orderBusinessCoupon = new OrderBusinessCoupon();
        BeanUtils.copyProperties(request, orderBusinessCoupon);
        int saveNum = orderBusinessCouponDao.saveOrderBusinessCoupon(orderBusinessCoupon);
        return new BizResult<>(saveNum > 0);
    }

    /**
     * 商户购买优惠券创建订单
     */
    @Transactional
    @Override
    public BizResult<String> saveOrderBusinessCouponAndSub(OrderBusinessCouponAndSubRequest request) {
        TdCBusinessCouponRuleParkRel tdCBusinessCouponRuleParkRel = tdCBusinessCouponRuleParkRelDao.queryByCardRelParkNo(request.getCardRelParkNo());
        if(tdCBusinessCouponRuleParkRel == null){
            throw new BizException(ErrorType.APP_ERROR, " 找不到停车场关联的优惠规则 ");
        }

        int buyNum = request.getBuyNum();
        // limitNum 用于当月最大购买总数限制
        int currentMonthlimitNum = 0;
        if (tdCBusinessCouponRuleParkRel.getCardLimitNum() == null || tdCBusinessCouponRuleParkRel.getCardLimitNum() == 0) {
            // 0的话就是不限制
            currentMonthlimitNum = Integer.MAX_VALUE;
        }else{
            currentMonthlimitNum = tdCBusinessCouponRuleParkRel.getCardLimitNum();
        }
        // 获取此券本月已经买的总数
        int boughtNum = this.currentMonthBuyNumByCardRuleNo(request.getCardRelParkNo());
        logger.info("卡券(CardRuleNo){}本月已经购买数量为{},本月限额{}", request.getCardRuleNo(),boughtNum,currentMonthlimitNum);
        if ((buyNum + boughtNum) > currentMonthlimitNum) {
            // 单次购买不能超过限额
            throw new BizException(ErrorType.APP_ERROR, "本月购买最大限额为 " + currentMonthlimitNum + ",您本月已经购买" + boughtNum);
        }

        // 保存主表
        OrderBusinessCoupon orderBusinessCoupon = this.saveOrder(request, tdCBusinessCouponRuleParkRel);
        // 保存从表
        this.saveSubOrder(request, tdCBusinessCouponRuleParkRel, orderBusinessCoupon);

        return new BizResult<>(orderBusinessCoupon.getOrderNo());
    }

    /**
     * 根据系统时间计算当月商户指定的商户券购买的总数
     * @param cardRelParkNo
     * @return
     */
    private int currentMonthBuyNumByCardRuleNo(String cardRelParkNo){
        int num = tdCBusinessCouponDao.selectBusinessCouponBuyNumByCardRelParkNo(cardRelParkNo,DateUtil.getCurrentMonthStartDate(),DateUtil.getCurrentMonthEndDate());
        return num;
     }

    private OrderBusinessCoupon saveOrder(OrderBusinessCouponAndSubRequest request, TdCBusinessCouponRuleParkRel tdCBusinessCouponRuleParkRel) {

        OrderBusinessCoupon orderBusinessCoupon = new OrderBusinessCoupon();
        BeanUtils.copyProperties(request, orderBusinessCoupon);
        orderBusinessCoupon.setOrderNo(SequenceUtil.getNextId(SequenceTypeEnum.ORDER_ACC_RECHARGE));
        orderBusinessCoupon.setOrderSource(request.getTerminalSource());
        orderBusinessCoupon.setOrderState(OrderStateEnum.WAIT_PAY.value());
        orderBusinessCoupon.setDataState(DataStatusEnum.DATA_STATUS_VALID.value());
        orderBusinessCoupon.setBuyerDataState(DataStatusEnum.DATA_STATUS_VALID.value());
        orderBusinessCoupon.setCreateDate( new Date());
        orderBusinessCoupon.setCreateEmpId(request.getsOpName());

        orderBusinessCouponDao.saveOrderBusinessCoupon(orderBusinessCoupon);
        return orderBusinessCoupon;
    }

    private void saveSubOrder(OrderBusinessCouponAndSubRequest request, TdCBusinessCouponRuleParkRel tdCBusinessCouponRuleParkRel, OrderBusinessCoupon orderBusinessCoupon) {
        int buyNum = request.getBuyNum();
        TdCBusinessCouponRule tdCBusinessCouponRule = queryBusinessCouponRule(request.getCardRuleNo());
        OrderBusinessCouponSub orderBusinessCouponSub = new OrderBusinessCouponSub();
        BeanUtils.copyProperties(request, orderBusinessCouponSub);

        if (this.isDayCoupon(tdCBusinessCouponRuleParkRel.getCardType())) {

            orderBusinessCouponSub.setCarNumber(request.getCarNumber());
            orderBusinessCouponSub.setBeginTime(request.getBeginTime());
            orderBusinessCouponSub.setEndTime(request.getEndTime());
        }

        orderBusinessCouponSub.setOrderSubNo(SequenceUtil.getNextId(SequenceTypeEnum.ORDER_ACC_RECHARGE));
        orderBusinessCouponSub.setOrderNo(orderBusinessCoupon.getOrderNo());
        orderBusinessCouponSub.setBuyNum(buyNum);

        orderBusinessCouponSub.setCardRuleNo(request.getCardRuleNo());
        orderBusinessCouponSub.setCardRuleName(tdCBusinessCouponRule.getCardRuleName());
        orderBusinessCouponSub.setUnitPrice(NumberUtils.toInt(tdCBusinessCouponRuleParkRel.getValue()));
        orderBusinessCouponSub.setCardType(tdCBusinessCouponRule.getCardType());
        orderBusinessCouponSub.setCouponsType(tdCBusinessCouponRule.getCouponsType());
        orderBusinessCouponSub.setUseRule(tdCBusinessCouponRule.getUseRule());
        orderBusinessCouponSub.setDiscValue(tdCBusinessCouponRule.getDiscValue());
        orderBusinessCouponSub.setFullCutValue(tdCBusinessCouponRule.getFullCutValue());

        orderBusinessCouponSub.setCardRelParkNo(tdCBusinessCouponRuleParkRel.getCardRelParkNo());

        orderBusinessCouponSub.setCreateDate(new Date());
        orderBusinessCouponSub.setCreateEmpId(request.getsOpName());
        orderBusinessCouponSub.setDataState(DataStatusEnum.DATA_STATUS_VALID.value());


        orderBusinessCouponSubDao.saveOrderBusinessCouponSub(orderBusinessCouponSub);
    }

    // 判断是否是包天券
    private boolean isDayCoupon(Integer cardType) {
        //1-单次券,2-时长券,3-满减券,4-金额券,5-包天券(24小时制,如果有自然日的情况在拓展),6-折扣券'
        return 5 == cardType;
    }

    // 根据 cardRuleNo 获取对应的卡规则信息
    private TdCBusinessCouponRule queryBusinessCouponRule(String cardRuleNo) {

        TdCBusinessCouponRuleExample example = new TdCBusinessCouponRuleExample();
        example.createCriteria()
                .andCardRuleNoEqualTo(cardRuleNo)
                .andDataStateEqualTo(DataStatusEnum.DATA_STATUS_VALID.value());
        List<TdCBusinessCouponRule> list = tdCBusinessCouponRuleDao.selectByExample(example);

        if (!CollectionUtils.isEmpty(list)) {
            return list.get(0);
        }
        throw new BizException(ErrorType.APP_ERROR, "找不到对应的卡规则,cardRuleNo = [" + cardRuleNo + "] ");
    }

    @Override
    public BizResult<Boolean> updateByPrimaryKeySelective(OrderBusinessCouponRequest request) {
        OrderBusinessCoupon orderBusinessCoupon = new OrderBusinessCoupon();
        BeanUtils.copyProperties(request, orderBusinessCoupon);
        int upNum = orderBusinessCouponDao.updateByPrimaryKeySelective(orderBusinessCoupon);
        return new BizResult<>(upNum > 0);
    }

    /**
     * 根据orderId更新
     *
     * @param request
     * @return
     */
    @Override
    public BizResult<Boolean> updateByOrderIdSelective(OrderBusinessCouponRequest request) {
        OrderBusinessCoupon orderBusinessCoupon = new OrderBusinessCoupon();
        BeanUtils.copyProperties(request, orderBusinessCoupon);
        int upNum = orderBusinessCouponDao.updateByOrderIdSelective(orderBusinessCoupon);
        return new BizResult<>(upNum > 0);
    }
}