Преглед на файлове

二手相关表映射导入

zhangchen преди 3 месеца
родител
ревизия
d2704d97dd
променени са 78 файла, в които са добавени 5642 реда и са изтрити 0 реда
  1. 70 0
      alien-service-entity/src/main/java/shop/alien/entity/SecondVideoTask.java
  2. 37 0
      alien-service-entity/src/main/java/shop/alien/entity/result/APPConstant.java
  3. 10 0
      alien-service-entity/src/main/java/shop/alien/entity/result/BusinessException.java
  4. 48 0
      alien-service-entity/src/main/java/shop/alien/entity/result/CommonEnum.java
  5. 41 0
      alien-service-entity/src/main/java/shop/alien/entity/result/IResultCode.java
  6. 207 0
      alien-service-entity/src/main/java/shop/alien/entity/result/R.java
  7. 108 0
      alien-service-entity/src/main/java/shop/alien/entity/result/ResultCode.java
  8. 50 0
      alien-service-entity/src/main/java/shop/alien/entity/second/LifeUserLog.java
  9. 85 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondComplaint.java
  10. 79 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondEntrustUser.java
  11. 146 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondGoods.java
  12. 67 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondGoodsAudit.java
  13. 70 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondGoodsCategory.java
  14. 141 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondGoodsRecord.java
  15. 91 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondRiskControlRecord.java
  16. 60 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondShield.java
  17. 58 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondTradeOperation.java
  18. 183 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondTradeRecord.java
  19. 55 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondUserCredit.java
  20. 58 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondUserCreditDateRecord.java
  21. 57 0
      alien-service-entity/src/main/java/shop/alien/entity/second/SecondUserCreditRecord.java
  22. 56 0
      alien-service-entity/src/main/java/shop/alien/entity/second/enums/RiskControlRuleTypeEnum.java
  23. 61 0
      alien-service-entity/src/main/java/shop/alien/entity/second/enums/SecondGoodsStatusEnum.java
  24. 25 0
      alien-service-entity/src/main/java/shop/alien/entity/second/enums/SecondUserCreditScoreEnum.java
  25. 20 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/BatchUnshelveGoodsDTO.java
  26. 18 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/RiskControlGoodsIdsDTO.java
  27. 18 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/RiskControlGoodsQueryDTO.java
  28. 20 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondCommentVo.java
  29. 39 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondEntrustUserDTO.java
  30. 30 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondEntrustUserDetailVo.java
  31. 41 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondEntrustUserQueryVo.java
  32. 39 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondEntrustUserResultVo.java
  33. 33 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsAdminQueryDTO.java
  34. 27 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsDetailVo.java
  35. 119 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsRecommendVo.java
  36. 162 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsRecordDetailVo.java
  37. 173 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsVo.java
  38. 66 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondReportingVo.java
  39. 42 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondRiskControlRecordVo.java
  40. 30 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondRiskRecordVo.java
  41. 94 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondTradeRecordVo.java
  42. 27 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondUserCreditRecordListVo.java
  43. 22 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondUserCreditVo.java
  44. 45 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondUserViolationDetailVo.java
  45. 58 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondUserViolationVo.java
  46. 172 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SellGoodsVo.java
  47. 117 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/SellerEvaluationVo.java
  48. 25 0
      alien-service-entity/src/main/java/shop/alien/entity/second/vo/StoreImgDTO.java
  49. 128 0
      alien-service-entity/src/main/java/shop/alien/entity/store/LifeUser.java
  50. 143 0
      alien-service-entity/src/main/java/shop/alien/entity/store/LifeUserDynamics.java
  51. 136 0
      alien-service-entity/src/main/java/shop/alien/entity/store/LifeUserViolation.java
  52. 134 0
      alien-service-entity/src/main/java/shop/alien/entity/store/StoreComment.java
  53. 75 0
      alien-service-entity/src/main/java/shop/alien/entity/store/StoreImg.java
  54. 17 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondComplaintMapper.java
  55. 67 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondEntrustUserMapper.java
  56. 25 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondGoodsAuditMapper.java
  57. 19 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondGoodsCategoryMapper.java
  58. 358 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondGoodsMapper.java
  59. 38 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondGoodsRecordMapper.java
  60. 29 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondRecommendMapper.java
  61. 39 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondRiskControlRecordMapper.java
  62. 12 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondShieldMapper.java
  63. 9 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondTradeOperationMapper.java
  64. 79 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondTradeRecordMapper.java
  65. 14 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondUserCreditDateRecordMapper.java
  66. 20 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondUserCreditMapper.java
  67. 12 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondUserCreditRecordMapper.java
  68. 23 0
      alien-service-entity/src/main/java/shop/alien/mapper/second/SecondUserViolationMapper.java
  69. 63 0
      alien-service-entity/src/main/java/shop/alien/mapper/system/SecondVideoTaskMapper.java
  70. 237 0
      alien-service-entity/src/main/resources/mapper/LifeUserDynamicsMapper.xml
  71. 14 0
      alien-service-entity/src/main/resources/mapper/LifeUserMapper.xml
  72. 30 0
      alien-service-entity/src/main/resources/mapper/LifeUserViolationMapper.xml
  73. 29 0
      alien-service-entity/src/main/resources/mapper/second/SecondEntrustUserMapper.xml
  74. 76 0
      alien-service-entity/src/main/resources/mapper/second/SecondGoodsCategoryMapper.xml
  75. 256 0
      alien-service-entity/src/main/resources/mapper/second/SecondGoodsInfoMapper.xml
  76. 125 0
      alien-service-entity/src/main/resources/mapper/second/SecondGoodsMapper.xml
  77. 5 0
      alien-service-entity/src/main/resources/mapper/second/SecondGoodsRecordMapper.xml
  78. 130 0
      alien-service-entity/src/main/resources/mapper/second/SecondUserViolationMapper.xml

+ 70 - 0
alien-service-entity/src/main/java/shop/alien/entity/SecondVideoTask.java

@@ -0,0 +1,70 @@
+package shop.alien.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 视频审核任务实体类
+ */
+@Data
+@TableName("second_video_task")
+public class SecondVideoTask implements Serializable {
+    
+    private static final long serialVersionUID = 1L;
+    
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    
+    /**
+     * 数据ID
+     */
+    private String dataId;
+    
+    /**
+     * 视频URL
+     */
+    private String videoUrl;
+    
+    /**
+     * 任务ID
+     */
+    private String taskId;
+    
+    /**
+     * 任务状态 (SUBMITTED-已提交, PROCESSING-处理中, SUCCESS-成功, FAILED-失败)
+     */
+    private String status;
+    
+    /**
+     * 风险级别 (none-无风险, low-低风险, medium-中风险, high-高风险)
+     */
+    private String riskLevel;
+    
+    /**
+     * 审核结果(JSON格式)
+     */
+    private String result;
+    
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+    
+    /**
+     * 重试次数
+     */
+    private Integer retryCount = 0;
+}

+ 37 - 0
alien-service-entity/src/main/java/shop/alien/entity/result/APPConstant.java

@@ -0,0 +1,37 @@
+package shop.alien.entity.result;
+
+/**
+ * 常量
+ *
+ * @author ssk
+ * @since 1.0.0
+ */
+public interface APPConstant {
+
+    String AAA = "AAA";
+
+    String CAS = "CAS";
+
+    String basePackage = "com.pcitc";
+
+    String ACCEPT_DEPT_UNIFORMITY = "AcceptDeptUniformity";
+
+    /**
+     * 默认为空消息
+     */
+    String DEFAULT_NULL_MESSAGE = "暂无承载数据";
+    /**
+     * 默认成功消息
+     */
+    String DEFAULT_SUCCESS_MESSAGE = "操作成功";
+    /**
+     * 默认失败消息
+     */
+    String DEFAULT_FAILURE_MESSAGE = "操作失败";
+    /**
+     * 默认未授权消息
+     */
+    String DEFAULT_UNAUTHORIZED_MESSAGE = "签名认证失败";
+
+    int SC_OK = 200;
+}

+ 10 - 0
alien-service-entity/src/main/java/shop/alien/entity/result/BusinessException.java

@@ -0,0 +1,10 @@
+package shop.alien.entity.result;
+
+public class BusinessException extends RuntimeException {
+    public BusinessException(String message) {
+        super(message);
+    }
+    public BusinessException(Exception e) {
+        super(e);
+    }
+}

+ 48 - 0
alien-service-entity/src/main/java/shop/alien/entity/result/CommonEnum.java

@@ -0,0 +1,48 @@
+package shop.alien.entity.result;
+
+
+public interface CommonEnum {
+
+    /**
+     * 商品所属模块
+     */
+    enum ModelType {
+        BAR(1, "酒吧"),
+        DELICACY(2, "美食"),
+        GYM(3, "运动健身");
+
+        private final int code;
+        private final String desc;
+
+        ModelType(int code, String desc) {
+            this.code = code;
+            this.desc = desc;
+        }
+
+        public int getCode() { return code; }
+        public String getDesc() { return desc; }
+    }
+
+    /**
+     * 商品所属模块,细化
+     */
+    enum StoreProductItemProdType {
+        BAR_DRINK(1, "酒吧-酒水"),
+        BAR_FOOD(2, "酒吧-餐食"),
+        BAR_COMBO(3, "酒吧-套餐"),
+        DELICACY_FOOD(4, "美食-餐食"),
+        GYM_SINGLE(5, "运动健身-单次"),
+        GYM_MULTI(6, "运动健身-多次");
+
+        private final int code;
+        private final String desc;
+
+        StoreProductItemProdType(int code, String desc) {
+            this.code = code;
+            this.desc = desc;
+        }
+
+        public int getCode() { return code; }
+        public String getDesc() { return desc; }
+    }
+}

+ 41 - 0
alien-service-entity/src/main/java/shop/alien/entity/result/IResultCode.java

@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.gnu.org/licenses/lgpl.html
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package shop.alien.entity.result;
+
+import java.io.Serializable;
+
+/**
+ * 业务代码接口
+ *
+ * @author ssk
+ */
+public interface IResultCode extends Serializable {
+
+    /**
+     * 消息
+     *
+     * @return String
+     */
+    String getMessage();
+
+    /**
+     * 状态码
+     *
+     * @return int
+     */
+    int getCode();
+
+}

+ 207 - 0
alien-service-entity/src/main/java/shop/alien/entity/result/R.java

