diff --git a/app/db/db.go b/app/db/db.go index 00630e8..223445e 100644 --- a/app/db/db.go +++ b/app/db/db.go @@ -16,7 +16,7 @@ import ( var Db *xorm.Engine -//根据DB配置文件初始化数据库 +// 根据DB配置文件初始化数据库 func InitDB(c *cfg.DBCfg) error { var ( err error @@ -51,6 +51,43 @@ func InitDB(c *cfg.DBCfg) error { return nil } +var DbIm *xorm.Engine + +// 根据DB配置文件初始化数据库 +func InitImDB(c *cfg.DBCfg) error { + var ( + err error + f *os.File + ) + //创建Orm引擎 + if DbIm, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", c.User, c.Psw, c.Host, c.Name)); err != nil { + return err + } + DbIm.SetConnMaxLifetime(c.MaxLifetime * time.Second) //设置最长连接时间 + DbIm.SetMaxOpenConns(c.MaxOpenConns) //设置最大打开连接数 + DbIm.SetMaxIdleConns(c.MaxIdleConns) //设置连接池的空闲数大小 + if err = DbIm.Ping(); err != nil { //尝试ping数据库 + return err + } + if c.ShowLog { //根据配置文件设置日志 + DbIm.ShowSQL(true) //设置是否打印sql + DbIm.Logger().SetLevel(0) //设置日志等级 + //修改日志文件存放路径文件名是%s.log + path := fmt.Sprintf(c.Path, c.Name) + f, err = os.OpenFile(path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777) + if err != nil { + os.RemoveAll(c.Path) + if f, err = os.OpenFile(c.Path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777); err != nil { + return err + } + } + logger := log.NewSimpleLogger(f) + logger.ShowSQL(true) + DbIm.SetLogger(logger) + } + return nil +} + /********************************************* 公用方法 *********************************************/ // 数据批量插入 diff --git a/app/db/im/db_customer_service.go b/app/db/im/db_customer_service.go new file mode 100644 index 0000000..3a49c63 --- /dev/null +++ b/app/db/im/db_customer_service.go @@ -0,0 +1 @@ +package db diff --git a/app/db/im/db_sys_cfg.go b/app/db/im/db_sys_cfg.go new file mode 100644 index 0000000..75fd914 --- /dev/null +++ b/app/db/im/db_sys_cfg.go @@ -0,0 +1,46 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/utils/logx" + "xorm.io/xorm" +) + +// 系统配置get +func SysCfgGetAll(Db *xorm.Engine) (*[]model.SysCfg, error) { + var cfgList []model.SysCfg + if err := Db.Cols("key,val,memo").Find(&cfgList); err != nil { + return nil, logx.Error(err) + } + return &cfgList, nil +} + +// 获取一条记录 +func SysCfgGetOne(Db *xorm.Engine, key string) (*model.SysCfg, error) { + var cfgList model.SysCfg + if has, err := Db.Where("`key`=?", key).Get(&cfgList); err != nil || has == false { + return nil, logx.Error(err) + } + return &cfgList, nil +} + +// 返回最后插入id +func SysCfgInsert(Db *xorm.Engine, key, val, memo string) bool { + cfg := model.SysCfg{Key: key, Val: val, Memo: memo} + _, err := Db.InsertOne(&cfg) + if err != nil { + logx.Error(err) + return false + } + return true +} + +func SysCfgUpdate(Db *xorm.Engine, key, val, memo string) bool { + cfg := model.SysCfg{Key: key, Val: val, Memo: memo} + _, err := Db.Where("`key`=?", key).Cols("val,memo").Update(&cfg) + if err != nil { + logx.Error(err) + return false + } + return true +} diff --git a/app/db/im/model/customer_service.go b/app/db/im/model/customer_service.go new file mode 100644 index 0000000..120319f --- /dev/null +++ b/app/db/im/model/customer_service.go @@ -0,0 +1,15 @@ +package model + +import "time" + +// CustomerService 客服表 +type CustomerService struct { + Id int64 + Uid int64 // 用户id + Weight int32 // 权重 + State int32 // 状态 + HasUserNums int // 拥有用户数量 + Memo string // 备注 + CreateTime time.Time // 创建时间 + UpdateTime time.Time // 更新时间 +} diff --git a/app/db/im/model/emoticon.go b/app/db/im/model/emoticon.go new file mode 100644 index 0000000..ac310a5 --- /dev/null +++ b/app/db/im/model/emoticon.go @@ -0,0 +1,12 @@ +package model + +type Emoticon struct { + Id int64 + Name string // 名称 + ImgUrl string // 图片地址 + Memo string // 备注 + Sort int // 排序 + State int // 状态0关闭,1开启 + CreateAt string // 创建时间 + UpdateAt string // 更新时间 +} diff --git a/app/db/im/model/group.go b/app/db/im/model/group.go new file mode 100644 index 0000000..d81bb2a --- /dev/null +++ b/app/db/im/model/group.go @@ -0,0 +1,37 @@ +package model + +// Group 群组 +type Group struct { + Id int64 // 群组id + Name string // 组名 + AvatarUrl string // 头像 + Introduction string // 群简介 + UserNum int32 // 群组人数 + IsAllMemberBanned int32 // 是否全员禁言(1:是 2:否) + IsAllAddFriend int32 // 是否允许加好友(1:是 2:否) + Extra string // 附加字段 + CreateTime string // 创建时间 + UpdateTime string // 更新时间 +} + +type GroupUser struct { + Id int64 // 自增主键 + GroupId int64 // 群组id + UserId int64 // 用户id + MemberType int // 群组类型 + Remarks string // 备注 + Extra string // 附加属性 + Status int // 状态 + CreateTime string // 创建时间 + UpdateTime string // 更新时间 +} + +type GroupWithOwner struct { + GroupID int64 `json:"group_user.group_id"` + OwnerID int64 `json:"group_user.owner_id"` +} + +type CustomerServiceWithUser struct { + CustomerServiceUID int64 `json:"customer_service.uid"` + UserIMID int64 `json:"user.id"` +} diff --git a/app/db/im/model/sys_cfg.go b/app/db/im/model/sys_cfg.go new file mode 100644 index 0000000..22d906b --- /dev/null +++ b/app/db/im/model/sys_cfg.go @@ -0,0 +1,7 @@ +package model + +type SysCfg struct { + Key string `json:"key" xorm:"not null pk comment('键') VARCHAR(127)"` + Val string `json:"val" xorm:"comment('值') TEXT"` + Memo string `json:"memo" xorm:"not null default '' comment('备注') VARCHAR(255)"` +} diff --git a/app/db/im/model/user.go b/app/db/im/model/user.go new file mode 100644 index 0000000..cc601e3 --- /dev/null +++ b/app/db/im/model/user.go @@ -0,0 +1,18 @@ +package model + +import ( + "time" +) + +// User 账户 +type User struct { + Id int64 // 用户id + PhoneNumber string // 手机号 + Nickname string // 昵称 + Sex int32 // 性别,1:男;2:女 + AvatarUrl string // 用户头像 + Extra string // 附加属性 + CreateTime time.Time // 创建时间 + UpdateTime time.Time // 更新时间 + IsAutoAddedFriends int // 是否自动被添加好友 +} diff --git a/app/hdl/hdl_im.go b/app/hdl/hdl_im.go index 700017c..0c7145c 100644 --- a/app/hdl/hdl_im.go +++ b/app/hdl/hdl_im.go @@ -104,7 +104,6 @@ func GrabRedPackage(c *gin.Context) { } //TODO::调用im GRPC 接口 - // masterID := c.GetHeader("master_id") res, err := utils.GetLogicExtClient(cfg.ImLogicRpc.URL, cfg.ImLogicRpc.PORT).SendRedPacket(utils.GetCtx(req.Token, req.UserId, req.DeviceId), &pb.SendRedPacketReq{ ReceiverType: pb.ReceiverType(req.ReceiverType), ReceiverId: req.ReceiverId, diff --git a/app/svc/svc_im.go b/app/svc/svc_im.go index 453276f..b18df45 100644 --- a/app/svc/svc_im.go +++ b/app/svc/svc_im.go @@ -1,13 +1,16 @@ package svc import ( + "applet/app/cfg" "applet/app/db" + model2 "applet/app/db/im/model" "applet/app/md" "applet/app/pkg/pb" "applet/app/utils" "applet/app/utils/cache" "code.fnuoos.com/EggPlanet/egg_models.git/src/implement" "code.fnuoos.com/EggPlanet/egg_models.git/src/model" + rule2 "code.fnuoos.com/EggPlanet/egg_system_rules.git" md2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/md" "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule" "code.fnuoos.com/EggPlanet/egg_system_rules.git/svc" @@ -221,11 +224,13 @@ func DetailGrabRedPackage(redPackageId string) (resp []md.RedPackageDetailUserNo receivedTimes := strings.Split(imSendRedPackageOrd.ReceivedTimes, ",") receivedUserAmount := strings.Split(imSendRedPackageOrd.ReceivedUserAmount, ",") + redisConn := cache.GetPool().Get() + scheme, domain := svc.ImageBucket(db.Db, redisConn) for k, v := range receivedUserIds { resp = append(resp, md.RedPackageDetailUserNode{ ImUserId: receivedImUserIds[k], UserNickName: usersMap[v].Nickname, - UserAvatarUrl: usersMap[v].Avatar, + UserAvatarUrl: svc.ImageFormatWithBucket(scheme, domain, usersMap[v].Avatar), Amount: receivedUserAmount[k], ReceiveAt: receivedTimes[k], }) @@ -246,6 +251,7 @@ func BalancePayForRedPackage(user *model.User, money string, req md.SendRedPacka Uid: user.Id, Amount: utils.StrToFloat64(money), } + rule2.Init(cfg.RedisAddr) err = rule.DealUserWallet(session, dealUserWalletReq) if err != nil { session.Rollback() @@ -253,21 +259,60 @@ func BalancePayForRedPackage(user *model.User, money string, req md.SendRedPacka } // 新增红包记录 + var imUid int + if req.UserId != "" { + imUid = utils.StrToInt(req.UserId) + } else { + //TODO::请求rpc接口,同步用户数据 + resp, err := utils.GetBusinessExtClient(cfg.ImBusinessRpc.URL, cfg.ImBusinessRpc.PORT).GetUser(utils.GetCtx("", "", ""), &pb.GetUserReq{ + UserId: 0, + Phone: user.Phone, + }) + if err != nil { + return nil, redPackageId, err + } + imUid = int(resp.User.UserId) + } + now := time.Now() ordNo := uuid.New().String() var waitDrawUserIds string + var waitDrawImUserIds string if req.RedPacketType == int(pb.RedPacketType_RPT_GROUP_SPECIALLY) { var toUserIds []string for _, v := range req.ToUserIds { toUserIds = append(toUserIds, utils.AnyToString(v)) } waitDrawUserIds = strings.Join(toUserIds, ",") + userDb := implement.NewUserDb(db.Db) + waitDrawUsers, err1 := userDb.UserFindByParams(map[string]interface{}{ + "key": "id", + "value": toUserIds, + }) + if err1 != nil { + return nil, 0, err1 + } + var waitDrawUserPhones []string + for _, v := range waitDrawUsers { + waitDrawUserPhones = append(waitDrawUserPhones, v.Phone) + } + var waitDrawImUsers []model2.User + err = db.DbIm.Table("user").In("phone_number", waitDrawUserPhones).Find(&waitDrawUsers) + if err != nil { + return nil, 0, err + } + var toUserIMIDs []string + for _, v := range waitDrawImUsers { + toUserIMIDs = append(toUserIMIDs, utils.AnyToString(v.Id)) + } + waitDrawImUserIds = strings.Join(toUserIMIDs, ",") } ordDb := implement.NewImSendRedPackageOrdDb(db.Db) m := model.ImSendRedPackageOrd{ OrdNo: ordNo, - Uid: utils.StrToInt(req.UserId), + Uid: int(user.Id), + ImUid: imUid, Amount: req.Amount, RedPacketBalanceAmount: req.Amount, RedPacketType: req.RedPacketType, @@ -275,6 +320,10 @@ func BalancePayForRedPackage(user *model.User, money string, req md.SendRedPacka RedPacketBalanceNums: req.RedPacketNums, State: 0, WaitDrawUserIds: waitDrawUserIds, + WaitDrawImUserIds: waitDrawImUserIds, + ReceivedUserIds: "", + ReceivedImUserIds: "", + ReceivedUserAmount: "", CreateTime: now.Format("2006-01-02 15:04:05"), UpdateTime: now.Format("2006-01-02 15:04:05"), } diff --git a/docs/docs.go b/docs/docs.go index eb822de..f11263d 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -1,5 +1,4 @@ -// Code generated by swaggo/swag. DO NOT EDIT. - +// Package docs Code generated by swaggo/swag. DO NOT EDIT package docs import "github.com/swaggo/swag" @@ -2064,9 +2063,7 @@ const docTemplate = `{ "name": "req", "in": "body", "required": true, - "schema": { - "type": "object" - } + "schema": {} } ], "responses": { @@ -2555,68 +2552,6 @@ const docTemplate = `{ } } }, - "code_fnuoos_com_EggPlanet_egg_models_git_src_model.ImSendRedPackageOrd": { - "type": "object", - "properties": { - "amount": { - "type": "string" - }, - "create_time": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "im_data": { - "type": "string" - }, - "im_uid": { - "type": "integer" - }, - "ord_no": { - "type": "string" - }, - "received_im_user_ids": { - "type": "string" - }, - "received_times": { - "type": "string" - }, - "received_user_amount": { - "type": "string" - }, - "received_user_ids": { - "type": "string" - }, - "red_packet_balance_amount": { - "type": "string" - }, - "red_packet_balance_nums": { - "type": "integer" - }, - "red_packet_nums": { - "type": "integer" - }, - "red_packet_type": { - "type": "integer" - }, - "state": { - "type": "integer" - }, - "uid": { - "type": "integer" - }, - "update_time": { - "type": "string" - }, - "wait_draw_im_user_ids": { - "type": "string" - }, - "wait_draw_user_ids": { - "type": "string" - } - } - }, "comm.AccessRecordsReq": { "type": "object", "properties": { @@ -3837,7 +3772,7 @@ const docTemplate = `{ "description": "红包详情信息", "allOf": [ { - "$ref": "#/definitions/code_fnuoos_com_EggPlanet_egg_models_git_src_model.ImSendRedPackageOrd" + "$ref": "#/definitions/model.ImSendRedPackageOrd" } ] }, @@ -4420,6 +4355,68 @@ const docTemplate = `{ } } }, + "model.ImSendRedPackageOrd": { + "type": "object", + "properties": { + "amount": { + "type": "string" + }, + "create_time": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "im_data": { + "type": "string" + }, + "im_uid": { + "type": "integer" + }, + "ord_no": { + "type": "string" + }, + "received_im_user_ids": { + "type": "string" + }, + "received_times": { + "type": "string" + }, + "received_user_amount": { + "type": "string" + }, + "received_user_ids": { + "type": "string" + }, + "red_packet_balance_amount": { + "type": "string" + }, + "red_packet_balance_nums": { + "type": "integer" + }, + "red_packet_nums": { + "type": "integer" + }, + "red_packet_type": { + "type": "integer" + }, + "state": { + "type": "integer" + }, + "uid": { + "type": "integer" + }, + "update_time": { + "type": "string" + }, + "wait_draw_im_user_ids": { + "type": "string" + }, + "wait_draw_user_ids": { + "type": "string" + } + } + }, "pb.SendRedPacketResp": { "type": "object", "properties": { @@ -4442,6 +4439,8 @@ var SwaggerInfo = &swag.Spec{ Description: "APP客户端-Api接口", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", } func init() { diff --git a/docs/swagger.json b/docs/swagger.json index 26333e0..05c7903 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -2057,9 +2057,7 @@ "name": "req", "in": "body", "required": true, - "schema": { - "type": "object" - } + "schema": {} } ], "responses": { @@ -2548,68 +2546,6 @@ } } }, - "code_fnuoos_com_EggPlanet_egg_models_git_src_model.ImSendRedPackageOrd": { - "type": "object", - "properties": { - "amount": { - "type": "string" - }, - "create_time": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "im_data": { - "type": "string" - }, - "im_uid": { - "type": "integer" - }, - "ord_no": { - "type": "string" - }, - "received_im_user_ids": { - "type": "string" - }, - "received_times": { - "type": "string" - }, - "received_user_amount": { - "type": "string" - }, - "received_user_ids": { - "type": "string" - }, - "red_packet_balance_amount": { - "type": "string" - }, - "red_packet_balance_nums": { - "type": "integer" - }, - "red_packet_nums": { - "type": "integer" - }, - "red_packet_type": { - "type": "integer" - }, - "state": { - "type": "integer" - }, - "uid": { - "type": "integer" - }, - "update_time": { - "type": "string" - }, - "wait_draw_im_user_ids": { - "type": "string" - }, - "wait_draw_user_ids": { - "type": "string" - } - } - }, "comm.AccessRecordsReq": { "type": "object", "properties": { @@ -3830,7 +3766,7 @@ "description": "红包详情信息", "allOf": [ { - "$ref": "#/definitions/code_fnuoos_com_EggPlanet_egg_models_git_src_model.ImSendRedPackageOrd" + "$ref": "#/definitions/model.ImSendRedPackageOrd" } ] }, @@ -4413,6 +4349,68 @@ } } }, + "model.ImSendRedPackageOrd": { + "type": "object", + "properties": { + "amount": { + "type": "string" + }, + "create_time": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "im_data": { + "type": "string" + }, + "im_uid": { + "type": "integer" + }, + "ord_no": { + "type": "string" + }, + "received_im_user_ids": { + "type": "string" + }, + "received_times": { + "type": "string" + }, + "received_user_amount": { + "type": "string" + }, + "received_user_ids": { + "type": "string" + }, + "red_packet_balance_amount": { + "type": "string" + }, + "red_packet_balance_nums": { + "type": "integer" + }, + "red_packet_nums": { + "type": "integer" + }, + "red_packet_type": { + "type": "integer" + }, + "state": { + "type": "integer" + }, + "uid": { + "type": "integer" + }, + "update_time": { + "type": "string" + }, + "wait_draw_im_user_ids": { + "type": "string" + }, + "wait_draw_user_ids": { + "type": "string" + } + } + }, "pb.SendRedPacketResp": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 8963daf..c321f75 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -12,47 +12,6 @@ definitions: description: 总数据量 type: integer type: object - code_fnuoos_com_EggPlanet_egg_models_git_src_model.ImSendRedPackageOrd: - properties: - amount: - type: string - create_time: - type: string - id: - type: integer - im_data: - type: string - im_uid: - type: integer - ord_no: - type: string - received_im_user_ids: - type: string - received_times: - type: string - received_user_amount: - type: string - received_user_ids: - type: string - red_packet_balance_amount: - type: string - red_packet_balance_nums: - type: integer - red_packet_nums: - type: integer - red_packet_type: - type: integer - state: - type: integer - uid: - type: integer - update_time: - type: string - wait_draw_im_user_ids: - type: string - wait_draw_user_ids: - type: string - type: object comm.AccessRecordsReq: properties: index: @@ -901,7 +860,7 @@ definitions: properties: detail: allOf: - - $ref: '#/definitions/code_fnuoos_com_EggPlanet_egg_models_git_src_model.ImSendRedPackageOrd' + - $ref: '#/definitions/model.ImSendRedPackageOrd' description: 红包详情信息 list: description: 领取红包用户列表 @@ -1302,6 +1261,47 @@ definitions: description: 余额 type: string type: object + model.ImSendRedPackageOrd: + properties: + amount: + type: string + create_time: + type: string + id: + type: integer + im_data: + type: string + im_uid: + type: integer + ord_no: + type: string + received_im_user_ids: + type: string + received_times: + type: string + received_user_amount: + type: string + received_user_ids: + type: string + red_packet_balance_amount: + type: string + red_packet_balance_nums: + type: integer + red_packet_nums: + type: integer + red_packet_type: + type: integer + state: + type: integer + uid: + type: integer + update_time: + type: string + wait_draw_im_user_ids: + type: string + wait_draw_user_ids: + type: string + type: object pb.SendRedPacketResp: properties: seq: @@ -2665,8 +2665,7 @@ paths: in: body name: req required: true - schema: - type: object + schema: {} produces: - application/json responses: