首先这是确认收货的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);
}
}
}
}