@@ -0,0 +1,207 @@
+package shop.alien.entity.result;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+import org.springframework.lang.Nullable;
+import org.springframework.util.ObjectUtils;
+
+import java.io.Serializable;
+import java.util.Optional;
+
+/**
+ * 统一API响应结果封装
+ *
+ * @author ssk
+ */
+@Getter
+@Setter
+@ToString
+@NoArgsConstructor
+@ApiModel
+public class R<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private int code;
+    private boolean success;
+    @ApiModelProperty(value = "对象")
+    private T data;
+    private String msg;
+
+    private R(IResultCode resultCode) {
+        this(resultCode, null, resultCode.getMessage());
+    }
+
+    private R(IResultCode resultCode, String msg) {
+        this(resultCode, null, msg);
+    }
+
+    private R(IResultCode resultCode, T data) {
+        this(resultCode, data, resultCode.getMessage());
+    }
+
+    private R(IResultCode resultCode, T data, String msg) {
+        this(resultCode.getCode(), data, msg);
+    }
+
+    private R(int code, T data, String msg) {
+        this.code = code;
+        this.data = data;
+        this.msg = msg;
+        this.success = ResultCode.SUCCESS.code == code;
+    }
+
+    /**
+     * 判断返回是否为成功
+     *
+     * @param result Result
+     * @return 是否成功
+     */
+    public static boolean isSuccess(@Nullable R<?> result) {
+        return Optional.ofNullable(result)
+                .map(x -> ObjectUtils.nullSafeEquals(ResultCode.SUCCESS.code, x.code))
+                .orElse(Boolean.FALSE);
+    }
+
+    /**
+     * 判断返回是否为成功
+     *
+     * @param result Result
+     * @return 是否成功
+     */
+    public static boolean isNotSuccess(@Nullable R<?> result) {
+        return !R.isSuccess(result);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param data 数据
+     * @param <T>  T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> data(T data) {
+        return data(data, APPConstant.DEFAULT_SUCCESS_MESSAGE);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param data 数据
+     * @param msg  消息
+     * @param <T>  T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> data(T data, String msg) {
+        return data(APPConstant.SC_OK, data, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param code 状态码
+     * @param data 数据
+     * @param msg  消息
+     * @param <T>  T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> data(int code, T data, String msg) {
+        return new R<>(code, data, data == null ? APPConstant.DEFAULT_NULL_MESSAGE : msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param msg 消息
+     * @param <T> T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> success(String msg) {
+        return new R<>(ResultCode.SUCCESS, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param resultCode 业务代码
+     * @param <T>        T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> success(IResultCode resultCode) {
+        return new R<>(resultCode);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param resultCode 业务代码
+     * @param msg        消息
+     * @param <T>        T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> success(IResultCode resultCode, String msg) {
+        return new R<>(resultCode, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param msg 消息
+     * @param <T> T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> fail(String msg) {
+        return new R<>(ResultCode.FAILURE, msg);
+    }
+
+
+    /**
+     * 返回R
+     *
+     * @param code 状态码
+     * @param msg  消息
+     * @param <T>  T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> fail(int code, String msg) {
+        return new R<>(code, null, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param resultCode 业务代码
+     * @param <T>        T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> fail(IResultCode resultCode) {
+        return new R<>(resultCode);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param resultCode 业务代码
+     * @param msg        消息
+     * @param <T>        T 泛型标记
+     * @return R
+     */
+    public static <T> R<T> fail(IResultCode resultCode, String msg) {
+        return new R<>(resultCode, msg);
+    }
+
+    /**
+     * 返回R
+     *
+     * @param flag 成功状态
+     * @return R
+     */
+    public static <T> R<T> status(boolean flag) {
+        return flag ? success(APPConstant.DEFAULT_SUCCESS_MESSAGE) : fail(APPConstant.DEFAULT_FAILURE_MESSAGE);
+    }
+
+}

+ 108 - 0
alien-service-entity/src/main/java/shop/alien/entity/result/ResultCode.java

@@ -0,0 +1,108 @@
+/**
+ * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * <p>
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.gnu.org/licenses/lgpl.html
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package shop.alien.entity.result;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * 业务代码枚举
+ *
+ * @author ssk
+ */
+@Getter
+@AllArgsConstructor
+public enum ResultCode implements IResultCode {
+
+    /**
+     * 操作成功
+     */
+    SUCCESS(HttpServletResponse.SC_OK, "操作成功"),
+
+    /**
+     * 业务异常
+     */
+    FAILURE(HttpServletResponse.SC_BAD_REQUEST, "业务异常"),
+
+    /**
+     * 请求未授权
+     */
+    UN_AUTHORIZED(HttpServletResponse.SC_UNAUTHORIZED, "请求未授权"),
+
+    /**
+     * 404 没找到请求
+     */
+    NOT_FOUND(HttpServletResponse.SC_NOT_FOUND, "404 没找到请求"),
+
+    /**
+     * 消息不能读取
+     */
+    MSG_NOT_READABLE(HttpServletResponse.SC_BAD_REQUEST, "消息不能读取"),
+
+    /**
+     * 不支持当前请求方法
+     */
+    METHOD_NOT_SUPPORTED(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "不支持当前请求方法"),
+
+    /**
+     * 不支持当前媒体类型
+     */
+    MEDIA_TYPE_NOT_SUPPORTED(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "不支持当前媒体类型"),
+
+    /**
+     * 请求被拒绝
+     */
+    REQ_REJECT(HttpServletResponse.SC_FORBIDDEN, "请求被拒绝"),
+
+    /**
+     * 服务器异常
+     */
+    INTERNAL_SERVER_ERROR(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "服务器异常"),
+
+    /**
+     * 缺少必要的请求参数
+     */
+    PARAM_MISS(HttpServletResponse.SC_BAD_REQUEST, "缺少必要的请求参数"),
+
+    /**
+     * 请求参数类型错误
+     */
+    PARAM_TYPE_ERROR(HttpServletResponse.SC_BAD_REQUEST, "请求参数类型错误"),
+
+    /**
+     * 请求参数绑定错误
+     */
+    PARAM_BIND_ERROR(HttpServletResponse.SC_BAD_REQUEST, "请求参数绑定错误"),
+
+    /**
+     * 参数校验失败
+     */
+    PARAM_VALID_ERROR(HttpServletResponse.SC_BAD_REQUEST, "参数校验失败"),
+    ;
+
+    /**
+     * code编码
+     */
+    final int code;
+    /**
+     * 中文信息描述
+     */
+    final String message;
+
+}

+ 50 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/LifeUserLog.java

@@ -0,0 +1,50 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户
+ */
+@Data
+@JsonInclude
+@TableName("life_user_log")
+public class LifeUserLog implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private Integer userId;
+
+    @TableField("user_name")
+    private String userName;
+
+    @TableField("mac_ip")
+    private String macIp;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 85 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondComplaint.java

@@ -0,0 +1,85 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-07-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SecondComplaint对象", description="")
+public class SecondComplaint extends Model<SecondComplaint> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "用户id")
+    @TableField("user_id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "投诉id")
+    @TableField("complaint_id")
+    private Integer complaintId;
+
+    @ApiModelProperty(value = "投诉类型  1-用户  2-商品")
+    @TableField("complaint_type")
+    private Integer complaintType;
+
+    @ApiModelProperty(value = "投诉原因")
+    @TableField("complaint_reason")
+    private String complaintReason;
+
+    @ApiModelProperty(value = "投诉状态  0-审核中  1-成功  2-失败")
+    @TableField("complaint_status")
+    private Integer complaintStatus;
+
+    @ApiModelProperty(value = "投诉结果")
+    @TableField("complaint_result")
+    private String complaintResult;
+
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
+    private Integer updatedUserId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 79 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondEntrustUser.java

@@ -0,0 +1,79 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 二手委托人信息表
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-11-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("second_entrust_user")
+@ApiModel(value = "SecondEntrustUser对象", description = "二手委托人信息表")
+public class SecondEntrustUser extends Model<SecondEntrustUser> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "交易ID")
+    @TableField("entrust_trade_id")
+    private Integer entrustTradeId;
+
+    @ApiModelProperty(value = "交易编号")
+    @TableField("entrust_trade_no")
+    private String entrustTradeNo;
+
+    @ApiModelProperty(value = "委托人电话")
+    @TableField("entrust_user_phone")
+    private String entrustUserPhone;
+
+    @ApiModelProperty(value = "委托人姓名")
+    @TableField("entrust_user_name")
+    private String entrustUserName;
+
+    @ApiModelProperty(value = "委托人身份证")
+    @TableField("entrust_id_card")
+    private String entrustIdCard;
+
+    @ApiModelProperty(value = "委托人身份证照片")
+    @TableField("entrust_id_card_img")
+    private String entrustIdCardImg;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
+    private Integer updatedUserId;
+
+}
+

+ 146 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondGoods.java

@@ -0,0 +1,146 @@
+package shop.alien.entity.second;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 二手商品
+ */
+@Data
+@JsonInclude
+@TableName("second_goods")
+public class SecondGoods implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // 商品状态常量
+    public static final int STATUS_DRAFT = 0; // 草稿
+    public static final int STATUS_REVIEWING = 1; // 审核中
+    public static final int STATUS_REVIEW_FAILED = 2; // 审核失败
+    public static final int STATUS_ON_SALE = 3; // 已上架
+    public static final int STATUS_OFF_SALE = 4; // 已下架
+    public static final int STATUS_SOLD_OUT = 5; // 已售出
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @TableField("user_id")
+    @ApiModelProperty(value = "用户ID")
+    private Integer userId;
+
+    @TableField("title")
+    @ApiModelProperty(value = "商品标题")
+    private String title;
+
+    @TableField("home_image")
+    @ApiModelProperty(value = "商品封面图片")
+    private String homeImage;
+
+    @TableField("video_first_frame")
+    @ApiModelProperty(value = "视频第一帧图片")
+    private String videoFirstFrame;
+
+    @TableField("description")
+    @ApiModelProperty(value = "商品描述")
+    private String description;
+
+    @TableField("price")
+    @ApiModelProperty(value = "商品价格(元,保留小数后两位)")
+    private String price;
+
+    @TableField("price")
+    @ApiModelProperty(value = "商品价格(元,保留小数后两位)")
+    private BigDecimal amount;
+
+    @TableField(exist = false)
+    private Integer auditRecordId;
+
+    @TableField("position")
+    @ApiModelProperty(value = "商品位置")
+    private String position;
+
+    @TableField("address_text")
+    @ApiModelProperty(value = "地址文本")
+    private String addressText;
+
+    @TableField("like_count")
+    @ApiModelProperty(value = "点赞数量")
+    private Integer likeCount;
+
+    @TableField("collect_count")
+    @ApiModelProperty(value = "收藏数量")
+    private Integer collectCount;
+
+    @TableField("category_one_id")
+    @ApiModelProperty(value = "一级类别ID")
+    private Integer categoryOneId;
+
+    @TableField("category_two_id")
+    @ApiModelProperty(value = "二级类别ID")
+    private Integer categoryTwoId;
+
+    @TableField("label")
+    @ApiModelProperty(value = "标签")
+    private String label;
+
+    @TableField("topic")
+    @ApiModelProperty(value = "话题(以逗号分隔)")
+    private String topic;
+
+    @TableField("trade_id")
+    @ApiModelProperty(value = "交易ID")
+    private Integer tradeId;
+
+    /**
+     * 视频审核任务ID
+     */
+    private String videoTaskId;
+
+    @TableField("goods_status")
+    @ApiModelProperty(value = "商品状态 0:草稿 1:审核中 2:审核失败 3:已上架 4:已下架 5:已售出")
+    private Integer goodsStatus;
+
+    @TableField("failed_reason")
+    @ApiModelProperty(value = "审核失败原因")
+    private String failedReason;
+
+    @TableField("ai_task_id")
+    @ApiModelProperty(value = "ai_task_id")
+    private String aiTaskId;
+
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField("delete_flag")
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @TableField(value = "release_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "发布时间")
+    private Date releaseTime;
+
+    @TableField("created_user_id")
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "修改时间")
+    private Date updatedTime;
+
+    @TableField("updated_user_id")
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+}

+ 67 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondGoodsAudit.java

@@ -0,0 +1,67 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 二手商品审核记录
+ */
+@Data
+@JsonInclude
+@TableName("second_goods_audit")
+public class SecondGoodsAudit implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // 商品状态常量
+    public static final int GOODS_STATUS_SUCCESS = 1; // 审核成功
+    public static final int GOODS_STATUS_FAILED = 2;  // 审核失败
+
+    // 删除标记常量
+    public static final int DELETE_FLAG_NO = 0;  // 未删除
+    public static final int DELETE_FLAG_YES = 1; // 已删除
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @TableField("goods_id")
+    @ApiModelProperty(value = "商品ID")
+    private Integer goodsId;
+
+    @TableField("goods_status")
+    @ApiModelProperty(value = "商品状态 1:审核成功 2:审核失败")
+    private Integer goodsStatus;
+
+    @TableField("failed_reason")
+    @ApiModelProperty(value = "审核描述(失败原因)")
+    private String failedReason;
+
+    @TableField("delete_flag")
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField("created_user_id")
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "修改时间")
+    private Date updatedTime;
+
+    @TableField("updated_user_id")
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+}

+ 70 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondGoodsCategory.java

@@ -0,0 +1,70 @@
+package shop.alien.entity.second;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 二手商品类别表
+ */
+@Data
+@JsonInclude
+@TableName("second_goods_category")
+public class SecondGoodsCategory implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @TableField("category_name")
+    @ApiModelProperty(value = "类别名称")
+    private String categoryName;
+
+    @TableField("category_url")
+    @ApiModelProperty(value = "类别图片URL")
+    private String categoryUrl;
+
+    @TableField("parent_id")
+    @ApiModelProperty(value = "上级ID")
+    private Integer parentId;
+
+    @TableField("delete_flag")
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @TableField("category_sort")
+    @ApiModelProperty(value = "排序")
+    private Integer categorySort;
+
+    @TableField("category_state")
+    @ApiModelProperty(value = "状态 0:显示 1:隐藏")
+    private String categoryState;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    private Date createdTime;
+
+    @TableField("created_user_id")
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @ApiModelProperty(value = "修改时间")
+    private Date updatedTime;
+
+    @TableField("updated_user_id")
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+
+    @TableField(exist = false)
+    private List<SecondGoodsCategory> children = null;
+}

+ 141 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondGoodsRecord.java

@@ -0,0 +1,141 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@JsonInclude
+@TableName("second_goods_record")
+public class SecondGoodsRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @ApiModelProperty("一级分类名称")
+    @TableField(exist = false)
+    private String categoryOneName;
+
+    @ApiModelProperty("二级分类名称")
+    @TableField(exist = false)
+    private String categoryTwoName;
+
+    @TableField("user_id")
+    @ApiModelProperty(value = "用户ID")
+    private Integer userId;
+
+    @TableField("goods_id")
+    @ApiModelProperty(value = "商品ID")
+    private Integer goodsId;
+
+    @TableField("operation_name")
+    @ApiModelProperty(value = "操作名称")
+    private String operationName;
+
+    @TableField("title")
+    @ApiModelProperty(value = "商品标题")
+    private String title;
+
+    @TableField("description")
+    @ApiModelProperty(value = "商品描述")
+    private String description;
+
+    @TableField("price")
+    @ApiModelProperty(value = "商品价格(元,保留小数后两位)")
+    private BigDecimal price;
+
+    @TableField("price")
+    @ApiModelProperty(value = "商品价格(元,保留小数后两位)")
+    private BigDecimal amount;
+
+    @TableField("position")
+    @ApiModelProperty(value = "商品位置")
+    private String position;
+
+    @TableField("like_count")
+    @ApiModelProperty(value = "点赞数量")
+    private Integer likeCount;
+
+    @TableField("collect_count")
+    @ApiModelProperty(value = "收藏数量")
+    private Integer collectCount;
+
+    @TableField("category_one_id")
+    @ApiModelProperty(value = "一级类别ID")
+    private Integer categoryOneId;
+
+    @TableField("category_two_id")
+    @ApiModelProperty(value = "二级类别ID")
+    private Integer categoryTwoId;
+
+    @TableField("label")
+    @ApiModelProperty(value = "标签")
+    private String label;
+
+    @TableField("topic")
+    @ApiModelProperty(value = "话题(以逗号分隔)")
+    private String topic;
+
+    @TableField("trade_id")
+    @ApiModelProperty(value = "交易ID")
+    private Integer tradeId;
+
+    @TableField("release_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "发布时间")
+    private Date releaseTime;
+
+    @TableField("goods_status")
+    @ApiModelProperty(value = "商品状态 0:草稿 1:审核中 2:审核失败 3:已上架 4:已下架 5:已售出")
+    private Integer goodsStatus;
+
+    @TableField("failed_reason")
+    @ApiModelProperty(value = "审核失败原因")
+    private String failedReason;
+
+    @TableField("home_image")
+    @ApiModelProperty(value = "首页图")
+    private String homeImage;
+
+    @TableField("video_task_id")
+    @ApiModelProperty(value = "视频审核任务id")
+    private String videoTaskId;
+
+    @TableField("video_first_frame")
+    @ApiModelProperty(value = "视频第一帧图片")
+    private String videoFirstFrame;
+
+    @TableField("delete_flag")
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    private Integer deleteFlag;
+
+    @TableField("created_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField("created_user_id")
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @TableField("updated_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "修改时间")
+    private Date updatedTime;
+
+    @TableField("updated_user_id")
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+
+    @TableField("address_text")
+    @ApiModelProperty(value = "地址文本")
+    private String addressText;
+}

+ 91 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondRiskControlRecord.java

@@ -0,0 +1,91 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@JsonInclude
+@TableName("second_risk_control_record")
+public class SecondRiskControlRecord extends Model<SecondRiskControlRecord> {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @TableField("user_id")
+    @ApiModelProperty(value = "用户ID")
+    private Integer userId;
+
+    @TableField("rule_type")
+    @ApiModelProperty(value = "规则类型 1:洗钱嫌疑 2:账号异常 3:交易欺诈 4:异常发布")
+    private Integer ruleType;
+
+    @TableField("rule_name")
+    @ApiModelProperty(value = "规则名称")
+    private String ruleName;
+
+    @TableField("risk_status")
+    @ApiModelProperty(value = "风控执行状态 0 未执行,1-已执行 2-已忽略")
+    private Integer riskStatus;
+
+//
+//    @TableField("trigger_count")
+//    @ApiModelProperty(value = "触发次数")
+//    private Integer triggerCount;
+//
+//    @TableField("time_window_hours")
+//    @ApiModelProperty(value = "时间窗口(小时)")
+//    private Integer timeWindowHours;
+//
+//    @TableField("threshold_value")
+//    @ApiModelProperty(value = "阈值")
+//    private Integer thresholdValue;
+//
+//    @TableField("actual_value")
+//    @ApiModelProperty(value = "实际值")
+//    private Integer actualValue;
+
+    @TableField("business_id")
+    @ApiModelProperty(value = "业务ID(如商品ID、交易ID等)")
+    private String businessId;
+
+//    @TableField("business_type")
+//    @ApiModelProperty(value = "业务类型 1:二手商品 2:交易记录")
+//    private Integer businessType;
+
+    @TableField("detail_info")
+    @ApiModelProperty(value = "详细信息(JSON格式)")
+    private String detailInfo;
+
+    @TableField("delete_flag")
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @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")
+    private Integer createdUserId;
+
+    @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")
+    private Integer updatedUserId;
+}

+ 60 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondShield.java

@@ -0,0 +1,60 @@
+package shop.alien.entity.second;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 二手屏蔽
+ */
+@Data
+@JsonInclude
+@TableName("second_shield")
+public class SecondShield implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @TableField("user_id")
+    @ApiModelProperty(value = "用户ID")
+    private Integer userId;
+
+    @TableField("shield_id")
+    @ApiModelProperty(value = "屏蔽ID")
+    private Integer shieldId;
+
+    @TableField("shield_type")
+    @ApiModelProperty(value = "屏蔽类型 1:商品 2:卖家")
+    private Integer shieldType;
+
+    @TableField("delete_flag")
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "创建时间")
+    private Date createdTime;
+
+    @TableField("created_user_id")
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "修改时间")
+    private Date updatedTime;
+
+    @TableField("updated_user_id")
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+}

+ 58 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondTradeOperation.java

@@ -0,0 +1,58 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SecondTradeOperation对象", description="二手交易操作表")
+public class SecondTradeOperation extends Model<SecondTradeOperation> {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @TableField("trade_id")
+    @ApiModelProperty(value = "交易ID")
+    private Integer tradeId;
+
+    @TableField("user_id")
+    @ApiModelProperty(value = "操作人ID")
+    private Integer userId;
+
+    @TableField("type")
+    @ApiModelProperty(value = "操作类型  1-发起交易  2-拒绝交易  3-确认交易  4-签到  5-交易成功  6-交易失败  7-交易取消")
+    private Integer type;
+
+    @TableField("delete_flag")
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
+    private Integer updatedUserId;
+}

+ 183 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondTradeRecord.java

@@ -0,0 +1,183 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 二手交易记录表
+ * </p>
+ *
+ * @author qrs
+ * @since 2025-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SecondTradeRecord对象", description="二手交易记录表")
+public class SecondTradeRecord extends Model<SecondTradeRecord> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "交易编号")
+    @TableField("trade_no")
+    private String tradeNo;
+
+    @ApiModelProperty(value = "商品id")
+    @TableField("goods_id")
+    private Integer goodsId;
+
+    @ApiModelProperty(value = "商品记录表id")
+    @TableField("goods_record_id")
+    private Integer goodsRecordId;
+
+    @ApiModelProperty(value = "买家id")
+    @TableField("buyer_id")
+    private Integer buyerId;
+
+    @ApiModelProperty(value = "卖家id")
+    @TableField("seller_id")
+    private Integer sellerId;
+
+    @ApiModelProperty(value = "交易时间")
+    @TableField("transaction_time")
+    private Date transactionTime;
+
+    @ApiModelProperty(value = "交易地点(经纬度)")
+    @TableField("transaction_latitude_longitude")
+    private String transactionLatitudeLongitude;
+
+    @ApiModelProperty(value = "交易地点(经纬度地址)")
+    @TableField("transaction_latitude_longitude_address")
+    private String transactionLatitudeLongitudeAddress;
+
+    @ApiModelProperty(value = "交易地点(详细地址)")
+    @TableField("transaction_location")
+    private String transactionLocation;
+
+    @ApiModelProperty(value = "交易金额")
+    @TableField("transaction_amount")
+    private BigDecimal transactionAmount;
+
+    @ApiModelProperty(value = "买家是否签到  0-未签到  1-已签到")
+    @TableField("buyer_sign_in")
+    private Integer buyerSignIn;
+
+    @ApiModelProperty(value = "买家签到时间")
+    @TableField("buyer_sign_in_time")
+    private Date buyerSignInTime;
+
+    @ApiModelProperty(value = "买家签到地点(经纬度)")
+    @TableField("buyer_sign_in_latitude_longitude")
+    private String buyerSignInLatitudeLongitude;
+
+    @ApiModelProperty(value = "买家签到地点(经纬度)")
+    @TableField("buyer_sign_in_latitude_longitude_address")
+    private String buyerSignInLatitudeLongitudeAddress;
+
+    @ApiModelProperty(value = "卖家是否签到  0-未签到  1-已签到")
+    @TableField("seller_sign_in")
+    private Integer sellerSignIn;
+
+    @ApiModelProperty(value = "卖家签到时间")
+    @TableField("seller_sign_in_time")
+    private Date sellerSignInTime;
+
+    @ApiModelProperty(value = "卖家签到地点(经纬度)")
+    @TableField("seller_sign_in_latitude_longitude")
+    private String sellerSignInLatitudeLongitude;
+
+    @ApiModelProperty(value = "卖家签到地点(经纬度地址)")
+    @TableField("seller_sign_in_latitude_longitude_address")
+    private String sellerSignInLatitudeLongitudeAddress;
+
+    @ApiModelProperty(value = "买家交易状态  0-未确认  1-交易成功  2-交易失败")
+    @TableField("buyer_transaction_status")
+    private Integer buyerTransactionStatus;
+
+    @ApiModelProperty(value = "买家完成交易时间")
+    @TableField("buyer_complete_time")
+    private Date buyerCompleteTime;
+
+    @ApiModelProperty(value = "买家评价")
+    @TableField("buyer_evaluate")
+    private String buyerEvaluate;
+
+    @ApiModelProperty(value = "买家评分")
+    @TableField("buyer_rating")
+    private Integer buyerRating;
+
+    @ApiModelProperty(value = "卖家交易状态  0-未确认  1-交易成功  2-交易失败")
+    @TableField("seller_transaction_status")
+    private Integer sellerTransactionStatus;
+
+    @ApiModelProperty(value = "卖家完成交易时间")
+    @TableField("seller_complete_time")
+    private Date sellerCompleteTime;
+
+    @ApiModelProperty(value = "卖家评价")
+    @TableField("seller_evaluate")
+    private String sellerEvaluate;
+
+    @ApiModelProperty(value = "卖家评分")
+    @TableField("seller_rating")
+    private Integer sellerRating;
+
+    @ApiModelProperty(value = "交易状态  1-待确认  2-已拒绝  3-待交易  4-交易成功  5-交易失败  6-交易取消")
+    @TableField("trade_status")
+    private Integer tradeStatus;
+
+    @ApiModelProperty(value = "取消交易的用户id")
+    @TableField("cancel_user_id")
+    private Integer cancelUserId;
+
+    @ApiModelProperty(value = "取消交易原因(字典表_cancelTradeReason)")
+    @TableField("cancel_reason")
+    private String cancelReason;
+
+    @ApiModelProperty(value = "取消交易原因补充")
+    @TableField("cancel_reason_supplement")
+    private String cancelReasonSupplement;
+
+    @ApiModelProperty(value = "失效状态(平台端统计用)  0-未失效  1-已失效")
+    @TableField("failure_flag")
+    private String failureFlag;
+
+    @ApiModelProperty(value = "失效原因")
+    @TableField("failure_reason")
+    private String failureReason;
+
+    @ApiModelProperty(value = "删除标记  0:未删除  1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
+    private Integer updatedUserId;
+
+}

+ 55 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondUserCredit.java

@@ -0,0 +1,55 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户
+ */
+@Data
+@JsonInclude
+@TableName("second_user_credit")
+public class SecondUserCredit implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private Integer userId;
+
+    @TableField("user_points")
+    private Integer userPoints;
+
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "冻结时间")
+    @TableField("freeze_time")
+    private Date freezeTime;
+
+    @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")
+    private Integer createdUserId;
+
+    @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")
+    private Integer updatedUserId;
+}

+ 58 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondUserCreditDateRecord.java

@@ -0,0 +1,58 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户积分日期记录表
+ */
+@Data
+@JsonInclude
+@TableName("second_user_credit_date_record")
+public class SecondUserCreditDateRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private Integer userId;
+
+    @TableField("record_date")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty(value = "记录日期")
+    private Date recordDate;
+
+    @TableField("total_points")
+    @ApiModelProperty(value = "当日总积分")
+    private Integer totalPoints;
+
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @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")
+    private Integer createdUserId;
+
+    @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")
+    private Integer updatedUserId;
+}
+

+ 57 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/SecondUserCreditRecord.java

@@ -0,0 +1,57 @@
+package shop.alien.entity.second;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户
+ */
+@Data
+@JsonInclude
+@TableName("second_user_credit_record")
+public class SecondUserCreditRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private Integer userId;
+
+    @TableField("points")
+    private Integer points;
+
+    @TableField("points_type")
+    private Integer pointsType;
+
+    @TableField("current_score_count")
+    private Integer currentScoreCount;
+
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @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")
+    private Integer createdUserId;
+
+    @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")
+    private Integer updatedUserId;
+}

+ 56 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/enums/RiskControlRuleTypeEnum.java

