diff --git a/_const/enum/cp_e/cp_relation.go b/_const/enum/cp_e/cp_relation.go index 9faf608a357332bed4431090eaa2504f42641a5c..86bd635e83a87d8504076cb35583ff298f9e019c 100644 --- a/_const/enum/cp_e/cp_relation.go +++ b/_const/enum/cp_e/cp_relation.go @@ -3,6 +3,7 @@ package cp_e import "git.hilo.cn/hilo-common/resource/mysql" type CpInviteStatus mysql.Type +type CpCancelStatus mysql.Type const ( //新用户 @@ -13,4 +14,10 @@ const ( CpInviteAccept CpInviteStatus = 2 CpInviteRefuse CpInviteStatus = 3 CpInviteExpired CpInviteStatus = 4 + + //1.未处理2.发起者已撤销3.对方已确认4.到期自动确认 + CpCancel CpCancelStatus = 1 + CpCancelRevoke CpCancelStatus = 2 + CpCancelAccept CpCancelStatus = 3 + CpCancelAcceptAuto CpCancelStatus = 4 ) diff --git a/domain/model/cp_m/cp_relation.go b/domain/model/cp_m/cp_relation.go index 3114635f2d9ea4841547001ff92a2f53a006b894..eedc3545b1f10c388cf3501c5cc09bce832df5e7 100644 --- a/domain/model/cp_m/cp_relation.go +++ b/domain/model/cp_m/cp_relation.go @@ -32,6 +32,20 @@ type CpInviteMessage struct { Avatar2 string `json:"avatar2"` } +type CpCancel struct { + Id uint64 `json:"id"` + UserId uint64 `json:"userId"` + RecUserId uint64 `json:"recUserId"` + Status cp_e.CpCancelStatus `json:"status"` +} + +// 发送私信(解除) +type CpCancelMessage struct { + Identifier string `json:"identifier"` + Msg string `json:"msg"` + Status uint8 `json:"status"` //1.发起解除2.撤销解除3.接受解除 +} + func CreateCp(model *domain.Model, userId1, userId2 uint64) error { userIds := []uint64{userId1, userId2} result := model.DB().Exec("insert into cp_relation(user_id1, user_id2) values(?,?) where not exists (select user_id1 from cp_relation where user_id1 in (?) or user_id2 in (?));", userId1, userId2, userIds, userIds) @@ -59,9 +73,9 @@ func GetCp(model *domain.Model, userId uint64) (*CpRelation, error) { return res, nil } -func GetCpInvite(model *domain.Model, userId, userIdInvite uint64) (*CpInvite, error) { +func GetCpInvite(model *domain.Model, userId, userIdInvite uint64, status cp_e.CpInviteStatus) (*CpInvite, error) { res := new(CpInvite) - err := model.DB().Model(CpInvite{}).Where(CpInvite{UserId: userId, InviteUserId: userIdInvite}).First(&res).Error + err := model.DB().Model(CpInvite{}).Where(CpInvite{UserId: userId, InviteUserId: userIdInvite, Status: status}).First(&res).Error if err != nil { if err == gorm.ErrRecordNotFound { return nil, nil @@ -95,3 +109,66 @@ func UpdateStatusCpInvite(model *domain.Model, id uint64, status cp_e.CpInviteSt } return nil } + +func CreateCpCancel(model *domain.Model, userId, recUserId uint64) (uint64, error) { + cpCancel := CpCancel{UserId: userId, RecUserId: recUserId, Status: cp_e.CpCancel} + err := model.DB().Model(CpCancel{}).Create(cpCancel).Error + if err != nil { + model.Log.Errorf("CreateCpCancel user1:%d, user2:%d, err:%v", userId, recUserId, err) + return 0, err + } + return cpCancel.Id, nil +} + +func GetCpCancel(model *domain.Model, userIds []uint64, status cp_e.CpCancelStatus) (*CpCancel, error) { + res := new(CpCancel) + err := model.DB().Model(CpCancel{}).Where("status = ? and user_id in (?) and rec_user_id in (?)", status, userIds, userIds).First(&res).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil, nil + } + model.Log.Errorf("GetCpCancel users:%d, err:%v", userIds, err) + return nil, err + } + return res, nil +} + +func GetCpCancelWithMe(model *domain.Model, userId uint64, status cp_e.CpCancelStatus) (*CpCancel, error) { + res := new(CpCancel) + err := model.DB().Model(CpCancel{}).Where("status = ? and (user_id = ? or rec_user_id = ?)", status, userId, userId).First(&res).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil, nil + } + model.Log.Errorf("GetCpCancel user1:%d, err:%v", userId, err) + return nil, err + } + return res, nil +} + +func UpdateStatusCpCancel(model *domain.Model, id uint64, status cp_e.CpCancelStatus) error { + result := model.DB().Exec("update cp_cancel set status=? where id=? and status=? limit 1", status, id, cp_e.CpCancel) + if result.Error != nil { + model.Log.Errorf("UpdateStatusCpCancel id:%d, status:%d, err:%v", id, status, result.Error) + return result.Error + } + if result.RowsAffected <= 0 { + model.Log.Errorf("UpdateStatusCpCancel id:%d, status:%d, err:%v", id, status, bizerr.TransactionFailed) + return bizerr.TransactionFailed + } + return nil +} + +func DelCpRelation(model *domain.Model, userId1, userId2 uint64) error { + userIds := []uint64{userId1, userId2} + result := model.DB().Exec("delete from cp_relation where user_id1 in (?) and user_id2 in (?) limit 1;", userIds, userIds) + if result.Error != nil { + model.Log.Errorf("DelCpRelation user1:%d, user2:%d, err:%v", userId1, userId2, result.Error) + return result.Error + } + if result.RowsAffected <= 0 { + model.Log.Errorf("DelCpRelation user1:%d, user2:%d, err:%v", userId1, userId2, bizerr.TransactionFailed) + return bizerr.TransactionFailed + } + return nil +} diff --git a/domain/service/cp_s/cp_relation.go b/domain/service/cp_s/cp_relation.go new file mode 100644 index 0000000000000000000000000000000000000000..23b00de4f2dc31adf221cff2c971b2e86307c4a7 --- /dev/null +++ b/domain/service/cp_s/cp_relation.go @@ -0,0 +1,155 @@ +package cp_s + +import ( + "encoding/json" + "git.hilo.cn/hilo-common/_const/enum/diamond_e" + "git.hilo.cn/hilo-common/domain" + "git.hilo.cn/hilo-common/mycontext" + "git.hilo.cn/hilo-common/myerr/comerr" + "git.hilo.cn/hilo-common/rpc" + "git.hilo.cn/hilo-common/sdk/tencentyun" + "git.hilo.cn/hilo-common/txop/msg" + "hilo-user/_const/enum/cp_e" + "hilo-user/domain/model/cp_m" + "hilo-user/domain/model/diamond_m" + "hilo-user/domain/model/user_m" + "hilo-user/myerr/bizerr" +) + +func InviteCpRelation(myCtx *mycontext.MyContext, myUserId uint64, userCode, lang string) error { + model := domain.CreateModelContext(myCtx) + user, err := user_m.GetUser(model, myUserId) + if err != nil { + return err + } + userInvite, err := user_m.GetUserByCode(model, userCode) + if err != nil { + return err + } + + // 自己是否有cp了 + myCp, err := cp_m.GetCp(model, myUserId) + if err != nil { + return err + } + if myCp.Id > 0 { + return msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) + } + // 对方是否已经有cp了 + inviCp, err := cp_m.GetCp(model, userInvite.ID) + if err != nil { + return err + } + if inviCp.Id > 0 { + return msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) + } + + // 我是否发起过cp邀请,且还未被处理 + myInvite, err := cp_m.GetCpInvite(model, user.ID, 0, cp_e.CpInvite) + if err != nil { + model.Log.Errorf("InviteCpRelation myUserId:%d, err:%v", myUserId, err) + return err + } + if myInvite != nil && myInvite.Id > 0 { + return bizerr.CpAlreadyInvite + } + + err = model.Transaction(func(model *domain.Model) error { + // 创建邀请记录 + cpInvId, err := cp_m.CreateCpInvite(model, myUserId, userInvite.ID, cp_e.CpRelationInviteDiamond) + if err != nil { + model.Log.Errorf("InviteCpRelation myUserId:%d, err:%v", myUserId, err) + return err + } + // 扣费 + err = diamond_m.ChangeDiamondAccountDetail(model, diamond_e.CpInvite, cpInvId, myUserId, cp_e.CpRelationInviteDiamond) + if err != nil { + model.Log.Errorf("InviteCpRelation myUserId:%d, err:%v", myUserId, err) + return err + } + // 发送私信 + data, _ := json.Marshal(cp_m.CpInviteMessage{ + Identifier: "CpInviteMessage", + Msg: "Do you want to be CP with me?", + Status: uint8(cp_e.CpInvite), + }) + if err := tencentyun.BatchSendCustomMsg(model, 1, user.ExternalId, []string{userInvite.ExternalId}, string(data), "cp邀请"); err != nil { + model.Log.Errorf("BatchSendCustomMsg fail:%v", err) + return err + } + return nil + }) + if err != nil { + model.Log.Errorf("InviteCpRelation myUserId:%d, err:%v", myUserId, err) + return err + } + // socket 推送弹窗 + go rpc.SendCpInviteNotice(userInvite.ID, user.Code, user.Nick, user.Avatar, "Do you want to be CP with me?") + + return nil +} + +func CancelCpRelation(myCtx *mycontext.MyContext, myUserId uint64, userCode, lang string) error { + model := domain.CreateModelContext(myCtx) + user, err := user_m.GetUser(model, myUserId) + if err != nil { + return err + } + userRec, err := user_m.GetUserByCode(model, userCode) + if err != nil { + return err + } + + // 自己没有cp了 + myCp, err := cp_m.GetCp(model, myUserId) + if err != nil { + return err + } + if myCp.Id == 0 { + return msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) + } + // 对方没有cp了 + inviCp, err := cp_m.GetCp(model, userRec.ID) + if err != nil { + return err + } + if inviCp.Id == 0 { + return msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) + } + + // 是否有关于我的cp解除申请,且还未被处理 + myCancel, err := cp_m.GetCpCancelWithMe(model, user.ID, cp_e.CpCancel) + if err != nil { + model.Log.Errorf("InviteCpRelation myUserId:%d, err:%v", myUserId, err) + return err + } + if myCancel != nil && myCancel.Id > 0 { + return bizerr.CpHaveCancelNoDeal + } + + err = model.Transaction(func(model *domain.Model) error { + // 创建邀请记录 + _, err = cp_m.CreateCpCancel(model, myUserId, userRec.ID) + if err != nil { + model.Log.Errorf("CancelCpRelation myUserId:%d, err:%v", myUserId, err) + return err + } + // 发送私信 + data, _ := json.Marshal(cp_m.CpCancelMessage{ + Identifier: "CpCancelMessage", + Msg: "I want to unbind the CP relationship", + Status: 1, + }) + if err := tencentyun.BatchSendCustomMsg(model, 1, user.ExternalId, []string{userRec.ExternalId}, string(data), "cp解除"); err != nil { + model.Log.Errorf("CancelCpRelation BatchSendCustomMsg fail:%v", err) + return err + } + return nil + }) + if err != nil { + model.Log.Errorf("CancelCpRelation myUserId:%d, err:%v", myUserId, err) + return err + } + + return nil +} diff --git a/myerr/bizerr/bizCode.go b/myerr/bizerr/bizCode.go index f704715bf5d4055c305a67fadaef1bda95ade552..fc79c2d69ae14325430bb4dbe0c24f449c986f50 100755 --- a/myerr/bizerr/bizCode.go +++ b/myerr/bizerr/bizCode.go @@ -46,4 +46,7 @@ var ( GameSettleWrong = myerr.NewBusinessCode(50114, "Game settle wrong", myerr.BusinessData{}) // 结算修改错误 GameCloseWrong = myerr.NewBusinessCode(50115, "Game close wrong", myerr.BusinessData{}) // 关闭错误 GameJoinFailed = myerr.NewBusinessCode(50116, "Join failed", myerr.BusinessData{}) // 加入失败 + + CpAlreadyInvite = myerr.NewBusinessCode(50120, "Already invited", myerr.BusinessData{}) // 已经发送过邀请了 + CpHaveCancelNoDeal = myerr.NewBusinessCode(50121, "You have a cancel apply", myerr.BusinessData{}) // 有接触申请需要处理 ) diff --git a/mysql/3.9.0.sql b/mysql/3.9.0.sql index 1679935b35888a53218cf237066036197cb63846..c2bcac8db685fefb6a7f7741878dc7c57a9da94a 100644 --- a/mysql/3.9.0.sql +++ b/mysql/3.9.0.sql @@ -27,4 +27,18 @@ CREATE TABLE `cp_invite` ( KEY `uid2_idx` (`invite_user_id`) USING BTREE, KEY `status_idx` (`status`) USING BTREE, KEY `created_time` (`created_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='cp邀请发起记录'; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='cp邀请发起记录'; + +CREATE TABLE `cp_cancel` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `user_id` bigint NOT NULL COMMENT '发起者', + `rec_user_id` bigint NOT NULL COMMENT '接收者', + `status` tinyint unsigned NOT NULL COMMENT '状态1.未处理2.发起者已撤销3.对方已确认4.到期自动确认', + `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `uid_idx` (`user_id`) USING BTREE, + KEY `uid2_idx` (`rec_user_id`) USING BTREE, + KEY `status_idx` (`status`) USING BTREE, + KEY `created_time` (`created_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='cp解除发起记录'; \ No newline at end of file diff --git a/route/cp_r/cp_relation.go b/route/cp_r/cp_relation.go index 09ef9edb4c0f581f622a96db9e8a341a33a0b193..4eb19a5f5fcdd60ea8f52e305a65d9ffbdee0b55 100644 --- a/route/cp_r/cp_relation.go +++ b/route/cp_r/cp_relation.go @@ -7,9 +7,7 @@ import ( "git.hilo.cn/hilo-common/domain" "git.hilo.cn/hilo-common/mycontext" "git.hilo.cn/hilo-common/myerr/comerr" - "git.hilo.cn/hilo-common/rpc" "git.hilo.cn/hilo-common/sdk/tencentyun" - "git.hilo.cn/hilo-common/txop/bag_tx" "git.hilo.cn/hilo-common/txop/msg" "github.com/gin-gonic/gin" "hilo-user/_const/enum/cp_e" @@ -17,6 +15,7 @@ import ( "hilo-user/domain/model/cp_m" "hilo-user/domain/model/diamond_m" "hilo-user/domain/model/user_m" + "hilo-user/domain/service/cp_s" "hilo-user/myerr/bizerr" "hilo-user/req" "hilo-user/resp" @@ -56,11 +55,12 @@ func CheckUserCpRelation(c *gin.Context) (*mycontext.MyContext, error) { } // @Tags cp关系 -// @Summary 发送cp邀请 -// @Param code formData int true "用户code" +// @Summary 发送cp邀请/发起解除cp +// @Param code formData int true "对方用户code" +// @Param type formData int true "类型1.发起邀请2.发起解除" // @Success 200 -// @Router /v2/cp/relation/invite [post] -func InviteCpRelation(c *gin.Context) (*mycontext.MyContext, error) { +// @Router /v2/cp/relation [post] +func CpRelation(c *gin.Context) (*mycontext.MyContext, error) { myCtx := mycontext.CreateMyContext(c.Keys) userCode := c.PostForm("code") @@ -69,65 +69,27 @@ func InviteCpRelation(c *gin.Context) (*mycontext.MyContext, error) { return myCtx, err } - model := domain.CreateModelContext(myCtx) - user, err := user_m.GetUser(model, myUserId) - if err != nil { - return myCtx, err - } - userInvite, err := user_m.GetUserByCode(model, userCode) - if err != nil { - return myCtx, err + optType, err := strconv.Atoi(c.PostForm("type")) + if err != nil || optType > 2 || optType < 1 { + return myCtx, bizerr.InvalidParameter } - // 自己是否有cp了 - myCp, err := cp_m.GetCp(model, myUserId) - if err != nil { - return myCtx, err - } - if myCp.Id > 0 { - return myCtx, msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) - } - // 对方是否已经有cp了 - inviCp, err := cp_m.GetCp(model, userInvite.ID) - if err != nil { - return myCtx, err - } - if inviCp.Id > 0 { - return myCtx, msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) - } - err = model.Transaction(func(model *domain.Model) error { - // 创建邀请记录 - cpInvId, err := cp_m.CreateCpInvite(model, myUserId, userInvite.ID, cp_e.CpRelationInviteDiamond) + if optType == 1 { // 邀请 + err = cp_s.InviteCpRelation(myCtx, myUserId, userCode, lang) if err != nil { - model.Log.Errorf("InviteCpRelation myUserId:%d, err:%v", myUserId, err) - return err + myCtx.Log.Errorf("InviteCpRelation myUserId:%d, err:%v", myUserId, err) + return myCtx, err } - // 扣费 - err = diamond_m.ChangeDiamondAccountDetail(model, diamond_e.CpInvite, cpInvId, myUserId, cp_e.CpRelationInviteDiamond) + } else { + // 发起解除 + err = cp_s.CancelCpRelation(myCtx, myUserId, userCode, lang) if err != nil { - model.Log.Errorf("InviteCpRelation myUserId:%d, err:%v", myUserId, err) - return err + myCtx.Log.Errorf("CancelCpRelation myUserId:%d, err:%v", myUserId, err) + return myCtx, err } - // 发送私信 - data, _ := json.Marshal(cp_m.CpInviteMessage{ - Identifier: "CpInviteMessage", - Msg: "Do you want to be CP with me?", - Status: uint8(cp_e.CpInvite), - }) - if err := tencentyun.BatchSendCustomMsg(model, 1, user.ExternalId, []string{userInvite.ExternalId}, string(data), "cp邀请"); err != nil { - model.Log.Errorf("BatchSendCustomMsg fail:%v", err) - return err - } - return nil - }) - if err != nil { - model.Log.Errorf("InviteCpRelation myUserId:%d, err:%v", myUserId, err) - return myCtx, err } - // socket 推送弹窗 - go rpc.SendCpInviteNotice(userInvite.ID, user.Code, user.Nick, user.Avatar, "Do you want to be CP with me?") - resp.ResponseOk(c, cp_cv.CheckCpRelationRes{}) + resp.ResponseOk(c, nil) return myCtx, nil } @@ -160,7 +122,7 @@ func ReplyCpInvite(c *gin.Context) (*mycontext.MyContext, error) { return myCtx, err } - cpRecord, err := cp_m.GetCpInvite(model, userSender.ID, user.ID) + cpRecord, err := cp_m.GetCpInvite(model, userSender.ID, user.ID, cp_e.CpInvite) if err != nil { model.Log.Errorf("ReplyCpInvite userSender:%d, user:%d, err:%v", userSender.ID, user.ID, err) return myCtx, err @@ -169,21 +131,23 @@ func ReplyCpInvite(c *gin.Context) (*mycontext.MyContext, error) { return myCtx, bizerr.InvalidParameter } - // 自己是否有cp了 - myCp, err := cp_m.GetCp(model, myUserId) - if err != nil { - return myCtx, err - } - if optType == 1 && myCp.Id > 0 { // 接受的时候 - return myCtx, msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) - } - // 对方是否已经有cp了 - senderCp, err := cp_m.GetCp(model, userSender.ID) - if err != nil { - return myCtx, err - } - if optType == 1 && senderCp.Id > 0 { - return myCtx, msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) + if optType == 1 { // 接受的时候 + // 自己是否有cp了 + myCp, err := cp_m.GetCp(model, myUserId) + if err != nil { + return myCtx, err + } + if myCp.Id > 0 { + return myCtx, msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) + } + // 对方是否已经有cp了 + senderCp, err := cp_m.GetCp(model, userSender.ID) + if err != nil { + return myCtx, err + } + if senderCp.Id > 0 { + return myCtx, msg.GetErrByLanguage(model, 0, lang, comerr.InvalidParameter) + } } err = model.Transaction(func(model *domain.Model) error { // 更新邀请状态 @@ -205,11 +169,11 @@ func ReplyCpInvite(c *gin.Context) (*mycontext.MyContext, error) { model.Log.Errorf("ReplyCpInvite userSender:%d, user:%d, status:%d, err:%v", userSender.ID, user.ID, updateStatus, err) return err } - // 发放告白礼物 - if _, err = bag_tx.SendUserBag(model, userSender.ID, 1, award.GiftId, award.GiftN, 3, "告白礼物"); err != nil { - model.Log.Errorf("ReplyCpInvite userSender:%d, user:%d, status:%d, err:%v", userSender.ID, user.ID, updateStatus, err) - return err - } + // 发放告白礼物 cwj---- + //if _, err = bag_tx.SendUserBag(model, userSender.ID, 1, award.GiftId, award.GiftN, 3, "告白礼物"); err != nil { + // model.Log.Errorf("ReplyCpInvite userSender:%d, user:%d, status:%d, err:%v", userSender.ID, user.ID, updateStatus, err) + // return err + //} // 私信 msgData, _ = json.Marshal(cp_m.CpInviteMessage{ Identifier: "CpInviteMessage", @@ -246,3 +210,100 @@ func ReplyCpInvite(c *gin.Context) (*mycontext.MyContext, error) { resp.ResponseOk(c, cp_cv.CheckCpRelationRes{}) return myCtx, nil } + +// @Tags cp关系 +// @Summary 回应cp解除 +// @Param code formData int true "对方的用户code" +// @Param type formData int true "类型1.撤销2.接受" +// @Success 200 +// @Router /v2/cp/relation/cancel/reply [post] +func ReplyCpCancel(c *gin.Context) (*mycontext.MyContext, error) { + myCtx := mycontext.CreateMyContext(c.Keys) + userCode := c.PostForm("code") + optType, err := strconv.Atoi(c.PostForm("type")) + if err != nil || optType > 2 || optType < 1 { + return myCtx, bizerr.InvalidParameter + } + + myUserId, _, err := req.GetUserIdLang(c, myCtx) + if err != nil { + return myCtx, err + } + + model := domain.CreateModelContext(myCtx) + myUser, err := user_m.GetUser(model, myUserId) + if err != nil { + return myCtx, err + } + user2, err := user_m.GetUserByCode(model, userCode) + if err != nil { + return myCtx, err + } + + cpCancel, err := cp_m.GetCpCancel(model, []uint64{myUser.ID, user2.ID}, cp_e.CpCancel) + if err != nil { + model.Log.Errorf("ReplyCpCancel myUser:%d, user2:%d, err:%v", myUser.ID, user2.ID, err) + return myCtx, err + } + if cpCancel == nil || cpCancel.Id == 0 { + return myCtx, bizerr.InvalidParameter + } + + if optType == 1 { // 撤销,只有自己能撤销自己的申请 + if cpCancel.UserId != myUserId { + return myCtx, bizerr.InvalidParameter + } + } else { // 接受,只有对方能接受 + if cpCancel.RecUserId != myUserId { + return myCtx, bizerr.InvalidParameter + } + } + + err = model.Transaction(func(model *domain.Model) error { + // 更新邀请状态 + updateStatus := cp_e.CpCancelRevoke + if optType == 2 { // 接受 + updateStatus = cp_e.CpCancelAccept + } + err = cp_m.UpdateStatusCpCancel(model, cpCancel.Id, updateStatus) + if err != nil { + model.Log.Errorf("ReplyCpCancel myUser:%d, user2:%d, status:%d, err:%v", myUser.ID, user2.ID, updateStatus, err) + return err + } + + var msgData []byte + if optType == 1 { // 撤销解除 + // 私信 + msgData, _ = json.Marshal(cp_m.CpCancelMessage{ + Identifier: "CpCancelMessage", + Msg: fmt.Sprintf("%s withdrew my application to lift CP", myUser.Nick), + Status: 2, + }) + } else { // 接受解除 + // 删除cp关系表的记录 + err = cp_m.DelCpRelation(model, myUser.ID, user2.ID) + if err != nil { + model.Log.Errorf("ReplyCpCancel myUser:%d, user2:%d, status:%d, err:%v", myUser.ID, user2.ID, updateStatus, err) + return err + } + // 私信 + msgData, _ = json.Marshal(cp_m.CpCancelMessage{ + Identifier: "CpCancelMessage", + Msg: "The CP relationship has been unbound, the CP value has been cleared, and the CP privilege has disappeared", + Status: 3, + }) + } + if err := tencentyun.BatchSendCustomMsg(model, 1, myUser.ExternalId, []string{user2.ExternalId}, string(msgData), "cp解除"); err != nil { + model.Log.Errorf("ReplyCpCancel BatchSendCustomMsg fail:%v", err) + return err + } + return nil + }) + if err != nil { + model.Log.Errorf("ReplyCpCancel myUserId:%d, err:%v", myUserId, err) + return myCtx, err + } + + resp.ResponseOk(c, cp_cv.CheckCpRelationRes{}) + return myCtx, nil +}