确认订单按钮和取消订单按钮中的事物学习

首先这是确认收货的model的代码

		 DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(def);
        try {

            //参数校验
            if (ordersId == null || ordersId == 0) {
                log.error("订单ID为空。");
                throw new BusinessException("订单ID为空,请重试!");
            }

            //获取订单
            Orders orders = ordersWriteDao.get(ordersId);
            if (orders == null) {
                log.error("订单信息获取失败。");
                throw new BusinessException("订单信息获取失败,请重试!");
            } else if (!orders.getOrderState().equals(Orders.ORDER_STATE_4)) {
                log.error("订单不处于已发货状态,不能确认收货。");
                throw new BusinessException("订单不处于已发货状态,不能确认收货!");
            }
			//状态为5表示已完成的订单,这里把订单状态改变
            orders.setOrderState(Orders.ORDER_STATE_5);
            //设置完成时间为当前时间
            orders.setFinishTime(new Date());
            //更新订单信息
            int count = ordersWriteDao.update(orders);
            //如果成功的话count起码是1
            if (count == 0) {
                log.error("订单更新失败。");
                throw new BusinessException("订单更新失败!");
            }

            OrderLog orderLog = new OrderLog(member.getId(), member.getName(), orders.getId(),
                orders.getOrderSn(), "您已签收订单", new Date());
                //保存进订单操作日志

            int logCount = orderLogWriteDao.save(orderLog);
            if (logCount == 0) {
                throw new BusinessException("订单日志保存失败,请重试!");
            }
			//事务管理的提交,如果有异常就回滚
            transactionManager.commit(status);
            return true;
        } catch (BusinessException be) {
            transactionManager.rollback(status);
            throw be;
        } catch (Exception e) {
            transactionManager.rollback(status);
            log.error("[OrderService][goodsReceipt]订单确认收货时发生异常:", e);
            throw e;
        }

这是取消订单的model层

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            //参数校验
            if (ordersId == null || ordersId == 0) {
                throw new BusinessException("订单ID为空,请重试!");
            }
            //获取订单
            Orders ordersDb = ordersWriteDao.get(ordersId);

            if (!ordersDb.getMemberId().equals(optId)) {
                throw new BusinessException("您不能操作别人的订单,谢谢!");
            }

            // 取消订单
            this.doCancelOrder(ordersDb, optId, optName, "您取消了订单");

            transactionManager.commit(status);
            return true;
        } catch (Exception e) {
            transactionManager.rollback(status);
            throw e;
        }