@@ -0,0 +1,56 @@
+package shop.alien.entity.second.enums;
+
+import lombok.Getter;
+
+/**
+ * 风控规则类型枚举
+ * @see RiskControlRuleTypeEnum 风控规则类型枚举
+ */
+@Getter
+public enum RiskControlRuleTypeEnum {
+    /**
+     * 洗钱嫌疑: 高频高价交易(>5次/天,>200元/笔)
+     */
+    MONEY_LAUNDERING_SUSPICION(1, "洗钱嫌疑", "24h>5次>200元"),
+
+    /**
+     * 账号异常: 同一设备/mac 24小时内注册超过3个账号
+     */
+    ACCOUNT_ABNORMAL(2, "账号异常", "24h同设备>3账号"),
+
+    /**
+     * 交易欺诈: 用户频繁修改商品 发布成功的记录(24小时 3次 - 调取接口发当前时间 倒推24小时)
+     */
+    TRANSACTION_FRAUD(3, "交易欺诈", "24h修改商品>3次"),
+
+    /**
+     * 异常发布: 短时间大量发布同类商品(如24小时发布10个同二级分类触发- 调取接口发当前时间 倒推24小时)
+     */
+    ABNORMAL_PUBLISH(4, "异常发布", "24h同分类>10商品");
+
+
+    private final Integer ruleType;
+    private final String ruleName;
+    private final String description;
+
+    RiskControlRuleTypeEnum(Integer ruleType, String ruleName, String description) {
+        this.ruleType = ruleType;
+        this.ruleName = ruleName;
+        this.description = description;
+    }
+
+    /**
+     * 根据ruleType获取枚举
+     *
+     * @param ruleType 规则类型
+     * @return 对应的枚举值
+     */
+    public static RiskControlRuleTypeEnum fromRuleType(Integer ruleType) {
+        for (RiskControlRuleTypeEnum rule : RiskControlRuleTypeEnum.values()) {
+            if (rule.getRuleType().equals(ruleType)) {
+                return rule;
+            }
+        }
+        return null;
+    }
+}

+ 61 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/enums/SecondGoodsStatusEnum.java

@@ -0,0 +1,61 @@
+package shop.alien.entity.second.enums;
+
+import lombok.Getter;
+
+/**
+ * 二手商品状态枚举
+ */
+@Getter
+public enum SecondGoodsStatusEnum {
+    /**
+     * 草稿
+     */
+    DRAFT(0, "草稿"),
+    
+    /**
+     * 审核中
+     */
+    UNDER_REVIEW(1, "审核中"),
+    
+    /**
+     * 审核失败
+     */
+    REVIEW_FAILED(2, "审核失败"),
+    
+    /**
+     * 已上架
+     */
+    LISTED(3, "已上架"),
+    
+    /**
+     * 已下架
+     */
+    DELISTED(4, "已下架"),
+    
+    /**
+     * 已售出
+     */
+    SOLD(5, "已售出");
+
+    private final Integer code;
+    private final String description;
+
+    SecondGoodsStatusEnum(Integer code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    /**
+     * 根据code获取枚举
+     * @param code 状态码
+     * @return 对应的枚举值
+     */
+    public static SecondGoodsStatusEnum fromCode(Integer code) {
+        for (SecondGoodsStatusEnum status : SecondGoodsStatusEnum.values()) {
+            if (status.getCode().equals(code)) {
+                return status;
+            }
+        }
+        return null;
+    }
+}

+ 25 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/enums/SecondUserCreditScoreEnum.java

@@ -0,0 +1,25 @@
+package shop.alien.entity.second.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum SecondUserCreditScoreEnum {
+
+    BASE_SCORE(1, 300, "基础分"),
+    CERTIFICATION_SCORE(2, 200, "认证分"),
+    TRANSACTION_SCORE(3, 50, "交易成功"),
+    SUSPECTED_OF_MONEY_LAUNDERING(4, -50, "洗钱嫌疑"),
+    ABNORMAL_ACCOUNTV(5, -50, "账号异常"),
+    TRADING_FRAUD(6, -50, "交易欺诈"),
+    ABNORMAL_RELEASE(7, -50, "异常发布");
+
+    private final Integer code;
+    private final Integer score;
+    private final String description;
+
+    SecondUserCreditScoreEnum(Integer code, Integer score, String description) {
+        this.code = code;
+        this.score = score;
+        this.description = description;
+    }
+}

+ 20 - 0
alien-service-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-service-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-service-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;
+}

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

@@ -0,0 +1,20 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.store.StoreComment;
+
+@Data
+@JsonInclude
+@ApiModel(value = "二手商品", description = "用户信息")
+public class SecondCommentVo extends StoreComment {
+
+    @ApiModelProperty(value = "用户名")
+    private String userName;
+
+    @ApiModelProperty(value = "用户头像")
+    private String userImage;
+
+}

+ 39 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondEntrustUserDTO.java

@@ -0,0 +1,39 @@
+package shop.alien.entity.second.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondTradeRecord;
+
+/**
+ * <p>
+ * 二手委托人信息 DTO
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-11-21
+ */
+@Data
+@ApiModel(value = "SecondEntrustUserDTO", description = "二手委托人信息传输对象")
+public class SecondEntrustUserDTO extends SecondTradeRecord {
+
+    @ApiModelProperty(value = "交易ID")
+    private Integer entrustTradeId;
+
+    @ApiModelProperty(value = "交易编号")
+    private String entrustTradeNo;
+
+    @ApiModelProperty(value = "委托人电话")
+    private String entrustUserPhone;
+
+    @ApiModelProperty(value = "委托人姓名")
+    private String entrustUserName;
+
+    @ApiModelProperty(value = "委托人身份证")
+    private String entrustIdCard;
+
+    @ApiModelProperty(value = "委托人身份证照片")
+    private String entrustIdCardImg;
+
+}
+

+ 30 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondEntrustUserDetailVo.java

@@ -0,0 +1,30 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondEntrustUser;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 二手委托人详情 VO
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-11-21
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "SecondEntrustUserDetailVo", description = "二手委托人详情对象")
+public class SecondEntrustUserDetailVo {
+
+    @ApiModelProperty(value = "委托人基本信息")
+    private SecondEntrustUser entrustUserInfo;
+
+    @ApiModelProperty(value = "关联的交易记录集合")
+    private List<SecondTradeRecordVo> tradeRecords;
+}
+

+ 41 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondEntrustUserQueryVo.java

@@ -0,0 +1,41 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * 二手委托人信息查询 VO(以人为维度)
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-11-21
+ */
+@Data
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "SecondEntrustUserQueryVo", description = "二手委托人信息查询对象(以人为维度)")
+public class SecondEntrustUserQueryVo {
+
+    @ApiModelProperty(value = "分页页数")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "分页条数")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "委托人姓名")
+    private String entrustUserName;
+
+    @ApiModelProperty(value = "委托人身份证号")
+    private String entrustIdCard;
+
+    @ApiModelProperty(value = "委托人电话")
+    private String entrustUserPhone;
+
+    @ApiModelProperty(value = "交易编号")
+    private String entrustTradeNo;
+}
+

+ 39 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondEntrustUserResultVo.java

@@ -0,0 +1,39 @@
+package shop.alien.entity.second.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import shop.alien.entity.second.SecondEntrustUser;
+
+/**
+ * <p>
+ * 二手委托人信息结果 VO(以人为维度)
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-11-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "SecondEntrustUserResultVo", description = "二手委托人信息结果对象(以人为维度)")
+public class SecondEntrustUserResultVo extends SecondEntrustUser {
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "委托记录总数")
+    private Integer entrustCount;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "关联交易总数")
+    private Integer tradeCount;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "最近委托时间")
+    private String latestEntrustTime;
+}
+

+ 33 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsAdminQueryDTO.java

@@ -0,0 +1,33 @@
+package shop.alien.entity.second.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 二手商品管理后台查询DTO
+ */
+@Data
+@ApiModel(value = "SecondGoodsAdminQueryDTO", description = "二手商品管理后台查询参数")
+public class SecondGoodsAdminQueryDTO {
+
+    @ApiModelProperty(value = "当前页码")
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "每页数量")
+    private Integer pageSize = 10;
+
+    @ApiModelProperty(value = "商品名称")
+    private String title;
+
+    @ApiModelProperty(value = "商品状态 0:草稿 1:审核中 2:审核失败 3:已上架 4:已下架 5:已售出,6:已删除")
+    private Integer goodsStatus;
+
+    @ApiModelProperty(value = "发布时间开始时间")
+    private Date releaseStartTime;
+
+    @ApiModelProperty(value = "发布时间结束时间")
+    private Date releaseEndTime;
+}

+ 27 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsDetailVo.java

@@ -0,0 +1,27 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondGoodsRecord;
+
+import java.util.List;
+
+@Data
+@JsonInclude
+@ApiModel(value = "SecondGoodsDetailVo", description = "二手商品详情VO")
+public class SecondGoodsDetailVo {
+
+    @ApiModelProperty(value = "商品基本信息")
+    private SecondGoodsVo goodsInfo;
+
+    @ApiModelProperty(value = "商品操作记录集合")
+    private List<SecondGoodsRecord> operationRecords;
+
+    @ApiModelProperty(value = "商品交易记录集合")
+    private List<SecondTradeRecordVo> tradeRecords;
+
+    @ApiModelProperty(value = "商品举报集合")
+    private List<SecondReportingVo> reports;
+}

+ 119 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsRecommendVo.java

@@ -0,0 +1,119 @@
+package shop.alien.entity.second.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondGoods;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Data
+@JsonInclude
+@ApiModel(value = "二手商品推荐", description = "推荐")
+public class SecondGoodsRecommendVo extends SecondGoods {
+
+    @ApiModelProperty(value = "用户名称")
+    private String userName;
+
+    @ApiModelProperty(value = "用户PHONE")
+    private String userPhone;
+
+    @ApiModelProperty(value = "用户头像")
+    private String userImage;
+
+    @ApiModelProperty(value = "距离")
+    private String dist;
+
+    @ApiModelProperty(value = "是否关注")
+    private Integer fansStatus = 0;
+
+    @ApiModelProperty(value = "是否点赞")
+    private String likeStatus;
+
+    @ApiModelProperty(value = "是否收藏")
+    private String collectStatus;
+
+    @ApiModelProperty(value = "评论数量")
+    private String commentCount;
+
+    @ApiModelProperty(value = "评论列表")
+    private List<SecondCommentVo> commentList;
+
+    @TableField(value = "release_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "发布时间")
+    private Date releaseTime;
+
+    @ApiModelProperty(value = "视频第一帧")
+    private String videoFirstFrame;
+
+    @ApiModelProperty(value = "话题列表")
+    @JsonProperty("topicList")
+    private List<String> topicList() {
+        return parseTopic(getTopic());
+    }
+
+    @ApiModelProperty(value = "图片列表")
+    private String[] imgList;
+
+    @ApiModelProperty(value = "发布时间")
+    @JsonProperty("timeAgo")
+    public String getFormattedTimeAgo() {
+        return getTimeAgo(getReleaseTime());
+    }
+
+
+    /**
+     * 解析话题列表
+     *
+     * @param topic 话题列表字符串
+     * @return 解析后的话题列表
+     */
+    public List<String> parseTopic(String topic) {
+        if (topic != null && !topic.isEmpty()) {
+            return Arrays.asList(topic.split(","));
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    public String getTimeAgo(Date releaseTime) {
+        if (releaseTime == null) {
+            return "未知时间";
+        }
+
+        long now = System.currentTimeMillis();
+        long diff = now - releaseTime.getTime();
+
+        // 新增分钟级判断
+        long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);
+        if (minutes < 1) {
+            return "刚刚";
+        } else if (minutes < 60) {
+            return minutes + "分钟前";
+        }
+
+        long hours = TimeUnit.MILLISECONDS.toHours(diff);
+        long days = TimeUnit.MILLISECONDS.toDays(diff);
+        long months = days / 31;
+        long years = days / 365;
+
+        if (hours < 24) {
+            return hours + "小时前";
+        } else if (days <= 31) {
+            return days + "天前";
+        } else if (years >= 1) {
+            return years + "年前";
+        } else {
+            return months + "个月前";
+        }
+    }
+}

+ 162 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondGoodsRecordDetailVo.java

@@ -0,0 +1,162 @@
+package shop.alien.entity.second.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondGoodsRecord;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@ApiModel("商品操作记录详情VO")
+public class SecondGoodsRecordDetailVo {
+
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "商品ID")
+    private Integer goodsId;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户电话")
+    private String userPhone;
+
+    @ApiModelProperty("一级分类名称")
+    @TableField(exist = false)
+    private String categoryOneName;
+
+    @ApiModelProperty("二级分类名称")
+    @TableField(exist = false)
+    private String categoryTwoName;
+
+    @TableField("user_id")
+    @ApiModelProperty(value = "用户ID")
+    private Integer userId;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户名称")
+    private String userName;
+
+    @TableField("operation_name")
+    @ApiModelProperty(value = "操作名称")
+    private String operationName;
+
+    @ApiModelProperty(value = "商品标题")
+    private String title;
+
+    @ApiModelProperty(value = "商品描述")
+    private String description;
+
+    @ApiModelProperty(value = "商品价格(元,保留小数后两位)")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "商品位置")
+    private String position;
+
+    @ApiModelProperty(value = "点赞数量")
+    private Integer likeCount;
+
+    @ApiModelProperty(value = "收藏数量")
+    private Integer collectCount;
+
+    @ApiModelProperty(value = "一级类别ID")
+    private Integer categoryOneId;
+
+    @ApiModelProperty(value = "二级类别ID")
+    private Integer categoryTwoId;
+
+    @ApiModelProperty(value = "标签")
+    private String label;
+
+    @ApiModelProperty(value = "话题(以逗号分隔)")
+    private String topic;
+
+    @ApiModelProperty(value = "交易ID")
+    private Integer tradeId;
+
+    @ApiModelProperty(value = "发布时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date releaseTime;
+
+    @ApiModelProperty(value = "商品状态 0:草稿 1:审核中 2:审核失败 3:已上架 4:已下架 5:已售出")
+    private Integer goodsStatus;
+
+    @ApiModelProperty(value = "审核失败原因")
+    private String failedReason;
+
+    @ApiModelProperty(value = "首页图")
+    private String homeImage;
+
+    @ApiModelProperty(value = "视频审核任务id")
+    private String videoTaskId;
+
+    @ApiModelProperty(value = "视频第一帧图片")
+    private String videoFirstFrame;
+
+    @ApiModelProperty(value = "删除标记 0:未删除 1:已删除")
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "地址文本")
+    private String addressText;
+
+    @ApiModelProperty(value = "商品图片列表")
+    private List<String> imageUrls;
+
+    @ApiModelProperty(value = "图片集合")
+    private List<Map<String, Object>> imgList;
+    public static SecondGoodsRecordDetailVo fromRecord(SecondGoodsRecord record) {
+        SecondGoodsRecordDetailVo vo = new SecondGoodsRecordDetailVo();
+        vo.setId(record.getId());
+        vo.setUserId(record.getUserId());
+        vo.setOperationName(record.getOperationName());
+        vo.setGoodsId(record.getGoodsId());
+        vo.setTitle(record.getTitle());
+        vo.setDescription(record.getDescription());
+        vo.setPrice(record.getPrice());
+        vo.setPosition(record.getPosition());
+        vo.setLikeCount(record.getLikeCount());
+        vo.setCollectCount(record.getCollectCount());
+        vo.setCategoryOneId(record.getCategoryOneId());
+        vo.setCategoryTwoId(record.getCategoryTwoId());
+        vo.setLabel(record.getLabel());
+        vo.setTopic(record.getTopic());
+        vo.setTradeId(record.getTradeId());
+        vo.setReleaseTime(record.getReleaseTime());
+        vo.setGoodsStatus(record.getGoodsStatus());
+        vo.setFailedReason(record.getFailedReason());
+        vo.setHomeImage(record.getHomeImage());
+        vo.setVideoTaskId(record.getVideoTaskId());
+        vo.setVideoFirstFrame(record.getVideoFirstFrame());
+        vo.setDeleteFlag(record.getDeleteFlag());
+        vo.setCreatedTime(record.getCreatedTime());
+        vo.setCreatedUserId(record.getCreatedUserId());
+        vo.setUpdatedTime(record.getUpdatedTime());
+        vo.setUpdatedUserId(record.getUpdatedUserId());
+        vo.setAddressText(record.getAddressText());
+        vo.setUpdatedUserId(record.getUpdatedUserId());
+        vo.setAddressText(record.getAddressText());
+        vo.setCategoryOneName(record.getCategoryOneName());
+        vo.setCategoryTwoName(record.getCategoryTwoName());
+
+        return vo;
+    }
+}

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

@@ -0,0 +1,173 @@
+package shop.alien.entity.second.vo;
+
+import com.alibaba.fastjson2.util.DateUtils;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
+import lombok.Data;
+import shop.alien.entity.second.SecondGoods;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@Data
+@JsonInclude
+@ApiModel(value = "二手商品发布", description = "发布")
+public class SecondGoodsVo extends SecondGoods {
+
+    @ApiModelProperty(value = "保存方式 0:草稿 1:发布")
+    private Integer saveType;
+
+    @ApiModelProperty(value = "商品距离")
+    private String distance;
+
+//    @NotBlank(message = "商品图片不能为空")
+    @ApiModelProperty(value = "商品图片")
+    private List<String> imgUrl;
+
+    @ApiModelProperty(value = "图片集合")
+    private List<Map<String, Object>> imgList;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户名称")
+    private String userName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户真名")
+    private String realName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户电话")
+    private String userPhone;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户头像")
+    private String userImage;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "收藏状态 默认为 0")
+    private Integer collectStatus = 0;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "点赞状态 默认为 0")
+    private Integer likeStatus = 0;
+    
+    @TableField(exist = false)
+    @ApiModelProperty(value = "商品状态名称")
+    private String goodsStatusName;
+
+    @ApiModelProperty("一级分类名称")
+    @TableField(exist = false)
+    private String categoryOneName;
+
+    @ApiModelProperty("二级分类名称")
+    @TableField(exist = false)
+    private String categoryTwoName;
+
+    @ApiModelProperty(value = "商品图片列表")
+    private List<String> imageUrls;
+    /** -------------------- 搜索入参 -------------------- */
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "当前页码")
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "每页数量")
+    private Integer pageSize = 10;
+
+    @ApiModelProperty(value = "当前经度")
+    private Double currentLatitude;
+
+    @ApiModelProperty(value = "当前纬度")
+    private Double currentLongitude;
+
+    @ApiModelProperty(value = "排序字段 排序字段 价格-price,发布时间-releaseTime")
+    private String orderData;
+
+    @ApiModelProperty(value = "排序方式 排序方式 1-正序 2-倒叙")
+    private Integer orderType;
+
+    @ApiModelProperty(value = "搜索入参")
+    private String searchData;
+
+    @ApiModelProperty(value = "屏蔽id")
+    private String shieldId;
+
+    @ApiModelProperty(value = "商品id")
+    private Integer goodsId;
+
+    @ApiModelProperty(value = "屏蔽商品IDList")
+    private List<Integer> shieldedGoodsIds;
+
+    @ApiModelProperty(value = "拉黑用户IDList")
+    private List<Integer> userIdList;
+
+    @JsonProperty("timeAgo")
+    public String getFormattedTimeAgo() {
+        return getTimeAgo(getReleaseTime());
+    }
+
+    @JsonProperty("topicList")
+    public List<String> parseTopic() {
+        return parseTopic(getTopic());
+    }
+
+    /**
+     * 解析话题列表
+     *
+     * @param topic 话题列表字符串
+     * @return 解析后的话题列表
+     */
+    public List<String> parseTopic(String topic) {
+        if (topic != null && !topic.isEmpty()) {
+            return Arrays.asList(topic.split(","));
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    /**
+     * 返回时间描述,根据发布时间计算距离现在多久。
+     * 24小时内 返回几小时前,24小时外 1-31返回几天前,31天外返回几月前,365天外返回几年前
+     *
+     * @param releaseTime 发布时间
+     * @return 时间描述字符串
+     */
+
+    public String getTimeAgo(Date releaseTime) {
+        if (releaseTime == null) {
+            return "未知时间";
+        }
+
+        long now = System.currentTimeMillis();
+        long diff = now - releaseTime.getTime();
+
+        // 新增分钟级判断
+        long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);
+        if (minutes < 1) {
+            return "刚刚";
+        } else if (minutes < 60) {
+            return minutes + "分钟前";
+        }
+
+        long hours = TimeUnit.MILLISECONDS.toHours(diff);
+        long days = TimeUnit.MILLISECONDS.toDays(diff);
+        long months = days / 31;
+        long years = days / 365;
+
+        if (hours < 24) {
+            return hours + "小时前";
+        } else if (days <= 31) {
+            return days + "天前";
+        } else if (years >= 1) {
+            return years + "年前";
+        } else {
+            return months + "个月前";
+        }
+    }
+}

