zoujiajian 1 rok temu
rodzic
commit
1c117021e5

+ 12 - 0
netflix-dao/src/main/java/com/cyksj/model/views/CmsVipOrderDonView.java

@@ -90,4 +90,16 @@ public class CmsVipOrderDonView {
 
 	@DbField("o.created_time")
 	private Date createdTime;
+
+	/**
+	 * 银河币
+	 */
+	@DbIgnore
+	private BigDecimal galaxyCoin;
+
+	/**
+	 * 银河币抵扣金额
+	 */
+	@DbIgnore
+	private BigDecimal galaxyCoinDeductMoney;
 }

+ 53 - 0
netflix-service/src/main/java/com/cyksj/service/coin/impl/UserGalaxyCoinServiceImpl.java

@@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 项目名: yhlxj
@@ -145,6 +146,45 @@ public class UserGalaxyCoinServiceImpl implements UserGalaxyCoinService {
 			BigDecimal galaxyCoin = userGalaxyCoinRecord.getGalaxyCoin();
 			//扣除记录 对应的银河币不可用
 			log.info("订单退款,扣除该笔订单oid:{}返现的银河币", orderId);
+			BigDecimal remainGalaxyCoin = userGalaxyCoinRecord.getRemainGalaxyCoin();
+			//扣除其他
+			if (remainGalaxyCoin.compareTo(galaxyCoin) < 0) {
+				//银河币抵扣
+				List<UserGalaxyCoinRecord> availableGalaxyCoinList = userGalaxyCoinRecordMapper.selectList(Wrappers.lambdaQuery(UserGalaxyCoinRecord.class)
+						.eq(UserGalaxyCoinRecord::getUserId, userGalaxyCoinRecord.getUserId())
+						.eq(UserGalaxyCoinRecord::getIsUsed, Boolean.FALSE)
+						.gt(UserGalaxyCoinRecord::getExpiryTime, DateTime.now())
+						.gt(UserGalaxyCoinRecord::getRemainGalaxyCoin, 0));
+				//需要使用的银河币
+				BigDecimal userFinalUseGalaxyCoin = galaxyCoin.subtract(remainGalaxyCoin);
+				for (UserGalaxyCoinRecord galaxyCoinRecord : availableGalaxyCoinList) {
+					if (userFinalUseGalaxyCoin.compareTo(BigDecimal.ZERO) <= 0) {
+						break;
+					}
+					BigDecimal thisRemainGalaxyCoin = galaxyCoinRecord.getRemainGalaxyCoin();
+					Long galaxyCoinRecordId = galaxyCoinRecord.getId();
+					//扣完
+					if (thisRemainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) == 0) {
+						//完全抵扣
+						Integer update = deductUserGalaxyCoin(galaxyCoinRecordId, remainGalaxyCoin, remainGalaxyCoin, true);
+						if (update == 1) {
+							userFinalUseGalaxyCoin = BigDecimal.ZERO;
+						}
+					} else if (thisRemainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) < 0) {
+						//不足以抵扣
+						Integer update = deductUserGalaxyCoin(galaxyCoinRecordId, remainGalaxyCoin, remainGalaxyCoin, true);
+						if (update == 1) {
+							userFinalUseGalaxyCoin = userFinalUseGalaxyCoin.subtract(remainGalaxyCoin);
+						}
+					} else if (thisRemainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) > 0) {
+						//足以抵扣
+						Integer update = deductUserGalaxyCoin(galaxyCoinRecordId, userFinalUseGalaxyCoin, remainGalaxyCoin, false);
+						if (update == 1) {
+							userFinalUseGalaxyCoin = BigDecimal.ZERO;
+						}
+					}
+				}
+			}
 			sendGalaxyCoinHandle(userGalaxyCoinRecord.getUserId(), orderId, galaxyCoin.negate().intValue(), PointsRecordConst.ORDER_REFUND_SUB, true, false, source);
 			userGalaxyCoinRecord.setIsUsed(Boolean.TRUE);
 			userGalaxyCoinRecordMapper.updateById(userGalaxyCoinRecord);
