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")