瀏覽代碼

feat(second): 优化二手商品上下架和删除功能

- 在记录商品操作历史时增加操作名称参数
- 新增二手商品记录图片类型保存逻辑
- 修改商品发布和审核流程,增加首次发布和重新发布判断
- 优化商品详情和记录详情的图片展示方式
wxd 3 月之前
父節點
當前提交
49f5badaba

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

@@ -20,10 +20,15 @@ public class SecondGoodsRecord implements Serializable {
     @ApiModelProperty(value = "主键ID")
     private Integer id;
 
+    
     @TableField("goods_id")
     @ApiModelProperty(value = "商品ID")
     private Integer goodsId;
 
+    @TableField("operation_name")
+    @ApiModelProperty(value = "操作名称")
+    private String operationName;
+
     @TableField("title")
     @ApiModelProperty(value = "商品标题")
     private String title;

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

@@ -9,6 +9,7 @@ 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")
@@ -95,6 +96,8 @@ public class SecondGoodsRecordDetailVo {
     @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());

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

@@ -11,10 +11,7 @@ import lombok.Data;
 import shop.alien.entity.second.SecondGoods;
 
 import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 @Data
@@ -32,6 +29,9 @@ public class SecondGoodsVo extends SecondGoods {
     @ApiModelProperty(value = "商品图片")
     private List<String> imgUrl;
 
+    @ApiModelProperty(value = "图片集合")
+    private List<Map<String, Object>> imgList;
+
     @TableField(exist = false)
     @ApiModelProperty(value = "用户名称")
     private String userName;

+ 2 - 2
alien-second/src/main/java/shop/alien/second/controller/SecondGoodsController.java

@@ -123,7 +123,7 @@ public class SecondGoodsController {
         if (updateResult) {
             // 获取最新的商品信息并记录操作历史
             SecondGoods updatedGoods = secondGoodsService.getById(secondGoods.getId());
-            secondGoodsService.recordGoodsOperation(updatedGoods);
+            secondGoodsService.recordGoodsOperation(updatedGoods,"下架商品");
             return R.success("下架成功");
         } else {
             return R.fail("下架失败");
@@ -144,7 +144,7 @@ public class SecondGoodsController {
             if (removeResult) {
                 // 设置删除标记并记录操作历史
                 goods.setDeleteFlag(1);
-                secondGoodsService.recordGoodsOperation(goods);
+                secondGoodsService.recordGoodsOperation(goods,"删除商品");
                 return R.success("删除成功");
             } else {
                 return R.fail("删除失败");

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

@@ -165,8 +165,7 @@ public interface SecondGoodsService extends IService<SecondGoods> {
      * 记录商品操作历史
      * @param goods 商品信息
      */
-    void recordGoodsOperation(SecondGoods goods);
-
+    void recordGoodsOperation(SecondGoods goods,String operationName);
     /**
      * 管理后台商品列表查询
      * @param page 分页参数

+ 79 - 16
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsServiceImpl.java

@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
-import com.alibaba.nacos.api.config.annotation.NacosValue;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -17,7 +16,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.SecondVideoTask;
@@ -43,7 +41,6 @@ import shop.alien.util.common.VideoUtils;
 import shop.alien.util.common.safe.*;
 
 import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -166,8 +163,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         // 3. 获取商品图片列表
         QueryWrapper<StoreImg> imageQueryWrapper = new QueryWrapper<>();
         imageQueryWrapper.lambda()
-                .eq(StoreImg::getStoreId, record.getGoodsId())
-                .eq(StoreImg::getImgType, Constants.ImageType.SECOND_HAND_GOODS)
+                .eq(StoreImg::getStoreId, record.getId())
+                .eq(StoreImg::getImgType, Constants.ImageType.SECOND_HAND_RECORD)
                 .eq(StoreImg::getDeleteFlag, Constants.DeleteFlag.NOT_DELETED)
                 .orderByAsc(StoreImg::getImgSort);
         List<StoreImg> imageList = storeImgMapper.selectList(imageQueryWrapper);
@@ -177,6 +174,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
             List<String> imageUrls = imageList.stream()
                     .map(StoreImg::getImgUrl)
                     .collect(Collectors.toList());
+            List<Map<String, Object>> imgList = processReportImages(imageUrls);
+            detailVo.setImgList(imgList);
             detailVo.setImageUrls(imageUrls);
         }
 
@@ -250,6 +249,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
             List<String> imageUrls = imageList.stream()
                     .map(StoreImg::getImgUrl)
                     .collect(Collectors.toList());
+            List<Map<String, Object>> imgList = processReportImages(imageUrls);
+            goodsInfo.setImgList(imgList);
             goodsInfo.setImgUrl(imageUrls);
         }
         SecondGoodsDetailVo.setGoodsInfo(goodsInfo);
@@ -261,9 +262,10 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
      * @param goods 商品信息
      */
     @Override
-    public void recordGoodsOperation(SecondGoods goods) {
+    public void recordGoodsOperation(SecondGoods goods,String operationName) {
         try {
             SecondGoodsRecord record = new SecondGoodsRecord();
+            record.setOperationName(operationName);
             record.setGoodsId(goods.getId());
             record.setTitle(goods.getTitle());
             record.setDescription(goods.getDescription());
@@ -299,11 +301,44 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
             record.setAddressText(goods.getAddressText());
             
             secondGoodsRecordMapper.insert(record);
+            // 保存图片信息
+            saveRecordGoodsImages(record);
         } catch (Exception e) {
             log.error("记录商品操作历史时发生异常", e);
         }
     }
-    
+
+
+    /**
+     * 保存二手商品记录图片类型信息
+     *
+     * @param record 保存后的商品记录
+     */
+    private void saveRecordGoodsImages(SecondGoodsRecord record ) {
+        // 获取商品图片列表
+        QueryWrapper<StoreImg> query = new QueryWrapper<>();
+        query.lambda().eq(StoreImg::getStoreId, record.getGoodsId())
+                .eq(StoreImg::getImgType, Constants.ImageType.SECOND_HAND_GOODS);
+        List<StoreImg> storeImgs = storeImgMapper.selectList(query);
+        // 保存前先把原有的删除
+        storeImgs.forEach(storeImgModel -> {
+            StoreImg storeImg = new StoreImg();
+            storeImg.setStoreId(record.getId());
+            storeImg.setImgType(Constants.ImageType.SECOND_HAND_RECORD);
+            storeImg.setImgSort(storeImgModel.getImgSort());
+            storeImg.setImgDescription("二手商品记录图片类型");
+            storeImg.setDeleteFlag(Constants.DeleteFlag.NOT_DELETED);
+            storeImg.setCreatedTime(new Date());
+            storeImg.setUpdatedTime(new Date());
+            storeImg.setCreatedUserId(1);
+            storeImg.setUpdatedUserId(1);
+            storeImg.setImgUrl(storeImgModel.getImgUrl());
+            // 保存图片 插入store_img数据库
+            storeImgMapper.insert(storeImg);
+
+        });
+    }
+
     /**
      * 批量转换举报信息为SecondReportingVo对象
      * @param reports 举报信息列表
@@ -373,7 +408,8 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
             }
             // 处理举报凭证图片
             if (StringUtils.hasText(report.getReportEvidenceImg())) {
-                List<Map<String, Object>> imgList = processReportImages(report.getReportEvidenceImg());
+                List<String> urlList = Arrays.asList(report.getReportEvidenceImg().split(","));
+                List<Map<String, Object>> imgList = processReportImages(urlList);
                 reportingVo.setImgList(imgList);
             }
             
@@ -385,12 +421,11 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
 
     /**
      * 处理举报凭证图片
-     * @param reportEvidenceImg 图片URL字符串
+     * @param urlList 图片URL集合
      * @return 图片列表
      */
-    private List<Map<String, Object>> processReportImages(String reportEvidenceImg) {
+    private List<Map<String, Object>> processReportImages(List<String> urlList) {
         List<Map<String, Object>> list = new ArrayList<>();
-        List<String> urlList = Arrays.asList(reportEvidenceImg.split(","));
         List<String> videoList = new ArrayList<>();
         List<String> videoFileType = Arrays.asList("mp4", "avi", "flv", "mkv", "rmvb", "wmv", "3gp", "mov");
 
@@ -556,7 +591,16 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         // 发送审核成功消息
         sendMessage(goods);
         // 上架 记录商品操作历史
-        recordGoodsOperation(goods);
+        String operationName = "";
+        QueryWrapper<SecondGoodsRecord> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("goods_id", goods.getId());
+        List<SecondGoodsRecord> recordList = secondGoodsRecordMapper.selectList(queryWrapper);
+        if (CollectionUtil.isNotEmpty(recordList)){
+            operationName = "重新发布";
+        }else {
+            operationName = "首次发布";
+        }
+        recordGoodsOperation(goods, operationName);
     }
 
     /**
@@ -740,7 +784,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
                     updateById(goods);
                     createGoodsAudit(goods, "", SecondGoodsStatusEnum.UNDER_REVIEW.getCode());
                     // 审核中,记录操作历史
-                    recordGoodsOperation(goods);
+//                    recordGoodsOperation(goods);
                     return true; // 异步处理,直接返回
                 }
             }
@@ -756,7 +800,16 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
         // 发送审核成功消息
         sendMessage(goods);
         // 审核成功,记录操作历史
-        recordGoodsOperation(goods);
+        String operationName = "";
+        QueryWrapper<SecondGoodsRecord> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("goods_id", goods.getId());
+        List<SecondGoodsRecord> recordList = secondGoodsRecordMapper.selectList(queryWrapper);
+        if (CollectionUtil.isNotEmpty(recordList)){
+            operationName = "重新发布";
+        }else {
+            operationName = "首次发布";
+        }
+        recordGoodsOperation(goods, operationName);
         return true;
     }
     
@@ -823,7 +876,7 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
             updateById(secondGoods);
         }
         // 保存前先把原有的删除
-        storeImgMapper.delete(new LambdaUpdateWrapper<StoreImg>().eq(StoreImg::getStoreId, savedGoodsId));
+        storeImgMapper.delete(new LambdaUpdateWrapper<StoreImg>().eq(StoreImg::getStoreId, savedGoodsId).eq(StoreImg::getImgType, Constants.ImageType.SECOND_HAND_GOODS));
         // 批量保存图片信息
         for(int i = 0; i < goods.getImgUrl().size(); i++){
             StoreImg storeImg = new StoreImg();
@@ -1379,7 +1432,17 @@ public class SecondGoodsServiceImpl extends ServiceImpl<SecondGoodsMapper, Secon
                 // 发送审核成功消息
                 sendMessage(goods);
                 // 审核成功,记录操作历史
-                recordGoodsOperation(goods);
+                // 审核成功,记录操作历史
+                String operationName = "";
+                QueryWrapper<SecondGoodsRecord> queryRecordWrapper = new QueryWrapper<>();
+                queryRecordWrapper.eq("goods_id", goods.getId());
+                List<SecondGoodsRecord> recordList = secondGoodsRecordMapper.selectList(queryRecordWrapper);
+                if (CollectionUtil.isNotEmpty(recordList)){
+                    operationName = "重新发布";
+                }else {
+                    operationName = "首次发布";
+                }
+                recordGoodsOperation(goods, operationName);
             } else {
                 // 审核不通过
                 goods.setGoodsStatus(SecondGoodsStatusEnum.REVIEW_FAILED.getCode());