Selaa lähdekoodia

消息、通知、交易

qrs 3 viikkoa sitten
vanhempi
commit
b46d3604b9

+ 17 - 5
alien-entity/src/main/java/shop/alien/entity/second/SecondTradeRecord.java

@@ -61,12 +61,12 @@ public class SecondTradeRecord extends Model<SecondTradeRecord> {
     private BigDecimal transactionAmount;
 
     @ApiModelProperty(value = "买家是否签到  0-未签到  1-已签到")
-    @TableField("buyer_signin")
-    private Integer buyerSignin;
+    @TableField("buyer_sign_in")
+    private Integer buyerSignIn;
 
     @ApiModelProperty(value = "卖家是否签到  0-未签到  1-已签到")
-    @TableField("seller_signin")
-    private Integer sellerSignin;
+    @TableField("seller_sign_in")
+    private Integer sellerSignIn;
 
     @ApiModelProperty(value = "买家交易状态  1-交易成功  2-交易失败")
     @TableField("buyer_transaction_status")
@@ -76,7 +76,7 @@ public class SecondTradeRecord extends Model<SecondTradeRecord> {
     @TableField("seller_transaction_status")
     private Integer sellerTransactionStatus;
 
-    @ApiModelProperty(value = "交易状态  0-待交易  1-交易成功  2-交易失败")
+    @ApiModelProperty(value = "交易状态  0-待交易  1-交易成功  2-交易失败  3-交易取消")
     @TableField("trade_status")
     private Integer tradeStatus;
 
@@ -84,6 +84,18 @@ public class SecondTradeRecord extends Model<SecondTradeRecord> {
     @TableField("buyer_evaluate")
     private String buyerEvaluate;
 
+    @ApiModelProperty(value = "取消交易id")
+    @TableField("cancel_id")
+    private Integer cancelId;
+
+    @ApiModelProperty(value = "取消交易原因(字典表_cancelTradeReason)")
+    @TableField("cancel_reason")
+    private String cancelReason;
+
+    @ApiModelProperty(value = "取消交易原因补充")
+    @TableField("cancel_reason_supplement")
+    private String cancelReasonSupplement;
+
     @ApiModelProperty(value = "卖家评价")
     @TableField("seller_evaluate")
     private String sellerEvaluate;

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

@@ -14,9 +14,15 @@ public class WebsocketVo {
     @ApiModelProperty(value = "接收者id")
     private String receiverId;
 
+    @ApiModelProperty(value = "类别(消息-message 公告-notice 心跳-heartbeat)")
+    private String category;
+
     @ApiModelProperty(value = "消息类型  1-文本  2-图片  3-链接")
     private String type;
 
     @ApiModelProperty(value = "消息内容")
     private String text;
+
+    @ApiModelProperty(value = "消息id")
+    private Integer messageId;
 }

+ 35 - 10
alien-second/src/main/java/shop/alien/second/controller/SecondTradeRecordController.java

@@ -35,7 +35,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) {
+    public R<List<SecondTradeRecord>> getTradeRecord(@RequestParam int sideId) throws Exception {
         log.info("SecondTradeRecordController.getTradeRecord?sideId={}", sideId);
         return R.data(secondTradeRecordService.getTradeRecord(sideId));
     }
@@ -43,32 +43,57 @@ public class SecondTradeRecordController {
     @ApiOperation("创建交易")
     @ApiOperationSupport(order = 2)
     @PostMapping("/createTrade")
-    public R<Boolean> createTrade(@RequestBody SecondTradeRecord entity) {
+    public R<Boolean> createTrade(@RequestBody SecondTradeRecord entity) throws Exception {
         log.info("SecondTradeRecordController.createTrade?entity={}", entity.toString());
         if (secondTradeRecordService.createTrade(entity)) return R.success("创建成功");
         return R.fail("创建失败");
     }
 
-    @ApiOperation("交易签到")
+
+    @ApiOperation("确认商品是否可以交易")
     @ApiOperationSupport(order = 3)
-    @ApiImplicitParams({@ApiImplicitParam(name = "tradeId", value = "交易id", dataType = "Integer", paramType = "query", required = true)})
-    @GetMapping("/tradeSignin")
-    public R<Boolean> tradeSignin(@RequestParam int tradeId) {
-        log.info("SecondTradeRecordController.tradeSignin?tradeId={}", tradeId);
-        if (secondTradeRecordService.tradeSignin(tradeId)) return R.success("签到成功");
+    @ApiImplicitParams({@ApiImplicitParam(name = "goodsId", value = "商品id", dataType = "Integer", paramType = "query", required = true)})
+    @GetMapping("/goodsTradeConfirm")
+    public R<Boolean> goodsTradeConfirm(@RequestParam int goodsId) throws Exception {
+        log.info("SecondTradeRecordController.goodsTradeConfirm?goodsId={}", goodsId);
+        return R.data(secondTradeRecordService.goodsTradeConfirm(goodsId));
+    }
+
+    @ApiOperation("交易签到")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tradeId", value = "交易id", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "messageId", value = "消息id", dataType = "Integer", paramType = "query", required = true)})
+    @GetMapping("/tradeSignIn")
+    public R<Boolean> tradeSignIn(@RequestParam int tradeId, int messageId) throws Exception {
+        log.info("SecondTradeRecordController.tradeSignIn?tradeId={}, messageId={}", tradeId, messageId);
+        if (secondTradeRecordService.tradeSignIn(tradeId, messageId)) return R.success("签到成功");
         return R.fail("签到失败");
     }
 
     @ApiOperation("交易确认")
-    @ApiOperationSupport(order = 4)
+    @ApiOperationSupport(order = 5)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "tradeId", value = "交易id", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "type", value = "0-失败  1-成功", dataType = "Integer", paramType = "query", required = true),
             @ApiImplicitParam(name = "evaluate", value = "评价", dataType = "String", paramType = "query")})
     @GetMapping("/tradeConfirm")
-    public R<Boolean> tradeConfirm(@RequestParam int tradeId, @RequestParam int type, @RequestParam String evaluate) {
+    public R<Boolean> tradeConfirm(@RequestParam int tradeId, @RequestParam int type, @RequestParam String evaluate) throws Exception {
         log.info("SecondTradeRecordController.tradeConfirm?tradeId={}, type={}, evaluate={}", tradeId, type, evaluate);
         if (secondTradeRecordService.tradeConfirm(tradeId, type, evaluate)) return R.success("交易确认成功");
         return R.fail("交易确认失败");
     }
+
+    @ApiOperation("取消交易")
+    @ApiOperationSupport(order = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "tradeId", value = "交易id", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "cancelReason", value = "取消原因", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "cancelReasonSupplement", value = "取消原因补充", dataType = "String", paramType = "query")})
+    @GetMapping("/cancelTrade")
+    public R<Boolean> cancelTrade(@RequestParam int tradeId, @RequestParam String cancelReason, String cancelReasonSupplement) throws Exception {
+        log.info("SecondTradeRecordController.cancelTrade?tradeId={}, cancelReason={}, cancelReasonSupplement={}", tradeId, cancelReason, cancelReasonSupplement);
+        if (secondTradeRecordService.cancelTrade(tradeId, cancelReason, cancelReasonSupplement)) return R.success("取消交易成功");
+        return R.fail("取消交易失败");
+    }
 }

+ 7 - 4
alien-second/src/main/java/shop/alien/second/service/SecondTradeRecordService.java

@@ -16,12 +16,15 @@ import java.util.List;
  * @since 2025-07-07
  */
 public interface SecondTradeRecordService extends IService<SecondTradeRecord> {
-    List<SecondTradeRecord> getTradeRecord(int sideId);
+    List<SecondTradeRecord> getTradeRecord(int sideId) throws Exception;
 
-    boolean createTrade(SecondTradeRecord entity);
+    boolean createTrade(SecondTradeRecord entity) throws Exception;
 
-    boolean tradeSignin(int tradeId);
+    boolean tradeSignIn(int tradeId, int messageId) throws Exception;
 
-    boolean tradeConfirm(int tradeId, int type, String evaluate);
+    boolean tradeConfirm(int tradeId, int type, String evaluate) throws Exception;
 
+    boolean goodsTradeConfirm(int goodsId) throws Exception;
+
+    boolean cancelTrade(int tradeId, String cancelReason, String cancelReasonSupplement) throws Exception;
 }

+ 61 - 14
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -1,17 +1,22 @@
 package shop.alien.second.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 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.store.LifeMessage;
+import shop.alien.mapper.LifeMessageMapper;
 import shop.alien.mapper.second.SecondGoodsMapper;
 import shop.alien.mapper.second.SecondTradeRecordMapper;
 import shop.alien.second.service.SecondTradeRecordService;
 import shop.alien.util.common.JwtUtil;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
@@ -30,9 +35,10 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
 
     private final SecondTradeRecordMapper secondTradeRecordMapper;
     private final SecondGoodsMapper secondGoodsMapper;
+    private final LifeMessageMapper lifeMessageMapper;
 
     @Override
-    public List<SecondTradeRecord> getTradeRecord(int sideId) {
+    public List<SecondTradeRecord> getTradeRecord(int sideId) throws Exception {
         try {
             int userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
             QueryWrapper<SecondTradeRecord> wrapper = new QueryWrapper<>();
@@ -40,8 +46,8 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             wrapper.orderByDesc("created_time");
             return secondTradeRecordMapper.selectList(wrapper);
         } catch (Exception e) {
-            log.error("SecondTradeRecordServiceImpl.getTradeRecord===", e.fillInStackTrace());
-            return null;
+            log.error("SecondTradeRecordServiceImpl.getTradeRecord Error Mgs={}", e.getMessage());
+            throw new Exception(e);
         }
     }
 
@@ -51,7 +57,7 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
      * @return 操作结果
      */
     @Override
-    public boolean createTrade(SecondTradeRecord entity) {
+    public boolean createTrade(SecondTradeRecord entity) throws Exception {
         try {
             secondTradeRecordMapper.insert(entity);
             SecondGoods goods = new SecondGoods();
@@ -60,34 +66,44 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             secondGoodsMapper.updateById(goods);
             return true;
         } catch (Exception e) {
-            log.error("SecondTradeRecordServiceImpl.createTrade===", e.fillInStackTrace());
+            log.error("SecondTradeRecordServiceImpl.createTrade Error Mgs={}", e.getMessage());
+            throw new Exception(e);
         }
-        return false;
     }
 
     @Override
-    public boolean tradeSignin(int tradeId) {
+    public boolean tradeSignIn(int tradeId, int messageId) throws Exception {
         try {
             int userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
             SecondTradeRecord tradeRecord = secondTradeRecordMapper.selectById(tradeId);
             SecondTradeRecord record = new SecondTradeRecord();
             record.setId(tradeId);
             if (userId == tradeRecord.getBuyerId()) {
-                record.setBuyerSignin(1);
+                record.setBuyerSignIn(1);
             } else if (userId == tradeRecord.getSellerId()) {
-                record.setSellerSignin(1);
+                record.setSellerSignIn(1);
             } else {
                 return false;
             }
             secondTradeRecordMapper.updateById(record);
+
+//            LifeMessage message = new LifeMessage();
+//            message.setId(messageId);
+//            message.setContent(messageContent);
+//            message.setType("6");
+//            message.setCreatedTime(new Date());
+//            lifeMessageMapper.updateById(message);
+            lifeMessageMapper.deleteById(messageId);
+
+            return true;
         } catch (Exception e) {
-            log.error("SecondTradeRecordServiceImpl.tradeSignin===", e.fillInStackTrace());
+            log.error("SecondTradeRecordServiceImpl.tradeSignIn Error Mgs={}", e.getMessage());
+            throw new Exception(e);
         }
-        return true;
     }
 
     @Override
-    public boolean tradeConfirm(int tradeId, int type, String evaluate) {
+    public boolean tradeConfirm(int tradeId, int type, String evaluate) throws Exception {
         try {
             int userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
             SecondTradeRecord tradeRecord = secondTradeRecordMapper.selectById(tradeId);
@@ -104,9 +120,40 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
                 return false;
             }
             secondTradeRecordMapper.updateById(record);
+            return true;
+        } catch (Exception e) {
+            log.error("SecondTradeRecordServiceImpl.tradeConfirm Error Mgs={}", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+    @Override
+    public boolean goodsTradeConfirm(int goodsId) throws Exception {
+        try {
+            LambdaQueryWrapper<SecondTradeRecord> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(SecondTradeRecord::getGoodsId, goodsId);
+            queryWrapper.in(SecondTradeRecord::getTradeStatus, 0, 1);
+            return secondTradeRecordMapper.selectCount(queryWrapper) == 0;
+        } catch (Exception e) {
+            log.error("SecondTradeRecordServiceImpl.goodsTrade Error Mgs={}", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
+    @Override
+    public boolean cancelTrade(int tradeId, String cancelReason, String cancelReasonSupplement) throws Exception {
+        try {
+            int userId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getInteger("userId");
+            SecondTradeRecord record = new SecondTradeRecord();
+            record.setId(tradeId);
+            record.setTradeStatus(3);
+            record.setCancelId(userId);
+            record.setCancelReason(cancelReason);
+            record.setCancelReasonSupplement(cancelReasonSupplement);
+            return secondTradeRecordMapper.updateById(record) > 0;
         } catch (Exception e) {
-            log.error("SecondTradeRecordServiceImpl.tradeConfirm===", e.fillInStackTrace());
+            log.error("SecondTradeRecordServiceImpl.cancelTrade Error Mgs={}", e.getMessage());
+            throw new Exception(e);
         }
-        return true;
     }
 }

+ 31 - 29
alien-store/src/main/java/shop/alien/store/config/WebSocketProcess.java

@@ -1,12 +1,9 @@
 package shop.alien.store.config;
 
 import com.alibaba.fastjson2.JSONObject;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.ObjectUtils;
-import shop.alien.entity.result.R;
 import shop.alien.entity.store.LifeMessage;
 import shop.alien.entity.store.vo.WebsocketVo;
 import shop.alien.mapper.LifeMessageMapper;
@@ -28,8 +25,9 @@ import java.util.concurrent.ConcurrentHashMap;
 @ServerEndpoint(value = "/socket/{sendId}")
 public class WebSocketProcess {
 
-    @Autowired
-    private LifeMessageMapper lifeMessageMapper;
+    private final LifeMessageMapper lifeMessageMapper = SpringContext.getBean(LifeMessageMapper.class);
+
+    private final BaseRedisService baseRedisService = SpringContext.getBean(BaseRedisService.class);
 
     /*
      * 持有每个webSocket对象,以key-value存储到线程安全ConcurrentHashMap,
@@ -49,7 +47,7 @@ public class WebSocketProcess {
         //每新建立一个连接,就把当前客户id为key,this为value存储到map中
         this.session = session;
         concurrentHashMap.put(id, this);
-        log.info("Open a websocket. id={}", id);
+        log.info("WebSocketProcess.onOpen() Open a websocket. id={}", id);
     }
 
     /**
@@ -59,47 +57,52 @@ public class WebSocketProcess {
     public void onClose(Session session, @PathParam("sendId") String id) {
         //客户端连接关闭时,移除map中存储的键值对
         concurrentHashMap.remove(id);
-        log.info("close a websocket, concurrentHashMap remove sessionId= {}", id);
+        log.info("WebSocketProcess.onClose() close a websocket, concurrentHashMap remove sessionId= {}", id);
+    }
+
+    /**
+     * 连接发生异常时候触发
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+        log.error("WebSocketProcess.onError() Error Mgs=", error);
     }
 
     /**
      * 接收到客户端消息时触发
      */
     @OnMessage
-    public R<String> onMessage(String message) throws Exception {
+    public void onMessage(String message) throws Exception {
         try {
+            // 过滤心跳
             WebsocketVo websocketVo = JSONObject.parseObject(message, WebsocketVo.class);
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("type", websocketVo.getType());
-            jsonObject.put("text", websocketVo.getText());
-            sendMessage(websocketVo.getReceiverId(), jsonObject.toJSONString());
+            if (null == websocketVo || "heartbeat".equals(websocketVo.getCategory())) return;
+
+            // 记录已读消息id
+            if ("receipt".equals(websocketVo.getCategory())) {
+                baseRedisService.setListRight("readMessageIdKey", String.valueOf(websocketVo.getMessageId()));
+                return;
+            }
 
+            // 保存消息记录
             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("发送成功");
+
+            // 发送消息
+            websocketVo.setMessageId(lifeMessage.getId());
+            websocketVo.setCategory("message");
+            sendMessage(websocketVo.getReceiverId(), JSONObject.from(websocketVo).toJSONString());
         } catch (Exception e) {
-            log.error("WebSocketController_sendMsgToClientById Error Mgs={}", e.getMessage());
+            log.error("WebSocketProcess.onMessage() Error Mgs={}", e.getMessage());
         }
-        return R.fail("发送失败");
-    }
-
-    /**
-     * 连接发生异常时候触发
-     */
-    @OnError
-    public void onError(Session session, Throwable error) {
-        log.error("Error while websocket. ", error);
     }
 
     /**
      * 发送消息到指定客户端
-     *
-     * @param id
-     * @param message
      */
     public void sendMessage(String id, String message) throws Exception {
         //根据id,从map中获取存储的webSocket对象
@@ -109,10 +112,10 @@ public class WebSocketProcess {
             if (webSocketProcess.session.isOpen()) {
                 webSocketProcess.session.getBasicRemote().sendText(message);
             } else {
-                log.error("websocket session={} is closed ", id);
+                log.error("WebSocketProcess.sendMessage() websocket session={} is closed ", id);
             }
         } else {
-            log.error("websocket session={} is not exit ", id);
+            log.error("WebSocketProcess.sendMessage() websocket session={} is not exit ", id);
         }
     }
 
@@ -120,7 +123,6 @@ public class WebSocketProcess {
      * 发送消息到所有客户端
      */
     public void sendAllMessage(String msg) throws Exception {
-//        log.info("online client count={}", concurrentHashMap.size());
         Set<Map.Entry<String, WebSocketProcess>> entries = concurrentHashMap.entrySet();
         for (Map.Entry<String, WebSocketProcess> entry : entries) {
             String cid = entry.getKey();

+ 15 - 5
alien-store/src/main/java/shop/alien/store/controller/LifeMessageController.java

@@ -6,6 +6,7 @@ import io.swagger.annotations.*;
 import io.swagger.models.auth.In;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.lang.Nullable;
 import org.springframework.messaging.handler.annotation.MessageMapping;
 import org.springframework.messaging.handler.annotation.SendTo;
 import org.springframework.web.bind.annotation.*;
@@ -14,6 +15,7 @@ import shop.alien.entity.store.LifeMessage;
 import shop.alien.entity.store.vo.LifeMessageVo;
 import shop.alien.mapper.LifeMessageMapper;
 import shop.alien.store.service.LifeMessageService;
+import shop.alien.store.task.ScheduledTask;
 
 import java.util.List;
 
@@ -29,18 +31,20 @@ import java.util.List;
 public class LifeMessageController {
 
     private final LifeMessageService lifeMessageService;
+    private final ScheduledTask scheduledTask;
 
     @ApiOperation("消息列表")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "friendType", value = "聊天类型 1-聊过 2-未聊过", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "friendType", value = "聊天类型  0-搜索 1-聊过 2-未聊过", dataType = "Integer", paramType = "query"),
             @ApiImplicitParam(name = "search", value = "搜索字段", dataType = "Integer", paramType = "query")})
     @GetMapping("/getMessageList")
     public R<List<LifeMessageVo>> getMessageList(@RequestParam String receiverId,
                                                   @RequestParam int friendType,
-                                                  @RequestParam String search) throws Exception {
+                                                  String search) throws Exception {
         log.info("LifeMessageController.getMessageList?receiverId={}, friendType={}, search={}", receiverId, friendType, search);
+        scheduledTask.secondTradeRemind();
         return R.data(lifeMessageService.getMessageList(receiverId, friendType, search));
     }
 
@@ -64,7 +68,9 @@ public class LifeMessageController {
 
     @ApiOperation("消息详情")
     @ApiOperationSupport(order = 4)
-    @ApiImplicitParams({@ApiImplicitParam(name = "当前登录人", value = "receiverId", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "当前登录人", value = "receiverId", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
     @GetMapping("/getMessageListByReceiverId")
     public R<List<LifeMessageVo>> getMessageListByReceiverId(@RequestParam String receiverId, @RequestParam String senderId) throws Exception {
         log.info("LifeMessageController.getMessageListByReceiverId?receiverId={}, senderId={}", receiverId, senderId);
@@ -73,7 +79,9 @@ public class LifeMessageController {
 
     @ApiOperation("消息已读")
     @ApiOperationSupport(order = 5)
-    @ApiImplicitParams({@ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query")})
     @GetMapping("/read")
     public R<Boolean> read(@RequestParam String receiverId, @RequestParam String senderId) throws Exception {
         log.info("LifeMessageController.read?receiverId={}, senderId={}", receiverId, senderId);
@@ -83,7 +91,9 @@ public class LifeMessageController {
 
     @ApiOperation("删除消息")
     @ApiOperationSupport(order = 6)
-    @ApiImplicitParams({@ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query"), @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query")})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "senderId", value = "聊天对方", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "receiverId", value = "当前登录人", dataType = "String", paramType = "query")})
     @GetMapping("/deleteMessageByPhoneId")
     public R<Integer> deleteMessageByPhoneId(@RequestParam String senderId, @RequestParam String receiverId) throws Exception {
         log.info("LifeMessageController.deleteMessageByPhoneId?senderId={},receiverId={}", senderId, receiverId);

+ 2 - 1
alien-store/src/main/java/shop/alien/store/service/impl/LifeMessageServiceImpl.java

@@ -229,6 +229,7 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
             LifeMessageVo vo = new LifeMessageVo();
             if (!CollectionUtils.isEmpty(lifeMessagePageList)) {
                 vo.setUserName(lifeMessagePageList.get(0).getUserName());
+                vo.setCreatedTime(lifeMessagePageList.get(0).getCreatedTime());
                 lifeMessagePageList = lifeMessagePageList.stream().filter(item -> !notDisturbList.contains(item.getPhoneId())).collect(Collectors.toList());
                 vo.setNotReadCount(lifeMessagePageList.stream().filter(item -> 0 == item.getIsRead()).count());
             }
@@ -268,7 +269,7 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
             wrapper = new QueryWrapper<>();
             wrapper.eq("num", 1);
             wrapper.apply("(sender_id not in (" + friendsIdsStr + ") and receiver_id not in (" + friendsIdsStr + "))");
-            wrapper.orderByDesc("created_time");
+            wrapper.orderByDesc("message.created_time");
 //        IPage<LifeMessageVo> ipage = new Page<>(1, Integer.MAX_VALUE);
             List<LifeMessageVo> lifeMessageVoList = lifeMessageMapper.getLifeMessagePageByPhoneId(receiverId, wrapper);