Selaa lähdekoodia

feat(second): 新增二手商品消息通知和操作记录功能

- 添加二手商品消息通知服务接口及实现类
- 实现审核成功、审核失败、商品下架三种消息通知
- 集成WebSocket消息推送和系统公告存储
- 添加二手商品操作历史记录服务接口及实现类
- 实现商品操作历史的完整数据快照记录
- 支持商品图片信息的历史记录存储
- 完善异常处理和日志记录机制
fcw 1 viikko sitten
vanhempi
commit
51bbb760e0

+ 29 - 0
alien-second/src/main/java/shop/alien/second/service/SecondGoodsNotificationService.java

@@ -0,0 +1,29 @@
+package shop.alien.second.service;
+
+import shop.alien.entity.second.SecondGoods;
+
+/**
+ * 二手商品消息通知服务接口
+ * 负责商品相关的消息通知业务逻辑
+ */
+public interface SecondGoodsNotificationService {
+
+    /**
+     * 发送审核成功消息
+     * @param goods 商品信息
+     */
+    void sendMessage(SecondGoods goods);
+
+    /**
+     * 发送审核失败消息
+     * @param goods 商品信息
+     */
+    void sendFailedMsg(SecondGoods goods);
+
+    /**
+     * 发送商品下架消息
+     * @param goods 商品信息
+     */
+    void sendShelveMessage(SecondGoods goods);
+}
+

+ 18 - 0
alien-second/src/main/java/shop/alien/second/service/SecondGoodsOperationRecordService.java

@@ -0,0 +1,18 @@
+package shop.alien.second.service;
+
+import shop.alien.entity.second.SecondGoods;
+
+/**
+ * 二手商品操作历史记录服务接口
+ * 负责记录商品的各种操作历史
+ */
+public interface SecondGoodsOperationRecordService {
+
+    /**
+     * 记录商品操作历史
+     * @param goods 商品信息
+     * @param operationName 操作名称
+     */
+    void recordGoodsOperation(SecondGoods goods, String operationName);
+}
+

+ 151 - 0
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsNotificationServiceImpl.java

@@ -0,0 +1,151 @@
+package shop.alien.second.service.impl;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.second.SecondGoods;
+import shop.alien.entity.store.LifeNotice;
+import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.vo.WebSocketVo;
+import shop.alien.mapper.LifeNoticeMapper;
+import shop.alien.mapper.LifeUserMapper;
+import shop.alien.second.feign.AlienStoreFeign;
+import shop.alien.second.service.SecondGoodsNotificationService;
+import shop.alien.util.common.Constants;
+
+/**
+ * 二手商品消息通知服务实现类
+ * 负责商品相关的消息通知业务逻辑
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class SecondGoodsNotificationServiceImpl implements SecondGoodsNotificationService {
+
+    /**
+     * 用户信息Mapper
+     */
+    private final LifeUserMapper lifeUserMapper;
+
+    /**
+     * 公告Mapper
+     */
+    private final LifeNoticeMapper lifeNoticeMapper;
+
+    /**
+     * 店铺服务Feign接口
+     */
+    private final AlienStoreFeign alienStoreFeign;
+
+    /**
+     * 发送审核成功消息
+     * @param goods 商品信息
+     */
+    @Override
+    public void sendMessage(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.getAuditRecordId());
+        lifeNotice.setTitle("商品审核通知");
+        
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("goodsId", goods.getId());
+        jsonObject.put("status", "true");
+        jsonObject.put("message", "恭喜您的商品已发布成功。");
+        lifeNotice.setContext(jsonObject.toJSONString());
+        lifeNotice.setNoticeType(Constants.Notice.SYSTEM_NOTICE); // 系统通知
+        lifeNotice.setIsRead(0);
+        lifeNoticeMapper.insert(lifeNotice);
+        
+        sendNotice("user_" + phone, lifeNotice);
+    }
+
+    /**
+     * 发送审核失败消息
+     * @param goods 商品信息
+     */
+    @Override
+    public 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.getAuditRecordId());
+        lifeNotice.setTitle("商品审核通知");
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("goodsId", goods.getId());
+        jsonObject.put("status", "false");
+        jsonObject.put("message", "抱歉您的商品发布失败,图片或文字存在违规行为,请您修改后重新发布。");
+        lifeNotice.setContext(jsonObject.toJSONString());
+        lifeNotice.setNoticeType(Constants.Notice.SYSTEM_NOTICE); // 系统通知
+        lifeNotice.setIsRead(0);
+        lifeNoticeMapper.insert(lifeNotice);
+        
+        sendNotice("user_" + phone, lifeNotice);
+    }
+
+    /**
+     * 发送商品下架消息
+     * @param goods 商品信息
+     */
+    @Override
+    public void sendShelveMessage(SecondGoods goods) {
+        try {
+            // 根据 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("商品下架通知");
+            
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("goodsId", goods.getId());
+            jsonObject.put("message", "您的商品:" + goods.getTitle() + " 已下架");
+            lifeNotice.setContext(jsonObject.toJSONString());
+            lifeNotice.setNoticeType(Constants.Notice.SYSTEM_NOTICE); // 系统通知
+            lifeNotice.setIsRead(0);
+            lifeNoticeMapper.insert(lifeNotice);
+            
+            sendNotice("user_" + phone, lifeNotice);
+        } catch (Exception e) {
+            log.error("发送消息通知失败,goods: {}", goods, e);
+        }
+    }
+
+    /**
+     * 发送通知消息
+     * @param receiverId 接收者ID
+     * @param lifeNotice 通知内容
+     */
+    private void sendNotice(String receiverId, LifeNotice lifeNotice) {
+        try {
+            WebSocketVo webSocketVo = new WebSocketVo();
+            webSocketVo.setSenderId("system");
+            webSocketVo.setReceiverId(receiverId);
+            webSocketVo.setCategory("notice");
+            webSocketVo.setNoticeType("1");
+            webSocketVo.setIsRead(0);
+            webSocketVo.setText(JSONObject.from(lifeNotice).toJSONString());
+            alienStoreFeign.sendMsgToClientByPhoneId(receiverId, JSONObject.from(webSocketVo).toJSONString());
+        } catch (Exception e) {
+            log.error("发送消息通知失败,receiverId: {}", receiverId, e);
+        }
+    }
+}
+

