Bläddra i källkod

重构银河币抵现

zoujiajian 1 år sedan
förälder
incheckning
5990af1355
30 ändrade filer med 522 tillägg och 120 borttagningar
  1. 10 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 6 0
      netflix-common/src/main/java/com/cyksj/common/constant/PointsRecordConst.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/OrderDonGalaxyCoinRecordMapper.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserGalaxyCoinRecordMapper.java
  5. 2 2
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  6. 0 32
      netflix-dao/src/main/java/com/cyksj/mapper/market/sign/UserPointsRecordMapper.java
  7. 20 0
      netflix-dao/src/main/java/com/cyksj/model/dto/GalaxyCoinConsumeRateDto.java
  8. 31 0
      netflix-dao/src/main/java/com/cyksj/model/dto/GalaxyCoinPayConfigDto.java
  9. 6 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  10. 28 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonGalaxyCoinRecord.java
  11. 4 1
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  12. 40 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserGalaxyCoinRecord.java
  13. 0 15
      netflix-dao/src/main/java/com/cyksj/model/entity/UserPointsRecord.java
  14. 3 3
      netflix-dao/src/main/java/com/cyksj/model/manage/views/MaliceUserView.java
  15. 12 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java
  16. 3 3
      netflix-dao/src/main/java/com/cyksj/model/manage/views/UserView.java
  17. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  18. 2 2
      netflix-dao/src/main/java/com/cyksj/model/views/UserPersonalView.java
  19. 18 0
      netflix-service/src/main/java/com/cyksj/service/coin/UserGalaxyCoinService.java
  20. 106 0
      netflix-service/src/main/java/com/cyksj/service/coin/impl/UserGalaxyCoinServiceImpl.java
  21. 16 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  22. 0 5
      netflix-service/src/main/java/com/cyksj/service/market/MarketFrontService.java
  23. 12 26
      netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java
  24. 0 2
      netflix-service/src/main/java/com/cyksj/service/market/task/TaskService.java
  25. 3 17
      netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java
  26. 151 3
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  27. 9 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java
  28. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/market/LuckyDrawFrontController.java
  29. 7 7
      netflix-web/src/main/java/com/cyksj/web/controller/market/SignFrontController.java
  30. 1 1
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

+ 10 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -616,4 +616,14 @@ public interface Constant {
 	 * 异常奈飞车票更换其他规格key
 	 */
 	String ERROR_NETFLIX_CHANGE_OTHER_SKU_KEY = "error_netflix_change_other_sku_key";
+
+	/**
+	 * 银河币消费返回比例
+	 */
+	String GALAXY_COIN_CONSUME_RETURN_RATE_KEY = "galaxy_coin_consume_return_rate_key";
+
+	/**
+	 * 银河币消费支付抵扣key
+	 */
+	String GALAXY_COIN_PAY_DEDUCT_KEY = "galaxy_coin_pay_deduct_key";
 }

+ 6 - 0
netflix-common/src/main/java/com/cyksj/common/constant/PointsRecordConst.java

@@ -8,4 +8,10 @@ public interface PointsRecordConst {
 	String POINTS_LOTTERY = "积分抽奖";
 
 	String TASK = "任务奖励";
+
+	String ORDER_CASHBACK = "下单返现";
+
+	String ORDER = "下单";
+
+	String ORDER_REFUND = "订单退款";
 }

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/OrderDonGalaxyCoinRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.OrderDonGalaxyCoinRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderDonGalaxyCoinRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/7/7 12:21
+ */
+public interface OrderDonGalaxyCoinRecordMapper extends BaseMapper<OrderDonGalaxyCoinRecord> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserGalaxyCoinRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserGalaxyCoinRecord;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserGalaxyCoinRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/7/7 15:19
+ */
+public interface UserGalaxyCoinRecordMapper extends BaseMapper<UserGalaxyCoinRecord> {
+}

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java

@@ -28,8 +28,8 @@ public interface UserMapper extends BaseMapper<User> {
     @Update("update user set points = points + #{addPoints} where id = #{id} and points = #{originalPoints}")
     Integer updatePoints(@Param("id") Long id, @Param("originalPoints") BigDecimal originalPoints, @Param("addPoints") BigDecimal addPoints);
 
-    @Update("update user set active_points = active_points - #{subPoints} where active_points > 0 and active_points >= #{subPoints} and id = #{userId}")
-    Integer subActivePoints(@Param("userId") Long userId, @Param("subPoints") BigDecimal subPoints);
+    @Update("update user set galaxy_coin = galaxy_coin - #{subGalaxyCoin} where galaxy_coin = #{userGalaxyCoin} and galaxy_coin >= #{subPoints} and id = #{userId}")
+    Integer subUserGalaxyCoin(@Param("userId") Long userId, @Param("subGalaxyCoin") BigDecimal subGalaxyCoin, @Param("userGalaxyCoin") BigDecimal userGalaxyCoin);
 
     @Select("select id from user where nickname like concat('%',#{nickname},'%')")
     List<Long> selectListByNickname(String nickname);

+ 0 - 32
netflix-dao/src/main/java/com/cyksj/mapper/market/sign/UserPointsRecordMapper.java

@@ -1,32 +0,0 @@
-package com.cyksj.mapper.market.sign;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.cyksj.model.entity.UserPointsRecord;
-import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Select;
-import org.apache.ibatis.annotations.Update;
-
-import java.util.Date;
-
-public interface UserPointsRecordMapper extends BaseMapper<UserPointsRecord> {
-	@Update("update user set active_points = active_points + #{points} where id = #{userId}")
-	void updateUserPoints(@Param("userId") Long userId, @Param("points") Integer points);
-
-	@Select("select ifnull(sum(points),0) from user_points_record ur where created_time between #{yesZeroDate} and #{thisZeroDate} and points > 0")
-	Integer getTodayNumOfPoints(@Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
-
-	@Select("select ifnull(sum(points),0) from user_points_record ur where points > 0")
-	Integer getSumOfPoints();
-
-	@Select("select ifnull(sum(points),0) from user_points_record ur where created_time between #{yesZeroDate} and #{thisZeroDate} and points < 0")
-	Integer getTodayUseOfPoints(@Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
-
-	@Select("select ifnull(sum(points),0) from user_points_record ur where points < 0")
-	Integer getSumUseOfPoints();
-
-	@Select("select count(*) from user_points_record ur where created_time between #{yesZeroDate} and #{thisZeroDate} and points < 0 and remark = #{remark}")
-	Integer getTodayNumOfLottery(@Param("remark") String remark, @Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
-
-	@Select("select count(*) from sign_user where update_time between #{yesZeroDate} and #{thisZeroDate} and day_period = #{dayPeriod}")
-	Integer getSignDayByCondition(@Param("dayPeriod") Integer dayPeriod, @Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
-}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/GalaxyCoinConsumeRateDto.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GalaxyCoinConsumeRateDto
+ * 创建者: JavaZou
+ * 创建时间:2025/7/1 11:54
+ */
+@Getter
+@Setter
+public class GalaxyCoinConsumeRateDto {
+	private BigDecimal money;
+
+	private BigDecimal galaxyCoin;
+}

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/GalaxyCoinPayConfigDto.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GalaxyCoinPayConfigDto
+ * 创建者: JavaZou
+ * 创建时间:2025/7/1 17:45
+ */
+@Getter
+@Setter
+public class GalaxyCoinPayConfigDto {
+	/**
+	 * 按多以银河币抵扣
+	 */
+	private BigDecimal galaxyCoin;
+
+	/**
+	 * 抵扣比例金额
+	 */
+	private BigDecimal money;
+
+	/**
+	 * 最多可抵扣商品总价的比例
+	 */
+	private BigDecimal maxRate;
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -247,6 +247,11 @@ public class OrderDon extends BaseEntity implements Serializable {
      */
     private BigDecimal balance;
 
+    /**
+     * 银河币支付
+     */
+    private BigDecimal galaxyCoin;
+
     /**
      * 付款说明
      */
@@ -343,6 +348,7 @@ public class OrderDon extends BaseEntity implements Serializable {
         EQUIPMENT("equipment", "实物设备分销"),
         PAY_EQUIPMENT("pay_equipment", "自购设备"),
         BALANCE("balance", "余额支付"),
+        GALAXY_COIN("galaxy_coin","银河币支付"),
         PAYPAL("paypal","paypal支付"),
         STRIPE("stripe","stripe支付"),
         TICKET_REPLACE("ticket_replace", "车票替换"),

+ 28 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDonGalaxyCoinRecord.java

@@ -0,0 +1,28 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: OrderDonGalaxyCoinRecord
+ * 创建者: JavaZou
+ * 创建时间:2025/7/7 12:20
+ */
+@Getter
+@Setter
+public class OrderDonGalaxyCoinRecord extends BaseEntity{
+	private Long orderId;
+
+	private String orderNo;
+
+	private Long userId;
+
+	private BigDecimal galaxyCoin;
+
+	private BigDecimal deductMoney;
+
+	private BigDecimal refundGalaxyCoin;
+}

+ 4 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/User.java

@@ -55,7 +55,10 @@ public class User extends BaseEntity implements Serializable{
 
     private BigDecimal points;
 
-    private BigDecimal activePoints;
+    /**
+     * 银河币
+     */
+    private BigDecimal galaxyCoin;
 
     /**
      * 余额 分

+ 40 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserGalaxyCoinRecord.java

@@ -0,0 +1,40 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserGalaxyCoinRecord
+ * 创建者: JavaZou
+ * 创建时间:2025/7/7 15:14
+ */
+@Getter
+@Setter
+public class UserGalaxyCoinRecord extends BaseEntity{
+	private Long userId;
+
+	private Long orderId;
+
+	private BigDecimal galaxyCoin;
+
+	/**
+	 * 剩余可用银河币
+	 */
+	private BigDecimal remainGalaxyCoin;
+
+	/**
+	 * 是否已使用
+	 */
+	private Boolean isUsed;
+
+	/**
+	 * 过期时间
+	 */
+	private Date expiryTime;
+
+	private String remark;
+}

+ 0 - 15
netflix-dao/src/main/java/com/cyksj/model/entity/UserPointsRecord.java

@@ -1,15 +0,0 @@
-package com.cyksj.model.entity;
-
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class UserPointsRecord extends BaseEntity{
-    private Long userId;
-
-    private Integer points;
-
-    private String remark;
-}

+ 3 - 3
netflix-dao/src/main/java/com/cyksj/model/manage/views/MaliceUserView.java

@@ -83,10 +83,10 @@ public class MaliceUserView {
 	private String email;
 
 	/**
-	 * 活跃抽奖积分
+	 * 银河币
 	 */
-	@DbField("u.active_points")
-	private BigDecimal activePoints;
+	@DbField("u.galaxy_coin")
+	private BigDecimal galaxyCoin;
 
 	@DbField("u.register_env")
 	private String registerEnv;

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

@@ -129,6 +129,18 @@ public class OrderDonBackView {
 	@DbField("o.refund_money")
 	private BigDecimal refundMoney;
 
+	/**
+	 * 银河币
+	 */
+	@DbIgnore
+	private BigDecimal galaxyCoin;
+
+	/**
+	 * 银河币抵扣金额
+	 */
+	@DbIgnore
+	private BigDecimal galaxyCoinDeductMoney;
+
 	@DbField("o.refund_balance")
 	private BigDecimal refundBalance;
 

+ 3 - 3
netflix-dao/src/main/java/com/cyksj/model/manage/views/UserView.java

@@ -83,10 +83,10 @@ public class UserView {
     private String email;
 
     /**
-     * 活跃抽奖积分
+     * 银河币
      */
-    @DbField("u.active_points")
-    private BigDecimal activePoints;
+    @DbField("u.galaxy_coin")
+    private BigDecimal galaxyCoin;
 
     @DbField("u.register_env")
     private String registerEnv;

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -107,6 +107,11 @@ public class OrderPayRequest {
      */
     private BigDecimal balance;
 
+    /**
+     * 银河币支付
+     */
+    private BigDecimal galaxyCoin;
+
     private String callback;
 
     private String callbackType;

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/model/views/UserPersonalView.java

@@ -30,9 +30,9 @@ public class UserPersonalView {
 	private Integer numOfTickets;
 
 	/**
-	 * 我的积分
+	 * 我的银河币
 	 */
-	private BigDecimal activePoints;
+	private BigDecimal galaxyCoin;
 
 	/**
 	 * 我的余额

+ 18 - 0
netflix-service/src/main/java/com/cyksj/service/coin/UserGalaxyCoinService.java

@@ -0,0 +1,18 @@
+package com.cyksj.service.coin;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserGalaxyCoinService
+ * 创建者: JavaZou
+ * 创建时间:2025/7/1 15:29
+ */
+public interface UserGalaxyCoinService {
+
+	void sendGalaxyCoinRecord(Long userId, Integer galaxyCoin, String remark, Boolean isLottery);
+
+	void recordUseRecord(Long orderId, Long userId, BigDecimal galaxyCoin, String remark);
+
+	void recordOrderRefundGalaxyCoinIfValid(Long orderId, Long userId, BigDecimal galaxyCoin);
+}

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

@@ -0,0 +1,106 @@
+package com.cyksj.service.coin.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.PointsRecordConst;
+import com.cyksj.mapper.UserGalaxyCoinRecordMapper;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.entity.UserGalaxyCoinRecord;
+import com.cyksj.service.coin.UserGalaxyCoinService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: UserGalaxyCoinServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2025/7/1 15:29
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class UserGalaxyCoinServiceImpl implements UserGalaxyCoinService {
+	private final UserGalaxyCoinRecordMapper userGalaxyCoinRecordMapper;
+
+	private final UserMapper userMapper;
+
+	@Override
+	public void sendGalaxyCoinRecord(Long userId, Integer galaxyCoin, String remark, Boolean isLottery) {
+		if (!isLottery) {
+			while (true) {
+				User user = userMapper.selectById(userId);
+				if (user == null) {
+					log.error("用户:{}不存在,无法发送银河币", userId);
+					break;
+				}
+				BigDecimal userGalaxyCoin = user.getGalaxyCoin();
+				int update = userMapper.update(null, Wrappers.lambdaUpdate(User.class)
+						.set(User::getGalaxyCoin, userGalaxyCoin.add(BigDecimal.valueOf(galaxyCoin)))
+						.eq(User::getId, user.getId())
+						.eq(User::getGalaxyCoin, userGalaxyCoin));
+				if (update == 1) {
+					recordSendGalaxyCoin(userId, galaxyCoin, remark);
+					break;
+				}
+			}
+		}
+	}
+
+	/**
+	 * 记录银河币详情
+	 */
+	@Override
+	public void recordUseRecord(Long orderId, Long userId, BigDecimal galaxyCoin, String remark) {
+		UserGalaxyCoinRecord userGalaxyCoinRecord = new UserGalaxyCoinRecord();
+		userGalaxyCoinRecord.setOrderId(orderId);
+		userGalaxyCoinRecord.setUserId(userId);
+		userGalaxyCoinRecord.setGalaxyCoin(galaxyCoin);
+		userGalaxyCoinRecord.setRemainGalaxyCoin(userGalaxyCoinRecord.getGalaxyCoin());
+		//退款类型
+		if (StrUtil.equals(PointsRecordConst.ORDER_REFUND, remark)) {
+			//90天
+			userGalaxyCoinRecord.setExpiryTime(DateUtil.offsetDay(DateTime.now(), 90));
+		} else {
+			//年底失效
+			userGalaxyCoinRecord.setExpiryTime(DateUtil.endOfYear(DateTime.now()));
+		}
+		//下单 标记该笔银河币记录为已使用
+		if (StrUtil.equals(PointsRecordConst.ORDER, remark)) {
+			userGalaxyCoinRecord.setIsUsed(Boolean.TRUE);
+			//下单时,剩余是0
+			userGalaxyCoinRecord.setRemainGalaxyCoin(BigDecimal.ZERO);
+		}
+		userGalaxyCoinRecord.setRemark(remark);
+		userGalaxyCoinRecordMapper.insert(userGalaxyCoinRecord);
+	}
+
+	@Override
+	public void recordOrderRefundGalaxyCoinIfValid(Long orderId, Long userId, BigDecimal galaxyCoin) {
+		UserGalaxyCoinRecord userGalaxyCoinRecord = userGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(UserGalaxyCoinRecord.class)
+				.eq(UserGalaxyCoinRecord::getOrderId, orderId)
+				.eq(UserGalaxyCoinRecord::getRemark, PointsRecordConst.ORDER)
+				.last("limit 1"));
+		if (userGalaxyCoinRecord == null) {
+			log.info("订单:{}银河币使用记录不存在", orderId);
+			return;
+		}
+		if (userGalaxyCoinRecord.getExpiryTime().compareTo(DateTime.now()) < 0) {
+			log.info("该笔订单:{}银河币有效期:{}已过", orderId, userGalaxyCoinRecord.getExpiryTime());
+			return;
+		}
+		recordUseRecord(orderId, userId, galaxyCoin, PointsRecordConst.ORDER_REFUND);
+	}
+
+	/**
+	 * 记录发送银河币
+	 */
+	private void recordSendGalaxyCoin(Long userId, Integer galaxyCoin, String remark) {
+		recordUseRecord(null, userId, BigDecimal.valueOf(galaxyCoin), remark);
+	}
+}

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -50,6 +50,7 @@ import com.cyksj.model.request.ClickOutReq;
 import com.cyksj.model.request.OrderBalanceRefundReq;
 import com.cyksj.model.request.OrderRefundReq;
 import com.cyksj.redis.RedisService;
+import com.cyksj.service.coin.UserGalaxyCoinService;
 import com.cyksj.service.coupon.CouponFontService;
 import com.cyksj.service.distribute.equipment.EquipmentDistributeService;
 import com.cyksj.service.giftcard.GiftCardOrderUseRecordService;
@@ -222,6 +223,10 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final NetflixUserChangeOtherTicketRecordMapper netflixUserChangeOtherTicketRecordMapper;
 
+    private final OrderDonGalaxyCoinRecordMapper orderDonGalaxyCoinRecordMapper;
+
+    private final UserGalaxyCoinService userGalaxyCoinService;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -1046,6 +1051,17 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             }
             userBenefitsService.addUserBalance(orderDon.getUserId(), addBalance, UserBalanceSourceRecord.Source.refund, orderDon.getYhsId(), orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.refund.getDesc(), true);
         }
+        //是否全额退款
+        if (refundMoney.compareTo(orderDon.getMoney()) == 0) {
+            //是否使用银河币支付
+            OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = orderDonGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonGalaxyCoinRecord.class)
+                    .eq(OrderDonGalaxyCoinRecord::getOrderId, orderDon.getId())
+                    .last("limit 1"));
+            if (orderDonGalaxyCoinRecord != null) {
+                //有效时,返还银河币 并记录
+                userGalaxyCoinService.recordOrderRefundGalaxyCoinIfValid(orderDon.getId(), orderDonGalaxyCoinRecord.getUserId(), orderDonGalaxyCoinRecord.getGalaxyCoin());
+            }
+        }
 
         try {
             marketFrontService.subSpecificChanceNum(orderDon.getUserId(), orderDon.getId(), orderDon.getGoodsId(), orderDon.getUpdateTime());

+ 0 - 5
netflix-service/src/main/java/com/cyksj/service/market/MarketFrontService.java

@@ -17,11 +17,6 @@ public interface MarketFrontService {
 
 	SignUser getUserSignDetail(Long userId);
 
-	/**
-	 * 记录积分明细,发放积分
-	 */
-	void pointsRecord(Long userId, Integer points, String remark, Boolean isLottery);
-
 	LuckyDrawView lottery(Long userId, LuckyDraw.DrawType drawType) throws Exception;
 
 	void receivedLuckyDraw(Long userId, LuckyDrawReq luckyDrawReq);

+ 12 - 26
netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java

@@ -21,7 +21,6 @@ import com.cyksj.mapper.market.draw.LuckyDrawSpecificChanceMapper;
 import com.cyksj.mapper.market.draw.LuckyDrawSpecificChanceRecordMapper;
 import com.cyksj.mapper.market.sign.SignConfigMapper;
 import com.cyksj.mapper.market.sign.SignUserMapper;
-import com.cyksj.mapper.market.sign.UserPointsRecordMapper;
 import com.cyksj.mapper.market.task.TaskFollowPlatVerifyMapper;
 import com.cyksj.mapper.market.task.TaskUserCompleteRecordMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
@@ -32,6 +31,7 @@ import com.cyksj.model.request.TaskFollowReq;
 import com.cyksj.model.views.LuckyDrawView;
 import com.cyksj.model.views.TaskFrontView;
 import com.cyksj.redis.RedisService;
+import com.cyksj.service.coin.UserGalaxyCoinService;
 import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.mange.coupon.CouponCommonService;
 import com.cyksj.service.market.MarketFrontService;
@@ -61,8 +61,6 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 
 	private final SignConfigMapper signConfigMapper;
 
-	private final UserPointsRecordMapper userPointsRecordMapper;
-
 	private final SysConfigService sysConfigService;
 
 	private final UserMapper userMapper;
@@ -105,6 +103,8 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 
 	private final GroupRelationFrontService groupRelationFrontService;
 
+	private final UserGalaxyCoinService userGalaxyCoinService;
+
 	@Override
 	public SignUser signByUserId(Long userId) {
 		//第一次签到
@@ -163,20 +163,6 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		return signUser;
 	}
 
-	@Override
-	public void pointsRecord(Long userId, Integer points, String remark, Boolean isLottery) {
-		UserPointsRecord userPointsRecord = new UserPointsRecord();
-		userPointsRecord.setUserId(userId);
-		userPointsRecord.setPoints(points);
-		userPointsRecord.setRemark(remark);
-		userPointsRecordMapper.insert(userPointsRecord);
-
-		if (!isLottery) {
-			//发放爱心
-			userPointsRecordMapper.updateUserPoints(userId, points);
-		}
-	}
-
 
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
@@ -216,7 +202,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		LuckyDrawRecord record = new LuckyDrawRecord();
 		BeanUtil.copyProperties(luckyDraw, record, "status");
 		if (luckyDraw.getType() == LuckyDraw.Type.points) {
-			pointsRecord(userId, luckyDraw.getPoints(), PointsRecordConst.LOTTERY, false);
+			userGalaxyCoinService.sendGalaxyCoinRecord(userId, luckyDraw.getPoints(), PointsRecordConst.LOTTERY, false);
 			record.setStatus(LuckyDrawRecord.Status.success);
 		} else if (luckyDraw.getType() == LuckyDraw.Type.coupon) {
 			//发放优惠券
@@ -309,7 +295,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		if (data.getCouponId() != null && data.getCouponId() != 0) {
 			couponCommonService.sendCouponToUser(userId, data.getCouponId(), null, null, null, CouponUser.Channel.task);
 		}
-		pointsRecord(userId, data.getPoints(), PointsRecordConst.TASK, false);
+		userGalaxyCoinService.sendGalaxyCoinRecord(userId, data.getPoints(), PointsRecordConst.TASK, false);
 		//改变状态
 		TaskUserCompleteRecord record = new TaskUserCompleteRecord();
 		record.setId(data.getTaskCompleteRecordId());
@@ -427,7 +413,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 				points = signConfigMapper.selectOne(Wrappers.lambdaQuery(SignConfig.class)
 						.orderByAsc(SignConfig::getId).last("limit 1")).getMaxPoints();
 			}
-			pointsRecord(signUser.getUserId(), points, PointsRecordConst.SIGN, false);
+			userGalaxyCoinService.sendGalaxyCoinRecord(signUser.getUserId(), points, PointsRecordConst.SIGN, false);
 		}
 		signUser.setPoints(points);
 	}
@@ -602,16 +588,16 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 	public void luckyDrawNormalCheck(Long userId) {
 		SysConfig lottery_points_limit = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, Constant.LOTTERY_POINTS_LIMIT).last("limit 1"));
 		User user = userMapper.selectById(userId);
-		BigDecimal subPoints = BigDecimal.valueOf(Long.parseLong(lottery_points_limit.getSysValue()));
-		if (user.getActivePoints().compareTo(subPoints) < 0) {
-			throw BusinessRuntimeException.getInstance("积分不足");
+		BigDecimal subGalaxyCoin = BigDecimal.valueOf(Long.parseLong(lottery_points_limit.getSysValue()));
+		if (user.getGalaxyCoin().compareTo(subGalaxyCoin) < 0) {
+			throw BusinessRuntimeException.getInstance("银河币不足");
 		}
 		//扣减积分
-		Integer sub = userMapper.subActivePoints(userId, subPoints);
+		Integer sub = userMapper.subUserGalaxyCoin(userId, subGalaxyCoin, user.getGalaxyCoin());
 		if (sub != 1) {
-			throw BusinessRuntimeException.getInstance("积分不足");
+			throw BusinessRuntimeException.getInstance("银河币不足");
 		}
-		pointsRecord(userId, -subPoints.intValue(), PointsRecordConst.POINTS_LOTTERY, true);
+		userGalaxyCoinService.sendGalaxyCoinRecord(userId, -subGalaxyCoin.intValue(), PointsRecordConst.POINTS_LOTTERY, true);
 	}
 
 	public List<Long> luckyDrawSpecificCheck(Long userId) throws Exception {

+ 0 - 2
netflix-service/src/main/java/com/cyksj/service/market/task/TaskService.java

@@ -20,6 +20,4 @@ public interface TaskService {
 	void completeTask(TaskType type, Long userId);
 
 	void batchVerifyFollow( List<TaskFollowPlatVerify> taskFollowPlatVerifyList);
-
-	void pointsRecord(Long userId, Integer points, String remark, Boolean isLottery);
 }

+ 3 - 17
netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java

@@ -10,13 +10,13 @@ import com.cyksj.common.constant.PointsRecordConst;
 import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
-import com.cyksj.mapper.market.sign.UserPointsRecordMapper;
 import com.cyksj.mapper.market.task.TaskFollowPlatVerifyMapper;
 import com.cyksj.mapper.market.task.TaskMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.market.task.TaskUserCompleteRecordMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.views.TaskView;
+import com.cyksj.service.coin.UserGalaxyCoinService;
 import com.cyksj.service.market.task.TaskService;
 import com.cyksj.service.user.UserBenefitsService;
 import com.ejlchina.searcher.BeanSearcher;
@@ -52,7 +52,7 @@ public class TaskServiceImpl implements TaskService {
 
 	private final TaskFollowPlatVerifyMapper taskFollowPlatVerifyMapper;
 
-	private final UserPointsRecordMapper userPointsRecordMapper;
+	private final UserGalaxyCoinService userGalaxyCoinService;
 
 	private final BeanSearcher beanSearcher;
 
@@ -149,7 +149,7 @@ public class TaskServiceImpl implements TaskService {
 					}
 					if (verifyStatus == success) {
 						record.setStatus(TaskUserCompleteRecord.Status.received);
-						this.pointsRecord(record.getUserId(), record.getPoints(), PointsRecordConst.TASK, false);
+						userGalaxyCoinService.sendGalaxyCoinRecord(record.getUserId(), record.getPoints(), PointsRecordConst.TASK, false);
 						TaskView taskView = beanSearcher.searchFirst(TaskView.class, MapUtils.builder().field(TaskView::getId, dbPlatVerify.getTaskId()).build());
 						if (taskView != null) {
 							if ("关注引导".equals(taskView.getTypeName()) && taskView.getBalance().compareTo(BigDecimal.ZERO) > 0) {
@@ -167,20 +167,6 @@ public class TaskServiceImpl implements TaskService {
 		});
 	}
 
-	@Override
-	public void pointsRecord(Long userId, Integer points, String remark, Boolean isLottery) {
-		UserPointsRecord userPointsRecord = new UserPointsRecord();
-		userPointsRecord.setUserId(userId);
-		userPointsRecord.setPoints(points);
-		userPointsRecord.setRemark(remark);
-		userPointsRecordMapper.insert(userPointsRecord);
-
-		if (!isLottery) {
-			//发放爱心
-			userPointsRecordMapper.updateUserPoints(userId, points);
-		}
-	}
-
 	public void checkTask(Task task) {
 		Long typeId = task.getTypeId();
 		TaskType taskType = taskTypeMapper.selectById(typeId);

+ 151 - 3
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.constant.Constant;
+import com.cyksj.common.constant.PointsRecordConst;
 import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.constant.TransferConstant;
 import com.cyksj.common.exception.BusinessRuntimeException;
@@ -77,6 +78,7 @@ import com.cyksj.model.manage.views.UpgradeOrderDetailView;
 import com.cyksj.model.request.*;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
+import com.cyksj.service.coin.UserGalaxyCoinService;
 import com.cyksj.service.corp.WxCorpOps;
 import com.cyksj.service.coupon.CouponFontService;
 import com.cyksj.service.distribute.UserBusinessFrontService;
@@ -370,6 +372,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final GoodsClickUserOrderRecordMapper goodsClickUserOrderRecordMapper;
 
+	private final UserGalaxyCoinService userGalaxyCoinService;
+
+	private final OrderDonGalaxyCoinRecordMapper orderDonGalaxyCoinRecordMapper;
+
+	private final UserGalaxyCoinRecordMapper userGalaxyCoinRecordMapper;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -622,7 +630,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		if (sku != null) {
 			//扣除使用优惠券、余额的订单金额
-			deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon, payRequest.getGcCash(), payRequest.getGcpIds(), payRequest.getIsAcReduce(), subsidyId);
+			deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon, payRequest.getGcCash(), payRequest.getGcpIds(), payRequest.getIsAcReduce(), subsidyId, sku, payRequest.getGalaxyCoin());
 		}
 
 		if (isSpecificPrice && (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0 || orderDon.getMoney().compareTo(specificPrice) != 0)) {
@@ -1238,7 +1246,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			orderDon.setMoney(sku.getPrice().multiply(discount));
 		}
 		//扣除使用优惠券、余额的订单金额
-		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon, payRequest.getGcCash(), payRequest.getGcpIds(), false, null);
+		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon, payRequest.getGcCash(), payRequest.getGcpIds(), false, null, sku, payRequest.getGalaxyCoin());
 		this.saveOrUpdate(orderDon);
 
 		Long orderId = orderDon.getId();
@@ -2484,7 +2492,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	/**
 	 * 使用优惠营销 订单金额抵扣
 	 */
-	public void deductOrderMoney(OrderDon orderDon, CouponUser couponUser, BigDecimal balance, User user, BigDecimal skuMoney, GoodsDon goodsDon, BigDecimal gcCash, List<Long> gcpIds, Boolean isAcReduce, Long subsidyId) throws Exception {
+	public void deductOrderMoney(OrderDon orderDon, CouponUser couponUser, BigDecimal balance, User user, BigDecimal skuMoney, GoodsDon goodsDon, BigDecimal gcCash, List<Long> gcpIds, Boolean isAcReduce, Long subsidyId, GoodsDonSku sku, BigDecimal galaxyCoin) throws Exception {
 		Integer goodsType = goodsDon.getType();
 		if (gcCash != null && gcCash.compareTo(BigDecimal.ZERO) > 0 && couponUser != null && (balance != null && balance.compareTo(BigDecimal.ZERO) > 0)) {
 			throw BusinessRuntimeException.getInstance("现金卡不能与其他优惠叠加使用");
@@ -2662,6 +2670,103 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		//存在余额
 		deductBalancePayOrderMoney(orderDon, balance, user);
+		//存在银河币
+		deductGalaxyCoinPayOrderMoney(orderDon, sku, galaxyCoin, user);
+	}
+
+	private void deductGalaxyCoinPayOrderMoney(OrderDon orderDon, GoodsDonSku sku, BigDecimal toUseGalaxyCoin, User user) {
+		//存在余额
+		if (toUseGalaxyCoin != null && toUseGalaxyCoin.compareTo(BigDecimal.ZERO) > 0) {
+			BigDecimal userGalaxyCoin = user.getGalaxyCoin();
+			if (userGalaxyCoin.compareTo(toUseGalaxyCoin) < 0) {
+				throw BusinessRuntimeException.getInstance("您的银河币不足!");
+			}
+			BigDecimal orderMoney = orderDon.getMoney();
+			//订单金额不大于0
+			if (orderMoney.compareTo(BigDecimal.ZERO) == 0) {
+				return;
+			}
+			//去掉余额 多出的部分
+			BigDecimal subGalxyCoin = toUseGalaxyCoin;
+			SysConfig galaxyCoinPayConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.GALAXY_COIN_PAY_DEDUCT_KEY).last("limit 1"));
+			GalaxyCoinPayConfigDto galaxyCoinPayConfigDto = null;
+			if (galaxyCoinPayConfig != null && StrUtil.isNotEmpty(galaxyCoinPayConfig.getSysValue())) {
+				try {
+					galaxyCoinPayConfigDto = Jsons.parseObject(galaxyCoinPayConfig.getSysValue(), GalaxyCoinPayConfigDto.class);
+				} catch (Exception e) {
+				}
+				if (galaxyCoinPayConfigDto == null) {
+					throw BusinessRuntimeException.getInstance("银河币抵扣系统错误,请联系客服");
+				}
+				//每个银河币可抵扣金额
+				BigDecimal deductMoneyEachCoin = galaxyCoinPayConfigDto.getGalaxyCoin().divide(galaxyCoinPayConfigDto.getMoney());
+				//此次使用抵扣金额
+				BigDecimal thisDeductMoney = toUseGalaxyCoin.multiply(deductMoneyEachCoin);
+				//该笔平台最高可抵扣金额
+				BigDecimal maxDeductMoney = sku.getPrice().multiply(galaxyCoinPayConfigDto.getMaxRate());
+				if (thisDeductMoney.compareTo(maxDeductMoney) > 0) {
+					thisDeductMoney = maxDeductMoney;
+					//此时需要扣除的银河币
+					subGalxyCoin = thisDeductMoney.divide(deductMoneyEachCoin);
+				}
+				if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
+					orderDon.setType(OrderDon.Type.GALAXY_COIN);
+				}
+				//银河币抵扣
+				List<UserGalaxyCoinRecord> availableGalaxyCoinList = userGalaxyCoinRecordMapper.selectList(Wrappers.lambdaQuery(UserGalaxyCoinRecord.class)
+						.eq(UserGalaxyCoinRecord::getUserId, orderDon.getUserId())
+						.eq(UserGalaxyCoinRecord::getIsUsed, Boolean.FALSE)
+						.gt(UserGalaxyCoinRecord::getExpiryTime, DateTime.now())
+						.gt(UserGalaxyCoinRecord::getRemainGalaxyCoin, 0));
+				//需要使用的银河币
+				BigDecimal userFinalUseGalaxyCoin = subGalxyCoin;
+				for (UserGalaxyCoinRecord galaxyCoinRecord : availableGalaxyCoinList) {
+					BigDecimal remainGalaxyCoin = galaxyCoinRecord.getRemainGalaxyCoin();
+					Long galaxyCoinRecordId = galaxyCoinRecord.getId();
+					//扣完
+					if (remainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) == 0) {
+						//完全抵扣
+						deductUserGalaxyCoin(galaxyCoinRecordId, remainGalaxyCoin, remainGalaxyCoin, true);
+						userFinalUseGalaxyCoin = BigDecimal.ZERO;
+					} else if (remainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) < 0) {
+						//不足以抵扣
+						deductUserGalaxyCoin(galaxyCoinRecordId, remainGalaxyCoin, remainGalaxyCoin, true);
+						userFinalUseGalaxyCoin = userFinalUseGalaxyCoin.subtract(remainGalaxyCoin);
+					} else if (remainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) > 0) {
+						//足以抵扣
+						deductUserGalaxyCoin(galaxyCoinRecordId, userFinalUseGalaxyCoin, remainGalaxyCoin, false);
+						userFinalUseGalaxyCoin = BigDecimal.ZERO;
+					}
+				}
+				//最终消耗的银河币需要为0 大于0则说明抵扣失败
+				if (userFinalUseGalaxyCoin.compareTo(BigDecimal.ZERO) > 0) {
+					throw BusinessRuntimeException.getInstance("您的银河币不足!");
+				}
+				//扣除银河币 是否成功
+				Integer success = userMapper.subUserGalaxyCoin(user.getId(), subGalxyCoin, userGalaxyCoin);
+				if (success != 1) throw BusinessRuntimeException.getInstance("您的银河币不足!");
+				//记录使用详情
+				OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = new OrderDonGalaxyCoinRecord();
+				orderDonGalaxyCoinRecord.setUserId(user.getId());
+				orderDonGalaxyCoinRecord.setOrderNo(orderDon.getOrderNo());
+				orderDonGalaxyCoinRecord.setGalaxyCoin(subGalxyCoin);
+				orderDonGalaxyCoinRecord.setDeductMoney(thisDeductMoney);
+				orderDonGalaxyCoinRecordMapper.insert(orderDonGalaxyCoinRecord);
+			}
+		}
+	}
+
+	private void 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) {
+			throw BusinessRuntimeException.getInstance("银河币抵扣异常,请刷新页面重试");
+		}
 	}
 
 	/**
@@ -2826,6 +2931,17 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		if (orderDon.getBalance().compareTo(BigDecimal.ZERO) > 0) {
 			userBenefitsService.recordBalanceBySource(orderDon.getUserId(), orderDon.getBalance().negate(), UserBalanceSourceRecord.Source.payment, orderDon.getId(), goodsDon.getTitle() + UserBalanceSourceRecord.Source.payment.getDesc(), null, null);
 		}
+		//银河币使用记录
+		OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = orderDonGalaxyCoinRecordMapper.selectOne(Wrappers.lambdaQuery(OrderDonGalaxyCoinRecord.class)
+				.eq(OrderDonGalaxyCoinRecord::getOrderNo, orderDon.getOrderNo())
+				.last("limit 1"));
+		if (orderDonGalaxyCoinRecord != null) {
+			//使用记录
+			userGalaxyCoinService.recordUseRecord(orderDon.getId(), orderDon.getUserId(), orderDonGalaxyCoinRecord.getGalaxyCoin(), PointsRecordConst.ORDER);
+			orderDonGalaxyCoinRecord.setRefundGalaxyCoin(orderDonGalaxyCoinRecord.getGalaxyCoin());
+			orderDonGalaxyCoinRecord.setOrderId(orderDon.getId());
+			orderDonGalaxyCoinRecordMapper.updateById(orderDonGalaxyCoinRecord);
+		}
 
 		TASK_POOL.execute(() -> {
 			try {
@@ -2962,6 +3078,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				}
 			}
 		}
+
+		//银河币返回
+		returnGalaxyCoin(orderDon);
 	}
 
 	private void handleUserMirrorSHopOrderDon(OrderDon orderDon) throws Exception {
@@ -3446,6 +3565,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		//存在余额
 		if (balance != null && balance.compareTo(BigDecimal.ZERO) > 0) {
 			BigDecimal money = orderDon.getMoney();
+			//订单金额不大于0
+			if (money.compareTo(BigDecimal.ZERO) == 0) {
+				return;
+			}
 			//去掉余额 多出的部分
 			BigDecimal subBalance = balance;
 			orderDon.setMoney(money.subtract(subBalance));
@@ -4807,4 +4930,29 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 		}
 	}
+
+	private void returnGalaxyCoin(OrderDon orderDon) {
+		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
+			Long userId = orderDon.getUserId();
+			BigDecimal money = orderDon.getMoney();
+			SysConfig galaxyCoinConsumeReturnRateConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.GALAXY_COIN_CONSUME_RETURN_RATE_KEY)
+					.last("limit 1"));
+			BigDecimal retrunGalaxyCoin = BigDecimal.ZERO;
+			if (galaxyCoinConsumeReturnRateConfig != null && StrUtil.isNotEmpty(galaxyCoinConsumeReturnRateConfig.getSysValue())) {
+				try {
+					GalaxyCoinConsumeRateDto galaxyCoinConsumeRateDto = Jsons.parseObject(galaxyCoinConsumeReturnRateConfig.getSysValue(), GalaxyCoinConsumeRateDto.class);
+					BigDecimal moneyAvg = galaxyCoinConsumeRateDto.getMoney();
+					//返回银河币倍数
+					BigDecimal number = money.divide(moneyAvg, 0, RoundingMode.DOWN);
+					retrunGalaxyCoin = number.multiply(galaxyCoinConsumeRateDto.getGalaxyCoin());
+					//发送银河币并记录
+					userGalaxyCoinService.sendGalaxyCoinRecord(userId, retrunGalaxyCoin.intValue(), PointsRecordConst.ORDER_CASHBACK, false);
+				} catch (Exception e) {
+					log.error("发送用户:{}银河币points:{}错误:{}", userId, retrunGalaxyCoin, StringUtil.getErrorText(e));
+				}
+
+			}
+		}
+	}
 }

+ 9 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -133,6 +133,8 @@ public class CmsOrderController {
 
 	private final OrderDiscountPlusPurchaseSkuRelationMapper plusPurchaseSkuRelationMapper;
 
+	private final OrderDonGalaxyCoinRecordMapper orderDonGalaxyCoinRecordMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@GetMapping("/get")
@@ -319,6 +321,13 @@ public class CmsOrderController {
 					data.setIsTp(donDifferRelateView.getIsTp());
 				}
 			}
+			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);
 	}

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/market/LuckyDrawFrontController.java

@@ -117,7 +117,7 @@ public class LuckyDrawFrontController {
 	/**
 	 * 抽奖
 	 */
-	@PostMapping("/lottery")
+//	@PostMapping("/lottery")
 	@NoSubmit
 	public Result<LuckyDrawView> lottery(@RequestParam(defaultValue = "normal") LuckyDraw.DrawType drawType) throws Exception {
 		Long userId = StpUserUtil.getLoginIdAsLong();

+ 7 - 7
netflix-web/src/main/java/com/cyksj/web/controller/market/SignFrontController.java

@@ -5,11 +5,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserGalaxyCoinRecordMapper;
 import com.cyksj.mapper.market.sign.SignConfigMapper;
-import com.cyksj.mapper.market.sign.UserPointsRecordMapper;
 import com.cyksj.model.entity.SignConfig;
 import com.cyksj.model.entity.SignUser;
-import com.cyksj.model.entity.UserPointsRecord;
+import com.cyksj.model.entity.UserGalaxyCoinRecord;
 import com.cyksj.service.market.MarketFrontService;
 import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
@@ -23,7 +23,7 @@ import java.util.List;
 public class SignFrontController {
     private final MarketFrontService marketFrontService;
 
-    private final UserPointsRecordMapper userPointsRecordMapper;
+    private final UserGalaxyCoinRecordMapper userGalaxyCoinRecordMapper;
 
     private final SignConfigMapper signConfigMapper;
 
@@ -31,11 +31,11 @@ public class SignFrontController {
      * 用户积分详情
      */
     @GetMapping("/get/points/detail")
-    public Result<Page<UserPointsRecord>> getUserPointsDetail(@RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "5") Integer limit) {
+    public Result<Page<UserGalaxyCoinRecord>> getUserPointsDetail(@RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "5") Integer limit) {
         Long userId = StpUserUtil.getLoginIdAsLong();
-        return GatewayResponse.SUCCESS.newBuilder().toResult(userPointsRecordMapper.selectPage(new Page<>(start, limit), Wrappers.lambdaQuery(UserPointsRecord.class)
-                .eq(UserPointsRecord::getUserId, userId)
-                .orderByDesc(UserPointsRecord::getId)));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(userGalaxyCoinRecordMapper.selectPage(new Page<>(start, limit), Wrappers.lambdaQuery(UserGalaxyCoinRecord.class)
+                .eq(UserGalaxyCoinRecord::getUserId, userId)
+                .orderByDesc(UserGalaxyCoinRecord::getId)));
     }
 
     /**

+ 1 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -185,7 +185,7 @@ public class UserController {
         personalView.setNumOfCoupons(couponSize);
         //积分
         User user = userService.getById(userId);
-        personalView.setActivePoints(user.getActivePoints());
+        personalView.setGalaxyCoin(user.getGalaxyCoin());
         //推广积分
         personalView.setPopularizePoints(user.getPoints());
         personalView.setBalance(user.getBalance());