+ 66 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondReportingVo.java

@@ -0,0 +1,66 @@
+package shop.alien.entity.second.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@JsonInclude
+@ApiModel(value = "二手商品", description = "举报详情")
+public class SecondReportingVo{
+
+    @ApiModelProperty(value = "通知标题")
+    private Integer id;
+
+    @ApiModelProperty(value = "商品标题")
+    private String title;
+
+    @ApiModelProperty(value = "处理状态(0:未处理,1:违规,2:未违规)")
+    private String processingStatus;
+
+    @ApiModelProperty(value = "商品封面图片")
+    private String homeImage;
+
+    @ApiModelProperty(value = "商品描述")
+    private String description;
+
+    @ApiModelProperty(value = "商品价格(元,保留小数后两位)")
+    private String price;
+
+    @ApiModelProperty(value = "反馈内容")
+    private String feedbackContext;
+
+    @ApiModelProperty(value = "举报内容")
+    private String reportingContext;
+
+    @ApiModelProperty(value = "举报类型")
+    private String reportContextType;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "举报时间")
+    private Date reportingTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "反馈时间")
+    private Date feedbackTime;
+
+    @ApiModelProperty(value = "图片集合")
+    private List<Map<String, Object>> imgList;
+
+    @ApiModelProperty(value = "举报人名称")
+    private String reportingUserName;
+
+    @ApiModelProperty(value = "联系方式")
+    private String reportingUserPhone;
+
+    @ApiModelProperty(value = "视频第一帧")
+    private String videoFirstFrame;
+
+}

+ 42 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondRiskControlRecordVo.java

@@ -0,0 +1,42 @@
+package shop.alien.entity.second.vo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondRiskControlRecord;
+
+import java.util.Date;
+
+@Data
+@JsonInclude
+@TableName("second_risk_control_record")
+public class SecondRiskControlRecordVo extends SecondRiskControlRecord {
+    private static final long serialVersionUID = 1L;
+
+    @TableField("rule_risk")
+    @ApiModelProperty(value = "风险等级")
+    private String ruleRisk;
+
+    @TableField("rule_name")
+    @ApiModelProperty(value = "规则名称")
+    private String ruleName;
+
+    @ApiModelProperty(value = "触发次数")
+    private String UserPhone;
+
+    @ApiModelProperty(value = "规则名称")
+    private String ruleTypeName;
+
+    @ApiModelProperty(value = "规则名称")
+    private String riskStatusName;
+
+    @ApiModelProperty(value = "分页页数")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "分页条数")
+    private Integer pageSize;
+
+}

+ 30 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondRiskRecordVo.java

@@ -0,0 +1,30 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.store.LifeUser;
+
+import java.util.List;
+
+@Data
+@JsonInclude
+public class SecondRiskRecordVo extends SecondRiskControlRecordVo {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "洗钱嫌疑")
+    private List<SecondTradeRecordVo> tradeRecordList;
+
+    @ApiModelProperty(value = "交易欺诈")
+    private List<SecondGoodsRecordDetailVo> goodsRecordList;
+
+    @ApiModelProperty(value = "异常发布")
+    private List<SecondGoodsVo> goodsList;
+
+    @ApiModelProperty(value = "账号异常")
+    private List<LifeUser> userList;
+
+    @ApiModelProperty(value = "1:执行, 2:忽略")
+    private Integer isExecute;
+
+}

+ 94 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondTradeRecordVo.java

@@ -0,0 +1,94 @@
+package shop.alien.entity.second.vo;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import shop.alien.entity.second.SecondTradeRecord;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "SecondTradeRecordVo对象", description = "二手商品交易vo")
+public class SecondTradeRecordVo extends SecondTradeRecord {
+
+    @ApiModelProperty(value = "分页页数")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "分页条数")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "买方姓名")
+    private String buyerName;
+
+    @ApiModelProperty(value = "买方联系方式")
+    private String buyerPhone;
+
+    @ApiModelProperty(value = "卖方姓名")
+    private String sellerName;
+
+    @ApiModelProperty(value = "卖方联系方式")
+    private String sellerPhone;
+
+    @ApiModelProperty(value = "商品标题")
+    private String title;
+
+    @ApiModelProperty(value = "用户id")
+    private Integer userId;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户电话")
+    private String userPhone;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户名称")
+    private String userName;
+
+    @ApiModelProperty(value = "商品封面图片")
+    private String homeImage;
+
+    @ApiModelProperty(value = "商品价格(元,保留小数后两位)")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "用户交易状态  0-未确认  1-交易成功  2-交易失败")
+    private Integer userTransactionStatus;
+
+    @ApiModelProperty(value = "用户交易评价")
+    private String userEvaluate;
+
+    @ApiModelProperty(value = "用户交易评分")
+    private Integer userRating;
+
+    @ApiModelProperty(value = "当前时间是否超过交易时间  0-否  1-是")
+    private String timeOutFlag;
+
+    @ApiModelProperty(value = "商品标签")
+    private String goodsLabel;
+
+    @ApiModelProperty(value = "交易流程")
+    private List<JSONObject> operationJsonList;
+
+    @ApiModelProperty(value = "商品信息")
+    private SecondGoodsVo goodsInfo;
+
+    @ApiModelProperty(value = "委托人ID")
+    private Integer entrustId;
+
+    @ApiModelProperty(value = "委托人电话")
+    private String entrustUserPhone;
+
+    @ApiModelProperty(value = "委托人姓名")
+    private String entrustUserName;
+
+    @ApiModelProperty(value = "委托人身份证")
+    private String entrustIdCard;
+
+    @ApiModelProperty(value = "委托人身份证图片")
+    private String entrustIdCardImg;
+}

+ 27 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondUserCreditRecordListVo.java

@@ -0,0 +1,27 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondUserCreditDateRecord;
+import shop.alien.entity.second.SecondUserCreditRecord;
+
+import java.util.List;
+
+/**
+ * 用户信用分记录列表VO
+ */
+@Data
+@JsonInclude
+public class SecondUserCreditRecordListVo {
+
+    @ApiModelProperty(value = "用户积分")
+    private Integer userPoints;
+
+    @ApiModelProperty(value = "信用分记录列表")
+    private List<SecondUserCreditRecord> recordsChange;
+
+    @ApiModelProperty(value = "日期积分记录列表")
+    private List<SecondUserCreditDateRecord> dateRecords;
+}
+

+ 22 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondUserCreditVo.java

@@ -0,0 +1,22 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondUserCredit;
+
+
+/**
+ * 用户
+ */
+@Data
+@JsonInclude
+public class SecondUserCreditVo extends SecondUserCredit {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "规则类型 1:洗钱嫌疑 2:账号异常 3:交易欺诈 4:异常发布")
+    private Integer ruleType;
+
+    @ApiModelProperty(value = "业务ID(如商品ID、交易ID等)")
+    private String businessId;
+}

+ 45 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondUserViolationDetailVo.java

@@ -0,0 +1,45 @@
+package shop.alien.entity.second.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.store.LifeUserDynamics;
+import shop.alien.entity.store.StoreComment;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 二手商品类别表
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "SecondUserViolation对象", description = "二手交易平台管理举报")
+public class SecondUserViolationDetailVo extends SecondUserViolationVo{
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "举报图片集合")
+    private List<Map<String, Object>> imgList;
+
+    // 商品信息
+    private SecondGoodsVo secondGoods;
+
+    // 动态图片
+    @ApiModelProperty(value = "动态图片")
+    private List<String> dynamicsImg;
+
+    // 评论图片
+    @ApiModelProperty(value = "评论图片")
+    private List<String> commentImg;
+
+    // 动态信息
+    @ApiModelProperty(value = "动态信息")
+    LifeUserDynamics dynamicsInfo;
+
+    // 评论信息
+    @ApiModelProperty(value = "评论信息")
+    StoreComment commentInfo;
+
+}

+ 58 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SecondUserViolationVo.java

@@ -0,0 +1,58 @@
+package shop.alien.entity.second.vo;
+
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import shop.alien.entity.store.LifeUserViolation;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 二手商品类别表
+ */
+@Data
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "SecondUserViolation对象", description = "二手交易平台管理举报")
+public class SecondUserViolationVo extends LifeUserViolation {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "分页页数")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "分页条数")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "被举报用户名称")
+    private String reportedUserName;
+
+    @ApiModelProperty(value = "被举报用户电话")
+    private String reportedUserPhone;
+
+    @ApiModelProperty(value = "举报用户名称")
+    private String reportingUserName;
+
+    @ApiModelProperty(value = "举报用户电话")
+    private String reportingUserPhone;
+
+    @ApiModelProperty(value = "举报类型")
+    private String reportContext;
+
+    @ApiModelProperty(value = "举报时间")
+    private String reportingDate;
+
+    @ApiModelProperty(value = "举报枚举")
+    private String dictDetail;
+
+    @ApiModelProperty(value = "举报状态")
+    private String processingContext;
+
+    @ApiModelProperty(value = "图片")
+    private List<String> imgUrl;
+
+}

+ 172 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SellGoodsVo.java

@@ -0,0 +1,172 @@
+package shop.alien.entity.second.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import shop.alien.entity.second.SecondGoods;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Data
+@JsonInclude
+@ApiModel(value = "二手商品发布", description = "发布")
+public class SellGoodsVo extends SecondGoods {
+
+    @ApiModelProperty(value = "保存方式 0:草稿 1:发布")
+    private Integer saveType;
+
+    @ApiModelProperty(value = "商品距离")
+    private String distance;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户名称")
+    private String userName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户真名")
+    private String realName;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户电话")
+    private String userPhone;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "用户头像")
+    private String userImage;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "收藏状态 默认为 0")
+    private Integer collectStatus = 0;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "点赞状态 默认为 0")
+    private Integer likeStatus = 0;
+
+    @ApiModelProperty("一级分类名称")
+    @TableField(exist = false)
+    private String categoryOneName;
+
+    @ApiModelProperty("二级分类名称")
+    @TableField(exist = false)
+    private String categoryTwoName;
+
+    /** -------------------- 搜索入参 -------------------- */
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "当前页码")
+    private Integer pageNum = 1;
+
+    @ApiModelProperty(value = "每页数量")
+    private Integer pageSize = 10;
+
+    @ApiModelProperty(value = "当前经度")
+    private Double currentLatitude;
+
+    @ApiModelProperty(value = "当前纬度")
+    private Double currentLongitude;
+
+
+
+    @ApiModelProperty(value = "买家id")
+    private Integer buyerId;
+
+    @ApiModelProperty(value = "卖家id")
+    private Integer sellerId;
+
+    @ApiModelProperty(value = "交易时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date transactionTime;
+
+    @ApiModelProperty(value = "交易地点(经纬度)")
+    private String transactionLatitudeLongitude;
+
+    @ApiModelProperty(value = "交易地点(详细地址)")
+    private String transactionLocation;
+
+    @ApiModelProperty(value = "交易金额")
+    private BigDecimal transactionAmount;
+
+    @ApiModelProperty(value = "买家交易状态  1-交易成功  2-交易失败")
+    private Integer buyerTransactionStatus;
+
+    @ApiModelProperty(value = "卖家交易状态  1-交易成功  2-交易失败")
+    private Integer sellerTransactionStatus;
+
+    @ApiModelProperty(value = "交易状态  1-待确认  2-已拒绝  3-待交易  4-交易成功  5-交易失败  6-交易取消")
+    private Integer tradeStatus;
+
+    @ApiModelProperty(value = "买家评价")
+    private String buyerEvaluate;
+
+    @ApiModelProperty(value = "卖家评价")
+    private String sellerEvaluate;
+
+    @ApiModelProperty(value = "交易对方的用户ID")
+    private Integer otherPartyId;
+
+    @ApiModelProperty(value = "商品id")
+    @TableField("goods_id")
+    private Integer goodsId;
+
+    @ApiModelProperty(value = "交易地点(经纬度地址)")
+    @TableField("transaction_latitude_longitude_address")
+    private String transactionLatitudeLongitudeAddress;
+
+
+    @ApiModelProperty(value = "买家是否签到  0-未签到  1-已签到")
+    @TableField("buyer_sign_in")
+    private Integer buyerSignIn;
+
+    @ApiModelProperty(value = "买家签到时间")
+    @TableField("buyer_sign_in_time")
+    private Date buyerSignInTime;
+
+    @ApiModelProperty(value = "买家签到地点(经纬度)")
+    @TableField("buyer_sign_in_latitude_longitude")
+    private String buyerSignInLatitudeLongitude;
+
+    @ApiModelProperty(value = "买家签到地点(经纬度)")
+    @TableField("buyer_sign_in_latitude_longitude_address")
+    private String buyerSignInLatitudeLongitudeAddress;
+
+    @ApiModelProperty(value = "卖家是否签到  0-未签到  1-已签到")
+    @TableField("seller_sign_in")
+    private Integer sellerSignIn;
+
+    @ApiModelProperty(value = "卖家签到时间")
+    @TableField("seller_sign_in_time")
+    private Date sellerSignInTime;
+
+    @ApiModelProperty(value = "卖家签到地点(经纬度)")
+    @TableField("seller_sign_in_latitude_longitude")
+    private String sellerSignInLatitudeLongitude;
+
+    @ApiModelProperty(value = "卖家签到地点(经纬度地址)")
+    @TableField("seller_sign_in_latitude_longitude_address")
+    private String sellerSignInLatitudeLongitudeAddress;
+
+    @ApiModelProperty(value = "取消交易的用户id")
+    @TableField("cancel_user_id")
+    private Integer cancelUserId;
+
+    @ApiModelProperty(value = "取消交易原因(字典表_cancelTradeReason)")
+    @TableField("cancel_reason")
+    private String cancelReason;
+
+    @ApiModelProperty(value = "取消交易原因补充")
+    @TableField("cancel_reason_supplement")
+    private String cancelReasonSupplement;
+
+    @ApiModelProperty(value = "当前时间是否超过交易时间  0-否  1-是")
+    private String timeOutFlag;
+
+}

+ 117 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/SellerEvaluationVo.java

