|
@@ -35,6 +35,8 @@ public class ActivityRegistrationService {
|
|
|
private ActivityMapper activityMapper;
|
|
private ActivityMapper activityMapper;
|
|
|
@Resource
|
|
@Resource
|
|
|
private ActivityOrderMapper orderMapper;
|
|
private ActivityOrderMapper orderMapper;
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private PaymentService paymentService;
|
|
|
|
|
|
|
|
@Transactional
|
|
@Transactional
|
|
|
public Result<Map<String, Object>> batchRegister(Long activityId, Long userId, List<Map<String, Object>> registrants) {
|
|
public Result<Map<String, Object>> batchRegister(Long activityId, Long userId, List<Map<String, Object>> registrants) {
|
|
@@ -125,12 +127,30 @@ public class ActivityRegistrationService {
|
|
|
.last("LIMIT 1"));
|
|
.last("LIMIT 1"));
|
|
|
if (reg == null) return Result.error("报名记录不存在");
|
|
if (reg == null) return Result.error("报名记录不存在");
|
|
|
String prevStatus = reg.getStatus();
|
|
String prevStatus = reg.getStatus();
|
|
|
- reg.setStatus("cancelled"); reg.setUpdatedAt(LocalDateTime.now());
|
|
|
|
|
- registrationMapper.updateById(reg);
|
|
|
|
|
- // 已通过报名取消时回退名额(退款链路见 P0-2)
|
|
|
|
|
if ("approved".equals(prevStatus)) {
|
|
if ("approved".equals(prevStatus)) {
|
|
|
|
|
+ // 付费活动取消:原路退款(金额取该报名人对应 fee;如一单多人则按单退款)
|
|
|
|
|
+ ActivityOrder order = orderMapper.selectOne(new LambdaQueryWrapper<ActivityOrder>()
|
|
|
|
|
+ .eq(ActivityOrder::getActivityId, activityId)
|
|
|
|
|
+ .eq(ActivityOrder::getUserId, userId)
|
|
|
|
|
+ .eq(ActivityOrder::getStatus, "paid")
|
|
|
|
|
+ .last("LIMIT 1"));
|
|
|
|
|
+ if (order != null) {
|
|
|
|
|
+ int refundFee = resolveRegistrantFee(order, memberId);
|
|
|
|
|
+ try {
|
|
|
|
|
+ paymentService.refund(order.getOrderNo(), refundFee > 0 ? refundFee : order.getTotalAmount(), "取消活动报名");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("活动报名退款失败: orderNo={}, memberId={}", order.getOrderNo(), memberId, e);
|
|
|
|
|
+ return Result.error("退款处理失败,请联系客服");
|
|
|
|
|
+ }
|
|
|
|
|
+ order.setStatus("refunded");
|
|
|
|
|
+ orderMapper.updateById(order);
|
|
|
|
|
+ }
|
|
|
releaseQuota(activityId);
|
|
releaseQuota(activityId);
|
|
|
}
|
|
}
|
|
|
|
|
+ reg.setStatus("cancelled");
|
|
|
|
|
+ reg.setCancelledAt(LocalDateTime.now());
|
|
|
|
|
+ reg.setUpdatedAt(LocalDateTime.now());
|
|
|
|
|
+ registrationMapper.updateById(reg);
|
|
|
return Result.success(null);
|
|
return Result.success(null);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -419,6 +439,29 @@ public class ActivityRegistrationService {
|
|
|
.eq(ActivityRegistration::getStatus, "approved").last("LIMIT 1")) != null;
|
|
.eq(ActivityRegistration::getStatus, "approved").last("LIMIT 1")) != null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private int resolveRegistrantFee(ActivityOrder order, Long memberId) {
|
|
|
|
|
+ if (order.getRegistrantsJson() == null) return 0;
|
|
|
|
|
+ try {
|
|
|
|
|
+ com.alibaba.fastjson.TypeReference<java.util.List<java.util.Map<String, Object>>> typeRef
|
|
|
|
|
+ = new com.alibaba.fastjson.TypeReference<java.util.List<java.util.Map<String, Object>>>() {};
|
|
|
|
|
+ java.util.List<java.util.Map<String, Object>> list
|
|
|
|
|
+ = com.alibaba.fastjson.JSON.parseObject(order.getRegistrantsJson(), typeRef);
|
|
|
|
|
+ if (list != null) {
|
|
|
|
|
+ for (java.util.Map<String, Object> item : list) {
|
|
|
|
|
+ Object mid = item.get("memberId");
|
|
|
|
|
+ if (mid != null && memberId != null
|
|
|
|
|
+ && String.valueOf(mid).equals(String.valueOf(memberId))) {
|
|
|
|
|
+ Object fee = item.get("fee");
|
|
|
|
|
+ if (fee instanceof Number) return ((Number) fee).intValue();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("解析报名人 fee 失败: orderNo={}, memberId={}", order.getOrderNo(), memberId, e);
|
|
|
|
|
+ }
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private ActivityRegistration findRegistration(Long activityId, Long memberId, Long userId, String status) {
|
|
private ActivityRegistration findRegistration(Long activityId, Long memberId, Long userId, String status) {
|
|
|
LambdaQueryWrapper<ActivityRegistration> wrapper = new LambdaQueryWrapper<ActivityRegistration>()
|
|
LambdaQueryWrapper<ActivityRegistration> wrapper = new LambdaQueryWrapper<ActivityRegistration>()
|
|
|
.eq(ActivityRegistration::getActivityId, activityId)
|
|
.eq(ActivityRegistration::getActivityId, activityId)
|