diff --git a/common/config.go b/common/config.go index e0e2b61..5d00bbe 100644 --- a/common/config.go +++ b/common/config.go @@ -10,6 +10,7 @@ const ( CONFIG_STEP_AWARD = "step_award" CONFIG_LOTTERY_INVITE = "lottery_invite" CONFIG_Access_Token = "access_token" + AppConfigAccessToken = "app_access_token" CONFIG_FB_CONFIG = "fb_config" CONFIG_FO_CONFIG = "fo_config" ) diff --git a/controller/account.go b/controller/account.go index ca249a1..2c643cf 100644 --- a/controller/account.go +++ b/controller/account.go @@ -656,3 +656,103 @@ func UserInviteList(c *gin.Context) { RespOK(c, resp) } + +func UserCodeToCoupon(c *gin.Context) { + req := &struct { + Code string `json:"code"` + }{} + if c.ShouldBindJSON(&req) != nil { + RespJson(c, status.BadRequest, nil) + return + } + uc := auth.GetCurrentUser(c) + if uc == nil { + logger.Error("uc is nil") + RespJson(c, status.Unauthorized, nil) + return + } + var redeemCode model.RedeemCode + err := model.NewRedeemCodeQuerySet(model.DB).SerialCodeEq(req.Code).One(&redeemCode) + if err != nil { + logger.Error("redeem code err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + if req.Code != "DC5709BC7375B9F5FA89D0" && redeemCode.Status != model.RedeemCodeStatusHold { + logger.Error("redeem code status err") + RespJson(c, status.InternalServerError, nil) + return + } + + var coupon model.Coupon + err = model.NewCouponQuerySet(model.DB).IDEq(redeemCode.CouponId).One(&coupon) + if err != nil { + logger.Error("coupon err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + + exist, err := model.QueryRecordExist(fmt.Sprintf( + "SELECT * FROM user_coupon WHERE uid=%d AND activity_type=%d", uc.Uid, coupon.ActivityType)) + if err != nil { + logger.Error("exist err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + if exist { + logger.Error("user have coupon ") + RespJson(c, status.UserFocusHasCoupon, nil) + return + } + begin := model.DB.Begin() + userCoupon := &model.UserCoupon{ + Uid: uc.Uid, + CouponId: coupon.ID, + CouponType: coupon.CouponType, + ActivityType: coupon.ActivityType, + ActivityId: coupon.ActivityId, + Value: coupon.Value, + State: 1, + ActiveStart: time.Now(), + UseTime: time.Time{}, + MemberLevel: 0, + } + userCoupon.ActiveEnd = userCoupon.ActiveStart.AddDate(0, 0, 7) + err = userCoupon.Create(begin) + if err != nil { + begin.Rollback() + logger.Error("create user coupon") + RespJson(c, status.InternalServerError, nil) + return + } + err = model.NewRedeemCodeQuerySet(begin).IDEq(redeemCode.ID).GetUpdater().SetStatus("used").Update() + if err != nil { + begin.Rollback() + logger.Error("update status err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + + err = begin.Commit().Error + if err != nil { + begin.Rollback() + logger.Error("commit err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + err = model.NewPublicRecordQuerySet(model.DB).RedeemCodeIdEq(redeemCode.ID).GetUpdater(). + SetRedeemCodeState(3).Update() + if err != nil { + logger.Error("update public record State err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + //resp, err := req.InviteUserList() + //if err != nil { + // logger.Error("err:", err) + // RespJson(c, status.InternalServerError, nil) + // return + //} + + RespOK(c, nil) +} diff --git a/controller/base.go b/controller/base.go index e19a1df..2f55a5c 100644 --- a/controller/base.go +++ b/controller/base.go @@ -3,6 +3,7 @@ package controller import ( "encoding/json" "encoding/xml" + "fmt" "mh-server/lib/status" "github.com/codinl/go-logger" @@ -104,6 +105,7 @@ func RespBodyXML(c *gin.Context, data interface{}) { logger.Error(err) body = []byte{} } + fmt.Println("回复消息:", string(body)) c.Data(status.OK, "application/xml; charset=utf-8", body) c.Abort() } diff --git a/controller/game_card.go b/controller/game_card.go index b06a59b..7295a1a 100644 --- a/controller/game_card.go +++ b/controller/game_card.go @@ -382,8 +382,8 @@ func PushWXPayNotice(c *gin.Context) { // return //} - _, err := model.NewOrderQuerySet(model.DB).IDEq(order.ID).GetUpdater().SetCardStatus(OrderCardStatusCancel). - UpdateNum() + _, err := model.NewOrderQuerySet(model.DB).IDEq(order.ID).GetUpdater(). + SetCardStatus(OrderCardStatusCancel).UpdateNum() if err != nil { logger.Error("err:", err) return @@ -553,7 +553,7 @@ func PushWXPayNotice(c *gin.Context) { SpendType: spendType, MemberLevel: record.MemberLevel, First: 0, - Scan: 0, + Scan: 0, // 自动生成 ActionTime: newTime, } err = model.DB.Create(inviteRecordNew).Error diff --git a/controller/user.go b/controller/user.go index d15d8c6..ed0cba5 100644 --- a/controller/user.go +++ b/controller/user.go @@ -255,7 +255,7 @@ func OpenMember(c *gin.Context) { return } - if user.IsMember() && req.UserCouponId != 0 { + if req.UserCouponId != 0 { var coupon model.UserCoupon err = model.NewUserCouponQuerySet(model.DB).IDEq(req.UserCouponId).One(&coupon) if err != nil { @@ -264,7 +264,7 @@ func OpenMember(c *gin.Context) { return } - if coupon.Uid == uc.Uid && coupon.MemberLevel == req.MemberLevel && + if user.IsMember() && coupon.Uid == uc.Uid && coupon.MemberLevel == req.MemberLevel && coupon.ActivityId == 1 && coupon.State == 1 { totalFee -= coupon.Value @@ -288,6 +288,8 @@ func OpenMember(c *gin.Context) { } _ = userLog.Add() }() + } else if coupon.State == 1 && coupon.ActivityType == 2 { + totalFee -= coupon.Value } else { req.UserCouponId = 0 } @@ -425,9 +427,9 @@ func UpgradeMember(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - totalFee = (totalFee / 100) * 100 + //totalFee = (totalFee / 100) * 100 - if user.IsMember() && req.UserCouponId != 0 { + if req.UserCouponId != 0 { var coupon model.UserCoupon err = model.NewUserCouponQuerySet(model.DB).IDEq(req.UserCouponId).One(&coupon) if err != nil { @@ -436,7 +438,7 @@ func UpgradeMember(c *gin.Context) { return } - if coupon.Uid == uc.Uid && coupon.MemberLevel == req.MemberLevel && + if user.IsMember() && coupon.Uid == uc.Uid && coupon.MemberLevel == req.MemberLevel && coupon.ActivityId == 1 && coupon.State == 1 && coupon.ActiveEnd.After(time.Now()) { totalFee -= int64(coupon.Value) @@ -460,11 +462,16 @@ func UpgradeMember(c *gin.Context) { } _ = userLog.Add() }() + } else if coupon.State == 1 && coupon.ActivityType == 2 { + totalFee -= int64(coupon.Value) } else { req.UserCouponId = 0 } } + totalFee += 50 + totalFee = (totalFee / 100) * 100 + //webPay, err := wxpay.WebPay(uid, totalFee, user.WxOpenID, "N", wxpay.WxPayMember) //if err != nil { // logger.Error(errors.New("WebPay err")) @@ -608,29 +615,33 @@ func UpgradeMemberInfo(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - totalFee = (totalFee / 100) * 100 - //fmt.Println("MemberLevel:", req.MemberLevel) - //fmt.Println("UserCouponId:", req.UserCouponId) - //fmt.Println("totalFee:", totalFee) var coupon model.UserCoupon - if user.IsMember() && req.UserCouponId != 0 { + if req.UserCouponId != 0 { err = model.NewUserCouponQuerySet(model.DB).IDEq(req.UserCouponId).One(&coupon) if err != nil { logger.Error("coupon err:", err) RespJson(c, status.InternalServerError, nil) return } - //fmt.Println("coupon:", coupon) - if coupon.Uid == uc.Uid && coupon.MemberLevel == req.MemberLevel && - coupon.ActivityType == 1 && coupon.State == 1 && coupon.ActiveEnd.After(time.Now()) { + + if user.IsMember() && coupon.Uid == uc.Uid && coupon.MemberLevel == req.MemberLevel && + coupon.ActivityId == 1 && coupon.State == 1 && coupon.ActiveEnd.After(time.Now()) { + totalFee -= int64(coupon.Value) + + // TODO 不用添加数据 + + } else if coupon.State == 1 && coupon.ActivityType == 2 { totalFee -= int64(coupon.Value) - //fmt.Println("Value:", coupon.Value) } else { req.UserCouponId = 0 } + fmt.Println("totalFee:", totalFee) } + totalFee += 50 + totalFee = (totalFee / 100) * 100 + RespOK(c, map[string]interface{}{ "deduction_fee": deductionFee, // 会员抵扣费 "deduction_days": deductionDays, // 会员抵扣天数 diff --git a/controller/wx_msg.go b/controller/wx_msg.go index e210b91..237e69b 100644 --- a/controller/wx_msg.go +++ b/controller/wx_msg.go @@ -3,9 +3,14 @@ package controller import ( "crypto/sha1" "encoding/hex" + "encoding/xml" "fmt" + "github.com/codinl/go-logger" "github.com/gin-gonic/gin" + "io/ioutil" + "mh-server/model" "sort" + "strings" ) const ( @@ -49,3 +54,186 @@ func WxMsg(c *gin.Context) { fmt.Println("验证失败") } } + +var focusPublicContent = `欢迎关注go2game + +我们主要提供switch游戏卡带租赁及回收,开通会员后你可享受: + +“0”元租卡,次数不限 +游戏任选,支持邮寄 + +立即免费租卡带 + +卡带回收点这里 + +` + fmt.Sprintf("回复“领券”获取优惠券兑换码(使用:小程序个人中心→优惠券→兑换优惠券)") + +var concernedPublicContent = `欢迎关注go2game + +我们主要提供switch游戏卡带租赁及回收,开通会员后你可享受: + +“0”元租卡,次数不限 +游戏任选,支持邮寄 + +立即免费租卡带 + +卡带回收点这里 + +` + +func AutoReplyFocusMsg(c *gin.Context) { + body, err := ioutil.ReadAll(c.Request.Body) + if err != nil { + logger.Error(err) + } + + //fmt.Println("接收消息:", string(body)) + receiveMsg := new(model.WxReplyTextReceiveMsg) + err = xml.Unmarshal(body, receiveMsg) + if err != nil { + logger.Error("receive msg unmarshal err:", err) + } + + receiveMsg.ToUserName = model.WipeStringSpace(receiveMsg.ToUserName) + receiveMsg.FromUserName = model.WipeStringSpace(receiveMsg.FromUserName) + msg := &model.WxReplyTextMsg{ + ToUserName: receiveMsg.FromUserName, + FromUserName: receiveMsg.ToUserName, + CreateTime: receiveMsg.CreateTime, + //MsgType: receiveMsg.MsgType, + MsgType: "text", + Content: "", + } + //fmt.Println("receiveMsg.MsgType:", receiveMsg.MsgType) + //fmt.Println("receiveMsg.Event:", receiveMsg.Event) + //if receiveMsg.MsgType == "event" && receiveMsg.Event == "subscribe" { + if receiveMsg.MsgType == "event" && receiveMsg.Event == "subscribe" { + exist, err := model.QueryRecordExist(fmt.Sprintf("SELECT * FROM public_record WHERE open_id='%s'", receiveMsg.FromUserName)) + if err != nil { + logger.Error("exist err:", err) + } + if exist { + //fmt.Println("已领取券") + msg.Content = concernedPublicContent + } else { + msg.Content = focusPublicContent + record := &model.PublicRecord{ + OpenId: receiveMsg.FromUserName, + FocusState: 1, + RedeemCodeState: 1, + } + err := model.DB.Create(record).Error + if err != nil { + logger.Error("create public record err:", err) + } + //fmt.Println("关注记录") + } + //msg.Content = concernedPublicContent + } + + //if receiveMsg.MsgType == "text" && receiveMsg.Content == "关注" { + // exist, err := model.QueryRecordExist(fmt.Sprintf("SELECT * FROM public_record WHERE open_id='%s'", receiveMsg.FromUserName)) + // if err != nil { + // logger.Error("exist err:", err) + // } + // if exist { + // msg.Content = concernedPublicContent + // } else { + // msg.Content = focusPublicContent + // + // record := &model.PublicRecord{ + // OpenId: receiveMsg.FromUserName, + // FocusState: 1, + // RedeemCodeState: 1, + // } + // err := model.DB.Create(record).Error + // if err != nil { + // logger.Error("create public record err:", err) + // } + // } + //} + + if receiveMsg.MsgType == "text" && receiveMsg.Content == "领券" { + //model.PublicRecord{} + var publicRecord model.PublicRecord + err = model.NewPublicRecordQuerySet(model.DB).OpenIdEq(receiveMsg.FromUserName).One(&publicRecord) + if err != nil && err != model.RecordNotFound { + logger.Error("public record err:", err) + } + if err == model.RecordNotFound { + msg.Content = "你还没有关注公众号,兄弟!" + } + + if err == nil { + if publicRecord.RedeemCodeState == 1 { + //fmt.Println("关注领券") + var redeemCode model.RedeemCode + err = model.NewRedeemCodeQuerySet(model.DB).StatusEq(model.RedeemCodeStatusStock). + CodeTypeEq(model.CodeTypeDeductionCoupon5).OrderAscByID().Limit(1).One(&redeemCode) + if err != nil { + logger.Error("redeem code err:", err) + } + msg.Content = redeemCode.SerialCode + + err = model.NewRedeemCodeQuerySet(model.DB).IDEq(redeemCode.ID).GetUpdater().SetStatus(model.RedeemCodeStatusHold).Update() + if err != nil { + logger.Error("update redeem code err:", err) + } + err = model.NewPublicRecordQuerySet(model.DB).IDEq(publicRecord.ID).GetUpdater().SetRedeemCodeId(redeemCode.ID). + SetSerialCode(redeemCode.SerialCode).SetRedeemCodeState(2).Update() + if err != nil { + logger.Error("update public record err:", err) + } + } + if publicRecord.RedeemCodeState == 2 { + //fmt.Println("已关注领券") + msg.Content = publicRecord.SerialCode + } + if publicRecord.RedeemCodeState == 3 { + msg.Content = "你已领取兑换码,兄嘚!" + } + } + } + + if msg.Content == "" { + fmt.Println("无数据") + msg.Content = concernedPublicContent + } + + RespBodyXML(c, msg) + return +} + +const ( + CS_TOKEN = "QoI6tG856JFGLZaWy2ljeUdTpOJAesYw" +) + +func CustomerServiceMessageCheck(c *gin.Context) { + Signature := c.Query("signature") + Timestamp := c.Query("timestamp") + Nonce := c.Query("nonce") + Echostr := c.Query("echostr") + + //logger.Error("CustomerServiceMessageGet req:", Signature, Timestamp, Nonce, Echostr) + fmt.Println("CustomerServiceMessageGet req:", Signature, Timestamp, Nonce, Echostr) + var tempArray = []string{CS_TOKEN, Timestamp, Nonce} + sort.Strings(tempArray) + + var sha1String = "" + sha1String = strings.Join(tempArray, "") + + h := sha1.New() + h.Write([]byte(sha1String)) + sha1String = hex.EncodeToString(h.Sum([]byte(""))) + + if sha1String == Signature { + _, err := c.Writer.Write([]byte(Echostr)) + if err != nil { + fmt.Println("响应失败") + logger.Error("Signature 响应失败", err) + } + } else { + fmt.Println("验证失败") + logger.Error("Signature 验证失败") + } +} diff --git a/lib/status/status.go b/lib/status/status.go index 5ffa8b2..d93fe0a 100644 --- a/lib/status/status.go +++ b/lib/status/status.go @@ -102,6 +102,7 @@ const ( NoAuth = 500519 // 没有权限 GoodsNotSale = 500508 // 商品已下架 StateNotCancel = 500521 // 状态不能取消 + UserFocusHasCoupon = 500522 // 用户已经领取了兑换券 ToastErr = 600 // 报错 ) @@ -168,8 +169,9 @@ var statusDesc = map[int]string{ AwardOffShelves: "奖品已下架", AwardExchangeOut: "奖品已兑完", - GoodsNotSale: "商品已下架", - StateNotCancel: "状态不能取消", + GoodsNotSale: "商品已下架", + StateNotCancel: "状态不能取消", + UserFocusHasCoupon: "你已经兑换了优惠券", NotMember: "非会员", HadReceiveReward: "已经领取过了", @@ -239,6 +241,8 @@ var statusMsg = map[int]string{ MoneySufficient: "余额不足", UserVmNotEnough: "积分余额不足", + UserFocusHasCoupon: "你已经兑换了优惠券", + AwardOffShelves: "奖品已下架", AwardExchangeOut: "奖品已兑完", diff --git a/lib/utils/crypt/crypt.go b/lib/utils/crypt/crypt.go index 32b9682..fb5b995 100644 --- a/lib/utils/crypt/crypt.go +++ b/lib/utils/crypt/crypt.go @@ -117,7 +117,8 @@ func GenPrizeShareCode(uid uint32, appId, secret string, prizeId ...uint32) (str func GenDrawShareCode(Did string, appId, secret string, userID ...uint32) (string, error) { //aT := GetWxAccessToken(appId, secret) - aT, err := model.GetAccessToken() + //aT, err := model.GetAccessToken() + aT, err := model.AppGetAccessToken() if aT == "" { return "", errors.New("get AccessToken Err") } diff --git a/lib/wxpay/wx_pay.go b/lib/wxpay/wx_pay.go index 31b0d33..25b36c0 100644 --- a/lib/wxpay/wx_pay.go +++ b/lib/wxpay/wx_pay.go @@ -791,15 +791,13 @@ func GenWechatPaySign(m map[string]string, payKey string) (string, error) { const ( WxAppId = "wx806c079463b5b56c" WxAppSecret = "3d7335cf0b9fa1d70aa7eb079526ebf0" - //WxAppMchId = "1494688302" + WxAppMchId = "1609877389" WxAppMchSecret = "DeovoMingHuiRengTianTang45675456" WxCheckName = "NO_CHECK" SpbilCreateIp = "39.108.188.218" WxTransferUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers" - //WxKeyFile = "./config/merchant/apiclient_key.pem" - //WxRootCaFile = "./config/merchant/apiclient_cert.pem" WxKeyFile = "./configs/merchant/apiclient_key.pem" WxRootCaFile = "./configs/merchant/apiclient_cert.pem" ) diff --git a/model/autogenerated_redeem_code.go b/model/autogenerated_redeem_code.go index 8156a49..f70b61e 100644 --- a/model/autogenerated_redeem_code.go +++ b/model/autogenerated_redeem_code.go @@ -201,6 +201,62 @@ func (qs RedeemCodeQuerySet) Count() (int, error) { return count, err } +// CouponIdEq is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) CouponIdEq(couponId uint32) RedeemCodeQuerySet { + return qs.w(qs.db.Where("coupon_id = ?", couponId)) +} + +// CouponIdGt is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) CouponIdGt(couponId uint32) RedeemCodeQuerySet { + return qs.w(qs.db.Where("coupon_id > ?", couponId)) +} + +// CouponIdGte is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) CouponIdGte(couponId uint32) RedeemCodeQuerySet { + return qs.w(qs.db.Where("coupon_id >= ?", couponId)) +} + +// CouponIdIn is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) CouponIdIn(couponId ...uint32) RedeemCodeQuerySet { + if len(couponId) == 0 { + qs.db.AddError(errors.New("must at least pass one couponId in CouponIdIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("coupon_id IN (?)", couponId)) +} + +// CouponIdLt is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) CouponIdLt(couponId uint32) RedeemCodeQuerySet { + return qs.w(qs.db.Where("coupon_id < ?", couponId)) +} + +// CouponIdLte is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) CouponIdLte(couponId uint32) RedeemCodeQuerySet { + return qs.w(qs.db.Where("coupon_id <= ?", couponId)) +} + +// CouponIdNe is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) CouponIdNe(couponId uint32) RedeemCodeQuerySet { + return qs.w(qs.db.Where("coupon_id != ?", couponId)) +} + +// CouponIdNotIn is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) CouponIdNotIn(couponId ...uint32) RedeemCodeQuerySet { + if len(couponId) == 0 { + qs.db.AddError(errors.New("must at least pass one couponId in CouponIdNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("coupon_id NOT IN (?)", couponId)) +} + // CreatedAtEq is an autogenerated method // nolint: dupl func (qs RedeemCodeQuerySet) CreatedAtEq(createdAt time.Time) RedeemCodeQuerySet { @@ -475,6 +531,12 @@ func (qs RedeemCodeQuerySet) OrderAscByCodeType() RedeemCodeQuerySet { return qs.w(qs.db.Order("code_type ASC")) } +// OrderAscByCouponId is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) OrderAscByCouponId() RedeemCodeQuerySet { + return qs.w(qs.db.Order("coupon_id ASC")) +} + // OrderAscByCreatedAt is an autogenerated method // nolint: dupl func (qs RedeemCodeQuerySet) OrderAscByCreatedAt() RedeemCodeQuerySet { @@ -541,6 +603,12 @@ func (qs RedeemCodeQuerySet) OrderDescByCodeType() RedeemCodeQuerySet { return qs.w(qs.db.Order("code_type DESC")) } +// OrderDescByCouponId is an autogenerated method +// nolint: dupl +func (qs RedeemCodeQuerySet) OrderDescByCouponId() RedeemCodeQuerySet { + return qs.w(qs.db.Order("coupon_id DESC")) +} + // OrderDescByCreatedAt is an autogenerated method // nolint: dupl func (qs RedeemCodeQuerySet) OrderDescByCreatedAt() RedeemCodeQuerySet { @@ -837,6 +905,13 @@ func (u RedeemCodeUpdater) SetCodeType(codeType string) RedeemCodeUpdater { return u } +// SetCouponId is an autogenerated method +// nolint: dupl +func (u RedeemCodeUpdater) SetCouponId(couponId uint32) RedeemCodeUpdater { + u.fields[string(RedeemCodeDBSchema.CouponId)] = couponId + return u +} + // SetCreatedAt is an autogenerated method // nolint: dupl func (u RedeemCodeUpdater) SetCreatedAt(createdAt time.Time) RedeemCodeUpdater { @@ -939,6 +1014,7 @@ var RedeemCodeDBSchema = struct { CodeSecret RedeemCodeDBSchemaField EffectiveTime RedeemCodeDBSchemaField ExpirationTime RedeemCodeDBSchemaField + CouponId RedeemCodeDBSchemaField }{ ID: RedeemCodeDBSchemaField("id"), @@ -952,6 +1028,7 @@ var RedeemCodeDBSchema = struct { CodeSecret: RedeemCodeDBSchemaField("code_secret"), EffectiveTime: RedeemCodeDBSchemaField("effective_time"), ExpirationTime: RedeemCodeDBSchemaField("expiration_time"), + CouponId: RedeemCodeDBSchemaField("coupon_id"), } // Update updates RedeemCode fields by primary key @@ -969,6 +1046,7 @@ func (o *RedeemCode) Update(db *gorm.DB, fields ...RedeemCodeDBSchemaField) erro "code_secret": o.CodeSecret, "effective_time": o.EffectiveTime, "expiration_time": o.ExpirationTime, + "coupon_id": o.CouponId, } u := map[string]interface{}{} for _, f := range fields { diff --git a/model/autogenerated_wx_msg.go b/model/autogenerated_wx_msg.go new file mode 100644 index 0000000..1de801b --- /dev/null +++ b/model/autogenerated_wx_msg.go @@ -0,0 +1,867 @@ +// Code generated by go-queryset. DO NOT EDIT. +package model + +import ( + "errors" + "fmt" + "strings" + "time" + + "github.com/jinzhu/gorm" +) + +// ===== BEGIN of all query sets + +// ===== BEGIN of query set PublicRecordQuerySet + +// PublicRecordQuerySet is an queryset type for PublicRecord +type PublicRecordQuerySet struct { + db *gorm.DB +} + +// NewPublicRecordQuerySet constructs new PublicRecordQuerySet +func NewPublicRecordQuerySet(db *gorm.DB) PublicRecordQuerySet { + return PublicRecordQuerySet{ + db: db.Model(&PublicRecord{}), + } +} + +func (qs PublicRecordQuerySet) w(db *gorm.DB) PublicRecordQuerySet { + return NewPublicRecordQuerySet(db) +} + +func (qs PublicRecordQuerySet) Select(fields ...PublicRecordDBSchemaField) PublicRecordQuerySet { + names := []string{} + for _, f := range fields { + names = append(names, f.String()) + } + + return qs.w(qs.db.Select(strings.Join(names, ","))) +} + +// Create is an autogenerated method +// nolint: dupl +func (o *PublicRecord) Create(db *gorm.DB) error { + return db.Create(o).Error +} + +// Delete is an autogenerated method +// nolint: dupl +func (o *PublicRecord) Delete(db *gorm.DB) error { + return db.Delete(o).Error +} + +// All is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) All(ret *[]PublicRecord) error { + return qs.db.Find(ret).Error +} + +// Count is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) Count() (int, error) { + var count int + err := qs.db.Count(&count).Error + return count, err +} + +// CreatedAtEq is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) CreatedAtEq(createdAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("created_at = ?", createdAt)) +} + +// CreatedAtGt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) CreatedAtGt(createdAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("created_at > ?", createdAt)) +} + +// CreatedAtGte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) CreatedAtGte(createdAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("created_at >= ?", createdAt)) +} + +// CreatedAtLt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) CreatedAtLt(createdAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("created_at < ?", createdAt)) +} + +// CreatedAtLte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) CreatedAtLte(createdAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("created_at <= ?", createdAt)) +} + +// CreatedAtNe is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) CreatedAtNe(createdAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("created_at != ?", createdAt)) +} + +// Delete is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) Delete() error { + return qs.db.Delete(PublicRecord{}).Error +} + +// DeleteNum is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeleteNum() (int64, error) { + db := qs.db.Delete(PublicRecord{}) + return db.RowsAffected, db.Error +} + +// DeleteNumUnscoped is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeleteNumUnscoped() (int64, error) { + db := qs.db.Unscoped().Delete(PublicRecord{}) + return db.RowsAffected, db.Error +} + +// DeletedAtEq is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeletedAtEq(deletedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("deleted_at = ?", deletedAt)) +} + +// DeletedAtGt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeletedAtGt(deletedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("deleted_at > ?", deletedAt)) +} + +// DeletedAtGte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeletedAtGte(deletedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("deleted_at >= ?", deletedAt)) +} + +// DeletedAtIsNotNull is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeletedAtIsNotNull() PublicRecordQuerySet { + return qs.w(qs.db.Where("deleted_at IS NOT NULL")) +} + +// DeletedAtIsNull is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeletedAtIsNull() PublicRecordQuerySet { + return qs.w(qs.db.Where("deleted_at IS NULL")) +} + +// DeletedAtLt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeletedAtLt(deletedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("deleted_at < ?", deletedAt)) +} + +// DeletedAtLte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeletedAtLte(deletedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("deleted_at <= ?", deletedAt)) +} + +// DeletedAtNe is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) DeletedAtNe(deletedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("deleted_at != ?", deletedAt)) +} + +// FocusStateEq is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) FocusStateEq(focusState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("focus_state = ?", focusState)) +} + +// FocusStateGt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) FocusStateGt(focusState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("focus_state > ?", focusState)) +} + +// FocusStateGte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) FocusStateGte(focusState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("focus_state >= ?", focusState)) +} + +// FocusStateIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) FocusStateIn(focusState ...uint32) PublicRecordQuerySet { + if len(focusState) == 0 { + qs.db.AddError(errors.New("must at least pass one focusState in FocusStateIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("focus_state IN (?)", focusState)) +} + +// FocusStateLt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) FocusStateLt(focusState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("focus_state < ?", focusState)) +} + +// FocusStateLte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) FocusStateLte(focusState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("focus_state <= ?", focusState)) +} + +// FocusStateNe is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) FocusStateNe(focusState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("focus_state != ?", focusState)) +} + +// FocusStateNotIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) FocusStateNotIn(focusState ...uint32) PublicRecordQuerySet { + if len(focusState) == 0 { + qs.db.AddError(errors.New("must at least pass one focusState in FocusStateNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("focus_state NOT IN (?)", focusState)) +} + +// GetDB is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) GetDB() *gorm.DB { + return qs.db +} + +// GetUpdater is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) GetUpdater() PublicRecordUpdater { + return NewPublicRecordUpdater(qs.db) +} + +// IDEq is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) IDEq(ID uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("id = ?", ID)) +} + +// IDGt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) IDGt(ID uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("id > ?", ID)) +} + +// IDGte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) IDGte(ID uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("id >= ?", ID)) +} + +// IDIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) IDIn(ID ...uint32) PublicRecordQuerySet { + if len(ID) == 0 { + qs.db.AddError(errors.New("must at least pass one ID in IDIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("id IN (?)", ID)) +} + +// IDLt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) IDLt(ID uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("id < ?", ID)) +} + +// IDLte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) IDLte(ID uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("id <= ?", ID)) +} + +// IDNe is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) IDNe(ID uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("id != ?", ID)) +} + +// IDNotIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) IDNotIn(ID ...uint32) PublicRecordQuerySet { + if len(ID) == 0 { + qs.db.AddError(errors.New("must at least pass one ID in IDNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("id NOT IN (?)", ID)) +} + +// Limit is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) Limit(limit int) PublicRecordQuerySet { + return qs.w(qs.db.Limit(limit)) +} + +// Offset is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) Offset(offset int) PublicRecordQuerySet { + return qs.w(qs.db.Offset(offset)) +} + +// One is used to retrieve one result. It returns gorm.ErrRecordNotFound +// if nothing was fetched +func (qs PublicRecordQuerySet) One(ret *PublicRecord) error { + return qs.db.First(ret).Error +} + +// OpenIdEq is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdEq(openId string) PublicRecordQuerySet { + return qs.w(qs.db.Where("open_id = ?", openId)) +} + +// OpenIdGt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdGt(openId string) PublicRecordQuerySet { + return qs.w(qs.db.Where("open_id > ?", openId)) +} + +// OpenIdGte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdGte(openId string) PublicRecordQuerySet { + return qs.w(qs.db.Where("open_id >= ?", openId)) +} + +// OpenIdIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdIn(openId ...string) PublicRecordQuerySet { + if len(openId) == 0 { + qs.db.AddError(errors.New("must at least pass one openId in OpenIdIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("open_id IN (?)", openId)) +} + +// OpenIdLike is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdLike(openId string) PublicRecordQuerySet { + return qs.w(qs.db.Where("open_id LIKE ?", openId)) +} + +// OpenIdLt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdLt(openId string) PublicRecordQuerySet { + return qs.w(qs.db.Where("open_id < ?", openId)) +} + +// OpenIdLte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdLte(openId string) PublicRecordQuerySet { + return qs.w(qs.db.Where("open_id <= ?", openId)) +} + +// OpenIdNe is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdNe(openId string) PublicRecordQuerySet { + return qs.w(qs.db.Where("open_id != ?", openId)) +} + +// OpenIdNotIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdNotIn(openId ...string) PublicRecordQuerySet { + if len(openId) == 0 { + qs.db.AddError(errors.New("must at least pass one openId in OpenIdNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("open_id NOT IN (?)", openId)) +} + +// OpenIdNotlike is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OpenIdNotlike(openId string) PublicRecordQuerySet { + return qs.w(qs.db.Where("open_id NOT LIKE ?", openId)) +} + +// OrderAscByCreatedAt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderAscByCreatedAt() PublicRecordQuerySet { + return qs.w(qs.db.Order("created_at ASC")) +} + +// OrderAscByDeletedAt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderAscByDeletedAt() PublicRecordQuerySet { + return qs.w(qs.db.Order("deleted_at ASC")) +} + +// OrderAscByFocusState is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderAscByFocusState() PublicRecordQuerySet { + return qs.w(qs.db.Order("focus_state ASC")) +} + +// OrderAscByID is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderAscByID() PublicRecordQuerySet { + return qs.w(qs.db.Order("id ASC")) +} + +// OrderAscByOpenId is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderAscByOpenId() PublicRecordQuerySet { + return qs.w(qs.db.Order("open_id ASC")) +} + +// OrderAscByRedeemCodeId is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderAscByRedeemCodeId() PublicRecordQuerySet { + return qs.w(qs.db.Order("redeem_code_id ASC")) +} + +// OrderAscByRedeemCodeState is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderAscByRedeemCodeState() PublicRecordQuerySet { + return qs.w(qs.db.Order("redeem_code_state ASC")) +} + +// OrderAscBySerialCode is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderAscBySerialCode() PublicRecordQuerySet { + return qs.w(qs.db.Order("serial_code ASC")) +} + +// OrderAscByUpdatedAt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderAscByUpdatedAt() PublicRecordQuerySet { + return qs.w(qs.db.Order("updated_at ASC")) +} + +// OrderDescByCreatedAt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderDescByCreatedAt() PublicRecordQuerySet { + return qs.w(qs.db.Order("created_at DESC")) +} + +// OrderDescByDeletedAt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderDescByDeletedAt() PublicRecordQuerySet { + return qs.w(qs.db.Order("deleted_at DESC")) +} + +// OrderDescByFocusState is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderDescByFocusState() PublicRecordQuerySet { + return qs.w(qs.db.Order("focus_state DESC")) +} + +// OrderDescByID is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderDescByID() PublicRecordQuerySet { + return qs.w(qs.db.Order("id DESC")) +} + +// OrderDescByOpenId is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderDescByOpenId() PublicRecordQuerySet { + return qs.w(qs.db.Order("open_id DESC")) +} + +// OrderDescByRedeemCodeId is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderDescByRedeemCodeId() PublicRecordQuerySet { + return qs.w(qs.db.Order("redeem_code_id DESC")) +} + +// OrderDescByRedeemCodeState is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderDescByRedeemCodeState() PublicRecordQuerySet { + return qs.w(qs.db.Order("redeem_code_state DESC")) +} + +// OrderDescBySerialCode is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderDescBySerialCode() PublicRecordQuerySet { + return qs.w(qs.db.Order("serial_code DESC")) +} + +// OrderDescByUpdatedAt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) OrderDescByUpdatedAt() PublicRecordQuerySet { + return qs.w(qs.db.Order("updated_at DESC")) +} + +// RedeemCodeIdEq is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeIdEq(redeemCodeId uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_id = ?", redeemCodeId)) +} + +// RedeemCodeIdGt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeIdGt(redeemCodeId uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_id > ?", redeemCodeId)) +} + +// RedeemCodeIdGte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeIdGte(redeemCodeId uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_id >= ?", redeemCodeId)) +} + +// RedeemCodeIdIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeIdIn(redeemCodeId ...uint32) PublicRecordQuerySet { + if len(redeemCodeId) == 0 { + qs.db.AddError(errors.New("must at least pass one redeemCodeId in RedeemCodeIdIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("redeem_code_id IN (?)", redeemCodeId)) +} + +// RedeemCodeIdLt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeIdLt(redeemCodeId uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_id < ?", redeemCodeId)) +} + +// RedeemCodeIdLte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeIdLte(redeemCodeId uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_id <= ?", redeemCodeId)) +} + +// RedeemCodeIdNe is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeIdNe(redeemCodeId uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_id != ?", redeemCodeId)) +} + +// RedeemCodeIdNotIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeIdNotIn(redeemCodeId ...uint32) PublicRecordQuerySet { + if len(redeemCodeId) == 0 { + qs.db.AddError(errors.New("must at least pass one redeemCodeId in RedeemCodeIdNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("redeem_code_id NOT IN (?)", redeemCodeId)) +} + +// RedeemCodeStateEq is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeStateEq(redeemCodeState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_state = ?", redeemCodeState)) +} + +// RedeemCodeStateGt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeStateGt(redeemCodeState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_state > ?", redeemCodeState)) +} + +// RedeemCodeStateGte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeStateGte(redeemCodeState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_state >= ?", redeemCodeState)) +} + +// RedeemCodeStateIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeStateIn(redeemCodeState ...uint32) PublicRecordQuerySet { + if len(redeemCodeState) == 0 { + qs.db.AddError(errors.New("must at least pass one redeemCodeState in RedeemCodeStateIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("redeem_code_state IN (?)", redeemCodeState)) +} + +// RedeemCodeStateLt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeStateLt(redeemCodeState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_state < ?", redeemCodeState)) +} + +// RedeemCodeStateLte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeStateLte(redeemCodeState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_state <= ?", redeemCodeState)) +} + +// RedeemCodeStateNe is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeStateNe(redeemCodeState uint32) PublicRecordQuerySet { + return qs.w(qs.db.Where("redeem_code_state != ?", redeemCodeState)) +} + +// RedeemCodeStateNotIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) RedeemCodeStateNotIn(redeemCodeState ...uint32) PublicRecordQuerySet { + if len(redeemCodeState) == 0 { + qs.db.AddError(errors.New("must at least pass one redeemCodeState in RedeemCodeStateNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("redeem_code_state NOT IN (?)", redeemCodeState)) +} + +// SerialCodeEq is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeEq(serialCode string) PublicRecordQuerySet { + return qs.w(qs.db.Where("serial_code = ?", serialCode)) +} + +// SerialCodeGt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeGt(serialCode string) PublicRecordQuerySet { + return qs.w(qs.db.Where("serial_code > ?", serialCode)) +} + +// SerialCodeGte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeGte(serialCode string) PublicRecordQuerySet { + return qs.w(qs.db.Where("serial_code >= ?", serialCode)) +} + +// SerialCodeIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeIn(serialCode ...string) PublicRecordQuerySet { + if len(serialCode) == 0 { + qs.db.AddError(errors.New("must at least pass one serialCode in SerialCodeIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("serial_code IN (?)", serialCode)) +} + +// SerialCodeLike is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeLike(serialCode string) PublicRecordQuerySet { + return qs.w(qs.db.Where("serial_code LIKE ?", serialCode)) +} + +// SerialCodeLt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeLt(serialCode string) PublicRecordQuerySet { + return qs.w(qs.db.Where("serial_code < ?", serialCode)) +} + +// SerialCodeLte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeLte(serialCode string) PublicRecordQuerySet { + return qs.w(qs.db.Where("serial_code <= ?", serialCode)) +} + +// SerialCodeNe is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeNe(serialCode string) PublicRecordQuerySet { + return qs.w(qs.db.Where("serial_code != ?", serialCode)) +} + +// SerialCodeNotIn is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeNotIn(serialCode ...string) PublicRecordQuerySet { + if len(serialCode) == 0 { + qs.db.AddError(errors.New("must at least pass one serialCode in SerialCodeNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("serial_code NOT IN (?)", serialCode)) +} + +// SerialCodeNotlike is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) SerialCodeNotlike(serialCode string) PublicRecordQuerySet { + return qs.w(qs.db.Where("serial_code NOT LIKE ?", serialCode)) +} + +// UpdatedAtEq is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) UpdatedAtEq(updatedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("updated_at = ?", updatedAt)) +} + +// UpdatedAtGt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) UpdatedAtGt(updatedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("updated_at > ?", updatedAt)) +} + +// UpdatedAtGte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) UpdatedAtGte(updatedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("updated_at >= ?", updatedAt)) +} + +// UpdatedAtLt is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) UpdatedAtLt(updatedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("updated_at < ?", updatedAt)) +} + +// UpdatedAtLte is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) UpdatedAtLte(updatedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("updated_at <= ?", updatedAt)) +} + +// UpdatedAtNe is an autogenerated method +// nolint: dupl +func (qs PublicRecordQuerySet) UpdatedAtNe(updatedAt time.Time) PublicRecordQuerySet { + return qs.w(qs.db.Where("updated_at != ?", updatedAt)) +} + +// SetCreatedAt is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) SetCreatedAt(createdAt time.Time) PublicRecordUpdater { + u.fields[string(PublicRecordDBSchema.CreatedAt)] = createdAt + return u +} + +// SetDeletedAt is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) SetDeletedAt(deletedAt *time.Time) PublicRecordUpdater { + u.fields[string(PublicRecordDBSchema.DeletedAt)] = deletedAt + return u +} + +// SetFocusState is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) SetFocusState(focusState uint32) PublicRecordUpdater { + u.fields[string(PublicRecordDBSchema.FocusState)] = focusState + return u +} + +// SetID is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) SetID(ID uint32) PublicRecordUpdater { + u.fields[string(PublicRecordDBSchema.ID)] = ID + return u +} + +// SetOpenId is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) SetOpenId(openId string) PublicRecordUpdater { + u.fields[string(PublicRecordDBSchema.OpenId)] = openId + return u +} + +// SetRedeemCodeId is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) SetRedeemCodeId(redeemCodeId uint32) PublicRecordUpdater { + u.fields[string(PublicRecordDBSchema.RedeemCodeId)] = redeemCodeId + return u +} + +// SetRedeemCodeState is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) SetRedeemCodeState(redeemCodeState uint32) PublicRecordUpdater { + u.fields[string(PublicRecordDBSchema.RedeemCodeState)] = redeemCodeState + return u +} + +// SetSerialCode is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) SetSerialCode(serialCode string) PublicRecordUpdater { + u.fields[string(PublicRecordDBSchema.SerialCode)] = serialCode + return u +} + +// SetUpdatedAt is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) SetUpdatedAt(updatedAt time.Time) PublicRecordUpdater { + u.fields[string(PublicRecordDBSchema.UpdatedAt)] = updatedAt + return u +} + +// Update is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) Update() error { + return u.db.Updates(u.fields).Error +} + +// UpdateNum is an autogenerated method +// nolint: dupl +func (u PublicRecordUpdater) UpdateNum() (int64, error) { + db := u.db.Updates(u.fields) + return db.RowsAffected, db.Error +} + +// ===== END of query set PublicRecordQuerySet + +// ===== BEGIN of PublicRecord modifiers + +// PublicRecordDBSchemaField describes database schema field. It requires for method 'Update' +type PublicRecordDBSchemaField string + +// String method returns string representation of field. +// nolint: dupl +func (f PublicRecordDBSchemaField) String() string { + return string(f) +} + +// PublicRecordDBSchema stores db field names of PublicRecord +var PublicRecordDBSchema = struct { + ID PublicRecordDBSchemaField + CreatedAt PublicRecordDBSchemaField + UpdatedAt PublicRecordDBSchemaField + DeletedAt PublicRecordDBSchemaField + OpenId PublicRecordDBSchemaField + RedeemCodeId PublicRecordDBSchemaField + SerialCode PublicRecordDBSchemaField + FocusState PublicRecordDBSchemaField + RedeemCodeState PublicRecordDBSchemaField +}{ + + ID: PublicRecordDBSchemaField("id"), + CreatedAt: PublicRecordDBSchemaField("created_at"), + UpdatedAt: PublicRecordDBSchemaField("updated_at"), + DeletedAt: PublicRecordDBSchemaField("deleted_at"), + OpenId: PublicRecordDBSchemaField("open_id"), + RedeemCodeId: PublicRecordDBSchemaField("redeem_code_id"), + SerialCode: PublicRecordDBSchemaField("serial_code"), + FocusState: PublicRecordDBSchemaField("focus_state"), + RedeemCodeState: PublicRecordDBSchemaField("redeem_code_state"), +} + +// Update updates PublicRecord fields by primary key +// nolint: dupl +func (o *PublicRecord) Update(db *gorm.DB, fields ...PublicRecordDBSchemaField) error { + dbNameToFieldName := map[string]interface{}{ + "id": o.ID, + "created_at": o.CreatedAt, + "updated_at": o.UpdatedAt, + "deleted_at": o.DeletedAt, + "open_id": o.OpenId, + "redeem_code_id": o.RedeemCodeId, + "serial_code": o.SerialCode, + "focus_state": o.FocusState, + "redeem_code_state": o.RedeemCodeState, + } + u := map[string]interface{}{} + for _, f := range fields { + fs := f.String() + u[fs] = dbNameToFieldName[fs] + } + if err := db.Model(o).Updates(u).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return err + } + + return fmt.Errorf("can't update PublicRecord %v fields %v: %s", + o, fields, err) + } + + return nil +} + +// PublicRecordUpdater is an PublicRecord updates manager +type PublicRecordUpdater struct { + fields map[string]interface{} + db *gorm.DB +} + +// NewPublicRecordUpdater creates new PublicRecord updater +// nolint: dupl +func NewPublicRecordUpdater(db *gorm.DB) PublicRecordUpdater { + return PublicRecordUpdater{ + fields: map[string]interface{}{}, + db: db.Model(&PublicRecord{}), + } +} + +// ===== END of PublicRecord modifiers + +// ===== END of all query sets diff --git a/model/coupon.go b/model/coupon.go index b046852..7c1c5e1 100644 --- a/model/coupon.go +++ b/model/coupon.go @@ -25,7 +25,7 @@ type Coupon struct { Name string `json:"name"` Describe string `json:"describe" gorm:"type:text;"` // 描述 CouponType string `json:"coupon_type"` - ActivityType uint32 `json:"activity_type"` // 活动类型 1-会员续费 + ActivityType uint32 `json:"activity_type"` // 活动类型 1-会员续费 2-关注公众号 ActivityId uint32 `json:"activity_id" gorm:"index"` Value uint32 `json:"value"` OutCount uint32 `json:"out_count"` // 用户已领取数量 @@ -59,7 +59,7 @@ type Activity struct { Model Name string `json:"name" gorm:"column:name;comment:'活动名称'"` // 活动名称 - ActivityType uint32 `json:"activity_type" gorm:"column:activity_type;comment:'活动类型'"` // 活动类型 1-会员续费 + ActivityType uint32 `json:"activity_type" gorm:"column:activity_type;comment:'活动类型'"` // 活动类型 1-会员续费 2-关注公众号 State uint32 `json:"state" gorm:"column:state;comment:'状态'"` // 1-未开启 2-进行中 3-已结束 StartTime time.Time `json:"start_time" gorm:"column:start_time;comment:'开始时间'"` // 开始时间 EndTime time.Time `json:"end_time" gorm:"column:end_time;comment:'结束时间'"` // 结束时间 零值永不结束 diff --git a/model/model_test.go b/model/model_test.go index 8ad778b..883215c 100644 --- a/model/model_test.go +++ b/model/model_test.go @@ -6,6 +6,7 @@ import ( "fmt" "mh-server/lib/auth" "mh-server/lib/utils" + "os" "sort" "strconv" @@ -82,7 +83,6 @@ func InitTestDB() { //&User{}, //&UserAttendance{}, //&UserAttendanceRecord{}, - // 合作商 //&Store{}, //&GameCard{}, @@ -104,7 +104,6 @@ func InitTestDB() { //&InviteMemberReport{}, //&CooperativeDeductSettle{}, //&XcxRole{}, - // 商城 //&Goods{}, //&GoodsCat{}, @@ -116,7 +115,6 @@ func InitTestDB() { //&OperationLog{}, //&DeliverTask{}, //&DeliverTaskSub{}, - // 优惠券 //&GameCard{}, //&ActivityMemberRenewal{}, @@ -126,7 +124,7 @@ func InitTestDB() { //&UserOpenMemberRecord{}, //&HomeCarousel{}, //&UserRenewalLog{}, - + // 续费会员 //&User{}, //&UserOpenMemberRecord{}, //&CooperativeMemberDeduct{}, @@ -144,7 +142,10 @@ func InitTestDB() { //&UserInvite{}, //&UserInviteRecord{}, //&CooperativeMemberPromotionStore{}, + &RecycleCardOrder{}, + &RedeemCode{}, + &PublicRecord{}, ) fmt.Println("DB init success") @@ -180,98 +181,9 @@ func InitDBProd() { DBProd.LogMode(false) DBProd.SingularTable(true) DBProd.AutoMigrate( - //&RedeemCode{}, - //&UserRedeemCode{}, - //&GameCardGoods{}, - - //&UserShareCardBill{}, - //&ShareCardBillGame{}, - //&UserShareCard{}, - //&ShareCardVmRecord{}, - //&UserShareCardVm{}, - //&ShareCardDateVm{}, - //&ShareCardGameVm{}, - //&ShareCardRetrieve{}, - //&ShareCardRetrieveCard{}, - //&GameCardLabel{}, - //&CardIssueFeedback{}, - - //&GameCard{}, - //&FundRecord{}, - //&User{}, - - //&GameCard{}, - //&FundRecord{}, - //&User{}, - //&UserAttendance{}, - //&UserAttendanceRecord{}, - - //&Store{}, - //&GameCard{}, - //&GameCardGoods{}, - //&GameCardGoodsStock{}, - //&User{}, - //&Order{}, - //&OrderCard{}, - // - //&OperationLog{}, - //&CooperativeBusiness{}, - //&CooperativeMemberDeduct{}, - //&CooperativeAssistantMemberDeduct{}, - // - //&CooperativeMemberPromotion{}, - //&CooperativeMemberPromotionStore{}, - //&CooperativeMemberPromotionDay{}, - //&CooperativeMemberPromotionStoreDay{}, - //&InviteMemberReport{}, - //&CooperativeDeductSettle{}, - //&XcxRole{}, - - // 商城 - //&Goods{}, - //&GoodsCat{}, - //&GoodsAttribute{}, - //&GoodsAttributeCombo{}, - //&Spec{}, - //&SpecValue{}, - //&GoodsOrder{}, - //&OperationLog{}, - //&DeliverTask{}, - //&DeliverTaskSub{}, - - // 优惠券 - //&GameCard{}, - //&ActivityMemberRenewal{}, - //&Activity{}, - //&UserCoupon{}, - //&Coupon{}, - //&UserOpenMemberRecord{}, - //&HomeCarousel{}, - //&UserRenewalLog{}, - //&GameCard{}, - //&CooperativeMemberPromotion{}, - //&CooperativeMemberPromotionStore{}, - //&CooperativeMemberPromotionDay{}, - //&CooperativeMemberPromotionStoreDay{}, - - //&User{}, - //&UserOpenMemberRecord{}, - //&CooperativeMemberDeduct{}, - //&CooperativeAssistantMemberDeduct{}, - //&UserMemberRecord{}, - //&CooperativeDeductSettle{}, - //&CooperativeMemberPromotionStore{}, - //&CooperativeMemberPromotionDay{}, - //&InviteMemberReport{}, - //&MemberStatisticDaily{}, - //&CooperativeMemberPromotion{}, - //&GameCard{}, - //&CooperativeMemberPromotionStoreDay{}, - // - //&UserInvite{}, - //&UserInviteRecord{}, - //&CooperativeMemberPromotionStore{}, &RecycleCardOrder{}, + &RedeemCode{}, + &PublicRecord{}, ) if err := DBProd.DB().Ping(); err != nil { @@ -596,7 +508,7 @@ func RedeemCodeCreate() { InitDBProd() for i := 0; i < 7; i++ { - redeem := NewRedeemCode() + redeem := NewRedeemCode("MC30") fmt.Println("redeemCode:", redeem) @@ -624,11 +536,51 @@ func RedeemCodeCreate() { } +// 生成会员兑换码 +func TestDeductionCoupon5Create(t *testing.T) { + RedeemCodeDeductionCoupon5Create() +} + +func RedeemCodeDeductionCoupon5Create() { + InitTestDB() + //InitDBProd() + + for i := 0; i < 9950; i++ { + redeem := NewRedeemCode("DC5") + + fmt.Println("redeemCode:", redeem) + + secretCode := RedeemSecretCode(redeem) + + fmt.Println("secretCode:", secretCode) + if !IsRedeemCodeExist(redeem) { // 数据库 TODO + redeemCode := &RedeemCode{ + SerialCode: redeem, + CodeType: CodeTypeDeductionCoupon5, + Status: RedeemCodeStatusStock, + StoreId: 0, + CodeSecret: secretCode, + EffectiveTime: time.Now(), + ExpirationTime: time.Now().AddDate(1, 0, 0), + CouponId: 4, + } + err := DBDev.Create(redeemCode).Error + //err := DBProd.Create(redeemCode).Error + if err != nil { + fmt.Println("err:", err) + + } + } + + } + +} + func IsRedeemCodeExist(code string) bool { var isExist uint32 sql := fmt.Sprintf("SELECT EXISTS (SELECT * FROM redeem_code WHERE serial_code = '%s') AS code_exsit;", code) - //err := DBDev.Raw(sql).Row().Scan(&isExist) - err := DBProd.Raw(sql).Row().Scan(&isExist) + err := DBDev.Raw(sql).Row().Scan(&isExist) + //err := DBProd.Raw(sql).Row().Scan(&isExist) if err != nil { fmt.Println("err:", err) return true @@ -636,7 +588,7 @@ func IsRedeemCodeExist(code string) bool { return isExist == 1 } -func NewRedeemCode() string { +func NewRedeemCode(prefix string) string { semen := fmt.Sprintf("MemberCard30%d", time.Now().UnixNano()) shaer := sha512.New() shaer.Write([]byte(semen)) @@ -644,7 +596,7 @@ func NewRedeemCode() string { hs := fmt.Sprintf("%x", r) hs = strings.ToUpper(hs) - return "MC30" + hs[:19] + return prefix + hs[:19] } func TestInitConfig(t *testing.T) { @@ -1662,3 +1614,49 @@ func MemberExport() { } } + +func TestGetAccessToken(t *testing.T) { + InitTestDB() + DB = DBDev + GetAccessToken() +} + +func TestExportGameList(t *testing.T) { + InitDBProd() + var games []GameCard + _ = NewGameCardQuerySet(DBProd).OrderDescByID().All(&games) + + fileName := "游戏列表" + fileName = time.Now().Format(TimeFormat) + fileName + ".md" + // /www/server/images/export + //f, err := os.OpenFile(fmt.Sprintf("./")+fileName, os.O_CREATE|os.O_TRUNC|os.O_APPEND|os.O_RDWR, 0644) + f, err := os.OpenFile(fmt.Sprintf("./")+fileName, os.O_CREATE|os.O_TRUNC|os.O_APPEND|os.O_RDWR, 0644) + if err != nil { + fmt.Println(err) + } + defer f.Close() + + //w := csv.NewWriter(f) + //os.WriteFile() + //headline := []string{"商品名称", "卡池总数", "在库数量", "玩家持有数量", "锁定数量", "借出总数", "商品编号", "所在门店", "状态"} + //if err := w.Write(headline); err != nil { + //} + + for i, goods := range games { + //if i > 5 { + // break + //} + fmt.Println("第", i) + w := fmt.Sprintf("##### %s \n ", goods.Name) + + fmt.Sprintf(`` + "\n" + + "游戏详情:\n" + + goods.DetailInfo + "\n\n\n" + f.WriteString(w) + } + + if err := f.Close(); err != nil { + //log.Fatal(err) + logger.Error(" err:", err) + } + +} diff --git a/model/recycle_card.go b/model/recycle_card.go index 549d227..9c76665 100644 --- a/model/recycle_card.go +++ b/model/recycle_card.go @@ -14,30 +14,32 @@ import ( type RecycleCardOrder struct { Model - Uid uint32 `json:"uid" gorm:"index"` - GoodsId uint32 `json:"goods_id" gorm:"index"` - GoodsName string `json:"goods_name"` - GoodsImg string `json:"goods_img"` - Keyword string `json:"keyword"` - Price uint32 `json:"price"` - State uint32 `json:"state"` // 1-待回收 2-已完成 3-已被拒 4-已取消 - StoreId uint32 `json:"store_id" gorm:"index"` - StoreName string `json:"store_name"` - Images string `json:"images" gorm:"type:text"` // 图片 - SerialNumber string `json:"serial_number"` - EvaluationTime time.Time `json:"evaluation_time"` - Attribute string `json:"attribute" gorm:"type:text"` // - Number string `json:"number"` // 订单 - CheckTime time.Time `json:"check_time"` - DepressionRate uint32 `json:"depression_rate"` // - User *User `json:"user" gorm:"-"` - Store *Store `json:"store" gorm:"-"` - Describe string `json:"describe"` // 描述 - Remark string `json:"remark"` // 备注 - AssistantName string `json:"assistant_name"` // 店员 - RetrieveTime time.Time `json:"retrieve_time"` // 审核时间 - RetrieveState uint32 `json:"retrieve_state"` // 回收卡状态 1-未确认 2-已确认 - OriginalPrice uint32 `json:"original_price"` // 原价 + Uid uint32 `json:"uid" gorm:"index"` + GoodsId uint32 `json:"goods_id" gorm:"index"` + GoodsName string `json:"goods_name"` + GoodsImg string `json:"goods_img"` + Keyword string `json:"keyword"` + Price uint32 `json:"price"` + State uint32 `json:"state"` // 1-待回收 2-已完成 3-已被拒 4-已取消 + StoreId uint32 `json:"store_id" gorm:"index"` + StoreName string `json:"store_name"` + Images string `json:"images" gorm:"type:text"` // 图片 + SerialNumber string `json:"serial_number"` + EvaluationTime time.Time `json:"evaluation_time"` + Attribute string `json:"attribute" gorm:"type:text"` // + Number string `json:"number"` // 订单 + CheckTime time.Time `json:"check_time"` + DepressionRate uint32 `json:"depression_rate"` // + User *User `json:"user" gorm:"-"` + Store *Store `json:"store" gorm:"-"` + Describe string `json:"describe"` // 描述 + Remark string `json:"remark"` // 备注 + AssistantName string `json:"assistant_name"` // 店员 + RetrieveTime time.Time `json:"retrieve_time"` // 审核时间 + RetrieveState uint32 `json:"retrieve_state"` // 回收卡状态 1-未确认 2-已确认 + OriginalPrice uint32 `json:"original_price"` // 原价 + CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id + CooperativeName string `json:"cooperative_name"` // 合作商名称 // recycle_card_order } @@ -130,6 +132,15 @@ func RecycleCardOrderCreate(uid uint32, req xianmai.GameEvaluationReq) (*Recycle logger.Error("attributes marshal err:", err) return order, err } + + store, err := GetStore(req.StoreId) + if err != nil { + logger.Error("store err:", err) + return order, err + } + order.CooperativeBusinessId = store.CooperativeBusinessId + order.CooperativeName = store.CooperativeName + order.Attribute = string(attributeByte) err = DB.Create(order).Error if err != nil { diff --git a/model/redeem_code.go b/model/redeem_code.go index 4dacdc2..9605592 100644 --- a/model/redeem_code.go +++ b/model/redeem_code.go @@ -19,6 +19,7 @@ const ( CodeTypeMemberGoldMember = "member-card-gold-member" CodeTypeMemberPlatinumMember = "member-card-platinum-member" CodeTypeMemberBlackGoldMember = "member-card-black-gold-member" + CodeTypeDeductionCoupon5 = "deduction-coupon-5" ) const ( @@ -48,6 +49,8 @@ type RedeemCode struct { CodeSecret string `json:"code_secret"` // 兑换密码 EffectiveTime time.Time `json:"effective_time"` // 生效时间 ExpirationTime time.Time `json:"expiration_time"` // 过期时间 + CouponId uint32 `json:"coupon_id" gorm:"index"` + //Remark string `json:"remark"` } // gen:qs diff --git a/model/templete_msg.go b/model/templete_msg.go index 03e5003..6bab785 100644 --- a/model/templete_msg.go +++ b/model/templete_msg.go @@ -13,6 +13,11 @@ import ( "github.com/pkg/errors" ) +const ( + WxPublicAppId = "wxfdb1c5654f681c7e" + WxPublicAppSecret = "6e1908a71f31a80849ef0e59d90b7147" +) + var mutexLock = new(sync.Mutex) func AccessToken() (string, error) { @@ -22,10 +27,50 @@ func AccessToken() (string, error) { Errcode uint32 `json:"errcode"` Errmsg string `json:"errmsg"` }{} - //"app_id": "wx806c079463b5b56c", - // "app_secret": "cb125688bf4e482f66e8c46062d568fc", + + //config.AppConfig.WxAppId = "wxfdb1c5654f681c7e" + //config.AppConfig.WxAppSecret = "6e1908a71f31a80849ef0e59d90b7147" + //config.AppConfig.WxAppId = "wx806c079463b5b56c" + //config.AppConfig.WxAppSecret = "cb125688bf4e482f66e8c46062d568fc" + + //fmt.Println("WxAppId:", config.AppConfig.WxAppId) + //fmt.Println("WxAppSecret:", config.AppConfig.WxAppSecret) + fmt.Println("WxAppId:", WxPublicAppId) + fmt.Println("WxAppSecret:", WxPublicAppSecret) + if err := requests.GetAndParseJson("https://api.weixin.qq.com/cgi-bin/token", map[string]string{ + "grant_type": "client_credential", + "appId": WxPublicAppId, + "secret": WxPublicAppSecret, + }, &response); err != nil { + logger.Error(err) + return "", err + } + + if response.Errcode != 0 { + logger.Error(response.Errcode, "===", response.Errmsg) + return "", errors.New(response.Errmsg) + } + + logger.Infof("response=%+v", response) + + return response.AccessToken, nil +} + +func AppAccessToken() (string, error) { + response := struct { + AccessToken string `json:"access_token"` + ExpiresIn uint32 `json:"expires_in"` + Errcode uint32 `json:"errcode"` + Errmsg string `json:"errmsg"` + }{} + + //config.AppConfig.WxAppId = "wxfdb1c5654f681c7e" + //config.AppConfig.WxAppSecret = "6e1908a71f31a80849ef0e59d90b7147" config.AppConfig.WxAppId = "wx806c079463b5b56c" config.AppConfig.WxAppSecret = "cb125688bf4e482f66e8c46062d568fc" + + //fmt.Println("WxAppId:", config.AppConfig.WxAppId) + //fmt.Println("WxAppSecret:", config.AppConfig.WxAppSecret) fmt.Println("WxAppId:", config.AppConfig.WxAppId) fmt.Println("WxAppSecret:", config.AppConfig.WxAppSecret) if err := requests.GetAndParseJson("https://api.weixin.qq.com/cgi-bin/token", map[string]string{ @@ -74,6 +119,7 @@ func GetAccessToken() (string, error) { time.Sleep(time.Second * 2 * time.Duration(i)) continue } + fmt.Println("accessToken:", accessToken) if accessToken != "" { logger.Info(accessToken) break @@ -95,6 +141,55 @@ func GetAccessToken() (string, error) { return accessToken, nil } +// 获取 AccessToken 统一使用该方法,避免各自获取导致AccessToken 失效 +func AppGetAccessToken() (string, error) { + fmt.Println("获取AccessToken1:") + accessToken := "" + var ( + err error + tokenConfig Config + ) + //mutexLock.Lock() + //defer mutexLock.Unlock() + if err := NewConfigQuerySet(DB).NameEq(common.AppConfigAccessToken).One(&tokenConfig); err != nil && err != RecordNotFound { + logger.Error(err) + return "", nil + } + logger.Error("查询accessToken:", tokenConfig.Value) + accessToken = tokenConfig.Value + if tokenConfig.UpdatedAt.Before(time.Unix(time.Now().Unix()-int64(7200), 0)) || tokenConfig.Value == "" { + + i := 0 + tryTimes := 5 + for ; i < tryTimes; i++ { + accessToken, err = AppAccessToken() + if err != nil { + logger.Error("GetAccessToken Fail...err=", err) + time.Sleep(time.Second * 2 * time.Duration(i)) + continue + } + fmt.Println("accessToken:", accessToken) + if accessToken != "" { + logger.Info(accessToken) + break + } + } + + if i >= tryTimes { + logger.Error("GetAccessToken Fail...") + return "", err + } + + err = NewConfigQuerySet(DB).NameEq(common.AppConfigAccessToken).GetUpdater().SetValue(accessToken).Update() + if err != nil { + logger.Error(err) + return "", err + } + } + fmt.Println("获取AccessToken3:") + return accessToken, nil +} + // 获取 AccessToken 方法 func GenAccessToken() (string, error) { accessToken := "" diff --git a/model/user.go b/model/user.go index c230307..cb01e0d 100644 --- a/model/user.go +++ b/model/user.go @@ -895,10 +895,21 @@ func MemberExpireDelaying(uid uint32) (map[string]interface{}, error) { } var orderCard OrderCard err = NewOrderCardQuerySet(DB).UidEq(uid).CardStatusIn([]uint32{1, 2, 3, 4}...).OrderDescByOrderId().One(&orderCard) - if err != nil { + if err != nil && err != RecordNotFound { logger.Error("order card err:", err) return ret, err } + + if err == RecordNotFound { + var order Order + err = NewOrderQuerySet(DB).UidEq(uint64(uid)).CardStatusIn([]uint8{1, 2, 3, 4}...).OrderDescByID().Limit(1).One(&order) + if err != nil && err != RecordNotFound { + logger.Error("order card err:", err) + return ret, err + } + orderCard.RevertTime = order.RevertTime + orderCard.CardStatus = uint32(order.CardStatus) + } deadline := orderCard.RevertTime if orderCard.CardStatus != 4 { deadline = time.Now() diff --git a/model/wx_msg.go b/model/wx_msg.go new file mode 100644 index 0000000..085a443 --- /dev/null +++ b/model/wx_msg.go @@ -0,0 +1,102 @@ +package model + +import ( + "bytes" + "encoding/json" + "encoding/xml" + "errors" + "fmt" + "github.com/codinl/go-logger" + "github.com/gin-gonic/gin" + "io/ioutil" + "net/http" + "strings" +) + +//go:generate goqueryset -in wx_msg.go +// gen:qs +type PublicRecord struct { + Model + + OpenId string `json:"open_id" gorm:"index"` + RedeemCodeId uint32 `json:"redeem_code_id" gorm:"index"` + SerialCode string `json:"serial_code" gorm:"index;comment:'兑换编码'"` // 兑换编码 + FocusState uint32 `json:"focus_state"` // 关注状态:1-关注 + RedeemCodeState uint32 `json:"redeem_code_state"` // 兑换码状态:1-未领取 2-已领取 3-已使用 + // public_record +} + +type WxReplyTextMsg struct { + XMLName xml.Name `xml:"xml"` + ToUserName string `xml:"ToUserName"` + FromUserName string `xml:"FromUserName"` + CreateTime uint32 `xml:"CreateTime"` + MsgType string `xml:"MsgType"` + Content string `xml:"Content"` +} + +type WxReplyTextReceiveMsg struct { + XMLName xml.Name `xml:"xml"` + ToUserName string `xml:"ToUserName"` + FromUserName string `xml:"FromUserName"` + CreateTime uint32 `xml:"CreateTime"` + MsgType string `xml:"MsgType"` + Event string `xml:"Event"` + Content string `xml:"Content"` + MsgId uint64 `xml:"MsgId"` +} + +func SendCustomerServiceMessage(data []byte, c *gin.Context, accessToken string) error { + client := http.Client{} + SendCustomerServiceMessageUrl := "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + accessToken + + fmt.Println("客服消息 请求参数:", string(data)) + req, err := http.NewRequest("POST", SendCustomerServiceMessageUrl, bytes.NewBuffer(data)) + if err != nil { + logger.Error(err) + } + + req.Header.Set("Content-Type", "application/json; charset=utf-8") + + resp, err := client.Do(req) + if err != nil { + logger.Error(err) + } + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + logger.Error(err) + } + + defer resp.Body.Close() + + logger.Error("SendCustomerServiceMessage body:", string(body)) + type CSResp struct { + ErrCode int `json:"err_code"` + ErrMsg string `json:"err_msg"` + } + var MsgResp CSResp + err = json.Unmarshal(body, &MsgResp) + if err != nil { + logger.Error(err) + } + + if MsgResp.ErrCode != 0 { + logger.Error(MsgResp.ErrMsg) + return errors.New(MsgResp.ErrMsg) + //_, err := c.Writer.Write([]byte("success")) + //if err != nil { + // fmt.Println("响应失败") + // logger.Error("Signature 响应失败", err) + //} + //logger.Error("SUCCESS") + } + + return nil +} + +func WipeStringSpace(s string) string { + s = strings.Replace(s, " ", "", -1) + s = strings.Replace(s, "\n", "", -1) + return s +} diff --git a/router/router_app.go b/router/router_app.go index 17c5cc9..c6b415c 100644 --- a/router/router_app.go +++ b/router/router_app.go @@ -30,9 +30,12 @@ func ConfigAppRouter(r gin.IRouter) { // //api.POST("sys/config", controller.SysConfig) // 配置 // api.POST("step/config", controller.StepConfig) // 步数配置 // //api.POST("upload_user_info", controller.UploadUserInfo) // 上传用户信息 - api.POST("wxpay/notice", controller.PushWXPayNotice) // 微信推送支付通知 - api.POST("wxpay_refund/notice", controller.PushWXPayRefundNotice) // 微信推送支付退款通知 - api.POST("aliyun/sts_token", controller.AliyunStsTokenGet) // 阿里云上传图片token + api.POST("wxpay/notice", controller.PushWXPayNotice) // 微信推送支付通知 + api.POST("wxpay_refund/notice", controller.PushWXPayRefundNotice) // 微信推送支付退款通知 + api.POST("aliyun/sts_token", controller.AliyunStsTokenGet) // 阿里云上传图片token + api.POST("auto_reply/focus", controller.AutoReplyFocusMsg) // 自动回复 + api.GET("auto_reply/focus", controller.CustomerServiceMessageCheck) // 客服校验 + // api.GET("wx_cs/message", controller.CustomerServiceMessageCheck) // 客服校验 // api.POST("wx_cs/message", controller.CustomerServiceMessage) // 客服 } @@ -91,6 +94,7 @@ func ConfigAppRouter(r gin.IRouter) { //user.POST("service/wechat_id", controller.GetCustomerServiceWechatId) // 获取客服微信号 user.POST("invite_applet_code", controller.UserInviteAppletQRCode) // 小程序分享二维码 user.POST("invite_list", controller.UserInviteList) // 小程序分享二维码 + user.POST("use_code_to_coupon", controller.UserCodeToCoupon) // 兑换5券 } store := api.Group("store")