package chat import ( "fmt" "server/call" "server/common" "server/db" "server/modules/customer/app" "server/modules/customer/values" "server/pb" "time" "github.com/gin-gonic/gin" "github.com/liangdas/mqant/log" "gorm.io/gorm" ) // 获取聊天历史 func GetCustomerHistory(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := new(values.GetCustomerHistoryReq) if !a.S(req) { return } var resp values.GetCustomerHistoryResp Count, err := db.Mysql().QueryList(req.Page-1, req.Num, fmt.Sprintf("title = %v", req.Title), "time DESC", &common.CustomerChatData{}, &resp.List) if err != nil { if err != gorm.ErrRecordNotFound { log.Error(err.Error()) a.Code = values.CodeRetry return } } resp.Count = Count a.Data = resp } // 消息已读 func ReadMessage(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := &values.ReadMessageReq{} if !a.S(req) { return } for i := 0; i < len(req.List); i++ { err := db.Mysql().Update(&common.CustomerChatData{ID: req.List[i], Title: req.Title}, map[string]interface{}{"is_read": true}) if err != nil { log.Error(err.Error()) } } if req.OrderId != 0 { db.Mysql().Update(&common.CustomerOrder{ID: req.OrderId}, map[string]interface{}{ "un_read": 0, }) } // 需要通知在线玩家刷新客服消息 //session := call.GetUserSession(req.Title) //if session == nil { // return //} //call.SendSS(session, int(pb.ServerCommonCmd_CMD_BS_CustomerMsgResp), nil, "common") } // 玩家发送消息 func SendMessage(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := &values.SendMessageReq{} if !a.S(req) { return } req.Time = time.Now().Unix() err := db.Mysql().Create(&req) if err != nil { log.Error(err.Error()) a.Code = values.CodeRetry return } list := []common.CustomerOrder{} db.Mysql().QueryList(0, 100, fmt.Sprintf("uid = %d and reply = 0", req.Title), "", &common.CustomerOrder{}, &list) for _, v := range list { u := map[string]interface{}{"is_read": false, "reply": true} if v.FirstReplyTime == 0 { u["first_reply_time"] = req.Time } db.Mysql().Update(&common.CustomerOrder{ID: v.ID}, u) } // 客服回复后,标记玩家读取状态为未读 // db.Mysql().Update(&common.CustomerOrder{Uid: req.Title}, map[string]interface{}{"is_read": false, "reply": true}) // 需要通知在线玩家刷新客服消息 session := call.GetUserSession(req.Title) if session == nil { return } call.SendSS(session, int(pb.ServerCommonCmd_CMD_BS_CustomerMsgResp), nil, "common") } // 根据订单状态获取订单列表 func GetCustomerOrder(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := &values.GetCustomerOrderReq{} if !a.S(req) { return } var resp values.GetCustomerOrderResp var flag bool var query string if req.Label != 0 { query += fmt.Sprintf(" (label1 = %v OR label2 = %v OR label3 = %v OR label4 = %v OR label5 = %v) ", req.Label, req.Label, req.Label, req.Label, req.Label) flag = true } if req.Uid != 0 { if flag { query += " AND " } query += fmt.Sprintf(" uid = %v ", req.Uid) flag = true } else { if req.CustomerUid != 0 { if flag { query += " AND " } query += fmt.Sprintf(" customer_uid = %v ", req.CustomerUid) flag = true } else if a.User.Role == values.UserRole2 { if flag { query += " AND " } query += fmt.Sprintf(" customer_uid = %v ", a.User.ID) flag = true } } if req.Status != 0 { if flag { query += " AND " } query = fmt.Sprintf(" status = %v", req.Status) flag = true } else { if req.Status2 != 0 { if flag { query += " AND " } query = fmt.Sprintf(" status <= %v", req.Status2) flag = true } } if req.Vip != 0 { if flag { query += " AND " } query += fmt.Sprintf(" vip >= %v ", req.Vip) flag = true } if req.Reply > 0 { if flag { query += " AND " } if req.Reply == 1 { query += fmt.Sprintf(" reply = %d ", 1) } else { query += fmt.Sprintf(" reply = %d ", 0) } flag = true } if req.Recharge { if flag { query += " AND " } query += " order_id != ''" flag = true } var order = "start DESC" if req.Order == 2 { order = "start ASC" } if req.Order == 3 { order = "un_read DESC" } count, err := db.Mysql().QueryList(req.Page-1, req.Num, query, order, &common.CustomerOrder{}, &resp.List) if err != nil && err != gorm.ErrRecordNotFound { log.Error(err.Error()) a.Code = values.CodeRetry return } resp.Count = count a.Data = resp } // 工单处理状态改变 func ChangeCustomerOrderStatus(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := &values.ChangeCustomerOrderReq{} if !a.S(req) { return } for i := 0; i < len(req.List); i++ { update := make(map[string]interface{}) /*if req.List[i].Status != 0 { update["status"] = req.List[i].Status } if req.List[i].Label1 != 0 { update["label1"] = req.List[i].Label1 } if req.List[i].Label2 != 0 { update["label2"] = req.List[i].Label2 } if req.List[i].Label3 != 0 { update["label3"] = req.List[i].Label3 } if req.List[i].Label4 != 0 { update["label4"] = req.List[i].Label4 } if req.List[i].Label5 != 0 { update["label5"] = req.List[i].Label5 } if len(update) < 1 { continue }*/ if req.List[i].Status == common.CustomerOrderComplete { order := &common.CustomerOrder{ID: req.List[i].Id} db.Mysql().Get(order) if !order.Reply { a.Code = values.CodeParam a.Msg = fmt.Sprintf("玩家%d的订单还未回复,不能修改为完成状态", order.Uid) return } } update["status"] = req.List[i].Status update["label1"] = req.List[i].Label1 update["label2"] = req.List[i].Label2 update["label3"] = req.List[i].Label3 update["label4"] = req.List[i].Label4 update["label5"] = req.List[i].Label5 // if req.List[i].Remark != "" { update["remark"] = req.List[i].Remark // } // 完成工单 update["end"] = time.Now().Unix() update["un_read"] = 0 err := db.Mysql().Update(&common.CustomerOrder{ID: req.List[i].Id}, update) if err != nil { log.Error(err.Error()) a.Code = values.CodeRetry return } } } // 分配工单到客服人员 func CustomerOrderAllocate(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := &values.CustomerOrderAllocateReq{} if !a.S(req) { return } tx := db.Mysql().Begin() defer a.MCommit(tx) for i := 0; i < len(req.List); i++ { err := tx.Exec("UPDATE customer_order SET customer_uid = ?, status = ? WHERE id = ? AND status != ?", req.List[i].Uid, common.CustomerOrderAllocate, req.List[i].OrderId, common.CustomerOrderComplete).Error if err != nil { log.Error(err.Error()) a.Code = values.CodeRetry } } } // 编辑标签 func EditCustomerOrderLabel(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := &values.EditCustomerOrderLabelReq{} if !a.S(req) { return } update := make(map[string]interface{}) update["label1"] = req.LabelId1 update["label2"] = req.LabelId2 update["label3"] = req.LabelId3 update["label4"] = req.LabelId4 update["label5"] = req.LabelId5 err := db.Mysql().Update(&common.CustomerOrder{ID: req.OrderId}, update) if err != nil { log.Error(err.Error()) a.Code = values.CodeRetry return } } // 获取玩家信息 func GetPlayerInfo(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := &values.GetPlayerInfoReq{} if !a.S(req) { return } var resp values.GetPlayerInfoResp // 玩家信息 player, err := call.GetUserXInfo(req.Uid, "channel_id", "nick", "avatar", "birth", "mobile") if err != nil { log.Error(err.Error()) a.Code = values.CodeRetry return } resp.Uid = req.Uid resp.Nick = player.Nick resp.Avatar = player.Avatar resp.Birth = player.Birth resp.Phone = player.Mobile resp.Channel = player.ChannelID // 渠道信息 channel := &common.Channel{ChannelID: player.ChannelID} err = db.Mysql().Get(channel) if err != nil { log.Error(err.Error()) a.Code = values.CodeRetry return } resp.Package = channel.PackName // vip resp.Vip = call.GetVIP(req.Uid).Level order := &common.RechargeInfo{UID: req.Uid} err = db.Mysql().Get(order) if err != nil { log.Error(err.Error()) } resp.Withdraw = order.TotalWithdraw resp.Recharge = order.TotalRecharge if db.Mysql().Exist(&common.CustomerBlackUser{Uid: req.Uid}) { resp.CustomerBlack = true } a.Data = resp } // 玩家历史客诉记录 func ComplaintHistory(c *gin.Context) { a := app.NewApp(c) defer func() { a.Response() }() req := &values.ComplaintHistoryReq{} if !a.S(req) { return } var resp values.ComplaintHistoryResp count, err := db.Mysql().QueryList(req.Page-1, req.Num, fmt.Sprintf("uid = %v", req.Uid), "", &common.CustomerOrder{}, &resp.List) if err != nil { log.Error(err.Error()) a.Code = values.CodeRetry return } resp.Count = count a.Data = resp }