@@ -0,0 +1,117 @@
+package shop.alien.entity.second.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 卖家交易评价VO
+ * </p>
+ *
+ * @author system
+ * @since 2025-11-18
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "SellerEvaluationVo对象", description = "卖家交易评价VO")
+public class SellerEvaluationVo {
+
+    @ApiModelProperty(value = "交易记录ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "交易编号")
+    private String tradeNo;
+
+    @ApiModelProperty(value = "商品ID")
+    private Integer goodsId;
+
+    @ApiModelProperty(value = "商品标题")
+    private String goodsTitle;
+
+    @ApiModelProperty(value = "商品封面图片")
+    private String goodsHomeImage;
+
+    @ApiModelProperty(value = "商品价格")
+    private BigDecimal goodsPrice;
+
+    @ApiModelProperty(value = "交易金额")
+    private BigDecimal transactionAmount;
+
+    @ApiModelProperty(value = "买家ID")
+    private Integer buyerId;
+
+    @ApiModelProperty(value = "买家昵称")
+    private String buyerName;
+
+    @ApiModelProperty(value = "买家头像")
+    private String buyerImage;
+
+    @ApiModelProperty(value = "买家手机号")
+    private String buyerPhone;
+
+    @ApiModelProperty(value = "买家真实姓名")
+    private String buyerRealName;
+
+    @ApiModelProperty(value = "买家性别")
+    private String buyerSex;
+
+    @ApiModelProperty(value = "买家简介")
+    private String buyerJianjie;
+
+    @ApiModelProperty(value = "买家评价内容")
+    private String buyerEvaluate;
+
+    @ApiModelProperty(value = "买家评分(1-5分)")
+    private Integer buyerRating;
+
+    @ApiModelProperty(value = "买家信用积分")
+    private Integer buyerCreditScore;
+
+    @ApiModelProperty(value = "买家风控评分等级(A-E,O表示无记录)")
+    private String buyerCreditLevel;
+
+    @ApiModelProperty(value = "卖家ID")
+    private Integer sellerId;
+
+    @ApiModelProperty(value = "卖家昵称")
+    private String sellerName;
+
+    @ApiModelProperty(value = "卖家头像")
+    private String sellerImage;
+
+    @ApiModelProperty(value = "卖家信用积分")
+    private Integer sellerCreditScore;
+
+    @ApiModelProperty(value = "卖家风控评分等级(A-E,O表示无记录)")
+    private String sellerCreditLevel;
+
+    @ApiModelProperty(value = "交易时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date transactionTime;
+
+    @ApiModelProperty(value = "交易状态  1-待确认  2-已拒绝  3-待交易  4-交易成功  5-交易失败  6-交易取消")
+    private Integer tradeStatus;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+
+    @ApiModelProperty(value = "买家完成交易时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date buyerCompleteTime;
+
+    @ApiModelProperty(value = "卖家完成交易时间")
+    @TableField("seller_complete_time")
+    private Date sellerCompleteTime;
+
+
+}
+

+ 25 - 0
alien-service-entity/src/main/java/shop/alien/entity/second/vo/StoreImgDTO.java

@@ -0,0 +1,25 @@
+package shop.alien.entity.second.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import shop.alien.entity.store.StoreImg;
+
+import java.util.Date;
+
+/**
+ * 上传图片vo
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2025/1/13 10:35
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@JsonInclude
+public class StoreImgDTO extends StoreImg {
+
+    @JsonFormat(pattern = "yyyy/MM/dd", timezone = "GMT+8")
+    Date expirationTime;
+}

+ 128 - 0
alien-service-entity/src/main/java/shop/alien/entity/store/LifeUser.java

@@ -0,0 +1,128 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 用户
+ */
+@Data
+@JsonInclude
+@TableName("life_user")
+public class LifeUser implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_name")
+    private String userName;
+
+    @TableField("real_name")
+    private String realName;
+
+    @TableField("user_sex")
+    private String userSex;
+
+    @TableField(value = "user_brithday")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date userBirthday;
+
+    @TableField("guanfang_phone")
+    private String guanfangPhone;
+
+    @TableField("user_phone")
+    private String userPhone;
+
+    @TableField("id_card")
+    private String idCard;
+
+    @TableField("user_image")
+    private String userImage;
+
+    @TableField("xiaofei_time")
+    private Integer xiaofeiTime;
+
+    @TableField("xiaofei_amount")
+    private double xiaofeiAmount;
+
+    @TableField(value = "chaping_time")
+    private Integer chapingTime;
+
+    @TableField(value = "province")
+    private String province;
+
+    @TableField(value = "city")
+    private String city;
+
+    @TableField(value = "district")
+    private String district;
+
+    @TableField(value = "address")
+    private String address;
+
+    @TableField(value = "jianjie")
+    private String jianjie;
+
+    @ApiModelProperty(value = "邀请码")
+    @TableField("invited_num")
+    private String invitedNum;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @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")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "注销标记, 0:未注销, 1:已注销")
+    @TableField("logout_flag")
+    private Integer logoutFlag;
+
+    @ApiModelProperty(value = "注销原因")
+    @TableField("logout_reason")
+    private String logoutReason;
+
+    @ApiModelProperty(value = "注销申请时间")
+    @TableField(value = "logout_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date logoutTime;
+
+    @ApiModelProperty(value = "打卡广场小人图片id")
+    @TableField("clock_img_id")
+    private Integer clockImgId;
+
+    @ApiModelProperty(value = "个人邀请码")
+    @TableField("invite_code")
+    private String inviteCode;
+
+    @ApiModelProperty(value = "绑定他人邀请码")
+    @TableField("bind_invite_code")
+    private String bindInviteCode;
+
+    @ApiModelProperty(value = "是否被封禁(0-否  1-是)")
+    @TableField("is_banned")
+    private Integer isBanned;
+}

+ 143 - 0
alien-service-entity/src/main/java/shop/alien/entity/store/LifeUserDynamics.java

@@ -0,0 +1,143 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户动态
+ */
+@Data
+@JsonInclude
+@TableName("life_user_dynamics")
+public class LifeUserDynamics {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 发布人
+     */
+    private String phoneId;
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 动态内容
+     */
+    private String context;
+
+    /**
+     * 动态图片
+     */
+    private String imagePath;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 地址详情
+     */
+    private String addressContext;
+
+    /**
+     * 地址名称
+     */
+    private String addressName;
+
+    /**
+     * 浏览数
+     */
+    private Integer liulanCount;
+
+    /**
+     * 点赞数
+     */
+    private Integer dianzanCount;
+
+    @ApiModelProperty(value = "1-动态 2-商家社区 3-官方社区")
+    private String type;
+
+    @ApiModelProperty(value = "是否草稿(0-否  1-是)")
+    private Integer draft;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @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")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "是否拉黑(0:未拉黑, 1:已拉黑)")
+    @TableField(exist = false)
+    private String isBlack;
+
+    @ApiModelProperty(value = "省份")
+    @TableField("address_province")
+    private String addressProvince;
+
+    @ApiModelProperty(value = "置顶")
+    @TableField("top_status")
+    private Integer topStatus;
+
+    @ApiModelProperty(value = "修改时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date topTime;
+
+    @ApiModelProperty(value = "启用状态0-启用,1-禁用")
+    @TableField("enable_status")
+    private Integer enableStatus;
+
+    @ApiModelProperty(value = "达人id")
+    @TableField("expert_id")
+    private Integer expertId;
+
+    @ApiModelProperty(value = "业务id")
+    @TableField("business_id")
+    private Integer businessId;
+
+    @ApiModelProperty(value = "转发量")
+    @TableField("transfer_count")
+    private Integer transferCount;
+
+    @ApiModelProperty(value = "达人动态实际浏览数")
+    @TableField("reality_count")
+    private Integer realityCount;
+
+    @ApiModelProperty(value = "是否审核(未审核:0,审核中:1,审核完成:2)")
+    @TableField("check_flag")
+    private Integer checkFlag;
+
+    @ApiModelProperty(value = "AI审核结果查询id")
+    @TableField("ai_task_id")
+    private String aiTaskId;
+
+    @ApiModelProperty(value = "审核失败原因")
+    @TableField("reason")
+    private String reason;
+}

+ 136 - 0
alien-service-entity/src/main/java/shop/alien/entity/store/LifeUserViolation.java

@@ -0,0 +1,136 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户举报
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-04-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "LifeUserViolation对象", description = "用户举报")
+public class LifeUserViolation extends Model<LifeUserViolation> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "被举报用户类型")
+    @TableField("reported_user_type")
+    private String reportedUserType;
+
+    @ApiModelProperty(value = "被举报用户ID")
+    @TableField("reported_user_id")
+    private String reportedUserId;
+
+    @ApiModelProperty(value = "举报用户类型")
+    @TableField("reporting_user_type")
+    private String reportingUserType;
+
+    @ApiModelProperty(value = "举报用户ID")
+    @TableField("reporting_user_id")
+    private String reportingUserId;
+
+    @ApiModelProperty(value = "举报内容分类(0:商户, 1:用户,2:动态,3:评论, 4:二手商品, 5:二手用户)")
+    @TableField("report_context_type")
+    private String reportContextType;
+
+    @ApiModelProperty(value = "1:用户违规,2:色情低俗,3:违法违规,4:谩骂嘲讽、煽动对立,5:涉嫌诈骗,6:人身攻击,7:种族歧视,8:政治敏感,9:虚假、不实内容,违反公德秩序,10:危害人身安全,11:网络暴力,12:其他原因")
+    @TableField("violation_type")
+    private String violationType;
+
+    @ApiModelProperty(value = "其他原因具体内容")
+    @TableField("other_reason_content")
+    private String otherReasonContent;
+
+    @ApiModelProperty(value = "举报凭证图片")
+    @TableField("report_evidence_img")
+    private String reportEvidenceImg;
+
+    @ApiModelProperty(value = "处理状态(0:未处理,1:违规,2:未违规)")
+    @TableField("processing_status")
+    private String processingStatus;
+
+    @ApiModelProperty(value = "处理时间")
+    @TableField(value = "processing_time", fill = FieldFill.INSERT)
+    private Date processingTime;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField(value = "created_user_id", fill = FieldFill.INSERT)
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField(value = "updated_user_id", fill = FieldFill.INSERT_UPDATE)
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "评论ID")
+    @TableField(value = "comment_id")
+    private String commentId;
+
+    @ApiModelProperty(value = "动态ID")
+    @TableField(value = "dynamics_id")
+    private String dynamicsId;
+
+    @ApiModelProperty(value = "举报结果")
+    @TableField(value = "report_result")
+    private String reportResult;
+
+    @ApiModelProperty(value = "商品备份ID")
+    @TableField(value = "business_id")
+    private Integer businessId;
+
+    @ApiModelProperty(value = "举报类型")
+    @TableField(value = "dict_type")
+    private String dictType;
+
+    @ApiModelProperty(value = "举报类型ID")
+    @TableField(value = "dict_id")
+    private Integer dictId;
+
+    @ApiModelProperty(value = "视频第一帧")
+    @TableField(value = "video_first_frame")
+    private String videoFirstFrame;
+
+    @ApiModelProperty(value = "商品ID")
+    @TableField(value = "goods_id")
+    private Integer goodsId;
+
+    @ApiModelProperty(value = "商品ID")
+    @TableField(value = "ai_task_id")
+    private String aiTaskId;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 134 - 0
alien-service-entity/src/main/java/shop/alien/entity/store/StoreComment.java

@@ -0,0 +1,134 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 评论表
+ *
+ * @author ssk
+ * @since 2025-01-02
+ */
+@Data
+@JsonInclude
+@EqualsAndHashCode(callSuper = false)
+@TableName("store_comment")
+@ApiModel(value = "StoreComment对象", description = "评论表")
+public class StoreComment extends Model<StoreComment> {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "门店id")
+    @TableField("store_id")
+    private Integer storeId;
+
+    @ApiModelProperty(value = "用户id")
+    @TableField("user_id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "评论内容")
+    @TableField("comment_content")
+    private String commentContent;
+
+//    @ApiModelProperty(value = "评价星级")
+//    @TableField("comment_star")
+//    private Integer commentStar;
+
+    @ApiModelProperty(value = "业务id")
+    @TableField("business_id")
+    private Integer businessId;
+
+    @ApiModelProperty(value = "业务类型(1:订单评论, 2:动态社区评论, 3:活动评论, 4:店铺打卡评论, 5:订单评价)")
+    @TableField("business_type")
+    private Integer businessType;
+
+    @ApiModelProperty(value = "图片id")
+    @TableField("img_id")
+    private String imgId;
+
+    @ApiModelProperty(value = "点赞数量")
+    @TableField("like_count")
+    private Integer likeCount;
+
+    @ApiModelProperty(value = "回复id, 本表其他ID, 代表回复了本条评论")
+    @TableField("reply_id")
+    private Integer replyId;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @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")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "评分")
+    @TableField("score")
+    private Double score;
+
+    @ApiModelProperty(value = "其他评分")
+    @TableField("other_score")
+    private String otherScore;
+
+//    @ApiModelProperty(value = "评论类型(1:评论(默认), 2:评价)")
+//    @TableField("comment_type")
+//    private Integer commentType;
+
+    @ApiModelProperty(value = "是否匿名(0:否(默认), 1:是)")
+    @TableField("is_anonymous")
+    private Integer isAnonymous;
+
+    @ApiModelProperty(value = "评价标签")
+    @TableField("evaluation_tags")
+    private String evaluationTags;
+
+    @ApiModelProperty(value = "用户id")
+    @TableField("phone_id")
+    private String phoneId;
+
+    @ApiModelProperty(value = "口味评分")
+    @TableField("taste_score")
+    private Double tasteScore;
+
+    @ApiModelProperty(value = "环境评分")
+    @TableField("en_score")
+    private Double enScore;
+
+    @ApiModelProperty(value = "服务评分")
+    @TableField("service_score")
+    private Double serviceScore;
+
+    @ApiModelProperty(value = "订单id")
+    @TableField("order_id")
+    private Integer orderId;
+
+    @ApiModelProperty(value = "律师id")
+    @TableField("lawyer_id")
+    private Integer lawyerId;
+
+}

+ 75 - 0
alien-service-entity/src/main/java/shop/alien/entity/store/StoreImg.java

@@ -0,0 +1,75 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 二期-门店图片
+ *
+ * @author ssk
+ * @since 2024-12-05
+ */
+@Data
+@JsonInclude
+@TableName("store_img")
+@ApiModel(value = "StoreImg对象", description = "门店图片")
+public class StoreImg extends Model<StoreImg> {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "门店id")
+    @TableField("store_id")
+    private Integer storeId;
+
+    @ApiModelProperty(value = "图片类型, 0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单, 8:用户评论, 9:商家申诉,10:商家头像,11:店铺轮播图,12:联名卡图片,13:动态折扣, 14:营业执照,15:合同照片,17:打卡广场小人图片 18: 二手商品发布图片 19:二手商品与用户举报图片,20头图单图模式,21头图多图模式 , 22续签合同, 23 二手商品记录图片类型, 24 食品经营许可证审核前类型 25.食品经营许可证审核后类型 26.运营活动活动标题图 27.运营活动活动详情图 28.运动设施 29.洗浴设施及服务 30.酒水 31.娱乐经营许可证 32.娱乐经营许可证审核前, 33:身份证正面, 34:身份证反面")
+    @TableField("img_type")
+    private Integer imgType;
+
+    @ApiModelProperty(value = "图片描述")
+    @TableField("img_description")
+    private String imgDescription;
+
+    @ApiModelProperty(value = "图片排序")
+    @TableField("img_sort")
+    private Integer imgSort;
+
+    @ApiModelProperty(value = "图片链接")
+    @TableField("img_url")
+    private String imgUrl;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @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")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+
+    @ApiModelProperty(value = "业务ID")
+    @TableField("business_id")
+    private Integer businessId;
+}

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

@@ -0,0 +1,17 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.second.SecondComplaint;
+
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-07-09
+ */
+public interface SecondComplaintMapper extends BaseMapper<SecondComplaint> {
+
+}

+ 67 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondEntrustUserMapper.java

@@ -0,0 +1,67 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.second.SecondEntrustUser;
+import shop.alien.entity.second.vo.SecondEntrustUserResultVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 二手委托人信息表 Mapper 接口
+ * </p>
+ *
+ * @author ssk
+ * @since 2025-11-21
+ */
+@Mapper
+public interface SecondEntrustUserMapper extends BaseMapper<SecondEntrustUser> {
+
+    /**
+     * 分页查询委托人信息列表(以姓名+身份证号为维度分组)
+     *
+     * @param page 分页对象
+     * @param wrapper 查询条件
+     * @return 委托人信息分页列表
+     */
+    @Select("select " +
+            "  MIN(entrust.id) as id, " +
+            "  entrust.entrust_user_name as entrustUserName, " +
+            "  entrust.entrust_id_card as entrustIdCard, " +
+            "  entrust.entrust_user_phone as entrustUserPhone, " +
+            "  entrust.entrust_id_card_img as entrustIdCardImg, " +
+            "  COUNT(DISTINCT entrust.id) as entrustCount, " +
+            "  COUNT(DISTINCT entrust.entrust_trade_id) as tradeCount, " +
+            "  MAX(entrust.created_time) as latestEntrustTime " +
+            "from second_entrust_user entrust " +
+            "left join second_trade_record trade on trade.id = entrust.entrust_trade_id " +
+            "${ew.customSqlSegment} " +
+            "group by entrust.entrust_user_name, entrust.entrust_id_card " +
+            "order by latestEntrustTime desc")
+    IPage<SecondEntrustUserResultVo> getEntrustUserPage(IPage<SecondEntrustUser> page, 
+                                                         @Param(Constants.WRAPPER) QueryWrapper<SecondEntrustUser> wrapper);
+
+    /**
+     * 根据姓名和身份证号查询所有委托记录
+     *
+     * @param entrustUserName 姓名
+     * @param entrustIdCard 身份证号
+     * @return 委托记录列表
+     */
+    @Select("select * from second_entrust_user " +
+            "where entrust_user_name = #{entrustUserName} " +
+            "and entrust_id_card = #{entrustIdCard} " +
+            "and delete_flag = 0 " +
+            "order by created_time desc")
+    List<SecondEntrustUser> getByUserNameAndIdCard(@Param("entrustUserName") String entrustUserName, 
+                                                     @Param("entrustIdCard") String entrustIdCard);
+
+}
+
+

+ 25 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondGoodsAuditMapper.java

@@ -0,0 +1,25 @@
+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.SecondGoodsAudit;
+
+/**
+ * 二手商品审核记录映射器
+ */
+@Mapper
+public interface SecondGoodsAuditMapper extends BaseMapper<SecondGoodsAudit> {
+
+    /**
+     * 根据商品ID查询最新审核记录
+     *
+     * @param goodsId 商品ID
+     * @return 最新审核记录
+     */
+    @Select("SELECT * FROM second_goods_audit " +
+            "WHERE goods_id = #{goodsId} AND delete_flag = 0 " +
+            "ORDER BY created_time DESC LIMIT 1")
+    SecondGoodsAudit getLatestByGoodsId(@Param("goodsId") Integer goodsId);
+}

+ 19 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondGoodsCategoryMapper.java

@@ -0,0 +1,19 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import shop.alien.entity.second.SecondGoodsCategory;
+
+import java.util.List;
+
+/**
+ * 二手商品映射器
+ */
+public interface SecondGoodsCategoryMapper extends BaseMapper<SecondGoodsCategory> {
+    /**
+     * 自定义分页查询
+     */
+    List<SecondGoodsCategory> querySecondGoodsByParentId(@Param("parentId") Integer parentId, @Param("categoryState") Integer categoryState);
+
+    List<SecondGoodsCategory> querySecondGoodsInfo();
+}

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

