소스 검색

fix:消息撤回接口添加&结束会话获取机器人会话

duxin 2 년 전
부모
커밋
d91a22da4e

+ 5 - 0
api/messagecenter/internal/handler/routes.go

@@ -52,6 +52,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 				Path:    "/message/updateReadById",
 				Handler: updateReadByIdHandler(serverCtx),
 			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/message/withdrawMessage",
+				Handler: withdrawMessageHandler(serverCtx),
+			},
 		},
 	)
 }

+ 12 - 0
api/messagecenter/internal/types/types.go

@@ -82,3 +82,15 @@ type ReadStateReq struct {
 	EntUserId int64  `header:"entUserId,optional"`
 	NewUserId int64  `header:"newUserId"`
 }
+
+type ReadWithdrawReq struct {
+	MessageId string `json:"messageId"`
+	Content   string `json:"content"`
+	Appid     string `header:"appid"`
+	Title     string `json:"title"`
+	Item      int64  `json:"item"`
+	UserType  int64  `json:"userType"`
+	Link      string `json:"link"`
+	SendId    int64  `json:"sendId,optional"`
+	Type      int64  `json:"type"`
+}

+ 18 - 0
api/messagecenter/messagecenter.api

@@ -72,6 +72,18 @@ type ReadStateReq {
 	EntUserId int64  `header:"entUserId,optional"`
 	NewUserId int64  `header:"newUserId"`
 }
