123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547 |
- package v1
- import (
- "context"
- "encoding/json"
- "go-common/library/ecode"
- "regexp"
- "strconv"
- "strings"
- "time"
- "google.golang.org/grpc/status"
- v1pb "go-common/app/admin/live/live-admin/api/http/v1"
- "go-common/app/admin/live/live-admin/conf"
- rspb "go-common/app/service/live/xlottery/api/grpc/v1"
- "go-common/library/log"
- )
- // CapsuleService struct
- type CapsuleService struct {
- conf *conf.Config
- // optionally add other properties here, such as dao
- // dao *dao.Dao
- capsuleCli *rspb.Client
- }
- //NewCapsuleService init
- func NewCapsuleService(c *conf.Config) (s *CapsuleService) {
- s = &CapsuleService{
- conf: c,
- }
- var svc *rspb.Client
- var err error
- log.Info("CapsuleService Init: %+v", s.conf.CapsuleClient)
- if svc, err = rspb.NewClient(s.conf.CapsuleClient); err != nil {
- panic(err)
- }
- s.capsuleCli = svc
- return s
- }
- // GetCoinList implementation
- func (s *CapsuleService) GetCoinList(ctx context.Context, req *v1pb.GetCoinListReqAdmin) (resp *v1pb.GetCoinListRespAdmin, err error) {
- var RPCResponse *rspb.GetCoinListResp
- RPCReq := &rspb.GetCoinListReq{
- Page: req.Page,
- PageSize: req.PageSize,
- }
- if RPCReq.Page < 1 {
- RPCReq.Page = 1
- }
- if RPCReq.PageSize < 1 {
- RPCReq.PageSize = 16
- }
- RPCResponse, err = s.capsuleCli.GetCoinList(ctx, RPCReq)
- if err != nil {
- return
- }
- coinListResp := make([]*v1pb.GetCoinListRespAdmin_List, 0)
- for _, singleCoinList := range RPCResponse.List {
- coinList := &v1pb.GetCoinListRespAdmin_List{}
- coinList.Id = singleCoinList.Id
- coinList.Status = singleCoinList.Status
- coinList.Title = singleCoinList.Title
- coinList.GiftConfig = singleCoinList.GiftConfig
- coinList.GiftType = singleCoinList.GiftType
- coinList.ChangeNum = singleCoinList.ChangeNum
- startTimeUnix := time.Unix(singleCoinList.StartTime, 0)
- coinList.StartTime = startTimeUnix.Format("2006-01-02 15:04:05")
- endTimeUnix := time.Unix(singleCoinList.EndTime, 0)
- coinList.EndTime = endTimeUnix.Format("2006-01-02 15:04:05")
- areaIds := make([]*v1pb.GetCoinListRespAdmin_List_AreaIds, 0)
- for _, areaId := range singleCoinList.AreaIds {
- singleAreaId := &v1pb.GetCoinListRespAdmin_List_AreaIds{}
- singleAreaId.IsAll = areaId.IsAll
- singleAreaId.List = areaId.List
- singleAreaId.ParentId = areaId.ParentId
- areaIds = append(areaIds, singleAreaId)
- }
- coinList.AreaIds = areaIds
- coinListResp = append(coinListResp, coinList)
- }
- resp = &v1pb.GetCoinListRespAdmin{
- Total: RPCResponse.Total,
- TotalPage: RPCResponse.TotalPage,
- List: coinListResp,
- }
- return
- }
- // UpdateCoinConfig implementation
- func (s *CapsuleService) UpdateCoinConfig(ctx context.Context, req *v1pb.UpdateCoinConfigReqAdmin) (resp *v1pb.UpdateCoinConfigRespAdmin, err error) {
- var RPCResponse *rspb.UpdateCoinConfigResp
- loc, _ := time.LoadLocation("Local")
- var endTime, startTime time.Time
- startTime, err = time.ParseInLocation("2006-01-02 15:04:05", req.StartTime, loc)
- if err != nil {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- endTime, err = time.ParseInLocation("2006-01-02 15:04:05", req.EndTime, loc)
- if err != nil {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- var areaIds []*rspb.UpdateCoinConfigReq_AreaIds
- err = json.Unmarshal([]byte(req.AreaIds), &areaIds)
- if err != nil {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- if len(areaIds) == 0 {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- var isHasArea bool
- for _, areaInfo := range areaIds {
- if areaInfo.IsAll == 1 {
- isHasArea = true
- break
- }
- if len(areaInfo.List) > 0 {
- isHasArea = true
- break
- }
- }
- if !isHasArea {
- err = ecode.Error(ecode.XLotteryCapsuleAreaParamErr, "必须设置生效分区")
- return nil, err
- }
- var giftIds = make([]int64, 0)
- if req.GiftType == 3 {
- if req.GiftConfig == "" {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- giftConfig := strings.Split(req.GiftConfig, ",")
- for _, giftStr := range giftConfig {
- var giftId int64
- giftId, err = strconv.ParseInt(giftStr, 10, 64)
- if err != nil {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- giftIds = append(giftIds, giftId)
- }
- if len(giftIds) == 0 {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- match, _ := regexp.Compile("^([0-9]+,)*[0-9]+$")
- if !match.MatchString(req.GiftConfig) {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- }
- RPCReq := &rspb.UpdateCoinConfigReq{
- Id: req.Id,
- Title: req.Title,
- ChangeNum: req.ChangeNum,
- StartTime: startTime.Unix(),
- EndTime: endTime.Unix(),
- Status: req.Status,
- GiftType: req.GiftType,
- GiftIds: giftIds,
- AreaIds: areaIds,
- }
- RPCResponse, err = s.capsuleCli.UpdateCoinConfig(ctx, RPCReq)
- if err != nil {
- return
- }
- resp = &v1pb.UpdateCoinConfigRespAdmin{
- Status: RPCResponse.Status,
- }
- return
- }
- // UpdateCoinStatus implementation
- func (s *CapsuleService) UpdateCoinStatus(ctx context.Context, req *v1pb.UpdateCoinStatusReqAdmin) (resp *v1pb.UpdateCoinStatusRespAdmin, err error) {
- var RPCResponse *rspb.UpdateCoinStatusResp
- RPCReq := &rspb.UpdateCoinStatusReq{
- Id: req.Id,
- Status: req.Status,
- }
- if RPCReq.Status != 1 {
- RPCReq.Status = 0
- }
- RPCResponse, err = s.capsuleCli.UpdateCoinStatus(ctx, RPCReq)
- if err != nil {
- return
- }
- resp = &v1pb.UpdateCoinStatusRespAdmin{
- Status: RPCResponse.Status,
- }
- return
- }
- // DeleteCoin implementation
- func (s *CapsuleService) DeleteCoin(ctx context.Context, req *v1pb.DeleteCoinReqAdmin) (resp *v1pb.DeleteCoinRespAdmin, err error) {
- var RPCResponse *rspb.DeleteCoinResp
- RPCReq := &rspb.DeleteCoinReq{
- Id: req.Id,
- }
- RPCResponse, err = s.capsuleCli.DeleteCoin(ctx, RPCReq)
- if err != nil {
- return
- }
- resp = &v1pb.DeleteCoinRespAdmin{
- Status: RPCResponse.Status,
- }
- return
- }
- // GetPoolList implementation
- // `internal:"true"`
- func (s *CapsuleService) GetPoolList(ctx context.Context, req *v1pb.GetPoolListReqAdmin) (resp *v1pb.GetPoolListRespAdmin, err error) {
- var RPCResponse *rspb.GetPoolListResp
- RPCReq := &rspb.GetPoolListReq{
- Page: req.Page,
- PageSize: req.PageSize,
- }
- if RPCReq.Page < 1 {
- RPCReq.Page = 1
- }
- if RPCReq.PageSize < 1 {
- RPCReq.PageSize = 16
- }
- RPCResponse, err = s.capsuleCli.GetPoolList(ctx, RPCReq)
- if err != nil {
- return
- }
- poolList := make([]*v1pb.GetPoolListRespAdmin_List, 0)
- for _, singleList := range RPCResponse.List {
- poolInfo := &v1pb.GetPoolListRespAdmin_List{}
- poolInfo.Id = singleList.Id
- startTimeUnix := time.Unix(singleList.StartTime, 0)
- poolInfo.StartTime = startTimeUnix.Format("2006-01-02 15:04:05")
- endTimeUnix := time.Unix(singleList.EndTime, 0)
- poolInfo.EndTime = endTimeUnix.Format("2006-01-02 15:04:05")
- poolInfo.Title = singleList.Title
- poolInfo.CoinTitle = singleList.CoinTitle
- poolInfo.Status = singleList.Status
- poolInfo.Rule = singleList.Rule
- poolInfo.CoinId = singleList.CoinId
- poolList = append(poolList, poolInfo)
- }
- resp = &v1pb.GetPoolListRespAdmin{
- Total: RPCResponse.Total,
- TotalPage: RPCResponse.TotalPage,
- List: poolList,
- }
- return
- }
- // UpdatePool implementation
- // `method:"POST" internal:"true"`
- func (s *CapsuleService) UpdatePool(ctx context.Context, req *v1pb.UpdatePoolReqAdmin) (resp *v1pb.UpdatePoolRespAdmin, err error) {
- var RPCResponse *rspb.UpdatePoolResp
- loc, _ := time.LoadLocation("Local")
- startTime, err := time.ParseInLocation("2006-01-02 15:04:05", req.StartTime, loc)
- if err != nil {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- endTime, err := time.ParseInLocation("2006-01-02 15:04:05", req.EndTime, loc)
- if err != nil {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- RPCReq := &rspb.UpdatePoolReq{
- Id: req.Id,
- CoinId: req.CoinId,
- Title: req.Title,
- StartTime: startTime.Unix(),
- EndTime: endTime.Unix(),
- Rule: req.Rule,
- }
- RPCResponse, err = s.capsuleCli.UpdatePool(ctx, RPCReq)
- if err != nil {
- return
- }
- resp = &v1pb.UpdatePoolRespAdmin{
- Status: RPCResponse.Status,
- }
- return
- }
- // DeletePool implementation
- func (s *CapsuleService) DeletePool(ctx context.Context, req *v1pb.DeletePoolReqAdmin) (resp *v1pb.DeletePoolRespAdmin, err error) {
- var RPCResponse *rspb.DeletePoolResp
- RPCReq := &rspb.DeletePoolReq{
- Id: req.Id,
- }
- RPCResponse, err = s.capsuleCli.DeletePool(ctx, RPCReq)
- if err != nil {
- return
- }
- resp = &v1pb.DeletePoolRespAdmin{
- Status: RPCResponse.Status,
- }
- return
- }
- // UpdatePoolStatus implementation
- func (s *CapsuleService) UpdatePoolStatus(ctx context.Context, req *v1pb.UpdatePoolStatusReqAdmin) (resp *v1pb.UpdatePoolStatusRespAdmin, err error) {
- resp = &v1pb.UpdatePoolStatusRespAdmin{}
- data, err := s.capsuleCli.UpdatePoolStatus(ctx, &rspb.UpdatePoolStatusReq{Id: req.Id, Status: req.Status})
- if err != nil {
- return
- }
- resp.Status = data.Status
- return
- }
- // GetPoolPrize implementation
- // `internal:"true"`
- func (s *CapsuleService) GetPoolPrize(ctx context.Context, req *v1pb.GetPoolPrizeReqAdmin) (resp *v1pb.GetPoolPrizeRespAdmin, err error) {
- var RPCResponse *rspb.GetPoolPrizeResp
- RPCReq := &rspb.GetPoolPrizeReq{
- PoolId: req.PoolId,
- }
- RPCResponse, err = s.capsuleCli.GetPoolPrize(ctx, RPCReq)
- if err != nil {
- return
- }
- list := make([]*v1pb.GetPoolPrizeRespAdmin_List, 0)
- for _, poolDetail := range RPCResponse.List {
- singleDetail := &v1pb.GetPoolPrizeRespAdmin_List{}
- singleDetail.Id = poolDetail.Id
- singleDetail.Limit = poolDetail.Limit
- singleDetail.Loop = poolDetail.Loop
- singleDetail.Chance = poolDetail.Chance
- singleDetail.ProType = poolDetail.ProType
- singleDetail.JumpUrl = poolDetail.JumpUrl
- singleDetail.Description = poolDetail.Description
- singleDetail.MobileUrl = poolDetail.MobileUrl
- singleDetail.WebUrl = poolDetail.WebUrl
- singleDetail.Num = poolDetail.Num
- singleDetail.Type = poolDetail.Type
- singleDetail.ObjectId = poolDetail.ObjectId
- singleDetail.Expire = poolDetail.Expire
- singleDetail.PoolId = poolDetail.PoolId
- singleDetail.Name = poolDetail.Name
- singleDetail.Weight = poolDetail.Weight
- singleDetail.WhiteUids = ""
- wlen := len(poolDetail.WhiteUids)
- if wlen > 0 {
- wUids := make([]string, wlen)
- for ix, uid := range poolDetail.WhiteUids {
- wUids[ix] = strconv.FormatInt(uid, 10)
- }
- singleDetail.WhiteUids = strings.Join(wUids, ",")
- }
- list = append(list, singleDetail)
- }
- resp = &v1pb.GetPoolPrizeRespAdmin{
- List: list,
- }
- return
- }
- // UpdatePoolPrize implementation
- // `method:"POST" internal:"true"`
- func (s *CapsuleService) UpdatePoolPrize(ctx context.Context, req *v1pb.UpdatePoolPrizeReqAdmin) (resp *v1pb.UpdatePoolPrizeRespAdmin, err error) {
- chance, err := strconv.ParseFloat(req.Chance, 64)
- if err != nil || chance > 1 {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return
- }
- chance = chance*10000 + 0.5
- whiteUids := make([]int64, 0)
- if req.ProType == 1 {
- if chance < 1 {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return
- }
- req.Loop = 0
- req.Limit = 0
- } else if req.ProType == 2 {
- chance = 0
- if req.Loop < 1 || req.Limit < 1 {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return
- }
- } else if req.ProType == 3 {
- chance = 0
- if req.Loop < 1 || req.Limit < 1 {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return
- }
- } else if req.ProType == 4 {
- chance = 0
- req.Loop = 0
- req.Limit = 0
- if req.WhiteUids == "" {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return
- }
- wUids := strings.Split(req.WhiteUids, ",")
- for _, uidStr := range wUids {
- var uid int64
- uid, err = strconv.ParseInt(uidStr, 10, 64)
- if err != nil {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- whiteUids = append(whiteUids, uid)
- }
- wlen := len(whiteUids)
- if wlen == 0 || wlen > 1000 {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return nil, err
- }
- } else {
- err = ecode.Error(ecode.InvalidParam, "参数错误")
- return
- }
- var RPCResponse *rspb.UpdatePoolPrizeResp
- RPCReq := &rspb.UpdatePoolPrizeReq{
- Id: req.Id,
- PoolId: req.PoolId,
- Type: req.Type,
- Num: req.Num,
- ObjectId: req.ObjectId,
- Expire: req.Expire,
- WebUrl: req.WebUrl,
- MobileUrl: req.MobileUrl,
- Description: req.Description,
- JumpUrl: req.JumpUrl,
- ProType: req.ProType,
- Chance: int64(chance),
- Loop: req.Loop,
- Limit: req.Limit,
- Weight: req.Weight,
- WhiteUids: whiteUids,
- }
- RPCResponse, err = s.capsuleCli.UpdatePoolPrize(ctx, RPCReq)
- if err != nil {
- return
- }
- resp = &v1pb.UpdatePoolPrizeRespAdmin{
- Status: RPCResponse.Status,
- PrizeId: RPCResponse.PrizeId,
- }
- return
- }
- // DeletePoolPrize implementation
- // `method:"POST" internal:"true" `
- func (s *CapsuleService) DeletePoolPrize(ctx context.Context, req *v1pb.DeletePoolPrizeReqAdmin) (resp *v1pb.DeletePoolPrizeRespAdmin, err error) {
- var RPCResponse *rspb.DeletePoolPrizeResp
- RPCReq := &rspb.DeletePoolPrizeReq{
- Id: req.Id,
- }
- RPCResponse, err = s.capsuleCli.DeletePoolPrize(ctx, RPCReq)
- if err != nil {
- return
- }
- resp = &v1pb.DeletePoolPrizeRespAdmin{
- Status: RPCResponse.Status,
- }
- return
- }
- // GetPrizeType implementation
- // `internal:"true"`
- func (s *CapsuleService) GetPrizeType(ctx context.Context, req *v1pb.GetPrizeTypeReq) (resp *v1pb.GetPrizeTypeResp, err error) {
- resp = &v1pb.GetPrizeTypeResp{}
- prizeType, err := s.capsuleCli.GetPrizeType(ctx, &rspb.GetPrizeTypeReq{})
- if err != nil || prizeType == nil {
- return
- }
- resp.List = make([]*v1pb.GetPrizeTypeResp_List, len(prizeType.List))
- for ix, data := range prizeType.List {
- resp.List[ix] = &v1pb.GetPrizeTypeResp_List{Type: data.Type, Name: data.Name}
- }
- return
- }
- // GetPrizeExpire implementation
- // `internal:"true"`
- func (s *CapsuleService) GetPrizeExpire(ctx context.Context, req *v1pb.GetPrizeExpireReq) (resp *v1pb.GetPrizeExpireResp, err error) {
- resp = &v1pb.GetPrizeExpireResp{}
- prizeExpire, err := s.capsuleCli.GetPrizeExpire(ctx, &rspb.GetPrizeExpireReq{})
- if err != nil || prizeExpire == nil {
- return
- }
- resp.List = make([]*v1pb.GetPrizeExpireResp_List, len(prizeExpire.List))
- for ix, data := range prizeExpire.List {
- resp.List[ix] = &v1pb.GetPrizeExpireResp_List{Expire: data.Expire, Name: data.Name}
- }
- return
- }
- // FormatErr format error msg
- func (s *CapsuleService) FormatErr(statusCode *status.Status) (code int32, msg string) {
- gCode := statusCode.Code()
- code = 1
- if gCode == 2 {
- code, _ := strconv.Atoi(statusCode.Message())
- switch code {
- case -400:
- msg = "参数错误"
- case -401:
- msg = "上线失败,概率设置不为1"
- case -402:
- msg = "保底奖池的上下线时间不可修改"
- case -403:
- msg = "保底奖池不可下线"
- case -404:
- msg = "普通扭蛋币不可更改道具类型"
- case -500:
- msg = "内部错误"
- default:
- msg = "内部错误"
- }
- } else {
- msg = "内部错误"
- }
- return
- }
- // GetCouponList implementation
- // `internal:"true"`
- func (s *CapsuleService) GetCouponList(ctx context.Context, req *v1pb.CapsuleGetCouponListReq) (resp *v1pb.CapsuleGetCouponListResp, err error) {
- resp = &v1pb.CapsuleGetCouponListResp{}
- couponList, err := s.capsuleCli.GetCouponList(ctx, &rspb.CapsuleGetCouponListReq{Uid: req.Uid})
- if err != nil || couponList == nil {
- return
- }
- resp.List = make([]*v1pb.CapsuleGetCouponListResp_List, len(couponList.List))
- for ix, conpon := range couponList.List {
- resp.List[ix] = &v1pb.CapsuleGetCouponListResp_List{}
- resp.List[ix].Uid = req.Uid
- resp.List[ix].Status = conpon.Status
- resp.List[ix].AwardTime = conpon.AwardTime
- resp.List[ix].RetryTime = conpon.RetryTime
- resp.List[ix].AwardName = conpon.AwardName
- resp.List[ix].AwardCode = conpon.AwardCode
- }
- return
- }
|