+ 127 - 0
alien-second/src/main/java/shop/alien/second/service/impl/SecondGoodsOperationRecordServiceImpl.java

@@ -0,0 +1,127 @@
+package shop.alien.second.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.second.SecondGoods;
+import shop.alien.entity.second.SecondGoodsRecord;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.mapper.StoreImgMapper;
+import shop.alien.mapper.second.SecondGoodsRecordMapper;
+import shop.alien.second.service.SecondGoodsOperationRecordService;
+import shop.alien.util.common.Constants;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 二手商品操作历史记录服务实现类
+ * 负责记录商品的各种操作历史
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class SecondGoodsOperationRecordServiceImpl implements SecondGoodsOperationRecordService {
+
+    /**
+     * 商品操作历史记录Mapper
+     */
+    private final SecondGoodsRecordMapper secondGoodsRecordMapper;
+
+    /**
+     * 店铺图片Mapper
+     */
+    private final StoreImgMapper storeImgMapper;
+
+    /**
+     * 记录商品操作历史
+     * @param goods 商品信息
+     * @param operationName 操作名称
+     */
+    @Override
+    public void recordGoodsOperation(SecondGoods goods, String operationName) {
+        try {
+            log.warn("开始创建操作历史: {},{} ", goods, operationName);
+            SecondGoodsRecord record = new SecondGoodsRecord();
+            record.setOperationName(operationName);
+            record.setGoodsId(goods.getId());
+            record.setUserId(goods.getUserId());
+            record.setTitle(goods.getTitle());
+            record.setDescription(goods.getDescription());
+            
+            // 价格转换
+            if (goods.getAmount() != null) {
+                record.setPrice(goods.getAmount());
+            } else if (goods.getPrice() != null && !goods.getPrice().isEmpty()) {
+                try {
+                    record.setPrice(new BigDecimal(goods.getPrice()));
+                } catch (Exception e) {
+                    log.warn("转换商品价格时出错: {}", e.getMessage());
+                }
+            }
+            
+            record.setPosition(goods.getPosition());
+            record.setLikeCount(goods.getLikeCount());
+            record.setCollectCount(goods.getCollectCount());
+            record.setCategoryOneId(goods.getCategoryOneId());
+            record.setCategoryTwoId(goods.getCategoryTwoId());
+            record.setLabel(goods.getLabel());
+            record.setTopic(goods.getTopic());
+            record.setTradeId(goods.getTradeId());
+            record.setReleaseTime(goods.getReleaseTime());
+            record.setGoodsStatus(goods.getGoodsStatus());
+            record.setFailedReason(goods.getFailedReason());
+            record.setHomeImage(goods.getHomeImage());
+            record.setVideoTaskId(goods.getVideoTaskId());
+            record.setVideoFirstFrame(goods.getVideoFirstFrame());
+            record.setDeleteFlag(goods.getDeleteFlag());
+            record.setCreatedTime(goods.getCreatedTime());
+            record.setCreatedUserId(goods.getCreatedUserId());
+            record.setUpdatedTime(goods.getUpdatedTime());
+            record.setUpdatedUserId(goods.getUpdatedUserId());
+            record.setAddressText(goods.getAddressText());
+            
+            secondGoodsRecordMapper.insert(record);
+            log.warn("创建操作历史结束: {} ", record);
+            
+            // 保存图片信息
+            saveRecordGoodsImages(record);
+        } catch (Exception e) {
+            log.error("记录商品操作历史时发生异常", e);
+        }
+    }
+
+    /**
+     * 保存二手商品记录图片类型信息
+     * @param record 保存后的商品记录
+     */
+    private void saveRecordGoodsImages(SecondGoodsRecord record) {
+        log.info("创建操作历图片史开始: {} ", 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);
+            log.info("创建操作历图片结束: {} ", storeImg);
+        });
+    }
+}
+