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 }