Pārlūkot izejas kodu

Merge branch 'dev/2024/0419/update-app' into 'master'

修改用户的商城链接分享

See merge request zx-mall/mall-backend-app!3
Yangzw 1 gadu atpakaļ
vecāks
revīzija
072a5189b3
14 mainītis faili ar 205 papildinājumiem un 28 dzēšanām
  1. 1 1
      feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/enums/CategoryEnum.java
  2. 2 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java
  3. 10 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogSaveReqVO.java
  4. 7 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofitlog/PtProfitLogDO.java
  5. 18 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofit/PtProfitMapper.java
  6. 8 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharelink/ShareLinkMapper.java
  7. 13 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java
  8. 62 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  9. 2 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofit/PtProfitService.java
  10. 13 14
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofit/PtProfitServiceImpl.java
  11. 8 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogService.java
  12. 31 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogServiceImpl.java
  13. 12 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/cart/CartServiceImpl.java
  14. 18 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

+ 1 - 1
feifan-framework/feifan-common/src/main/java/cn/newfeifan/mall/framework/common/enums/CategoryEnum.java

@@ -10,7 +10,7 @@ public enum CategoryEnum {
     /**
      * 商城
      */
-    MALL(1, "商城"),
+    MALL(1, "邀请新用户注册"),
 
     /**
      * 店铺

+ 2 - 0
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java

@@ -14,6 +14,8 @@ public enum CaclEnum {
     HIGH_QUOTA(6, "最高可以获得积分"),
     SMALL_QUOTA_CRASH(7, "小区额度分配"),
     AFTER_CRASH_CALC_PT_TOTAL_QUOTA(8, "碰撞后计算平台总收益"),
+    ORDER_PAY_INTEGRAL(9,"订单购物支付积分"),
+    ORDER_REFUND_INTEGRAL(10,"订单退款退回支付积分")
     ;
 
     /**

+ 10 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogSaveReqVO.java

@@ -22,15 +22,24 @@ public class PtProfitLogSaveReqVO {
     @Schema(description = "增加后金额")
     private Integer afterAmount;
 
+    @Schema(description = "增加金额")
+    private Integer freezeAmount;
+
+    @Schema(description = "增加后金额")
+    private Integer afterFreezeAmount;
+
     @Schema(description = "收益类型 1:平台服务器费 2:平台收益 3用户下单返回毛利额度 4直推人额度 5合赢奖", example = "2")
     private Integer profitStatus;
 
     @Schema(description = "用户ID , 只有收益类型为 3,4才有值", example = "6982")
     private Long userId;
 
-    @Schema(description = "订单", example = "15682")
+    @Schema(description = "订单id", example = "15682")
     private Long orderId;
 
+    @Schema(description = "订单号", example = "o787815682")
+    private String orderNo;
+
     @Schema(description = "计算百分比模板")
     private String percentTemplate;
 

+ 7 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofitlog/PtProfitLogDO.java

@@ -1,5 +1,6 @@
 package cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
 import java.time.LocalDateTime;
@@ -45,7 +46,7 @@ public class PtProfitLogDO extends BaseDO {
     private Long userId;
 
     /**
-     * 订单
+     * 订单id
      */
     private Long orderId;
     /**
@@ -53,5 +54,10 @@ public class PtProfitLogDO extends BaseDO {
      */
     private String percentTemplate;
 
+    /**
+     * 订单号
+     */
+    private String orderNo;
+
 
 }

+ 18 - 4
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofit/PtProfitMapper.java

@@ -1,13 +1,18 @@
 package cn.newfeifan.mall.module.distri.dal.mysql.ptprofit;
 
