Procházet zdrojové kódy

Merge remote-tracking branch 'origin/dev' into dev

zjy před 1 měsícem
rodič
revize
62a5ad9c9e
30 změnil soubory, kde provedl 960 přidání a 98 odebrání
  1. 3 2
      alien-entity/src/main/java/shop/alien/entity/second/SecondRiskControlRecord.java
  2. 6 5
      alien-entity/src/main/java/shop/alien/entity/second/SecondUserCredit.java
  3. 6 5
      alien-entity/src/main/java/shop/alien/entity/second/SecondUserCreditRecord.java
  4. 20 0
      alien-entity/src/main/java/shop/alien/entity/second/vo/BatchUnshelveGoodsDTO.java
  5. 18 0
      alien-entity/src/main/java/shop/alien/entity/second/vo/RiskControlGoodsIdsDTO.java
  6. 18 0
      alien-entity/src/main/java/shop/alien/entity/second/vo/RiskControlGoodsQueryDTO.java
  7. 2 0
      alien-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsVo.java
  8. 2 0
      alien-entity/src/main/java/shop/alien/mapper/LifeUserDynamicsMapper.java
  9. 19 3
      alien-entity/src/main/java/shop/alien/mapper/LifeUserExpertMapper.java
  10. 17 0
      alien-entity/src/main/java/shop/alien/mapper/second/SecondGoodsMapper.java
  11. 8 0
      alien-entity/src/main/java/shop/alien/mapper/second/SecondUserCreditMapper.java
  12. 86 0
      alien-entity/src/main/resources/mapper/LifeUserDynamicsMapper.xml
  13. 69 0
      alien-second/src/main/java/shop/alien/second/controller/RiskControlGoodsController.java
  14. 19 0
      alien-second/src/main/java/shop/alien/second/controller/SecondUserPointsController.java
  15. 8 0
      alien-second/src/main/java/shop/alien/second/platform/PlatformSecondTradeController.java
  16. 2 0
      alien-second/src/main/java/shop/alien/second/service/PlatformSecondTradeService.java
  17. 26 0
      alien-second/src/main/java/shop/alien/second/service/RiskControlGoodsService.java
  18. 5 0
      alien-second/src/main/java/shop/alien/second/service/SecondUserCreditService.java
  19. 27 5
      alien-second/src/main/java/shop/alien/second/service/impl/PlatformSecondTradeServiceImpl.java
  20. 317 0
      alien-second/src/main/java/shop/alien/second/service/impl/RiskControlGoodsServiceImpl.java
  21. 21 7
      alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java
  22. 60 8
      alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java
  23. 53 1
      alien-second/src/main/java/shop/alien/second/service/impl/SecondUserCreditServiceImpl.java
  24. 2 2
      alien-store/src/main/java/shop/alien/store/controller/StoreUserExpertController.java
  25. 67 29
      alien-store/src/main/java/shop/alien/store/service/LifeUserDynamicsService.java
  26. 25 25
      alien-store/src/main/java/shop/alien/store/service/LifeUserStoreService.java
  27. 1 1
      alien-store/src/main/java/shop/alien/store/service/StoreUserExpertService.java
  28. 1 1
      alien-store/src/main/java/shop/alien/store/service/impl/ActivityInviteConfigServiceImpl.java
  29. 46 2
      alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java
  30. 6 2
      alien-store/src/main/java/shop/alien/store/service/impl/StoreUserExpertServiceImpl.java

+ 3 - 2
alien-entity/src/main/java/shop/alien/entity/second/SecondRiskControlRecord.java

