|
|
@@ -0,0 +1,206 @@
|
|
|
+package com.etotem.cfc.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.etotem.cfc.entity.*;
|
|
|
+import com.etotem.cfc.mapper.*;
|
|
|
+import com.etotem.cfc.service.PurchaseService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class PurchaseServiceImpl implements PurchaseService {
|
|
|
+
|
|
|
+ @Autowired private PurchaseOrderMapper orderMapper;
|
|
|
+ @Autowired private FamilyMembershipMapper membershipMapper;
|
|
|
+ @Autowired private FamilyMemberMapper memberMapper;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> checkPurchase(Long userId) {
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+
|
|
|
+ LambdaQueryWrapper<PurchaseOrder> qw = new LambdaQueryWrapper<>();
|
|
|
+ qw.eq(PurchaseOrder::getUserId, userId)
|
|
|
+ .eq(PurchaseOrder::getStatus, "paid")
|
|
|
+ .orderByDesc(PurchaseOrder::getCreatedAt)
|
|
|
+ .last("LIMIT 1");
|
|
|
+ PurchaseOrder order = orderMapper.selectOne(qw);
|
|
|
+
|
|
|
+ if (order == null) {
|
|
|
+ result.put("hasPurchased", false);
|
|
|
+ result.put("daysRemaining", 0);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ boolean isActive = order.getEndDate().after(new Date());
|
|
|
+
|
|
|
+ result.put("hasPurchased", true);
|
|
|
+ result.put("isActive", isActive);
|
|
|
+ result.put("orderId", order.getId());
|
|
|
+ result.put("orderNo", order.getOrderNo());
|
|
|
+
|
|
|
+ if (isActive) {
|
|
|
+ long daysRemaining = java.time.temporal.ChronoUnit.DAYS.between(
|
|
|
+ java.time.LocalDate.now(), order.getEndDate().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate());
|
|
|
+ result.put("daysRemaining", Math.max(0, daysRemaining));
|
|
|
+ result.put("startDate", order.getStartDate());
|
|
|
+ result.put("endDate", order.getEndDate());
|
|
|
+ result.put("isEarlyRenewal", order.getIsEarlyRenewal());
|
|
|
+ } else {
|
|
|
+ result.put("daysRemaining", 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> createOrder(Long userId, Long familyId) {
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+
|
|
|
+ String orderNo = "HQ" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 6).toUpperCase();
|
|
|
+
|
|
|
+ PurchaseOrder order = new PurchaseOrder();
|
|
|
+ order.setOrderNo(orderNo);
|
|
|
+ order.setUserId(userId);
|
|
|
+ order.setFamilyId(familyId);
|
|
|
+ order.setAmount(19900);
|
|
|
+ order.setStatus("pending");
|
|
|
+ order.setStartDate(new Date());
|
|
|
+
|
|
|
+ java.time.LocalDateTime endDate = java.time.LocalDateTime.now().plusDays(7);
|
|
|
+ order.setEndDate(java.sql.Timestamp.valueOf(endDate));
|
|
|
+
|
|
|
+ orderMapper.insert(order);
|
|
|
+
|
|
|
+ result.put("success", true);
|
|
|
+ result.put("orderNo", orderNo);
|
|
|
+ result.put("amount", 19900);
|
|
|
+ result.put("daysRemaining", 7);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> confirmPayment(String orderNo, String paymentMethod, String transactionId) {
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+
|
|
|
+ LambdaQueryWrapper<PurchaseOrder> qw = new LambdaQueryWrapper<>();
|
|
|
+ qw.eq(PurchaseOrder::getOrderNo, orderNo);
|
|
|
+ PurchaseOrder order = orderMapper.selectOne(qw);
|
|
|
+
|
|
|
+ if (order == null) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("message", "订单不存在");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!"pending".equals(order.getStatus())) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("message", "订单状态异常");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ order.setStatus("paid");
|
|
|
+ order.setPaymentMethod(paymentMethod);
|
|
|
+ order.setTransactionId(transactionId);
|
|
|
+ order.setPaidAt(new Date());
|
|
|
+ orderMapper.updateById(order);
|
|
|
+
|
|
|
+ int cfReward = 300;
|
|
|
+ order.setCfRewardGiven(cfReward);
|
|
|
+
|
|
|
+ LambdaQueryWrapper<FamilyMember> mqw = new LambdaQueryWrapper<>();
|
|
|
+ mqw.eq(FamilyMember::getFamilyId, order.getFamilyId())
|
|
|
+ .eq(FamilyMember::getUserId, order.getUserId())
|
|
|
+ .last("LIMIT 1");
|
|
|
+ FamilyMember member = memberMapper.selectOne(mqw);
|
|
|
+
|
|
|
+ if (member != null) {
|
|
|
+ int currentPoints = member.getSystemPoints() != null ? member.getSystemPoints() : 0;
|
|
|
+ member.setSystemPoints(currentPoints + cfReward);
|
|
|
+ memberMapper.updateById(member);
|
|
|
+ }
|
|
|
+
|
|
|
+ result.put("success", true);
|
|
|
+ result.put("orderId", order.getId());
|
|
|
+ result.put("cfReward", cfReward);
|
|
|
+ result.put("daysRemaining", 7);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> getRenewalInfo(Long userId) {
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+
|
|
|
+ LambdaQueryWrapper<FamilyMember> qw = new LambdaQueryWrapper<>();
|
|
|
+ qw.select(FamilyMember::getSystemPoints, FamilyMember::getFamilyId)
|
|
|
+ .eq(FamilyMember::getUserId, userId)
|
|
|
+ .last("LIMIT 1");
|
|
|
+ FamilyMember member = memberMapper.selectOne(qw);
|
|
|
+
|
|
|
+ int cfBalance = member != null && member.getSystemPoints() != null ? member.getSystemPoints() : 0;
|
|
|
+ int discount = Math.min(cfBalance, 19900);
|
|
|
+
|
|
|
+ result.put("success", true);
|
|
|
+ result.put("cfBalance", cfBalance);
|
|
|
+ result.put("discount", discount);
|
|
|
+ result.put("payAmount", 199900 - discount);
|
|
|
+ result.put("discountPercent", cfBalance >= 19900 ? 100 : Math.round((double)discount / 19900 * 100));
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> processRenewal(Long userId, Long familyId, Integer amount) {
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+
|
|
|
+ LambdaQueryWrapper<PurchaseOrder> qw = new LambdaQueryWrapper<>();
|
|
|
+ qw.eq(PurchaseOrder::getUserId, userId)
|
|
|
+ .eq(PurchaseOrder::getStatus, "paid")
|
|
|
+ .last("LIMIT 1");
|
|
|
+ PurchaseOrder existingOrder = orderMapper.selectOne(qw);
|
|
|
+
|
|
|
+ if (existingOrder == null) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("message", "无有效购买记录");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ existingOrder.setIsEarlyRenewal(1);
|
|
|
+ orderMapper.updateById(existingOrder);
|
|
|
+
|
|
|
+ String orderNo = "HR" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 6).toUpperCase();
|
|
|
+ PurchaseOrder renewalOrder = new PurchaseOrder();
|
|
|
+ renewalOrder.setOrderNo(orderNo);
|
|
|
+ renewalOrder.setUserId(userId);
|
|
|
+ renewalOrder.setFamilyId(familyId);
|
|
|
+ renewalOrder.setAmount(amount);
|
|
|
+ renewalOrder.setStatus("paid");
|
|
|
+ renewalOrder.setPaymentMethod("external");
|
|
|
+ renewalOrder.setStartDate(new Date());
|
|
|
+ java.time.LocalDateTime endDate = java.time.LocalDateTime.now().plusYears(1);
|
|
|
+ renewalOrder.setEndDate(java.sql.Timestamp.valueOf(endDate));
|
|
|
+ renewalOrder.setIsEarlyRenewal(1);
|
|
|
+ orderMapper.insert(renewalOrder);
|
|
|
+
|
|
|
+ LambdaQueryWrapper<FamilyMembership> memQw = new LambdaQueryWrapper<>();
|
|
|
+ memQw.eq(FamilyMembership::getFamilyId, familyId);
|
|
|
+ FamilyMembership membership = membershipMapper.selectOne(memQw);
|
|
|
+
|
|
|
+ if (membership == null) {
|
|
|
+ membership = new FamilyMembership();
|
|
|
+ membership.setFamilyId(familyId);
|
|
|
+ membership.setLevelCode("FAMILY");
|
|
|
+ membership.setStartDate(new Date());
|
|
|
+ }
|
|
|
+ membership.setEndDate(java.sql.Timestamp.valueOf(endDate));
|
|
|
+ membership.setPaymentStatus("paid");
|
|
|
+ membership.setOrderNo(orderNo);
|
|
|
+ membershipMapper.insert(membership);
|
|
|
+
|
|
|
+ result.put("success", true);
|
|
|
+ result.put("orderNo", orderNo);
|
|
|
+ result.put("membershipValid", true);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+}
|