@@ -0,0 +1,358 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Mapper; // 引入 Mapper 注解
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.second.SecondGoods;
+import shop.alien.entity.second.SecondShield;
+import shop.alien.entity.second.vo.SecondGoodsVo;
+import shop.alien.entity.second.vo.SellGoodsVo;
+
+import java.util.List;
+
+/**
+ * 二手商品映射器
+ */
+public interface SecondGoodsMapper extends BaseMapper<SecondGoods> {
+    /**
+     * 自定义分页查询
+     */
+    List<SecondGoods> getSecondGoodsByPage(IPage<SecondGoods> page);
+    
+    /**
+     * 自定义分页查询并按距离排序
+     * @param page 分页信息
+     * @param currentLatitude 当前位置纬度
+     * @param currentLongitude 当前位置经度
+     * @return 分页后的二手商品列表
+     */
+    List<SecondGoods> getSecondGoodsByPageAndDistance(IPage<SecondGoods> page, @Param("currentLatitude") Double currentLatitude, @Param("currentLongitude") Double currentLongitude);
+
+    /**
+     * 查询用户屏蔽的商品列表
+     * @param page 分页参数
+     * @param userId 用户ID
+     * @return 分页后的屏蔽商品列表
+     */
+    IPage<SecondGoods> getShieldedGoodsListByType(IPage<SecondGoods> page, @Param("userId") Integer userId, @Param("shieldType") Integer shieldType);
+
+    /**
+     * 获取用户屏蔽的商品列表(分页)
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @return 屏蔽的商品列表
+     */
+    @Select("SELECT sg.* , ss.id as shieldId " +
+            "FROM second_goods sg " +
+            "INNER JOIN second_shield ss ON " +
+            "(sg.id = ss.shield_id AND ss.shield_type = 1) "+
+            "${ew.customSqlSegment}")
+    IPage<SecondGoodsVo>  getShieldedGoodsPage(IPage<SecondGoodsVo> page, @Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 查询商品热卖排行榜
+     * @param page 分页参数
+     * @return 商品热卖排行榜列表
+     */
+    IPage<SecondGoods> getHotSellingRanking(IPage<SecondGoods> page);
+
+    /**
+     * 查询商品热卖排行榜(前10名),按标签聚合计算总点赞量
+     * @return 热卖排行榜列表
+     */
+    List<SecondGoods> getHotSellingRankingTop10();
+
+    /**
+     * 获取商品收藏排行榜(前10名),按标签聚合计算总收藏量
+     * @return 收藏排行榜列表
+     */
+    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 搜索结果列表
+     */
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName, "+
+            "ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(',#{currentLongitude},' ',#{currentLatitude} , ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(sg.position, ',', ' '), ')' ))) / 1000, 2) AS distance "+
+            " 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}")
+    IPage<SecondGoodsVo> searchGoodsList(IPage<SecondGoodsVo> page,@Param("currentLatitude") Double currentLatitude , @Param("currentLongitude") Double currentLongitude, @Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 获取商品详情
+     * @param queryWrapper 查询条件
+     * @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}")
+    SecondGoodsVo getGoodsDetails(@Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 获取用户屏蔽的商品列表
+     * @param userId 用户ID
+     * @return 屏蔽的商品列表
+     */
+    List<SecondGoods> getShieldedGoodsList( @Param("userId") Integer userId);
+
+    /**
+     * 获取用户收藏的商品列表
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @return 收藏的商品列表
+     */
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName " +
+            "FROM second_goods sg " +
+            "LEFT JOIN life_collect lc ON sg.id = lc.business_id " +
+            "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}")
+    IPage<SecondGoodsVo> getCollectGoodsPage(IPage<SecondGoodsVo> page,  @Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 获取用户购买的商品列表
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @return 购买的商品列表
+     */
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName " +
+            "FROM second_goods sg " +
+            "LEFT JOIN second_trade_record str ON sg.id = str.goods_id " +
+            "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}")
+    IPage<SecondGoodsVo> getBuyGoodsPage(IPage<SecondGoodsVo> page,  @Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 获取用户出售的商品列表
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @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}")
+    IPage<SecondGoodsVo> getSellGoodsPage(IPage<SecondGoodsVo> page, @Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 获取用户商品列表
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @return 商品列表
+     */
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName, "+
+            "ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(',#{currentLongitude},' ',#{currentLatitude} , ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(sg.position, ',', ' '), ')' ))) / 1000, 2) AS distance "+
+            " 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}")
+    IPage<SecondGoodsVo> getUserGoodsPage(IPage<SecondGoodsVo> page,@Param("currentLatitude") Double currentLatitude , @Param("currentLongitude") Double currentLongitude,  @Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 获取我的商品列表
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @return 商品列表
+     */
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName "+
+//            "ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(',#{currentLongitude},' ',#{currentLatitude} , ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(sg.position, ',', ' '), ')' ))) / 1000, 2) AS distance "+
+            " 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}")
+    IPage<SecondGoodsVo> getMyGoodsPage(IPage<SecondGoodsVo> page,  @Param(Constants.WRAPPER)  QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 获取我的草稿列表
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @return 商品列表
+     */
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName "+
+//            "ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(',#{currentLongitude},' ',#{currentLatitude} , ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(sg.position, ',', ' '), ')' ))) / 1000, 2) AS distance "+
+            " 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}")
+    IPage<SecondGoodsVo> getDraftList(IPage<SecondGoodsVo> page,  @Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 获取用户点赞的商品列表
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @return 点赞的商品列表
+     */
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName "+
+//            "ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(',#{currentLongitude},' ',#{currentLatitude} , ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(sg.position, ',', ' '), ')' ))) / 1000, 2) AS distance "+
+            " FROM second_goods sg " +
+            "left JOIN life_like_record lc " +
+            "on sg.id = lc.huifu_id " +
+            "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}")
+    IPage<SecondGoodsVo> getLikeGoodsPage(IPage<SecondGoodsVo> page,  @Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    /**
+     * 获取用户交易中的商品列表
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @return 交易中的商品列表
+     */
+    @Select("SELECT " +
+            "str.goods_id, " + // 商品id
+            "str.buyer_id, " + // 买家id
+            "str.seller_id, " + // 卖家id
+            "str.transaction_time, " + // 交易时间
+            "str.transaction_latitude_longitude, " + // 交易地点(经纬度)
+            "str.transaction_latitude_longitude_address, " + // 交易地点(经纬度地址)
+            "str.transaction_location, " + // 交易地点(详细地址)
+            "str.transaction_amount, " + // 交易金额
+            "str.buyer_sign_in, " + // 买家是否签到  0-未签到  1-已签到
+            "str.buyer_sign_in_time, " + // 买家签到时间
+            "str.buyer_sign_in_latitude_longitude, " + // 买家签到地点(经纬度)
+            "str.buyer_sign_in_latitude_longitude_address, " + // 买家签到地点(经纬度地址)
+            "str.seller_sign_in, " + // 卖家是否签到  0-未签到  1-已签到
+            "str.seller_sign_in_time, " + // 卖家签到时间
+            "str.seller_sign_in_latitude_longitude, " + // 卖家签到地点(经纬度)
+            "str.seller_sign_in_latitude_longitude_address, " + // 卖家签到地点(经纬度地址)
+            "str.buyer_transaction_status, " + // 买家交易状态  1-交易成功  2-交易失败
+            "str.seller_transaction_status, " + // 卖家交易状态  1-交易成功  2-交易失败
+            "str.trade_status, " + // 交易状态  1-待确认  2-已拒绝  3-待交易  4-交易成功  5-交易失败  6-交易取消
+            "str.buyer_evaluate, " + // 买家评价
+            "str.seller_evaluate, " + // 卖家评价
+            "str.cancel_user_id, " + // 取消交易id
+            "str.cancel_reason, " + // 取消交易原因
+            "str.cancel_reason_supplement, " + // 取消交易原因补充
+            "   if (now() >= str.transaction_time, 1, 0) timeOutFlag, "+
+            "sg.*, " +
+            "    CASE " +
+            "        WHEN str.buyer_id = #{userId} THEN str.seller_id " +
+            "        ELSE str.buyer_id " +
+            "    END AS other_party_id " +
+            "FROM second_trade_record str " +
+            "LEFT JOIN second_goods sg ON str.goods_id = sg.id "+
+            "${ew.customSqlSegment}")
+    IPage<SellGoodsVo> getTransactionList(IPage<SellGoodsVo> page, @Param("userId") Integer userId, @Param(Constants.WRAPPER) QueryWrapper<SellGoodsVo> queryWrapper);
+
+    /**
+     * 管理后台商品列表查询
+     * @param page 分页参数
+     * @param queryWrapper 查询条件
+     * @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}")
+    IPage<SecondGoodsVo> getAdminGoodsList(IPage<SecondGoodsVo> page, @Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+    @Select("SELECT " +
+            "sg.*, " +
+            "lu.user_name as userName, " +
+            "lu.user_phone as userPhone, " +
+            "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 " +
+            "left JOIN life_user lu " +
+            "on lu.id = sg.user_id " +
+            "${ew.customSqlSegment}")
+    SecondGoodsVo getGoodsById(@Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+
+    @Select("SELECT " +
+            "sg.*, " +
+            "lu.user_name as userName, " +
+            "lu.user_phone as userPhone, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName " +
+            "FROM second_goods_record sg " +
+            "join second_goods goods on goods.id = sg.goods_id " +
+            "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 " +
+            "left JOIN life_user lu " +
+            "on lu.id = goods.user_id " +
+            "${ew.customSqlSegment}")
+    SecondGoodsVo getGoodsRecordById(@Param(Constants.WRAPPER) QueryWrapper<SecondGoodsVo> queryWrapper);
+}

+ 38 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondGoodsRecordMapper.java

@@ -0,0 +1,38 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.second.SecondGoodsRecord;
+import shop.alien.entity.second.vo.SecondGoodsVo;
+
+import java.util.List;
+
+public interface SecondGoodsRecordMapper extends BaseMapper<SecondGoodsRecord> {
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName " +
+            "FROM second_goods_record 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<SecondGoodsRecord> selectdminGoodsList(@Param(Constants.WRAPPER) QueryWrapper<SecondGoodsRecord> queryWrapper);
+
+    @Select("SELECT " +
+            "sg.*, " +
+            "sgc1.category_name as categoryOneName, " +
+            "sgc2.category_name as categoryTwoName " +
+            "FROM second_goods_record 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}")
+    SecondGoodsRecord selectGoodsRecordById(@Param(Constants.WRAPPER) QueryWrapper<SecondGoodsRecord> queryWrapper);
+}

+ 29 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondRecommendMapper.java

@@ -0,0 +1,29 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import shop.alien.entity.second.vo.SecondCommentVo;
+import shop.alien.entity.second.vo.SecondGoodsRecommendVo;
+import shop.alien.entity.store.StoreComment;
+
+import java.util.List;
+
+
+/**
+ * 二手商品映射器
+ */
+public interface SecondRecommendMapper extends BaseMapper<SecondGoodsRecommendVo> {
+    /**
+     * 自定义分页查询
+     */
+    IPage<SecondGoodsRecommendVo> getSecondRecommendByPage(IPage<SecondGoodsRecommendVo> page, @Param("userId") Integer userId, @Param("position") String position, @Param("typeId") Integer typeId, @Param("phoneId") String phoneId, @Param("radiusKm") String radiusKm);
+
+    IPage<SecondGoodsRecommendVo> querySecondConcernByPage(IPage<SecondGoodsRecommendVo> page, @Param("userId") Integer userId, @Param("phoneId") String phoneId, @Param("position") String position);
+
+    IPage<SecondGoodsRecommendVo> querySecondNewGoodsByPage(IPage<SecondGoodsRecommendVo> page,@Param("userId") String userId, @Param("phoneId") String phoneId, @Param("position") String position, @Param("radiusKm") String radiusKm);
+
+    List<SecondCommentVo> querySecondCommentInfo(@Param("ids") List<Integer> ids);
+
+    SecondGoodsRecommendVo querySecondGoodsDetail(@Param("goodsId") Integer goodsId, @Param("phoneId") String phoneId, @Param("position") String position);
+}

+ 39 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondRiskControlRecordMapper.java

@@ -0,0 +1,39 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.second.SecondGoodsRecord;
+import shop.alien.entity.second.SecondRiskControlRecord;
+import shop.alien.entity.second.vo.SecondRiskControlRecordVo;
+
+import java.util.List;
+
+/**
+ * 二手商品风控记录映射器
+ */
+public interface SecondRiskControlRecordMapper extends BaseMapper<SecondRiskControlRecord> {
+
+
+    @Select(" select r.*, case when r.rule_type = 1 then '洗钱嫌疑' when r.rule_type = 2 then '账号异常' " +
+            " when r.rule_type = 3 then '交易欺诈' when r.rule_type = 4 then '异常发布' end ruleTypeName,  " +
+            " case when r.rule_type = 1 then '高频高价交易' when r.rule_type = 2 then '同一设备/mac 24小时内注册超过3个账号' " +
+            " when r.rule_type = 3 then '用户频繁修改商品' when r.rule_type = 4 then '短时间大量发布同类商品' end ruleName, " +
+            " case when r.rule_type = 1 or r.rule_type = 2 then '中风险' when r.rule_type = 3 or r.rule_type = 4 then '高风险' end ruleRisk,  " +
+            " case when r.risk_status = 0 then '待处理' when r.risk_status = 1 then '已处理' " +
+            " when r.risk_status = 2 then '已忽略' end riskStatusName,  " +
+            " case when r.rule_type = 1 or r.rule_type = 3 or r.rule_type = 4 then u.user_phone " +
+            " else '--' end userPhone " +
+            " from second_risk_control_record r left join life_user u on r.user_id = u.id " +
+            " ${ew.customSqlSegment} ")
+    IPage<SecondRiskControlRecordVo> queryRiskControlRecords(IPage<SecondRiskControlRecordVo> page, @Param(Constants.WRAPPER) QueryWrapper<SecondRiskControlRecordVo> queryWrapper);
+
+
+    @Select(" select * from second_risk_control_record " +
+            " WHERE created_time BETWEEN DATE_FORMAT(#{starDate}, '%Y-%m-%d %H:%i:%s') " +
+            " AND DATE_FORMAT(#{endDate}, '%Y-%m-%d %H:%i:%s') AND business_id = #{macIp} ")
+    List<SecondRiskControlRecord> selectByBusinessId(@Param("starDate") String starDate, @Param("endDate") String endDate, @Param("macIp") String macIp);
+}

+ 12 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondShieldMapper.java

@@ -0,0 +1,12 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.second.SecondShield;
+
+
+/**
+ * 二手商品映射器
+ */
+public interface SecondShieldMapper extends BaseMapper<SecondShield> {
+
+}

+ 9 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondTradeOperationMapper.java

@@ -0,0 +1,9 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import shop.alien.entity.second.SecondTradeOperation;
+
+@Mapper
+public interface SecondTradeOperationMapper extends BaseMapper<SecondTradeOperation> {
+}

+ 79 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondTradeRecordMapper.java

@@ -0,0 +1,79 @@
+package shop.alien.mapper.second;
+
+
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.second.SecondTradeRecord;
+import shop.alien.entity.second.vo.SecondTradeRecordVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 二手交易记录表 Mapper 接口
+ * </p>
+ *
+ * @author qrs
+ * @since 2025-07-07
+ */
+@Mapper
+public interface SecondTradeRecordMapper extends BaseMapper<SecondTradeRecord> {
+
+    @Select("select trade.id, goods.title, goods.home_image, goods.price, trade.transaction_amount, trade.trade_status, trade.transaction_time, trade.seller_id, " +
+            "       trade.transaction_latitude_longitude, trade.transaction_latitude_longitude_address, trade.transaction_location, trade.created_user_id, " +
+            "       if (now() >= trade.transaction_time, 1, 0) timeOutFlag " +
+            "from second_trade_record trade " +
+            "left join second_goods_record goods on goods.id = trade.goods_record_id " +
+            "${ew.customSqlSegment} ")
+    List<SecondTradeRecordVo> getTradeRecord(@Param(Constants.WRAPPER) QueryWrapper<SecondTradeRecord> wrapper);
+
+    @Select("select trade.id, trade.trade_no, trade.goods_id, goods.title, goods.home_image, goods.price, trade.transaction_amount, trade.trade_status, " +
+            "trade.transaction_time, trade.seller_id, trade.transaction_latitude_longitude, trade.transaction_latitude_longitude_address, " +
+            "trade.transaction_location, trade.created_user_id, trade.failure_flag, trade.failure_reason, if (now() >= trade.transaction_time, 1, 0) timeOutFlag, " +
+            "buyer.user_name buyerName, buyer.user_phone buyerPhone, seller.user_name sellerName, seller.user_phone sellerPhone " +
+            "from second_trade_record trade " +
+            "left join second_goods_record goods on goods.id = trade.goods_record_id " +
+            "left join life_user buyer on buyer.id = trade.buyer_id " +
+            "left join life_user seller on seller.id = trade.seller_id  " +
+            "${ew.customSqlSegment} ")
+    IPage<SecondTradeRecordVo> getTradeRecordPage(IPage<SecondTradeRecord> page, @Param(Constants.WRAPPER) QueryWrapper<SecondTradeRecord> wrapper);
+
+    @Select("select trade.*, buyer.user_name buyerName, buyer.user_phone buyerPhone, seller.user_name sellerName, seller.user_phone sellerPhone " +
+            "from second_trade_record trade " +
+            "left join life_user buyer on buyer.id = trade.buyer_id " +
+            "left join life_user seller on seller.id = trade.seller_id " +
+            "where trade.id = #{id}")
+    SecondTradeRecordVo getTradeRecordById(@Param("id") Integer id);
+
+    @Select("with record as ( " +
+            "    select buyer_id userId, count(1) num, 'buyer' flag, max(transaction_time) time " +
+            "    from second_trade_record " +
+            "    where delete_flag = 0 and trade_status = 4 and failure_flag = 0 " +
+            "    and transaction_time >= #{beginTime} and transaction_time <= #{endTime} " +
+            "    group by buyer_id " +
+            "    union all " +
+            "    select seller_id userId, count(1) num, 'seller' flag, max(transaction_time) time " +
+            "    from second_trade_record " +
+            "    where delete_flag = 0 and trade_status = 4 and failure_flag = 0 " +
+            "    and transaction_time >= #{beginTime} and transaction_time <= #{endTime} " +
+            "    group by seller_id " +
+            ") " +
+            "select a.*, ifnull(b.num, 0) buyer, ifnull(c.num, 0) seller, user.user_name userName, concat('user_', user.user_phone) phoneId, user.user_phone userPhone " +
+            "from ( " +
+            "    select userId, sum(num) num, max(time) time " +
+            "    from record " +
+            "    group by userId " +
+            ") a " +
+            "left join record b on a.userId = b.userId and b.flag = 'buyer' " +
+            "left join record c on a.userId = c.userId and c.flag = 'seller' " +
+            "join life_user user on user.id = a.userId and user.delete_flag = 0 " +
+            "order by a.num desc, a.time " +
+            "limit 20 ")
+    List<JSONObject> getRankingList(@Param("beginTime") String beginTime, @Param("endTime") String endTime);
+}

+ 14 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondUserCreditDateRecordMapper.java

@@ -0,0 +1,14 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.second.SecondUserCreditDateRecord;
+
+import java.util.Date;
+
+/**
+ * 用户积分日期记录映射器
+ */
+public interface SecondUserCreditDateRecordMapper extends BaseMapper<SecondUserCreditDateRecord> {
+
+}
+

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

@@ -0,0 +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);
+
+}

+ 12 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondUserCreditRecordMapper.java

@@ -0,0 +1,12 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.second.SecondUserCreditRecord;
+
+
+/**
+ * 二手商品映射器
+ */
+public interface SecondUserCreditRecordMapper extends BaseMapper<SecondUserCreditRecord> {
+
+}

+ 23 - 0
alien-service-entity/src/main/java/shop/alien/mapper/second/SecondUserViolationMapper.java

@@ -0,0 +1,23 @@
+package shop.alien.mapper.second;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import shop.alien.entity.second.vo.SecondUserViolationDetailVo;
+import shop.alien.entity.second.vo.SecondUserViolationVo;
+
+
+/**
+ * 二手交易举报
+ */
+public interface SecondUserViolationMapper extends BaseMapper<SecondUserViolationVo> {
+
+    IPage<SecondUserViolationVo> getUserViolationByPage(IPage<SecondUserViolationVo> page, @Param("reportingUserName") String reportingUserName,
+                                                        @Param("reportingDate") String reportingDate, @Param("processingStatus") String processingStatus,
+                                                        @Param("reportContextType") String reportContextType);
+
+    SecondUserViolationDetailVo getUserViolationInfo(@Param("id") Integer id);
+
+
+    SecondUserViolationDetailVo getUserViolationDetailInfo(@Param("id") Integer id);
+}

+ 63 - 0
alien-service-entity/src/main/java/shop/alien/mapper/system/SecondVideoTaskMapper.java

@@ -0,0 +1,63 @@
+package shop.alien.mapper.system;
+
+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 org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Repository;
+import shop.alien.entity.SecondVideoTask;
+
+import java.util.List;
+
+/**
+ * 视频审核任务Mapper接口
+ */
+@Mapper
+@Repository
+public interface SecondVideoTaskMapper extends BaseMapper<SecondVideoTask> {
+
+    /**
+     * 查询待处理的审核任务
+     * @return 审核任务列表
+     */
+    @Select("SELECT * FROM second_video_task WHERE status IN ('SUBMITTED', 'PROCESSING') ORDER BY create_time ASC LIMIT 100")
+    List<SecondVideoTask> selectPendingTasks();
+
+    /**
+     * 根据任务ID查询任务详情
+     * @param taskId 任务ID
+     * @return 任务详情
+     */
+    @Select("SELECT * FROM second_video_task WHERE task_id = #{taskId}")
+    SecondVideoTask selectByTaskId(@Param("taskId") String taskId);
+
+    /**
+     * 更新任务状态
+     * @param taskId 任务ID
+     * @param status 状态
+     * @return 更新记录数
+     */
+    @Update("UPDATE second_video_task SET status = #{status}, update_time = NOW() WHERE task_id = #{taskId}")
+    int updateTaskStatus(@Param("taskId") String taskId, @Param("status") String status);
+
+    /**
+     * 更新任务结果
+     * @param taskId 任务ID
+     * @param status 状态
+     * @param riskLevel 风险级别
+     * @param result 审核结果
+     * @return 更新记录数
+     */
+    @Update("UPDATE second_video_task SET status = #{status}, risk_level = #{riskLevel}, result = #{result}, update_time = NOW() WHERE task_id = #{taskId}")
+    int updateTaskResult(@Param("taskId") String taskId, @Param("status") String status,
+                         @Param("riskLevel") String riskLevel, @Param("result") String result);
+
+    /**
+     * 增加重试次数
+     * @param id 任务ID
+     * @return 更新记录数
+     */
+    @Update("UPDATE second_video_task SET retry_count = retry_count + 1, update_time = NOW() WHERE id = #{id}")
+    int incrementRetryCount(@Param("id") Long id);
+}

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

