diff --git a/controller/game_card.go b/controller/game_card.go index 87aaf18..b7432f3 100644 --- a/controller/game_card.go +++ b/controller/game_card.go @@ -252,11 +252,13 @@ func PushWXPayNotice(c *gin.Context) { if notify.Attach == wxpay.WxPayRentCard { logger.Info("租借游戏卡 支付成功:") var order model.Order - err := model.NewOrderQuerySet(model.DB).OrderSnEq(notify.OutTradeNo).One(&order) + err := model.NewOrderQuerySet(model.DB).OrderSnEq(notify.OutTradeNo).PayStatusEq(PayStatusUnPay).One(&order) if err != nil { logger.Error("err:", err) return } + //orderJson, _ := json.Marshal(&order) + //fmt.Println("orderJson:", string(orderJson)) begin := model.DB.Begin() err = model.NewOrderQuerySet(begin).IDEq(order.ID).GetUpdater(). @@ -287,13 +289,13 @@ func PushWXPayNotice(c *gin.Context) { return } - count, err := model.NewOrderQuerySet(begin).IDEq(order.ID).Count() - if err != nil { - logger.Error("err:", err) - return - } + //count, err := model.NewOrderQuerySet(model.DB).UidEq(order.Uid).IDEq(order.ID).Count() + //if err != nil { + // logger.Error("err:", err) + // return + //} - go model.OrderCardUserRentCard(uint32(order.Uid), uint32(count), nil) + //go model.OrderCardUserRentCard(uint32(order.Uid), uint32(count), nil) } else if notify.Attach == wxpay.WxPayMember { logger.Info("开通会员 支付成功:") @@ -334,10 +336,16 @@ func PushWXPayNotice(c *gin.Context) { logger.Error("GetMemberConfig err:", err) return } - - err = model.UserUpdate(&model.User{Uid: uint32(record.Uid), MemberLevel: record.MemberLevel, MemberExpire: expireTime, Deposit: memberConfig.MemberDeposit}) + openMemberTime := time.Now() + if !user.OpenMemberTime.IsZero() { + openMemberTime = user.OpenMemberTime + } + _, err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater().SetMemberLevel(record.MemberLevel).SetMemberExpire(expireTime). + SetDeposit(memberConfig.MemberDeposit).SetOpenMemberTime(openMemberTime).UpdateNum() + //err = model.UserUpdate(&model.User{Uid: uint32(record.Uid), MemberLevel: record.MemberLevel, MemberExpire: expireTime, Deposit: memberConfig.MemberDeposit}) if err != nil { logger.Error("err:", err) + return } var invite model.UserInvite @@ -418,7 +426,7 @@ func PushWXPayNotice(c *gin.Context) { memberConfig, err := model.GetMemberConfig(user.MemberLevel) if err != nil { - logger.Error("err:",err) + logger.Error("err:", err) return } @@ -429,6 +437,48 @@ func PushWXPayNotice(c *gin.Context) { if num == 0 { logger.Error("update deposit num is 0") } + } else if notify.Attach == wxpay.WxPayUpgradeMember { + + record := &model.UserOpenMemberRecord{OpenNo: notify.OutTradeNo} + err := record.GetByOpenNo() + if err != nil { + logger.Error("err:", err) + } + fmt.Println("UpgradeMember:", record.Uid) + var user model.User + err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).One(&user) + if err != nil { + logger.Error("err:", err) + return + } + memberConfig, err := model.GetMemberConfig(record.MemberLevel) + if err != nil { + logger.Error("GetMemberConfig err:", err) + return + } + + _, err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater().SetMemberLevel(record.MemberLevel).SetMemberExpire(record.MemberExpire). + SetDeposit(memberConfig.MemberDeposit).UpdateNum() + //err = model.UserUpdate(&model.User{Uid: uint32(record.Uid), MemberLevel: record.MemberLevel, MemberExpire: expireTime, Deposit: memberConfig.MemberDeposit}) + if err != nil { + logger.Error("err:", err) + return + } + // 添加会员时长 等级 借卡数量 + var userRentCard model.UserRentCard + err = model.NewUserRentCardQuerySet(model.DB).UidEq(record.Uid).One(&userRentCard) + if err != nil { + logger.Error("err:", err) + return + } + + _, err = model.NewUserRentCardQuerySet(model.DB).UidEq(record.Uid).GetUpdater().SetMemberLevel(record.MemberLevel). + SetLevelRentCount(memberConfig.CardMax).SetCanRentCount(memberConfig.CardMax - userRentCard.HaveRentCount).UpdateNum() + if err != nil { + logger.Error("err:", err) + return + } + } logger.Debug("微信推动支付通知") diff --git a/controller/order.go b/controller/order.go index f31d982..d9ae286 100644 --- a/controller/order.go +++ b/controller/order.go @@ -71,7 +71,6 @@ func RentCardOrderList(c *gin.Context) { } req.Uid = uc.Uid - orderCardList, totalPage, err := req.GetOrderCardList() // TODO if err != nil { logger.Error("err:", err) @@ -90,9 +89,10 @@ func RentCardOrderList(c *gin.Context) { func OrderInfo(c *gin.Context) { req := struct { - OrderId uint32 `json:"order_id"` - GameCardId uint64 `json:"game_card_id"` // 游戏id - GameCardGoodsId uint64 `json:"game_card_goods_id" ` // 游戏卡id + //OrderId uint32 `json:"order_id"` + //GameCardId uint64 `json:"game_card_id"` // 游戏id + //GameCardGoodsId uint64 `json:"game_card_goods_id" ` // 游戏卡id + OrderCardId uint32 `json:"order_card_id"` }{} if c.ShouldBindJSON(&req) != nil { logger.Error("ShouldBindJSON err") @@ -100,9 +100,9 @@ func OrderInfo(c *gin.Context) { return } order := model.Order{} - order.ID = req.OrderId - order.GameCardId = req.GameCardId - info, err := order.Info() + //order.ID = req.OrderId + //order.GameCardId = req.GameCardId + info, err := order.Info(req.OrderCardId) if err != nil { logger.Error("err:", err) RespJson(c, status.InternalServerError, nil) @@ -324,7 +324,7 @@ func RentCardOrderCreate(c *gin.Context) { stockEnough, err := model.IsCardGoodsStockEnough(req.GameCardList, req.StoreId) if err != nil { logger.Error("err:", err) - RespJson(c, status.InternalServerError, nil) + RespJson(c, status.OrderStockOut, nil) return } if stockEnough { @@ -376,7 +376,7 @@ func RentCardOrderCreate(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - go model.OrderCardUserRentCard(uc.Uid, cardCount, memberConfig) + go model.OrderCardUserRentCard(uc.Uid, cardCount, memberConfig, nil) ret := map[string]interface{}{ "web_pay": "", "order_id": order.ID, @@ -869,12 +869,6 @@ func OrderCancel(c *gin.Context) { fmt.Println("order:", order) if isRecede { - err = model.NewOrderQuerySet(model.DB).IDEq(order.ID).GetUpdater().SetCardStatus(OrderCardStatusCancel).Update() - if err != nil { - logger.Error("err:", err) - RespJson(c, status.InternalServerError, nil) - return - } outTradeNo, err := model.GetWxPayExpressFeeRefundRecord(order.ID) if err != nil { @@ -901,8 +895,8 @@ func OrderCancel(c *gin.Context) { Currency: "CNY", }, } - //bytes, _ := json.Marshal(orderRefund) - //fmt.Println("订单取消:", string(bytes)) + bytes, _ := json.Marshal(order) + fmt.Println("订单取消:", string(bytes)) //err = wxpay.WxPayOrderRefund(orderRefund) err = wxpay.TransactionOrderRefund(orderRefund) if err != nil { diff --git a/controller/user.go b/controller/user.go index babcbc8..b4ea2c8 100644 --- a/controller/user.go +++ b/controller/user.go @@ -298,32 +298,73 @@ func UpgradeMember(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - //configInfo, err := model.PayConfigInfo() - //if err != nil { - // logger.Error("err:", err) - // RespJson(c, status.InternalServerError, nil) - // return - //} - memberConfig, err := model.GetMemberConfig(req.MemberLevel) + + originalMemberConfig, err := model.GetMemberConfig(user.MemberLevel) if err != nil { logger.Error("err:", err) RespJson(c, status.InternalServerError, nil) return } - //totalFee := uint32(MemberFee + DepositFee) - ////totalFee = uint32(3) // TODO 测试 - //if user.Deposit == 300 { - // totalFee = MemberFee - // // //totalFee = uint32(1) // TODO 测试 - //} - - fmt.Println("configInfo.MemberFee : configInfo.DepositFee", memberConfig.MemberFee, memberConfig.MemberDeposit) - - totalFee := memberConfig.MemberFee + memberConfig.MemberDeposit - if user.Deposit == memberConfig.MemberDeposit { - totalFee = memberConfig.MemberFee + memberConfig, err := model.GetMemberConfig(req.MemberLevel) + if err != nil { + logger.Error("err:", err) + RespJson(c, status.InternalServerError, nil) + return } + raiseTime, err := time.Parse("2006-01-02 15:04:05", "2022-01-01 00:00:00") + if err != nil { + logger.Error("err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + memberFee := originalMemberConfig.MemberFee + if user.OpenMemberTime.Before(raiseTime) { + memberFee = 29900 + } + + // 补押金 + depositMendFee := int64(memberConfig.MemberDeposit) - int64(user.Deposit) + + count, err := model.NewUserRedeemCodeQuerySet(model.DB).UidEq(uc.Uid).StatusEq(model.RedeemCodeStatusUsed).Count() + if err != nil { + logger.Error("err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + fmt.Println("count:", count) + // 抵扣天数 + deductionDays := int64(0) + deductionTime := user.MemberExpire.Unix() - int64(count*30*24*3600) - time.Now().Unix() + 12*3600 + if deductionTime < 0 { + deductionTime = 0 + } + if deductionTime > 0 { + deductionDays = deductionTime / int64(24*3600) + } + + // 抵扣金 + deductionFee := (((int64(memberFee) * deductionDays) / 365) / 100) * 100 + + // 补会员费 + memberMendFee := int64(memberConfig.MemberFee) - deductionFee + + totalFee := int64(depositMendFee) + memberMendFee + //if memberMendFee < 0 { + // depositMendFee = depositMendFee + memberMendFee + //} + fmt.Println("depositMendFee : memberMendFee", depositMendFee, memberMendFee) + + if totalFee == 0 { + logger.Error(errors.New("totalFee is 0")) + RespJson(c, status.InternalServerError, nil) + return + } + + //totalFee := memberConfig.MemberFee + memberConfig.MemberDeposit + //if user.Deposit == memberConfig.MemberDeposit { + // totalFee = memberConfig.MemberFee + //} if totalFee == 0 { logger.Error(errors.New("totalFee is 0")) RespJson(c, status.InternalServerError, nil) @@ -336,15 +377,17 @@ func UpgradeMember(c *gin.Context) { // return //} //orderSn := utils.GetSerialNo32HEXString() + memberExpire := time.Now().AddDate(1, 0, count*30) orderSn := model.GetOrderSn() - err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, MemberLevel: req.MemberLevel}.Insert() + err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, + MemberLevel: req.MemberLevel, OrderType: 3, MemberExpire: memberExpire}.Insert() if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) return } - webPay, err := wxpay.WebPay(orderSn, totalFee, user.WxOpenID, "N", wxpay.WxPayMember) + webPay, err := wxpay.WebPay(orderSn, uint32(totalFee), user.WxOpenID, "N", wxpay.WxPayUpgradeMember) if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) @@ -354,6 +397,105 @@ func UpgradeMember(c *gin.Context) { RespOK(c, webPay) } +func UpgradeMemberInfo(c *gin.Context) { + req := struct { + MemberLevel uint32 `json:"member_level"` // 昵称 + }{} + if c.ShouldBindJSON(&req) != nil { + logger.Error("parameter err") + RespJson(c, status.BadRequest, nil) + return + } + uc := auth.GetCurrentUser(c) + if uc == nil { + RespJson(c, status.Unauthorized, nil) + return + } + + user := model.GetUserByUid(uc.Uid) + if user.MemberLevel != 2 && user.MemberLevel != 4 { + logger.Error("MemberLevel err:") + RespJson(c, status.InternalServerError, nil) + return + } + + //configInfo, err := model.PayConfigInfo() + //if err != nil { + // logger.Error("err:", err) + // RespJson(c, status.InternalServerError, nil) + // return + //} + originalMemberConfig, err := model.GetMemberConfig(user.MemberLevel) + if err != nil { + logger.Error("err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + + memberConfig, err := model.GetMemberConfig(req.MemberLevel) + if err != nil { + logger.Error("err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + raiseTime, err := time.Parse("2006-01-02 15:04:05", "2022-01-01 00:00:00") + if err != nil { + logger.Error("err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + memberFee := originalMemberConfig.MemberFee + if user.OpenMemberTime.Before(raiseTime) { + memberFee = 29900 + } + + // 补押金 + depositMendFee := int64(memberConfig.MemberDeposit) - int64(user.Deposit) + + count, err := model.NewUserRedeemCodeQuerySet(model.DB).UidEq(uc.Uid).StatusEq(model.RedeemCodeStatusUsed).Count() + if err != nil { + logger.Error("err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + fmt.Println("count:", count) + // 抵扣天数 + deductionDays := int64(0) + deductionTime := user.MemberExpire.Unix() - int64(count*30*24*3600) - time.Now().Unix() + 12*3600 + if deductionTime < 0 { + deductionTime = 0 + } + if deductionTime > 0 { + deductionDays = deductionTime / int64(24*3600) + } + + // 抵扣金 + deductionFee := (((int64(memberFee) * deductionDays) / 365) / 100) * 100 + + // 补会员费 + memberMendFee := int64(memberConfig.MemberFee) - deductionFee + + totalFee := int64(depositMendFee) + memberMendFee + //if memberMendFee < 0 { + // depositMendFee = depositMendFee + memberMendFee + //} + fmt.Println("depositMendFee : memberMendFee", depositMendFee, memberMendFee) + + if totalFee == 0 { + logger.Error(errors.New("totalFee is 0")) + RespJson(c, status.InternalServerError, nil) + return + } + + RespOK(c, map[string]interface{}{ + "deduction_fee": deductionFee, // 会员抵扣费 + "deduction_days": deductionDays, // 会员抵扣天数 + "member_mend_fee": memberMendFee, // 会员补费 + "deposit_mend_fee": depositMendFee, // 补押金 + "total_fee": totalFee, // 总费用 + }) +} + func PayDeposit(c *gin.Context) { uc := auth.GetCurrentUser(c) if uc == nil { diff --git a/lib/wxpay/wx_pay.go b/lib/wxpay/wx_pay.go index 2bde73b..fdc00cf 100644 --- a/lib/wxpay/wx_pay.go +++ b/lib/wxpay/wx_pay.go @@ -37,6 +37,7 @@ const ( WxPayMember = "member_pay" // 会员 WxPayRentCard = "rent_card_pay" // 租卡 WxPayDeposit = "deposit_pay" // 押金 + WxPayUpgradeMember = "upgrade_member" // 押金 //NotifyUrl = "https://switch.deovo.com:8001/api/v1/wxpay/notice" // TODO 数据库配置 生产 //NotifyUrl = "https://dev.switch.deovo.com:8004/api/v1/wxpay/notice" // TODO 测试 diff --git a/model/autogenerated_user.go b/model/autogenerated_user.go index 98a37b8..510ffe9 100644 --- a/model/autogenerated_user.go +++ b/model/autogenerated_user.go @@ -3439,6 +3439,42 @@ func (qs UserOpenMemberRecordQuerySet) Limit(limit int) UserOpenMemberRecordQuer return qs.w(qs.db.Limit(limit)) } +// MemberExpireEq is an autogenerated method +// nolint: dupl +func (qs UserOpenMemberRecordQuerySet) MemberExpireEq(memberExpire time.Time) UserOpenMemberRecordQuerySet { + return qs.w(qs.db.Where("member_expire = ?", memberExpire)) +} + +// MemberExpireGt is an autogenerated method +// nolint: dupl +func (qs UserOpenMemberRecordQuerySet) MemberExpireGt(memberExpire time.Time) UserOpenMemberRecordQuerySet { + return qs.w(qs.db.Where("member_expire > ?", memberExpire)) +} + +// MemberExpireGte is an autogenerated method +// nolint: dupl +func (qs UserOpenMemberRecordQuerySet) MemberExpireGte(memberExpire time.Time) UserOpenMemberRecordQuerySet { + return qs.w(qs.db.Where("member_expire >= ?", memberExpire)) +} + +// MemberExpireLt is an autogenerated method +// nolint: dupl +func (qs UserOpenMemberRecordQuerySet) MemberExpireLt(memberExpire time.Time) UserOpenMemberRecordQuerySet { + return qs.w(qs.db.Where("member_expire < ?", memberExpire)) +} + +// MemberExpireLte is an autogenerated method +// nolint: dupl +func (qs UserOpenMemberRecordQuerySet) MemberExpireLte(memberExpire time.Time) UserOpenMemberRecordQuerySet { + return qs.w(qs.db.Where("member_expire <= ?", memberExpire)) +} + +// MemberExpireNe is an autogenerated method +// nolint: dupl +func (qs UserOpenMemberRecordQuerySet) MemberExpireNe(memberExpire time.Time) UserOpenMemberRecordQuerySet { + return qs.w(qs.db.Where("member_expire != ?", memberExpire)) +} + // MemberLevelEq is an autogenerated method // nolint: dupl func (qs UserOpenMemberRecordQuerySet) MemberLevelEq(memberLevel uint32) UserOpenMemberRecordQuerySet { @@ -3557,6 +3593,12 @@ func (qs UserOpenMemberRecordQuerySet) OrderAscByID() UserOpenMemberRecordQueryS return qs.w(qs.db.Order("id ASC")) } +// OrderAscByMemberExpire is an autogenerated method +// nolint: dupl +func (qs UserOpenMemberRecordQuerySet) OrderAscByMemberExpire() UserOpenMemberRecordQuerySet { + return qs.w(qs.db.Order("member_expire ASC")) +} + // OrderAscByMemberLevel is an autogenerated method // nolint: dupl func (qs UserOpenMemberRecordQuerySet) OrderAscByMemberLevel() UserOpenMemberRecordQuerySet { @@ -3605,6 +3647,12 @@ func (qs UserOpenMemberRecordQuerySet) OrderDescByID() UserOpenMemberRecordQuery return qs.w(qs.db.Order("id DESC")) } +// OrderDescByMemberExpire is an autogenerated method +// nolint: dupl +func (qs UserOpenMemberRecordQuerySet) OrderDescByMemberExpire() UserOpenMemberRecordQuerySet { + return qs.w(qs.db.Order("member_expire DESC")) +} + // OrderDescByMemberLevel is an autogenerated method // nolint: dupl func (qs UserOpenMemberRecordQuerySet) OrderDescByMemberLevel() UserOpenMemberRecordQuerySet { @@ -3860,6 +3908,13 @@ func (u UserOpenMemberRecordUpdater) SetID(ID uint32) UserOpenMemberRecordUpdate return u } +// SetMemberExpire is an autogenerated method +// nolint: dupl +func (u UserOpenMemberRecordUpdater) SetMemberExpire(memberExpire time.Time) UserOpenMemberRecordUpdater { + u.fields[string(UserOpenMemberRecordDBSchema.MemberExpire)] = memberExpire + return u +} + // SetMemberLevel is an autogenerated method // nolint: dupl func (u UserOpenMemberRecordUpdater) SetMemberLevel(memberLevel uint32) UserOpenMemberRecordUpdater { @@ -3930,41 +3985,44 @@ func (f UserOpenMemberRecordDBSchemaField) String() string { // UserOpenMemberRecordDBSchema stores db field names of UserOpenMemberRecord var UserOpenMemberRecordDBSchema = struct { - ID UserOpenMemberRecordDBSchemaField - CreatedAt UserOpenMemberRecordDBSchemaField - UpdatedAt UserOpenMemberRecordDBSchemaField - DeletedAt UserOpenMemberRecordDBSchemaField - Uid UserOpenMemberRecordDBSchemaField - OpenNo UserOpenMemberRecordDBSchemaField - OrderId UserOpenMemberRecordDBSchemaField - OrderType UserOpenMemberRecordDBSchemaField - MemberLevel UserOpenMemberRecordDBSchemaField + ID UserOpenMemberRecordDBSchemaField + CreatedAt UserOpenMemberRecordDBSchemaField + UpdatedAt UserOpenMemberRecordDBSchemaField + DeletedAt UserOpenMemberRecordDBSchemaField + Uid UserOpenMemberRecordDBSchemaField + OpenNo UserOpenMemberRecordDBSchemaField + OrderId UserOpenMemberRecordDBSchemaField + OrderType UserOpenMemberRecordDBSchemaField + MemberLevel UserOpenMemberRecordDBSchemaField + MemberExpire UserOpenMemberRecordDBSchemaField }{ - ID: UserOpenMemberRecordDBSchemaField("id"), - CreatedAt: UserOpenMemberRecordDBSchemaField("created_at"), - UpdatedAt: UserOpenMemberRecordDBSchemaField("updated_at"), - DeletedAt: UserOpenMemberRecordDBSchemaField("deleted_at"), - Uid: UserOpenMemberRecordDBSchemaField("uid"), - OpenNo: UserOpenMemberRecordDBSchemaField("open_no"), - OrderId: UserOpenMemberRecordDBSchemaField("order_id"), - OrderType: UserOpenMemberRecordDBSchemaField("order_type"), - MemberLevel: UserOpenMemberRecordDBSchemaField("member_level"), + ID: UserOpenMemberRecordDBSchemaField("id"), + CreatedAt: UserOpenMemberRecordDBSchemaField("created_at"), + UpdatedAt: UserOpenMemberRecordDBSchemaField("updated_at"), + DeletedAt: UserOpenMemberRecordDBSchemaField("deleted_at"), + Uid: UserOpenMemberRecordDBSchemaField("uid"), + OpenNo: UserOpenMemberRecordDBSchemaField("open_no"), + OrderId: UserOpenMemberRecordDBSchemaField("order_id"), + OrderType: UserOpenMemberRecordDBSchemaField("order_type"), + MemberLevel: UserOpenMemberRecordDBSchemaField("member_level"), + MemberExpire: UserOpenMemberRecordDBSchemaField("member_expire"), } // Update updates UserOpenMemberRecord fields by primary key // nolint: dupl func (o *UserOpenMemberRecord) Update(db *gorm.DB, fields ...UserOpenMemberRecordDBSchemaField) error { dbNameToFieldName := map[string]interface{}{ - "id": o.ID, - "created_at": o.CreatedAt, - "updated_at": o.UpdatedAt, - "deleted_at": o.DeletedAt, - "uid": o.Uid, - "open_no": o.OpenNo, - "order_id": o.OrderId, - "order_type": o.OrderType, - "member_level": o.MemberLevel, + "id": o.ID, + "created_at": o.CreatedAt, + "updated_at": o.UpdatedAt, + "deleted_at": o.DeletedAt, + "uid": o.Uid, + "open_no": o.OpenNo, + "order_id": o.OrderId, + "order_type": o.OrderType, + "member_level": o.MemberLevel, + "member_expire": o.MemberExpire, } u := map[string]interface{}{} for _, f := range fields { @@ -4722,6 +4780,42 @@ func (qs UserQuerySet) One(ret *User) error { return qs.db.First(ret).Error } +// OpenMemberTimeEq is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OpenMemberTimeEq(openMemberTime time.Time) UserQuerySet { + return qs.w(qs.db.Where("open_member_time = ?", openMemberTime)) +} + +// OpenMemberTimeGt is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OpenMemberTimeGt(openMemberTime time.Time) UserQuerySet { + return qs.w(qs.db.Where("open_member_time > ?", openMemberTime)) +} + +// OpenMemberTimeGte is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OpenMemberTimeGte(openMemberTime time.Time) UserQuerySet { + return qs.w(qs.db.Where("open_member_time >= ?", openMemberTime)) +} + +// OpenMemberTimeLt is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OpenMemberTimeLt(openMemberTime time.Time) UserQuerySet { + return qs.w(qs.db.Where("open_member_time < ?", openMemberTime)) +} + +// OpenMemberTimeLte is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OpenMemberTimeLte(openMemberTime time.Time) UserQuerySet { + return qs.w(qs.db.Where("open_member_time <= ?", openMemberTime)) +} + +// OpenMemberTimeNe is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OpenMemberTimeNe(openMemberTime time.Time) UserQuerySet { + return qs.w(qs.db.Where("open_member_time != ?", openMemberTime)) +} + // OrderAscByBond is an autogenerated method // nolint: dupl func (qs UserQuerySet) OrderAscByBond() UserQuerySet { @@ -4776,6 +4870,12 @@ func (qs UserQuerySet) OrderAscByMemberLevel() UserQuerySet { return qs.w(qs.db.Order("member_level ASC")) } +// OrderAscByOpenMemberTime is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OrderAscByOpenMemberTime() UserQuerySet { + return qs.w(qs.db.Order("open_member_time ASC")) +} + // OrderAscByStoreId is an autogenerated method // nolint: dupl func (qs UserQuerySet) OrderAscByStoreId() UserQuerySet { @@ -4866,6 +4966,12 @@ func (qs UserQuerySet) OrderDescByMemberLevel() UserQuerySet { return qs.w(qs.db.Order("member_level DESC")) } +// OrderDescByOpenMemberTime is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OrderDescByOpenMemberTime() UserQuerySet { + return qs.w(qs.db.Order("open_member_time DESC")) +} + // OrderDescByStoreId is an autogenerated method // nolint: dupl func (qs UserQuerySet) OrderDescByStoreId() UserQuerySet { @@ -5515,6 +5621,13 @@ func (u UserUpdater) SetMemberLevel(memberLevel uint32) UserUpdater { return u } +// SetOpenMemberTime is an autogenerated method +// nolint: dupl +func (u UserUpdater) SetOpenMemberTime(openMemberTime time.Time) UserUpdater { + u.fields[string(UserDBSchema.OpenMemberTime)] = openMemberTime + return u +} + // SetProvince is an autogenerated method // nolint: dupl func (u UserUpdater) SetProvince(province string) UserUpdater { @@ -5627,95 +5740,98 @@ func (f UserDBSchemaField) String() string { // UserDBSchema stores db field names of User var UserDBSchema = struct { - ID UserDBSchemaField - CreatedAt UserDBSchemaField - UpdatedAt UserDBSchemaField - DeletedAt UserDBSchemaField - Uid UserDBSchemaField - MemberLevel UserDBSchemaField - MemberExpire UserDBSchemaField - Bond UserDBSchemaField - WxName UserDBSchemaField - WxAvatar UserDBSchemaField - WxOpenID UserDBSchemaField - AppOpenID UserDBSchemaField - WxUnionID UserDBSchemaField - Tel UserDBSchemaField - Gender UserDBSchemaField - City UserDBSchemaField - Province UserDBSchemaField - Country UserDBSchemaField - Deposit UserDBSchemaField - UserType UserDBSchemaField - StoreId UserDBSchemaField - InviteCodeUrl UserDBSchemaField - LastLoginAt UserDBSchemaField - IP UserDBSchemaField - InBlack UserDBSchemaField - StoreType UserDBSchemaField - Version UserDBSchemaField + ID UserDBSchemaField + CreatedAt UserDBSchemaField + UpdatedAt UserDBSchemaField + DeletedAt UserDBSchemaField + Uid UserDBSchemaField + MemberLevel UserDBSchemaField + MemberExpire UserDBSchemaField + OpenMemberTime UserDBSchemaField + Bond UserDBSchemaField + WxName UserDBSchemaField + WxAvatar UserDBSchemaField + WxOpenID UserDBSchemaField + AppOpenID UserDBSchemaField + WxUnionID UserDBSchemaField + Tel UserDBSchemaField + Gender UserDBSchemaField + City UserDBSchemaField + Province UserDBSchemaField + Country UserDBSchemaField + Deposit UserDBSchemaField + UserType UserDBSchemaField + StoreId UserDBSchemaField + InviteCodeUrl UserDBSchemaField + LastLoginAt UserDBSchemaField + IP UserDBSchemaField + InBlack UserDBSchemaField + StoreType UserDBSchemaField + Version UserDBSchemaField }{ - ID: UserDBSchemaField("id"), - CreatedAt: UserDBSchemaField("created_at"), - UpdatedAt: UserDBSchemaField("updated_at"), - DeletedAt: UserDBSchemaField("deleted_at"), - Uid: UserDBSchemaField("uid"), - MemberLevel: UserDBSchemaField("member_level"), - MemberExpire: UserDBSchemaField("member_expire"), - Bond: UserDBSchemaField("bond"), - WxName: UserDBSchemaField("wx_name"), - WxAvatar: UserDBSchemaField("wx_avatar"), - WxOpenID: UserDBSchemaField("wx_open_id"), - AppOpenID: UserDBSchemaField("app_open_id"), - WxUnionID: UserDBSchemaField("wx_union_id"), - Tel: UserDBSchemaField("tel"), - Gender: UserDBSchemaField("gender"), - City: UserDBSchemaField("city"), - Province: UserDBSchemaField("province"), - Country: UserDBSchemaField("country"), - Deposit: UserDBSchemaField("deposit"), - UserType: UserDBSchemaField("user_type"), - StoreId: UserDBSchemaField("store_id"), - InviteCodeUrl: UserDBSchemaField("invite_code_url"), - LastLoginAt: UserDBSchemaField("last_login_at"), - IP: UserDBSchemaField("ip"), - InBlack: UserDBSchemaField("in_black"), - StoreType: UserDBSchemaField("store_type"), - Version: UserDBSchemaField("version"), + ID: UserDBSchemaField("id"), + CreatedAt: UserDBSchemaField("created_at"), + UpdatedAt: UserDBSchemaField("updated_at"), + DeletedAt: UserDBSchemaField("deleted_at"), + Uid: UserDBSchemaField("uid"), + MemberLevel: UserDBSchemaField("member_level"), + MemberExpire: UserDBSchemaField("member_expire"), + OpenMemberTime: UserDBSchemaField("open_member_time"), + Bond: UserDBSchemaField("bond"), + WxName: UserDBSchemaField("wx_name"), + WxAvatar: UserDBSchemaField("wx_avatar"), + WxOpenID: UserDBSchemaField("wx_open_id"), + AppOpenID: UserDBSchemaField("app_open_id"), + WxUnionID: UserDBSchemaField("wx_union_id"), + Tel: UserDBSchemaField("tel"), + Gender: UserDBSchemaField("gender"), + City: UserDBSchemaField("city"), + Province: UserDBSchemaField("province"), + Country: UserDBSchemaField("country"), + Deposit: UserDBSchemaField("deposit"), + UserType: UserDBSchemaField("user_type"), + StoreId: UserDBSchemaField("store_id"), + InviteCodeUrl: UserDBSchemaField("invite_code_url"), + LastLoginAt: UserDBSchemaField("last_login_at"), + IP: UserDBSchemaField("ip"), + InBlack: UserDBSchemaField("in_black"), + StoreType: UserDBSchemaField("store_type"), + Version: UserDBSchemaField("version"), } // Update updates User fields by primary key // nolint: dupl func (o *User) Update(db *gorm.DB, fields ...UserDBSchemaField) error { dbNameToFieldName := map[string]interface{}{ - "id": o.ID, - "created_at": o.CreatedAt, - "updated_at": o.UpdatedAt, - "deleted_at": o.DeletedAt, - "uid": o.Uid, - "member_level": o.MemberLevel, - "member_expire": o.MemberExpire, - "bond": o.Bond, - "wx_name": o.WxName, - "wx_avatar": o.WxAvatar, - "wx_open_id": o.WxOpenID, - "app_open_id": o.AppOpenID, - "wx_union_id": o.WxUnionID, - "tel": o.Tel, - "gender": o.Gender, - "city": o.City, - "province": o.Province, - "country": o.Country, - "deposit": o.Deposit, - "user_type": o.UserType, - "store_id": o.StoreId, - "invite_code_url": o.InviteCodeUrl, - "last_login_at": o.LastLoginAt, - "ip": o.IP, - "in_black": o.InBlack, - "store_type": o.StoreType, - "version": o.Version, + "id": o.ID, + "created_at": o.CreatedAt, + "updated_at": o.UpdatedAt, + "deleted_at": o.DeletedAt, + "uid": o.Uid, + "member_level": o.MemberLevel, + "member_expire": o.MemberExpire, + "open_member_time": o.OpenMemberTime, + "bond": o.Bond, + "wx_name": o.WxName, + "wx_avatar": o.WxAvatar, + "wx_open_id": o.WxOpenID, + "app_open_id": o.AppOpenID, + "wx_union_id": o.WxUnionID, + "tel": o.Tel, + "gender": o.Gender, + "city": o.City, + "province": o.Province, + "country": o.Country, + "deposit": o.Deposit, + "user_type": o.UserType, + "store_id": o.StoreId, + "invite_code_url": o.InviteCodeUrl, + "last_login_at": o.LastLoginAt, + "ip": o.IP, + "in_black": o.InBlack, + "store_type": o.StoreType, + "version": o.Version, } u := map[string]interface{}{} for _, f := range fields { diff --git a/model/order.go b/model/order.go index c9b5a26..db560fa 100644 --- a/model/order.go +++ b/model/order.go @@ -71,7 +71,7 @@ type OrderCard struct { GameCardId uint32 `json:"game_card_id" gorm:"index"` // 游戏id GameCardGoodsId uint32 `json:"game_card_goods_id" gorm:"index"` // 游戏卡id StoreId uint32 `json:"store_id" gorm:"index"` // 门店id - CardStatus uint32 `json:"card_status"` // 1-待取货中 2-游玩中 3-归还中 4-已完成 5-已取消 + CardStatus uint32 `json:"card_status"` // 1-待取货中 2-游玩中 3-归还中 4-已完成 5-已取消 DeliveryTime time.Time `json:"delivery_time"` // 发货时间 ReceiptTime time.Time `json:"receipt_time"` // 收货时间 DeliveryType uint8 `json:"delivery_type"` // 取货类型 1-门店自取 2-快递 @@ -233,13 +233,12 @@ func (m *OrderListReq) GetOrderCardList() ([]OrderCard, uint32, error) { } totalPage = uint32(count/m.PageSize + 1) - orderCards = OrderCardListSetGameInfo(orderCards) return orderCards, totalPage, nil } -func (m *Order) Info() ([]OrderCard, error) { +func (m *Order) Info(orderCardId uint32) ([]OrderCard, error) { //err := NewOrderQuerySet(DB).IDEq(m.ID).One(&order) //if err != nil { @@ -253,10 +252,11 @@ func (m *Order) Info() ([]OrderCard, error) { // return nil, err //} - qs := NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardIdEq(uint32(m.GameCardId)) - if m.GameCardGoodsId != 0 { - qs = qs.GameCardGoodsIdEq(uint32(m.GameCardGoodsId)) - } + qs := NewOrderCardQuerySet(DB).IDEq(orderCardId) + //qs := NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardIdEq(uint32(m.GameCardId)) + //if m.GameCardGoodsId != 0 { + // qs = qs.GameCardGoodsIdEq(uint32(m.GameCardGoodsId)) + //} var orderCards []OrderCard err := qs.All(&orderCards) if err != nil { @@ -285,8 +285,8 @@ func (m *Order) Revert() error { // logger.Error("order card status completed") // return errors.New("order card status completed") //} - fmt.Println("GameCardGoodsId------:",m.GameCardGoodsId) - fmt.Println("ID------:",m.ID) + fmt.Println("GameCardGoodsId------:", m.GameCardGoodsId) + fmt.Println("ID------:", m.ID) err := NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardGoodsIdEq(uint32(m.GameCardGoodsId)).One(&orderCard) if err != nil { logger.Errorf("err:%#v", err) @@ -467,7 +467,7 @@ func (m *UserRentCard) IsHaveUnreturnedOrders(RentCount uint32) (bool, error) { } func IsHaveOnDeliverOrderCards(orderId uint32) (bool, error) { - count, err := NewOrderCardQuerySet(DB).OrderIdEq(orderId).CardStatusEq(1).Count() + count, err := NewOrderCardQuerySet(DB).OrderIdEq(orderId).CardStatusEq(OrderCardStatusUnPick).Count() if err != nil { logger.Error("err:", err) return false, err @@ -540,6 +540,8 @@ func (m *Order) Cancel() (bool, error) { logger.Error("err:", err) return false, err } + orderJson, _ := json.Marshal(m) + fmt.Println("orderJson:", string(orderJson)) //err = NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardGoodsIdEq(uint32(m.GameCardGoodsId)).One(&orderCard) err = NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardIdEq(uint32(m.GameCardId)).CardStatusEq(OrderCardStatusUnPick).Limit(1).One(&orderCard) @@ -592,19 +594,36 @@ func (m *Order) Cancel() (bool, error) { logger.Errorf("err:%#v", err) return false, err } + //UserRentCard{} + sqlRent := fmt.Sprintf("UPDATE user_rent_card SET have_rent_count = have_rent_count-1,can_rent_count=can_rent_count+1 WHERE uid =%d;", order.Uid) + fmt.Println("sqlRent:", sqlRent) + err = begin.Exec(sqlRent).Error + if err != nil { + begin.Rollback() + logger.Errorf("err:%#v", err) + return false, err + } err = begin.Commit().Error if err != nil { begin.Rollback() logger.Errorf("err:%#v", err) return false, err } - isRecede := false - if order.DeliveryType == 2 && order.Postage > 0 { - isHaveOnDeliver, err := IsHaveOnDeliverOrderCards(m.ID) + isHaveOnDeliver, err := IsHaveOnDeliverOrderCards(m.ID) + if err != nil { + logger.Error("err:", err) + return false, err + } + if !isHaveOnDeliver { + err = NewOrderQuerySet(DB).IDEq(order.ID).GetUpdater().SetCardStatus(OrderCardStatusCancel).Update() if err != nil { logger.Error("err:", err) return false, err } + } + + isRecede := false + if order.DeliveryType == 2 && order.Postage > 0 { if !isHaveOnDeliver { isRecede = true } @@ -681,10 +700,14 @@ func IsCardGoodsStockEnough(cards []CardInfo, storeId uint32) (bool, error) { var gameCardGoodsStock GameCardGoodsStock err := NewGameCardGoodsStockQuerySet(DB).StoreIdEq(uint64(storeId)).GameCardIdEq(uint64(cards[i].GameCardId)). One(&gameCardGoodsStock) - if err != nil { + if err != nil && err != RecordNotFound { logger.Error("err:", err) return false, err } + if err == RecordNotFound { + logger.Error("order stock out:") + return false, err + } if gameCardGoodsStock.RentStock < cards[i].Count { logger.Error("order stock out ") return false, errors.New("order stock out") @@ -708,13 +731,15 @@ func GameCardGoodsInventoryReduction(cards []CardInfo, storeId uint32, gdb *gorm func (m *Order) InventoryReduction(gdb *gorm.DB) error { var cards []OrderCard - err := NewOrderCardQuerySet(DB).OrderIdEq(m.ID).All(&cards) + err := NewOrderCardQuerySet(DB).UidEq(uint32(m.Uid)).OrderIdEq(m.ID).All(&cards) if err != nil { logger.Error("err:", err) return err } + //fmt.Println("cards:", cards) for i, _ := range cards { + //fmt.Println("cards:", cards[i].GameCardId, cards[i].StoreId, cards[i].Uid) sql := fmt.Sprintf("UPDATE game_card_goods_stock SET rent_stock= rent_stock-1 WHERE store_id=%d AND game_card_id=%d;", m.StoreId, cards[i].GameCardId) fmt.Println("sql:", sql) err := gdb.Exec(sql).Error @@ -723,6 +748,10 @@ func (m *Order) InventoryReduction(gdb *gorm.DB) error { return err } } + err = OrderCardUserRentCard(uint32(m.Uid), uint32(len(cards)), nil, gdb) + if err != nil { + logger.Error("err:", err) + } return nil } diff --git a/model/redeem_code.go b/model/redeem_code.go index 56a8ba3..ccb5ac6 100644 --- a/model/redeem_code.go +++ b/model/redeem_code.go @@ -167,7 +167,7 @@ func UserRedeemCodeConvert(uid uint32, serialCode string) error { return nil } -func CodeSendToUser(uid uint32, codeType string,activityType uint32) error { +func CodeSendToUser(uid uint32, codeType string, activityType uint32) error { count, err := NewUserRedeemCodeQuerySet(DB).UidEq(uid).Count() if err != nil { logger.Error("err:", err) @@ -198,7 +198,7 @@ func CodeSendToUser(uid uint32, codeType string,activityType uint32) error { Status: UserRedeemCodeStatusHold, SerialCode: redeemCode.SerialCode, CodeType: redeemCode.CodeType, - ActivityType: activityType , + ActivityType: activityType, //ActivityType: RedeemCodeActivityTypeUserInvite, } err = begin.Create(userRedeemCode).Error diff --git a/model/user.go b/model/user.go index 2841ec4..d8882b3 100644 --- a/model/user.go +++ b/model/user.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "github.com/codinl/go-logger" + "github.com/jinzhu/gorm" "mh-server/lib/utils" "sync" "time" @@ -14,29 +15,30 @@ import ( type User struct { Model - Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` - MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员 - MemberExpire time.Time `json:"member_expire"` // 会员到期时间 - Bond uint32 `json:"bond"` // 保证金 - WxName string `json:"wx_name"` // 昵称 - WxAvatar string `json:"wx_avatar"` // 头像 - WxOpenID string `json:"wx_open_id"` - AppOpenID string `json:"app_open_id"` - WxUnionID string `json:"wx_union_id"` - Tel string `json:"tel"` // 电话 - Gender uint8 `json:"gender"` // 性别 - City string `json:"city"` // 城市 - Province string `json:"province"` // 省 - Country string `json:"country"` // 市 - Deposit uint32 `json:"deposit"` // - UserType uint8 `json:"user_type"` // 用户类型 1-普通用户 2-店员 - StoreId uint64 `json:"store_id"` // 门店id - InviteCodeUrl string `json:"invite_code_url"` // 分享二维码 - LastLoginAt time.Time `json:"last_login_at"` // 最近登录时间 - IP string `json:"-" gorm:"type:varchar(60)"` // ip - InBlack bool `json:"in_black"` // 是否在黑名单 - StoreType uint8 `json:"store_type"` // 1-订单门店 - Version uint32 `json:"-"` + Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` + MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员 + MemberExpire time.Time `json:"member_expire"` // 会员到期时间 + OpenMemberTime time.Time `json:"open_member_time"` // 开通会员 + Bond uint32 `json:"bond"` // 保证金 + WxName string `json:"wx_name"` // 昵称 + WxAvatar string `json:"wx_avatar"` // 头像 + WxOpenID string `json:"wx_open_id"` + AppOpenID string `json:"app_open_id"` + WxUnionID string `json:"wx_union_id"` + Tel string `json:"tel"` // 电话 + Gender uint8 `json:"gender"` // 性别 + City string `json:"city"` // 城市 + Province string `json:"province"` // 省 + Country string `json:"country"` // 市 + Deposit uint32 `json:"deposit"` // + UserType uint8 `json:"user_type"` // 用户类型 1-普通用户 2-店员 + StoreId uint64 `json:"store_id"` // 门店id + InviteCodeUrl string `json:"invite_code_url"` // 分享二维码 + LastLoginAt time.Time `json:"last_login_at"` // 最近登录时间 + IP string `json:"-" gorm:"type:varchar(60)"` // ip + InBlack bool `json:"in_black"` // 是否在黑名单 + StoreType uint8 `json:"store_type"` // 1-订单门店 + Version uint32 `json:"-"` } func (o *User) TableName() string { @@ -180,11 +182,12 @@ func UserUpdate(user *User) error { type UserOpenMemberRecord struct { Model - Uid uint32 `json:"uid"` - OpenNo string `json:"open_no" gorm:"index"` - OrderId uint32 `json:"order_id"` - OrderType uint32 `json:"order_type"` // 1-物流支付 - MemberLevel uint32 `json:"member_level"` + Uid uint32 `json:"uid"` + OpenNo string `json:"open_no" gorm:"index"` + OrderId uint32 `json:"order_id"` + OrderType uint32 `json:"order_type"` // 1-物流支付 2-取消物流租卡 + MemberLevel uint32 `json:"member_level"` + MemberExpire time.Time `json:"member_expire"` // 会员到期时间 } func (o *UserOpenMemberRecord) TableName() string { @@ -439,8 +442,11 @@ func GetUserMutex(mutexKey string) *sync.Mutex { var AuthLoginMutex = sync.Mutex{} -func OrderCardUserRentCard(uid uint32, count uint32, memberConfig *MemberConfig) error { +func OrderCardUserRentCard(uid uint32, count uint32, memberConfig *MemberConfig,gdb *gorm.DB) error { //UserRentCard{} + if gdb == nil { + gdb = DB + } var userRentCard UserRentCard err := NewUserRentCardQuerySet(DB).UidEq(uid).One(&userRentCard) if err != nil && err != RecordNotFound { @@ -468,7 +474,7 @@ func OrderCardUserRentCard(uid uint32, count uint32, memberConfig *MemberConfig) CanRentCount: uint32(memberConfig.CardMax - count), Status: 0, } - err := DB.Create(rentCard).Error + err := gdb.Create(rentCard).Error if err != nil { logger.Error("err", err) return err @@ -476,7 +482,7 @@ func OrderCardUserRentCard(uid uint32, count uint32, memberConfig *MemberConfig) return nil } sql := fmt.Sprintf("UPDATE user_rent_card SET have_rent_count=have_rent_count+%d ,can_rent_count=can_rent_count-%d WHERE uid = %d", count, count, uid) - err = DB.Exec(sql).Error + err = gdb.Exec(sql).Error if err != nil { logger.Error("err", err) return err diff --git a/router/router_app.go b/router/router_app.go index e7c12fb..46a8c80 100644 --- a/router/router_app.go +++ b/router/router_app.go @@ -75,7 +75,8 @@ func ConfigAppRouter(r gin.IRouter) { user.POST("user_info/tel", controller.UserTel) // 获取用户手机号 user.POST("user_info/update", controller.UserInfoUpdate) // 修改用户信息 user.POST("open_member", controller.OpenMember) // 开通会员 - user.POST("upgrade_member", controller.UpgradeMember) // 开通会员 + user.POST("upgrade_member", controller.UpgradeMember) // 升级会员 + user.POST("upgrade_member_info", controller.UpgradeMemberInfo) // 升级详情 user.POST("pay_deposit", controller.PayDeposit) // 支付押金 user.POST("refund_deposit", controller.RefundDeposit) // 退押金 user.POST("refund_deposit_record", controller.UserDepositRefundRecordList) // 押金记录 @@ -126,14 +127,14 @@ func ConfigAppRouter(r gin.IRouter) { order.POST("express", controller.OrderExpress) // 订单物流 order.POST("express_company/list", controller.ExpressCompanyList) // 物流公司列表 order.POST("order/wx_pay/success", controller.WXPaySuccess) // 微信支付成功 - order.POST("cancel", controller.OrderCancel) // 订单取消 + order.POST("cancel", controller.OrderCancel) // 取消租卡 order.Use(auth.UserAccessAuth) // TODO order.POST("create", controller.RentCardOrderCreate) // 创建租卡 order.POST("pay", controller.OrderPay) // 租卡订单支付 order.POST("list", controller.RentCardOrderList) // 租卡订单列表 order.POST("revert", controller.OrderRevert) // 租卡订单归还 - order.POST("revert/cancel", controller.OrderRevertCancel) // 租卡订单取消归还 + order.POST("revert/cancel", controller.OrderRevertCancel) // 取消归还 //order.POST("express_fee/refund", controller.ExpressFeeRefund) // 物流费退款 order.POST("confirm_receipt", controller.ConfirmReceipt) // 订单确认收货