|
|
@ -48,6 +48,7 @@ import java.time.LocalDate; |
|
|
import java.time.LocalDateTime; |
|
|
import java.time.LocalDateTime; |
|
|
import java.time.LocalTime; |
|
|
import java.time.LocalTime; |
|
|
import java.time.ZoneId; |
|
|
import java.time.ZoneId; |
|
|
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
import java.util.*; |
|
|
import java.util.*; |
|
|
import java.util.stream.Collectors; |
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
@ -71,6 +72,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
private static final int STATUS_REFUNDED = 8; |
|
|
private static final int STATUS_REFUNDED = 8; |
|
|
private static final int STATUS_WAIT_RETURN = 11;//售后中
|
|
|
private static final int STATUS_WAIT_RETURN = 11;//售后中
|
|
|
private static final int STATUS__RETURNED = 12;//已售后
|
|
|
private static final int STATUS__RETURNED = 12;//已售后
|
|
|
|
|
|
private static final int REFUND_STATUS_AFTER_SALE_AGREED = 4;//同意售后
|
|
|
|
|
|
private static final String DELAY_TYPE_ORDER_PAY_TIMEOUT = "Order_Pay_Timeout_1h"; |
|
|
|
|
|
private static final long ORDER_PAY_TIMEOUT_DELAY_MILLIS = 60 * 60 * 1000L; |
|
|
|
|
|
|
|
|
// 配送方式常量
|
|
|
// 配送方式常量
|
|
|
private static final int DELIVERY_TYPE_EXPRESS = 1; // 外卖
|
|
|
private static final int DELIVERY_TYPE_EXPRESS = 1; // 外卖
|
|
|
@ -338,6 +342,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
createDeliveryOrder(order, dto, null, -1, null); |
|
|
createDeliveryOrder(order, dto, null, -1, null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
triggerOrderPayTimeoutEvent(order.getId()); |
|
|
|
|
|
|
|
|
return buildVO(order, goodsSnapshots, null, null); |
|
|
return buildVO(order, goodsSnapshots, null, null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -451,7 +457,15 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
|
|
|
|
|
|
// 拼团过期时间:24小时后
|
|
|
// 拼团过期时间:24小时后
|
|
|
Calendar cal = Calendar.getInstance(); |
|
|
Calendar cal = Calendar.getInstance(); |
|
|
cal.add(Calendar.HOUR_OF_DAY, 24); |
|
|
if(order.getOtherOrder() != null && order.getOtherOrder() == 2){ |
|
|
|
|
|
//团购拼团24小时过期
|
|
|
|
|
|
cal.add(Calendar.HOUR_OF_DAY, 24); |
|
|
|
|
|
} |
|
|
|
|
|
if(order.getOtherOrder() == null){ |
|
|
|
|
|
//团购拼团24小时过期
|
|
|
|
|
|
cal.add(Calendar.HOUR_OF_DAY, 1); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
group.setExpireTime(cal.getTime()); |
|
|
group.setExpireTime(cal.getTime()); |
|
|
|
|
|
|
|
|
// 设置配送员和佣金信息
|
|
|
// 设置配送员和佣金信息
|
|
|
@ -481,6 +495,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
createDeliveryOrder(order, dto, group.getId(), -1, isFace2Face ? group.getTotalDeliveryFee() : null); |
|
|
createDeliveryOrder(order, dto, group.getId(), -1, isFace2Face ? group.getTotalDeliveryFee() : null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
triggerOrderPayTimeoutEvent(order.getId()); |
|
|
|
|
|
|
|
|
// 将 groupId 关联到订单 (MallOrder 没有 groupId 字段,通过 MallOrderGroup 关联已足够)
|
|
|
// 将 groupId 关联到订单 (MallOrder 没有 groupId 字段,通过 MallOrderGroup 关联已足够)
|
|
|
|
|
|
|
|
|
return buildVO(order, goodsSnapshots, group, null); |
|
|
return buildVO(order, goodsSnapshots, group, null); |
|
|
@ -496,15 +512,15 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
if (group == null) { |
|
|
if (group == null) { |
|
|
throw new RuntimeException("拼团不存在"); |
|
|
throw new RuntimeException("拼团不存在"); |
|
|
} |
|
|
} |
|
|
/*if (group.getStatus() != GROUP_STATUS_FORMING && group.getStatus() != GROUP_STATUS_FACE2FACE) { |
|
|
if (group.getStatus() == GROUP_STATUS_FAIL) { |
|
|
throw new RuntimeException("当前拼团状态不可参团"); |
|
|
throw new RuntimeException("团长已取消拼团"); |
|
|
}*/ |
|
|
} |
|
|
//超出拼团人数 也可以参与
|
|
|
//超出拼团人数 也可以参与
|
|
|
/*if (group.getCurrentMembers() >= group.getTargetMembers()) { |
|
|
/*if (group.getCurrentMembers() >= group.getTargetMembers()) { |
|
|
throw new RuntimeException("拼团已满员"); |
|
|
throw new RuntimeException("拼团已满员"); |
|
|
}*/ |
|
|
}*/ |
|
|
|
|
|
|
|
|
boolean isFace2Face = (group.getStatus() == GROUP_STATUS_FACE2FACE); |
|
|
boolean isFace2Face = (group.getIsFace() == 1); |
|
|
|
|
|
|
|
|
// 面对面团:不再重新计算,直接使用根据 targetMembers 均摊的金额
|
|
|
// 面对面团:不再重新计算,直接使用根据 targetMembers 均摊的金额
|
|
|
BigDecimal deliveryFee = BigDecimal.ZERO; |
|
|
BigDecimal deliveryFee = BigDecimal.ZERO; |
|
|
@ -575,6 +591,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
createDeliveryOrder(order, dto, group.getId(), -1, null); |
|
|
createDeliveryOrder(order, dto, group.getId(), -1, null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
triggerOrderPayTimeoutEvent(order.getId()); |
|
|
|
|
|
|
|
|
return buildVO(order, goodsSnapshots, group, null); |
|
|
return buildVO(order, goodsSnapshots, group, null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -650,7 +668,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
triggerDeliveryAsyncEvents(order, deliveryOrder); |
|
|
triggerDeliveryAsyncEvents(order, deliveryOrder); |
|
|
autoAcceptShopDeliveryOrder(order, deliveryOrder); |
|
|
autoAcceptShopDeliveryOrder(order, deliveryOrder); |
|
|
} else { |
|
|
} else { |
|
|
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 2); |
|
|
String latestSeq = String.format("%s%s", |
|
|
|
|
|
LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE), |
|
|
|
|
|
merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 2)); |
|
|
LambdaUpdateWrapper<MallOrder> uw = new LambdaUpdateWrapper<>(); |
|
|
LambdaUpdateWrapper<MallOrder> uw = new LambdaUpdateWrapper<>(); |
|
|
uw.eq(MallOrder::getId, orderId) |
|
|
uw.eq(MallOrder::getId, orderId) |
|
|
.set(MallOrder::getStatus, STATUS_WAIT_PICKUP) |
|
|
.set(MallOrder::getStatus, STATUS_WAIT_PICKUP) |
|
|
@ -670,6 +690,26 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} else if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == ORDER_TYPE_FACETOFACE) { |
|
|
} else if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == ORDER_TYPE_FACETOFACE) { |
|
|
|
|
|
/* // 查找属于该订单的拼团并检查成团条件
|
|
|
|
|
|
LambdaQueryWrapper<MallOrderGroup> gq = new LambdaQueryWrapper<>(); |
|
|
|
|
|
gq.eq(MallOrderGroup::getHeadOrderId, orderId); |
|
|
|
|
|
MallOrderGroup group = mallOrderGroupMapper.selectOne(gq);*/ |
|
|
|
|
|
|
|
|
|
|
|
LambdaQueryWrapper<MallOrderGroup> gq2 = new LambdaQueryWrapper<>(); |
|
|
|
|
|
gq2.eq(MallOrderGroup::getShopId, order.getShopId()) |
|
|
|
|
|
.like(MallOrderGroup::getGroupOrderIds, order.getId()) |
|
|
|
|
|
.last("LIMIT 1"); |
|
|
|
|
|
MallOrderGroup group = mallOrderGroupMapper.selectOne(gq2); |
|
|
|
|
|
|
|
|
|
|
|
if(group.getStatus() == 2){ |
|
|
|
|
|
//拼团失败,给用户退款,同时更新order
|
|
|
|
|
|
updateOrderStatus(orderId, 6, null); |
|
|
|
|
|
wechatPayUtil.refund(order.getId(), toCent(order.getTotalAmount()), toCent(order.getTotalAmount())); |
|
|
|
|
|
log.info("拼团失败,已自动发起退款, orderId={}", orderId); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 拼团订单支付成功 -> 改为待成团
|
|
|
// 拼团订单支付成功 -> 改为待成团
|
|
|
updateOrderStatus(orderId, STATUS_WAIT_GROUP, payTime); |
|
|
updateOrderStatus(orderId, STATUS_WAIT_GROUP, payTime); |
|
|
|
|
|
|
|
|
@ -677,17 +717,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
orderVO.setStatus(STATUS_WAIT_GROUP); |
|
|
orderVO.setStatus(STATUS_WAIT_GROUP); |
|
|
userPendingOrderCacheUtil.update(order.getUserId(), orderVO); |
|
|
userPendingOrderCacheUtil.update(order.getUserId(), orderVO); |
|
|
|
|
|
|
|
|
// 查找属于该订单的拼团并检查成团条件
|
|
|
|
|
|
LambdaQueryWrapper<MallOrderGroup> gq = new LambdaQueryWrapper<>(); |
|
|
if (!group.getHeadOrderId().equals(orderId)) { |
|
|
gq.eq(MallOrderGroup::getHeadOrderId, orderId); |
|
|
|
|
|
MallOrderGroup group = mallOrderGroupMapper.selectOne(gq); |
|
|
|
|
|
if (group == null) { |
|
|
|
|
|
// 如果不是团长,按参团人查找
|
|
|
// 如果不是团长,按参团人查找
|
|
|
LambdaQueryWrapper<MallOrderGroup> gq2 = new LambdaQueryWrapper<>(); |
|
|
|
|
|
gq2.eq(MallOrderGroup::getShopId, order.getShopId()) |
|
|
|
|
|
.like(MallOrderGroup::getGroupOrderIds, order.getId()) |
|
|
|
|
|
.last("LIMIT 1"); |
|
|
|
|
|
group = mallOrderGroupMapper.selectOne(gq2); |
|
|
|
|
|
//更新参团人数+1
|
|
|
//更新参团人数+1
|
|
|
int newMembers = group.getCurrentMembers() + 1; |
|
|
int newMembers = group.getCurrentMembers() + 1; |
|
|
LambdaUpdateWrapper<MallOrderGroup> guw = new LambdaUpdateWrapper<>(); |
|
|
LambdaUpdateWrapper<MallOrderGroup> guw = new LambdaUpdateWrapper<>(); |
|
|
@ -745,6 +777,14 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private long toCent(BigDecimal amount) { |
|
|
|
|
|
return safeAmount(amount).multiply(new BigDecimal(100)).longValue(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private BigDecimal safeAmount(BigDecimal amount) { |
|
|
|
|
|
return amount == null ? BigDecimal.ZERO : amount; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 触发配送订单异步事件(微信推给骑手、加入超时检查死信队列等) |
|
|
* 触发配送订单异步事件(微信推给骑手、加入超时检查死信队列等) |
|
|
*/ |
|
|
*/ |
|
|
@ -777,6 +817,14 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
// 如果需要检测出餐超时,发一条出餐超时延时消息
|
|
|
// 如果需要检测出餐超时,发一条出餐超时延时消息
|
|
|
//triggerShopCookTimeoutEvent(orderId);
|
|
|
//triggerShopCookTimeoutEvent(orderId);
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void triggerOrderPayTimeoutEvent(String orderId) { |
|
|
|
|
|
try { |
|
|
|
|
|
orderAsyncProducer.sendDelayMessage(orderId, DELAY_TYPE_ORDER_PAY_TIMEOUT, ORDER_PAY_TIMEOUT_DELAY_MILLIS); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.warn("发送订单支付超时延时消息失败,不影响下单 orderId={}, err={}", orderId, e.getMessage()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@Autowired |
|
|
@Autowired |
|
|
private cc.hiver.mall.dao.mapper.ShopTakeawayMapper shopTakeawayMapper; |
|
|
private cc.hiver.mall.dao.mapper.ShopTakeawayMapper shopTakeawayMapper; |
|
|
@ -835,6 +883,30 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
|
|
public void autoCancelUnpaidOrder(String orderId) { |
|
|
|
|
|
if (StringUtils.isBlank(orderId)) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
MallOrder order = getById(orderId); |
|
|
|
|
|
if (order == null) { |
|
|
|
|
|
log.warn("支付超时自动取消订单失败,订单不存在 orderId={}", orderId); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
if (order.getStatus() == null || order.getStatus() != STATUS_WAIT_PAY) { |
|
|
|
|
|
log.info("支付超时自动取消订单跳过,订单已处理 orderId={}, status={}", orderId, order.getStatus()); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == ORDER_TYPE_FACETOFACE) { |
|
|
|
|
|
handleGroupCancel(order, 3, 1, "支付超时自动取消", null); |
|
|
|
|
|
} else { |
|
|
|
|
|
handleDirectCancel(order, 3, 1, "支付超时自动取消", null); |
|
|
|
|
|
} |
|
|
|
|
|
log.info("支付超时自动取消订单成功 orderId={}", orderId); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// ================================================================
|
|
|
// ================================================================
|
|
|
// 拼团取消逻辑
|
|
|
// 拼团取消逻辑
|
|
|
// ================================================================
|
|
|
// ================================================================
|
|
|
@ -1218,8 +1290,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
public void completeOrder(String orderId) { |
|
|
public void completeOrder(String orderId) { |
|
|
MallOrder order = getById(orderId); |
|
|
MallOrder order = getById(orderId); |
|
|
if (order == null) throw new RuntimeException("订单不存在"); |
|
|
if (order == null) throw new RuntimeException("订单不存在"); |
|
|
if (order.getStatus() != STATUS_WAIT_PICKUP && order.getStatus() != STATUS_DELIVERING) { |
|
|
if (order.getStatus() != STATUS_WAIT_PICKUP) { |
|
|
throw new RuntimeException("当前状态不可完成"); |
|
|
throw new RuntimeException("当前订单不可核销"); |
|
|
} |
|
|
} |
|
|
//优惠券变成已使用
|
|
|
//优惠券变成已使用
|
|
|
mallUserCouponService.useCoupon(orderId); |
|
|
mallUserCouponService.useCoupon(orderId); |
|
|
@ -1271,8 +1343,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
|
|
|
|
|
|
// 3. 生成结束时间:当天的 23:59:59
|
|
|
// 3. 生成结束时间:当天的 23:59:59
|
|
|
LocalDateTime endTime = date.atTime(LocalTime.MAX); |
|
|
LocalDateTime endTime = date.atTime(LocalTime.MAX); |
|
|
//统计营业额和订单量
|
|
|
//统计营业额、订单量、已同意售后笔数和售后商品金额
|
|
|
HashMap<String, Object> orderRevenueAndCount = this.baseMapper.selectOrderRevenueAndCount(shopId,startTime,endTime); |
|
|
List<MallOrder> revenueOrders = this.baseMapper.selectOrderRevenueAndCount(shopId,startTime,endTime); |
|
|
|
|
|
HashMap<String, Object> orderRevenueAndCount = buildOrderRevenueAndCount(shopId, revenueOrders); |
|
|
result.put("orderRevenueAndCount", orderRevenueAndCount); |
|
|
result.put("orderRevenueAndCount", orderRevenueAndCount); |
|
|
//待处理差评订单数
|
|
|
//待处理差评订单数
|
|
|
Integer pendingBadReviewCount = this.baseMapper.selectPendingBadReviewCount(shopId); |
|
|
Integer pendingBadReviewCount = this.baseMapper.selectPendingBadReviewCount(shopId); |
|
|
@ -1289,6 +1362,75 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
return result; |
|
|
return result; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private HashMap<String, Object> buildOrderRevenueAndCount(String shopId, List<MallOrder> revenueOrders) { |
|
|
|
|
|
HashMap<String, Object> orderRevenueAndCount = new HashMap<>(); |
|
|
|
|
|
List<MallOrder> orders = revenueOrders == null ? Collections.emptyList() : revenueOrders; |
|
|
|
|
|
BigDecimal amount = orders.stream() |
|
|
|
|
|
.map(order -> safeAmount(order.getGoodsAmount()).add(safeAmount(order.getPackageFee()))) |
|
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
|
Map<String, MallOrder> orderMap = orders.stream() |
|
|
|
|
|
.filter(order -> StringUtils.isNotBlank(order.getId())) |
|
|
|
|
|
.collect(Collectors.toMap(MallOrder::getId, order -> order, (left, right) -> left)); |
|
|
|
|
|
|
|
|
|
|
|
orderRevenueAndCount.put("count", orders.size()); |
|
|
|
|
|
orderRevenueAndCount.put("amount", amount); |
|
|
|
|
|
orderRevenueAndCount.put("afterSaleCount", 0); |
|
|
|
|
|
orderRevenueAndCount.put("afterSaleAmount", BigDecimal.ZERO); |
|
|
|
|
|
|
|
|
|
|
|
List<String> orderIds = orders.stream() |
|
|
|
|
|
.map(MallOrder::getId) |
|
|
|
|
|
.filter(StringUtils::isNotBlank) |
|
|
|
|
|
.distinct() |
|
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
if (orderIds.isEmpty()) { |
|
|
|
|
|
return orderRevenueAndCount; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LambdaQueryWrapper<MallRefundRecord> refundWrapper = new LambdaQueryWrapper<>(); |
|
|
|
|
|
refundWrapper.eq(MallRefundRecord::getLinkId, shopId) |
|
|
|
|
|
.eq(MallRefundRecord::getStatus, REFUND_STATUS_AFTER_SALE_AGREED) |
|
|
|
|
|
.in(MallRefundRecord::getOrderId, orderIds); |
|
|
|
|
|
List<MallRefundRecord> refundRecords = mallRefundRecordMapper.selectList(refundWrapper); |
|
|
|
|
|
if (refundRecords == null || refundRecords.isEmpty()) { |
|
|
|
|
|
return orderRevenueAndCount; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
List<String> refundOrderIds = refundRecords.stream() |
|
|
|
|
|
.map(MallRefundRecord::getOrderId) |
|
|
|
|
|
.filter(StringUtils::isNotBlank) |
|
|
|
|
|
.distinct() |
|
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
if (refundOrderIds.isEmpty()) { |
|
|
|
|
|
orderRevenueAndCount.put("afterSaleCount", refundRecords.size()); |
|
|
|
|
|
return orderRevenueAndCount; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LambdaQueryWrapper<MallReturnOrderGoods> goodsWrapper = new LambdaQueryWrapper<>(); |
|
|
|
|
|
goodsWrapper.in(MallReturnOrderGoods::getOrderId, refundOrderIds); |
|
|
|
|
|
List<MallReturnOrderGoods> returnGoodsList = mallReturnOrderGoodsMapper.selectList(goodsWrapper); |
|
|
|
|
|
BigDecimal afterSaleAmount = returnGoodsList == null ? BigDecimal.ZERO : returnGoodsList.stream() |
|
|
|
|
|
.map(goods -> calculateReturnGoodsAmount(goods, orderMap.get(goods.getOrderId()))) |
|
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
|
|
|
|
|
|
|
orderRevenueAndCount.put("afterSaleCount", refundRecords.size()); |
|
|
|
|
|
orderRevenueAndCount.put("afterSaleAmount", afterSaleAmount); |
|
|
|
|
|
return orderRevenueAndCount; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private BigDecimal calculateReturnGoodsAmount(MallReturnOrderGoods goods, MallOrder order) { |
|
|
|
|
|
BigDecimal quantity = goods.getQuantity() == null ? BigDecimal.ZERO : BigDecimal.valueOf(goods.getQuantity()); |
|
|
|
|
|
BigDecimal unitAmount = safeAmount(goods.getPrice()); |
|
|
|
|
|
if (shouldIncludePackageFee(order)) { |
|
|
|
|
|
unitAmount = unitAmount.add(safeAmount(goods.getPackageFee())); |
|
|
|
|
|
} |
|
|
|
|
|
return unitAmount.multiply(quantity); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private boolean shouldIncludePackageFee(MallOrder order) { |
|
|
|
|
|
return order != null |
|
|
|
|
|
&& (Objects.equals(order.getDeliveryType(), DELIVERY_TYPE_EXPRESS) || Objects.equals(order.getIsPack(), 1)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public List<MallOrderVO> getPeiSongOrders(String userId) { |
|
|
public List<MallOrderVO> getPeiSongOrders(String userId) { |
|
|
List<MallOrderVO> orders = this.baseMapper.getPeiSongOrders(userId); |
|
|
List<MallOrderVO> orders = this.baseMapper.getPeiSongOrders(userId); |
|
|
@ -1430,7 +1572,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
LambdaQueryWrapper<MallRefundRecord> rq = new LambdaQueryWrapper<>(); |
|
|
LambdaQueryWrapper<MallRefundRecord> rq = new LambdaQueryWrapper<>(); |
|
|
rq.eq(MallRefundRecord::getOrderId, orderId); |
|
|
rq.eq(MallRefundRecord::getOrderId, orderId); |
|
|
List<MallRefundRecord> sallRefundRecord = mallRefundRecordMapper.selectList(rq); |
|
|
List<MallRefundRecord> sallRefundRecord = mallRefundRecordMapper.selectList(rq); |
|
|
if(sallRefundRecord != null){ |
|
|
if(!sallRefundRecord.isEmpty()){ |
|
|
sallRefundRecord.forEach(item -> { |
|
|
sallRefundRecord.forEach(item -> { |
|
|
if(item.getRefundType() == 1){ |
|
|
if(item.getRefundType() == 1){ |
|
|
//售后商品详情
|
|
|
//售后商品详情
|
|
|
@ -1969,14 +2111,18 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
//发送1小时延时MQ:超时未处理则自动同意
|
|
|
//发送1小时延时MQ:超时未处理则自动同意
|
|
|
orderAsyncProducer.sendRefundDelayMessage(record.getId(), order.getId()); |
|
|
orderAsyncProducer.sendRefundDelayMessage(record.getId(), order.getId()); |
|
|
//发送商家通知
|
|
|
//发送商家通知
|
|
|
jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款,配送员原因",order.getId()); |
|
|
if(order.getOtherOrder() == null){ |
|
|
|
|
|
jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔订单申请退款,配送员原因",order.getId()); |
|
|
|
|
|
} |
|
|
}else if(refundTypeStatus == 3){ |
|
|
}else if(refundTypeStatus == 3){ |
|
|
//商家、配送员都加一条
|
|
|
//商家、配送员都加一条
|
|
|
record.setLinkId(order.getShopId()); |
|
|
record.setLinkId(order.getShopId()); |
|
|
if(ratio != null){ |
|
|
BigDecimal shopRefund = BigDecimal.ZERO; |
|
|
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee()).subtract(order.getGoodsAmount().add(order.getPackageFee()).multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); |
|
|
if(ratio != null && ratio.compareTo(BigDecimal.ZERO) > 0){ |
|
|
|
|
|
shopRefund = order.getGoodsAmount().add(order.getPackageFee()).subtract(order.getGoodsAmount().add(order.getPackageFee()).multiply(ratio)).setScale(2, RoundingMode.UP); |
|
|
|
|
|
record.setRefundAmount(shopRefund); |
|
|
}else{ |
|
|
}else{ |
|
|
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee()).setScale(2, RoundingMode.HALF_UP)); |
|
|
record.setRefundAmount(order.getGoodsAmount().add(order.getPackageFee())); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/*if(ratio != null){ |
|
|
/*if(ratio != null){ |
|
|
@ -1993,8 +2139,8 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
MallRefundRecord mallRefundRecord1 = record; |
|
|
MallRefundRecord mallRefundRecord1 = record; |
|
|
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString()); |
|
|
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString()); |
|
|
mallRefundRecord1.setLinkId(workerId); |
|
|
mallRefundRecord1.setLinkId(workerId); |
|
|
if(ratio != null){ |
|
|
if(ratio != null && ratio.compareTo(BigDecimal.ZERO) > 0){ |
|
|
mallRefundRecord1.setRefundAmount(order.getDeliveryFee().subtract(order.getDeliveryFee().multiply(ratio)).setScale(2, RoundingMode.HALF_UP)); |
|
|
mallRefundRecord1.setRefundAmount(order.getTotalAmount().subtract(shopRefund)); |
|
|
}else{ |
|
|
}else{ |
|
|
mallRefundRecord1.setRefundAmount(order.getDeliveryFee()); |
|
|
mallRefundRecord1.setRefundAmount(order.getDeliveryFee()); |
|
|
} |
|
|
} |
|
|
|