private void doCancelOrder(Orders ordersDb, Integer optId, String optName, String logContent) {
        if (ordersDb == null) {
            throw new BusinessException("获取订单信息失败,请重试!");
        } else if (!(ordersDb.getOrderState().equals(Orders.ORDER_STATE_1)
                     || (ordersDb.getOrderState().equals(Orders.ORDER_STATE_2))
                     || (ordersDb.getOrderState().equals(Orders.ORDER_STATE_3)))) {
            throw new BusinessException("订单已发货不能取消!");
        }
        if (ordersDb.getOrderType().intValue() == Orders.ORDER_TYPE_5) {
            // 竞价尾款订单不能取消
            throw new BusinessException("集合竞价尾款订单不能取消!");
        }

        //设置订单状态
        Orders orders = new Orders();
        orders.setId(ordersDb.getId());
        orders.setFinishTime(new Date());
        orders.setOrderState(Orders.ORDER_STATE_6);
        int count = ordersWriteDao.update(orders);
        if (count == 0) {
            throw new BusinessException("订单更新失败,请重试!");
        }
        //记录订单日志
        OrderLog orderLog = new OrderLog();
        orderLog.setContent(logContent);
        orderLog.setOperatingId(optId);
        orderLog.setOrdersId(ordersDb.getId());
        orderLog.setOrdersSn(ordersDb.getOrderSn());
        orderLog.setOperatingName(optName);

        int logCount = orderLogWriteDao.save(orderLog);
        if (logCount == 0) {
            throw new BusinessException("订单日志保存失败,请重试!");
        }

        // 如果是父订单,则修改子订单的状态
        if (ordersDb.getIsParent().intValue() == Orders.IS_PARENT_1) {
            ordersWriteDao.cancelByPsn(ordersDb.getOrderSn());
        }

        // 返还积分
        this.cancelOrderBackIntegral(ordersDb);

        // 返回优惠券
        this.cancelOrderBackCoupon(ordersDb, optId, optName);

        // 退回付款金额
        this.cancelOrderBackMoney(ordersDb, optId, optName);

        // 还原库存和实际销量
        this.cancelOrderBackStockAndActualSales(ordersDb);
    }
 /**
     * 取消订单时退回用户优惠券
     * @param order
     * @param optId
     * @param optName
     */
    private void cancelOrderBackCoupon(Orders orderDb, Integer optId, String optName) {

        List<Orders> list = null;
        // 如果是子订单则只退这个订单的优惠券,如果是父订单,则退回该父订单下所有子订单的优惠券
        if (orderDb.getIsParent().intValue() == Orders.IS_PARENT_1) {
            list = ordersReadDao.getByOrderPsn(orderDb.getOrderSn());
        } else {
            list = new ArrayList<>();
            list.add(orderDb);
        }
        for (Orders order : list) {
            if (order.getCouponUserId() != null && order.getCouponUserId() > 0) {
                CouponUser couponUser = couponUserReadDao.get(order.getCouponUserId());
                if (couponUser == null) {
                    log.error("用户优惠券获取失败。");
                    throw new BusinessException("返还用户优惠券时失败,请重试!");
                }
                Integer backCouponUser = couponUserWriteDao.backCouponUser(order.getMemberId(),
                    couponUser.getId());
                if (backCouponUser < 1) {
                    log.error("修改用户优惠券使用次数失败。");
                    throw new BusinessException("返还用户优惠券时失败,请重试!");
                }
                // 设定优惠券使用日志
                CouponOptLog couponOptLog = new CouponOptLog();
                couponOptLog.setCouponUserId(couponUser.getId());
                couponOptLog.setMemberId(couponUser.getMemberId());
                couponOptLog.setSellerId(couponUser.getSellerId());
                couponOptLog.setCouponId(couponUser.getCouponId());
                couponOptLog.setOptType(CouponOptLog.OPT_TYPE_3);
                couponOptLog.setOrderId(order.getId());
                couponOptLog.setCreateUserId(optId);
                couponOptLog.setCreateUserName(optName);
                couponOptLog.setCreateTime(new Date());
                couponOptLogWriteDao.insert(couponOptLog);
            }
        }
    }

    /**
     * 订单取消时,1、返还该订单消耗的积分;2、追回付款时送给用户的积分
     * @param order
     */
    private void cancelOrderBackIntegral(Orders order) {
        // 最终需要修改的积分数量
        int backValue = 0;

        // 1、返还该订单消耗的积分
        // 消耗了积分才返还
        if (order.getIntegral() > 0) {
            // 返还积分是增加
            backValue = order.getIntegral();

            MemberGradeIntegralLogs memberGradeIntegralLogs = new MemberGradeIntegralLogs();
            memberGradeIntegralLogs.setMemberId(order.getMemberId());
            memberGradeIntegralLogs.setMemberName(order.getMemberName());
            memberGradeIntegralLogs.setValue(order.getIntegral());
            memberGradeIntegralLogs.setOptType(MemberGradeIntegralLogs.MEMBER_GRD_INT_LOG_OPT_T_11);
            memberGradeIntegralLogs.setOptDes("取消订单返还积分(订单号:" + order.getOrderSn() + ")");
            memberGradeIntegralLogs.setRefCode(order.getOrderSn());
            memberGradeIntegralLogs.setType(MemberGradeIntegralLogs.MEMBER_GRD_INT_LOG_T_2);
            memberGradeIntegralLogs.setCreateTime(new Date());
            Integer save = memberGradeIntegralLogsWriteDao.save(memberGradeIntegralLogs);
            if (save == 0) {
                throw new BusinessException("记录用户积分消费日志失败(取消订单返还积分),请重试!");
            }
        }

        // 2、追回付款时送给用户的积分,只有当订单是子订单时才需要追回
        if (order.getPaymentStatus().intValue() == Orders.PAYMENT_STATUS_1
            && order.getIsParent().intValue() == Orders.IS_PARENT_0) {
            // 订单已付款才会发生此类型积分追回

            // 计算购物时平台送出的积分追回为减少用户的积分
            MemberGradeIntegralLogs sendIntLog = memberGradeIntegralLogsReadDao
                .getIntLogByMIdAndOrderSnAndOptType(order.getMemberId(),
                    MemberGradeIntegralLogs.MEMBER_GRD_INT_LOG_OPT_T_3, order.getOrderSn(),
                    MemberGradeIntegralLogs.MEMBER_GRD_INT_LOG_T_2);
            if (sendIntLog != null && sendIntLog.getValue() > 0) {
                //  追回积分是减少
                backValue = backValue - sendIntLog.getValue();

                MemberGradeIntegralLogs memberGradeIntegralLogs = new MemberGradeIntegralLogs();
                memberGradeIntegralLogs.setMemberId(order.getMemberId());
                memberGradeIntegralLogs.setMemberName(order.getMemberName());
                memberGradeIntegralLogs.setValue(sendIntLog.getValue());
                memberGradeIntegralLogs
                    .setOptType(MemberGradeIntegralLogs.MEMBER_GRD_INT_LOG_OPT_T_13);
                memberGradeIntegralLogs.setOptDes("取消订单追回积分(订单号:" + order.getOrderSn() + ")");
                memberGradeIntegralLogs.setRefCode(order.getOrderSn());
                memberGradeIntegralLogs.setType(MemberGradeIntegralLogs.MEMBER_GRD_INT_LOG_T_2);
                memberGradeIntegralLogs.setCreateTime(new Date());
                Integer saveLog = memberGradeIntegralLogsWriteDao.save(memberGradeIntegralLogs);
                if (saveLog == 0) {
                    throw new BusinessException("记录用户积分消费日志失败(取消订单追回积分),请重试!");
                }
            }
        }

        // 3、修改用户积分数量,记录积分消耗日志
        Member memberNew = new Member();
        memberNew.setId(order.getMemberId());
        memberNew.setIntegral(backValue);
        Integer updateIntegral = memberWriteDao.updateIntegral(memberNew);
        if (updateIntegral == 0) {
            throw new BusinessException("取消订单修改用户积分时失败,请重试!");
        }
    }

    /**
     * 取消订单还原库存和实际销量公共方法
     * @param orderType
     * @param ordersId
     */
    private void cancelOrderBackStockAndActualSales(Orders orderDb) {
        List<OrdersProduct> opList = null;
        if (orderDb.getIsParent().intValue() == Orders.IS_PARENT_1) {
            opList = ordersProductReadDao.getByOrdersPsn(orderDb.getOrderSn());
        } else {
            opList = ordersProductReadDao.getByOrderId(orderDb.getId());
        }
        Integer orderType = orderDb.getOrderType();
        //还原库存和实际销量
        if (orderType.intValue() == Orders.ORDER_TYPE_2) {
            // 限时抢购订单时还原活动商品的库存
            // 限时抢购只有一个网单
            this.updateFlashProductStockAndActualSales(opList.get(0).getActFlashSaleProductId(),
                opList.get(0).getNumber(), true);
        } else if (orderType.intValue() == Orders.ORDER_TYPE_3) {
            // 团购订单时还原活动商品的库存
            // 团购只有一个网单
            this.updateGroupStockAndActualSales(opList.get(0).getActGroupId(),
                opList.get(0).getNumber(), true);
        } else if (orderType.intValue() == Orders.ORDER_TYPE_4) {
            // 集合竞价订单时还原活动商品的库存
            // 竞价定金订单时不会进入此逻辑,因为定金订单支付后订单状态直接设置为已完成
            this.updateBiddingStockAndActualSales(opList.get(0).getActBiddingId(),
                opList.get(0).getNumber(), true);
        } else if (orderType.intValue() == Orders.ORDER_TYPE_5) {
            // 竞价尾款订单时不会进入此逻辑,因为尾款订单不能取消
            // 此处为逻辑清晰、代码易读增加此逻辑
        } else if (orderType.intValue() == Orders.ORDER_TYPE_6) {
            // 积分换购订单时还原活动商品的库存
            // 积分换购只有一个网单
            this.updateIntegralStockAndActualSales(opList.get(0).getActIntegralId(),
                opList.get(0).getNumber(), true);
        } else {
            // 普通订单
            // 更新货品和商品的库存
            if (opList != null && opList.size() > 0) {
                for (OrdersProduct op : opList) {
                    this.updateProductActualSalesAndStock(op.getProductId(), op.getProductGoodsId(),
                        op.getNumber(), true);
                }
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_42992035/article/details/83144433