|
@@ -45,6 +45,9 @@ public class MembershipService implements MembershipServiceInterface {
|
|
|
@Resource
|
|
@Resource
|
|
|
private CouponService couponService;
|
|
private CouponService couponService;
|
|
|
|
|
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private TrialMembershipMapper trialMembershipMapper;
|
|
|
|
|
+
|
|
|
// ==================== 基础查询 ====================
|
|
// ==================== 基础查询 ====================
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -234,12 +237,17 @@ public class MembershipService implements MembershipServiceInterface {
|
|
|
int originalAmount = amount;
|
|
int originalAmount = amount;
|
|
|
int finalAmount = originalAmount;
|
|
int finalAmount = originalAmount;
|
|
|
Long appliedCouponId = null;
|
|
Long appliedCouponId = null;
|
|
|
- if (userCouponId != null) {
|
|
|
|
|
- Integer discount = couponService.apply(userId, userCouponId, "MEMBERSHIP", originalAmount);
|
|
|
|
|
- if (discount != null && discount > 0) {
|
|
|
|
|
- finalAmount = Math.max(0, originalAmount - discount);
|
|
|
|
|
- appliedCouponId = userCouponId;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if (!"trial".equals(paymentType)) {
|
|
|
|
|
+ if (userCouponId != null) {
|
|
|
|
|
+ Integer discount = couponService.apply(userId, userCouponId, "MEMBERSHIP", originalAmount);
|
|
|
|
|
+ if (discount != null && discount > 0) {
|
|
|
|
|
+ finalAmount = Math.max(0, originalAmount - discount);
|
|
|
|
|
+ appliedCouponId = userCouponId;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ } else {
|
|
|
|
|
+ finalAmount = 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
PaymentOrder order = new PaymentOrder();
|
|
PaymentOrder order = new PaymentOrder();
|
|
@@ -249,12 +257,16 @@ public class MembershipService implements MembershipServiceInterface {
|
|
|
order.setPaymentType(paymentType);
|
|
order.setPaymentType(paymentType);
|
|
|
order.setAmount(finalAmount);
|
|
order.setAmount(finalAmount);
|
|
|
order.setUserCouponId(appliedCouponId);
|
|
order.setUserCouponId(appliedCouponId);
|
|
|
- order.setStatus("pending");
|
|
|
|
|
|
|
+ order.setStatus("trial".equals(paymentType) ? "paid" : "pending");
|
|
|
order.setCreatedAt(new Date());
|
|
order.setCreatedAt(new Date());
|
|
|
order.setUpdatedAt(new Date());
|
|
order.setUpdatedAt(new Date());
|
|
|
|
|
|
|
|
paymentOrderMapper.insert(order);
|
|
paymentOrderMapper.insert(order);
|
|
|
|
|
|
|
|
|
|
+ if ("trial".equals(paymentType)) {
|
|
|
|
|
+ activateTrialMembership(userId, familyId, order);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
PaymentOrderDTO dto = new PaymentOrderDTO();
|
|
PaymentOrderDTO dto = new PaymentOrderDTO();
|
|
|
dto.setOrderNo(order.getOrderNo());
|
|
dto.setOrderNo(order.getOrderNo());
|
|
|
dto.setAmount(order.getAmount());
|
|
dto.setAmount(order.getAmount());
|
|
@@ -281,6 +293,10 @@ public class MembershipService implements MembershipServiceInterface {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if ("trial".equals(order.getPaymentType())) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 防止重复处理
|
|
// 防止重复处理
|
|
|
if ("paid".equals(order.getStatus())) {
|
|
if ("paid".equals(order.getStatus())) {
|
|
|
return true;
|
|
return true;
|
|
@@ -503,6 +519,57 @@ public class MembershipService implements MembershipServiceInterface {
|
|
|
return new Date(now.getTime() + 30L * 24 * 60 * 60 * 1000);
|
|
return new Date(now.getTime() + 30L * 24 * 60 * 60 * 1000);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private void activateTrialMembership(Long userId, Long familyId, PaymentOrder order) {
|
|
|
|
|
+ String trialDaysStr = sysConfigService.getValue("trial_days");
|
|
|
|
|
+ int trialDays = trialDaysStr != null ? Integer.parseInt(trialDaysStr) : 7;
|
|
|
|
|
+
|
|
|
|
|
+ Date now = new Date();
|
|
|
|
|
+ Date endDate = new Date(now.getTime() + (long) trialDays * 24 * 60 * 60 * 1000);
|
|
|
|
|
+
|
|
|
|
|
+ TrialMembership trial = new TrialMembership();
|
|
|
|
|
+ trial.setUserId(userId);
|
|
|
|
|
+ trial.setFamilyId(familyId);
|
|
|
|
|
+ trial.setStartDate(now);
|
|
|
|
|
+ trial.setEndDate(endDate);
|
|
|
|
|
+ trial.setStatus("ACTIVE");
|
|
|
|
|
+ trial.setTrialDays(trialDays);
|
|
|
|
|
+ trial.setCreatedAt(now);
|
|
|
|
|
+ trial.setUpdatedAt(now);
|
|
|
|
|
+ trialMembershipMapper.insert(trial);
|
|
|
|
|
+
|
|
|
|
|
+ Family family = familyMapper.selectById(familyId);
|
|
|
|
|
+ Long adminUserId = family != null ? family.getCreatorId() : userId;
|
|
|
|
|
+
|
|
|
|
|
+ FamilyMembership membership = new FamilyMembership();
|
|
|
|
|
+ membership.setFamilyId(familyId);
|
|
|
|
|
+ membership.setLevelCode(order.getLevelCode());
|
|
|
|
|
+ membership.setStartDate(now);
|
|
|
|
|
+ membership.setEndDate(endDate);
|
|
|
|
|
+ membership.setPaymentMethod("trial");
|
|
|
|
|
+ membership.setPaymentStatus("paid");
|
|
|
|
|
+ membership.setOrderNo(order.getOrderNo());
|
|
|
|
|
+ membership.setAmount(0);
|
|
|
|
|
+ membershipMapper.insert(membership);
|
|
|
|
|
+
|
|
|
|
|
+ User adminUser = userMapper.selectById(adminUserId);
|
|
|
|
|
+ if (adminUser != null) {
|
|
|
|
|
+ adminUser.setMemberLevel("FAMILY");
|
|
|
|
|
+ adminUser.setMemberExpireTime(endDate);
|
|
|
|
|
+ adminUser.setUpdatedAt(now);
|
|
|
|
|
+ userMapper.updateById(adminUser);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ MemberUpgradeRecord upgradeRecord = new MemberUpgradeRecord();
|
|
|
|
|
+ upgradeRecord.setUserId(adminUserId);
|
|
|
|
|
+ upgradeRecord.setFromLevel("FREE");
|
|
|
|
|
+ upgradeRecord.setToLevel("FAMILY");
|
|
|
|
|
+ upgradeRecord.setUpgradeType("trial");
|
|
|
|
|
+ upgradeRecord.setOrderId(order.getId());
|
|
|
|
|
+ upgradeRecord.setExpireTime(endDate);
|
|
|
|
|
+ upgradeRecord.setCreatedAt(now);
|
|
|
|
|
+ memberUpgradeRecordMapper.insert(upgradeRecord);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private MembershipLevelDTO toLevelDTO(MembershipLevel level) {
|
|
private MembershipLevelDTO toLevelDTO(MembershipLevel level) {
|
|
|
MembershipLevelDTO dto = new MembershipLevelDTO();
|
|
MembershipLevelDTO dto = new MembershipLevelDTO();
|
|
|
dto.setId(level.getId());
|
|
dto.setId(level.getId());
|