package controller import ( "errors" "fmt" "github.com/codinl/go-logger" "github.com/gin-gonic/gin" "mh-server/lib/auth" "mh-server/lib/status" "mh-server/lib/utils" "mh-server/lib/wxpay" "mh-server/model" "time" ) func UserRedeemCodeList(c *gin.Context) { req := &struct { Status string `json:"status"` }{} if c.ShouldBindJSON(req) != nil { logger.Errorf("para err") RespJson(c, status.BadRequest, nil) return } uc := auth.GetCurrentUser(c) if uc == nil { RespJson(c, status.Unauthorized, nil) return } codeList, err := model.UserRedeemCodeList(uc.Uid, req.Status) if err != nil { logger.Errorf("err:%#v", err) RespJson(c, status.InternalServerError, nil) return } RespOK(c, codeList) } func UserConvertRedeemCode(c *gin.Context) { req := &struct { SerialCode string `json:"serial_code"` }{} if c.ShouldBindJSON(req) != nil { logger.Errorf("para err") RespJson(c, status.BadRequest, nil) return } uc := auth.GetCurrentUser(c) if uc == nil { RespJson(c, status.Unauthorized, nil) return } err := model.UserRedeemCodeConvert(uc.Uid, req.SerialCode) if err != nil { logger.Errorf("err:%#v", err) RespJson(c, status.InternalServerError, nil) return } RespOK(c, nil) } func UserMemberRenewalState(c *gin.Context) { uc := auth.GetCurrentUser(c) if uc == nil { RespJson(c, status.Unauthorized, nil) return } user := model.GetUserByUid(uc.Uid) if !user.IsMember() { RespOK(c, map[string]interface{}{ "is_pop": true, "is_member_renewal": false, }) return } var activityMemberRenewal model.ActivityMemberRenewal //err := model.NewActivityMemberRenewalQuerySet(model.DB).UidEq(uc.Uid).ActivityIdEq(1).StateEq(1). // One(&activityMemberRenewal) err := model.NewActivityMemberRenewalQuerySet(model.DB).UidEq(uc.Uid).ActivityIdEq(1).OrderDescByID(). Limit(1).One(&activityMemberRenewal) if err != nil && err != model.RecordNotFound { logger.Error("activity member renewal err:", err) RespJson(c, status.InternalServerError, nil) return } isPop := true if err == model.RecordNotFound || uint32(user.MemberExpire.Unix()) != activityMemberRenewal.MemberSerial { //if user.MemberExpire.Before(utils.Now().AddDate(0, 1, 0)) && // user.MemberExpire.After(utils.Now()) { if user.MemberExpire.Before(utils.Now().AddDate(0, 0, model.GetActivityRenewalConfig().PopTrap)) { activityMemberRenewal = model.ActivityMemberRenewal{ ActivityId: 1, Uid: uc.Uid, State: 1, StartTime: utils.Now(), IsPop: true, MemberLevel: user.MemberLevel, MemberSerial: uint32(user.MemberExpire.Unix()), } err = model.DB.Create(&activityMemberRenewal).Error if err != nil { logger.Error("create activity member renewal err:", err) RespJson(c, status.InternalServerError, nil) return } go func() { renewalLog, _ := model.GetActionUserRenewalLog(uc.Uid, model.UserRenewalLogActionPop) userLog := &model.UserRenewalLog{ Uid: uc.Uid, Action: model.UserRenewalLogActionPop, MemberExpire: user.MemberExpire, Type: 0, RenewalNum: renewalLog.RenewalNum + 1, Serial: uint32(user.MemberExpire.Unix()), } _ = userLog.Add() }() isPop = false } } if activityMemberRenewal.StartTime.AddDate(0, 0, model.GetActivityRenewalConfig().ActivityContinuity).Before(utils.Now()) { activityMemberRenewal.State = 3 _, err = model.NewActivityMemberRenewalQuerySet(model.DB).IDEq(activityMemberRenewal.ID).GetUpdater(). SetState(3).UpdateNum() if err != nil { logger.Error("update num err:", err) RespJson(c, status.InternalServerError, nil) return } } isMemberRenewal := false if activityMemberRenewal.State == 1 { isMemberRenewal = true } ret := make(map[string]interface{}, 0) ret["is_pop"] = isPop ret["is_member_renewal"] = isMemberRenewal RespOK(c, ret) return } func UserMemberRenewalInfo(c *gin.Context) { uc := auth.GetCurrentUser(c) if uc == nil { RespJson(c, status.Unauthorized, nil) return } //uc := auth.UserClaims{Uid: 5640286} var renewal model.ActivityMemberRenewal err := model.NewActivityMemberRenewalQuerySet(model.DB).UidEq(uc.Uid).ActivityIdEq(1). StateEq(1).One(&renewal) if err != nil && err != model.RecordNotFound { logger.Error("renewal err:", err) RespJson(c, status.InternalServerError, nil) return } if err == model.RecordNotFound { RespJson(c, status.InternalServerError, nil) return } var coupons []model.Coupon err = model.NewCouponQuerySet(model.DB).ActivityIdEq(renewal.ActivityId).All(&coupons) if err != nil { logger.Error("coupons err:", err) RespJson(c, status.InternalServerError, nil) return } var userCoupons []model.UserCoupon //err = model.NewUserCouponQuerySet(model.DB).UidEq(uc.Uid).ActivityIdEq(renewal.ActivityId). // StateEq(1).All(&userCoupons) now := time.Now() err = model.NewUserCouponQuerySet(model.DB).UidEq(uc.Uid).ActivityIdEq(renewal.ActivityId). ActiveStartLte(now).ActiveEndGte(now).All(&userCoupons) if err != nil { logger.Error("userCoupons err:", err) RespJson(c, status.InternalServerError, nil) return } user := model.GetUserByUid(uc.Uid) exist, err := model.QueryRecordExist( fmt.Sprintf("SELECT * FROM user_renewal_log WHERE uid = %d AND action=2 AND serial=%d", uc.Uid, user.MemberExpire.Unix())) if err != nil { logger.Error("user log exist err:", err) } if err == nil && !exist { go func() { renewalLog, _ := model.GetActionUserRenewalLog(uc.Uid, model.UserRenewalLogActionEnterActivity) userLog := &model.UserRenewalLog{ Uid: uc.Uid, Action: model.UserRenewalLogActionEnterActivity, MemberExpire: user.MemberExpire, Type: 0, RenewalNum: renewalLog.RenewalNum + 1, Serial: uint32(user.MemberExpire.Unix()), } _ = userLog.Add() }() } userCouponMap := make(map[uint32]*model.UserCoupon, 0) for i, _ := range userCoupons { userCouponMap[userCoupons[i].CouponId] = &userCoupons[i] } for i, _ := range coupons { _, ok := userCouponMap[coupons[i].ID] if ok { coupons[i].IsDraw = true } } down := int64(model.GetActivityRenewalConfig().ActivityContinuity)*24*3600 - (utils.Now().Unix() - renewal.StartTime.Unix()) ret := map[string]interface{}{ "coupon_list": coupons, "renewal": renewal, "time_down": down, } RespOK(c, ret) return } func UserMemberRenewalCouponDraw(c *gin.Context) { req := &struct { CouponIds []uint32 `json:"coupon_ids" binding:"required"` }{} if c.ShouldBindJSON(req) != nil { logger.Errorf("para err") RespJson(c, status.BadRequest, nil) return } uc := auth.GetCurrentUser(c) if uc == nil { RespJson(c, status.Unauthorized, nil) return } if len(req.CouponIds) == 0 { logger.Errorf("para err") RespOK(c, nil) return } user := model.GetUserByUid(uc.Uid) var activityMemberRenewal model.ActivityMemberRenewal err := model.NewActivityMemberRenewalQuerySet(model.DB).UidEq(uc.Uid).OrderDescByID(). Limit(1).One(&activityMemberRenewal) if err != nil { logger.Error("activity member renewal err:", err) RespJson(c, status.InternalServerError, nil) return } if !user.IsMember() || activityMemberRenewal.State == 3 { logger.Error("user coupon err") RespJson(c, status.InternalServerError, nil) return } var userCoupons []model.UserCoupon err = model.NewUserCouponQuerySet(model.DB).UidEq(uc.Uid).ActivityTypeEq(1). StateEq(1).All(&userCoupons) if err != nil { logger.Error("coupons err:", err) RespJson(c, status.InternalServerError, nil) return } userCouponMap := make(map[uint32]int, 0) for i, _ := range userCoupons { userCouponMap[userCoupons[i].CouponId] = i } var coupons []model.Coupon err = model.NewCouponQuerySet(model.DB).IDIn(req.CouponIds...).All(&coupons) if err != nil { logger.Error("coupons err:", err) RespJson(c, status.InternalServerError, nil) return } for i, _ := range coupons { _, ok := userCouponMap[coupons[i].ID] if ok { continue } go func() { action := 0 if coupons[i].MemberLevel == 2 { action = model.UserRenewalLogActionPickGold } else if coupons[i].MemberLevel == 4 { action = model.UserRenewalLogActionPickPlatinum } else if coupons[i].MemberLevel == 5 { action = model.UserRenewalLogActionPickBlackGold } renewalLog, _ := model.GetActionUserRenewalLog(uc.Uid, uint32(action)) userLog := &model.UserRenewalLog{ Uid: uc.Uid, Action: uint32(action), MemberExpire: user.MemberExpire, Type: 0, RenewalNum: renewalLog.RenewalNum + 1, Serial: uint32(user.MemberExpire.Unix()), } _ = userLog.Add() }() userCoupon := &model.UserCoupon{ Uid: uc.Uid, CouponId: coupons[i].ID, CouponType: coupons[i].CouponType, ActivityType: coupons[i].ActivityType, ActivityId: coupons[i].ActivityId, Value: coupons[i].Value, State: 1, ActiveStart: time.Now(), ActiveEnd: time.Now().AddDate(0, 0, model.GetActivityRenewalConfig().CouponValidity), MemberLevel: coupons[i].MemberLevel, } err = model.DB.Create(userCoupon).Error if err != nil { logger.Error("user coupon err:", err) continue } } RespOK(c, nil) return } func PostagePackageBuy(c *gin.Context) { //req := struct { //}{} //if err := c.ShouldBindJSON(&req); err != nil { // logger.Error(err) // RespJson(c, status.BadRequest, nil) // return //} uc := auth.GetCurrentUser(c) if uc == nil { RespJson(c, status.Unauthorized, nil) return } //uc = new(auth.UserClaims) //uc.Uid = 14531402 user := model.GetUserByUid(uc.Uid) if user == nil { logger.Error("user is nil") RespJson(c, status.InternalServerError, nil) return } if !user.IsMember() || user.MemberExpire.Before(time.Now()) { logger.Error("user not member") RespJson(c, status.NotMember, nil) return } info, err := model.PostagePackageFeeConfigInfo() if err != nil { logger.Error("postage package fee err:", err) RespJson(c, status.InternalServerError, nil) return } orderSn := model.GetOrderSn() err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, MemberLevel: user.MemberLevel, OrderType: 11, UserCouponId: 0, Attach: wxpay.WxPayPostagePackage}.Insert() if err != nil { logger.Error(errors.New("web pay err")) RespJson(c, status.InternalServerError, nil) return } configInfo, err := model.PayConfigInfo() if err != nil { logger.Error(err) RespJson(c, status.InternalServerError, nil) return } //webPay, err := wxpay.WebPay(orderSn, info.PostagePackageFee, user.WxOpenID, "N", wxpay.WxPayPostagePackage, configInfo.NotifyUrl) //if err != nil { // logger.Error(errors.New("web pay err")) // RespJson(c, status.InternalServerError, nil) // return //} webPay, err := wxpay.HmJsPayUnifiedOrder(orderSn, info.PostagePackageFee, user.WxOpenID, configInfo.NotifyUrl) if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) return } go func() { action, err := model.IsFirstUserAction(uc.Uid, 2) if err != nil { logger.Error("user action exist err:", err) RespJson(c, status.InternalServerError, nil) return } first := uint32(0) if !action { first = 1 } log := &model.UserActionLog{ Uid: uc.Uid, ActionType: 2, First: first, } err = model.DB.Create(log).Error if err != nil { logger.Error("create user action log err:", err) RespJson(c, status.InternalServerError, nil) return } }() tips := fmt.Sprintf("支付成功,会员已延长%d天", model.GetPostagePackageMemberDuration(user.MemberLevel)) ret := map[string]interface{}{ "web_pay": webPay, "tip": tips, } RespOK(c, ret) return } func UserCouponList(c *gin.Context) { req := struct { PageIdx int `json:"page_idx"` PageSize int `json:"page_size"` ActivityType uint32 `json:"activity_type"` // 活动类型 1-会员续费 2-关注公众号 3-运费包 }{} if err := c.ShouldBindJSON(&req); err != nil { logger.Error(err) RespJson(c, status.BadRequest, nil) return } uc := auth.GetCurrentUser(c) if uc == nil { logger.Error("uc is nil") RespJson(c, status.Unauthorized, nil) return } user := model.GetUserByUid(uc.Uid) if user == nil { logger.Error("user err") RespJson(c, status.InternalServerError, nil) return } page := req.PageIdx - 1 if page < 0 { page = 0 } if req.PageSize == 0 { req.PageSize = 10 } qs := model.NewUserCouponQuerySet(model.DB).UidEq(uc.Uid).StateEq(1) if req.ActivityType != 0 { qs = qs.ActivityTypeEq(3) } count, err := qs.Count() if err != nil { logger.Error("count err:", err) RespJson(c, status.InternalServerError, nil) return } totalPage := count/req.PageSize + 1 var coupons []model.UserCoupon err = qs.OrderAscByID().Offset(page * req.PageSize).Limit(req.PageSize).All(&coupons) if err != nil && err != model.RecordNotFound { logger.Error(err) RespJson(c, status.InternalServerError, nil) return } for i, _ := range coupons { if !user.IsMember() && coupons[i].ActivityType == 1 { coupons[i].Availability = 1 } else { coupons[i].Availability = 2 } } ret := map[string]interface{}{ "list": coupons, "total_page": totalPage, "page_idx": req.PageIdx, } RespOK(c, ret) return } func PostagePackageInfo(c *gin.Context) { //req := struct { //}{} //if err := c.ShouldBindJSON(&req); err != nil { // logger.Error(err) // RespJson(c, status.BadRequest, nil) // return //} uc := auth.GetCurrentUser(c) if uc == nil { logger.Error("uc is nil") RespJson(c, status.Unauthorized, nil) return } action, err := model.IsFirstUserAction(uc.Uid, 1) if err != nil { logger.Error("user action exist err:", err) RespJson(c, status.InternalServerError, nil) return } first := uint32(0) if !action { first = 1 } log := model.UserActionLog{ Uid: uc.Uid, ActionType: 1, First: first, } err = model.DB.Create(log).Error if err != nil { logger.Error("create user action log err:", err) RespJson(c, status.InternalServerError, nil) return } RespOK(c, nil) return } func MemberRenewalUserCouponList(c *gin.Context) { req := struct { PageIdx int `json:"page_idx"` PageSize int `json:"page_size"` State uint32 `json:"state"` // 1-未使用 2-已使用 3-已过期 }{} if err := c.ShouldBindJSON(&req); err != nil { logger.Error(err) RespJson(c, status.BadRequest, nil) return } uc := auth.GetCurrentUser(c) if uc == nil { RespJson(c, status.Unauthorized, nil) return } user := model.GetUserByUid(uc.Uid) if user == nil { logger.Error("user err:") RespJson(c, status.InternalServerError, nil) return } page := req.PageIdx - 1 if page < 0 { page = 0 } if req.PageSize == 0 { req.PageSize = 10 } qs := model.NewUserCouponQuerySet(model.DB).UidEq(uc.Uid) if req.State != 0 { qs = qs.StateEq(req.State) } count, err := qs.Count() if err != nil { logger.Error("count err:", err) RespJson(c, status.InternalServerError, nil) return } totalPage := count/req.PageSize + 1 var coupons []model.UserCoupon err = qs.OrderDescByID().Offset(page * req.PageSize).Limit(req.PageSize).All(&coupons) if err != nil && err != model.RecordNotFound { logger.Error("coupons err:", err) RespJson(c, status.InternalServerError, nil) return } ids := make([]uint32, 0) for i, _ := range coupons { if coupons[i].ActiveEnd.Before(time.Now()) && coupons[i].State != 3 { ids = append(ids, coupons[i].ID) coupons[i].State = 3 } } list := make([]model.UserCoupon, 0, len(coupons)) for i, _ := range coupons { if !user.IsMember() && coupons[i].ActivityType == 1 { continue } if user.MemberGenre == 201 || user.MemberGenre == 202 { coupons[i].Availability = 1 } list = append(list, coupons[i]) } if len(ids) > 0 { err = model.NewUserCouponQuerySet(model.DB).IDIn(ids...).GetUpdater().SetState(3).Update() if err != nil { logger.Error("update user coupon err:", err) } } ret := map[string]interface{}{ "list": list, "total_page": totalPage, "page_idx": req.PageIdx, } RespOK(c, ret) return }