@@ -181,4 +221,17 @@ public class UserGalaxyCoinServiceImpl implements UserGalaxyCoinService {
 	public void sendOrderGalaxyCloseOrder(Long orderId, Long userId, BigDecimal galaxyCoin, OrderDonGalaxyCoinRecord.Source source) {
 		sendGalaxyCoinHandle(userId, orderId, galaxyCoin.intValue(), PointsRecordConst.ORDER_CLOSE, true, true, source);
 	}
+
+	private Integer deductUserGalaxyCoin(Long galaxyCoinRecordId, BigDecimal deductGalaxyCoin, BigDecimal remainGalaxyCoin, boolean isUsed) {
+		Integer update = userGalaxyCoinRecordMapper.update(null, Wrappers.lambdaUpdate(UserGalaxyCoinRecord.class)
+				.set(UserGalaxyCoinRecord::getRemainGalaxyCoin, remainGalaxyCoin.subtract(deductGalaxyCoin))
+				.set(isUsed, UserGalaxyCoinRecord::getIsUsed, isUsed)
+				.eq(UserGalaxyCoinRecord::getId, galaxyCoinRecordId)
+				.eq(UserGalaxyCoinRecord::getIsUsed, Boolean.FALSE)
+				.eq(UserGalaxyCoinRecord::getRemainGalaxyCoin, remainGalaxyCoin));
+		if (update == 0) {
+			log.info("此次扣除银河币错误,继续扣除");
+		}
+		return update;
+	}
 }

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/VipOrderDonServiceImpl.java

@@ -160,6 +160,13 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
 		/* 生成订单 */
 		String donNo = SEQUENCE.nextId().toString();
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		Integer selectCount = this.count(Wrappers.lambdaQuery(VipOrderDon.class)
+				.in(VipOrderDon::getUserId, userIdList)
+				.eq(VipOrderDon::getStatus, VipOrderDon.Status.noPayment));
+		if (selectCount > 0) {
+			throw BusinessRuntimeException.getInstance("您存在待支付的会员订单");
+		}
 		VipOrderDon orderDon = new VipOrderDon();
 		orderDon.setOrderNo(donNo);
 		orderDon.setOpenId(user.getOpenId());
@@ -279,6 +286,12 @@ public class VipOrderDonServiceImpl extends ServiceImpl<VipOrderDonMapper, VipOr
 		if (selectCount == 0) {
 			throw BusinessRuntimeException.getInstance("您会员已过期,无法续费");
 		}
+		Integer noPayOrderCount = this.count(Wrappers.lambdaQuery(VipOrderDon.class)
+				.in(VipOrderDon::getUserId, userIdList)
+				.eq(VipOrderDon::getStatus, VipOrderDon.Status.noPayment));
+		if (noPayOrderCount > 0) {
+			throw BusinessRuntimeException.getInstance("您存在待支付的会员订单");
+		}
 		/* 生成订单 */
 		String donNo = SEQUENCE.nextId().toString();
 		VipOrderDon orderDon = new VipOrderDon();

+ 12 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/vip/CmsVipController.java

@@ -1,9 +1,12 @@
 package com.cyksj.web.controller.manage.vip;
 
 import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.OrderDonGalaxyCoinRecordMapper;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
+import com.cyksj.model.entity.OrderDonGalaxyCoinRecord;
 import com.cyksj.model.entity.VipGoodsSku;
 import com.cyksj.model.request.OrderRefundReq;
 import com.cyksj.model.views.CmsVipOrderDonView;
@@ -43,6 +46,8 @@ public class CmsVipController {
 
 	private final VipCommonService vipCommonService;
 
+	private final OrderDonGalaxyCoinRecordMapper orderDonGalaxyCoinRecordMapper;
+
 	/**
 	 * 会员订单列表
 	 */
@@ -54,6 +59,13 @@ public class CmsVipController {
 				Optional.ofNullable(channelPopularizeMapper.selectChannelByPid(data.getPopularizeId()))
 						.ifPresent(channelName -> data.setChannel(channelName));
 			}
+			OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = orderDonGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonGalaxyCoinRecord.class)
+					.eq(OrderDonGalaxyCoinRecord::getOrderId, data.getId())
+					.last("limit 1"));
+			if (orderDonGalaxyCoinRecord != null) {
+				data.setGalaxyCoin(orderDonGalaxyCoinRecord.getGalaxyCoin());
+				data.setGalaxyCoinDeductMoney(orderDonGalaxyCoinRecord.getDeductMoney());
+			}
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}

+ 17 - 0
netflix-web/src/main/java/com/cyksj/web/controller/vip/VipUserOrderController.java

@@ -18,7 +18,9 @@ import com.cyksj.service.paypal.PaypalV2Service;
 import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import com.paypal.api.payments.Links;
 import com.paypal.api.payments.Payment;
@@ -109,6 +111,21 @@ public class VipUserOrderController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(order);
 	}
 
+	/**
+	 * 订单列表
+	 */
+	@GetMapping("/get/orders")
+	public Result<SearchResult<VipOrderDon>> list(){
+		long userId = StpUserUtil.getLoginIdAsLong();
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		List<Long> userIds = userBindRelationService.getRelationUserIdList(userId, null);
+		SearchResult<VipOrderDon> search = beanSearcher.search(VipOrderDon.class, builder
+				.field(VipOrderDon::getUserId, userIds).op(Operator.InList)
+				.orderBy(VipOrderDon::getId).desc()
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
 
 
 	/**