@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.LifeUserDynamicsMapper">
+
+    <select id="getDynamicsList" 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
+        from life_user_dynamics
+        where 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, info.store_name
+        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
+        where dynamice.userType = 'store'
+        union
+        select dynamice.*, user.user_name userName, user.user_image userImage, user.id storeUserId, user.id storeOrUserId, IF(lue.expert_code IS NOT NULL , 1, 0) AS isExpert, '' store_name
+        from dynamice
+        join life_user user on dynamice.phone = user.user_phone and user.delete_flag = 0
+        left join life_user_expert  lue on lue.user_id = user.id and lue.delete_flag = 0
+        where dynamice.userType = 'user') 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
+        where 1=1
+        <if test="nickName != null and nickName != ''">
+            AND dyna1.userName LIKE CONCAT('%', #{nickName}, '%')
+        </if>
+
+        <if test="userType != null and userType != ''">
+            AND dyna1.userType = #{userType}
+        </if>
+
+        <if test="dynamicsType != null and dynamicsType != ''">
+            AND dyna1.dynamicsType = #{dynamicsType}
+        </if>
+
+        <if test="releaseStartTime != null and releaseStartTime != ''">
+            AND dyna1.created_time >= #{releaseStartTime}
+        </if>
+
+        <if test="storeName != null and storeName != ''">
+            AND dyna1.store_name LIKE CONCAT('%', #{storeName}, '%')
+        </if>
+
+        <if test="releaseEndTime != null and releaseEndTime != ''">
+            AND dyna1.created_time &lt;= #{releaseEndTime}
+        </if>
+        GROUP by dyna1.id order by dyna1.top_status desc, dyna1.top_time desc
+    </select>
+
+    <select id="getDynamicsDetail" 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
+        from life_user_dynamics
+        where id = #{id} 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
+        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
+        where dynamice.userType = 'store'
+        union
+        select dynamice.*, user.user_name userName, user.user_image userImage, user.id storeUserId, user.id storeOrUserId, IF(lue.expert_code IS NOT NULL , 1, 0) AS isExpert
+        from dynamice
+        join life_user user on dynamice.phone = user.user_phone and user.delete_flag = 0
+        left join life_user_expert  lue on lue.user_id = user.id and lue.delete_flag = 0
+        where dynamice.userType = 'user') 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>
+
+    <select id="getStoreDynamicslist" resultType="shop.alien.entity.store.vo.LifeUserDynamicsVo">
+        select
+       ANY_VALUE(dyna1.dynamicsType) AS dynamicsType,
+        ANY_VALUE(dyna1.id) AS id,
+        ANY_VALUE(dyna1.title) AS title,
+        ANY_VALUE(dyna1.phoneId) AS phoneId,
+        ANY_VALUE(dyna1.context) AS context,
+        ANY_VALUE(dyna1.image_path) AS imagePath,
+        ANY_VALUE(dyna1.address) AS address,
+        ANY_VALUE(dyna1.address_name) AS addressName,
+        ANY_VALUE(dyna1.address_context) AS addressContext,
+        ANY_VALUE(dyna1.liulan_count) AS liulanCount,
+        ANY_VALUE(dyna1.dianzan_count) AS dianzanCount,
+        ANY_VALUE(dyna1.type) AS type,
+        ANY_VALUE(dyna1.created_time) AS createdTime,
+        ANY_VALUE(dyna1.userType) AS userType,
+        ANY_VALUE(dyna1.phone) AS phone,
+        ANY_VALUE(dyna1.draft) AS draft,
+        ANY_VALUE(dyna1.address_province) AS addressProvince,
+        ANY_VALUE(dyna1.top_status) AS topStatus,
+        ANY_VALUE(dyna1.top_time) AS topTime,
+        ANY_VALUE(dyna1.enable_status) AS enableStatus,
+        ANY_VALUE(dyna1.business_id) AS businessId,
+        ANY_VALUE(dyna1.userName) AS userName,
+        ANY_VALUE(dyna1.userImage) AS userImage,
+        ANY_VALUE(dyna1.storeUserId) AS storeUserId,
+        ANY_VALUE(dyna1.storeName) AS storeName,
+        ANY_VALUE(dyna1.storeOrUserId) AS storeOrUserId,
+        ANY_VALUE(dyna1.isExpert) AS isExpert,
+        ANY_VALUE(dyna1.isLike) AS isLike,
+        ANY_VALUE(dyna1.commentCount) AS commentCount,
+        ANY_VALUE(dyna1.transferNum) AS transferCount,
+        COUNT(dyna1.id) AS fansCount
+        from
+        (
+        select
+        ANY_VALUE(dyna.dynamicsType) AS dynamicsType,
+        dyna.id,
+        ANY_VALUE(dyna.title) AS title,
+        ANY_VALUE(dyna.phoneId) AS phoneId,
+        ANY_VALUE(dyna.context) AS context,
+        ANY_VALUE(dyna.image_path) AS image_path,
+        ANY_VALUE(dyna.address) AS address,
+        ANY_VALUE(dyna.address_name) AS address_name,
+        ANY_VALUE(dyna.address_context) AS address_context,
+        ANY_VALUE(dyna.liulan_count) AS liulan_count,
+        ANY_VALUE(dyna.dianzan_count) AS dianzan_count,
+        ANY_VALUE(dyna.type) AS type,
+        ANY_VALUE(dyna.created_time) AS created_time,
+        ANY_VALUE(dyna.userType) AS userType,
+        ANY_VALUE(dyna.phone) AS phone,
+        ANY_VALUE(dyna.draft) AS draft,
+        ANY_VALUE(dyna.address_province) AS address_province,
+        ANY_VALUE(dyna.top_status) AS top_status,
+        ANY_VALUE(dyna.top_time) AS top_time,
+        ANY_VALUE(dyna.enable_status) AS enable_status,
+        ANY_VALUE(dyna.business_id) AS business_id,
+        ANY_VALUE(dyna.userName) AS userName,
+        ANY_VALUE(dyna.userImage) AS userImage,
+        ANY_VALUE(dyna.storeUserId) AS storeUserId,
+        ANY_VALUE(dyna.storeName) AS storeName,
+        ANY_VALUE(dyna.storeOrUserId) AS storeOrUserId,
+        ANY_VALUE(dyna.isExpert) AS isExpert,
+        ANY_VALUE(dyna.isLike) AS isLike,
+        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,
+        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,
+        info.store_name storeName,
+        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>

+ 14 - 0
alien-service-entity/src/main/resources/mapper/LifeUserMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.LifeUserMapper">
+
+
+
+    <!-- 查询已删除的用户 -->
+    <select id="getRemoveUser" resultType="shop.alien.entity.store.vo.LifeUserVo">
+        select concat(user_name,"(账号已注销)") as name,user_phone FROM life_user where id = #{id}
+    </select>
+
+</mapper>

+ 30 - 0
alien-service-entity/src/main/resources/mapper/LifeUserViolationMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.LifeUserViolationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="shop.alien.entity.store.LifeUserViolation">
+        <id column="id" property="id" />
+        <result column="reported_user_id" property="reportedUserId" />
+        <result column="reported_user_type" property="reportedUserType" />
+        <result column="reporting_user_id" property="reportingUserId" />
+        <result column="reporting_user_type" property="reportingUserType" />
+        <result column="violation_type" property="violationType" />
+        <result column="other_reason_content" property="otherReasonContent" />
+        <result column="report_evidence_img" property="reportEvidenceImg" />
+        <result column="delete_flag" property="deleteFlag" />
+        <result column="created_time" property="createdTime" />
+        <result column="created_user_id" property="createdUserId" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="updated_user_id" property="updatedUserId" />
+        <result column="comment_id" property="commentId" />
+        <result column="dynamics_id" property="dynamicsId" />
+        <result column="report_result" property="reportResult" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, reported_user_id, reporting_user_id, violation_type, other_reason_content, report_evidence_img, delete_flag, created_time, created_user_id, updated_time, updated_user_id, comment_id, dynamics_id, report_result
+    </sql>
+
+</mapper>

+ 29 - 0
alien-service-entity/src/main/resources/mapper/second/SecondEntrustUserMapper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.second.SecondEntrustUserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="shop.alien.entity.second.SecondEntrustUser">
+        <id column="id" property="id" />
+        <result column="entrust_trade_id" property="entrustTradeId" />
+        <result column="entrust_trade_no" property="entrustTradeNo" />
+        <result column="entrust_user_phone" property="entrustUserPhone" />
+        <result column="entrust_user_name" property="entrustUserName" />
+        <result column="entrust_id_card" property="entrustIdCard" />
+        <result column="entrust_id_card_img" property="entrustIdCardImg" />
+        <result column="delete_flag" property="deleteFlag" />
+        <result column="created_time" property="createdTime" />
+        <result column="created_user_id" property="createdUserId" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="updated_user_id" property="updatedUserId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, entrust_trade_id, entrust_trade_no, entrust_user_phone, entrust_user_name, 
+        entrust_id_card, entrust_id_card_img, delete_flag, created_time, created_user_id, 
+        updated_time, updated_user_id
+    </sql>
+
+</mapper>
+

+ 76 - 0
alien-service-entity/src/main/resources/mapper/second/SecondGoodsCategoryMapper.xml

@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.second.SecondGoodsCategoryMapper">
+    <resultMap id="BaseResultMap" type="shop.alien.entity.second.SecondGoodsCategory">
+        <!--@mbggenerated-->
+        <id column="id" property="id" jdbcType="INTEGER"/>
+        <result column="category_name" property="categoryName" jdbcType="VARCHAR"/>
+        <result column="category_url" property="categoryUrl" jdbcType="VARCHAR"/>
+        <result column="parent_id" property="parentId" jdbcType="INTEGER"/>
+        <result column="delete_flag" property="deleteFlag" jdbcType="INTEGER"/>
+        <result column="created_time" property="createdTime" jdbcType="TIMESTAMP"/>
+        <result column="created_user_id" property="createdUserId" jdbcType="INTEGER"/>
+        <result column="updated_time" property="updatedTime" jdbcType="TIMESTAMP"/>
+        <result column="updated_user_id" property="updatedUserId" jdbcType="INTEGER"/>
+        <result column="category_sort" property="categorySort" jdbcType="INTEGER"/>
+        <result column="category_state" property="categoryState" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <!-- 根据上级ID查询二手商品类别表 -->
+    <select id="querySecondGoodsByParentId" resultType="shop.alien.entity.second.SecondGoodsCategory">
+        SELECT
+            id,
+            category_name,
+            category_url,
+            parent_id,
+            delete_flag,
+            created_time,
+            created_user_id,
+            updated_time,
+            updated_user_id,
+            category_sort,
+            case when category_state = 0 then '显示'
+                when category_state = 1 then '隐藏'
+                else '未知'
+            end as category_state
+        FROM
+            second_goods_category
+        WHERE
+            delete_flag = 0
+            <if test="parentId != null and parentId != '' ">
+                AND parent_id = #{parentId}
+            </if>
+            <if test="parentId == null or parentId == '' ">
+                AND parent_id = -1
+            </if>
+            <if test="categoryState == null or categoryState == ''">
+                AND category_state = 0
+            </if>
+        ORDER BY category_sort, created_time
+    </select>
+
+    <!-- 根据上级ID查询二手商品类别表 -->
+    <select id="querySecondGoodsInfo" resultType="shop.alien.entity.second.SecondGoodsCategory">
+        SELECT
+            id,
+            category_name,
+            category_url,
+            parent_id,
+            delete_flag,
+            created_time,
+            created_user_id,
+            updated_time,
+            updated_user_id,
+            category_sort,
+            case when category_state = 0 then '显示'
+            when category_state = 1 then '隐藏'
+            else '未知'
+            end as category_state
+        FROM
+        second_goods_category
+        WHERE
+            delete_flag = 0
+            and parent_id is not null and parent_id != ''
+        ORDER BY category_sort, created_time
+    </select>
+</mapper>

+ 256 - 0
alien-service-entity/src/main/resources/mapper/second/SecondGoodsInfoMapper.xml

@@ -0,0 +1,256 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.second.SecondRecommendMapper">
+    <resultMap id="BaseResultMap" type="shop.alien.entity.second.vo.SecondGoodsRecommendVo">
+        <!--@mbggenerated-->
+        <id column="id" property="id" jdbcType="INTEGER"/>
+        <result column="user_id" property="userId" jdbcType="INTEGER"/>
+        <result column="title" property="title" jdbcType="VARCHAR"/>
+        <result column="description" property="description" jdbcType="VARCHAR"/>
+        <result column="price" property="price" jdbcType="DECIMAL"/>
+        <result column="amount" property="amount" jdbcType="DECIMAL"/>
+        <result column="position" property="position" jdbcType="VARCHAR"/>
+        <result column="like_count" property="likeCount" jdbcType="INTEGER"/>
+        <result column="collect_count" property="collectCount" jdbcType="INTEGER"/>
+        <result column="category_one_id" property="categoryOneId" jdbcType="INTEGER"/>
+        <result column="category_two_id" property="categoryTwoId" jdbcType="INTEGER"/>
+        <result column="label" property="label" jdbcType="VARCHAR"/>
+        <result column="topic" property="topic" jdbcType="VARCHAR"/>
+        <result column="trade_id" property="tradeId" jdbcType="INTEGER"/>
+        <result column="created_time" property="createdTime" jdbcType="TIMESTAMP"/>
+        <result column="created_user_id" property="createdUserId" jdbcType="INTEGER"/>
+        <result column="updated_time" property="updatedTime" jdbcType="TIMESTAMP"/>
+        <result column="updated_user_id" property="updatedUserId" jdbcType="INTEGER"/>
+        <result column="user_name" property="userName" jdbcType="VARCHAR"/>
+        <result column="user_image" property="userImage" jdbcType="VARCHAR"/>
+        <result column="goods_status" property="goodsStatus" jdbcType="INTEGER"/>
+        <result column="delete_flag" property="deleteFlag" jdbcType="INTEGER"/>
+        <result column="dist" property="dist" jdbcType="VARCHAR"/>
+        <result column="isLike" property="isLike" jdbcType="VARCHAR"/>
+        <result column="home_image" property="homeImage" jdbcType="VARCHAR"/>
+        <result column="user_phone" property="userPhone" jdbcType="VARCHAR"/>
+        <result column="release_time" property="releaseTime" jdbcType="VARCHAR"/>
+        <result column="video_first_frame" property="videoFirstFrame" jdbcType="VARCHAR"/>
+
+    </resultMap>
+
+    <!-- 分页查询推荐数据 -->
+    <select id="getSecondRecommendByPage" resultType="shop.alien.entity.second.vo.SecondGoodsRecommendVo">
+        with shieldUser as (
+            select g.id from life_blacklist lb inner join second_goods g
+                on lb.blocked_id = g.user_id  and g.delete_flag = '0' and g.goods_status = '3'
+            where lb.delete_flag = 0 and lb.blocker_type = 2 and lb.blocked_type = 2
+                and lb.blocker_id = #{userId}
+        )
+        SELECT * FROM (
+            SELECT
+                g.id,
+                g.user_id,
+                g.title,
+                g.description,
+                g.price,
+                g.price as amount,
+                g.position,
+                g.like_count,
+                g.collect_count,
+                g.category_one_id,
+                g.category_two_id,
+                g.label,
+                g.topic,
+                g.trade_id,
+                g.created_time,
+                g.created_user_id,
+                g.updated_time,
+                g.updated_user_id,
+                u.user_name,
+                u.user_image,
+                g.goods_status,
+                g.delete_flag,
+                g.release_time,
+                g.video_first_frame,
+                ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', REPLACE(#{position}, ',', ' '), ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(g.position, ',', ' '), ')' ))) / 1000, 2) AS dist,
+                case when llr.id is null then '0' else '1' end likeStatus,
+                g.home_image,
+                CONCAT('user_', u.user_phone) as user_phone
+            FROM
+                second_goods g inner join life_user u on u.id =  g.user_id and u.delete_flag = 0
+                left join life_like_record llr on llr.dianzan_id = #{phoneId} and llr.huifu_id = g.id and llr.type = 6 and llr.delete_flag = 0
+            where g.delete_flag = 0
+                <if test="typeId != null and typeId != '' ">
+                    and (g.category_one_id = #{typeId} or g.category_two_id =#{typeId} )
+                </if>
+                and not exists (select 1 from shieldUser s where s.id = g.id)
+                and not exists (select 1 from second_shield s where s.user_id = #{userId} and s.shield_type = 1 and s.shield_id = g.id and s.delete_flag = 0)
+                and g.goods_status = 3
+                and g.position != '' and g.position is not null
+            order by dist, like_count desc, release_time desc
+        ) a where a.dist &lt; #{radiusKm}
+    </select>
+
+    <!-- 分页查询关注数据concern -->
+    <select id="querySecondConcernByPage" resultType="shop.alien.entity.second.vo.SecondGoodsRecommendVo">
+        with shieldUser as (
+            select g.id from life_blacklist lb inner join second_goods g
+            on lb.blocked_id = g.user_id  and g.delete_flag = '0' and g.goods_status = '3'
+            where lb.delete_flag = 0 and lb.blocker_type = 2 and lb.blocked_type = 2
+            and lb.blocker_id = #{userId}
+        )
+        select
+            g.id,
+            g.user_id,
+            g.title,
+            g.description,
+            g.price,
+            g.price as amount,
+            ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', REPLACE(#{position}, ',', ' '), ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(g.position, ',', ' '), ')' ))) / 1000, 2) AS dist,
+            g.like_count,
+            g.collect_count,
+            g.label,
+            g.topic,
+            g.trade_id,
+            g.created_time,
+            g.created_user_id,
+            g.updated_time,
+            g.updated_user_id,
+            g.release_time,
+            u.user_name,
+            u.user_image,
+            CONCAT('user_', u.user_phone) as user_phone,
+            g.goods_status,
+            g.home_image,
+            g.video_first_frame,
+            case when llr.id is null then '0' else '1' end likeStatus,
+            case when lc.id is null then '0' else '1' end collectStatus,
+            (select count(1) from (SELECT id FROM store_comment c where c.business_id = g.id and c.business_type = 7 and c.delete_flag = 0 UNION ALL
+            SELECT t.id FROM store_comment t INNER JOIN (SELECT id FROM store_comment c where c.business_id = g.id and c.business_type = 7 and c.delete_flag = 0) d ON t.reply_id = d.id and business_type = 6 and delete_flag = 0) a ) as commentCount
+<!--            (SELECT count(1) FROM store_comment c where c.business_id = g.id and c.business_type = 7 and c.delete_flag = 0 ) as commentCount-->
+        from
+            life_fans f inner join life_user u on
+                f.followed_id = CONCAT('user_', u.user_phone) and u.delete_flag = 0
+            inner join second_goods g on
+                u.id = g.user_id
+                and g.goods_status = 3
+                and g.delete_flag = 0
+            left join life_like_record llr on llr.dianzan_id = #{phoneId} and llr.huifu_id = g.id and llr.type = 6 and llr.delete_flag = 0
+            left join life_collect lc on lc.business_id = g.id and lc.user_id = #{phoneId} and lc.delete_flag = 0 and lc.business_type = 1
+        where
+            f.fans_id = #{phoneId} and f.delete_flag = 0
+            and not exists (select 1 from shieldUser s where s.id = g.id)
+            and not exists (select 1 from second_shield s where s.user_id = #{userId} and s.shield_type = 1 and s.shield_id = g.id and s.delete_flag = 0)
+            and g.position != '' and g.position is not null
+        order by g.release_time desc
+    </select>
+
+    <select id="querySecondCommentInfo" resultType="shop.alien.entity.second.vo.SecondCommentVo">
+        select
+            business_id,
+            comment_content,
+            created_time,
+            user_name,
+            user_image,
+            rn
+        from (
+            select
+                c.business_id,
+                c.comment_content,
+                c.created_time,
+                u.user_name,
+                u.user_image,
+                row_number() over (partition by c.business_id order by c.created_time desc) as rn
+            from
+                store_comment c inner join life_user u on c.user_id = u.id and u.delete_flag = 0
+            where c.delete_flag = 0 and c.business_type = 7
+                and business_id in
+                <foreach collection="ids" item="id" open="(" separator="," close=")">
+                    ${id}
+                </foreach>
+        ) a where rn <![CDATA[ <= ]]> 2
+    </select>
+
+    <!-- 分页查询新发数据 -->
+    <select id="querySecondNewGoodsByPage" resultType="shop.alien.entity.second.vo.SecondGoodsRecommendVo">
+        with shieldUser as (
+            select g.id from life_blacklist lb inner join second_goods g
+                on lb.blocked_id = g.user_id  and g.delete_flag = '0' and g.goods_status = '3'
+            where lb.delete_flag = 0 and lb.blocker_type = 2 and lb.blocked_type = 2
+                and lb.blocker_id = #{userId}
+        )
+        SELECT * FROM (
+            SELECT
+                g.id,
+                g.user_id,
+                g.title,
+                g.description,
+                g.price,
+                g.price as amount,
+                g.position,
+                g.like_count,
+                g.collect_count,
+                g.category_one_id,
+                g.category_two_id,
+                g.label,
+                g.topic,
+                g.trade_id,
+                g.created_time,
+                g.created_user_id,
+                g.updated_time,
+                g.updated_user_id,
+                g.release_time,
+                u.user_name,
+                u.user_image,
+                CONCAT('user_', u.user_phone) as user_phone,
+                g.goods_status,
+                g.delete_flag,
+                ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', REPLACE(#{position}, ',', ' '), ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(g.position, ',', ' '), ')' ))) / 1000, 2) AS dist,
+                g.home_image,
+                g.video_first_frame,
+                case when llr.id is null then '0' else '1' end likeStatus,
+                case when lc.id is null then '0' else '1' end collectStatus,
+                (select count(1) from (SELECT id FROM store_comment c where c.business_id = g.id and c.business_type = 7 and c.delete_flag = 0 UNION ALL
+                SELECT t.id FROM store_comment t INNER JOIN (SELECT id FROM store_comment c where c.business_id = g.id and c.business_type = 7 and c.delete_flag = 0) d ON t.reply_id = d.id and business_type = 6 and delete_flag = 0) a ) as commentCount
+    <!--            (SELECT count(1) FROM store_comment c where c.business_id = g.id and c.business_type = 7 and c.delete_flag = 0 ) as commentCount-->
+            FROM
+                second_goods g inner join life_user u on u.id = g.user_id
+                left join life_like_record llr on llr.dianzan_id = #{phoneId} and llr.huifu_id = g.id and llr.type = 6 and llr.delete_flag = 0
+                left join life_collect lc on lc.business_id = g.id and lc.user_id = #{phoneId} and lc.delete_flag = 0 and lc.business_type = 1
+            where g.delete_flag = 0
+                and not exists (select 1 from shieldUser s where s.id = g.id)
+                and not exists (select 1 from second_shield s where s.user_id = #{userId} and s.shield_type = 1 and s.shield_id = g.id and s.delete_flag = 0)
+                and g.goods_status = 3
+                and g.position != '' and g.position is not null
+            order by g.release_time desc
+        ) a where a.dist &lt; #{radiusKm}
+    </select>
+
+    <select id="querySecondGoodsDetail" resultType="shop.alien.entity.second.vo.SecondGoodsRecommendVo">
+        select
+            g.id,
+            g.user_id,
+            g.title,
+            g.description,
+            g.price as amount,
+            g.position,
+            g.like_count,
+            g.collect_count,
+            g.category_one_id,
+            g.category_two_id,
+            g.label,
+            g.topic,
+            g.home_image,
+            g.release_time,
+            g.video_first_frame,
+            lu.user_name,
+            CONCAT('user_', lu.user_phone) as user_phone,
+            lu.user_image,
+            goods_status,
+            ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', REPLACE(#{position}, ',', ' '), ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(g.position, ',', ' '), ')' ))) / 1000, 2) AS dist,
+            case when llr.id is null then '0' else '1' end likeStatus,
+            case when lc.id is null then '0' else '1' end collectStatus
+        from second_goods g inner join life_user lu on g.user_id = lu.id and lu.delete_flag = 0
+            left join life_like_record llr on llr.dianzan_id = #{phoneId} and llr.huifu_id = g.id and llr.type = 6 and llr.delete_flag = 0
+            left join life_collect lc on lc.business_id = g.id and lc.user_id = #{phoneId} and lc.delete_flag = 0 and lc.business_type = 1
+        where g.id = #{goodsId} and g.delete_flag = 0
+            and g.position != '' and g.position is not null
+    </select>
+
+</mapper>

+ 125 - 0
alien-service-entity/src/main/resources/mapper/second/SecondGoodsMapper.xml

@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.second.SecondGoodsMapper">
+    <resultMap id="BaseResultMap" type="shop.alien.entity.second.SecondGoods">
+        <!--@mbggenerated-->
+        <id column="id" property="id" jdbcType="INTEGER"/>
+        <result column="user_id" property="userId" jdbcType="INTEGER"/>
+        <result column="title" property="title" jdbcType="VARCHAR"/>
+        <result column="describe" property="describe" jdbcType="VARCHAR"/>
+        <result column="price" property="price" jdbcType="DECIMAL"/>
+        <result column="position" property="position" jdbcType="VARCHAR"/>
+        <result column="like_count" property="likeCount" jdbcType="INTEGER"/>
+        <result column="collect_count" property="collectCount" jdbcType="INTEGER"/>
+        <result column="category_one_id" property="categoryOneId" jdbcType="INTEGER"/>
+        <result column="category_two_id" property="categoryTwoId" jdbcType="INTEGER"/>
+        <result column="label" property="label" jdbcType="VARCHAR"/>
+        <result column="topic" property="topic" jdbcType="VARCHAR"/>
+        <result column="trade_id" property="tradeId" jdbcType="INTEGER"/>
+        <result column="goods_status" property="goodsStatus" jdbcType="INTEGER"/>
+        <result column="failed_reason" property="failedReason" jdbcType="VARCHAR"/>
+        <result column="delete_flag" property="deleteFlag" jdbcType="INTEGER"/>
+        <result column="created_time" property="createdTime" jdbcType="TIMESTAMP"/>
+        <result column="created_user_id" property="createdUserId" jdbcType="INTEGER"/>
+        <result column="updated_time" property="updatedTime" jdbcType="TIMESTAMP"/>
+        <result column="updated_user_id" property="updatedUserId" jdbcType="INTEGER"/>
+        <result column="release_time" property="releaseTime" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <!-- 自定义分页查询 -->
+    <select id="getSecondGoodsByPage" resultType="shop.alien.entity.second.SecondGoods">
+        SELECT *
+        FROM second_goods
+        WHERE delete_flag = 0
+    </select>
+
+    <!-- 自定义分页查询并按距离排序 Haversine公式 d=rarccos(cos(ϕ1)cos(ϕ2)cos(Δλ)+sin(ϕ1)sin(ϕ2)) -->
+    <select id="getSecondGoodsByPageAndDistance" resultType="shop.alien.entity.second.SecondGoods">
+        SELECT *,
+        (6371 * acos(cos(radians(#{currentLatitude})) * cos(radians(SUBSTRING_INDEX(position, ',', 1))) * cos(radians(SUBSTRING_INDEX(position, ',', -1)) - radians(#{currentLongitude})) + sin(radians(#{currentLatitude})) * sin(radians(SUBSTRING_INDEX(position, ',', 1))))) AS distance
+        FROM second_goods
+        WHERE delete_flag = 0
+        ORDER BY distance ASC
+    </select>
+
+    <!-- 查询商品热卖排行榜 -->
+    <select id="getHotSellingRanking" resultType="shop.alien.entity.second.SecondGoods">
+        SELECT *
+        FROM second_goods
+        WHERE delete_flag = 0
+        ORDER BY like_count DESC
+    </select>
+
+    <!-- 查询商品热卖排行榜(前10名),按标签聚合计算总点赞量 -->
+    <select id="getHotSellingRankingTop10" resultType="shop.alien.entity.second.SecondGoods">
+        SELECT label, SUM(like_count) AS like_count
+        FROM second_goods
+        WHERE delete_flag = 0 and label IS NOT NULL and goods_status = 3
+        GROUP BY label
+        ORDER BY like_count DESC
+        LIMIT 10
+    </select>
+
+    <!-- 获取商品收藏排行榜(前10名),按标签聚合计算总收藏量 -->
+    <select id="getCollectTop10" resultType="shop.alien.entity.second.SecondGoods">
+        SELECT label, SUM(collect_count) AS collect_count
+        FROM second_goods
+        WHERE delete_flag = 0 and label IS NOT NULL and goods_status = 3
+        GROUP BY label
+        ORDER BY collect_count DESC
+            LIMIT 10
+    </select>
+
+    <!-- 查询用户屏蔽的商品列表 -->
+    <select id="getShieldedGoodsList" resultType="shop.alien.entity.second.SecondGoods">
+        SELECT sg.*
+        FROM second_goods sg
+        INNER JOIN second_shield ss ON
+            (sg.id = ss.shield_id AND ss.shield_type = 1)
+        WHERE ss.user_id = #{userId} AND ss.delete_flag = 0 AND sg.delete_flag = 0
+    </select>
+
+    <!-- 搜索商品列表(包含商品信息、图片、用户信息),按距离和创建时间倒序 -->
+    <!--<select id="searchGoodsList" resultType="shop.alien.entity.second.SecondGoods">
+        SELECT 
+            sg.*, 
+            (6371 * acos(cos(radians(#{searchVo.currentLatitude})) * cos(radians(SUBSTRING_INDEX(sg.position, ',', 1))) * cos(radians(SUBSTRING_INDEX(sg.position, ',', -1)) - radians(#{searchVo.currentLongitude})) + sin(radians(#{searchVo.currentLatitude})) * sin(radians(SUBSTRING_INDEX(sg.position, ',', 1))))) AS distance
+        FROM second_goods sg
+        WHERE sg.delete_flag = 0
+        <if test="searchVo.shieldedGoodsIds != null and !searchVo.shieldedGoodsIds.isEmpty()">
+            AND sg.id NOT IN
+            <foreach collection="searchVo.shieldedGoodsIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+        <if test="searchVo.userIdList != null and !searchVo.userIdList.isEmpty()">
+            AND sg.user_id NOT IN
+            <foreach collection="searchVo.userIdList" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+        <if test="searchVo.searchData != null and searchVo.searchData != ''">
+            AND (
+            sg.label LIKE CONCAT('%', #{searchVo.searchData}, '%')
+            OR sg.title LIKE CONCAT('%', #{searchVo.searchData}, '%')
+            OR sg.describe LIKE CONCAT('%', #{searchVo.searchData}, '%')
+            OR sg.category_one_id LIKE CONCAT('%', #{searchVo.searchData}, '%')
+            OR sg.category_two_id LIKE CONCAT('%', #{searchVo.searchData}, '%')
+            )
+        </if>
+        ORDER BY distance ASC,
+        <if test="searchVo.orderData != null and searchVo.orderType != null">
+            CASE
+                WHEN #{searchVo.orderData} = 'distance' THEN distance
+                WHEN #{searchVo.orderData} = 'price' THEN sg.price
+                WHEN #{searchVo.orderData} = 'likeCount' THEN sg.like_count
+                WHEN #{searchVo.orderData} = 'collectCount' THEN sg.collect_count
+                ELSE sg.created_time
+            END
+            <if test="searchVo.orderType == 1">ASC</if>
+            <if test="searchVo.orderType == 2">DESC</if>
+        </if>
+    </select>-->
+</mapper>

+ 5 - 0
alien-service-entity/src/main/resources/mapper/second/SecondGoodsRecordMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.second.SecondGoodsRecordMapper">
+
+</mapper>

+ 130 - 0
alien-service-entity/src/main/resources/mapper/second/SecondUserViolationMapper.xml

@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="shop.alien.mapper.second.SecondUserViolationMapper">
+    <resultMap id="BaseResultMap" type="shop.alien.entity.second.vo.SecondUserViolationVo">
+        <!--@mbggenerated-->
+        <id column="id" property="id" jdbcType="INTEGER"/>
+        <result column="reported_user_name" property="reportedUserName" jdbcType="VARCHAR"/>
+        <result column="reported_user_phone" property="reportedUserPhone" jdbcType="VARCHAR"/>
+        <result column="reporting_user_name" property="reportingUserName" jdbcType="VARCHAR"/>
+        <result column="reporting_user_phone" property="reportingUserPhone" jdbcType="VARCHAR"/>
+        <result column="report_context" property="reportContext" jdbcType="VARCHAR"/>
+        <result column="report_context_type" property="reportContextType" jdbcType="VARCHAR"/>
+        <result column="dict_detail" property="dictDetail" jdbcType="VARCHAR"/>
+        <result column="processing_context" property="processingContext" jdbcType="VARCHAR"/>
+        <result column="processing_status" property="processingStatus" jdbcType="VARCHAR"/>
+        <result column="business_id" property="businessId" jdbcType="INTEGER"/>
+        <result column="created_time" property="reportingDate" jdbcType="TIMESTAMP"/>
+        <result column="other_reason_content" property="otherReasonContent" jdbcType="VARCHAR"/>
+        <result column="report_evidence_img" property="reportEvidenceImg" jdbcType="VARCHAR"/>
+        <result column="processing_time" property="processingTime" jdbcType="TIMESTAMP"/>
+        <result column="report_result" property="reportResult" jdbcType="VARCHAR"/>
+        <result column="video_first_frame" property="videoFirstFrame" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <!-- 分页查询举报信息 -->
+    <select id="getUserViolationByPage" resultType="shop.alien.entity.second.vo.SecondUserViolationVo">
+        select
+            v.id,
+            u.user_name reporting_user_name,
+            u.user_phone reporting_user_phone,
+            case when v.report_context_type = 4 then '二手商品' else '二手用户' end report_context,
+            v.report_context_type,
+            d.dict_detail dict_detail,
+            case when v.processing_status = 0 then '待处理'
+                when v.processing_status = 1 then '已通过'
+                else '已驳回' end processing_context,
+            v.processing_status,
+            v.created_time as reportingDate,
+            v.business_id
+        from
+        life_user_violation v
+        left join store_dictionary d on v.dict_type = d.type_name and v.dict_id = d.dict_id
+        left join life_user u on u.id = v.reporting_user_id
+        where 1 = 1
+        <if test="reportingUserName != null and reportingUserName != ''">
+            and u.user_name like concat('%',#{reportingUserName},'%')
+        </if>
+        <if test="reportingDate != null and reportingDate != ''">
+            and DATE_FORMAT(v.created_time, '%Y-%m-%d') = #{reportingDate}
+        </if>
+        <if test="processingStatus != null and processingStatus != ''">
+            and v.processing_status = #{processingStatus}
+        </if>
+        <if test="reportContextType != null and reportContextType != ''">
+            and v.report_context_type = #{reportContextType}
+        </if>
+        <if test="reportContextType == null or reportContextType == ''">
+            and (v.report_context_type = 4 or v.report_context_type = 5)
+        </if>
+        order by v.created_time desc
+    </select>
+
+    <!-- 分页查询举报信息 -->
+    <select id="getUserViolationInfo" resultType="shop.alien.entity.second.vo.SecondUserViolationDetailVo">
+        select
+            v.id,
+            case when v.report_context_type = 4 then lu1.user_name else u.user_name end reported_user_name,
+            case when v.report_context_type = 4 then lu1.user_phone else u.user_phone end reported_user_phone,
+            lu.user_name reporting_user_name,
+            lu.user_phone reporting_user_phone,
+            v.created_time,
+            case when v.processing_status = 0 then '待处理' when v.processing_status = 1 then '已通过' else '已驳回' end processing_status,
+            d.dict_detail,
+            v.business_id,
+            v.report_context_type,
+            v.processing_status,
+            v.other_reason_content,
+            v.report_evidence_img,
+            v.processing_time,
+            v.report_result,
+            v.video_first_frame
+        from
+        life_user_violation v
+        left join life_user u on v.reported_user_id = u.id
+        left join life_user lu on v.reporting_user_id = lu.id
+        left join store_dictionary d on v.dict_type = d.type_name
+            and v.dict_id = d.dict_id
+        left join second_goods_record g on g.id = v.business_id
+        left join life_user lu1 on g.user_id = lu1.id
+        <if test="id != null and id != ''">
+            where v.id = #{id}
+        </if>
+    </select>
+
+
+    <!-- 分页查询举报信息 -->
+    <select id="getUserViolationDetailInfo" resultType="shop.alien.entity.second.vo.SecondUserViolationDetailVo">
+        select
+            v.id,
+            case when reported_user_type = 1 then s.nick_name else u.user_name end reported_user_name,
+            case when reported_user_type = 1 then s.phone else u.user_phone end reported_user_phone,
+            case when reporting_user_type = 1 then su.nick_name else lu.user_name end reporting_user_name,
+            case when reporting_user_type = 1 then su.phone else lu.user_phone end reporting_user_phone,
+            v.created_time,
+            case when v.processing_status = 0 then '待处理' when v.processing_status = 1 then '已通过' else '已驳回' end processing_status,
+            case when v.violation_type = 1 then '用户违规' when v.violation_type = 2 then '色情低俗' when v.violation_type = 3 then '违法违规' when v.violation_type = 4 then '谩骂嘲讽、煽动对立' when v.violation_type = 5 then '涉嫌诈骗'
+            when v.violation_type = 6 then '人身攻击' when v.violation_type = 7 then '种族歧视' when v.violation_type = 8 then '政治敏感' when v.violation_type = 9 then '虚假、不实内容'
+            when v.violation_type = 10 then '违反公德秩序' when v.violation_type = 11 then '危害人身安全' when v.violation_type = 12 then '网络暴力' else '其他原因' end dict_detail,
+            v.business_id,
+            v.report_context_type,
+            v.processing_status,
+            v.other_reason_content,
+            v.report_evidence_img,
+            v.processing_time,
+            v.report_result,
+            v.video_first_frame,
+            v.comment_id,
+            v.dynamics_id
+        from
+            life_user_violation v
+            left join life_user u on v.reported_user_id = u.id
+            left join store_user s on v.reported_user_id = s.id
+            left join life_user lu on v.reporting_user_id = lu.id
+            left join store_user su on v.reporting_user_id = su.id
+        <if test="id != null and id != ''">
+            where v.id = #{id}
+        </if>
+    </select>
+
+</mapper>