156 lines
4.3 KiB
Go
156 lines
4.3 KiB
Go
|
package services
|
||
|
|
||
|
import (
|
||
|
"qteam/app/constants/common"
|
||
|
"qteam/app/constants/errorcode"
|
||
|
"qteam/app/http/entities/front"
|
||
|
"qteam/app/models/ordersmodel"
|
||
|
"qteam/app/models/productsmodel"
|
||
|
"qteam/app/models/usersmodel"
|
||
|
"qteam/app/utils"
|
||
|
redis_util "qteam/app/utils/redis"
|
||
|
"qteam/config"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
"xorm.io/builder"
|
||
|
)
|
||
|
|
||
|
func CreateOrderService(userId int, productId int) (code int, data front.InsertOrderResponse) {
|
||
|
var err error
|
||
|
{ // redis保证用户当前抽奖结束才能开始下次抽奖
|
||
|
key := utils.GetRealKey("lottery_code:" + strconv.Itoa(userId) + strconv.Itoa(productId))
|
||
|
ok, err := redis_util.AcquireLock(key, time.Second*10)
|
||
|
if ok {
|
||
|
defer redis_util.Del(key)
|
||
|
} else {
|
||
|
if err != nil {
|
||
|
utils.Log(nil, "CreateOrderService", err.Error())
|
||
|
}
|
||
|
code = errorcode.OrderLottery
|
||
|
return code, data
|
||
|
}
|
||
|
}
|
||
|
session := ordersmodel.GetInstance().GetDb().NewSession()
|
||
|
defer func() {
|
||
|
if err != nil {
|
||
|
_ = session.Rollback()
|
||
|
return
|
||
|
}
|
||
|
_ = session.Close()
|
||
|
}()
|
||
|
var product productsmodel.Products
|
||
|
has, err := productsmodel.GetInstance().GetDb().Where("id =?", productId).Get(&product)
|
||
|
if err != nil {
|
||
|
return errorcode.SystemError, data
|
||
|
}
|
||
|
if !has {
|
||
|
return errorcode.OrderProductNotExist, data
|
||
|
}
|
||
|
var user usersmodel.Users
|
||
|
_, err = usersmodel.GetInstance().GetDb().Where("id =?", userId).Get(&user)
|
||
|
if err != nil {
|
||
|
return errorcode.SystemError, data
|
||
|
}
|
||
|
order := ordersmodel.Orders{
|
||
|
OrderNo: utils.GenerateOrderNumber(),
|
||
|
UserId: userId,
|
||
|
ProductId: productId,
|
||
|
ProductName: product.Name,
|
||
|
UserName: user.Name,
|
||
|
Price: product.Price,
|
||
|
Mobile: user.Phone,
|
||
|
VoucherId: product.ThirdProductId,
|
||
|
State: common.STATUSABLED,
|
||
|
CreateTime: time.Now(),
|
||
|
}
|
||
|
if err = session.Begin(); err != nil {
|
||
|
return errorcode.SystemError, data
|
||
|
}
|
||
|
if _, err := session.Insert(order); err != nil {
|
||
|
utils.Log(nil, "CreateOrderService", err.Error())
|
||
|
return errorcode.SystemError, data
|
||
|
} else {
|
||
|
_ = session.Commit()
|
||
|
}
|
||
|
data.OrderNo = order.OrderNo
|
||
|
data.NotifyUrl = config.GetConf().YouChu.NotifyUrl
|
||
|
return errorcode.Success, data
|
||
|
}
|
||
|
|
||
|
func OrderQueryService(userId int, OrderRequest *front.OrderListRequest) (code int, data []ordersmodel.Orders, count int64) {
|
||
|
repo := ordersmodel.GetInstance().GetDb()
|
||
|
count, err := repo.Where("user_id = ?", userId).
|
||
|
Desc("id").Limit(OrderRequest.PageSize, (OrderRequest.Page-1)*OrderRequest.PageSize).FindAndCount(&data)
|
||
|
code = handErr(err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func OrderDetailService(order *ordersmodel.Orders) (has bool, err error) {
|
||
|
repo := ordersmodel.GetInstance().GetDb()
|
||
|
conn := builder.NewCond()
|
||
|
if order.Id != 0 {
|
||
|
conn = conn.And(builder.Eq{"id": order.Id})
|
||
|
}
|
||
|
if order.OrderNo != "" {
|
||
|
conn = conn.And(builder.Eq{"order_no": order.OrderNo})
|
||
|
}
|
||
|
return repo.Where(conn).Get(order)
|
||
|
}
|
||
|
|
||
|
func OrdersUpdateService(req front.OrdersUpdateRequest) (err error) {
|
||
|
repo := ordersmodel.GetInstance().GetDb()
|
||
|
var order ordersmodel.Orders
|
||
|
if req.Id != 0 {
|
||
|
order.Id = req.Id
|
||
|
}
|
||
|
if req.Status != 0 {
|
||
|
order.State = req.Status
|
||
|
}
|
||
|
if req.VoucherLink != "" {
|
||
|
order.VoucherLink = req.VoucherLink
|
||
|
}
|
||
|
_, err = repo.Where("Id = ?", req.Id).Update(&order)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func OrderRefundService(userId int, orderId int) (code int) {
|
||
|
{ // redis保证用户当前抽奖结束才能开始下次抽奖
|
||
|
key := utils.GetRealKey("lottery_code:" + strconv.Itoa(userId) + strconv.Itoa(orderId))
|
||
|
ok, err := redis_util.AcquireLock(key, time.Second*10)
|
||
|
if ok {
|
||
|
defer redis_util.Del(key)
|
||
|
} else {
|
||
|
if err != nil {
|
||
|
utils.Log(nil, "CreateOrderService", err.Error())
|
||
|
}
|
||
|
return errorcode.SystemError
|
||
|
}
|
||
|
}
|
||
|
order := ordersmodel.Orders{Id: orderId, UserId: userId}
|
||
|
has, err := OrderDetailService(&order)
|
||
|
if err != nil || !has {
|
||
|
return errorcode.NotFound
|
||
|
}
|
||
|
if order.State >= common.ORDER_STATUS_PAY {
|
||
|
return errorcode.OrderNOTAuthREFUND
|
||
|
}
|
||
|
code, response := YouChuOrderRefund(order)
|
||
|
if code != errorcode.Success {
|
||
|
return code
|
||
|
} else {
|
||
|
if response.RefundOrderSta != "03" {
|
||
|
return errorcode.OrderRefundFail
|
||
|
} else {
|
||
|
order.State = common.ORDER_STATUS_ReFUNDING
|
||
|
order.RefundOrderNo = response.RefundOrderNo
|
||
|
order.RefundOrderSta = response.RefundOrderSta
|
||
|
order.RefundTime = time.Now()
|
||
|
_, err := ordersmodel.GetInstance().GetDb().Update(order)
|
||
|
if err != nil {
|
||
|
return errorcode.OrderRefundUpdateFail
|
||
|
}
|
||
|
return errorcode.Success
|
||
|
}
|
||
|
}
|
||
|
}
|