wxd 3 долоо хоног өмнө
parent
commit
ae95cf75e8

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

+ 25 - 0
alien-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);
+}

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

@@ -2,6 +2,7 @@ package shop.alien.second.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.second.SecondGoods;
 import shop.alien.entity.second.vo.SecondGoodsVo;
 import shop.alien.entity.second.vo.SellGoodsVo;
@@ -19,6 +20,7 @@ public interface SecondGoodsService extends IService<SecondGoods> {
      * @param editFlag 编辑标识 0:创建 1:编辑
      * @return 是否成功保存
      */
+    @Transactional
     boolean createBasicInfo(SecondGoodsVo goods, Integer editFlag) throws Exception;
 
     /**

+ 103 - 49
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -13,11 +13,13 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.second.SecondGoods;
+import shop.alien.entity.second.SecondGoodsAudit;
 import shop.alien.entity.second.vo.SecondGoodsVo;
 import shop.alien.entity.second.vo.SellGoodsVo;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.LifeUserVo;
 import shop.alien.mapper.*;
+import shop.alien.mapper.second.SecondGoodsAuditMapper;
 import shop.alien.mapper.second.SecondGoodsMapper;
 import shop.alien.second.service.SecondGoodsService;
 import shop.alien.util.common.VideoUtils;
@@ -56,6 +58,11 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
     private final SecondGoodsMapper secondGoodsMapper;
 
     /**
+     * 二手商品审核Mapper
+     */
+    private final SecondGoodsAuditMapper secondGoodsAuditMapper;
+
+    /**
      * 用户信息Mapper
      */
     private final LifeUserMapper lifeUserMapper;
@@ -111,60 +118,54 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
 
     @Override
     public boolean createBasicInfo(SecondGoodsVo goodsDTO,Integer editFlag) throws Exception {
-        // 实现基本信息保存逻辑
-        SecondGoods goods = new SecondGoods();
-        BeanUtils.copyProperties(goodsDTO, goods);
-
-        if (editFlag == 1){
-            goods.setId(goodsDTO.getId());
-            // 保存商品基本信息
-            if (!updateById(goods)) {
-                return false; // 保存失败直接返回
-            }
-        } else {
-            // 保存商品基本信息
-            if (!save(goods)) {
-                return false; // 保存失败直接返回
+        try {
+            // 实现基本信息保存逻辑
+            SecondGoods goods = new SecondGoods();
+            BeanUtils.copyProperties(goodsDTO, goods);
+
+            if (editFlag == 1) {
+                goods.setId(goodsDTO.getId());
+                goods = secondGoodsMapper.selectById(goodsDTO.getId());
+                // 保存商品基本信息
+                if (!updateById(goods)) {
+                    return false; // 保存失败直接返回
+                }
+            } else {
+                // 保存商品基本信息
+                if (!save(goods)) {
+                    return false; // 保存失败直接返回
+                }
             }
-        }
-
-        // 获取保存后的商品ID,用于后续业务处理
-        Integer savedGoodsId = goods.getId();
-        if (savedGoodsId == null) {
-            return false; // 如果获取不到ID,视为操作失败
-        }
 
-        // 保存商品图片信息
-        if (!saveStoreImages(savedGoodsId, goodsDTO.getImgUrl())) {
-            return false;
-        }
-        // 二手业务安全验证(调取阿里)
-        if (!checkSafety(goods)) {
-            return false;
-        }
+            // 获取保存后的商品ID,用于后续业务处理
+            Integer savedGoodsId = goods.getId();
+            if (savedGoodsId == null) {
+                return false; // 如果获取不到ID,视为操作失败
+            }
 
-        // 执行内容审核(图片和文本)
-        if (!performContentReviews(goods, goodsDTO)) {
-            return true; // 审核不通过时已设置状态,返回成功但标记为审核失败
-        }
+            // 保存商品图片信息
+            if (!saveStoreImages(savedGoodsId, goodsDTO.getImgUrl())) {
+                return false;
+            }
 
-        // 如果所有审核都通过,设置为上架状态
-        goods.setGoodsStatus(3); // 上架
-        goods.setReleaseTime(new Date()); // 上架时间
-        updateById(goods);
+            // 执行内容审核(图片和文本)
+            if (!performContentReviews(goods, goodsDTO)) {
+                return true; // 审核不通过时已设置状态,返回成功但标记为审核失败
+            }
 
-        // 发送消息
-        sendMessage(goods);
-        return true;
-    }
+            // 如果所有审核都通过,设置为上架状态
+            goods.setGoodsStatus(3); // 上架
+            goods.setReleaseTime(new Date()); // 上架时间
+            updateById(goods);
 
-    /**
-     * 二手业务安全验证 (调取阿里)
-     * @param goods 商品信息
-     * @return 验证结果
-     */
-    private boolean checkSafety(SecondGoods goods) {
-        return true;
+            // 发送消息
+            sendMessage(goods);
+            return true;
+        } catch (Exception e) {
+            // 记录异常日志
+            log.error("创建或更新二手商品基本信息时发生异常", e);
+            return false;
+        }
     }
     /**
      * 执行内容审核(图片和文本)
@@ -183,6 +184,10 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
             // 文本审核不通过或存在高风险
             goods.setGoodsStatus(2); // 审核失败
             goods.setFailedReason("文本审核不通过:" + (textCheckResult.getRiskWords() != null ? textCheckResult.getRiskWords() : "存在高风险内容"));
+            // 插入审核记录
+            createGoodsAudit(goods, textCheckResult.getRiskWords());
+            // 发送审核失败消息
+            sendFailedMsg(goods);
             return false;
         }
 
@@ -196,6 +201,10 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
                     // 文本审核不通过或存在高风险
                     goods.setGoodsStatus(2); // 审核失败
                     goods.setFailedReason("图片审核不通过:图片中包含" + (response.getDescriptions() != null ? response.getDescriptions() : "高风险内容"));
+                    // 插入审核记录
+                    createGoodsAudit(goods, response.getDescriptions());
+                    // 发送审核失败消息
+                    sendFailedMsg(goods);
                     return false;
                 }
             }
@@ -208,6 +217,27 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
     }
 
     /**
+     * 创建商品审核记录
+     *
+     * @param goods 商品
+     * @param riskWords 文本审核结果
+     */
+    private void createGoodsAudit(SecondGoods goods, String riskWords) {
+        // 保存审核结果
+        secondGoodsMapper.updateById(goods);
+        // 插入审核记录
+        SecondGoodsAudit auditRecord = new SecondGoodsAudit();
+        auditRecord.setGoodsId(goods.getId());
+        auditRecord.setGoodsStatus(2); // 审核失败
+        auditRecord.setFailedReason("文本审核不通过:" + (riskWords != null ? riskWords : "存在高风险内容"));
+        auditRecord.setCreatedUserId(goods.getUserId());
+        auditRecord.setUpdatedUserId(goods.getUserId());
+        auditRecord.setCreatedTime(new Date());
+        auditRecord.setUpdatedTime(new Date());
+        secondGoodsAuditMapper.insert(auditRecord);
+    }
+
+    /**
      * 保存商品图片信息
      * @param savedGoodsId 保存后的商品ID
      * @param imgUrl 图片URL列表
@@ -261,12 +291,36 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         lifeNotice.setReceiverId("user_"+ phone);
         lifeNotice.setBusinessId(goods.getId());
         lifeNotice.setTitle("商品发布通知");
-        lifeNotice.setContext("您有一笔新的二手商品发布成功,请及时查看");
+        lifeNotice.setContext("恭喜您的商品已发成功");
+        lifeNotice.setNoticeType(1); // 系统通知
+        lifeNotice.setIsRead(0);
+        lifeNoticeMapper.insert(lifeNotice);
+    }
+
+
+    /**
+     * 发送审核失败消息
+     * @param goods 商品审核信息
+     */
+    private void sendFailedMsg(SecondGoods goods) {
+        // 根据 goods.getUserId() 获取用户信息
+        LifeUser lifeUser = lifeUserMapper.selectById(goods.getUserId());
+        String phone = lifeUser.getUserPhone();
+        // 调取feign接口 发送消息 life_notice表
+        LifeNotice lifeNotice = new LifeNotice();
+        lifeNotice.setSenderId("system");
+        lifeNotice.setReceiverId("user_"+ phone);
+        lifeNotice.setBusinessId(goods.getId());
+        lifeNotice.setTitle("商品审核通知");
+        // TODO: 失败原因本期为固定文案,实际原因暂不保存
+//        lifeNotice.setContext("商品审核失败,原因为:" + goods.getFailedReason());
+        lifeNotice.setContext("抱歉您的商品发布失败,图片或文字存在违规行为。请您修改后从新发布");
         lifeNotice.setNoticeType(1); // 系统通知
         lifeNotice.setIsRead(0);
         lifeNoticeMapper.insert(lifeNotice);
     }
 
+
     /**
      * 判断并获取商品封面图(若第一个链接是视频,则取第一帧)
      * @param imgUrl 商品图片/视频链接列表