@@ -68,9 +68,10 @@ public class SecondRiskControlRecord extends Model<SecondRiskControlRecord> {
 
     @TableField("delete_flag")
     @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    @TableLogic
     private Integer deleteFlag;
 
-    @TableField("created_time")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @ApiModelProperty(value = "创建时间")
     private Date createdTime;
@@ -79,7 +80,7 @@ public class SecondRiskControlRecord extends Model<SecondRiskControlRecord> {
     @ApiModelProperty(value = "创建人ID")
     private Integer createdUserId;
 
-    @TableField("updated_time")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @ApiModelProperty(value = "修改时间")
     private Date updatedTime;

+ 6 - 5
alien-entity/src/main/java/shop/alien/entity/second/SecondUserCredit.java

@@ -28,27 +28,28 @@ public class SecondUserCredit implements Serializable {
     private Integer userPoints;
 
     @TableField("delete_flag")
+    @TableLogic
     private Integer deleteFlag;
 
     @ApiModelProperty(value = "冻结时间")
     @TableField("freeze_time")
     private Date freezeTime;
 
-    @ApiModelProperty(value = "创建时间")
     @TableField(value = "created_time", fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
     private Date createdTime;
 
+    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
     @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
     private Integer createdUserId;
 
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "修改时间")
     private Date updatedTime;
 
+    @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
     @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
     private Integer updatedUserId;
 }

+ 6 - 5
alien-entity/src/main/java/shop/alien/entity/second/SecondUserCreditRecord.java

@@ -31,23 +31,24 @@ public class SecondUserCreditRecord implements Serializable {
     private Integer pointsType;
 
     @TableField("delete_flag")
+    @TableLogic
     private Integer deleteFlag;
 
-    @ApiModelProperty(value = "创建时间")
     @TableField(value = "created_time", fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
     private Date createdTime;
 
+    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
     @ApiModelProperty(value = "创建人ID")
-    @TableField("created_user_id")
     private Integer createdUserId;
 
-    @ApiModelProperty(value = "修改时间")
-    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "修改时间")
     private Date updatedTime;
 
+    @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
     @ApiModelProperty(value = "修改人ID")
-    @TableField("updated_user_id")
     private Integer updatedUserId;
 }

+ 20 - 0
alien-entity/src/main/java/shop/alien/entity/second/vo/BatchUnshelveGoodsDTO.java

@@ -0,0 +1,20 @@
+package shop.alien.entity.second.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 批量下架商品DTO
+ */
+@Data
+@ApiModel(value = "BatchUnshelveGoodsDTO", description = "批量下架商品参数")
+public class BatchUnshelveGoodsDTO {
+
+    @ApiModelProperty(value = "风控规则类型")
+    private Integer ruleType;
+
+    @ApiModelProperty(value = "业务ID")
+    private String businessId;
+}

+ 18 - 0
alien-entity/src/main/java/shop/alien/entity/second/vo/RiskControlGoodsIdsDTO.java

@@ -0,0 +1,18 @@
+package shop.alien.entity.second.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 风控商品ID查询DTO
+ */
+@Data
+@ApiModel(value = "RiskControlGoodsIdsDTO", description = "风控商品ID查询参数")
+public class RiskControlGoodsIdsDTO {
+
+    @ApiModelProperty(value = "商品记录表ID列表")
+    private List<Integer> recordIds;
+}

+ 18 - 0
alien-entity/src/main/java/shop/alien/entity/second/vo/RiskControlGoodsQueryDTO.java

@@ -0,0 +1,18 @@
+package shop.alien.entity.second.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 风控商品查询DTO
+ */
+@Data
+@ApiModel(value = "RiskControlGoodsQueryDTO", description = "风控商品查询参数")
+public class RiskControlGoodsQueryDTO {
+
+    @ApiModelProperty(value = "商品表ID列表")
+    private List<Integer> goodsIds;
+}

+ 2 - 0
alien-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsVo.java

@@ -69,6 +69,8 @@ public class SecondGoodsVo extends SecondGoods {
     @TableField(exist = false)
     private String categoryTwoName;
 
+    @ApiModelProperty(value = "商品图片列表")
+    private List<String> imageUrls;
     /** -------------------- 搜索入参 -------------------- */
 
     @TableField(exist = false)

+ 2 - 0
alien-entity/src/main/java/shop/alien/mapper/LifeUserDynamicsMapper.java

@@ -86,4 +86,6 @@ public interface LifeUserDynamicsMapper extends BaseMapper<LifeUserDynamics> {
 
     List<LifeUserDynamicsVo> getExpertDynamicsDetail(@Param("id") Integer id);
 
+    List<LifeUserDynamicsVo> getStoreDynamicslist(@Param("userId") String userId, @Param("phoneId") String phoneId);
+
 }

+ 19 - 3
alien-entity/src/main/java/shop/alien/mapper/LifeUserExpertMapper.java

@@ -117,12 +117,13 @@ public interface LifeUserExpertMapper extends BaseMapper<LifeUserExpert> {
             "    where delete_flag = 0 " +
             "    group by followed_id " +
             ") " +
-            " select expert.id, expert.expert_code, expert.expert_type, user.id AS user_id, user.user_image, user.user_name, user.user_phone, ifnull(fans.num, 0) fansNum " +
+            " select expert.id, expert.expert_code,expert.review_time reviewTime, expert.expert_type, user.id AS user_id, user.user_image, user.user_name, user.user_phone, ifnull(fans.num, 0) fansNum, ifnull(sum(work.like_count),0) likeNum " +
             " from life_user_expert expert " +
             " left join life_user user on user.id = expert.user_id " +
+            " left join life_user_expert_works work on expert.id = work.expert_id " +
             " left join fans on fans.followed_id = concat('user_', user.user_phone)  " +
-            " where expert.delete_flag = 0 and user.delete_flag = 0 " +
-            " ORDER BY fansNum DESC")
+            " where expert.delete_flag = 0 and user.delete_flag = 0 and work.delete_flag = 0 and expert.expert_status = 0 " +
+            " ORDER BY fansNum,reviewTime DESC")
     List<LifeUserExpertVo> getRankList();
 
     @Select("with fans as ( " +
@@ -130,6 +131,21 @@ public interface LifeUserExpertMapper extends BaseMapper<LifeUserExpert> {
             "    from life_fans " +
             "    where delete_flag = 0 " +
             "    group by followed_id " +
+            ") " +
+            " select expert.id, expert.expert_code,expert.review_time reviewTime, expert.expert_type, user.id AS user_id, user.user_image, user.user_name, user.user_phone, ifnull(fans.num, 0) fansNum, ifnull(sum(work.like_count),0) likeNum " +
+            " from life_user_expert expert " +
+            " left join life_user user on user.id = expert.user_id " +
+            " left join life_user_expert_works work on expert.id = work.expert_id " +
+            " left join fans on fans.followed_id = concat('user_', user.user_phone)  " +
+            " where expert.delete_flag = 0 and user.delete_flag = 0 and work.delete_flag = 0 and expert.expert_status = 0 " +
+            " ORDER BY likeNum,reviewTime DESC")
+    List<LifeUserExpertVo> getRankListByLikeCount();
+
+    @Select("with fans as ( " +
+            "    select followed_id, count(id) num " +
+            "    from life_fans " +
+            "    where delete_flag = 0 " +
+            "    group by followed_id " +
             "), " +  // 这里添加逗号分隔不同的 CTE
             "works as ( " +
             "    select expert_id, count(id) worksNum, sum(like_count) likeNum, sum(play_count) playNum " +

+ 17 - 0
alien-entity/src/main/java/shop/alien/mapper/second/SecondGoodsMapper.java

@@ -74,6 +74,23 @@ public interface SecondGoodsMapper extends BaseMapper<SecondGoods> {
     List<SecondGoods> getCollectTop10();
 
     /**
+     * 商品列表
+     * @return 结果列表
+     */
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName "+
+            " FROM second_goods sg " +
+            "left JOIN second_goods_category sgc1 " +
+            "on sg.category_one_id = sgc1.id " +
+            "left JOIN second_goods_category sgc2 " +
+            "on sg.category_two_id = sgc2.id "+
+            "${ew.customSqlSegment}")
+    List<SecondGoodsVo> selectGoodsList(@Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+
+    /**
      * 搜索结果-商品列表
      * @param page 分页参数
      * @return 搜索结果列表

+ 8 - 0
alien-entity/src/main/java/shop/alien/mapper/second/SecondUserCreditMapper.java

@@ -1,12 +1,20 @@
 package shop.alien.mapper.second;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 import shop.alien.entity.second.SecondUserCredit;
 
 
 /**
  * 二手商品映射器
  */
+@Mapper
 public interface SecondUserCreditMapper extends BaseMapper<SecondUserCredit> {
 
+    @Select("update second_user_credit set user_points = user_points + #{points} " +
+            "where user_id = #{userId} and delete_flag = 0 ")
+    void updatePointsByUserId(@Param("userId") int userId, @Param("points") int points);
+
 }

+ 86 - 0
alien-entity/src/main/resources/mapper/LifeUserDynamicsMapper.xml

@@ -113,4 +113,90 @@
         AND dy.delete_flag = 0
     </select>
 
+    <select id="getStoreDynamicslist" resultType="shop.alien.entity.store.vo.LifeUserDynamicsVo">
+        select
+        dyna1.*,
+        COUNT(dyna1.id) AS fansCount
+        from
+        (
+        select
+        dyna.*,
+        COUNT(sc.id) AS commentCount,
+        COUNT(lm.id) AS transferNum
+        from
+        (
+        with dynamice as(
+        select
+        CASE
+        WHEN image_path REGEXP '.mp4|.avi|.flv|.mkv|.rmvb|.wmv|.3gp|.mov' THEN 2
+        WHEN image_path REGEXP '.jpg|.jpeg|.png|.bmp|.webp|.gif|.svg' THEN 1
+        ELSE 0
+        END AS dynamicsType, id, title, phone_id phoneId, context, image_path, address, address_name, address_context, liulan_count, dianzan_count, type, created_time, substring_index(phone_id, '_', 1) userType, substring_index(phone_id, '_', -1) phone, draft , address_province, top_status, top_time, enable_status,
+        order_gmv,business_id
+        from life_user_dynamics
+        where phone_id = #{phoneId} and delete_flag = 0 and draft = 0 order by created_time desc
+        )
+        select
+        dynamice.*,
+        user.nick_name userName,
+        user.head_img userImage,
+        info.id storeUserId,
+        user.id storeOrUserId,
+        0 isExpert,
+        IF(llr.huifu_id IS NOT NULL or llr1.huifu_id IS NOT NULL, 1, 0) AS isLike
+        from
+        dynamice
+        left join store_user user on
+        dynamice.phone = user.phone
+        and user.delete_flag = 0
+        left join store_info info on
+        info.id = user.store_id
+        and info.delete_flag = 0
+        left join store_img img on
+        img.store_id = user.store_id
+        and img.img_type = '10'
+        and img.delete_flag = 0
+        left join life_like_record llr on
+        llr.huifu_id = dynamice.id
+        and llr.delete_flag = 0
+        and llr.dianzan_id = (
+        select
+        CONCAT('user_', lu1.user_phone)
+        from
+        life_user lu1
+        where
+        lu1.id = #{userId})
+        left join life_like_record llr1 on
+        llr1.huifu_id = dynamice.id
+        and llr1.delete_flag = 0
+        and llr1.dianzan_id = (
+        select
+        CONCAT('store_', lu2.phone)
+        from
+        store_user lu2
+        where
+        lu2.id = #{userId})
+        where
+        dynamice.userType = 'store') dyna
+        left join life_comment lc on
+        lc.dongtai_shequ_id = dyna.id
+        left join store_comment sc on
+        sc.business_id = dyna.id
+        and sc.business_type = 2
+        and sc.delete_flag = 0
+        left join life_message lm on
+        lm.business_id = dyna.id
+        GROUP BY
+        dyna.id
+        order by
+        dyna.created_time desc) dyna1
+        left join life_fans lf1 on
+        lf1.followed_id = dyna1.phoneId
+        GROUP by
+        dyna1.id
+        order by
+        dyna1.top_status desc,
+        dyna1.top_time desc
+    </select>
+
 </mapper>

+ 69 - 0
alien-second/src/main/java/shop/alien/second/controller/RiskControlGoodsController.java

@@ -0,0 +1,69 @@
+package shop.alien.second.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiSort;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.second.vo.*;
+import shop.alien.second.service.RiskControlGoodsService;
+import shop.alien.second.service.SecondGoodsService;
+
+import java.util.List;
+
+/**
+ * 风控商品信息控制器
+ */
+@Slf4j
+@Api(tags = {"二手平台-风控商品信息管理(管理后台)"})
+@ApiSort(2)
+@CrossOrigin
+@RestController
+@RequestMapping("/admin/riskControl")
+@RequiredArgsConstructor
+public class RiskControlGoodsController {
+
+    private final RiskControlGoodsService riskControlGoodsService;
+
+    /**
+     * 二手商品服务
+     */
+    private final SecondGoodsService secondGoodsService;
+    /**
+     * 通过商品记录表ID批量查询商品信息(包含图片)
+     *
+     * @param dto 商品记录表ID列表DTO
+     * @return 商品信息列表
+     */
+    @PostMapping("/goods/recordIds")
+    @ApiOperation("通过商品记录表ID批量查询商品信息")
+    public List<SecondGoodsRecordDetailVo> getGoodsInfoByRecordIds(@RequestBody RiskControlGoodsIdsDTO dto) {
+        return riskControlGoodsService.getGoodsInfoByRecordIds(dto.getRecordIds());
+    }
+
+    /**
+     * 通过商品表ID批量查询商品信息(包含图片)
+     *
+     * @param dto 商品表ID列表DTO
+     * @return 商品信息列表
+     */
+    @PostMapping("/goods/goodsIds")
+    @ApiOperation("通过商品表ID批量查询商品信息")
+    public List<SecondGoodsVo> getGoodsInfoByGoodsIds(@RequestBody RiskControlGoodsQueryDTO dto) {
+        return riskControlGoodsService.getGoodsInfoByGoodsIds(dto.getGoodsIds());
+    }
+
+
+    @PostMapping("/batch/unshelve")
+    @ApiOperation("根据风控记录批量下架商品")
+    public R<Boolean> batchUnshelveGoodsByRiskControl(@ApiParam("批量下架参数") @RequestBody BatchUnshelveGoodsDTO dto) {
+        log.info("AdminSecondGoodsController.batchUnshelveGoodsByRiskControl?dto={}", dto);
+
+        boolean result = secondGoodsService.batchShelveGoodsByRiskControlRecord(dto.getRuleType(), dto.getBusinessId());
+
+        return R.data(result, result ? "批量下架成功" : "批量下架失败");
+    }
+}

+ 19 - 0
alien-second/src/main/java/shop/alien/second/controller/SecondUserPointsController.java

@@ -1,5 +1,6 @@
 package shop.alien.second.controller;
 
+import com.alibaba.fastjson2.JSONObject;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -78,4 +79,22 @@ public class SecondUserPointsController {
             log.error("新建用户积分记录失败,userId={}, initialPoints={}", userId, initialPoints, e);
         }
     }
+
+    @ApiOperation("用户身份认证成功后增加信用分")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({@ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", required = true)})
+    @GetMapping("/addIdInfoPoints")
+    public R<Boolean> addIdInfoPoints(@RequestParam("userId") Integer userId) throws Exception {
+        log.info("SecondUserPointsController.addIdInfoPoints?userId={}", userId);
+        return R.data(secondUserCreditService.addIdInfoPoints(userId));
+    }
+
+    @ApiOperation("信用分是否达标")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({@ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Integer", required = true)})
+    @GetMapping("/isFree")
+    public R<JSONObject> isFree(@RequestParam("userId") Integer userId) throws Exception {
+        log.info("SecondUserPointsController.isFree?userId={}", userId);
+        return R.data(secondUserCreditService.isFree(userId));
+    }
 }

+ 8 - 0
alien-second/src/main/java/shop/alien/second/platform/PlatformSecondTradeController.java

@@ -65,4 +65,12 @@ public class PlatformSecondTradeController {
         return R.success("操作成功");
     }
 
+    @ApiOperation("查询存在洗钱嫌疑的交易")
+    @ApiOperationSupport(order = 6)
+    @GetMapping("/getTradeRecordListByRiskId")
+    public R<List<SecondTradeRecordVo>> getTradeRecordListByRiskId(Integer id) throws Exception {
+        log.info("PlatformSecondTradeController.getTradeRecordListByRiskId?id={}", id);
+        return R.data(secondTradeRecordService.getTradeRecordListByRiskId(id));
+    }
+
 }

+ 2 - 0
alien-second/src/main/java/shop/alien/second/service/PlatformSecondTradeService.java

@@ -23,4 +23,6 @@ public interface PlatformSecondTradeService extends IService<SecondTradeRecord>
     List<JSONObject> getRankingList(String beginTime, String endTime) throws Exception;
 
     void setTradeFailure(Integer tradeId, String failureReason) throws Exception;
+
+    List<SecondTradeRecordVo> getTradeRecordListByRiskId(Integer id) throws Exception;
 }

+ 26 - 0
alien-second/src/main/java/shop/alien/second/service/RiskControlGoodsService.java

@@ -0,0 +1,26 @@
+package shop.alien.second.service;
+
+import shop.alien.entity.second.vo.SecondGoodsRecordDetailVo;
+import shop.alien.entity.second.vo.SecondGoodsVo;
+
+import java.util.List;
+
+/**
+ * 风控商品服务接口
+ */
+public interface RiskControlGoodsService {
+
+    /**
+     * 通过商品记录表ID批量查询商品信息(包含图片)
+     * @param recordIds 商品记录表ID列表
+     * @return 商品信息列表
+     */
+    List<SecondGoodsRecordDetailVo> getGoodsInfoByRecordIds(List<Integer> recordIds);
+
+    /**
+     * 通过商品表ID批量查询商品信息(包含图片)
+     * @param goodsIds 商品表ID列表
+     * @return 商品信息列表
+     */
+    List<SecondGoodsVo> getGoodsInfoByGoodsIds(List<Integer> goodsIds);
+}

+ 5 - 0
alien-second/src/main/java/shop/alien/second/service/SecondUserCreditService.java

@@ -1,5 +1,6 @@
 package shop.alien.second.service;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.second.SecondUserCredit;
 
@@ -30,4 +31,8 @@ public interface SecondUserCreditService extends IService<SecondUserCredit> {
      * @return 是否创建成功
      */
     boolean createPointsRecord(Integer userId, Integer initialPoints, Integer pointsType);
+
+    boolean addIdInfoPoints(Integer userId) throws Exception;
+
+    JSONObject isFree(Integer userId) throws Exception;
 }

+ 27 - 5
alien-second/src/main/java/shop/alien/second/service/impl/PlatformSecondTradeServiceImpl.java

@@ -1,32 +1,34 @@
 package shop.alien.second.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import shop.alien.entity.second.SecondRiskControlRecord;
 import shop.alien.entity.second.SecondTradeOperation;
 import shop.alien.entity.second.SecondTradeRecord;
 import shop.alien.entity.second.vo.SecondTradeRecordVo;
+import shop.alien.mapper.second.SecondRiskControlRecordMapper;
 import shop.alien.mapper.second.SecondTradeOperationMapper;
 import shop.alien.mapper.second.SecondTradeRecordMapper;
 import shop.alien.second.service.PlatformSecondTradeService;
 import shop.alien.second.service.SecondGoodsService;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -37,6 +39,8 @@ public class PlatformSecondTradeServiceImpl extends ServiceImpl<SecondTradeRecor
     private SecondTradeRecordMapper secondTradeRecordMapper;
     @Autowired
     private SecondTradeOperationMapper secondTradeOperationMapper;
+    @Autowired
+    private SecondRiskControlRecordMapper secondRiskControlRecordMapper;
     @Lazy
     @Autowired
     private SecondGoodsService secondGoodsService;
@@ -304,4 +308,22 @@ public class PlatformSecondTradeServiceImpl extends ServiceImpl<SecondTradeRecor
         }
     }
 
+    @Override
+    public List<SecondTradeRecordVo> getTradeRecordListByRiskId(Integer id) throws Exception {
+        try {
+            SecondRiskControlRecord record = secondRiskControlRecordMapper.selectById(id);
+            Page<SecondTradeRecord> page = new Page<>(1, 1000000);
+            QueryWrapper<SecondTradeRecord> wrapper = new QueryWrapper<>();
+            wrapper.in("trade.id", JSONArray.parseArray(record.getDetailInfo()));
+            List<SecondTradeRecordVo> voList = secondTradeRecordMapper.getTradeRecordPage(page, wrapper).getRecords();
+            for (SecondTradeRecordVo item : voList) {
+                item.setOperationJsonList(getOperationJsonList(item.getId()));
+            }
+            return voList;
+        } catch (Exception e) {
+            log.error("PlatformSecondTradeServiceImpl.getTradeRecordListByRiskId(): Error Msg={}", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
 }

+ 317 - 0
alien-second/src/main/java/shop/alien/second/service/impl/RiskControlGoodsServiceImpl.java

@@ -0,0 +1,317 @@
+package shop.alien.second.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import shop.alien.entity.second.SecondGoods;
+import shop.alien.entity.second.SecondGoodsRecord;
+import shop.alien.entity.second.vo.SecondGoodsRecordDetailVo;
+import shop.alien.entity.second.vo.SecondGoodsVo;
+import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.mapper.LifeUserMapper;
+import shop.alien.mapper.StoreImgMapper;
+import shop.alien.mapper.second.SecondGoodsMapper;
+import shop.alien.mapper.second.SecondGoodsRecordMapper;
+import shop.alien.second.service.RiskControlGoodsService;
+import shop.alien.util.common.Constants;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 风控商品服务实现类
+ * 提供风控相关的商品信息查询服务,包括通过记录ID和商品ID批量查询商品详细信息
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class RiskControlGoodsServiceImpl implements RiskControlGoodsService {
+
+    /**
+     * 注入商品记录Mapper
+      */
+    private final SecondGoodsRecordMapper secondGoodsRecordMapper;
+
+    /**
+     * 注入商品Mapper
+     */
+    private final SecondGoodsMapper secondGoodsMapper;
+
+    /**
+     * 注入图片Mapper
+      */
+    private final StoreImgMapper storeImgMapper;
+
+    /**
+     * 注入用户Mapper
+     */
+    private final LifeUserMapper lifeUserMapper;
+
+    /**
+     * 通过商品记录表ID批量查询商品信息(包含图片)
+     * @param recordIds 商品记录表ID列表
+     * @return 商品信息列表
+     */
+    @Override
+    public List<SecondGoodsRecordDetailVo> getGoodsInfoByRecordIds(List<Integer> recordIds) {
+        // 检查传入ID列表是否为空,如果为空则直接返回空列表
+        if (CollectionUtils.isEmpty(recordIds)) {
+            return new ArrayList<>();
+        }
+
+        // 构建查询条件,根据记录ID列表查询商品记录信息
+        QueryWrapper<SecondGoodsRecord> queryWrapper = new QueryWrapper<>();
+        queryWrapper.in("sg.id", recordIds);
+        // 执行查询获取商品记录列表
+        List<SecondGoodsRecord> records = secondGoodsRecordMapper.selectdminGoodsList(queryWrapper);
+        
+        // 检查查询结果是否为空,如果为空则直接返回空列表
+        if (CollectionUtils.isEmpty(records)) {
+            return new ArrayList<>();
+        }
+
+        // 批量获取用户和图片信息
+        BatchQueryResult<SecondGoodsRecord> batchResult = batchQueryUserInfoAndImageInfo(records, 
+            SecondGoodsRecord::getUserId, SecondGoodsRecord::getId);
+
+        // 创建结果列表,用于存储最终的商品记录详情VO对象
+        List<SecondGoodsRecordDetailVo> result = new ArrayList<>();
+        // 遍历所有商品记录,构建对应的VO对象
+        for (SecondGoodsRecord record : records) {
+            // 根据商品记录创建VO对象
+            SecondGoodsRecordDetailVo detailVo = SecondGoodsRecordDetailVo.fromRecord(record);
+
+            // 如果记录中有用户ID且在用户映射表中存在该用户,则设置用户信息
+            if (record.getUserId() != null && batchResult.userMap.containsKey(record.getUserId())) {
+                // 从用户映射表中获取用户信息
+                LifeUser user = batchResult.userMap.get(record.getUserId());
+                // 设置用户名和用户手机号
+                detailVo.setUserName(user.getUserName());
+                detailVo.setUserPhone(user.getUserPhone());
+            }
+
+            // 如果图片映射表中包含该记录的ID,则设置图片信息
+            if (batchResult.imageMap.containsKey(record.getId())) {
+                // 从图片映射表中获取该记录的图片列表
+                List<StoreImg> recordImages = batchResult.imageMap.get(record.getId());
+                // 提取图片URL列表
+                List<String> imageUrls = recordImages.stream()
+                        .map(StoreImg::getImgUrl)
+                        .collect(Collectors.toList());
+                // 处理图片列表(区分图片和视频)
+                List<Map<String, Object>> imgList = processReportImages(recordImages, 2);
+                // 设置图片列表和图片URL列表
+                detailVo.setImgList(imgList);
+                detailVo.setImageUrls(imageUrls);
+            }
+
+            // 将构建好的VO对象添加到结果列表中
+            result.add(detailVo);
+        }
+
+        // 返回最终的结果列表
+        return result;
+    }
+
+    /**
+     * 通过商品表ID批量查询商品信息(包含图片)
+     * @param goodsIds 商品表ID列表
+     * @return 商品信息列表
+     */
+    @Override
+    public List<SecondGoodsVo> getGoodsInfoByGoodsIds(List<Integer> goodsIds) {
+        // 检查传入ID列表是否为空,如果为空则直接返回空列表
+        if (CollectionUtils.isEmpty(goodsIds)) {
+            return new ArrayList<>();
+        }
+
+        // 构建查询条件,根据商品ID列表查询商品信息
+        QueryWrapper<SecondGoodsVo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.in("sg.id", goodsIds);
+        // 执行查询获取商品列表
+        List<SecondGoodsVo> secondGoodsList = secondGoodsMapper.selectGoodsList(queryWrapper);
+
+        // 检查查询结果是否为空,如果为空则直接返回空列表
+        if (CollectionUtils.isEmpty(secondGoodsList)) {
+            return new ArrayList<>();
+        }
+
+        // 批量获取用户和图片信息
+        BatchQueryResult<SecondGoodsVo> batchResult = batchQueryUserInfoAndImageInfo(secondGoodsList,
+            SecondGoods::getUserId, SecondGoods::getId);
+
+        // 创建结果列表,用于存储最终的商品VO对象
+        List<SecondGoodsVo> result = new ArrayList<>();
+        // 遍历所有商品,构建对应的VO对象
+        for (SecondGoods secondGoods : secondGoodsList) {
+            // 创建新的商品VO对象
+            SecondGoodsVo secondGoodsVo = new SecondGoodsVo();
+            // 将商品属性复制到VO对象中
+            BeanUtils.copyProperties(secondGoods, secondGoodsVo);
+
+            // 如果VO对象中有用户ID且在用户映射表中存在该用户,则设置用户信息
+            if (secondGoodsVo.getUserId() != null && batchResult.userMap.containsKey(secondGoodsVo.getUserId())) {
+                // 从用户映射表中获取用户信息
+                LifeUser user = batchResult.userMap.get(secondGoodsVo.getUserId());
+                // 设置用户名和用户手机号
+                secondGoodsVo.setUserName(user.getUserName());
+                secondGoodsVo.setUserPhone(user.getUserPhone());
+            }
+
+            // 如果图片映射表中包含该商品的ID,则设置图片信息
+            if (batchResult.imageMap.containsKey(secondGoodsVo.getId())) {
+                // 从图片映射表中获取该商品的图片列表
+                List<StoreImg> recordImages = batchResult.imageMap.get(secondGoodsVo.getId());
+                // 提取图片URL列表
+                List<String> imageUrls = recordImages.stream()
+                        .map(StoreImg::getImgUrl)
+                        .collect(Collectors.toList());
+                // 处理图片列表(区分图片和视频)
+                List<Map<String, Object>> imgList = processReportImages(recordImages, 2);
+                // 设置图片列表和图片URL列表
+                secondGoodsVo.setImgList(imgList);
+                secondGoodsVo.setImageUrls(imageUrls);
+            }
+
+            // 将构建好的VO对象添加到结果列表中
+            result.add(secondGoodsVo);
+        }
+
+        // 返回最终的结果列表
+        return result;
+    }
+
+    /**
+     * 批量查询用户信息和图片信息的通用方法
+     * @param records 商品记录列表
+     * @param userIdGetter 获取用户ID的函数
+     * @param entityIdGetter 获取实体ID的函数(可能是记录ID或商品ID)
+     * @param <T> 记录类型
+     * @return 批量查询结果
+     */
+    private <T> BatchQueryResult<T> batchQueryUserInfoAndImageInfo(List<T> records, 
+            Function<T, Integer> userIdGetter, Function<T, Integer> entityIdGetter) {
+        
+        // 从商品记录中提取所有非空的用户ID并去重,用于后续批量查询用户信息
+        List<Integer> userIds = records.stream()
+                .map(userIdGetter)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+
+        // 创建用户映射表,用于存储用户ID到用户信息的映射关系
+        Map<Integer, LifeUser> userMap = new HashMap<>();
+        // 如果存在用户ID,则批量查询用户信息
+        if (!CollectionUtils.isEmpty(userIds)) {
+            // 构建用户查询条件,根据用户ID列表和未删除标识查询用户信息
+            QueryWrapper<LifeUser> userQueryWrapper = new QueryWrapper<>();
+            userQueryWrapper.lambda()
+                    .in(LifeUser::getId, userIds)
+                    .eq(LifeUser::getDeleteFlag, Constants.DeleteFlag.NOT_DELETED);
+            // 执行查询获取用户列表
+            List<LifeUser> users = lifeUserMapper.selectList(userQueryWrapper);
+            // 将用户列表转换为以用户ID为键的映射表,使用合并函数处理可能的重复键
+            userMap = users.stream().collect(Collectors.toMap(
+                LifeUser::getId,
+                user -> user,
+                (existing, replacement) -> existing // 处理键冲突,保留第一个值
+            ));
+        }
+
+        // 从商品记录中提取所有实体ID,用于后续查询图片信息
+        List<Integer> entityIdList = records.stream()
+                .map(entityIdGetter)
+                .collect(Collectors.toList());
+
+        // 构建图片查询条件,根据实体ID列表、图片类型和未删除标识查询图片信息
+        QueryWrapper<StoreImg> imageQueryWrapper = new QueryWrapper<>();
+        imageQueryWrapper.lambda()
+                .in(StoreImg::getStoreId, entityIdList)
+                .eq(StoreImg::getDeleteFlag, Constants.DeleteFlag.NOT_DELETED)
+                .orderByAsc(StoreImg::getImgSort);
+        
+        // 根据记录类型设置不同的图片类型
+        if (!records.isEmpty()) {
+            T firstRecord = records.get(0);
+            if (firstRecord instanceof SecondGoodsRecord) {
+                // 如果是商品记录类型,使用SECOND_HAND_RECORD类型
+                imageQueryWrapper.lambda()
+                        .eq(StoreImg::getImgType, Constants.ImageType.SECOND_HAND_RECORD);
+            } else if (firstRecord instanceof SecondGoodsVo) {
+                // 如果是商品类型,使用SECOND_HAND类型
+                imageQueryWrapper.lambda()
+                        .eq(StoreImg::getImgType, Constants.ImageType.SECOND_HAND_GOODS);
+            }
+        }
+        
+        // 执行查询获取图片列表
+        List<StoreImg> imageList = storeImgMapper.selectList(imageQueryWrapper);
+
+        // 将图片列表按照实体ID进行分组,方便后续关联到对应记录
+        Map<Integer, List<StoreImg>> imageMap = imageList.stream()
+                .collect(Collectors.groupingBy(StoreImg::getStoreId));
+        
+        // 返回批量查询结果
+        return new BatchQueryResult<>(userMap, imageMap);
+    }
+
+    /**
+     * 批量查询结果类
+     * @param <T> 记录类型
+     */
+    private static class BatchQueryResult<T> {
+        final Map<Integer, LifeUser> userMap;
+        final Map<Integer, List<StoreImg>> imageMap;
+
+        public BatchQueryResult(Map<Integer, LifeUser> userMap, Map<Integer, List<StoreImg>> imageMap) {
+            this.userMap = userMap;
+            this.imageMap = imageMap;
+        }
+    }
+
+    /**
+     * 处理图片列表,区分图片和视频类型
+     * @param imageList 图片URL集合
+     * @param type  类型 1-举报 2-商品
+     * @return 图片列表,每个元素包含类型和URL信息
+     */
+    private List<Map<String, Object>> processReportImages(List<StoreImg> imageList, Integer type) {
+        // 创建结果列表
+        List<Map<String, Object>> list = new ArrayList<>();
+        // 定义视频文件类型扩展名列表
+        List<String> videoFileType = Arrays.asList("mp4", "avi", "flv", "mkv", "rmvb", "wmv", "3gp", "mov");
+
+        // 遍历所有图片对象
+        for (StoreImg img : imageList) {
+            // 创建映射对象存储图片信息
+            Map<String, Object> map = new HashMap<>();
+            // 从图片URL中提取文件扩展名
+            String fileType = img.getImgUrl().substring(img.getImgUrl().lastIndexOf(".") + 1);
+            // 判断文件类型是否为视频
+            if (videoFileType.contains(fileType.toLowerCase())) {
+                // 如果是视频,设置类型为video
+                map.put("type", "video");
+            } else {
+                // 如果不是视频,设置类型为image
+                map.put("type", "image");
+            }
+            // 设置图片URL
+            map.put("imgUrl", img.getImgUrl());
+            // 如果类型为1(举报类型),则设置视频URL
+            if (type == 1) {
+                map.put("videoUrl", img.getImgUrl());
+            }
+            // 将映射对象添加到结果列表中
+            list.add(map);
+        }
+
+        // 返回处理后的图片列表
+        return list;
+    }
+
+}

+ 21 - 7
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -1902,7 +1902,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
     }
 
     /**
-     * 根据风控记录中的JSON数据批量下架商品( ruleType = 4 异常发布场景)
+     * 根据风控记录中的JSON数据批量下架商品
      * @param ruleType 风控规则类型
      * @param businessId 业务ID
      * @return 是否下架成功
@@ -1910,6 +1910,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
     @Override
     public boolean batchShelveGoodsByRiskControlRecord(Integer ruleType, String businessId) {
         try {
+            List<Integer> goodsIdList = Lists.newArrayList();
             // 获取相同类型的风控数据
             List<SecondRiskControlRecord> riskControlRecordList = riskControlService.getSameTypeRiskControlRecords(ruleType, businessId);
             // 获取风控数据详情
@@ -1918,18 +1919,31 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
                     .collect(Collectors.toList());
 
             // 声明所有被风控的商品ID
-            List<Integer> goodsIdList = Lists.newArrayList();
+            List<Integer> idList = Lists.newArrayList();
 
             // 循环情信息json 转换为集合
             for (String detailInfo : detailInfoList){
                 // 解析JSON获取商品ID列表
-                List<Integer> goodsIds = JSON.parseArray(detailInfo, Integer.class);
-                goodsIdList.addAll(goodsIds);
+                List<Integer> ids = JSON.parseArray(detailInfo, Integer.class);
+                idList.addAll(ids);
             }
-
             // goodsIdList 去重
-            goodsIdList = goodsIdList.stream().distinct().collect(Collectors.toList());
-
+            idList = idList.stream().distinct().collect(Collectors.toList());
+            // 交易欺诈
+            if (ruleType.equals(RiskControlRuleTypeEnum.TRANSACTION_FRAUD.getRuleType())){
+                // 根据商品记录id集合查询商品Id 集合
+                QueryWrapper<SecondGoodsRecord> queryWrapper = new QueryWrapper<>();
+                queryWrapper.in("id", idList);
+                List<SecondGoodsRecord> goodsRecordList = secondGoodsRecordMapper.selectList(queryWrapper);
+                // 获取商品Id集合
+                List<Integer> goodsIds = goodsRecordList.stream().map(SecondGoodsRecord::getGoodsId).collect(Collectors.toList());
+                // 去重
+                goodsIds = goodsIds.stream().distinct().collect(Collectors.toList());
+                goodsIdList.addAll(goodsIds);
+                // 异常发布
+            } else if (RiskControlRuleTypeEnum.ABNORMAL_PUBLISH.getRuleType().equals(ruleType)) {
+                goodsIdList.addAll(idList);
+            }
             // 调用批量下架方法
             return batchShelveGoodsByIds(goodsIdList);
         } catch (Exception e) {

+ 60 - 8
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -1,18 +1,21 @@
 package shop.alien.second.service.impl;
 
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import shop.alien.config.properties.RiskControlProperties;
 import shop.alien.entity.result.BusinessException;
-import shop.alien.entity.second.SecondGoods;
-import shop.alien.entity.second.SecondGoodsRecord;
-import shop.alien.entity.second.SecondTradeOperation;
-import shop.alien.entity.second.SecondTradeRecord;
+import shop.alien.entity.second.*;
+import shop.alien.mapper.second.SecondRiskControlRecordMapper;
 import shop.alien.entity.second.vo.SecondTradeRecordVo;
 import shop.alien.entity.store.LifeMessage;
 import shop.alien.entity.store.LifeNotice;
@@ -23,10 +26,7 @@ import shop.alien.mapper.LifeMessageMapper;
 import shop.alien.mapper.LifeNoticeMapper;
 import shop.alien.mapper.LifeUserMapper;
 import shop.alien.mapper.StoreDictionaryMapper;
-import shop.alien.mapper.second.SecondGoodsMapper;
-import shop.alien.mapper.second.SecondGoodsRecordMapper;
-import shop.alien.mapper.second.SecondTradeOperationMapper;
-import shop.alien.mapper.second.SecondTradeRecordMapper;
+import shop.alien.mapper.second.*;
 import shop.alien.second.feign.AlienStoreFeign;
 import shop.alien.second.service.SecondTradeRecordService;
 import shop.alien.util.common.JwtUtil;
@@ -35,6 +35,7 @@ import java.time.*;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -53,11 +54,16 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
     private final SecondTradeOperationMapper secondTradeOperationMapper;
     private final SecondGoodsMapper secondGoodsMapper;
     private final SecondGoodsRecordMapper secondGoodsRecordMapper;
+    private final SecondRiskControlRecordMapper secondRiskControlRecordMapper;
+    private final SecondUserCreditMapper secondUserCreditMapper;
+    private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
     private final LifeMessageMapper lifeMessageMapper;
     private final LifeNoticeMapper lifeNoticeMapper;
     private final LifeUserMapper lifeUserMapper;
     private final AlienStoreFeign alienStoreFeign;
     private final StoreDictionaryMapper storeDictionaryMapper;
+    @Autowired
+    private RiskControlProperties riskControlProperties;
 
     private final Object lock = new Object();
 
@@ -263,6 +269,26 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
                 sendSignInMessage(trade);
             }
 
+            // 风控机制 - 高频高价交易
+            LambdaQueryWrapper<SecondTradeRecord> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(SecondTradeRecord::getSellerId, trade.getSellerId());
+            wrapper.in(SecondTradeRecord::getTradeStatus, "3, 4");
+            wrapper.between(SecondTradeRecord::getTransactionTime,
+                    trade.getTransactionTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate() + " 00:00:00",
+                    trade.getTransactionTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate() + " 23:59:59");
+            wrapper.gt(SecondTradeRecord::getTransactionAmount, riskControlProperties.getMoneyLaundering().getAmountThreshold());
+            List<SecondTradeRecord> recordList = secondTradeRecordMapper.selectList(wrapper);
+            if (recordList.size() > riskControlProperties.getMoneyLaundering().getDailyCount()) {
+                SecondRiskControlRecord riskControlRecord = new SecondRiskControlRecord();
+                riskControlRecord.setRuleType(1);
+                riskControlRecord.setUserId(trade.getSellerId());
+                riskControlRecord.setRuleName(riskControlProperties.getMoneyLaundering().getRiskType());
+                JSONArray detailInfo = new JSONArray();
+                detailInfo.addAll(recordList.stream().map(SecondTradeRecord::getId).collect(Collectors.toList()));
+                riskControlRecord.setDetailInfo(detailInfo.toJSONString());
+                secondRiskControlRecordMapper.insert(riskControlRecord);
+            }
+
             return true;
         } catch (BusinessException e) {
             throw new BusinessException(e);
@@ -473,6 +499,12 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             operation.setCreatedTime(new Date());
             secondTradeOperationMapper.insert(operation);
 
+            // 添加信用分
+            if (1 == type && userId == tradeRecord.getSellerId()) {
+                creditScore(tradeRecord.getBuyerId());
+                creditScore(tradeRecord.getSellerId());
+            }
+
             return true;
         } catch (Exception e) {
             log.error("SecondTradeRecordServiceImpl.tradeCompleteConfirm(): Error Msg={}", e.getMessage());
@@ -480,6 +512,26 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
         }
     }
 
+    /**
+     * 增加交易信用分
+     * @param userId 用户id
+     */
+    private void creditScore(Integer userId) {
+        LambdaQueryWrapper<SecondUserCreditRecord> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SecondUserCreditRecord::getUserId, userId);
+        wrapper.eq(SecondUserCreditRecord::getPointsType, 3);
+        List<SecondUserCreditRecord> records = secondUserCreditRecordMapper.selectList(wrapper);
+        int userPoints = records.stream().mapToInt(SecondUserCreditRecord::getPoints).sum();
+        if (userPoints < 500) {
+            SecondUserCreditRecord record = new SecondUserCreditRecord();
+            record.setUserId(userId);
+            record.setPoints(50);
+            record.setPointsType(3);
+            secondUserCreditRecordMapper.insert(record);
+            secondUserCreditMapper.updatePointsByUserId(userId, 50);
+        }
+    }
+
     @Override
     public List<SecondTradeRecordVo> getTradeRecord(int sideId) throws Exception {
         try {

+ 53 - 1
alien-second/src/main/java/shop/alien/second/service/impl/SecondUserCreditServiceImpl.java

@@ -1,13 +1,18 @@
 package shop.alien.second.service.impl;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.openqa.selenium.json.Json;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.second.SecondUserCredit;
 import shop.alien.entity.second.SecondUserCreditRecord;
 import shop.alien.mapper.second.SecondUserCreditMapper;
+import shop.alien.mapper.second.SecondUserCreditRecordMapper;
 import shop.alien.second.service.SecondUserCreditService;
 
 import java.util.Date;
@@ -21,8 +26,8 @@ import java.util.Date;
 public class SecondUserCreditServiceImpl extends ServiceImpl<SecondUserCreditMapper, SecondUserCredit> implements SecondUserCreditService {
     
     private final SecondUserCreditMapper secondUserCreditMapper;
-
     private final SecondUserCreditRecordServiceImpl serviceImpl;
+    private final SecondUserCreditRecordMapper secondUserCreditRecordMapper;
 
     /**
      * 根据用户ID获取用户积分信息
@@ -94,6 +99,53 @@ public class SecondUserCreditServiceImpl extends ServiceImpl<SecondUserCreditMap
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addIdInfoPoints(Integer userId) throws Exception {
+        try {
+            LambdaQueryWrapper<SecondUserCreditRecord> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(SecondUserCreditRecord::getUserId, userId);
+            wrapper.eq(SecondUserCreditRecord::getPointsType, 2);
+            if (secondUserCreditRecordMapper.selectCount(wrapper) == 0) {
+                SecondUserCreditRecord record = new SecondUserCreditRecord();
+                record.setUserId(userId);
+                record.setPoints(200);
+                record.setPointsType(2);
+                secondUserCreditRecordMapper.insert(record);
+                secondUserCreditMapper.updatePointsByUserId(userId, 200);
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("SecondUserCreditServiceImpl.addIdInfoPoints(): Error Msg={}", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+    @Override
+    public JSONObject isFree(Integer userId) throws Exception {
+        try {
+            LambdaQueryWrapper<SecondUserCredit> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(SecondUserCredit::getUserId, userId);
+            SecondUserCredit secondUserCredit = secondUserCreditMapper.selectOne(queryWrapper);
+
+            JSONObject jsonObject = new JSONObject();
+            if (secondUserCredit == null || secondUserCredit.getFreezeTime() == null || secondUserCredit.getUserPoints() < 500) {
+                jsonObject.put("flag", false);
+                jsonObject.put("msg", "信用分不足无法使用该功能");
+            } else if (secondUserCredit.getFreezeTime().after(new Date())) {
+                jsonObject.put("flag", false);
+                jsonObject.put("msg", "无法使用该功能");
+            } else {
+                jsonObject.put("flag", true);
+            }
+
+            return jsonObject;
+        } catch (Exception e) {
+            log.error("SecondUserCreditServiceImpl.isFree(): Error Msg={}", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
     public boolean addPointsRecord(Integer userId, Integer points, Integer pointsType) {
         try {
             // 创建新的积分记录

+ 2 - 2
alien-store/src/main/java/shop/alien/store/controller/StoreUserExpertController.java

@@ -40,9 +40,9 @@ public class StoreUserExpertController {
     @ApiOperation("排行榜查询")
     @ApiOperationSupport(order = 2)
     @GetMapping("/getRankList")
-    public R<List<LifeUserExpertVo>> getRankList() {
+    public R<List<LifeUserExpertVo>> getRankList(@RequestParam("type") Integer type) {
         log.info("StoreUserExpertController.getRankList");
-        return R.data(storeUserExpertService.getRankList());
+        return R.data(storeUserExpertService.getRankList(type));
     }
 
     @ApiOperation("达人详情")

+ 67 - 29
alien-store/src/main/java/shop/alien/store/service/LifeUserDynamicsService.java

@@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
@@ -30,6 +29,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 用户动态
@@ -79,7 +79,6 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
         return lifeUserDynamicsMapper.update(null, lambdaUpdateWrapper);
     }
 
-
     public int setTopStatus(LifeUserDynamicsVo lifeUserDynamicsVo) {
         if (!StringUtils.isEmpty(lifeUserDynamicsVo.getId()) && !StringUtils.isEmpty(lifeUserDynamicsVo.getTopStatus())) {
             LambdaUpdateWrapper<LifeUserDynamics> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
@@ -334,19 +333,19 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
 
         resultMap.put("fansListSum", fansList.size());
 
-        //是否关注用户
-        String targetPhone;
+        //通过phoneId查询userId
+        // 判断 targetPhone 是否在 fansList 中 1 已关注 0 未关注
+        // 处理 fansList
+        fansList = lifeFansList.stream().map(LifeFans::getFansId)
+//                .map(id -> id.split("_")[id.split("_").length - 1])
+                .collect(Collectors.toList());
 
-//        // 查询好友的点赞
-//        LambdaQueryWrapper<LifeLikeRecord> likeWrapper = new LambdaQueryWrapper<>();
-//        likeWrapper.eq(LifeLikeRecord::getDianzanId, phoneId);
-//        likeWrapper.eq(LifeLikeRecord::getType, "2");
-//        List<LifeLikeRecord> lifeLikeList = lifeLikeRecordMapper.selectList(likeWrapper);
-//        List<String> likeList = lifeLikeList.stream().map(LifeLikeRecord::getHuifuId).collect(Collectors.toList());
-//
-//        resultMap.put("likeListSum", likeList.size());
+        int isFollowed = fansList.contains(myselfPhoneId) ? 1 : 0;
+        resultMap.put("isFollowed", isFollowed);
+        resultMap.put("isFollowedMe", myFansList.contains(phoneId) ? 1 : 0);
 
-        //通过phoneId查询userId
+        //是否关注用户
+        String targetPhone;
         LifeUser myLifeUser = new LifeUser();
         StoreUser myStoreUser = new StoreUser();
         if ("user".equals(myselfPhoneId.split("_")[0])) {
@@ -359,16 +358,6 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
             targetPhone = myStoreUser.getPhone();
         }
 
-        // 判断 targetPhone 是否在 fansList 中 1 已关注 0 未关注
-        // 处理 fansList
-        fansList = lifeFansList.stream().map(LifeFans::getFansId)
-//                .map(id -> id.split("_")[id.split("_").length - 1])
-                .collect(Collectors.toList());
-
-        int isFollowed = fansList.contains(myselfPhoneId) ? 1 : 0;
-        resultMap.put("isFollowed", isFollowed);
-        resultMap.put("isFollowedMe", myFansList.contains(phoneId) ? 1 : 0);
-
         //查询是否已拉黑
         LambdaQueryWrapper<LifeBlacklist> myLifeBlacklistWrapper = new LambdaQueryWrapper<>();
 
@@ -506,11 +495,60 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
 
     public List<LifeUserDynamicsVo> getDianZanList(String phoneId) {
         List<LifeUserDynamicsVo> lifeUserDynamicsVos = lifeUserDynamicsMapper.selectDianZanList(phoneId);
-        if (!CollectionUtils.isEmpty(lifeUserDynamicsVos)) {
+
+
+        // TODO  bugfix: 过滤掉我拉黑的和拉黑我的。
+        //是否关注用户
+        String targetPhone;
+        LifeUser myLifeUser = new LifeUser();
+        StoreUser myStoreUser = new StoreUser();
+
+        if ("user".equals(phoneId.split("_")[0])) {
+            String myselfUserPhone = phoneId.split("_")[1];
+            myLifeUser = lifeUserService.getUserByPhone(myselfUserPhone);
+            targetPhone = myLifeUser.getUserPhone();
+        } else {
+            String myselfStorePhone = phoneId.split("_")[1];
+            myStoreUser = storeUserService.getUserByPhone(myselfStorePhone);
+            targetPhone = myStoreUser.getPhone();
+        }
+
+        Integer myType ;
+        Integer myId ;
+        if (myLifeUser != null && myLifeUser.getId() != null) {
+            // 我是用户(类型1)
+            myType = 1;
+            myId = myLifeUser.getId();
+        } else {
+            // 我是商户(类型2)
+            myType = 2;
+            myId = myStoreUser.getId();
+        }
+        // 2. 构建查询条件:(我拉黑的) OR (拉黑我的)
+        QueryWrapper<LifeBlacklist> wrapper = new QueryWrapper<>();
+        // 2.1 我拉黑的:blocker_type=我的类型 AND blocker_id=我的ID
+        // 使用 and() 嵌套子条件,对应 SQL:(blocker_type = ? AND blocker_id = ?)
+        wrapper.and(q -> q.eq("blocker_type", myType)
+                .eq("blocker_id", myId));
+        // 2.2 或者(OR)拉黑我的:blocked_type=我的类型 AND blocked_id=我的ID
+        // 使用 or() 嵌套子条件,对应 SQL:OR (blocked_type = ? AND blocked_id = ?)
+        wrapper.or(q -> q.eq("blocked_type", myType)
+                .eq("blocked_id", myId));
+        List<LifeBlacklist> result = lifeBlacklistMapper.selectList(wrapper);
+        Set<String> combinedSet = result.stream()
+                .flatMap(blacklist -> Stream.of(
+                        blacklist.getBlockedPhoneId(),
+                        blacklist.getBlockerPhoneId()
+                ).filter(Objects::nonNull)) // 过滤null
+                .collect(Collectors.toSet());
+        if (!CollectionUtils.isEmpty(lifeUserDynamicsVos)){
             for (LifeUserDynamicsVo lifeUserDynamicsVo : lifeUserDynamicsVos) {
-                if (lifeUserDynamicsVo.getType().equals("2")) {
+                if(combinedSet.contains(lifeUserDynamicsVo.getPhoneId())){
+                    continue;
+                }
+                if (lifeUserDynamicsVo.getType().equals("2")){
                     String phoneIdNew = lifeUserDynamicsVo.getPhoneId().substring(6);
-                    StoreInfo storeInfo = storeInfoMapper.getStoreNameByPhone(phoneIdNew);
+                     StoreInfo storeInfo=storeInfoMapper.getStoreNameByPhone(phoneIdNew);
                     lifeUserDynamicsVo.setStoreName(storeInfo.getStoreName());
                 } else if (lifeUserDynamicsVo.getType().equals("1")) {
                     String phoneIdNew = lifeUserDynamicsVo.getPhoneId().substring(5);
@@ -520,7 +558,7 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
                 }
             }
         }
-        return lifeUserDynamicsVos;
+        return  lifeUserDynamicsVos;
     }
 
     public List<LifeUserDynamicsVo> getDynamicsList(Integer page, Integer size, String nickName, String userType, Integer dynamicsType, String releaseStartTime, String releaseEndTime) {
@@ -532,10 +570,10 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
         // 查询动态数据并按类型过滤
         LifeUserDynamicsVo lifeUserDynamicsVo = new LifeUserDynamicsVo();
         List<LifeUserDynamicsVo> lifeUserDynamicsVoList = lifeUserDynamicsMapper.getDynamicsDetail(id);
-        if (!CollectionUtils.isEmpty(lifeUserDynamicsVoList)) {
+        if(!CollectionUtils.isEmpty(lifeUserDynamicsVoList)){
             lifeUserDynamicsVo = lifeUserDynamicsVoList.get(0);
             String imagePath = lifeUserDynamicsVo.getImagePath();
-            if (!StringUtils.isEmpty(imagePath)) {
+            if(!StringUtils.isEmpty(imagePath)){
                 List<String> imagePathList = Arrays.asList(imagePath.split(","));
                 lifeUserDynamicsVo.setImagePathList(imagePathList);
             }

+ 25 - 25
alien-store/src/main/java/shop/alien/store/service/LifeUserStoreService.java

@@ -210,31 +210,31 @@ public class LifeUserStoreService {
             if (distance != null) {
                 double maxDistance = distance;
                 returnMaps = returnMaps.stream().filter(storeMap -> {
-                    Object distanceObj = storeMap.get("distance");
-                    if (distanceObj == null) {
-                        return false; // 排除 null
-                    }
-                    double distanceValue;
-                    try {
-                        // 先尝试直接转换为数值类型(如果本身是 Double/Integer 等)
-                        if (distanceObj instanceof Number) {
-                            distanceValue = ((Number) distanceObj).doubleValue();
-                        }
-                        // 再处理字符串类型(如 "100.5")
-                        else if (distanceObj instanceof String) {
-                            // 将字符串解析为 double(注意处理非数字格式的字符串)
-                            distanceValue = Double.parseDouble((String) distanceObj);
-                        }
-                        // 其他类型视为无效
-                        else {
-                            return false;
-                        }
-                    } catch (NumberFormatException e) {
-                        // 字符串无法解析为数字(如 "abc"),视为无效
-                        return false;
-                    }
-                    return distanceValue < maxDistance;
-                })
+                            Object distanceObj = storeMap.get("distance");
+                            if (distanceObj == null) {
+                                return false; // 排除 null
+                            }
+                            double distanceValue;
+                            try {
+                                // 先尝试直接转换为数值类型(如果本身是 Double/Integer 等)
+                                if (distanceObj instanceof Number) {
+                                    distanceValue = ((Number) distanceObj).doubleValue();
+                                }
+                                // 再处理字符串类型(如 "100.5")
+                                else if (distanceObj instanceof String) {
+                                    // 将字符串解析为 double(注意处理非数字格式的字符串)
+                                    distanceValue = Double.parseDouble((String) distanceObj);
+                                }
+                                // 其他类型视为无效
+                                else {
+                                    return false;
+                                }
+                            } catch (NumberFormatException e) {
+                                // 字符串无法解析为数字(如 "abc"),视为无效
+                                return false;
+                            }
+                            return distanceValue < maxDistance;
+                        })
                         .sorted((map1, map2) -> {
                             double d1 = getDistanceValue(map1.get("distance"));
                             double d2 = getDistanceValue(map2.get("distance"));

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/StoreUserExpertService.java

@@ -12,7 +12,7 @@ import java.util.Map;
 
 public interface StoreUserExpertService extends IService<LifeUserExpert> {
 
-    List<LifeUserExpertVo> getRankList();
+    List<LifeUserExpertVo> getRankList(Integer type);
 
     List<Map<String, LifeUserExpertVo>> getExpertDetails(Integer expertId);
 

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/impl/ActivityInviteConfigServiceImpl.java

@@ -219,8 +219,8 @@ public class ActivityInviteConfigServiceImpl extends ServiceImpl<ActivityInviteC
         if(StringUtils.isNotBlank(inviteCode) && invitedUserId != null){
             // 根据邀请码查询邀请用户
             LambdaQueryWrapper<LifeUser> lifeUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            lifeUserLambdaQueryWrapper.eq(LifeUser::getInviteCode, inviteCode);
             lifeUserLambdaQueryWrapper.eq(LifeUser::getDeleteFlag, 0);
+            lifeUserLambdaQueryWrapper.apply("BINARY invite_code = {0}", inviteCode);
             List<LifeUser> lifeUserList = lifeUserMapper.selectList(lifeUserLambdaQueryWrapper);
             if(CollectionUtils.isEmpty(lifeUserList)){
                 return "邀请码异常或邀请用户已注销";

+ 46 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -133,6 +133,9 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
     private final AliOSSUtil aliOSSUtil;
 
     private final WebSocketProcess webSocketProcess;
+
+    private final LifeFansMapper lifeFansMapper;
+
     @Resource
     private StoreIncomeDetailsRecordService storeIncomeDetailsRecordService;
 
@@ -1193,7 +1196,46 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         QueryWrapper<LifeUserDynamics> dynamicsWrapper = new QueryWrapper<>();
         dynamicsWrapper.eq("phone_id", "store_" + result.getStorePhone()).orderByDesc("lud.created_time");
         dynamicsWrapper.eq("lud.delete_flag",0);
-        List<LifeUserDynamicsVo> storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslist(userId, dynamicsWrapper);
+        //List<LifeUserDynamicsVo> storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslist(userId, dynamicsWrapper);
+        List<LifeUserDynamicsVo> storeDynamicslist = lifeUserDynamicsMapper.getStoreDynamicslist(userId, "store_" + result.getStorePhone());
+
+        List<String> followList = new ArrayList<>();
+        List<String> fansList = new ArrayList<>();
+
+        if(StringUtils.isNotEmpty(userId)){
+            LifeUser lifeUser = lifeUserMapper.selectById(userId);
+            if(lifeUser!=null && StringUtils.isNotEmpty(lifeUser.getUserPhone())){
+                // 查询我的关注信息,构建关注者ID列表
+                LambdaQueryWrapper<LifeFans> lifeFansWrapper = new LambdaQueryWrapper<>();
+                lifeFansWrapper.eq(LifeFans::getFansId, "user_" + result.getStorePhone());
+                List<LifeFans> lifeFansList = lifeFansMapper.selectList(lifeFansWrapper);
+                if(!CollectionUtils.isEmpty(lifeFansList)){
+                    followList = lifeFansList.stream().map(LifeFans::getFollowedId).collect(Collectors.toList());
+                }
+
+                // 查询我的粉丝信息,构建粉丝ID列表
+                lifeFansWrapper = new LambdaQueryWrapper<>();
+                lifeFansWrapper.eq(LifeFans::getFollowedId, "user_" + result.getStorePhone());
+                lifeFansList = lifeFansMapper.selectList(lifeFansWrapper);
+                if(!CollectionUtils.isEmpty(lifeFansList)){
+                    fansList = lifeFansList.stream().map(LifeFans::getFansId).collect(Collectors.toList());
+                }
+            }
+        }
+
+        for (LifeUserDynamicsVo vo : storeDynamicslist) {
+            if (followList.contains(vo.getPhoneId())) {
+                vo.setIsFollowThis("1");
+            } else {
+                vo.setIsFollowThis("0");
+            }
+            if (fansList.contains(vo.getPhoneId())) {
+                vo.setIsFollowMe("1");
+            } else {
+                vo.setIsFollowMe("0");
+            }
+        }
+
         List<LifeUserDynamicsVo> storeDynamicslist2 = storeDynamicslist.stream().limit(10).collect(Collectors.toList());
         result.setDynamicsList(storeDynamicslist2);
         // 获取店铺动态总数
@@ -1203,7 +1245,9 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         List<StoreBusinessInfo> storeBusinessInfos = storeBusinessInfoMapper.selectList(new LambdaQueryWrapper<StoreBusinessInfo>().eq(StoreBusinessInfo::getStoreId, storeId).eq(StoreBusinessInfo::getDeleteFlag, 0));
         if (ObjectUtils.isNotEmpty(storeBusinessInfos)) {
             result.setStoreBusinessInfo(storeBusinessInfos.get(0));
-            StoreBusinessInfo storeBusinessInfo = result.getStoreBusinessInfo();
+            result.setStoreBusinessInfos(storeBusinessInfos);
+            //StoreBusinessInfo storeBusinessInfo = result.getStoreBusinessInfo();
+            StoreBusinessInfo storeBusinessInfo = result.getStoreBusinessInfos().stream().filter(item -> item.getBusinessType() == 1).findFirst().orElse(null) ;
             if (ObjectUtils.isNotEmpty(storeBusinessInfo)) {
 
                 Calendar calendar = Calendar.getInstance(); // 获取Calendar实例

+ 6 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreUserExpertServiceImpl.java

@@ -48,8 +48,12 @@ public class StoreUserExpertServiceImpl extends ServiceImpl<LifeUserExpertMapper
     private final LifeUserMapper lifeUserMapper;
 
     @Override
-    public List<LifeUserExpertVo> getRankList() {
-        return lifeUserExpertMapper.getRankList();
+    public List<LifeUserExpertVo> getRankList(Integer type) {
+        if (type == 0) {
+            return lifeUserExpertMapper.getRankList();
+        }else {
+            return lifeUserExpertMapper.getRankListByLikeCount();
+        }
     }
 
     @Override