瀏覽代碼

订单,积分,分类,退货的功能优化

wang 1 周之前
父節點
當前提交
5cb9c8d14d
共有 15 個文件被更改,包括 277 次插入252 次删除
  1. 17 7
      yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java
  2. 3 1
      yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java
  3. 5 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java
  4. 47 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ScoreDataDto.java
  5. 21 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecord.java
  6. 3 1
      yami-shop-service/src/main/java/com/yami/shop/dao/PointsRecordMapper.java
  7. 9 6
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java
  8. 6 6
      yami-shop-service/src/main/resources/mapper/OrderMapper.xml
  9. 25 1
      yami-shop-service/src/main/resources/mapper/PointsRecordMapper.xml
  10. 41 7
      yami-shop-service/src/main/resources/mapper/ProductMapper.xml
  11. 22 113
      yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/controller/UserScoreController.java
  12. 0 3
      yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/listener/SubmitOrderListener.java
  13. 0 90
      yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/dto/ScoreDataDto.java
  14. 10 4
      yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/UserScoreDetailService.java
  15. 68 11
      yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/impl/UserScoreDetailServiceImpl.java

+ 17 - 7
yami-shop-api/src/main/java/com/yami/shop/api/controller/OrderController.java

@@ -22,6 +22,7 @@ import com.yami.shop.bean.event.SubmitSeckillOrderEvent;
 import com.yami.shop.bean.model.*;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.util.Arith;
+import com.yami.shop.dao.PointsRecordMapper;
 import com.yami.shop.security.api.util.SecurityUtils;
 import com.yami.shop.service.*;
 import com.yami.shop.service.hb.IHBOrderService;
