瀏覽代碼

消息、通知、交易

qrs 2 周之前
父節點
當前提交
0ec70ac668

+ 8 - 4
alien-entity/src/main/java/shop/alien/entity/second/SecondTradeRecord.java

@@ -52,6 +52,10 @@ public class SecondTradeRecord extends Model<SecondTradeRecord> {
     @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;
@@ -76,7 +80,7 @@ public class SecondTradeRecord extends Model<SecondTradeRecord> {
     @TableField("seller_transaction_status")
     private Integer sellerTransactionStatus;
 
-    @ApiModelProperty(value = "交易状态  0-待交易  1-交易成功  2-交易失败  3-交易取消")
+    @ApiModelProperty(value = "交易状态  1-待确认  2-已拒绝  3-待交易  4-交易成功  5-交易失败  6-交易取消")
     @TableField("trade_status")
     private Integer tradeStatus;
 
@@ -84,9 +88,9 @@ public class SecondTradeRecord extends Model<SecondTradeRecord> {
     @TableField("buyer_evaluate")
     private String buyerEvaluate;
 
-    @ApiModelProperty(value = "取消交易id")
-    @TableField("cancel_id")
-    private Integer cancelId;
+    @ApiModelProperty(value = "取消交易的用户id")
+    @TableField("cancel_user_id")
+    private Integer cancelUserId;
 
     @ApiModelProperty(value = "取消交易原因(字典表_cancelTradeReason)")
     @TableField("cancel_reason")

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

@@ -0,0 +1,31 @@
+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.NoArgsConstructor;
+import shop.alien.entity.second.SecondTradeRecord;
+
+import java.math.BigDecimal;
+
+@Data
+@JsonInclude
+@NoArgsConstructor
+@ApiModel(value = "SecondTradeRecordVo对象", description = "二手商品交易vo")
+public class SecondTradeRecordVo extends SecondTradeRecord {
+
+    @TableField("title")
+    @ApiModelProperty(value = "商品标题")
+    private String title;
+
+    @TableField("home_image")
+    @ApiModelProperty(value = "商品封面图片")
+    private String homeImage;
+
+    @TableField("price")
+    @ApiModelProperty(value = "商品价格(元,保留小数后两位)")
+    private BigDecimal price;
+
+}

+ 1 - 1
alien-entity/src/main/java/shop/alien/entity/store/vo/WebsocketVo.java

@@ -17,7 +17,7 @@ public class WebsocketVo {
     @ApiModelProperty(value = "类别(消息-message 公告-notice 心跳-heartbeat)")
     private String category;
 
-    @ApiModelProperty(value = "消息类型  1-文本  2-图片 3-链接  4-二手交易创建/确认/拒绝  5-二手交易签到提醒  6-二手交易已签到")
+    @ApiModelProperty(value = "消息类型  1-文本  2-图片 3-链接分享  4-二手交易(确认/拒绝/取消)  5-二手交易签到提醒  6-二手交易已签到")
     private String type;
 
     @ApiModelProperty(value = "消息内容")

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

@@ -1,8 +1,16 @@
 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.Param;
+import org.apache.ibatis.annotations.Select;
 import shop.alien.entity.second.SecondTradeRecord;
+import shop.alien.entity.second.vo.SecondTradeRecordVo;
+import shop.alien.entity.store.vo.LifeFansVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -14,4 +22,9 @@ import shop.alien.entity.second.SecondTradeRecord;
  */
 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_latitude_longitude, trade.transaction_latitude_longitude_address, trade.transaction_location " +
+            "from second_trade_record trade " +
+            "left join second_goods goods on goods.id = trade.goods_id ")
+    List<SecondTradeRecordVo> getTradeRecord(@Param(Constants.WRAPPER) QueryWrapper<SecondTradeRecordVo> wrapper);
 }

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

@@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.second.SecondTradeRecord;
+import shop.alien.entity.second.vo.SecondTradeRecordVo;
 import shop.alien.second.service.SecondTradeRecordService;
 
 import java.util.List;
@@ -35,7 +36,7 @@ public class SecondTradeRecordController {
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({@ApiImplicitParam(name = "sideId", value = "对方的id", dataType = "Integer", paramType = "query", required = true)})
     @GetMapping("/getTradeRecord")
-    public R<List<SecondTradeRecord>> getTradeRecord(@RequestParam int sideId) throws Exception {
+    public R<List<SecondTradeRecordVo>> getTradeRecord(@RequestParam int sideId) throws Exception {
         log.info("SecondTradeRecordController.getTradeRecord?sideId={}", sideId);
         return R.data(secondTradeRecordService.getTradeRecord(sideId));
     }

+ 1 - 1
alien-second/src/main/java/shop/alien/second/controller/TestController.java

@@ -37,7 +37,7 @@ public class TestController {
         System.out.println(111);
         System.out.println(data);
 
-        JSONObject iPage = alienStoreFeign.getMessageList("user_13942852153", 1, 10, 1);
+        JSONObject iPage = alienStoreFeign.getMessageList("user_13942852153", 1, "");
         System.out.println(222);
         System.out.println(iPage);
 

+ 12 - 5
alien-second/src/main/java/shop/alien/second/feign/AlienStoreFeign.java

@@ -1,18 +1,25 @@
 package shop.alien.second.feign;
 
 import com.alibaba.fastjson.JSONObject;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
-@FeignClient(name = "alien-store")
+@FeignClient(url = "http://localhost:8888", name = "alien-store")
 public interface AlienStoreFeign {
 
     @GetMapping("/message/getMessageList")
     JSONObject getMessageList(@RequestParam(value = "receiverId") String receiverId,
-                                           @RequestParam(value = "page") int page,
-                                           @RequestParam(value = "size") int size,
-                                           @RequestParam(value = "friendType") int friendType);
+                              @RequestParam(value = "friendType") int friendType,
+                              @RequestParam(value = "search") String search);
+
+    @GetMapping("/websocket/sendMsgToClientByPhoneId")
+    JSONObject sendMsgToClientByPhoneId(@RequestParam(value = "messageReceiverId") String messageReceiverId,
+                                        @RequestParam(value = "senderId") String senderId,
+                                        @RequestParam(value = "receiverId") String receiverId,
+                                        @RequestParam(value = "category") String category,
+                                        @RequestParam(value = "type") String type,
+                                        @RequestParam(value = "text") String text,
+                                        @RequestParam(value = "messageId") Integer messageId);
 
 }

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

@@ -4,6 +4,7 @@ package shop.alien.second.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import io.swagger.models.auth.In;
 import shop.alien.entity.second.SecondTradeRecord;
+import shop.alien.entity.second.vo.SecondTradeRecordVo;
 
 import java.util.List;
 
@@ -16,7 +17,7 @@ import java.util.List;
  * @since 2025-07-07
  */
 public interface SecondTradeRecordService extends IService<SecondTradeRecord> {
-    List<SecondTradeRecord> getTradeRecord(int sideId) throws Exception;
+    List<SecondTradeRecordVo> getTradeRecord(int sideId) throws Exception;
 
     boolean createTrade(SecondTradeRecord entity) throws Exception;
 

+ 68 - 11
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -1,5 +1,6 @@
 package shop.alien.second.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -8,9 +9,15 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import shop.alien.entity.second.SecondGoods;
 import shop.alien.entity.second.SecondTradeRecord;
+import shop.alien.entity.second.vo.SecondTradeRecordVo;
+import shop.alien.entity.store.LifeMessage;
+import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.vo.WebsocketVo;
 import shop.alien.mapper.LifeMessageMapper;
+import shop.alien.mapper.LifeUserMapper;
 import shop.alien.mapper.second.SecondGoodsMapper;
 import shop.alien.mapper.second.SecondTradeRecordMapper;
+import shop.alien.second.feign.AlienStoreFeign;
 import shop.alien.second.service.SecondTradeRecordService;
 import shop.alien.util.common.JwtUtil;
 
@@ -33,15 +40,17 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
     private final SecondTradeRecordMapper secondTradeRecordMapper;
     private final SecondGoodsMapper secondGoodsMapper;
     private final LifeMessageMapper lifeMessageMapper;
+    private final LifeUserMapper lifeUserMapper;
+    private final AlienStoreFeign alienStoreFeign;
 
     @Override
-    public List<SecondTradeRecord> getTradeRecord(int sideId) throws Exception {
+    public List<SecondTradeRecordVo> getTradeRecord(int sideId) throws Exception {
         try {
             int userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
-            QueryWrapper<SecondTradeRecord> wrapper = new QueryWrapper<>();
-            wrapper.apply("(buyer_id = '" + sideId + "' and seller_id = '" + userId + "') || (buyer_id = '" + userId + "' and seller_id = '" + sideId + "')");
-            wrapper.orderByDesc("created_time");
-            return secondTradeRecordMapper.selectList(wrapper);
+            QueryWrapper<SecondTradeRecordVo> wrapper = new QueryWrapper<>();
+            wrapper.apply("(trade.buyer_id = '" + sideId + "' and trade.seller_id = '" + userId + "') || (trade.buyer_id = '" + userId + "' and trade.seller_id = '" + sideId + "')");
+            wrapper.orderByDesc("trade.created_time");
+            return secondTradeRecordMapper.getTradeRecord(wrapper);
         } catch (Exception e) {
             log.error("SecondTradeRecordServiceImpl.getTradeRecord Error Mgs={}", e.getMessage());
             throw new Exception(e);
@@ -50,17 +59,65 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
 
     /**
      * 创建交易
-     * @param entity 交易记录对象
+     * @param trade 交易记录对象
      * @return 操作结果
      */
     @Override
-    public boolean createTrade(SecondTradeRecord entity) throws Exception {
+    public boolean createTrade(SecondTradeRecord trade) throws Exception {
         try {
-            secondTradeRecordMapper.insert(entity);
+            // 保存交易记录
+            secondTradeRecordMapper.insert(trade);
+
+            // 商品更新交易id
             SecondGoods goods = new SecondGoods();
-            goods.setId(entity.getGoodsId());
-            goods.setTradeId(entity.getId());
+            goods.setId(trade.getGoodsId());
+            goods.setTradeId(trade.getId());
             secondGoodsMapper.updateById(goods);
+
+            // 查询商品
+            goods = secondGoodsMapper.selectById(trade.getGoodsId());
+
+            // 封装交易信息
+            JSONObject message = new JSONObject();
+            message.put("title", goods.getTitle());
+            message.put("homeImage", goods.getHomeImage());
+            message.put("tradeId", trade.getId());
+            message.put("transactionAmount", trade.getTransactionAmount());
+            message.put("transactionLatitudeLongitude", trade.getTransactionLatitudeLongitude());
+            message.put("transactionLatitudeLongitudeAddress", trade.getTransactionLatitudeLongitudeAddress());
+            message.put("transactionLocation", trade.getTransactionLocation());
+            message.put("transactionTime", trade.getTransactionTime());
+            message.put("tradeStatus", 1);
+
+            // 发起交易人信息
+            Integer userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
+            String phoneId = JwtUtil.getCurrentUserInfo().getString("userType") + "_" + JwtUtil.getCurrentUserInfo().getString("phone");
+
+            // 获取交易对方信息
+            LifeUser lifeUser = lifeUserMapper.selectById(Objects.equals(userId, trade.getBuyerId()) ? trade.getSellerId() : trade.getBuyerId());
+            String receiverId = "user_" + lifeUser.getUserPhone();
+
+            // 消息
+            LifeMessage lifeMessage = new LifeMessage();
+            lifeMessage.setSenderId(phoneId);
+            lifeMessage.setReceiverId(receiverId);
+            lifeMessage.setType("4");
+            lifeMessage.setContent(message.toJSONString());
+            lifeMessageMapper.insert(lifeMessage);
+
+            // 给买家与卖家发送交易消息
+//            WebsocketVo websocketVo = new WebsocketVo();
+//            websocketVo.setSenderId(phoneId);
+//            websocketVo.setReceiverId("user_" + lifeUser.getUserPhone());
+//            websocketVo.setCategory("message");
+//            websocketVo.setType("4");
+//            websocketVo.setText(message.toJSONString());
+//            websocketVo.setMessageId(lifeMessage.getId());
+
+            // 给买家与卖家发送交易消息
+            alienStoreFeign.sendMsgToClientByPhoneId(phoneId, phoneId, receiverId, "message", "4", message.toJSONString(), lifeMessage.getId());
+            alienStoreFeign.sendMsgToClientByPhoneId(receiverId, phoneId, receiverId, "message", "4", message.toJSONString(), lifeMessage.getId());
+
             return true;
         } catch (Exception e) {
             log.error("SecondTradeRecordServiceImpl.createTrade Error Mgs={}", e.getMessage());
@@ -155,7 +212,7 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             SecondTradeRecord record = new SecondTradeRecord();
             record.setId(tradeId);
             record.setTradeStatus(3);
-            record.setCancelId(userId);
+            record.setCancelUserId(userId);
             record.setCancelReason(cancelReason);
             record.setCancelReasonSupplement(cancelReasonSupplement);
             return secondTradeRecordMapper.updateById(record) > 0;

+ 0 - 1
alien-store/src/main/java/shop/alien/store/controller/LifeMessageController.java

@@ -44,7 +44,6 @@ public class LifeMessageController {
                                                   @RequestParam int friendType,
                                                   String search) throws Exception {
         log.info("LifeMessageController.getMessageList?receiverId={}, friendType={}, search={}", receiverId, friendType, search);
-        scheduledTask.secondTradeRemind();
         return R.data(lifeMessageService.getMessageList(receiverId, friendType, search));
     }
 

+ 62 - 36
alien-store/src/main/java/shop/alien/store/controller/WebSocketController.java

@@ -28,27 +28,27 @@ public class WebSocketController {
 
     private final WebSocketProcess webSocketProcess;
 
-    private final LifeMessageMapper lifeMessageMapper;
-
-    /**
-     * 向指定客户端发消息
-     */
     @ApiOperationSupport(order = 1)
     @ApiOperation("向指定客户端发消息")
-    @PostMapping(value = "sendMsgToClientById")
-    public R<Boolean> sendMsgToClientById(@RequestBody WebsocketVo websocketVo) {
-        log.info("WebSocketController.sendMsgToClientById?websocketVo={}", websocketVo.toString());
+    @GetMapping(value = "/sendMsgToClientByPhoneId")
+    public R<Boolean> sendMsgToClientByPhoneId(String messageReceiverId,
+                                               String senderId,
+                                               String receiverId,
+                                               String category,
+                                               String type,
+                                               String text,
+                                               Integer messageId) {
+        log.info("WebSocketController.sendMsgToClientByPhoneId?messageReceiverId={}, senderId={}, receiverId={}, category={}, type={}, text={}, messageId={}",
+                messageReceiverId, senderId, receiverId, category, type, text, messageId);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("senderId", senderId);
+        jsonObject.put("receiverId", receiverId);
+        jsonObject.put("category", category);
+        jsonObject.put("type", type);
+        jsonObject.put("text", text);
+        jsonObject.put("messageId", messageId);
         try {
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("type", websocketVo.getType());
-            jsonObject.put("text", websocketVo.getText());
-            webSocketProcess.sendMessage(websocketVo.getReceiverId(), jsonObject.toJSONString());
-            LifeMessage lifeMessage = new LifeMessage();
-            lifeMessage.setSenderId(websocketVo.getSenderId());
-            lifeMessage.setReceiverId(websocketVo.getReceiverId());
-            lifeMessage.setContent(websocketVo.getText());
-            lifeMessage.setType(websocketVo.getType());
-            lifeMessageMapper.insert(lifeMessage);
+            webSocketProcess.sendMessage(messageReceiverId, jsonObject.toJSONString());
             return R.success("发送成功");
         } catch (Exception e) {
             log.error("WebSocketController_sendMsgToClientById Error Mgs={}", e.getMessage());
@@ -56,23 +56,49 @@ public class WebSocketController {
         return R.fail("发送失败");
     }
 
-    /**
-     * 发消息到所有客户端
-     *
-     * @param text 消息内容
-     */
-    @ApiOperationSupport(order = 2)
-    @ApiOperation("发消息到所有客户端")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "text", value = "消息内容", dataType = "String", paramType = "query")
-    })
-    @GetMapping(value = "sendMsgToAllClient")
-    public void sendMsgToAllClient(@RequestParam String text) {
-        try {
-            webSocketProcess.sendAllMessage(text);
-        } catch (Exception e) {
-            log.error("WebSocketController_sendMsgToAllClient Error Mgs={}", e.getMessage());
-        }
-    }
+//    /**
+//     * 向指定客户端发消息
+//     */
+//    @ApiOperationSupport(order = 1)
+//    @ApiOperation("向指定客户端发消息")
+//    @PostMapping(value = "sendMsgToClientById")
+//    public R<Boolean> sendMsgToClientById(@RequestBody WebsocketVo websocketVo) {
+//        log.info("WebSocketController.sendMsgToClientById?websocketVo={}", websocketVo.toString());
+//        try {
+//            JSONObject jsonObject = new JSONObject();
+//            jsonObject.put("type", websocketVo.getType());
+//            jsonObject.put("text", websocketVo.getText());
+//            webSocketProcess.sendMessage(websocketVo.getReceiverId(), jsonObject.toJSONString());
+//            LifeMessage lifeMessage = new LifeMessage();
+//            lifeMessage.setSenderId(websocketVo.getSenderId());
+//            lifeMessage.setReceiverId(websocketVo.getReceiverId());
+//            lifeMessage.setContent(websocketVo.getText());
+//            lifeMessage.setType(websocketVo.getType());
+//            lifeMessageMapper.insert(lifeMessage);
+//            return R.success("发送成功");
+//        } catch (Exception e) {
+//            log.error("WebSocketController_sendMsgToClientById Error Mgs={}", e.getMessage());
+//        }
+//        return R.fail("发送失败");
+//    }
+//
+//    /**
+//     * 发消息到所有客户端
+//     *
+//     * @param text 消息内容
+//     */
+//    @ApiOperationSupport(order = 2)
+//    @ApiOperation("发消息到所有客户端")
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(name = "text", value = "消息内容", dataType = "String", paramType = "query")
+//    })
+//    @GetMapping(value = "sendMsgToAllClient")
+//    public void sendMsgToAllClient(@RequestParam String text) {
+//        try {
+//            webSocketProcess.sendAllMessage(text);
+//        } catch (Exception e) {
+//            log.error("WebSocketController_sendMsgToAllClient Error Mgs={}", e.getMessage());
+//        }
+//    }
 
 }