+
+type ReadWithdrawReq {
+	MessageId string `json:"messageId"`
+	Content   string `json:"content"`
+	Appid     string `header:"appid"`
+	Title     string `json:"title"`
+	Item      int64  `json:"item"`
+	UserType  int64  `json:"userType"`
+	Link      string `json:"link"`
+	SendId    int64  `json:"sendId,optional"`
+	Type      int64  `json:"type"`
+}
 service messagecenter-api {
 	@handler messageCount
 	post /message/messageCount (CountReq) returns (CommonRes);
@@ -89,4 +101,10 @@ service messagecenter-api {
 	post /message/obtainShunt (ShuntReq) returns (CommonRes);
 	@handler updateReadById
 	post /message/updateReadById (ReadStateReq) returns (CommonRes);
+	@handler withdrawMessage //撤回消息
+	post /message/withdrawMessage (ReadWithdrawReq) returns (CommonRes);
+	@handler TransferCustomer //获取转让在线客服
+	post /message/transferCustomer (UserReq) returns (CommonRes);
+	@handler TransferMessage //消息转让
+	post /message/transferMessage (ReadWithdrawReq) returns (CommonRes);
 }

+ 0 - 1
go.mod

@@ -5,7 +5,6 @@ go 1.16
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20220722023023-2a57d1ee061f
 	bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4
-	bp.jydev.jianyu360.cn/BaseService/userCenter v0.0.0-20220421015128-4a36f3eac5c5
 	github.com/go-sql-driver/mysql v1.6.0
 	github.com/zeromicro/go-zero v1.3.5
 	google.golang.org/grpc v1.47.0

+ 0 - 2
go.sum

@@ -11,10 +11,8 @@ bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4 h1:zl5eZrKDBENVVBUiPpzyQQ0/SBdG
 bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4/go.mod h1:BMLd/5wb3BIEGhnEgF9y1sJN9P5/Dw9kYsoiE9V8I9g=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220418005748-8ba5d936dd53/go.mod h1:E5lcDI3k4FESLxiAetCfWQTq8qfpy9cv0yN1oKoEO34=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220419023723-0b32d4a41751/go.mod h1:6KL5LMEku83uRbre0W/bj5kXG2I6pJGBFtktmtp51yM=
-bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220420075831-0b59892e9982 h1:+56m/dW9ZW0YEXgAakeIIxqUFefufzp5XckU4iEuIFM=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220420075831-0b59892e9982/go.mod h1:wsHNO91h37H+xE4ZNny0yd7mtpODeDJxbVYhIRMR+qw=
 bp.jydev.jianyu360.cn/BaseService/userCenter v0.0.0-20220418072311-2062bed1e700/go.mod h1:KjcrxTzM96tBc6G4B8tlLBn1lrVy5UJYF8+eTdP4xAE=
-bp.jydev.jianyu360.cn/BaseService/userCenter v0.0.0-20220421015128-4a36f3eac5c5 h1:ovbEGGgn3rJM70KjqvLyUn5geZx8QTlanrjFfjYyNGI=
 bp.jydev.jianyu360.cn/BaseService/userCenter v0.0.0-20220421015128-4a36f3eac5c5/go.mod h1:GT0QC4aaKDuXxAvaU4G02XjCc31TU1ctqBGqxQYOfC4=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=

+ 7 - 1
rpc/messagecenter/internal/server/messagecenterserver.go

@@ -1,5 +1,5 @@
 // Code generated by goctl. DO NOT EDIT!
-// Source: messageCenter.proto
+// Source: messagecenter.proto
 
 package server
 
@@ -69,3 +69,9 @@ func (s *MessageCenterServer) UpdateReadById(ctx context.Context, in *messagecen
 	l := logic.NewUpdateReadByIdLogic(ctx, s.svcCtx)
 	return l.UpdateReadById(in)
 }
+
+// 用户撤回消息
+func (s *MessageCenterServer) WithdrawMessage(ctx context.Context, in *messagecenter.ReadWithdrawReq) (*messagecenter.CurrencyResp, error) {
+	l := logic.NewWithdrawMessageLogic(ctx, s.svcCtx)
+	return l.WithdrawMessage(in)
+}

+ 15 - 0
rpc/messagecenter/messagecenter.proto

@@ -38,6 +38,7 @@ message UserEntity {
   int64 create_time= 8;
   int64 number= 9;
   string headimg=11;
+  bool isOnline=12;
 }
 message MessageReq {
   int64         msgType = 1;     // 消息类型 ;1:站内信消息 2:点对点消息 3:群消息 4:机器人消息 5:客服消息
@@ -115,6 +116,18 @@ message ReadStateReq {
   int64         newUserId=3;
 }
 
+message ReadWithdrawReq {
+  string         messageId = 1;
+  string        content = 2;
+  string        appid=3;
+  string title = 4;
+  int64         item = 5;
+  int64     userType=6;      //用户类型:2用户1客服
+  string link = 7;
+  int64         sendId = 8;
+  int64         type = 9;
+}
+
 message CurrencyResp {
    int64 error_code = 2; //响应代码
    string error_msg = 1; //响应消息
@@ -136,4 +149,6 @@ service messageCenter {
   rpc SaveAutoReplyMsg(SaveAutoReplyReq)returns(MessageResp);
    //根据消息修改已读状态
   rpc UpdateReadById(ReadStateReq)returns(CurrencyResp);
+  //用户撤回消息
+  rpc WithdrawMessage(ReadWithdrawReq)returns(CurrencyResp);
 }

+ 0 - 90
rpc/messagecenter/messagecenter/messagecenter.go

@@ -1,90 +0,0 @@
-// Code generated by goctl. DO NOT EDIT!
-// Source: messageCenter.proto
-
-package messagecenter
-
-import (
-	"context"
-
-	"github.com/zeromicro/go-zero/zrpc"
-	"google.golang.org/grpc"
-)
-
-type (
-	MessageCenter interface {
-		//  查询数量
-		Count(ctx context.Context, in *CountReq, opts ...grpc.CallOption) (*CountResp, error)
-		//  用户列表查询
-		UserList(ctx context.Context, in *UserReq, opts ...grpc.CallOption) (*UserResp, error)
-		//  聊天内容查询
-		FindMessage(ctx context.Context, in *MessageReq, opts ...grpc.CallOption) (*MessageResp, error)
-		//  聊天保存
-		SaveMessage(ctx context.Context, in *MessageEntity, opts ...grpc.CallOption) (*SaveMessageResp, error)
-		//  会话创建
-		CreateChatSession(ctx context.Context, in *ChatSessionReq, opts ...grpc.CallOption) (*ChatSessionResp, error)
-		//  会话关闭
-		CloseChatSession(ctx context.Context, in *CloseSessionReq, opts ...grpc.CallOption) (*ChatSessionResp, error)
-		// 创建会话并且保存信息
-		SaveAutoReplyMsg(ctx context.Context, in *SaveAutoReplyReq, opts ...grpc.CallOption) (*MessageResp, error)
-		// 根据消息修改已读状态
-		UpdateReadById(ctx context.Context, in *ReadStateReq, opts ...grpc.CallOption) (*CurrencyResp, error)
-	}
-
-	defaultMessageCenter struct {
-		cli zrpc.Client
-	}
-)
-
-func NewMessageCenter(cli zrpc.Client) MessageCenter {
-	return &defaultMessageCenter{
-		cli: cli,
-	}
-}
-
-//  查询数量
-func (m *defaultMessageCenter) Count(ctx context.Context, in *CountReq, opts ...grpc.CallOption) (*CountResp, error) {
-	client := NewMessageCenterClient(m.cli.Conn())
-	return client.Count(ctx, in, opts...)
-}
-
-//  用户列表查询
-func (m *defaultMessageCenter) UserList(ctx context.Context, in *UserReq, opts ...grpc.CallOption) (*UserResp, error) {
-	client := NewMessageCenterClient(m.cli.Conn())
-	return client.UserList(ctx, in, opts...)
-}
-
-//  聊天内容查询
-func (m *defaultMessageCenter) FindMessage(ctx context.Context, in *MessageReq, opts ...grpc.CallOption) (*MessageResp, error) {
-	client := NewMessageCenterClient(m.cli.Conn())
-	return client.FindMessage(ctx, in, opts...)
-}
-
-//  聊天保存
-func (m *defaultMessageCenter) SaveMessage(ctx context.Context, in *MessageEntity, opts ...grpc.CallOption) (*SaveMessageResp, error) {
-	client := NewMessageCenterClient(m.cli.Conn())
-	return client.SaveMessage(ctx, in, opts...)
-}
-
-//  会话创建
-func (m *defaultMessageCenter) CreateChatSession(ctx context.Context, in *ChatSessionReq, opts ...grpc.CallOption) (*ChatSessionResp, error) {
-	client := NewMessageCenterClient(m.cli.Conn())
-	return client.CreateChatSession(ctx, in, opts...)
-}
-
-//  会话关闭
-func (m *defaultMessageCenter) CloseChatSession(ctx context.Context, in *CloseSessionReq, opts ...grpc.CallOption) (*ChatSessionResp, error) {
-	client := NewMessageCenterClient(m.cli.Conn())
-	return client.CloseChatSession(ctx, in, opts...)
-}
-
-// 创建会话并且保存信息
-func (m *defaultMessageCenter) SaveAutoReplyMsg(ctx context.Context, in *SaveAutoReplyReq, opts ...grpc.CallOption) (*MessageResp, error) {
-	client := NewMessageCenterClient(m.cli.Conn())
-	return client.SaveAutoReplyMsg(ctx, in, opts...)
-}
-
-// 根据消息修改已读状态
-func (m *defaultMessageCenter) UpdateReadById(ctx context.Context, in *ReadStateReq, opts ...grpc.CallOption) (*CurrencyResp, error) {
-	client := NewMessageCenterClient(m.cli.Conn())
-	return client.UpdateReadById(ctx, in, opts...)
-}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 370 - 227
rpc/messagecenter/messagecenter/messagecenter.pb.go


+ 45 - 7
rpc/messagecenter/messagecenter/messagecenter_grpc.pb.go

@@ -1,8 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.2.0
-// - protoc             v3.15.1
-// source: messageCenter.proto
+// - protoc             v3.19.4
+// source: messagecenter.proto
 
 package messagecenter
 
@@ -34,10 +34,12 @@ type MessageCenterClient interface {
 	CreateChatSession(ctx context.Context, in *ChatSessionReq, opts ...grpc.CallOption) (*ChatSessionResp, error)
 	// 会话关闭
 	CloseChatSession(ctx context.Context, in *CloseSessionReq, opts ...grpc.CallOption) (*ChatSessionResp, error)
-	//创建会话并且保存信息
+	// 创建会话并且保存信息
 	SaveAutoReplyMsg(ctx context.Context, in *SaveAutoReplyReq, opts ...grpc.CallOption) (*MessageResp, error)
-	//根据消息修改已读状态
+	// 根据消息修改已读状态
 	UpdateReadById(ctx context.Context, in *ReadStateReq, opts ...grpc.CallOption) (*CurrencyResp, error)
+	// 用户撤回消息
+	WithdrawMessage(ctx context.Context, in *ReadWithdrawReq, opts ...grpc.CallOption) (*CurrencyResp, error)
 }
 
 type messageCenterClient struct {
@@ -120,6 +122,15 @@ func (c *messageCenterClient) UpdateReadById(ctx context.Context, in *ReadStateR
 	return out, nil
 }
 
+func (c *messageCenterClient) WithdrawMessage(ctx context.Context, in *ReadWithdrawReq, opts ...grpc.CallOption) (*CurrencyResp, error) {
+	out := new(CurrencyResp)
+	err := c.cc.Invoke(ctx, "/messagecenter.messageCenter/WithdrawMessage", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // MessageCenterServer is the server API for MessageCenter service.
 // All implementations must embed UnimplementedMessageCenterServer
 // for forward compatibility
@@ -136,10 +147,12 @@ type MessageCenterServer interface {
 	CreateChatSession(context.Context, *ChatSessionReq) (*ChatSessionResp, error)
 	// 会话关闭
 	CloseChatSession(context.Context, *CloseSessionReq) (*ChatSessionResp, error)
-	//创建会话并且保存信息
+	// 创建会话并且保存信息
 	SaveAutoReplyMsg(context.Context, *SaveAutoReplyReq) (*MessageResp, error)
-	//根据消息修改已读状态
+	// 根据消息修改已读状态
 	UpdateReadById(context.Context, *ReadStateReq) (*CurrencyResp, error)
+	// 用户撤回消息
+	WithdrawMessage(context.Context, *ReadWithdrawReq) (*CurrencyResp, error)
 	mustEmbedUnimplementedMessageCenterServer()
 }
 
@@ -171,6 +184,9 @@ func (UnimplementedMessageCenterServer) SaveAutoReplyMsg(context.Context, *SaveA
 func (UnimplementedMessageCenterServer) UpdateReadById(context.Context, *ReadStateReq) (*CurrencyResp, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method UpdateReadById not implemented")
 }
+func (UnimplementedMessageCenterServer) WithdrawMessage(context.Context, *ReadWithdrawReq) (*CurrencyResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method WithdrawMessage not implemented")
+}
 func (UnimplementedMessageCenterServer) mustEmbedUnimplementedMessageCenterServer() {}
 
 // UnsafeMessageCenterServer may be embedded to opt out of forward compatibility for this service.
@@ -328,6 +344,24 @@ func _MessageCenter_UpdateReadById_Handler(srv interface{}, ctx context.Context,
 	return interceptor(ctx, in, info, handler)
 }
 
+func _MessageCenter_WithdrawMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ReadWithdrawReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(MessageCenterServer).WithdrawMessage(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/messagecenter.messageCenter/WithdrawMessage",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(MessageCenterServer).WithdrawMessage(ctx, req.(*ReadWithdrawReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // MessageCenter_ServiceDesc is the grpc.ServiceDesc for MessageCenter service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -367,7 +401,11 @@ var MessageCenter_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "UpdateReadById",
 			Handler:    _MessageCenter_UpdateReadById_Handler,
 		},
+		{
+			MethodName: "WithdrawMessage",
+			Handler:    _MessageCenter_WithdrawMessage_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
-	Metadata: "messageCenter.proto",
+	Metadata: "messagecenter.proto",
 }

+ 27 - 16
service/message_mail_box.go

@@ -2,6 +2,7 @@ package service
 
 import (
 	quitl "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
 	util "bp.jydev.jianyu360.cn/SocialPlatform/messageCenter/entity"
 	"bp.jydev.jianyu360.cn/SocialPlatform/messageCenter/rpc/messagecenter/messagecenter"
 	"database/sql"
@@ -12,8 +13,9 @@ import (
 
 type MessaggeService struct{}
 
-//未读消息查询
+// 未读消息查询
 func (b MessaggeService) Count(newUserId, userType, entUserId int64, isClean bool) (count int, last map[string]interface{}, err error) {
+	log.Printf("用户id:%d,userType:%d,entUserId:%d,isClean:%v", newUserId, userType, entUserId, isClean)
 	v := make([]interface{}, 0)
 	sqlStr := ""
 	if userType == 1 {
@@ -80,7 +82,7 @@ func (b MessaggeService) Count(newUserId, userType, entUserId int64, isClean boo
 	return
 }
 
-//用户列表查询
+// 用户列表查询
 func (b MessaggeService) UserList(in *messagecenter.UserReq) (data *[]map[string]interface{}, err error) {
 	sqlStr := ""
 	if in.UserType == 2 {
@@ -160,9 +162,9 @@ func (b MessaggeService) UserList(in *messagecenter.UserReq) (data *[]map[string
 		userSql := fmt.Sprintf("SELECT   MAX( c.id ) as messageId   FROM  %s c   "+
 			"LEFT JOIN %s d ON   c.own_type=1 AND  c.own_id=d.id   "+
 			"WHERE   c.own_type = 1    "+
-			"AND d.customer_service_id = %d   "+
+			"AND (d.customer_service_id = %d or d.customer_service_id =0 )   "+
 			"AND ( c.type = 4 OR c.type = 5 or  c.type=6 or  c.type=7 )   "+
-			"AND d.customer_service_id !=0   %s %s  "+
+			"  %s %s  "+
 			"GROUP BY   (   CASE  WHEN  c.send_user_type =2 THEN  CONCAT( c.send_user_id )   WHEN c.send_user_type =1 THEN  CONCAT( c.receive_user_id )  END  ) ",
 			util.SOCIALIZE_MESSAGE_MAILBOX, util.SOCIALIZE_CHAT_SESSION,
 			in.EntUserId, startTimeSql, endTimeSql)
@@ -179,7 +181,7 @@ func (b MessaggeService) UserList(in *messagecenter.UserReq) (data *[]map[string
 				"AND i.ent_id=f.ent_id "+
 				"AND  i.user_id=f.user_id    "+
 				"AND h.isread = 0    "+
-				"AND  i.customer_service_id= %d ) AS number "+
+				"AND  (i.customer_service_id= %d or i.customer_service_id=0) ) AS number "+
 				"FROM  %s a  "+
 				"LEFT JOIN %s b ON if (a.send_user_type=1 ,a.receive_user_id,a.send_user_id)=b.id  "+
 				"LEFT JOIN %s e ON e.id = a.messag_id  "+
@@ -196,7 +198,7 @@ func (b MessaggeService) UserList(in *messagecenter.UserReq) (data *[]map[string
 	return
 }
 
-//消息保存
+// 消息保存
 func (b MessaggeService) SaveMessage(in *messagecenter.MessageEntity) (fool bool, errorMsg string, content string, messageId, nowInt int64) {
 	//先插入信息表
 	//判断会话标识是否属于本人
@@ -416,7 +418,7 @@ func (b MessaggeService) SaveMessage(in *messagecenter.MessageEntity) (fool bool
 	return fool, "", in.Content, messageId, nowForm.Unix()
 }
 
-//历史信息查询
+// 历史信息查询
 func (b MessaggeService) FindMessage(in *messagecenter.MessageReq) *[]map[string]interface{} {
 	sqlStr := ""
 	lastStr := ""
@@ -434,7 +436,7 @@ func (b MessaggeService) FindMessage(in *messagecenter.MessageReq) *[]map[string
 			"LEFT JOIN %s b on  a.messag_id=b.id  "+
 			"LEFT  JOIN  %s c on  c.id=a.send_user_id   "+
 			"LEFT JOIN  %s d on  d.id=a.receive_user_id  "+
-			"where  a.own_id=  %d "+
+			"where  a.own_id=  %d and a.iswithdraw = 0"+
 			"AND ((a.send_user_id=   %d AND   a.receive_user_id=   %d) or (a.send_user_id=  %d AND  a.receive_user_id=  %d)) "+
 			"AND  a.type=2  %s "+
 			"ORDER BY a.create_time desc ,a.id   asc "+
@@ -449,7 +451,7 @@ func (b MessaggeService) FindMessage(in *messagecenter.MessageReq) *[]map[string
 				"FROM   %s a   "+
 				"LEFT JOIN %s b ON a.messag_id = b.id   "+
 				"LEFT JOIN %s c ON   a.own_type = 1  AND  a.own_id=c.id    "+
-				"WHERE   a.own_type = 1   "+
+				"WHERE   a.own_type = 1 and a.iswithdraw = 0  "+
 				"AND (a.type = 5 or a.type=4 or  a.type=6 or  a.type=7)   "+
 				"AND c.ent_id =   %d "+
 				"AND c.user_id =   %d  %s "+
@@ -464,7 +466,7 @@ func (b MessaggeService) FindMessage(in *messagecenter.MessageReq) *[]map[string
 				"LEFT JOIN %s b ON a.messag_id = b.id   "+
 				"LEFT JOIN %s c ON   IF   ( a.send_user_type = 1, a.send_user_id, a.receive_user_id ) = c.id AND  c.ent_id = %d AND c.user_id = %d "+
 				"LEFT JOIN  %s d on  c.ent_id=d.ent_id    "+
-				"WHERE   a.own_type = 2    "+
+				"WHERE   a.own_type = 2  and a.iswithdraw = 0  "+
 				"AND a.own_id =  %d "+
 				"AND  c.ent_id = %d "+
 				"AND c.user_id =  %d "+
@@ -507,14 +509,14 @@ func (b MessaggeService) FindMessage(in *messagecenter.MessageReq) *[]map[string
 				sqlStr := ""
 				if in.UserType == 1 {
 					sqlStr = fmt.Sprintf("UPDATE %s a  SET a.isread = 1,    a.read_time = now( )  "+
-						"WHERE    a.own_type = 1  "+
+						"WHERE    a.own_type = 1 and a.iswithdraw = 0 "+
 						"AND a.type IN ( 4,5,6,7)  "+
 						"AND a.isread = 0    "+
 						"AND a.own_id IN ( SELECT b.id FROM %s b WHERE   b.customer_service_id=%d AND    b.user_id=%d  )",
 						util.SOCIALIZE_MESSAGE_MAILBOX, util.SOCIALIZE_CHAT_SESSION, in.EntUserId, in.SendId)
 				} else {
 					sqlStr = fmt.Sprintf("UPDATE %s a  SET a.isread = 1,    a.read_time = now( )  "+
-						"WHERE    a.own_type = 2  "+
+						"WHERE    a.own_type = 2 and a.iswithdraw = 0 "+
 						"AND a.type IN ( 4,5,6,7 )  "+
 						"AND a.isread = 0    "+
 						"AND a.own_id =%d ", util.SOCIALIZE_MESSAGE_MAILBOX, in.NewUserId)
@@ -529,7 +531,7 @@ func (b MessaggeService) FindMessage(in *messagecenter.MessageReq) *[]map[string
 	return data
 }
 
-//创建会话
+// 创建会话
 func (b MessaggeService) CreateChatSession(in *messagecenter.ChatSessionReq) (fool bool, sessionId int64) {
 	fool = util.Mysql.ExecTx("会话新建", func(tx *sql.Tx) bool {
 		customerserviceName := in.CustomerserviceName
@@ -565,7 +567,7 @@ func (b MessaggeService) CreateChatSession(in *messagecenter.ChatSessionReq) (fo
 	return
 }
 
-//结束会话
+// 结束会话
 func (b MessaggeService) CloseChatSession(in *messagecenter.CloseSessionReq) bool {
 	fool := util.Mysql.ExecTx("关闭会话", func(tx *sql.Tx) bool {
 		updateMap := map[string]interface{}{
@@ -577,7 +579,7 @@ func (b MessaggeService) CloseChatSession(in *messagecenter.CloseSessionReq) boo
 	return fool
 }
 
-//创建会话并保存信息
+// 创建会话并保存信息
 func (b *MessaggeService) SaveAutoReplyMsg(userType, entId, entUserId, userId int64, content, appId, nowFormat string) (bool, int64) {
 	messageId := int64(0)
 	return util.Mysql.ExecTx("保存自动回复消息", func(tx *sql.Tx) bool {
@@ -604,7 +606,7 @@ func (b *MessaggeService) SaveAutoReplyMsg(userType, entId, entUserId, userId in
 	}), messageId
 }
 
-//修改未读状态
+// 修改未读状态
 func (b MessaggeService) UpdateReadById(in *messagecenter.ReadStateReq) bool {
 	fool := util.Mysql.ExecTx("已读状态修改", func(tx *sql.Tx) bool {
 		updateMap := map[string]interface{}{
@@ -643,3 +645,12 @@ func (b MessaggeService) UpdateReadById(in *messagecenter.ReadStateReq) bool {
 	})
 	return fool
 }
+
+// WithdrawMessage 撤回消息
+func (b MessaggeService) WithdrawMessage(in *messagecenter.ReadWithdrawReq) bool {
+	messageId := encrypt.SE.Decode4Hex(in.MessageId)
+	nowForm := time.Now().Local()
+
+	return util.Mysql.Update(util.SOCIALIZE_MESSAGE_MAILBOX,
+		map[string]interface{}{"id": messageId}, map[string]interface{}{"messag_id": messageId, "iswithdraw": 1, "withdraw_time": nowForm.Format(util.Date_Full_Layout)})
+}

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.