@@ -61,6 +62,8 @@ public class OrderController {
     private UserAddrOrderService userAddrOrderService;
     @Autowired
     private IQnhService qnhService;
+    @Autowired
+    private PointsRecordMapper pointsRecordMapper;
 
     @Autowired
     private IHBOrderService hbOrderService;
@@ -76,7 +79,7 @@ public class OrderController {
                 Basket byId = basketService.getById(basketId);
                 Sku byIdss = skuService.getById(byId);
                 boolean skuStock = qnhService.getSkuStock(byIdss.getSkuCode(), byId.getProdId(), orderParam.getPlatform());
-                Product byId1 = productService.getById(byId.getProdId(),orderParam.getPlatform());
+                Product byId1 = productService.getById(byId.getProdId(), orderParam.getPlatform());
 //                byId1.setTotalStocks(byIdss.getStocks());
                 productService.updateById(byId1);
                 if (skuStock && byId1.getTotalStocks() < byId.getBasketCount()) {
@@ -100,7 +103,7 @@ public class OrderController {
         UserAddrDto userAddrDto = mapperFacade.map(userAddr, UserAddrDto.class);
         // 组装获取用户提交的购物车商品项
         OrderItemParam orderItem = orderParam.getOrderItem();
-        if(null != orderItem){
+        if (null != orderItem) {
             orderItem.setPlatform(orderParam.getPlatform());
         }
         List<ShopCartItemDto> shopCartItems = basketService.getShopCartItemsByOrderItems(orderParam.getBasketIds(), orderItem, userId);
@@ -110,12 +113,17 @@ public class OrderController {
         // 根据店铺组装购车中的商品信息,返回每个店铺中的购物车商品信息
         List<ShopCartDto> shopCarts = basketService.getShopCarts(shopCartItems, 0L);
 
-
-
+        Long point = pointsRecordMapper.statisticsPoint(userId, orderParam.getPlatform());
+        double v = 0.0;
         // 将要返回给前端的完整的订单信息
         ShopCartOrderMergerDto shopCartOrderMergerDto = new ShopCartOrderMergerDto();
         shopCartOrderMergerDto.setUserAddr(userAddrDto);
         shopCartOrderMergerDto.setIsScorePay(orderParam.getIsScorePay());
+        if (null != point) {
+            v = ((double) point / 100);
+            //总的可用积分
+            shopCartOrderMergerDto.setTotalAvailableScore(point);
+        }
         // 所有店铺的订单信息
         List<ShopCartOrderDto> shopCartOrders = new ArrayList<>();
 
@@ -183,8 +191,9 @@ public class OrderController {
             shopCartOrders.get(n).setShopCartItemDiscounts(shopCartItemDiscounts);
             actualTotal = Arith.add(actualTotal, shopCartOrderDto.getActualTotal());
         }
-
-        shopCartOrderMergerDto.setActualTotal(actualTotal);
+        //v
+        shopCartOrderMergerDto.setActualTotal(Arith.sub(actualTotal, v) < 0 ? 0 : Arith.sub(actualTotal, v));
+        shopCartOrderMergerDto.setTotalUsableScore(Arith.sub(actualTotal, v) < 0 ? actualTotal : v);//总共消耗的积分
         shopCartOrderMergerDto.setTotal(total);
         shopCartOrderMergerDto.setTotalCount(totalCount);
         shopCartOrderMergerDto.setOrderReduce(allOrderReduce);
@@ -231,7 +240,8 @@ public class OrderController {
             allOrderReduce = Arith.add(allOrderReduce, shopCartOrder.getShopReduce());
             totalTransfee = Arith.add(totalTransfee, shopCartOrder.getTransfee());
         }
-        shopCartOrderMergerDto.setActualTotal(actualTotal);
+        shopCartOrderMergerDto.setActualTotal(Arith.sub(actualTotal, v) < 0 ? 0 : Arith.sub(actualTotal, v));
+        shopCartOrderMergerDto.setTotalUsableScore(Arith.sub(actualTotal, v) < 0 ? actualTotal : v);//总共消耗的积分
         shopCartOrderMergerDto.setTotalTransfee(totalTransfee);
         shopCartOrderMergerDto.setOrderReduce(allOrderReduce);
 

+ 3 - 1
yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java

@@ -130,7 +130,7 @@ public class SubmitOrderListener {
             // 每个店铺生成一个订单
             for (ShopCartOrderDto shopCartOrderDto : shopCartOrders) {
                 //兑换人民币是分,必须要实时统计计算
-                Integer point = pointsRecordMapper.statisticsPoint(userId, mergerOrder.getPlatform());
+                Long point = pointsRecordMapper.statisticsPoint(userId, mergerOrder.getPlatform());
                 // 使用雪花算法生成的订单号
                 String orderNumber = String.valueOf(snowflake.nextId());
                 shopCartOrderDto.setOrderNumber(orderNumber);
@@ -432,12 +432,14 @@ public class SubmitOrderListener {
                 pr.setVariablePoints(BigDecimal.valueOf(actualTotal));
                 actualTotal = 0.0;
             }
+            pointsRecord.setCurrentlyAvailablePoints(pointsRecord.getPoints().subtract(pointsRecord.getVariablePoints()));
             int update = pointsRecordMapper.updateById(pointsRecord);
             if (update > 0) {
                 pr.setId(null);
                 pr.setPointsType(2);
                 pr.setOrderNumber(orderNumber);
                 pr.setExpiryDate(null);
+                pr.setCurrentlyAvailablePoints(pr.getPoints().subtract(pr.getVariablePoints()));
                 pointsRecordMapper.insert(pr);
             }
             //  插入数据库

+ 5 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopCartOrderMergerDto.java

@@ -39,7 +39,10 @@ public class ShopCartOrderMergerDto implements Serializable {
     private Integer scorePrice;
 
     @ApiModelProperty(value = "整个订单使用的积分数", required = true)
-    private Integer totalUsableScore = 0;
+    private Double totalUsableScore = 0.0;
+
+    @ApiModelProperty(value = "所有可用积分")
+    private Long totalAvailableScore;
 
     @ApiModelProperty(value = "整个订单最多可以使用的积分数", required = true)
     private Integer maxUsableScore = 0;
@@ -80,5 +83,6 @@ public class ShopCartOrderMergerDto implements Serializable {
     private Integer platform;
 
     private Double weight;
+
     private Boolean nextPay = Boolean.FALSE;
 }

+ 47 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ScoreDataDto.java

@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ */
+
+package com.yami.shop.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 积分中心信息
+ *
+ * @author LHD
+ * @date 2019-12-19 10:27:46
+ */
+@Data
+public class ScoreDataDto implements Serializable{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 用户总充值积分
+     */
+    @ApiModelProperty(value = "用户总充值积分")
+    private Long totalRechargedPoints;
+    /**
+     * 已过期的积分
+     */
+    @ApiModelProperty(value = "已过期的积分")
+    private Long expiredPoints;
+    /**
+     * 当前可用积分
+     */
+    @ApiModelProperty(value = "当前可用积分")
+    private Long totalAvailablePoints;
+     /**
+     * 已消耗的积分
+     */
+    @ApiModelProperty(value = "已消耗的积分")
+    private Long consumedPoints;
+
+
+}

+ 21 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecord.java

@@ -1,5 +1,6 @@
 package com.yami.shop.bean.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -7,7 +8,6 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -66,6 +66,10 @@ public class PointsRecord implements Serializable {
      * 变动积分
      */
     private BigDecimal variablePoints;
+    /**
+     * 当前可用积分
+     */
+    private BigDecimal currentlyAvailablePoints;
 
     /**
      * 积分记录类型(1-充值,2-下单,3-退款)
@@ -82,10 +86,26 @@ public class PointsRecord implements Serializable {
      */
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date creationDate;
+    //
+    @TableField(exist = false)
+    private String creationDateStr;
+
+    @TableField(exist = false)
+    private String pointsTypeStr;
+
+    @TableField(exist = false)
+    private Long totalAvailablePoints;
+
+    /**
+     * 变动积分
+     */
+    @TableField(exist = false)
+    private String variablePointsStr;
 
     /**
      * 过期日期
      */
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date expiryDate;
+
 }

+ 3 - 1
yami-shop-service/src/main/java/com/yami/shop/dao/PointsRecordMapper.java

@@ -2,6 +2,7 @@
 package com.yami.shop.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.shop.bean.dto.ScoreDataDto;
 import com.yami.shop.bean.model.PointsRecord;
 import org.apache.ibatis.annotations.Param;
 
@@ -12,6 +13,7 @@ import org.apache.ibatis.annotations.Param;
  * @since 2025-09-XX
  */
 public interface PointsRecordMapper extends BaseMapper<PointsRecord> {
-    Integer statisticsPoint(@Param("userId") String userId, @Param("platform") Integer platform);
+    Long statisticsPoint(@Param("userId") String userId, @Param("platform") Integer platform);
+    ScoreDataDto statisticsAllScorePoint(@Param("userId") String userId, @Param("platform") Integer platform);
 
 }

+ 9 - 6
yami-shop-service/src/main/java/com/yami/shop/service/impl/ProductServiceImpl.java

@@ -756,15 +756,18 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     public IPage<Product> listProdByCategoryIdAndShopId(ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO) {
         IPage<Product> productIPage = productMapper.listProdByCIdAndSId(new Page<>(prodByCategoryIdAndShopIdDTO.getCurrent(), prodByCategoryIdAndShopIdDTO.getSize()),
                 prodByCategoryIdAndShopIdDTO);
-        if (productIPage.getRecords().isEmpty()) {
-            productIPage = productMapper.listProdByCategoryIdAndShopId2(new Page<>(prodByCategoryIdAndShopIdDTO.getCurrent(), prodByCategoryIdAndShopIdDTO.getSize()),
-                    prodByCategoryIdAndShopIdDTO);
-        }
+//        if (productIPage.getRecords().isEmpty()) {
+//            productIPage = productMapper.listProdByCategoryIdAndShopId2(new Page<>(prodByCategoryIdAndShopIdDTO.getCurrent(), prodByCategoryIdAndShopIdDTO.getSize()),
+//                    prodByCategoryIdAndShopIdDTO);
+//        }
         productIPage.getRecords().forEach(product -> {
-            List<Sku> skus = skuMapper.selectList(Wrappers.<Sku>lambdaQuery().eq(Sku::getProdId, product.getProdId()));
+//            List<Sku> skus = skuMapper.selectList(Wrappers.<Sku>lambdaQuery().eq(Sku::getProdId, product.getProdId()));
             //TODO wangjian 查询具体的价格
-            product.setSkuList(skus);
+//            product.setSkuList(skus);
+            List<Sku> skuList = skuMapper.listByProdId(product.getProdId());
+            product.setSkuList(skuList);
         });
+
         return productIPage;
     }
 

+ 6 - 6
yami-shop-service/src/main/resources/mapper/OrderMapper.xml

@@ -570,12 +570,12 @@
     <select id="getOrderCount" resultType="com.yami.shop.bean.app.dto.OrderCountData">
         SELECT
         COUNT(o.order_id) all_count,
-        COUNT( CASE WHEN o.hbOrderStatus = 0 THEN o.order_id ELSE NULL END ) AS unPay,
-        COUNT( CASE WHEN o.hbOrderStatus = 20 THEN o.order_id ELSE NULL END ) AS payed,
-        COUNT( CASE WHEN o.hbOrderStatus = 30 THEN o.order_id ELSE NULL END ) AS consignment,
-        COUNT( CASE WHEN o.hbOrderStatus = 40 THEN o.order_id ELSE NULL END ) AS confirm,
-        COUNT( CASE WHEN o.hbOrderStatus = 50 THEN o.order_id ELSE NULL END ) AS success,
-        COUNT( CASE WHEN o.hbOrderStatus = 60 THEN o.order_id ELSE NULL END ) AS `close`
+        COUNT( CASE WHEN o.hb_order_status = 0 THEN o.order_id ELSE NULL END ) AS unPay,
+        COUNT( CASE WHEN o.hb_order_status = 20 THEN o.order_id ELSE NULL END ) AS payed,
+        COUNT( CASE WHEN o.hb_order_status = 30 THEN o.order_id ELSE NULL END ) AS consignment,
+        COUNT( CASE WHEN o.hb_order_status = 40 THEN o.order_id ELSE NULL END ) AS confirm,
+        COUNT( CASE WHEN o.hb_order_status = 50 THEN o.order_id ELSE NULL END ) AS success,
+        COUNT( CASE WHEN o.hb_order_status = 60 THEN o.order_id ELSE NULL END ) AS `close`
         FROM tz_order o
         WHERE o.user_id =#{userId} AND o.delete_status = 0
     </select>

+ 25 - 1
yami-shop-service/src/main/resources/mapper/PointsRecordMapper.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.yami.shop.dao.PointsRecordMapper">
 
-    <select id="statisticsPoint" resultType="java.lang.Integer">
+    <select id="statisticsPoint" resultType="java.lang.Long">
         SELECT SUM(
                        CASE
                            WHEN points_audit = 1 THEN points
@@ -16,4 +16,28 @@
           AND points_audit IN (1, 2)
           AND (expiry_date > NOW() OR expiry_date IS NULL)
     </select>
+
+      <select id="statisticsAllScorePoint" resultType="com.yami.shop.bean.dto.ScoreDataDto">
+          SELECT
+          SUM( CASE WHEN points_audit = 1 THEN points WHEN points_audit = 2 THEN points - variable_points END ) AS total_available_points,
+          SUM( points ) AS total_recharged_points,
+          SUM(CASE WHEN points_audit IN ( 1, 2 ) AND expiry_date &lt;= NOW() THEN CASE
+          points_audit
+          WHEN 1 THEN
+          points
+          WHEN 2 THEN
+          points - variable_points
+          END ELSE 0
+          END
+          ) AS expired_points,
+          SUM( CASE WHEN points_audit = 3 THEN points WHEN points_audit = 2 THEN variable_points ELSE 0 END ) AS
+          consumed_points
+          FROM
+          tz_points_record
+          WHERE
+          user_id = #{userId}
+          AND channel_id =#{platform}
+          AND points_type IN (1, 3)
+      </select>
+
 </mapper>

+ 41 - 7
yami-shop-service/src/main/resources/mapper/ProductMapper.xml

@@ -741,19 +741,53 @@
 
     <select id="listProdByCIdAndSId" parameterType="com.yami.shop.bean.dto.ProdByCategoryIdAndShopIdDTO" resultType="com.yami.shop.bean.model.Product">
         SELECT
-            p.*
+            tp.prod_id,
+            MAX(tp.prod_name) AS prod_name,
+            tsc.shop_id AS shop_id,
+            MAX(tp.brand_id) AS brand_id,
+            MAX(tp.brand_name) AS brand_name,
+            MAX(tp.ori_price) AS ori_price,
+            MIN(cp.channel_prod_price) as price,
+            MAX(tp.score_price) AS score_price,
+            MAX(tp.brief) AS brief,
+            MAX(tp.video) AS video,
+            MAX(tp.pic) AS pic,
+            MAX(tp.content) AS content,
+            MAX(tp.imgs) AS imgs,
+            MAX(tp.status) AS status,
+            MAX(tp.is_delete) AS is_delete,
+            MAX(tp.shop_category_id) AS shop_category_id,
+            MAX(tp.category_id) AS category_id,
+            MAX(tp.hb_front_category_id) AS hb_front_category_id,
+            MAX(tp.sold_num) AS sold_num,
+            SUM(tss.shop_sku_stocks) AS total_stocks,
+            MAX(tp.delivery_mode) AS delivery_mode,
+            MAX(tp.delivery_template_id) AS delivery_template_id,
+            MAX(tp.create_time) AS create_time,
+            MAX(tp.update_time) AS update_time,
+            MAX(tp.putaway_time) AS putaway_time,
+            MAX(tp.version) AS version,
+            MAX(tp.prod_type) AS prod_type,
+            MAX(tp.activity_id) AS activity_id,
+            MAX(tp.sup_id) AS sup_id,
+            MAX(tp.hb_spu_id) AS hb_spu_id,
+            MAX(tp.hb_status) AS hb_status
         FROM
-            tz_prod p
-                LEFT JOIN tz_category_prod tcp ON p.prod_id=tcp.prod_id
-                LEFT JOIN tz_shop_category tsc ON tcp.`code`=tsc.`code`
+            tz_prod tp
+                LEFT JOIN tz_category_prod tcp ON tp.prod_id = tcp.prod_id
+                LEFT JOIN tz_shop_category tsc ON tcp.`code` = tsc.`code`
+                LEFT JOIN tz_shop_sku tss ON  tss.spu_id=tcp.prod_id
+                LEFT JOIN tz_channel_prod cp ON  (cp.shop_id=tsc.shop_id AND cp.sku_id=tss.sku_id)
         WHERE
-            p.STATUS = 1
+            tp.STATUS = 1
           AND tcp.is_delete = 0
           AND tsc.is_delete = 0
-          AND p.shop_id=#{prodByCategoryIdAndShopIdDTO.shopId}
+          AND cp.channel_prod_price IS NOT NULL
+          AND tsc.shop_id=#{prodByCategoryIdAndShopIdDTO.shopId}
           AND tsc.id=#{prodByCategoryIdAndShopIdDTO.categoryId}
+        GROUP BY tp.prod_id, tsc.shop_id
         ORDER BY
-            p.create_time DESC
+            MAX(tp.create_time) DESC
     </select>
 
     <select id="listProdByCategoryIdAndShopId2" parameterType="com.yami.shop.bean.dto.ProdByCategoryIdAndShopIdDTO" resultType="com.yami.shop.bean.model.Product">

+ 22 - 113
yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/controller/UserScoreController.java

@@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.enums.ScoreLogType;
 import com.yami.shop.bean.event.UpdateUserScoreEvent;
+import com.yami.shop.bean.model.PointsRecord;
 import com.yami.shop.bean.param.ScoreExpireParam;
 import com.yami.shop.common.bean.SysConfig;
 import com.yami.shop.bean.model.UserExtension;
@@ -24,8 +25,7 @@ import com.yami.shop.common.util.PageParam;
 import com.yami.shop.security.api.util.SecurityUtils;
 import com.yami.shop.service.SysConfigService;
 import com.yami.shop.service.UserExtensionService;
-import com.yami.shop.user.comment.dto.ScoreDataDto;
-import com.yami.shop.user.comment.model.UserLevel;
+import com.yami.shop.bean.dto.ScoreDataDto;
 import com.yami.shop.user.comment.model.UserScoreDetail;
 import com.yami.shop.user.comment.model.UserScoreLog;
 import com.yami.shop.user.comment.service.UserLevelService;
@@ -37,13 +37,12 @@ import lombok.AllArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.context.ApplicationContext;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+
 /**
  * 用户积分信息管理实现
  *
@@ -59,133 +58,41 @@ public class UserScoreController {
 
     private final UserScoreLogService scoreLogService;
     private final UserScoreDetailService userScoreDetailService;
-    private final ApplicationContext applicationContext;
     private final SysConfigService sysConfigService;
-    private final UserExtensionService userExtensionService;
-    private final UserLevelService userLevelService;
-
-
-    @GetMapping("/updateUserScore")
-    @ApiOperation(value = "积分签到", notes = "积分签到")
-    public ResponseEntity<String> updateUserScore() {
-        String userId = SecurityUtils.getUser().getUserId();
-        ScoreConfigParam scoreParam = sysConfigService.getSysConfigObject(Constant.SCORE_CONFIG, ScoreConfigParam.class);
-        //签到,计算连续签到日期
-        if(isSignIn(userId)){
-            return ResponseEntity.ok("今天已经签到过了,请明天再试!");
-        }
-        //根据逗号分隔
-        String[] signInScore = scoreParam.getSignInScoreString().split(StrUtil.COMMA);
-        Integer count = getCount(userId);
-        count++;
-        int score = Integer.parseInt(signInScore[count - 1]);
-        String remarks = "签到第" + count + "天获取的积分";
-        applicationContext.publishEvent(new UpdateUserScoreEvent(ScoreLogType.SIGN_IN.value(),score,1,
-                null, remarks,userId));
-        return ResponseEntity.ok("领取积分成功");
-    }
 
-    /**
-     * 获取数据库的签到记录记录
-     * @param userId
-     * @return
-     */
-    private Integer getCount(String userId) {
-        Integer count = scoreLogService.getConsecutiveDays(userId);
-        //如果没有记录就是第一天签到
-        if(count == null){
-            count = 0;
-        }
-        //如果是第七天之后都是第七天的奖励
-        count = Math.min(6,count);
-        return count;
-    }
 
     @GetMapping("/scoreInfo")
     @ApiOperation(value = "查看积分中心信息", notes = "查看积分中心信息")
-    public ResponseEntity<ScoreDataDto> scoreInfo() {
-        ScoreDataDto scoreDataDto = new ScoreDataDto();
+    public ResponseEntity<ScoreDataDto> scoreInfo(@RequestParam Integer platform) {
         String userId = SecurityUtils.getUser().getUserId();
-        ScoreConfigParam scoreParam = sysConfigService.getSysConfigObject(Constant.SCORE_CONFIG, ScoreConfigParam.class);
-        // 0.计算过期时间
-        ScoreExpireParam scoreExpireParam = sysConfigService.getSysConfigObject(Constant.SCORE_EXPIRE,ScoreExpireParam.class);
-        if (Objects.isNull(scoreParam)) {
-            return ResponseEntity.ok().build();
-        }
-        Integer year = Objects.isNull(scoreExpireParam) ? 0:scoreExpireParam.getExpireYear();
-        ArrayList<Integer> signInScores = new ArrayList<>();
-        for(String s : scoreParam.getSignInScoreString().trim().split(StrUtil.COMMA)){
-            Integer signInScore = Integer.valueOf(s);
-            signInScores.add(signInScore);
-        }
-        UserExtension userExtension = userExtensionService.getOne(new LambdaQueryWrapper<UserExtension>().eq(UserExtension::getUserId, userId));
-        if (userExtension == null) {
-            return ResponseEntity.ok().build();
-        }
-        UserScoreDetail userScoreDetail = userScoreDetailService.getOne(new LambdaQueryWrapper<UserScoreDetail>().eq(UserScoreDetail::getUserId, userId)
-                .eq(UserScoreDetail::getStatus, -1).orderByDesc(UserScoreDetail::getExpireTime).last("limit 1"));
-        scoreDataDto.setIsRegister(1);
-        scoreDataDto.setExpireScore(Objects.nonNull(userScoreDetail) ?userScoreDetail.getUsableScore():0);
-        scoreDataDto.setExpireYear(year);
-        scoreDataDto.setGrowth(userExtension.getGrowth());
-        scoreDataDto.setScore(userExtension.getScore());
-        scoreDataDto.setScoreList(signInScores);
-        scoreDataDto.setRegisterScore(scoreParam.getRegisterScore());
-        scoreDataDto.setShopScore(scoreParam.getShopGetScore());
-        scoreDataDto.setIsSignIn(isSignIn(userId)? 1:0);
-        scoreDataDto.setLevelType(userExtension.getLevelType());
-//        UserLevel userLevel = userLevelService.getOne(new LambdaQueryWrapper<UserLevel>()
-//                .eq(UserLevel::getLevel, userExtension.getLevel())
-//                .eq(UserLevel::getLevelType, userExtension.getLevelType())
-//        );
-        //scoreDataDto.setLevelName(userLevel.getLevelName());
-        //计算签到天数
-        Integer count = scoreLogService.getConsecutiveDays(userId);
-        //如果没有记录就是第一天签到
-        if(count == null){
-            count = 1;
-        }
-        count = Math.min(7,count);
-        scoreDataDto.setSignInCount(isSignIn(userId)?count:count+ 1);
-        return ResponseEntity.ok(scoreDataDto);
+        return ResponseEntity.ok(userScoreDetailService.doGetUserScore(userId, platform));
     }
 
-    /**
-     * 是否已经签到
-     * @param userId
-     * @return
-     */
-    private boolean isSignIn(String userId){
-        List<UserScoreLog> scoreList = scoreLogService.list(new LambdaQueryWrapper<UserScoreLog>().eq(UserScoreLog::getSource, ScoreLogType.SIGN_IN.value())
-                                                        .ge(UserScoreLog::getCreateTime, DateUtil.beginOfDay(DateUtil.date()))
-                                                        .le(UserScoreLog::getCreateTime, DateUtil.endOfDay(DateUtil.date()))
-                                                        .eq(UserScoreLog::getUserId, userId));
-        return CollectionUtils.isNotEmpty(scoreList);
-    }
 
     /**
      * 分页查询积分明细
+     *
      * @param page 分页对象
      * @return 分页数据
      */
-    @GetMapping("/page" )
+    @GetMapping("/page")
     @ApiOperation(value = "查询积分明细", notes = "查询积分明细")
-    public ResponseEntity<IPage<UserScoreLog>> getScoreLogPage(PageParam<UserScoreLog> page) {
+    public ResponseEntity<IPage<PointsRecord>> getScoreLogPage(@ModelAttribute PageParam<PointsRecord> page, @RequestParam Integer platform) {
         String userId = SecurityUtils.getUser().getUserId();
-        return ResponseEntity.ok(scoreLogService.page(page,new LambdaQueryWrapper<UserScoreLog>()
-                .eq(UserScoreLog::getUserId,userId).orderByDesc(UserScoreLog::getCreateTime)));
+        return ResponseEntity.ok(userScoreDetailService.doGetScorePage(page, userId,platform));
     }
 
 
     /**
      * 积分说明
+     *
      * @return 积分说明
      */
-    @GetMapping("/getScoreExplain" )
+    @GetMapping("/getScoreExplain")
     @ApiOperation(value = "积分说明", notes = "积分说明")
     public ResponseEntity<SysConfig> getScoreExplain() {
-        SysConfig config = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getParamKey,Constant.SCORE_EXPLAIN));
-        if(Objects.isNull(config)){
+        SysConfig config = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getParamKey, Constant.SCORE_EXPLAIN));
+        if (Objects.isNull(config)) {
             return ResponseEntity.ok(new SysConfig());
         }
         return ResponseEntity.ok(config);
@@ -193,13 +100,14 @@ public class UserScoreController {
 
     /**
      * 等级页展示
+     *
      * @return 等级页展示
      */
-    @GetMapping("/getLevelShow" )
+    @GetMapping("/getLevelShow")
     @ApiOperation(value = "等级页展示", notes = "等级页展示")
     public ResponseEntity<String> getLevelShow() {
-        String config = sysConfigService.getSysConfigObject(Constant.LEVEL_SHOW,String.class);
-        if(Objects.isNull(config)){
+        String config = sysConfigService.getSysConfigObject(Constant.LEVEL_SHOW, String.class);
+        if (Objects.isNull(config)) {
             return ResponseEntity.ok().build();
         }
         return ResponseEntity.ok(config);
@@ -207,13 +115,14 @@ public class UserScoreController {
 
     /**
      * 积分常见问题
+     *
      * @return 积分常见问题
      */
-    @GetMapping("/getScoreQuestion" )
+    @GetMapping("/getScoreQuestion")
     @ApiOperation(value = "积分常见问题", notes = "积分常见问题")
     public ResponseEntity<SysConfig> getScoreQuestion() {
-        SysConfig config = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getParamKey,Constant.SCORE_QUESTION));
-        if(Objects.isNull(config)){
+        SysConfig config = sysConfigService.getOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getParamKey, Constant.SCORE_QUESTION));
+        if (Objects.isNull(config)) {
             return ResponseEntity.ok(new SysConfig());
         }
         return ResponseEntity.ok(config);

+ 0 - 3
yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/listener/SubmitOrderListener.java

@@ -126,9 +126,6 @@ public class SubmitOrderListener {
         }
         userScoreLogService.saveBatch(logList);
         userScoreDetailService.updateBatchById(updateScoreDetails);
-        //保存用户积分
-        userExtension.setScore(userExtension.getScore() - mergerOrder.getTotalUsableScore());
-        userExtensionService.updateById(userExtension);
     }
 
 }

+ 0 - 90
yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/dto/ScoreDataDto.java

@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- */
-
-package com.yami.shop.user.comment.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * 积分中心信息
- *
- * @author LHD
- * @date 2019-12-19 10:27:46
- */
-@Data
-public class ScoreDataDto implements Serializable{
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 签到积分列表
-     */
-    @ApiModelProperty(value = "签到积分列表")
-    private List<Integer> scoreList;
-    /**
-     * 用户积分
-     */
-    @ApiModelProperty(value = "用户积分")
-    private Integer score;
-    /**
-     * 上次结算过期的积分
-     */
-    @ApiModelProperty(value = "上次结算过期的积分")
-    private Integer expireScore;
-    /**
-     * 过期时间(年)
-     */
-    @ApiModelProperty(value = "过期时间(年)")
-    private Integer expireYear;
-    /**
-     * 等级名称
-     */
-    @ApiModelProperty(value = "等级名称")
-    private String levelName;
-    /**
-     * 等级类型 0 普通会员 1 付费会员
-     */
-    @ApiModelProperty(value = "等级类型 0 普通会员 1 付费会员")
-    private Integer levelType;
-    /**
-     * 用户当前成长值
-     */
-    @ApiModelProperty(value = "用户当前成长值")
-    private Integer growth;
-    /**
-     * 注册可获取积分
-     */
-    @ApiModelProperty(value = "注册可获取积分")
-    private Integer registerScore;
-    /**
-     * 购物可获取积分
-     */
-    @ApiModelProperty(value = "购物可获取积分")
-    private Double shopScore;
-
-    /**
-     * 是否已经签到 1是 0否
-     */
-    @ApiModelProperty(value = "是否已经签到 1是 0否")
-    private Integer isSignIn;
-
-    /**
-     * 是否已经注册 1是 0否
-     */
-    @ApiModelProperty(value = "是否已经注册 1是 0否")
-    private Integer isRegister;
-
-    /**
-     * 签到第几天
-     */
-    @ApiModelProperty(value = "签到第几天")
-    private Integer signInCount;
-
-}

+ 10 - 4
yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/UserScoreDetailService.java

@@ -8,14 +8,16 @@
 package com.yami.shop.user.comment.service;
 
 import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.shop.bean.dto.ScoreDataDto;
+import com.yami.shop.bean.model.PointsRecord;
+import com.yami.shop.common.util.PageParam;
 import com.yami.shop.user.comment.model.UserScoreDetail;
-
-import java.util.List;
+import com.yami.shop.user.comment.model.UserScoreLog;
+import io.swagger.models.auth.In;
 
 /**
- *
- *
  * @author lhd
  * @date 2020-05-25 15:31:02
  */
@@ -24,4 +26,8 @@ public interface UserScoreDetailService extends IService<UserScoreDetail> {
     void updateExpireScoreDetail(DateTime dateTime);
 
     void updateLogAndDetail(Long orderId, String userId);
+
+    ScoreDataDto doGetUserScore(String userId, Integer platform);
+
+    IPage<PointsRecord> doGetScorePage(PageParam<PointsRecord> page, String userId, Integer platform);
 }

+ 68 - 11
yami-shop-user/yami-shop-user-comment/src/main/java/com/yami/shop/user/comment/service/impl/UserScoreDetailServiceImpl.java

@@ -11,13 +11,15 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yami.shop.bean.enums.ScoreLogType;
-import com.yami.shop.bean.model.User;
+import com.yami.shop.bean.model.PointsRecord;
 import com.yami.shop.bean.model.UserExtension;
-import com.yami.shop.dao.UserExtensionMapper;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.dao.PointsRecordMapper;
 import com.yami.shop.service.UserExtensionService;
-import com.yami.shop.user.comment.dao.UserScoreLogMapper;
+import com.yami.shop.bean.dto.ScoreDataDto;
 import com.yami.shop.user.comment.model.UserScoreDetail;
 import com.yami.shop.user.comment.dao.UserScoreDetailMapper;
 import com.yami.shop.user.comment.model.UserScoreLog;
@@ -28,12 +30,13 @@ import org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
 
 /**
- *
- *
  * @author lhd
  * @date 2020-05-25 15:31:02
  */
@@ -44,10 +47,12 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
     private final UserScoreDetailMapper scoreDetailMapper;
     private final UserExtensionService userExtensionService;
     private final UserScoreLogService userScoreLogService;
+    private final PointsRecordMapper pointsRecordMapper;
 
 
     /**
      * 修改用户过期积分
+     *
      * @param dateTime 过期时间
      */
     @Override
@@ -59,7 +64,7 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
 
         // 1.查询有积分过期的用户
         List<UserScoreDetail> userScoreDetails = scoreDetailMapper.listExpireScoreDetail(dateTime);
-        if(CollectionUtils.isEmpty(userScoreDetails)){
+        if (CollectionUtils.isEmpty(userScoreDetails)) {
             return;
         }
         // 2.修改用户积分信息
@@ -84,10 +89,10 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
             logList.add(userScoreLog);
         }
         // 批量修改用户积分和添加积分日志
-        if(CollectionUtils.isNotEmpty(userExtensions)){
+        if (CollectionUtils.isNotEmpty(userExtensions)) {
             userExtensionService.updateBatchByUserId(userExtensions);
         }
-        if(CollectionUtils.isNotEmpty(logList)){
+        if (CollectionUtils.isNotEmpty(logList)) {
             userScoreLogService.saveBatch(logList);
         }
         // 3.修改积分明细
@@ -100,21 +105,22 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
 
     /**
      * 取消订单时修改用户积分和添加日志
+     *
      * @param orderId 订单号
-     * @param userId 用户id
+     * @param userId  用户id
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateLogAndDetail(Long orderId, String userId) {
         UserExtension userExtension = userExtensionService.getOne(
                 new LambdaQueryWrapper<UserExtension>().eq(UserExtension::getUserId, userId));
-        if(Objects.isNull(userExtension)){
+        if (Objects.isNull(userExtension)) {
             return;
         }
         //修改积分明细
         List<UserScoreDetail> scoreDetails = list(new LambdaUpdateWrapper<UserScoreDetail>()
                 .eq(UserScoreDetail::getBizId, orderId).eq(UserScoreDetail::getStatus, 0));
-        if(CollectionUtils.isEmpty(scoreDetails)){
+        if (CollectionUtils.isEmpty(scoreDetails)) {
             return;
         }
         //要修改的用户积分,状态为-1表示还没过期的可以返还的用户积分
@@ -136,4 +142,55 @@ public class UserScoreDetailServiceImpl extends ServiceImpl<UserScoreDetailMappe
         scoreLog.setIoType(1);
         userScoreLogService.save(scoreLog);
     }
+
+    @Override
+    public ScoreDataDto doGetUserScore(String userId, Integer platform) {
+        return pointsRecordMapper.statisticsAllScorePoint(userId, platform);
+    }
+
+    @Override
+    public IPage<PointsRecord> doGetScorePage(PageParam<PointsRecord> page, String userId, Integer platform) {
+        IPage<PointsRecord> pointsRecordIPage = pointsRecordMapper.selectPage(page, new LambdaQueryWrapper<PointsRecord>()
+                .eq(PointsRecord::getUserId, userId)
+                .eq(PointsRecord::getChannelId, platform)
+        );
+        SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日 HH:mm");
+        List<PointsRecord> collect = pointsRecordIPage.getRecords().stream().peek((pointsRecord) -> {
+            pointsRecord.setCreationDateStr(sdf.format(pointsRecord.getCreationDate()));
+            String mark = "";
+            if (isExpiredToday(pointsRecord.getExpiryDate())) {
+                pointsRecord.setPointsTypeStr("过期");
+                mark = "-";
+            } else {
+                switch (pointsRecord.getPointsType()) {
+                    case 1:
+                        pointsRecord.setPointsTypeStr("充值");
+                        mark = "+";
+                        break;
+                    case 2:
+                        pointsRecord.setPointsTypeStr("购物");
+                        mark = "-";
+                        break;
+                    case 3:
+                        pointsRecord.setPointsTypeStr("退款");
+                        mark = "+";
+                        break;
+                }
+            }
+            pointsRecord.setVariablePointsStr(mark + pointsRecord.getVariablePoints());
+            pointsRecord.setTotalAvailablePoints(pointsRecord.getCurrentlyAvailablePoints().longValue());
+        }).collect(Collectors.toList());
+        pointsRecordIPage.setRecords(collect);
+        return pointsRecordIPage;
+    }
+
+    public boolean isExpiredToday(Date expiryDate) {
+        if (null == expiryDate) return false;
+        LocalDate today = LocalDate.now();
+        LocalDate expiryLocalDate = expiryDate.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate();
+        return expiryLocalDate.isBefore(today);
+    }
+
 }