Search in sources :

Example 1 with CouponFetch

use of com.ikoori.vip.common.persistence.model.CouponFetch in project vip by guangdada.

the class OrderServiceImpl method saveOrder.

/**
 * 保存门店订单数据
 * 扣减使用的优惠券
 * 扣减 使用的积分
 * 根据积分规则累加积分
 * 根据会员卡规则升级会员卡
 */
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void saveOrder(OrderPayDo orderPayDo) throws Exception {
    log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>保存门店订单数据>>>>>>>>>>>>>>>>>>>>>>>>");
    Store store = storeDao.selectByStoreNo(orderPayDo.getStoreNo());
    if (store == null) {
        log.error("没有找到店铺信息,店铺编号:" + orderPayDo.getStoreNo());
        throw new BussinessException(500, "没有找到店铺信息");
    }
    // 判断积分是否足够
    Member member = null;
    if (StringUtils.isNotBlank(orderPayDo.getMobile())) {
        member = memberDao.selectByMobile(orderPayDo.getMobile());
    } else if (StringUtils.isNotBlank(orderPayDo.getOpenid())) {
        member = memberDao.getMemberByOpenid(orderPayDo.getOpenid());
    }
    if (member == null) {
        log.error("没有找到该会员信息>>" + orderPayDo.getMobile());
        throw new BussinessException(500, "没有找到该会员信息");
    }
    // 修改会员交易笔数和交易金额
    member.setLastTradeTime(new Date());
    member.setTradeAmount(member.getTradeAmount().add(new BigDecimal(orderPayDo.getPayment()).divide(new BigDecimal(100))));
    member.setTradeCount(member.getTradeCount() + 1);
    memberMapper.updateById(member);
    log.info("保存订单");
    // 保存order
    Order order = new Order();
    order.setPayOrderNo(orderPayDo.getOrderNo());
    order.setOrderNo(RandomUtil.generateOrderNo());
    order.setStoreId(store.getId());
    order.setBalanceDue(orderPayDo.getBalanceDue());
    order.setPayment(orderPayDo.getPayment());
    order.setDiscount(orderPayDo.getDiscount());
    order.setPayStatus(1);
    order.setMemberId(member.getId());
    order.setProductNum(orderPayDo.getOrderItems().size());
    order.setOrderSource(orderPayDo.getOrderSource());
    // order.setDiscountInfo(discountInfo);
    orderMapper.insert(order);
    log.info("保存订单明细");
    // 保存orderItem
    List<OrderItemPayDo> itemPayDos = orderPayDo.getOrderItems();
    if (itemPayDos != null) {
        for (OrderItemPayDo itemPayDo : itemPayDos) {
            OrderItem orderItem = new OrderItem();
            orderItem.setOrderId(order.getId());
            orderItem.setOrderNo(order.getOrderNo());
            orderItem.setGoodsName(itemPayDo.getGoodsName());
            orderItem.setQuantity(itemPayDo.getQuantity());
            orderItem.setGoodsNo(itemPayDo.getGoodsNo());
            orderItem.setCasePrice(itemPayDo.getCasePrice());
            orderItem.setModel(itemPayDo.getModel());
            orderItem.setOriginalPrice(itemPayDo.getOriginalPrice());
            orderItemMapper.insert(orderItem);
        }
    }
    log.info("扣减使用的积分:" + orderPayDo.getPoint());
    // 扣减使用的积分
    if (orderPayDo.getPoint() != null && (orderPayDo.getPoint() > 0)) {
        if (member.getPoints() < orderPayDo.getPoint()) {
            log.error("积分不足,剩余积分" + member.getPoints());
            throw new BussinessException(500, "积分不足,剩余积分" + member.getPoints());
        }
        log.error("生成积分使用记录");
        boolean result = pointTradeService.savePointTrade(false, PointTradeType.PAY_ORDER.getCode(), -orderPayDo.getPoint(), member.getId(), null, member.getMerchantId(), store.getId(), "");
        if (!result) {
            log.error("扣减积分失败");
            throw new BussinessException(500, "扣减积分失败");
        }
    }
    log.info("扣减使用现金券");
    // 扣减使用现金券
    if (orderPayDo.getCoupons() != null) {
        for (CouponPayDo couPayDo : orderPayDo.getCoupons()) {
            Integer usedValue = couPayDo.getUsedValue();
            String verifyCode = couPayDo.getVerifyCode();
            String msg = "优惠券:" + verifyCode;
            // 根据券码获得优惠券
            log.info("根据券码获得优惠券:" + verifyCode);
            // CouponFetch cf = couponFetchDao.selectByVerifyCodeJoinCoupon(verifyCode);
            CouponFetch cf = couponFetchDao.selectByVerifyCode(verifyCode);
            if (cf == null) {
                throw new BussinessException(500, msg + ",没有找到");
            }
            Coupon coupon = couponMapper.selectById(cf.getCouponId());
            if (coupon.isIsAtLeast()) {
                if (coupon.getOriginAtLeast() < orderPayDo.getBalanceDue()) {
                    throw new BussinessException(500, msg + ",购物满" + coupon.getAtLeast() + "元才能使用");
                }
            }
            // 代金券判断是否已经使用,改成已使用
            if (!cf.getIsInvalid()) {
                throw new BussinessException(500, msg + ",已经失效");
            }
            if (cf.getIsUsed().intValue() == CouponUseState.USED.getCode()) {
                throw new BussinessException(500, msg + ",已经被使用");
            }
            if (!cf.getMemberId().toString().equals(member.getId().toString())) {
                throw new BussinessException(500, msg + ",不是本人的");
            }
            if (usedValue > cf.getValue()) {
                throw new BussinessException(500, msg + "面值为" + cf.getValue() / 100 + "元,余额不足");
            }
            /*只精确到天*/
            /*String validTime = DateUtil.format(cf.getValidTime(), DateUtil.dateFormat);
				String expireTime = DateUtil.format(cf.getExpireTime(), DateUtil.dateFormat);
				// 是否已生效
				if(!DateUtil.compareDate(DateUtil.getDay(),validTime)){
					throw new BussinessException(500,msg + ",还未生效");
				}
				// 是否已过期
				if(!DateUtil.compareDate(expireTime,DateUtil.getDay())){
					throw new BussinessException(500,msg + ",已经过期");
				}*/
            /*精确到秒*/
            Date now = new Date();
            // 是否已生效
            if (!DateUtil.compareWithLongTime(now, cf.getValidTime())) {
                throw new BussinessException(500, msg + ",还未生效");
            }
            // 是否已过期
            if (!DateUtil.compareWithLongTime(cf.getExpireTime(), now)) {
                throw new BussinessException(500, msg + ",已经过期");
            }
            // 现金券扣减使用金额、没使用完改成部分使用,判断余额是否足够
            if (coupon.getType().intValue() == CouponType.XJQ.getCode()) {
                if (usedValue > cf.getAvailableValue()) {
                    throw new BussinessException(500, msg + "可用金额为" + cf.getAvailableValue() / 100 + "元,余额不足");
                }
                // 扣减现金券使用金额
                cf.setUsedValue(cf.getUsedValue() + usedValue);
                cf.setAvailableValue(cf.getAvailableValue() - usedValue);
                // 使用完了
                if (cf.getAvailableValue() == 0) {
                    cf.setIsUsed(CouponUseState.USED.getCode());
                    cf.setIsInvalid(false);
                } else {
                    cf.setIsUsed(CouponUseState.PART_USED.getCode());
                }
            } else {
                // 优惠券修改为已使用状态
                cf.setIsUsed(CouponUseState.USED.getCode());
                cf.setIsInvalid(false);
            }
            cf.setVersion(cf.getVersion());
            int count = couponFetchMapper.updateById(cf);
            if (count == 0) {
                throw new BussinessException(500, "优惠券使用失败");
            }
            log.info("生成优惠券使用记录");
            // 生成优惠券使用记录
            CouponTrade couponTrade = new CouponTrade();
            couponTrade.setCouponId(coupon.getId());
            couponTrade.setMemberId(member.getId());
            couponTrade.setStoreId(store.getId());
            couponTrade.setMerchantId(member.getMerchantId());
            couponTrade.setUsedValue(usedValue);
            couponTrade.setUsedOrderNo(order.getOrderNo());
            couponTrade.setUsedOrderId(order.getId());
            couponTrade.setVerifyCode(verifyCode);
            couponTrade.setUsedTime(new Date());
            couponTradeMapper.insert(couponTrade);
            // 更新优惠券使用次数
            log.info("更新优惠券使用次数");
            couponDao.updateUseCount(coupon.getId(), 1);
        }
    }
    // 根据积分规则返还积分
    log.info("根据积分规则返还积分");
    List<Point> points = pointDao.selectByMerchantId(member.getMerchantId());
    if (points != null) {
        for (Point point : points) {
            // 生成积分使用记录
            PointTrade pointTrade = new PointTrade();
            int p = point.getPoints();
            if (point.getRuleType().intValue() == PointType.PAY_MONEY.getCode()) {
                // 求当前订单金额和限制金额的除数
                int due = orderPayDo.getPayment() / point.getPointsLimit();
                // 比如每购买10元送1积分,当前订单金额为100的话,得到的除数为10*奖励分值,即为要返还的积分数
                pointTrade.setPoint(p * due);
                pointTrade.setTradeType(PointTradeType.ORDER_MONEY.getCode());
            }
            if (point.getRuleType().intValue() == PointType.PAY_ORDER.getCode()) {
                // 查询上一次按购买数量获得积分的记录id
                Long lastOrderId = getLastOrderId(member.getId());
                // 获得之后的购买次数+1(当前算一次)
                int orderCount = getMemOrderCount(member.getId(), lastOrderId);
                // 判断累加后的数量是否大于等于限制条件
                if ((orderCount + 1) >= point.getPointsLimit()) {
                    pointTrade.setPoint(p);
                    pointTrade.setTradeType(PointTradeType.ORDER_COUNT.getCode());
                }
            }
            if (pointTrade.getPoint() != null && pointTrade.getPoint() > 0) {
                log.info("返还积分:" + pointTrade.getPoint());
                pointTrade.setPointId(point.getId());
                pointTrade.setMemberId(member.getId());
                pointTrade.setOrderId(order.getId());
                pointTrade.setInOut(true);
                pointTrade.setMerchantId(member.getMerchantId());
                pointTrade.setStoreId(store.getId());
                pointTradeMapper.insert(pointTrade);
                int count = memberDao.updatePoint(member.getId(), pointTrade.getPoint());
                // 修改会员积分
                log.info("累加会员积分");
                if (count == 0) {
                    throw new BussinessException(500, "累加积分失败");
                }
            }
        }
    }
    // 判断是否满足会员卡升级条件
    // 查询所有的"按规则"类别的会员卡,按等级升序排序后,逐个判断是否满足升级到改卡
    log.info("判断是否满足会员卡升级条件");
    List<Card> cards = cardDao.selectByMerchantId(member.getMerchantId());
    if (CollectionUtils.isNotEmpty(cards)) {
        // 获得累计订单数量
        int orderCount = getMemOrderCount(member.getId(), 0L);
        // 获得累计交易金额
        Integer totalPayment = getMemPaymemt(member.getId(), 0L);
        // 获得累计积分
        Member mem = memberMapper.selectById(member.getId());
        Integer point = mem.getPoints();
        for (Card card : cards) {
            Integer tradeLimit = card.getTradeLimit();
            Integer pointsLimit = card.getPointsLimit();
            Integer amountLimit = card.getAmountLimit();
            boolean upgrade = false;
            if (tradeLimit != null && orderCount >= tradeLimit) {
                upgrade = true;
            } else if (pointsLimit != null && point >= pointsLimit) {
                upgrade = true;
            } else if (amountLimit != null && totalPayment >= (amountLimit * 100)) {
                upgrade = true;
            }
            // 满足升级条件,升级到该会员卡
            if (upgrade) {
                log.info("升级会员:" + mem.getId() + "到会员卡" + card.getId());
                memberService.upgradeMemberCard(member, card);
                // 满足最高等级会员卡升级条件则退出
                break;
            }
        }
    }
    log.info("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<保存门店订单数据<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
}
Also used : Order(com.ikoori.vip.common.persistence.model.Order) Coupon(com.ikoori.vip.common.persistence.model.Coupon) CouponFetch(com.ikoori.vip.common.persistence.model.CouponFetch) CouponTrade(com.ikoori.vip.common.persistence.model.CouponTrade) OrderItemPayDo(com.ikoori.vip.common.dto.OrderItemPayDo) Store(com.ikoori.vip.common.persistence.model.Store) Point(com.ikoori.vip.common.persistence.model.Point) BussinessException(com.ikoori.vip.common.exception.BussinessException) Date(java.util.Date) BigDecimal(java.math.BigDecimal) Point(com.ikoori.vip.common.persistence.model.Point) Card(com.ikoori.vip.common.persistence.model.Card) CouponPayDo(com.ikoori.vip.common.dto.CouponPayDo) OrderItem(com.ikoori.vip.common.persistence.model.OrderItem) PointTrade(com.ikoori.vip.common.persistence.model.PointTrade) Member(com.ikoori.vip.common.persistence.model.Member) Transactional(org.springframework.transaction.annotation.Transactional)

Example 2 with CouponFetch

use of com.ikoori.vip.common.persistence.model.CouponFetch in project vip by guangdada.

the class CouponFetchController method couponFetchUpdate.

/**
 * 跳转到修改领取记录
 */
@Permission
@RequestMapping("/couponFetch_update/{couponFetchId}")
public String couponFetchUpdate(@PathVariable Long couponFetchId, Model model) {
    CouponFetch couponFetch = couponFetchService.selectById(couponFetchId);
    model.addAttribute(couponFetch);
    return PREFIX + "couponFetch_edit.html";
}
Also used : CouponFetch(com.ikoori.vip.common.persistence.model.CouponFetch) Permission(com.ikoori.vip.common.annotion.Permission) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Example 3 with CouponFetch

use of com.ikoori.vip.common.persistence.model.CouponFetch in project vip by guangdada.

the class CouponFetchServiceImpl method batchImportCode.

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public String batchImportCode(Workbook wb, Coupon coupon, File tempFile) {
    // 错误信息接收器
    StringBuilder errorMsg = new StringBuilder("");
    // 得到第一个shell
    Sheet sheet = wb.getSheetAt(0);
    // 得到Excel的行数
    int totalRows = sheet.getPhysicalNumberOfRows();
    // 总列数
    int totalCells = 0;
    // 得到Excel的列数(前提是有行数),从第二行算起
    if (totalRows >= 2 && sheet.getRow(1) != null) {
        totalCells = sheet.getRow(1).getPhysicalNumberOfCells();
    }
    // 判断库存数量
    int stock = coupon.getStock();
    int rows = totalRows - 1;
    if (rows == 0) {
        throw new BussinessException(500, "数据为空!");
    }
    if (rows > stock) {
        throw new BussinessException(500, "剩余张数为" + stock + ",小于当前导入数量" + rows + "");
    }
    List<CouponFetch> couponFetchs = new ArrayList<CouponFetch>();
    String br = "<br/>";
    // 循环Excel行数,从第二行开始。标题不入库
    for (int r = 1; r < totalRows; r++) {
        StringBuilder rowMessage = new StringBuilder("");
        Row row = sheet.getRow(r);
        if (row == null) {
            errorMsg.append(br + "第" + (r + 1) + "行数据有问题,请仔细检查!");
            continue;
        }
        CouponFetch couponFetch = new CouponFetch();
        String verifyCode = "";
        // 循环Excel的列
        for (int c = 0; c < totalCells; c++) {
            Cell cell = row.getCell(c);
            if (null != cell) {
                if (c == 0) {
                    verifyCode = cell.getStringCellValue();
                    if (StringUtils.isBlank(verifyCode)) {
                        rowMessage.append("券号不能为空;");
                    } else if (!verifyCode.matches(RandomUtil.coupon_code_matches)) {
                        rowMessage.append("券号必须是20位的大写字母或数子;");
                    } else if (checkVerifyCode(verifyCode)) {
                        rowMessage.append("券号已经存在;");
                    }
                    couponFetch.setVerifyCode(verifyCode);
                }
            } else {
                rowMessage.append("第" + (c + 1) + "列数据有问题,请仔细检查;");
            }
        }
        // 拼接每行的错误提示
        if (StringUtils.isNotBlank(rowMessage.toString())) {
            errorMsg.append(br + "第" + (r + 1) + "行," + rowMessage.toString());
        } else {
            couponFetchs.add(couponFetch);
        }
    }
    // 删除上传的临时文件
    if (tempFile.exists()) {
        tempFile.delete();
    }
    // 全部验证通过才导入到数据库
    if (StringUtils.isBlank(errorMsg.toString())) {
        if (couponFetchs.size() == 0) {
            throw new BussinessException(500, "数据为空!");
        }
        // 更新库存
        if (couponDao.updateStock(coupon.getId(), couponFetchs.size()) == 0) {
            throw new BussinessException(500, "剩余张数不够");
        }
        for (CouponFetch cf : couponFetchs) {
            cf.setCouponId(coupon.getId());
            cf.setAvailableValue(coupon.getOriginValue());
            cf.setExpireTime(coupon.getEndAt());
            cf.setValidTime(coupon.getStartAt());
            cf.setIsInvalid(true);
            cf.setIsUsed(CouponUseState.NO_USED.getCode());
            cf.setMerchantId(coupon.getMerchantId());
            cf.setMessage("谢谢关注!");
            cf.setValue(coupon.getOriginValue());
            // cf.setStoreId(coupon.getStoreId());
            cf.setUsedValue(0);
            couponFetchMapper.insert(cf);
        }
        errorMsg.append("导入成功,共" + couponFetchs.size() + "条数据!");
    } else {
        throw new BussinessException(500, errorMsg.toString());
    }
    return errorMsg.toString();
}
Also used : CouponFetch(com.ikoori.vip.common.persistence.model.CouponFetch) ArrayList(java.util.ArrayList) Row(org.apache.poi.ss.usermodel.Row) Sheet(org.apache.poi.ss.usermodel.Sheet) Cell(org.apache.poi.ss.usermodel.Cell) BussinessException(com.ikoori.vip.common.exception.BussinessException) Transactional(org.springframework.transaction.annotation.Transactional)

Example 4 with CouponFetch

use of com.ikoori.vip.common.persistence.model.CouponFetch in project vip by guangdada.

the class CouponFetchServiceImpl method saveCouponFetch.

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public boolean saveCouponFetch(Member member, Coupon coupon, String verifyCode) {
    CouponFetch couponFetch = new CouponFetch();
    couponFetch.setMemberId(member.getId());
    couponFetch.setCouponId(coupon.getId());
    couponFetch.setAvailableValue(coupon.getOriginValue());
    couponFetch.setExpireTime(coupon.getEndAt());
    couponFetch.setValidTime(coupon.getStartAt());
    couponFetch.setIsInvalid(true);
    couponFetch.setMobile(member.getMobile());
    couponFetch.setIsUsed(CouponUseState.NO_USED.getCode());
    couponFetch.setMerchantId(coupon.getMerchantId());
    couponFetch.setMessage("谢谢关注!");
    couponFetch.setVerifyCode(verifyCode == null ? RandomUtil.generateCouponCode() : verifyCode);
    couponFetch.setValue(coupon.getOriginValue());
    couponFetch.setUsedValue(0);
    int count = couponFetchMapper.insert(couponFetch);
    return count == 0 ? false : true;
}
Also used : CouponFetch(com.ikoori.vip.common.persistence.model.CouponFetch) Transactional(org.springframework.transaction.annotation.Transactional)

Aggregations

CouponFetch (com.ikoori.vip.common.persistence.model.CouponFetch)4 Transactional (org.springframework.transaction.annotation.Transactional)3 BussinessException (com.ikoori.vip.common.exception.BussinessException)2 Permission (com.ikoori.vip.common.annotion.Permission)1 CouponPayDo (com.ikoori.vip.common.dto.CouponPayDo)1 OrderItemPayDo (com.ikoori.vip.common.dto.OrderItemPayDo)1 Card (com.ikoori.vip.common.persistence.model.Card)1 Coupon (com.ikoori.vip.common.persistence.model.Coupon)1 CouponTrade (com.ikoori.vip.common.persistence.model.CouponTrade)1 Member (com.ikoori.vip.common.persistence.model.Member)1 Order (com.ikoori.vip.common.persistence.model.Order)1 OrderItem (com.ikoori.vip.common.persistence.model.OrderItem)1 Point (com.ikoori.vip.common.persistence.model.Point)1 PointTrade (com.ikoori.vip.common.persistence.model.PointTrade)1 Store (com.ikoori.vip.common.persistence.model.Store)1 BigDecimal (java.math.BigDecimal)1 ArrayList (java.util.ArrayList)1 Date (java.util.Date)1 Cell (org.apache.poi.ss.usermodel.Cell)1 Row (org.apache.poi.ss.usermodel.Row)1