|
|
@@ -1,13 +1,25 @@
|
|
|
package com.dataeasy.server.service.manager.impl;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
import java.util.Optional;
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
+import com.dataeasy.server.atomic.entity.SubscriptionUserConfig;
|
|
|
+import com.dataeasy.server.atomic.entity.SubscriptionUserLog;
|
|
|
+import com.dataeasy.server.atomic.service.ISubscriptionUserLogService;
|
|
|
+import com.dataeasy.server.common.utils.Assert;
|
|
|
+import com.dataeasy.server.constant.CacheNameConstant;
|
|
|
+import com.dataeasy.server.constant.PaidOptionEnum;
|
|
|
+import com.dataeasy.server.constant.PushOptionEnum;
|
|
|
+import com.dataeasy.server.pojo.subscription.SubscriptionUserConfigQuery;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
+import org.springframework.cache.CacheManager;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
@@ -36,6 +48,7 @@ import com.github.binarywang.wxpay.exception.WxPayException;
|
|
|
import com.github.binarywang.wxpay.service.WxPayService;
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
/**
|
|
|
* @author tyuio
|
|
|
@@ -78,6 +91,12 @@ public class OrderManagerImpl implements IOrderManager {
|
|
|
@Autowired
|
|
|
private WxPayService wxPayService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ISubscriptionUserLogService subscriptionUserLogService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CacheManager cacheManager;
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public WxPayUnifiedOrderV3Result.JsapiResult createOrder(SubscriptionOrderRequest request) throws WxPayException {
|
|
|
@@ -104,6 +123,10 @@ public class OrderManagerImpl implements IOrderManager {
|
|
|
|
|
|
User user = Optional.ofNullable(userService.getById(UserUtils.getCurrentUserId())).orElseThrow(() -> BusinessException.fail("找不到当前用户的信息"));
|
|
|
|
|
|
+ // 设置订单的过期时间
|
|
|
+ LocalDateTime expireDateTime = LocalDateTime.now().plusMinutes(bizProperties.getOrderExpire());
|
|
|
+ String timeExpire = expireDateTime.format(DateUtils.YYYYMMDDTHHMMSS_OFFSET_ZONE_FORMATTER);
|
|
|
+
|
|
|
// 订单记录
|
|
|
SubscriptionOrder subscriptionOrder = new SubscriptionOrder();
|
|
|
subscriptionOrder.setUserId(UserUtils.getCurrentUserId());
|
|
|
@@ -113,6 +136,7 @@ public class OrderManagerImpl implements IOrderManager {
|
|
|
subscriptionOrder.setSubscriptionDuration(subscriptionPlan.getSubscriptionDuration());
|
|
|
subscriptionOrder.setPaymentStatus(PaymentStatusEnum.NOTPAY);
|
|
|
subscriptionOrder.setOrderNo(generateOrderNo(OrderTypeEnum.SOO));
|
|
|
+ subscriptionOrder.setCloseTime(expireDateTime);
|
|
|
subscriptionOrderService.insert(subscriptionOrder);
|
|
|
|
|
|
// 设置金额,微信的单位为分,因此先转换成分
|
|
|
@@ -124,10 +148,6 @@ public class OrderManagerImpl implements IOrderManager {
|
|
|
WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();
|
|
|
payer.setOpenid(user.getMaOpenId());
|
|
|
|
|
|
- // 设置订单的过期时间
|
|
|
- LocalDateTime expireDateTime = LocalDateTime.now().plusMinutes(bizProperties.getOrderExpire());
|
|
|
- String timeExpire = expireDateTime.format(DateUtils.YYYYMMDDTHHMMSS_OFFSET_ZONE_FORMATTER);
|
|
|
-
|
|
|
// 发送到微信的报文
|
|
|
WxPayUnifiedOrderV3Request wxOrderV3 = new WxPayUnifiedOrderV3Request();
|
|
|
wxOrderV3.setDescription(String.format("%s-%s天", subscriptionSource.getTitle(), subscriptionPlan.getSubscriptionDuration()));
|
|
|
@@ -155,4 +175,82 @@ public class OrderManagerImpl implements IOrderManager {
|
|
|
}
|
|
|
return String.format("%s%03d", orderPrefix, orderNoSequence.getAndIncrement());
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void successHandler(String orderNo, String transactionId) {
|
|
|
+ Assert.isNullInBusiness(orderNo, "请传入有效的订单号");
|
|
|
+ // 查找订单
|
|
|
+ SubscriptionOrder subscriptionOrder =
|
|
|
+ Optional.ofNullable(subscriptionOrderService.getByOrderNo(orderNo)).orElseThrow(
|
|
|
+ () -> BusinessException.fail(String.format("根据订单号:{} 查找不到订单", orderNo)));
|
|
|
+
|
|
|
+ // 防止重复处理
|
|
|
+ if (!PaymentStatusEnum.NOTPAY.equals(subscriptionOrder.getPaymentStatus())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找订阅源
|
|
|
+ SubscriptionSource subscriptionSource = Optional.ofNullable(subscriptionSourceService.getById(subscriptionOrder.getSubscriptionSourceId())).orElseThrow(
|
|
|
+ () -> BusinessException.fail(String.format("根据订单号:{} 查找不到订阅源", orderNo)));
|
|
|
+
|
|
|
+ // 查询用户历史配置
|
|
|
+ SubscriptionUserConfigQuery subscriptionUserConfigQuery = new SubscriptionUserConfigQuery();
|
|
|
+ subscriptionUserConfigQuery.setUserId(subscriptionOrder.getUserId());
|
|
|
+ subscriptionUserConfigQuery.setSubscriptionSourceCodeList(Arrays.asList(subscriptionSource.getCode()));
|
|
|
+ subscriptionUserConfigQuery.setCurrentDate(LocalDate.now());
|
|
|
+ List<SubscriptionUserConfig> subscriptionUserConfigList = subscriptionUserConfigService.getByCondition(subscriptionUserConfigQuery);
|
|
|
+ if (!CollectionUtils.isEmpty(subscriptionUserConfigList) && subscriptionUserConfigList.size() > 1) {
|
|
|
+ BusinessException.throwFail(String.format("根据订单号:{} 用户对同一个订阅源存在多个配置,无法完成支付订单的配置", orderNo));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新订单状态
|
|
|
+ SubscriptionOrder updateSubscriptionOrder = new SubscriptionOrder();
|
|
|
+ updateSubscriptionOrder.setId(subscriptionOrder.getId());
|
|
|
+ updateSubscriptionOrder.setTransactionId(transactionId);
|
|
|
+ updateSubscriptionOrder.setPaymentStatus(PaymentStatusEnum.SUCCESS);
|
|
|
+ subscriptionOrderService.updateById(updateSubscriptionOrder);
|
|
|
+
|
|
|
+ // 设置月日志
|
|
|
+ SubscriptionUserLog subscriptionUserLog = new SubscriptionUserLog();
|
|
|
+ subscriptionUserLog.setUserId(subscriptionOrder.getUserId());
|
|
|
+ subscriptionUserLog.setSubscriptionOrderId(subscriptionOrder.getId());
|
|
|
+ subscriptionUserLog.setPaidOption(PaidOptionEnum.PAID);
|
|
|
+
|
|
|
+ // 不存在历史配置,则新创建用户配置,否则在原有配置上更新数据
|
|
|
+ if (CollectionUtils.isEmpty(subscriptionUserConfigList)) {
|
|
|
+ LocalDate startDate = LocalDate.now();
|
|
|
+ LocalDate endDate = startDate.plusDays(subscriptionOrder.getSubscriptionDuration());
|
|
|
+ SubscriptionUserConfig addSubscriptionUserConfig = new SubscriptionUserConfig();
|
|
|
+ addSubscriptionUserConfig.setPushOption(PushOptionEnum.ENABLED);
|
|
|
+ addSubscriptionUserConfig.setUserId(subscriptionOrder.getUserId());
|
|
|
+ addSubscriptionUserConfig.setSubscriptionSourceCode(subscriptionSource.getCode());
|
|
|
+ addSubscriptionUserConfig.setStartDate(LocalDate.now());
|
|
|
+ addSubscriptionUserConfig.setEndDate(endDate);
|
|
|
+ subscriptionUserConfigService.insert(addSubscriptionUserConfig);
|
|
|
+
|
|
|
+ subscriptionUserLog.setStartDate(addSubscriptionUserConfig.getStartDate());
|
|
|
+ subscriptionUserLog.setAfterEndDate(addSubscriptionUserConfig.getEndDate());
|
|
|
+ } else {
|
|
|
+ // 历史配置
|
|
|
+ SubscriptionUserConfig subscriptionUserConfig = subscriptionUserConfigList.get(0);
|
|
|
+ // 结束时间延期
|
|
|
+ LocalDate endDate = subscriptionUserConfig.getEndDate().plusDays(subscriptionOrder.getSubscriptionDuration());
|
|
|
+
|
|
|
+ SubscriptionUserConfig updateSubscriptionUserConfig = new SubscriptionUserConfig();
|
|
|
+ updateSubscriptionUserConfig.setId(subscriptionUserConfig.getId());
|
|
|
+ updateSubscriptionUserConfig.setEndDate(endDate);
|
|
|
+ subscriptionUserConfigService.updateById(updateSubscriptionUserConfig);
|
|
|
+
|
|
|
+ subscriptionUserLog.setStartDate(subscriptionUserConfig.getStartDate());
|
|
|
+ subscriptionUserLog.setBeforeEndDate(subscriptionUserConfig.getEndDate());
|
|
|
+ subscriptionUserLog.setAfterEndDate(updateSubscriptionUserConfig.getEndDate());
|
|
|
+ }
|
|
|
+
|
|
|
+ subscriptionUserLogService.insert(subscriptionUserLog);
|
|
|
+
|
|
|
+ // 清除缓存
|
|
|
+ cacheManager.getCache(CacheNameConstant.SUBSCRIPTION_USER_CONFIG_LIST).evict(subscriptionOrder.getUserId());
|
|
|
+
|
|
|
+ }
|
|
|
}
|