|
|
@ -287,10 +287,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
order.setStatus(STATUS_WAIT_PAY); |
|
|
order.setStatus(STATUS_WAIT_PAY); |
|
|
order.setRegionId(dto.getRegionId()); |
|
|
order.setRegionId(dto.getRegionId()); |
|
|
|
|
|
|
|
|
// 1. 【核心】调用判断脚本,看能不能免单
|
|
|
// 1. 【核心】调用判断脚本,看能不能免单(Key 按 regionId 隔离,避免多区域计数混乱)
|
|
|
String canFree = stringRedisTemplate.execute( |
|
|
String canFree = stringRedisTemplate.execute( |
|
|
redisLuaScripts.getCheckScript(), |
|
|
redisLuaScripts.getCheckScript(), |
|
|
Collections.singletonList("free_order:flag"), // 检查免单开关
|
|
|
Collections.singletonList("free_order:flag:" + order.getRegionId()), // 检查免单开关
|
|
|
"" // 不需要额外参数
|
|
|
"" // 不需要额外参数
|
|
|
); |
|
|
); |
|
|
boolean isFreeOrder = "true".equals(canFree); |
|
|
boolean isFreeOrder = "true".equals(canFree); |
|
|
@ -378,10 +378,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
MallOrder order = buildBaseOrder(dto, orderType, goodsAmount, deliveryFee, packageFee); |
|
|
MallOrder order = buildBaseOrder(dto, orderType, goodsAmount, deliveryFee, packageFee); |
|
|
order.setStatus(STATUS_WAIT_PAY); |
|
|
order.setStatus(STATUS_WAIT_PAY); |
|
|
order.setRegionId(dto.getRegionId()); |
|
|
order.setRegionId(dto.getRegionId()); |
|
|
// 1. 【核心】调用判断脚本,看能不能免单
|
|
|
// 1. 【核心】调用判断脚本,看能不能免单(Key 按 regionId 隔离,避免多区域计数混乱)
|
|
|
String canFree = stringRedisTemplate.execute( |
|
|
String canFree = stringRedisTemplate.execute( |
|
|
redisLuaScripts.getCheckScript(), |
|
|
redisLuaScripts.getCheckScript(), |
|
|
Collections.singletonList("free_order:flag"), // 检查免单开关
|
|
|
Collections.singletonList("free_order:flag:" + order.getRegionId()), // 检查免单开关
|
|
|
"" // 不需要额外参数
|
|
|
"" // 不需要额外参数
|
|
|
); |
|
|
); |
|
|
boolean isFreeOrder = "true".equals(canFree); |
|
|
boolean isFreeOrder = "true".equals(canFree); |
|
|
@ -516,10 +516,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
order.setStatus(STATUS_WAIT_PAY); |
|
|
order.setStatus(STATUS_WAIT_PAY); |
|
|
order.setRegionId(dto.getRegionId()); |
|
|
order.setRegionId(dto.getRegionId()); |
|
|
|
|
|
|
|
|
// 1. 【核心】调用判断脚本,看能不能免单
|
|
|
// 1. 【核心】调用判断脚本,看能不能免单(Key 按 regionId 隔离,避免多区域计数混乱)
|
|
|
String canFree = stringRedisTemplate.execute( |
|
|
String canFree = stringRedisTemplate.execute( |
|
|
redisLuaScripts.getCheckScript(), |
|
|
redisLuaScripts.getCheckScript(), |
|
|
Collections.singletonList("free_order:flag"), // 检查免单开关
|
|
|
Collections.singletonList("free_order:flag:" + order.getRegionId()), // 检查免单开关
|
|
|
"" // 不需要额外参数
|
|
|
"" // 不需要额外参数
|
|
|
); |
|
|
); |
|
|
boolean isFreeOrder = "true".equals(canFree); |
|
|
boolean isFreeOrder = "true".equals(canFree); |
|
|
@ -632,6 +632,11 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
MallOrderVO orderVO = buildVO(order, null, null, null); |
|
|
MallOrderVO orderVO = buildVO(order, null, null, null); |
|
|
orderVO.setStatus(STATUS_WAIT_PICKUP); |
|
|
orderVO.setStatus(STATUS_WAIT_PICKUP); |
|
|
userPendingOrderCacheUtil.update(order.getUserId(), orderVO); |
|
|
userPendingOrderCacheUtil.update(order.getUserId(), orderVO); |
|
|
|
|
|
if(order.getUserRequireMake() != null && order.getUserRequireMake() == 1){ |
|
|
|
|
|
jPushService.sendPushNotification(shopService.findById(order.getShopId()).getClientId(), "您有一笔新的到店订单",orderId); |
|
|
|
|
|
// 触发商家出餐超时监听
|
|
|
|
|
|
triggerShopCookTimeoutEvent(orderId); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} else if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == ORDER_TYPE_FACETOFACE) { |
|
|
} else if (order.getOrderType() == ORDER_TYPE_GROUP || order.getOrderType() == ORDER_TYPE_FACETOFACE) { |
|
|
// 拼团订单支付成功 -> 改为待成团
|
|
|
// 拼团订单支付成功 -> 改为待成团
|
|
|
@ -976,9 +981,6 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
if (order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS) { |
|
|
if (order.getDeliveryType() != null && order.getDeliveryType() == DELIVERY_TYPE_EXPRESS) { |
|
|
// 配送方式
|
|
|
// 配送方式
|
|
|
MallDeliveryOrder delivery = findDeliveryByOrderId(order.getId()); |
|
|
MallDeliveryOrder delivery = findDeliveryByOrderId(order.getId()); |
|
|
if (delivery != null && delivery.getStatus() != null && delivery.getStatus() >= 1) { |
|
|
|
|
|
applyMerchantRefund(delivery.getWorkerId(),order, "用户申请取消订单退款",refundType,refundTypeStatus); |
|
|
|
|
|
} |
|
|
|
|
|
// 10分钟冷却期
|
|
|
// 10分钟冷却期
|
|
|
if (group.getSuccessTime() != null) { |
|
|
if (group.getSuccessTime() != null) { |
|
|
long diffMs = System.currentTimeMillis() - group.getSuccessTime().getTime(); |
|
|
long diffMs = System.currentTimeMillis() - group.getSuccessTime().getTime(); |
|
|
@ -986,12 +988,16 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
throw new RuntimeException("拼团订单10分钟内无法退款"); |
|
|
throw new RuntimeException("拼团订单10分钟内无法退款"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
if (delivery != null && delivery.getStatus() != null && delivery.getStatus() >= 1) { |
|
|
|
|
|
applyMerchantRefund(delivery.getWorkerId(),order, "用户申请取消订单退款",refundType,refundTypeStatus); |
|
|
|
|
|
}else{ |
|
|
// 允许取消
|
|
|
// 允许取消
|
|
|
cancelDeliveryOrderByOrderId(order.getId()); |
|
|
cancelDeliveryOrderByOrderId(order.getId()); |
|
|
autoRefund(order, "成团后用户取消订单,系统退款"); |
|
|
autoRefund(order, "成团后用户取消订单,系统退款"); |
|
|
restoreStock(order.getId()); |
|
|
restoreStock(order.getId()); |
|
|
//抢单大厅缓存去掉
|
|
|
//抢单大厅缓存去掉
|
|
|
waitOrderCacheUtil.remove(delivery.getRegionId(), delivery.getId()); |
|
|
waitOrderCacheUtil.remove(delivery.getRegionId(), delivery.getId()); |
|
|
|
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
// 自取(待消费)→ 待商家同意退款
|
|
|
// 自取(待消费)→ 待商家同意退款
|
|
|
applyMerchantRefund(null,order, "用户申请取消订单退款",refundType,refundTypeStatus); |
|
|
applyMerchantRefund(null,order, "用户申请取消订单退款",refundType,refundTypeStatus); |
|
|
@ -1173,12 +1179,12 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
updateOrderStatus(orderId, STATUS_DONE); |
|
|
updateOrderStatus(orderId, STATUS_DONE); |
|
|
//更新缓存
|
|
|
//更新缓存
|
|
|
userPendingOrderCacheUtil.remove(order.getUserId(),order.getId()); |
|
|
userPendingOrderCacheUtil.remove(order.getUserId(),order.getId()); |
|
|
//免单计数
|
|
|
//免单计数(Key 按 regionId 隔离,避免多区域计数混乱)
|
|
|
if(freeOrderCacheUtil.exists(order.getRegionId())){ |
|
|
if(freeOrderCacheUtil.exists(order.getRegionId())){ |
|
|
stringRedisTemplate.execute( |
|
|
stringRedisTemplate.execute( |
|
|
redisLuaScripts.getIncrementScript(), |
|
|
redisLuaScripts.getIncrementScript(), |
|
|
Arrays.asList("free_order:count", "free_order:flag"), // 两个 key:计数器和免单开关
|
|
|
Arrays.asList("free_order:count:" + order.getRegionId(), "free_order:flag:" + order.getRegionId()), // 两个 key:计数器和免单开关
|
|
|
String.valueOf(freeOrderCacheUtil.get(order.getRegionId()).getOrderNumber())// N = 100
|
|
|
String.valueOf(freeOrderCacheUtil.get(order.getRegionId()).getOrderNumber()) |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -1482,6 +1488,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder |
|
|
order.setGoodsAmount(goodsAmount); |
|
|
order.setGoodsAmount(goodsAmount); |
|
|
order.setDeliveryFee(deliveryFee); |
|
|
order.setDeliveryFee(deliveryFee); |
|
|
order.setPackageFee(packageFee); |
|
|
order.setPackageFee(packageFee); |
|
|
|
|
|
if(dto.getUserRequireMake() != null && dto.getUserRequireMake() == 1){ |
|
|
|
|
|
order.setUserRequireMake(dto.getUserRequireMake()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
java.math.BigDecimal finalTotal = goodsAmount.add(deliveryFee).add(packageFee); |
|
|
java.math.BigDecimal finalTotal = goodsAmount.add(deliveryFee).add(packageFee); |
|
|
java.math.BigDecimal discount = java.math.BigDecimal.ZERO; |
|
|
java.math.BigDecimal discount = java.math.BigDecimal.ZERO; |
|
|
|