优惠券相关逻辑
This commit is contained in:
parent
e2fb325452
commit
3cd4e4b335
|
|
@ -15,9 +15,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type LoginRequest struct {
|
type LoginRequest struct {
|
||||||
Code string
|
Code string
|
||||||
NickName string
|
NickName string
|
||||||
HeadImgUrl string
|
HeadImgUrl string
|
||||||
|
InviteUserId int64
|
||||||
}
|
}
|
||||||
|
|
||||||
type LoginResponse struct {
|
type LoginResponse struct {
|
||||||
|
|
|
||||||
|
|
@ -172,6 +172,18 @@ func (p DefParty) carServiceProcess() web_iris.Party {
|
||||||
}
|
}
|
||||||
database.Instance().Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
database.Instance().Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
userAmountRecord := models.UserAmountRecord{
|
||||||
|
UserId: orderUserInfo.Id,
|
||||||
|
Type: 3,
|
||||||
|
OriginAmount: userOriginAmount,
|
||||||
|
ProAmount: p1,
|
||||||
|
CurrAmount: orderUserInfo.Amount,
|
||||||
|
OrderId: mainOrder.OrderId,
|
||||||
|
ProScene: "修改订单金额",
|
||||||
|
Status: 1,
|
||||||
|
}
|
||||||
|
database.Instance().Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
||||||
}
|
}
|
||||||
subOrderInfo.PayTime = time.Now()
|
subOrderInfo.PayTime = time.Now()
|
||||||
subOrderInfo.PayStatus = 1
|
subOrderInfo.PayStatus = 1
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ var (
|
||||||
ParamError = Error{Code: 201, Msg: "参数错误"}
|
ParamError = Error{Code: 201, Msg: "参数错误"}
|
||||||
IllegalError = Error{Code: 202, Msg: "非法请求"}
|
IllegalError = Error{Code: 202, Msg: "非法请求"}
|
||||||
UserError = Error{Code: 203, Msg: "用户错误"}
|
UserError = Error{Code: 203, Msg: "用户错误"}
|
||||||
|
ServerError = Error{Code: 203, Msg: "服务器异常"}
|
||||||
TokenError = Error{Code: 204, Msg: "Token失效,请重新登录"}
|
TokenError = Error{Code: 204, Msg: "Token失效,请重新登录"}
|
||||||
UserNotExistError = Error{Code: 205, Msg: "用户不存在"}
|
UserNotExistError = Error{Code: 205, Msg: "用户不存在"}
|
||||||
PetNotExistError = Error{Code: 206, Msg: "用户宠物不存在"}
|
PetNotExistError = Error{Code: 206, Msg: "用户宠物不存在"}
|
||||||
|
|
@ -57,6 +58,8 @@ var (
|
||||||
PetInfoNotDelError = Error{Code: 215, Msg: "当前宠物存在待服务订单,无法删除"}
|
PetInfoNotDelError = Error{Code: 215, Msg: "当前宠物存在待服务订单,无法删除"}
|
||||||
PetInfoNotUpdateError = Error{Code: 216, Msg: "当前宠物存在待服务订单,无法修改"}
|
PetInfoNotUpdateError = Error{Code: 216, Msg: "当前宠物存在待服务订单,无法修改"}
|
||||||
OrderUpdateBalanceNotEnough = Error{Code: 217, Msg: "当前余额不足"}
|
OrderUpdateBalanceNotEnough = Error{Code: 217, Msg: "当前余额不足"}
|
||||||
|
CouponsNotExistError = Error{Code: 218, Msg: "优惠券不存在"}
|
||||||
|
UserCouponsNExistError = Error{Code: 219, Msg: "已领取同类型优惠券"}
|
||||||
)
|
)
|
||||||
|
|
||||||
func Success(ctx *context.Context, request any, data any) {
|
func Success(ctx *context.Context, request any, data any) {
|
||||||
|
|
@ -125,6 +128,7 @@ var GoodsMap map[int64]models.Goods
|
||||||
var CarMap map[int]models.ServiceCar
|
var CarMap map[int]models.ServiceCar
|
||||||
var ReserveMap map[string]models.ReserveTimeFilter
|
var ReserveMap map[string]models.ReserveTimeFilter
|
||||||
var AddrServiceMap map[int64]models.AddrServiceTime
|
var AddrServiceMap map[int64]models.AddrServiceTime
|
||||||
|
var CouponsMap map[int]models.Coupons
|
||||||
|
|
||||||
func DataInit() {
|
func DataInit() {
|
||||||
//--------------------------------------------------宠物基础信息数据---------------------------------------------------------
|
//--------------------------------------------------宠物基础信息数据---------------------------------------------------------
|
||||||
|
|
@ -193,6 +197,14 @@ func DataInit() {
|
||||||
}
|
}
|
||||||
AddrServiceMap = AddrServiceMapC1
|
AddrServiceMap = AddrServiceMapC1
|
||||||
zap_server.ZAPLOG.Info("dataInit AddrServiceMap : ", zap.Any("AddrServiceMap", AddrServiceMap))
|
zap_server.ZAPLOG.Info("dataInit AddrServiceMap : ", zap.Any("AddrServiceMap", AddrServiceMap))
|
||||||
|
var couponsList []models.Coupons
|
||||||
|
database.Instance().Model(&models.Coupons{}).Where("status = 1 and expire_time > ?", time.Now().UnixNano()/int64(time.Millisecond)).Find(&couponsList)
|
||||||
|
var CouponsMapC1 = make(map[int]models.Coupons)
|
||||||
|
for _, value := range couponsList {
|
||||||
|
CouponsMapC1[value.Id] = value
|
||||||
|
}
|
||||||
|
CouponsMap = CouponsMapC1
|
||||||
|
zap_server.ZAPLOG.Info("dataInit CouponsMap : ", zap.Any("Coupons", CouponsMap))
|
||||||
}
|
}
|
||||||
|
|
||||||
func DataCacheJob() {
|
func DataCacheJob() {
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ var PetBase = "/pet"
|
||||||
var CarBase = "/car"
|
var CarBase = "/car"
|
||||||
var Admin = "/admin"
|
var Admin = "/admin"
|
||||||
var System = "/system"
|
var System = "/system"
|
||||||
|
var CouponsBase = "/coupons"
|
||||||
|
|
||||||
func (p DefParty) RegisterList() []web_iris.Party {
|
func (p DefParty) RegisterList() []web_iris.Party {
|
||||||
ps := []web_iris.Party{
|
ps := []web_iris.Party{
|
||||||
|
|
@ -46,6 +47,10 @@ func (p DefParty) RegisterList() []web_iris.Party {
|
||||||
p.carServiceOrderList(),
|
p.carServiceOrderList(),
|
||||||
p.carServiceProcess(),
|
p.carServiceProcess(),
|
||||||
p.index(),
|
p.index(),
|
||||||
|
//优惠券
|
||||||
|
p.getCouponsList(),
|
||||||
|
p.getUserCouponsList(),
|
||||||
|
p.drawCoupons(),
|
||||||
//系统
|
//系统
|
||||||
p.systemConfigInfo(),
|
p.systemConfigInfo(),
|
||||||
p.systemBanners(),
|
p.systemBanners(),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,120 @@
|
||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/kataras/iris/v12"
|
||||||
|
"github.com/kataras/iris/v12/context"
|
||||||
|
"io"
|
||||||
|
"pet-house.com/business/models"
|
||||||
|
"pet-house.com/business/utils"
|
||||||
|
"pet-house.com/core/server/database"
|
||||||
|
"pet-house.com/core/server/web/web_iris"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (p DefParty) getCouponsList() web_iris.Party {
|
||||||
|
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||||||
|
index.Post(CouponsBase+"/getCouponsList", func(ctx *context.Context) {
|
||||||
|
headerInfo := GetHeaderBaseInfo(ctx)
|
||||||
|
var userInfo *models.User
|
||||||
|
database.Instance().Model(&models.User{}).Where("id = ?", headerInfo.Uid).Find(&userInfo)
|
||||||
|
if userInfo == nil || userInfo.Id == 0 {
|
||||||
|
UserNotExistError.Fail(ctx, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var coupons []models.Coupons
|
||||||
|
database.Instance().Model(&models.Coupons{}).Where("status = 1 and expire_time > ?", time.Now().UnixNano()/int64(time.Millisecond)).Find(&coupons)
|
||||||
|
for index, coupon := range coupons {
|
||||||
|
coupons[index].PeriodInfo = strings.Split(coupon.Period, ",")
|
||||||
|
}
|
||||||
|
Success(ctx, headerInfo, coupons)
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetUserCouponsListRequest struct {
|
||||||
|
Status int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p DefParty) getUserCouponsList() web_iris.Party {
|
||||||
|
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||||||
|
index.Post(CouponsBase+"/getUserCouponsList", func(ctx *context.Context) {
|
||||||
|
headerInfo := GetHeaderBaseInfo(ctx)
|
||||||
|
var getUserCouponsListRequest GetUserCouponsListRequest
|
||||||
|
body, _ := io.ReadAll(ctx.Request().Body)
|
||||||
|
json.Unmarshal(body, &getUserCouponsListRequest)
|
||||||
|
if getUserCouponsListRequest.Status == 0 {
|
||||||
|
ParamError.Fail(ctx, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var userInfo *models.User
|
||||||
|
database.Instance().Model(&models.User{}).Where("id = ?", headerInfo.Uid).Find(&userInfo)
|
||||||
|
if userInfo == nil || userInfo.Id == 0 {
|
||||||
|
UserNotExistError.Fail(ctx, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var coupons []models.Coupons
|
||||||
|
database.Instance().Model(&models.Coupons{}).Joins("JOIN user_coupons on coupons.id = user_coupons.cid and coupons.expire_time > ?", time.Now().UnixNano()/int64(time.Millisecond)).Where(" user_coupons.coupons_status = ? and user_coupons.uid = ?", getUserCouponsListRequest.Status, headerInfo.Uid).Find(&coupons)
|
||||||
|
for index, coupon := range coupons {
|
||||||
|
coupons[index].PeriodInfo = strings.Split(coupon.Period, ",")
|
||||||
|
}
|
||||||
|
Success(ctx, headerInfo, coupons)
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
type DrawCouponsRequest struct {
|
||||||
|
Cid int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p DefParty) drawCoupons() web_iris.Party {
|
||||||
|
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||||||
|
index.Post(CouponsBase+"/drawCoupons", func(ctx *context.Context) {
|
||||||
|
headerInfo := GetHeaderBaseInfo(ctx)
|
||||||
|
var drawCouponsRequest DrawCouponsRequest
|
||||||
|
body, _ := io.ReadAll(ctx.Request().Body)
|
||||||
|
json.Unmarshal(body, &drawCouponsRequest)
|
||||||
|
if drawCouponsRequest.Cid == 0 {
|
||||||
|
ParamError.Fail(ctx, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var userInfo *models.User
|
||||||
|
database.Instance().Model(&models.User{}).Where("id = ?", headerInfo.Uid).Find(&userInfo)
|
||||||
|
if userInfo == nil || userInfo.Id == 0 {
|
||||||
|
UserNotExistError.Fail(ctx, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var coupons *models.Coupons
|
||||||
|
database.Instance().Model(&models.Coupons{}).Where("id = ?", drawCouponsRequest.Cid).Find(&coupons)
|
||||||
|
if coupons.Id == 0 {
|
||||||
|
CouponsNotExistError.Fail(ctx, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
lockMap := &utils.KeyedMutex{}
|
||||||
|
lockMap.Lock(headerInfo.Token)
|
||||||
|
var userCoupons *models.UserCoupons
|
||||||
|
database.Instance().Model(&models.UserCoupons{}).Where("uid = ? and cid = ?", headerInfo.Uid, drawCouponsRequest.Cid).Find(&userCoupons)
|
||||||
|
if userCoupons.Id > 0 {
|
||||||
|
UserCouponsNExistError.Fail(ctx, nil)
|
||||||
|
lockMap.Unlock(headerInfo.Token)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
newUserCoupons := models.UserCoupons{
|
||||||
|
Uid: headerInfo.Uid,
|
||||||
|
Cid: drawCouponsRequest.Cid,
|
||||||
|
}
|
||||||
|
err := database.Instance().Create(&newUserCoupons).Error
|
||||||
|
if err != nil {
|
||||||
|
ServerError.Fail(ctx, nil)
|
||||||
|
lockMap.Unlock(headerInfo.Token)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
lockMap.Unlock(headerInfo.Token)
|
||||||
|
Success(ctx, headerInfo, nil)
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
@ -18,15 +18,16 @@ type GoodsListRequest struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type GoodsDetail struct {
|
type GoodsDetail struct {
|
||||||
Id int64 `json:"id"` //商品ID
|
Id int64 `json:"id"` //商品ID
|
||||||
Name string `json:"name"` //商品名称
|
Name string `json:"name"` //商品名称
|
||||||
GoodsType int `json:"goodsType"` //商品类型 1基础服务 2附加产品 3附加服务
|
GoodsType int `json:"goodsType"` //商品类型 1基础服务 2附加产品 3附加服务
|
||||||
Time string `json:"time"` //时间
|
Time string `json:"time"` //时间
|
||||||
Price int `json:"price"` //价格
|
Price int `json:"price"` //价格
|
||||||
ParentId int64 `json:"parentId"` //商品父ID
|
ParentId int64 `json:"parentId"` //商品父ID
|
||||||
BuyMany int `json:"buyMany"` //同类型是否可购买多个 0否 1是
|
BuyMany int `json:"buyMany"` //同类型是否可购买多个 0否 1是
|
||||||
GoodsDetail string `json:"goodsDetail"` //商品详情 图片URL
|
GoodsDetail string `json:"goodsDetail"` //商品详情 图片URL
|
||||||
GoodsIcon string `json:"goodsIcon"` //iconUrl
|
GoodsIcon string `json:"goodsIcon"` //iconUrl
|
||||||
|
GoodsSubType int `json:"goodsSubType"` //商品子类型
|
||||||
GoodsSubList []GoodsDetail `json:"goodsSubList,omitempty"`
|
GoodsSubList []GoodsDetail `json:"goodsSubList,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,19 +124,21 @@ func getPetGoodsList(key string) []GoodsDetail {
|
||||||
BuyMany: goods.BuyMany,
|
BuyMany: goods.BuyMany,
|
||||||
GoodsDetail: goods.GoodsDetail,
|
GoodsDetail: goods.GoodsDetail,
|
||||||
GoodsIcon: goods.GoodsIcon,
|
GoodsIcon: goods.GoodsIcon,
|
||||||
|
GoodsSubType: goods.GoodsSubType,
|
||||||
GoodsSubList: nil,
|
GoodsSubList: nil,
|
||||||
}
|
}
|
||||||
for _, goodsSub := range GoodsMap {
|
for _, goodsSub := range GoodsMap {
|
||||||
if goodsSub.ParentId == goodsDetail.Id {
|
if goodsSub.ParentId == goodsDetail.Id {
|
||||||
goodsDetail.GoodsSubList = append(goodsDetail.GoodsSubList, GoodsDetail{
|
goodsDetail.GoodsSubList = append(goodsDetail.GoodsSubList, GoodsDetail{
|
||||||
Id: goodsSub.Id,
|
Id: goodsSub.Id,
|
||||||
Name: goodsSub.Name,
|
Name: goodsSub.Name,
|
||||||
GoodsType: goodsSub.GoodsType,
|
GoodsType: goodsSub.GoodsType,
|
||||||
Time: goodsSub.Time,
|
Time: goodsSub.Time,
|
||||||
Price: goodsSub.Price,
|
Price: goodsSub.Price,
|
||||||
BuyMany: goodsSub.BuyMany,
|
BuyMany: goodsSub.BuyMany,
|
||||||
GoodsDetail: goodsSub.GoodsDetail,
|
GoodsDetail: goodsSub.GoodsDetail,
|
||||||
GoodsIcon: goodsSub.GoodsIcon,
|
GoodsIcon: goodsSub.GoodsIcon,
|
||||||
|
GoodsSubType: goodsSub.GoodsSubType,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"github.com/kataras/iris/v12"
|
"github.com/kataras/iris/v12"
|
||||||
"github.com/kataras/iris/v12/context"
|
"github.com/kataras/iris/v12/context"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"pet-house.com/business/models"
|
|
||||||
"pet-house.com/business/utils"
|
"pet-house.com/business/utils"
|
||||||
"pet-house.com/core/server/database"
|
"pet-house.com/core/server/database"
|
||||||
"pet-house.com/core/server/web/web_iris"
|
"pet-house.com/core/server/web/web_iris"
|
||||||
|
|
@ -25,28 +24,31 @@ var frontExcludes = [...]string{
|
||||||
|
|
||||||
func ModuleInit() {
|
func ModuleInit() {
|
||||||
utils.WechatInit()
|
utils.WechatInit()
|
||||||
_ = database.Instance().AutoMigrate(
|
_err := database.Instance().AutoMigrate(
|
||||||
//&models.User{},
|
//&models.User{},
|
||||||
//&models.Pet{},
|
//&models.Pet{},
|
||||||
//&models.PetBaseInfo{},
|
//&models.PetBaseInfo{},
|
||||||
//&models.ServiceAddr{},
|
//&models.ServiceAddr{},
|
||||||
//&models.UserServiceAddr{},
|
//&models.UserServiceAddr{},
|
||||||
//&models.Goods{},
|
//&models.Goods{},
|
||||||
//&models.PetGoods{},
|
//&models.PetGoods{},
|
||||||
//&models.SystemConfig{},
|
//&models.SystemConfig{},
|
||||||
//&models.OrderMain{},
|
//&models.OrderMain{},
|
||||||
//&models.OrderSub{},
|
//&models.OrderSub{},
|
||||||
//&models.OrderDetail{},
|
//&models.OrderDetail{},
|
||||||
//&models.ServiceCar{},
|
//&models.ServiceCar{},
|
||||||
//&models.CarOrder{},
|
//&models.CarOrder{},
|
||||||
//&models.ServiceCarUser{},
|
//&models.ServiceCarUser{},
|
||||||
//&models.ServiceUserMark{},
|
//&models.ServiceUserMark{},
|
||||||
//&models.ServiceUserMarkRecord{},
|
//&models.ServiceUserMarkRecord{},
|
||||||
//&models.ReserveTimeFilter{},
|
//&models.ReserveTimeFilter{},
|
||||||
//&models.OrderServiceRecord{},
|
//&models.OrderServiceRecord{},
|
||||||
//&models.AddrServiceTime{},
|
//&models.AddrServiceTime{},
|
||||||
&models.UserAmountRecord{},
|
//&models.UserAmountRecord{},
|
||||||
|
//&models.Coupons{},
|
||||||
|
//&models.UserCoupons{},
|
||||||
)
|
)
|
||||||
|
zap_server.ZAPLOG.Info("data init ", zap.Any("err", _err))
|
||||||
DataInit()
|
DataInit()
|
||||||
DataCacheJob()
|
DataCacheJob()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type PetGoodsInfo struct {
|
type PetGoodsInfo struct {
|
||||||
PetId int64
|
Cid int //优惠券ID
|
||||||
GoodsIds []int64
|
PetId int64 //宠物ID
|
||||||
|
GoodsIds []int64 //商品列表
|
||||||
}
|
}
|
||||||
|
|
||||||
type OrderCreateRequest struct {
|
type OrderCreateRequest struct {
|
||||||
|
|
@ -56,7 +57,7 @@ func (p DefParty) orderCreatePreCheck() web_iris.Party {
|
||||||
for _, value := range orderCreateRequest.PetGoodsInfos {
|
for _, value := range orderCreateRequest.PetGoodsInfos {
|
||||||
for _, value := range value.GoodsIds {
|
for _, value := range value.GoodsIds {
|
||||||
goods := GoodsMap[value]
|
goods := GoodsMap[value]
|
||||||
orderTotalAmount = orderTotalAmount + int(goods.Price)
|
orderTotalAmount = orderTotalAmount + goods.Price
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
orderCreatePreCheckResponse := OrderCreatePreCheckResponse{
|
orderCreatePreCheckResponse := OrderCreatePreCheckResponse{
|
||||||
|
|
@ -95,6 +96,20 @@ func (p DefParty) orderCreate() web_iris.Party {
|
||||||
}
|
}
|
||||||
var projectionServiceTime = 0
|
var projectionServiceTime = 0
|
||||||
for _, value := range orderCreateRequest.PetGoodsInfos {
|
for _, value := range orderCreateRequest.PetGoodsInfos {
|
||||||
|
var userCoupons *models.UserCoupons
|
||||||
|
database.Instance().Model(&models.UserCoupons{}).Where("uid = ? and cid = ? and coupons_status = 1", headerBaseInfo.Uid, value.Cid).Find(&userCoupons)
|
||||||
|
if value.Cid > 0 {
|
||||||
|
if userCoupons.Id == 0 {
|
||||||
|
CouponsNotExistError.Fail(ctx, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
coupons := CouponsMap[value.Cid]
|
||||||
|
if coupons.Id == 0 {
|
||||||
|
CouponsNotExistError.Fail(ctx, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
userPet := GetUserPet(headerBaseInfo.Uid, value.PetId)
|
userPet := GetUserPet(headerBaseInfo.Uid, value.PetId)
|
||||||
var dog = userPet.PetBaseInfo.PetType == 2
|
var dog = userPet.PetBaseInfo.PetType == 2
|
||||||
var goodsType1 = false
|
var goodsType1 = false
|
||||||
|
|
@ -148,14 +163,23 @@ func (p DefParty) orderCreate() web_iris.Party {
|
||||||
var orderSubDetailList []models.OrderDetail
|
var orderSubDetailList []models.OrderDetail
|
||||||
var mainGoods = 0
|
var mainGoods = 0
|
||||||
for _, value := range orderCreateRequest.PetGoodsInfos {
|
for _, value := range orderCreateRequest.PetGoodsInfos {
|
||||||
|
coupons := CouponsMap[value.Cid]
|
||||||
subOrderId := NextId.Generate().String()
|
subOrderId := NextId.Generate().String()
|
||||||
var totalAmount = 0
|
var totalAmount = 0
|
||||||
|
var discountTotalAmount = 0
|
||||||
var projectionServiceTime = 0
|
var projectionServiceTime = 0
|
||||||
var goodsName string
|
var goodsName string
|
||||||
for _, value := range value.GoodsIds {
|
for _, value := range value.GoodsIds {
|
||||||
goods := GoodsMap[value]
|
goods := GoodsMap[value]
|
||||||
totalAmount = totalAmount + goods.Price
|
totalAmount = totalAmount + goods.Price
|
||||||
orderSubDetailList = append(orderSubDetailList, models.OrderDetail{SubOrderId: subOrderId, GoodsId: value, Amount: goods.Price})
|
if coupons.Id > 0 && coupons.GoodsSubType == goods.GoodsSubType {
|
||||||
|
//单个订单折扣
|
||||||
|
discountTotalAmount = discountTotalAmount + int(utils.RoundToOneDecimalPlace(float64(goods.Price)*(float64(coupons.Discount)/100.0))*10)
|
||||||
|
} else {
|
||||||
|
discountTotalAmount = discountTotalAmount + goods.Price
|
||||||
|
}
|
||||||
|
|
||||||
|
orderSubDetailList = append(orderSubDetailList, models.OrderDetail{SubOrderId: subOrderId, Cid: coupons.Id, Discount: coupons.Discount, GoodsId: value, Amount: goods.Price})
|
||||||
if goods.Time != "/" && len(goods.Time) > 0 {
|
if goods.Time != "/" && len(goods.Time) > 0 {
|
||||||
goodsTime, _ := strconv.Atoi(goods.Time)
|
goodsTime, _ := strconv.Atoi(goods.Time)
|
||||||
projectionServiceTime += goodsTime
|
projectionServiceTime += goodsTime
|
||||||
|
|
@ -169,17 +193,16 @@ func (p DefParty) orderCreate() web_iris.Party {
|
||||||
var petInfo = "宠物名称:" + userPetInfo.PetInfo.NickName + "</br>品种:" + userPetInfo.PetBaseInfo.Assortment + "</br>服务项目:" + goodsName
|
var petInfo = "宠物名称:" + userPetInfo.PetInfo.NickName + "</br>品种:" + userPetInfo.PetBaseInfo.Assortment + "</br>服务项目:" + goodsName
|
||||||
projectionServiceTimeAll += projectionServiceTime
|
projectionServiceTimeAll += projectionServiceTime
|
||||||
orderSub := models.OrderSub{
|
orderSub := models.OrderSub{
|
||||||
OrderId: subOrderId,
|
OrderId: subOrderId,
|
||||||
MainOrderId: orderMain.OrderId,
|
MainOrderId: orderMain.OrderId,
|
||||||
OrderStatus: 1,
|
OrderStatus: 1,
|
||||||
PetId: value.PetId,
|
PetId: value.PetId,
|
||||||
PayType: 1,
|
PayType: 1,
|
||||||
Discount: 100,
|
Discount: 100,
|
||||||
TotalAmount: totalAmount,
|
TotalAmount: totalAmount,
|
||||||
PayAmount: totalAmount,
|
PayAmount: totalAmount,
|
||||||
PetInfo: petInfo,
|
PetInfo: petInfo,
|
||||||
Status: 1,
|
Status: 1,
|
||||||
//PayTime: time.Now(),
|
|
||||||
ProjectionServiceTime: projectionServiceTime,
|
ProjectionServiceTime: projectionServiceTime,
|
||||||
}
|
}
|
||||||
orderTotalAmount = orderTotalAmount + totalAmount
|
orderTotalAmount = orderTotalAmount + totalAmount
|
||||||
|
|
@ -190,6 +213,7 @@ func (p DefParty) orderCreate() web_iris.Party {
|
||||||
orderLock.Unlock()
|
orderLock.Unlock()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
orderMain.ProjectionServiceTime = projectionServiceTimeAll
|
orderMain.ProjectionServiceTime = projectionServiceTimeAll
|
||||||
var userInfo *models.User
|
var userInfo *models.User
|
||||||
database.Instance().Model(&models.User{}).Where("id = ?", headerBaseInfo.Uid).Find(&userInfo)
|
database.Instance().Model(&models.User{}).Where("id = ?", headerBaseInfo.Uid).Find(&userInfo)
|
||||||
|
|
@ -236,6 +260,18 @@ func (p DefParty) orderCreate() web_iris.Party {
|
||||||
//orderSubList[index].PayAmount = int32(math.Round(float64(orderSubList[index].TotalAmount) * (discount / 100.0)))
|
//orderSubList[index].PayAmount = int32(math.Round(float64(orderSubList[index].TotalAmount) * (discount / 100.0)))
|
||||||
orderSubList[index].PayAmount = int(utils.RoundToOneDecimalPlace(float64(orderSubList[index].TotalAmount)*(discount/100.0)) * 10)
|
orderSubList[index].PayAmount = int(utils.RoundToOneDecimalPlace(float64(orderSubList[index].TotalAmount)*(discount/100.0)) * 10)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
userAmountRecord := models.UserAmountRecord{
|
||||||
|
UserId: userInfo.Id,
|
||||||
|
Type: 3,
|
||||||
|
OriginAmount: userInfo.Amount,
|
||||||
|
ProAmount: discountAmount,
|
||||||
|
CurrAmount: userInfo.Amount,
|
||||||
|
OrderId: orderId,
|
||||||
|
ProScene: "下单",
|
||||||
|
Status: 1,
|
||||||
|
}
|
||||||
|
tx.Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
||||||
}
|
}
|
||||||
var findUserServiceAddr models.UserServiceAddr
|
var findUserServiceAddr models.UserServiceAddr
|
||||||
database.Instance().Model(&models.UserServiceAddr{}).Where("id = ? and uid = ?", orderCreateRequest.ServiceAddrId, headerBaseInfo.Uid).Find(&findUserServiceAddr)
|
database.Instance().Model(&models.UserServiceAddr{}).Where("id = ? and uid = ?", orderCreateRequest.ServiceAddrId, headerBaseInfo.Uid).Find(&findUserServiceAddr)
|
||||||
|
|
@ -284,7 +320,7 @@ func GetOrderDetail(orderId string) OrderDetail {
|
||||||
Uid: orderMain.Uid,
|
Uid: orderMain.Uid,
|
||||||
UserAmount: float64(userInfo.Amount) / 10.0,
|
UserAmount: float64(userInfo.Amount) / 10.0,
|
||||||
}
|
}
|
||||||
if orderMain.PayDiscount > 0 {
|
if orderMain.PayStatus == 1 {
|
||||||
orderDetail.DiscountAmount = strconv.FormatFloat(float64(orderMain.PayTotalAmount)/10.0, 'f', 1, 64)
|
orderDetail.DiscountAmount = strconv.FormatFloat(float64(orderMain.PayTotalAmount)/10.0, 'f', 1, 64)
|
||||||
}
|
}
|
||||||
var subOrderList []SubOrder
|
var subOrderList []SubOrder
|
||||||
|
|
@ -307,7 +343,7 @@ func GetOrderDetail(orderId string) OrderDetail {
|
||||||
Discount: float64(orderSub.Discount),
|
Discount: float64(orderSub.Discount),
|
||||||
Goods: goods,
|
Goods: goods,
|
||||||
}
|
}
|
||||||
if orderSub.OrderStatus == 1 {
|
if orderSub.PayType == 3 {
|
||||||
x := float64(orderSub.PayAmount) / 10
|
x := float64(orderSub.PayAmount) / 10
|
||||||
orderSubR1.PayAmount = strconv.FormatFloat(x, 'f', 1, 64)
|
orderSubR1.PayAmount = strconv.FormatFloat(x, 'f', 1, 64)
|
||||||
}
|
}
|
||||||
|
|
@ -318,6 +354,9 @@ func GetOrderDetail(orderId string) OrderDetail {
|
||||||
} else {
|
} else {
|
||||||
orderSubR1.DiscountAmount = strconv.Itoa(orderSubR1.TotalAmount)
|
orderSubR1.DiscountAmount = strconv.Itoa(orderSubR1.TotalAmount)
|
||||||
}
|
}
|
||||||
|
if orderSub.PayType == 1 {
|
||||||
|
orderSubR1.PayAmount = strconv.Itoa(orderSubR1.TotalAmount)
|
||||||
|
}
|
||||||
subOrderList = append(subOrderList, orderSubR1)
|
subOrderList = append(subOrderList, orderSubR1)
|
||||||
}
|
}
|
||||||
var carOrder models.CarOrder
|
var carOrder models.CarOrder
|
||||||
|
|
@ -723,11 +762,11 @@ func (p DefParty) orderGoodsUpdate() web_iris.Party {
|
||||||
allProjectionServiceTime = allProjectionServiceTime + value.ProjectionServiceTime
|
allProjectionServiceTime = allProjectionServiceTime + value.ProjectionServiceTime
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var userInfo *models.User
|
||||||
|
database.Instance().Model(&models.User{}).Where("id = ?", orderMain.Uid).Find(&userInfo)
|
||||||
//已支付
|
//已支付
|
||||||
if orderMain.PayStatus == 1 {
|
if orderMain.PayStatus == 1 {
|
||||||
if orderMain.PayType == 3 {
|
if orderMain.PayType == 3 {
|
||||||
var userInfo *models.User
|
|
||||||
database.Instance().Model(&models.User{}).Where("id = ?", orderMain.Uid).Find(&userInfo)
|
|
||||||
var originAmount = userInfo.Amount
|
var originAmount = userInfo.Amount
|
||||||
//先退还 当前订单
|
//先退还 当前订单
|
||||||
userInfo.Amount = userInfo.Amount + orderSub.PayAmount
|
userInfo.Amount = userInfo.Amount + orderSub.PayAmount
|
||||||
|
|
@ -780,6 +819,25 @@ func (p DefParty) orderGoodsUpdate() web_iris.Party {
|
||||||
database.Instance().Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
database.Instance().Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
||||||
zap_server.ZAPLOG.Info("会员金额扣除", zap.Any("用户ID", userInfo.Id), zap.Any("订单ID", orderMain.OrderId), zap.Any("用户修改之前余额", originAmount), zap.Any("当前余额", userInfo.Amount), zap.Any("商品修改之前金额", preAmount), zap.Any("商品修改之后金额", orderMain.PayTotalAmount), zap.Any("折扣", userInfo.Discount))
|
zap_server.ZAPLOG.Info("会员金额扣除", zap.Any("用户ID", userInfo.Id), zap.Any("订单ID", orderMain.OrderId), zap.Any("用户修改之前余额", originAmount), zap.Any("当前余额", userInfo.Amount), zap.Any("商品修改之前金额", preAmount), zap.Any("商品修改之后金额", orderMain.PayTotalAmount), zap.Any("折扣", userInfo.Discount))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
var x = 0
|
||||||
|
if originOrderTotalAmount > nowOrderTotalAmount {
|
||||||
|
x = originOrderTotalAmount - nowOrderTotalAmount
|
||||||
|
} else if nowOrderTotalAmount > originOrderTotalAmount {
|
||||||
|
x = nowOrderTotalAmount - originOrderTotalAmount
|
||||||
|
}
|
||||||
|
|
||||||
|
userAmountRecord := models.UserAmountRecord{
|
||||||
|
UserId: userInfo.Id,
|
||||||
|
Type: 3,
|
||||||
|
OriginAmount: userInfo.Amount,
|
||||||
|
ProAmount: x * 10,
|
||||||
|
CurrAmount: userInfo.Amount,
|
||||||
|
OrderId: orderMain.OrderId,
|
||||||
|
ProScene: "修改订单服务项目",
|
||||||
|
Status: 1,
|
||||||
|
}
|
||||||
|
database.Instance().Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
||||||
}
|
}
|
||||||
|
|
||||||
database.Instance().Where("sub_order_id = ?", orderGoodsUpdateRequest.OrderId).Delete(&models.OrderDetail{})
|
database.Instance().Where("sub_order_id = ?", orderGoodsUpdateRequest.OrderId).Delete(&models.OrderDetail{})
|
||||||
|
|
|
||||||
|
|
@ -8,18 +8,19 @@ import "time"
|
||||||
|
|
||||||
// User 用户
|
// User 用户
|
||||||
type User struct {
|
type User struct {
|
||||||
Id int64 `gorm:"primaryKey;autoIncrement" json:"id"` //用户ID
|
Id int64 `gorm:"primaryKey;autoIncrement" json:"id"` //用户ID
|
||||||
NickName string `json:"nickName"` //昵称
|
NickName string `json:"nickName"` //昵称
|
||||||
HeadImgUrl string `json:"headImgUrl"` //用户头像URL
|
HeadImgUrl string `json:"headImgUrl"` //用户头像URL
|
||||||
Amount int `json:"amount"` //用户余额
|
Amount int `json:"amount"` //用户余额
|
||||||
OpenId string `gorm:"index;unique;not null" json:"openId"` //三方openid
|
OpenId string `gorm:"index;unique;not null" json:"openId"` //三方openid
|
||||||
UnionId string `gorm:"index;unique;not null" json:"unionId"` //三方unionid
|
UnionId string `gorm:"index;unique;not null" json:"unionId"` //三方unionid
|
||||||
UserType int `json:"userType"` //用户类型 0微信 1手机号
|
UserType int `json:"userType"` //用户类型 0微信 1手机号
|
||||||
Mobile string `json:"mobile"` //手机号
|
Mobile string `json:"mobile"` //手机号
|
||||||
Role int `json:"role"` //用户角色 0普通用户 1护理人员
|
Role int `json:"role"` //用户角色 0普通用户 1护理人员
|
||||||
Discount int `json:"discount"` //折扣
|
Discount int `json:"discount"` //折扣
|
||||||
CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP;not null" json:"createTime"` //创建时间
|
CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP;not null" json:"createTime"` //创建时间
|
||||||
Status int `json:"status"` //信息状态
|
Status int `json:"status"` //信息状态
|
||||||
|
InviteUserId int64 `json:"inviteUserId"` //邀请用户
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pet 宠物信息
|
// Pet 宠物信息
|
||||||
|
|
@ -83,17 +84,18 @@ type UserServiceAddr struct {
|
||||||
|
|
||||||
// Goods 商品信息
|
// Goods 商品信息
|
||||||
type Goods struct {
|
type Goods struct {
|
||||||
Id int64 `gorm:"primaryKey;autoIncrement" json:"id"` //商品ID
|
Id int64 `gorm:"primaryKey;autoIncrement" json:"id"` //商品ID
|
||||||
Name string `gorm:"not null" json:"name"` //商品名称
|
Name string `gorm:"not null" json:"name"` //商品名称
|
||||||
GoodsType int `gorm:"not null" json:"goodsType"` //商品类型 1基础服务 2附加产品 3附加服务
|
GoodsType int `gorm:"not null" json:"goodsType"` //商品类型 1基础服务 2附加产品 3附加服务
|
||||||
Time string `json:"time"` //时间
|
Time string `json:"time"` //时间
|
||||||
Price int `gorm:"not null" json:"price"` //价格
|
Price int `gorm:"not null" json:"price"` //价格
|
||||||
ParentId int64 `gorm:"not null" json:"parentId"` //商品父ID
|
ParentId int64 `gorm:"not null" json:"parentId"` //商品父ID
|
||||||
BuyMany int `gorm:"not null" json:"buyMany"` //同类型是否可购买多个 0否 1是
|
BuyMany int `gorm:"not null" json:"buyMany"` //同类型是否可购买多个 0否 1是
|
||||||
GoodsDetail string `gorm:"not null" json:"goodsDetail"` //商品详情 图片URL
|
GoodsDetail string `gorm:"not null" json:"goodsDetail"` //商品详情 图片URL
|
||||||
GoodsIcon string `json:"goodsIcon"` //iconUrl
|
GoodsIcon string `json:"goodsIcon"` //iconUrl
|
||||||
CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"-"` //创建时间
|
CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"-"` //创建时间
|
||||||
Status int `json:"status"` //信息状态
|
Status int `json:"status"` //信息状态
|
||||||
|
GoodsSubType int `gorm:"not null" json:"goodsSubType"` //商品子类型
|
||||||
}
|
}
|
||||||
|
|
||||||
// PetGoods 宠物商品
|
// PetGoods 宠物商品
|
||||||
|
|
@ -167,6 +169,8 @@ type OrderSub struct {
|
||||||
// OrderDetail 订单明细
|
// OrderDetail 订单明细
|
||||||
type OrderDetail struct {
|
type OrderDetail struct {
|
||||||
Id int64 `gorm:"primaryKey;autoIncrement" json:"id"` //id
|
Id int64 `gorm:"primaryKey;autoIncrement" json:"id"` //id
|
||||||
|
Cid int `json:"cid"` //子订单ID
|
||||||
|
Discount int `json:"discount"` //折扣
|
||||||
SubOrderId string `gorm:"index;not null" json:"subOrderId"` //子订单ID
|
SubOrderId string `gorm:"index;not null" json:"subOrderId"` //子订单ID
|
||||||
GoodsId int64 `gorm:"index;not null" json:"goodsId"` //商品ID
|
GoodsId int64 `gorm:"index;not null" json:"goodsId"` //商品ID
|
||||||
Amount int `gorm:"not null" json:"amount"` //价格
|
Amount int `gorm:"not null" json:"amount"` //价格
|
||||||
|
|
@ -263,3 +267,29 @@ type AddrServiceTime struct {
|
||||||
ServiceAddrId int64 `gorm:"not null" json:"ServiceAddrId"` //服务地址ID
|
ServiceAddrId int64 `gorm:"not null" json:"ServiceAddrId"` //服务地址ID
|
||||||
Times string `gorm:"not null" json:"times"` //时间列表
|
Times string `gorm:"not null" json:"times"` //时间列表
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Coupons 优惠券
|
||||||
|
type Coupons struct {
|
||||||
|
Id int `gorm:"primaryKey;autoIncrement" json:"id"` //id
|
||||||
|
Name string `gorm:"not null" json:"name"`
|
||||||
|
GoodsSubType int `gorm:"not null" json:"goodsSubType"` //商品子类型
|
||||||
|
Discount int `gorm:"not null" json:"discount"` //折扣
|
||||||
|
Source string `gorm:"not null" json:"source"` //来源
|
||||||
|
PeriodType int `gorm:"not null" json:"periodType"` //使用类型 0、无 1、星期 2、截至时间 3、指定日期可用
|
||||||
|
Period string `json:"-"` //使用信息 具体时间 星期类型:1,2,3截止日期:2024-09-01 23:59:59指定日期:2024-08-10
|
||||||
|
PeriodInfo []string `gorm:"-" json:"periodInfo"`
|
||||||
|
ExpireTime int64 `json:"expireTime"` //优惠券过期时间
|
||||||
|
CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"createTime"` //创建时间
|
||||||
|
UpdateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP" json:"-"` //更新时间
|
||||||
|
Status int `gorm:"default:1" json:"-"` //数据状态
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserCoupons struct {
|
||||||
|
Id int `gorm:"primaryKey;autoIncrement" json:"id"` //id
|
||||||
|
Uid int64 `gorm:"not null" json:"uid"` //用户id
|
||||||
|
Cid int `gorm:"not null" json:"cid"` //优惠券ID
|
||||||
|
CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"createTime"` //创建时间
|
||||||
|
UpdateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP" json:"-"` //更新时间
|
||||||
|
Status int `gorm:"default:1" json:"-"`
|
||||||
|
CouponsStatus int `gorm:"default:1" json:"status"` //状态 1未使用 2已使用 3已过期
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"pet-house.com/business/models"
|
"pet-house.com/business/models"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestGetStrDays(t *testing.T) {
|
func TestGetStrDays(t *testing.T) {
|
||||||
|
|
@ -54,3 +55,21 @@ func TestMath(t *testing.T) {
|
||||||
var a = int(RoundToOneDecimalPlace(float64(150)*(95/100.0)) * 10)
|
var a = int(RoundToOneDecimalPlace(float64(150)*(95/100.0)) * 10)
|
||||||
fmt.Println(a)
|
fmt.Println(a)
|
||||||
}
|
}
|
||||||
|
func TestMap(t *testing.T) {
|
||||||
|
var c1 = make(map[int]models.Coupons)
|
||||||
|
c1[1] = models.Coupons{
|
||||||
|
Id: 1,
|
||||||
|
Name: "111",
|
||||||
|
GoodsSubType: 0,
|
||||||
|
Discount: 0,
|
||||||
|
Source: "",
|
||||||
|
PeriodType: 0,
|
||||||
|
Period: "",
|
||||||
|
PeriodInfo: nil,
|
||||||
|
ExpireTime: 0,
|
||||||
|
CreateTime: time.Time{},
|
||||||
|
UpdateTime: time.Time{},
|
||||||
|
Status: 0,
|
||||||
|
}
|
||||||
|
print("12345", c1[2].Id)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
package utils
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
|
// KeyedMutex 提供基于键的锁定
|
||||||
|
type KeyedMutex struct {
|
||||||
|
mutexes sync.Map
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lock 锁定指定键
|
||||||
|
func (km *KeyedMutex) Lock(key string) {
|
||||||
|
mu, _ := km.mutexes.LoadOrStore(key, &sync.Mutex{})
|
||||||
|
mu.(*sync.Mutex).Lock()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unlock 解锁指定键
|
||||||
|
func (km *KeyedMutex) Unlock(key string) {
|
||||||
|
mu, ok := km.mutexes.Load(key)
|
||||||
|
if ok {
|
||||||
|
mu.(*sync.Mutex).Unlock()
|
||||||
|
km.mutexes.Delete(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue