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 queryOrderByOrderId(OrderBusinessCouponRequest request) { OrderBusinessCouponDTO dto = orderBusinessCouponDao.queryOrderByOrderId(request); return new BizResult<>(dto); } @Override public BizResult> queryOrderBusinessCoupon(OrderBusinessCouponRequest request) { List orderBusinessCouponDTOS = new ArrayList<>(); List 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> queryOrderBusinessCouponForPage(OrderBusinessCouponRequest request) { PageBean pageBean = new PageBean<>(); /*PageInfo 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 batchDeleteOrderBusinessCouponByPrimaryKey(BatchDeleteByPrimaryKeyRequest request) { int delenum = orderBusinessCouponDao.batchDeleteOrderBusinessCouponByPrimaryKey(request.getIds(), request.getOpId(), request.getsOpName()); return new BizResult<>(delenum > 0); } @Override public BizResult 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 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 list = tdCBusinessCouponRuleDao.selectByExample(example); if (!CollectionUtils.isEmpty(list)) { return list.get(0); } throw new BizException(ErrorType.APP_ERROR, "找不到对应的卡规则,cardRuleNo = [" + cardRuleNo + "] "); } @Override public BizResult 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 updateByOrderIdSelective(OrderBusinessCouponRequest request) { OrderBusinessCoupon orderBusinessCoupon = new OrderBusinessCoupon(); BeanUtils.copyProperties(request, orderBusinessCoupon); int upNum = orderBusinessCouponDao.updateByOrderIdSelective(orderBusinessCoupon); return new BizResult<>(upNum > 0); } }