-import java.util.*;
-
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.PtProfitPageReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import org.apache.ibatis.annotations.Mapper;
-import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.*;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.Map;
 
 /**
  * 平台利润 Mapper
@@ -26,4 +31,13 @@ public interface PtProfitMapper extends BaseMapperX<PtProfitDO> {
                 .orderByDesc(PtProfitDO::getId));
     }
 
+    @Update("UPDATE distri_integral SET current_quota = current_quota + #{amount},freeze_quota = freeze_quota + #{freeze_mount} WHERE (current_quota + #{amount2})>0 and user_id=#{userId} and (freeze_quota + #{freeze_mount2})>0 ")
+    int updateUserIntegral(@Param("amount") int amount,
+                           @Param("amount2") int amount2,
+                           @Param("freeze_mount") int freezeAmount,
+                           @Param("freeze_mount2") int freezeAmount2,
+                           @Param("userId") Long userId);
+
+    @Select("SELECT current_quota,freeze_quota FROM distri_integral WHERE user_id = #{userId}")
+    Map<String, Object> selectUserIntegral(@Param("userId") Long userId);
 }

+ 8 - 4
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharelink/ShareLinkMapper.java

@@ -28,10 +28,14 @@ public interface ShareLinkMapper extends BaseMapperX<ShareLinkDO> {
     }
 
     default ShareLinkDO selectByCategory(Integer category, Long loginUserId, Long objectId){
-        return selectOne(new LambdaQueryWrapperX<ShareLinkDO>()
+        LambdaQueryWrapperX<ShareLinkDO> wrapper = new LambdaQueryWrapperX<ShareLinkDO>()
                 .eq(ShareLinkDO::getCategory, category)
-                .eq(ShareLinkDO::getCreateUserId, loginUserId)
-                .eq(ShareLinkDO::getObjectId, objectId)
-        );
+                .eq(ShareLinkDO::getCreateUserId, loginUserId);
+        if(objectId == null){
+            wrapper.isNull(ShareLinkDO::getObjectId);
+        }else{
+            wrapper.eq(ShareLinkDO::getObjectId, objectId);
+        }
+        return selectOne(wrapper);
     }
 }

+ 13 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java

@@ -6,6 +6,7 @@ import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 
 /**
  * 推荐用户积分 Service 接口
@@ -60,4 +61,16 @@ public interface IntegralService {
     IntegralDO selectByUser(Long descendant);
 
 
+    /**
+     * 修改用户积分
+     *
+     * @param userId 要修改积分的用户
+     * @param caclEnum 导致积分变化的事件类型枚举
+     * @param amount 用户积分变化金额,可为负数
+     * @return 返回是否执行成功。执行失败,通常是就是用户积分不足,没积分抵扣
+     */
+    Boolean updateUserIntegral(Long userId, CaclEnum caclEnum, Integer amount, Integer freezeAmount,
+                               Long tradeOrderId,
+                               String OrderNum
+                               );
 }

+ 62 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java

@@ -1,6 +1,9 @@
 package cn.newfeifan.mall.module.distri.service.integral;
 
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.module.distri.dal.mysql.ptprofit.PtProfitMapper;
+import cn.newfeifan.mall.module.distri.enums.CaclEnum;
+import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 
@@ -34,6 +37,12 @@ public class IntegralServiceImpl implements IntegralService {
     @Resource
     private IntegralMapper integralMapper;
 
+    @Resource
+    private PtProfitMapper ptProfitMapper;
+
+    @Resource
+    private PtProfitLogService ptProfitLogService;
+
     @Override
     public Long createIntegral(IntegralSaveReqVO createReqVO) {
         // 插入
@@ -81,4 +90,57 @@ public class IntegralServiceImpl implements IntegralService {
         return integralMapper.selectOne(new LambdaQueryWrapper<IntegralDO>().eq(IntegralDO::getUserId, descendant));
     }
 
+    /**
+     * add by Ben
+     * 修改用户积分
+     *
+     * @param userId 要修改积分的用户
+     * @param caclEnum 导致积分变化的事件类型枚举
+     * @param amount 用户可用积分变化金额,可为负数
+     * @param freezeAmount 用户冻结积分变化金额,可为负数
+     * @return 返回是否执行成功。执行失败,通常是就是用户积分不足,没积分抵扣
+     */
+    @Override
+    public Boolean updateUserIntegral(Long userId, CaclEnum caclEnum, Integer amount, Integer freezeAmount,
+                                      Long tradeOrderId,
+                                      String OrderNum
+                                      ) {
+        Boolean success = null;
+
+        //修改用户积分钱包的积分
+        int effectRowNum = ptProfitMapper.updateUserIntegral(amount,amount,freezeAmount,freezeAmount,userId);
+
+        if (effectRowNum==1) {//如果成功修改积分记录
+            success = true;
+
+            //用户修改后的当前可用的钱包余额
+            Integer afterAmount = null;
+            //用户修改后的冻结积分钱包余额
+            Integer afterFreezeAmount = null;
+
+            //查询用户修改后的积分
+            Map<String, Object> map = ptProfitMapper.selectUserIntegral(userId);
+            Object currentQuotaObj = map.get("current_quota");
+            Object freezeQuotaObj = map.get("freeze_quota");
+
+            afterAmount = (Integer)currentQuotaObj;
+            afterFreezeAmount = (Integer)freezeQuotaObj;
+
+            if(afterAmount<0||afterFreezeAmount<0){
+                throw new RuntimeException("用户钱包为负数:用户IO为"+userId+"的用户可用钱包为"+afterAmount+",冻结钱包为"+afterFreezeAmount);
+            }
+
+            //记录用户的积分变动日志
+            ptProfitLogService.addMessage(userId, caclEnum, amount, afterAmount,
+                    freezeAmount, afterFreezeAmount,null,tradeOrderId,OrderNum);
+
+        }else if(effectRowNum<1){//如果钱包积分不足,不够抵扣
+            success = false;
+        } else if (effectRowNum>1) {
+//            success = false;
+            throw new RuntimeException("用户IO为"+userId+"的用户钱包不只一个!");
+        }
+
+        return success;
+    }
 }

+ 2 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofit/PtProfitService.java

@@ -6,6 +6,7 @@ import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 
 /**
  * 平台利润 Service 接口
@@ -60,4 +61,5 @@ public interface PtProfitService {
 
     void saveBatch(List<PtProfitSaveReqVO> ptProfitSaveReqVOS);
 
+
 }

+ 13 - 14
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofit/PtProfitServiceImpl.java

@@ -1,25 +1,21 @@
 package cn.newfeifan.mall.module.distri.service.ptprofit;
 
+import cn.newfeifan.mall.framework.common.pojo.PageResult;
+import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.PtProfitPageReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.PtProfitSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
+import cn.newfeifan.mall.module.distri.dal.mysql.ptprofit.PtProfitMapper;
+import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
 import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-
 import org.springframework.validation.annotation.Validated;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
 
-import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.*;
-import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
-import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.framework.common.pojo.PageParam;
-import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
-
-import cn.newfeifan.mall.module.distri.dal.mysql.ptprofit.PtProfitMapper;
+import javax.annotation.Resource;
+import java.util.List;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
+import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.PT_PROFIT_NOT_EXISTS;
 
 /**
  * 平台利润 Service 实现类
@@ -33,6 +29,9 @@ public class PtProfitServiceImpl implements PtProfitService {
     @Resource
     private PtProfitMapper ptProfitMapper;
 
+    @Resource
+    private PtProfitLogService ptProfitLogService;
+
     @Override
     public Long createPtProfit(PtProfitSaveReqVO createReqVO) {
         // 插入

+ 8 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogService.java

@@ -6,6 +6,7 @@ import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 
 /**
  * 平台利润记录 Service 接口
@@ -54,7 +55,13 @@ public interface PtProfitLogService {
 
     void saveBatch(List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS);
 
-
+    //记录用户的积分变动日志
+    void addMessage(Long userId, CaclEnum caclEnum, Integer amount,
+                    Integer afterAmount, Integer freezeAmount,
+                    Integer afterFreezeAmount, String percentTemplate,
+                    Long tradeOrderId,
+                    String OrderNum
+                    );
     String getYesterdayLog(List<Long> sonsId);
 
     String getTotalLog(List<Long> sonsId);

+ 31 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogServiceImpl.java

@@ -83,6 +83,37 @@ public class PtProfitLogServiceImpl implements PtProfitLogService {
         ptProfitLogMapper.insertBatch(ptProfitLog);
     }
 
+    /**
+     * 添加一条用户积分日志消息
+     * @param userId
+     * @param caclEnum
+     * @param amount
+     * @param afterAmount
+     * @param freezeAmount
+     * @param afterFreezeAmount
+     * @param percentTemplate
+     * @param tradeOrderId
+     * @param OrderNum
+     */
+    @Override
+    public void addMessage(Long userId, CaclEnum caclEnum, Integer amount, Integer afterAmount,
+                           Integer freezeAmount, Integer afterFreezeAmount,
+                           String percentTemplate,
+                           Long tradeOrderId,
+                           String OrderNum
+                           ) {
+        PtProfitLogSaveReqVO ptProfitLog = PtProfitLogSaveReqVO.builder()
+                .afterAmount(afterAmount)
+                .amount(amount)
+                .percentTemplate(percentTemplate)
+                .userId(userId)
+                .profitStatus(caclEnum.getType()).orderId(tradeOrderId).orderNo(OrderNum)
+                .build();
+        ptProfitLogMapper.insert(BeanUtils.toBean(ptProfitLog, PtProfitLogDO.class));
+
+    }
+
+
     @Override
     public String getYesterdayLog(List<Long> sonsId) {
 

+ 12 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/cart/CartServiceImpl.java

@@ -11,6 +11,7 @@ import cn.newfeifan.mall.module.trade.controller.app.cart.vo.*;
 import cn.newfeifan.mall.module.trade.convert.cart.TradeCartConvert;
 import cn.newfeifan.mall.module.trade.dal.dataobject.cart.CartDO;
 import cn.newfeifan.mall.module.trade.dal.mysql.cart.CartMapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.v3.oas.annotations.media.Schema;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -170,7 +171,17 @@ public class CartServiceImpl implements CartService {
         }
         appCartListRespVO.setShopSkuMap(shopSkuMap);
 
-        List<ShopDO> shopDOList = shopMapper.selectList("id", shopSkuMap.keySet());
+        List<Long> list = new ArrayList<Long>();
+        for (Long shopId : shopSkuMap.keySet()) {
+            list.add(shopId);
+        }
+
+        List<ShopDO> shopDOList = shopMapper.selectBatchIds(list);
+
+//        QueryWrapper<ShopDO> queryWrapper = new QueryWrapper<>();
+//        queryWrapper.in("id", shopSkuMap.keySet());  // 使用 in 方法并传入 ID 列表
+//        List<ShopDO> shopDOList = shopMapper.selectList(queryWrapper);
+
         //key为店铺ID,value为店铺名
         Map<Long,String> shopNameMap = new HashMap<Long,String>();
         for(ShopDO shopDO:shopDOList){

+ 18 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -14,6 +14,9 @@ import cn.newfeifan.mall.framework.common.util.number.MoneyUtils;
 import cn.newfeifan.mall.module.distri.constant.DistriConstants;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import cn.newfeifan.mall.module.distri.dal.mysql.integral.IntegralMapper;
+import cn.newfeifan.mall.module.distri.enums.CaclEnum;
+import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
+import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
 import cn.newfeifan.mall.module.member.api.address.MemberAddressApi;
 import cn.newfeifan.mall.module.member.api.address.dto.MemberAddressRespDTO;
 import cn.newfeifan.mall.module.pay.api.order.PayOrderApi;
@@ -132,6 +135,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Resource
     private PayOrderMapper payOrderMapper;
 
+    @Resource
+    private IntegralService integralService;
+
     // =================== Order ===================
 
 
@@ -576,9 +582,20 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId));
         }
 
-        //如果订单有使用积分,则抵扣用户的积分
+        //如果订单有使用积分,则抵扣用户的积分 add by Ben
         if(payPoints>0){
 
+            //下面这部分,应该是写到订单支付成功的地方的,写在下面这里,只是为了方便测试
+            Integer freezeAmount =2;//测试方便,临时写死,等汉鹏的方法
+
+            for(Map<String,Object> m:orderMapList){
+                TradeOrderDO order = (TradeOrderDO)(m.get("order"));
+
+                Long tradeOrderId = order.getId();
+                String OrderNum =order.getNo();
+                integralService.updateUserIntegral(userId, CaclEnum.ORDER_PAY_INTEGRAL, payPoints*(-1),freezeAmount,tradeOrderId,OrderNum);
+            }
+
         }
 
         return virtualOrder;