1186 lines
46 KiB
Go
1186 lines
46 KiB
Go
package api
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"github.com/kataras/iris/v12"
|
||
"github.com/kataras/iris/v12/context"
|
||
"go.uber.org/zap"
|
||
"gorm.io/gorm"
|
||
"gorm.io/gorm/clause"
|
||
"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"
|
||
"pet-house.com/core/server/zap_server"
|
||
"strconv"
|
||
"sync"
|
||
"time"
|
||
)
|
||
|
||
type PetGoodsInfo struct {
|
||
Cid int //优惠券ID
|
||
PetId int64 //宠物ID
|
||
GoodsIds []int64 //商品列表
|
||
}
|
||
|
||
type OrderCreateRequest struct {
|
||
PetGoodsInfos []PetGoodsInfo //宠物商品信息列表
|
||
ServiceTime string //预约时间 yyyy-MM-dd HH:mm
|
||
ServiceAddrId int64 //预约服务地址
|
||
PayOrderId string //支付单号
|
||
}
|
||
|
||
type OrderCreateResponse struct {
|
||
OrderDetail OrderDetail `json:"orderDetail"`
|
||
}
|
||
|
||
type OrderCreatePreCheckResponse struct {
|
||
HasAlert bool `json:"hasAlert"` //是否弹窗提示 返回false直接下单,返回ture弹出确认框,确认框点击是之后调用下单接口
|
||
AlertMsg string `json:"alertMsg"` //弹窗消息
|
||
PayType int `json:"payType"` //扣款类型
|
||
}
|
||
|
||
func (p DefParty) orderCreatePreCheck() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderCreatePreCheck", func(ctx *context.Context) {
|
||
headerBaseInfo := GetHeaderBaseInfo(ctx)
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderCreateRequest OrderCreateRequest
|
||
json.Unmarshal(body, &orderCreateRequest)
|
||
if len(orderCreateRequest.PetGoodsInfos) == 0 {
|
||
ParamError.Fail(ctx, orderCreateRequest)
|
||
return
|
||
}
|
||
var userInfo *models.User
|
||
database.Instance().Model(&models.User{}).Where("id = ?", headerBaseInfo.Uid).Find(&userInfo)
|
||
var goodsDiscountAmount = 0
|
||
var goodsNotDiscountAmount = 0
|
||
var projectionServiceTime = 0
|
||
for _, value := range orderCreateRequest.PetGoodsInfos {
|
||
for _, gid := range value.GoodsIds {
|
||
goods := GoodsMap[gid]
|
||
if goods.Time != "/" && len(goods.Time) > 0 {
|
||
goodsTime, _ := strconv.Atoi(goods.Time)
|
||
projectionServiceTime += goodsTime
|
||
}
|
||
|
||
if value.Cid > 0 {
|
||
var userCouponsInfo models.UserCoupons
|
||
database.Instance().Model(&models.UserCoupons{}).Where("id = ?", value.Cid).Order(clause.OrderByColumn{Column: clause.Column{Name: "update_time"}, Desc: true}).Find(&userCouponsInfo)
|
||
var coupons = CouponsMap[userCouponsInfo.Cid]
|
||
if coupons.Id == 0 {
|
||
var couponsData *models.Coupons
|
||
database.Instance().Model(&models.Coupons{}).Where("id = ?", coupons.Id).Find(&couponsData)
|
||
coupons = models.Coupons{Id: couponsData.Id, Discount: couponsData.Discount, GoodsSubType: couponsData.GoodsSubType}
|
||
}
|
||
if goods.GoodsSubType == coupons.GoodsSubType {
|
||
goodsDiscountAmount = goodsDiscountAmount + int(utils.RoundToOneDecimalPlace(float64(goods.Price)*(float64(coupons.Discount)/100.0))*10)
|
||
} else {
|
||
goodsNotDiscountAmount = goodsNotDiscountAmount + goods.Price
|
||
}
|
||
}
|
||
}
|
||
}
|
||
haveReserve := checkOrderServiceTime(orderCreateRequest.ServiceTime, projectionServiceTime)
|
||
if haveReserve {
|
||
OrderCreateError.DefFail(ctx, orderCreateRequest, "当前订单预估服务时长预计:"+strconv.Itoa(projectionServiceTime)+"分钟,服务时间过长,请更换时间段预约或联系客服协助预约")
|
||
return
|
||
}
|
||
orderCreatePreCheckResponse := OrderCreatePreCheckResponse{
|
||
HasAlert: false,
|
||
PayType: 0,
|
||
}
|
||
if userInfo.Discount > 0 {
|
||
discount := float64(userInfo.Discount)
|
||
//此处计算享受会员折扣及优惠券折扣的价格
|
||
var discountAmount = int(utils.RoundToOneDecimalPlace(float64(goodsNotDiscountAmount)*(discount/100.0))*10) + goodsDiscountAmount
|
||
if userInfo.Amount < discountAmount {
|
||
//orderCreatePreCheckResponse.HasAlert = false
|
||
//orderCreatePreCheckResponse.AlertMsg = "您的会员余额不够,需要进行线下支付,当前订单将不享受会员折扣优惠价格"
|
||
//orderCreatePreCheckResponse.PayType = 0
|
||
} else {
|
||
orderCreatePreCheckResponse.PayType = 1
|
||
}
|
||
}
|
||
var systemConfigPay models.SystemConfig
|
||
database.Instance().Model(&models.SystemConfig{}).Where("config_type = 4").Order(clause.OrderByColumn{Column: clause.Column{Name: "sort"}, Desc: true}).Limit(1).Find(&systemConfigPay)
|
||
if systemConfigPay.Name == "payOff" {
|
||
orderCreatePreCheckResponse.PayType = 1
|
||
}
|
||
|
||
Success(ctx, orderCreateRequest, orderCreatePreCheckResponse)
|
||
})
|
||
}}
|
||
}
|
||
|
||
var orderLock sync.Mutex
|
||
|
||
// 创建
|
||
func (p DefParty) orderCreate() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderCreate", func(ctx *context.Context) {
|
||
headerBaseInfo := GetHeaderBaseInfo(ctx)
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderCreateRequest OrderCreateRequest
|
||
json.Unmarshal(body, &orderCreateRequest)
|
||
var userServiceAddr models.UserServiceAddr
|
||
database.Instance().Model(&models.UserServiceAddr{}).Where("uid = ? and id = ?", headerBaseInfo.Uid, orderCreateRequest.ServiceAddrId).Find(&userServiceAddr)
|
||
if userServiceAddr.Id == 0 {
|
||
UserServiceAddrNotExistError.Fail(ctx, nil)
|
||
return
|
||
}
|
||
var userCouponsList []*models.UserCoupons
|
||
var projectionServiceTime = 0
|
||
var userCoupons *models.UserCoupons
|
||
for _, value := range orderCreateRequest.PetGoodsInfos {
|
||
database.Instance().Model(&models.UserCoupons{}).Where("id = ? and coupons_status = 1", value.Cid).Find(&userCoupons)
|
||
userCouponsList = append(userCouponsList, userCoupons)
|
||
|
||
userPet := GetUserPet(headerBaseInfo.Uid, value.PetId)
|
||
var dog = userPet.PetBaseInfo.PetType == 2
|
||
var goodsType1 = false
|
||
for _, value := range value.GoodsIds {
|
||
goods := GoodsMap[value]
|
||
if goods.GoodsType == 1 {
|
||
goodsType1 = true
|
||
break
|
||
}
|
||
}
|
||
if dog && !goodsType1 {
|
||
OrderCreateError.DefFail(ctx, orderCreateRequest, "选择美容前提需要选择洗护商品")
|
||
return
|
||
}
|
||
for _, value := range value.GoodsIds {
|
||
goods := GoodsMap[value]
|
||
if goods.Time != "/" && len(goods.Time) > 0 {
|
||
goodsTime, _ := strconv.Atoi(goods.Time)
|
||
projectionServiceTime += goodsTime
|
||
}
|
||
}
|
||
}
|
||
haveReserve := checkOrderServiceTime(orderCreateRequest.ServiceTime, projectionServiceTime)
|
||
if haveReserve {
|
||
OrderCreateError.DefFail(ctx, orderCreateRequest, "当前订单预估服务时长预计:"+strconv.Itoa(projectionServiceTime)+"分钟,服务时间过长,请更换时间段预约或联系客服协助预约")
|
||
return
|
||
}
|
||
for _, value := range orderCreateRequest.PetGoodsInfos {
|
||
userPet := GetUserPet(headerBaseInfo.Uid, value.PetId)
|
||
if userPet.PetInfo.Vaccine == 0 {
|
||
OrderCreateError.DefFail(ctx, orderCreateRequest, "当前订单存在未接种疫苗的宠物,无法下单")
|
||
return
|
||
}
|
||
}
|
||
|
||
/*var payOrder *models.PayOrder
|
||
database.Instance().Model(&models.PayOrder{}).Where("order_id = ? and order_status = 0", orderCreateRequest.PayOrderId).Find(&payOrder)
|
||
if payOrder.Id > 0 {
|
||
OrderNotPayError.DefFail(ctx, orderCreateRequest, nil)
|
||
return
|
||
}*/
|
||
|
||
//订单总金额
|
||
var orderTotalAmount = 0
|
||
|
||
orderLock.Lock()
|
||
orderId := NextId.Generate().String()
|
||
orderMain := models.OrderMain{
|
||
OrderId: orderId,
|
||
Uid: headerBaseInfo.Uid,
|
||
OrderStatus: 1,
|
||
PayType: 1,
|
||
ServiceTime: orderCreateRequest.ServiceTime,
|
||
ServiceAddrId: orderCreateRequest.ServiceAddrId,
|
||
ServiceRemark: "",
|
||
Status: 1,
|
||
}
|
||
var projectionServiceTimeAll = 0
|
||
var orderSubList []models.OrderSub
|
||
var orderSubDetailList []models.OrderDetail
|
||
var mainGoods = 0
|
||
|
||
var coupons models.Coupons
|
||
for _, value := range orderCreateRequest.PetGoodsInfos {
|
||
//2025-02-06 00:00:00
|
||
givenTimestamp := int64(1738771200000)
|
||
|
||
// 获取当前的系统时间戳(毫秒级)
|
||
currentTimestamp := time.Now().UnixMilli()
|
||
//时间小于2025-02-06 00:00:00 不使用优惠券
|
||
if currentTimestamp < givenTimestamp {
|
||
value.Cid = 0
|
||
}
|
||
|
||
//可以参与会员折扣的金额
|
||
var needDiscountAmount = 0
|
||
//不可参与会员折扣的金额
|
||
var notDiscountAmount = 0
|
||
|
||
var userCouponsInfo models.UserCoupons
|
||
database.Instance().Model(&models.UserCoupons{}).Where("id = ?", value.Cid).Order(clause.OrderByColumn{Column: clause.Column{Name: "update_time"}, Desc: true}).Find(&userCouponsInfo)
|
||
coupons = CouponsMap[userCouponsInfo.Cid]
|
||
if coupons.Id == 0 {
|
||
var couponsData *models.Coupons
|
||
database.Instance().Model(&models.Coupons{}).Where("id = ?", userCouponsInfo.Cid).Find(&couponsData)
|
||
coupons = models.Coupons{Id: couponsData.Id, Discount: couponsData.Discount, GoodsSubType: couponsData.GoodsSubType}
|
||
}
|
||
subOrderId := NextId.Generate().String()
|
||
var totalAmount = 0
|
||
var projectionServiceTime = 0
|
||
var goodsName string
|
||
for _, value := range value.GoodsIds {
|
||
goods := GoodsMap[value]
|
||
totalAmount = totalAmount + goods.Price
|
||
orderDetail := models.OrderDetail{SubOrderId: subOrderId, GoodsId: value, Amount: goods.Price}
|
||
//设置订单详情折扣
|
||
if coupons.Id > 0 && coupons.GoodsSubType == goods.GoodsSubType {
|
||
orderDetail.Cid = coupons.Id
|
||
orderDetail.Discount = coupons.Discount
|
||
orderDetail.DiscountAmount = int(utils.RoundToOneDecimalPlace(float64(orderDetail.Amount)*(float64(coupons.Discount)/100.0)) * 10)
|
||
}
|
||
|
||
orderSubDetailList = append(orderSubDetailList, orderDetail)
|
||
if goods.Time != "/" && len(goods.Time) > 0 {
|
||
goodsTime, _ := strconv.Atoi(goods.Time)
|
||
projectionServiceTime += goodsTime
|
||
}
|
||
if goods.GoodsType == 1 || goods.GoodsType == 2 {
|
||
mainGoods++
|
||
}
|
||
goodsName = goods.Name + "、" + goodsName
|
||
//符合折扣金额才计入折扣价
|
||
if orderDetail.Cid > 0 && coupons.GoodsSubType == goods.GoodsSubType {
|
||
notDiscountAmount = notDiscountAmount + orderDetail.DiscountAmount
|
||
} else {
|
||
needDiscountAmount = needDiscountAmount + orderDetail.Amount
|
||
}
|
||
}
|
||
userPetInfo := GetUserPet(headerBaseInfo.Uid, value.PetId)
|
||
var weightStr = "无"
|
||
if userPetInfo.PetBaseInfo.PetType == 1 {
|
||
weightStr = CatWeightMap[userPetInfo.PetInfo.Weight]
|
||
} else {
|
||
weightStr = DogWeightMap[userPetInfo.PetInfo.Weight]
|
||
}
|
||
var petInfo = "宠物名称:" + userPetInfo.PetInfo.NickName + "</br>品种:" + userPetInfo.PetBaseInfo.Assortment + "</br>体重:" + weightStr + "</br>服务项目:" + goodsName
|
||
|
||
projectionServiceTimeAll += projectionServiceTime
|
||
|
||
/*for _, orderDetail := range orderSubDetailList {
|
||
goods := GoodsMap[orderDetail.GoodsId]
|
||
|
||
}*/
|
||
|
||
orderSub := models.OrderSub{
|
||
OrderId: subOrderId,
|
||
MainOrderId: orderMain.OrderId,
|
||
OrderStatus: 1,
|
||
PetId: value.PetId,
|
||
PayType: 1,
|
||
Discount: 100,
|
||
TotalAmount: totalAmount,
|
||
//折扣价格 默认*10
|
||
PayAmount: notDiscountAmount + needDiscountAmount*10,
|
||
//设置商品折扣金额用于后续打折计算
|
||
GoodsDiscountAmount: notDiscountAmount,
|
||
//设置商品非折扣金额
|
||
GoodsOriginAmount: needDiscountAmount,
|
||
//宠物信息
|
||
PetInfo: petInfo,
|
||
Status: 1,
|
||
ProjectionServiceTime: projectionServiceTime,
|
||
Cid: coupons.Id,
|
||
Ucid: userCoupons.Id,
|
||
}
|
||
//订单总金额
|
||
orderTotalAmount = orderTotalAmount + totalAmount
|
||
orderSubList = append(orderSubList, orderSub)
|
||
}
|
||
if mainGoods == 0 {
|
||
OrderCreateError.DefFail(ctx, orderCreateRequest, "订单未选择主商品,创建失败")
|
||
orderLock.Unlock()
|
||
return
|
||
}
|
||
|
||
orderMain.ProjectionServiceTime = projectionServiceTimeAll
|
||
var userInfo *models.User
|
||
database.Instance().Model(&models.User{}).Where("id = ?", headerBaseInfo.Uid).Find(&userInfo)
|
||
|
||
//计算参与折扣计算的金额
|
||
var discountAmount = 0
|
||
var orderGoodsDiscountAmount = 0
|
||
//参与计算折扣的金额
|
||
var inDiscountAmount = 0
|
||
for _, orderSub := range orderSubList {
|
||
inDiscountAmount = inDiscountAmount + orderSub.GoodsOriginAmount
|
||
orderGoodsDiscountAmount = orderGoodsDiscountAmount + orderSub.GoodsDiscountAmount
|
||
}
|
||
//用户折扣排除使用优惠券的商品总金额
|
||
if userInfo.Discount > 0 {
|
||
discount := float64(userInfo.Discount)
|
||
discountAmount = int(utils.RoundToOneDecimalPlace(float64(inDiscountAmount)*(discount/100.0)) * 10)
|
||
} else {
|
||
discountAmount = int(utils.RoundToOneDecimalPlace(float64(inDiscountAmount) * 10))
|
||
}
|
||
orderMain.TotalAmount = orderTotalAmount
|
||
tx := database.Instance().Begin()
|
||
var db4 *gorm.DB
|
||
//用户需要扣除总金额
|
||
if userInfo.Amount >= discountAmount+orderGoodsDiscountAmount {
|
||
var currAmount = userInfo.Amount
|
||
orderMain.PayStatus = 1
|
||
orderMain.PayTotalAmount = discountAmount + orderGoodsDiscountAmount
|
||
userInfo.Amount = userInfo.Amount - discountAmount - orderGoodsDiscountAmount
|
||
updateValues := map[string]interface{}{
|
||
"Amount": userInfo.Amount,
|
||
}
|
||
db4 = tx.Model(&userInfo).Updates(&updateValues)
|
||
orderMain.PayDiscount = userInfo.Discount
|
||
orderMain.PayType = 3
|
||
for index := range orderSubList {
|
||
orderSubList[index].PayType = 3
|
||
}
|
||
userAmountRecord := models.UserAmountRecord{
|
||
UserId: userInfo.Id,
|
||
Type: 2,
|
||
OriginAmount: currAmount,
|
||
ProAmount: discountAmount + orderGoodsDiscountAmount,
|
||
CurrAmount: userInfo.Amount,
|
||
OrderId: orderId,
|
||
ProScene: "下单",
|
||
Status: 1,
|
||
}
|
||
price := 0.0
|
||
for index_, orderSub := range orderSubList {
|
||
if userInfo.Discount > 0 {
|
||
discount := float64(userInfo.Discount)
|
||
discountAmount1 := int(utils.RoundToOneDecimalPlace(float64(orderSub.GoodsOriginAmount)*(discount/100.0)) * 10)
|
||
orderSubList[index_].PayAmount = discountAmount1 + orderSub.GoodsDiscountAmount
|
||
}
|
||
price = price + float64(orderSub.PayAmount)
|
||
}
|
||
tx.Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
||
zap_server.ZAPLOG.Info("会员金额扣除", zap.Any("用户ID", userInfo.Id), zap.Any("订单号", orderMain.OrderId), zap.Any("当前余额", currAmount), zap.Any("扣除余额", discountAmount+orderGoodsDiscountAmount), zap.Any("剩余余额", userInfo.Amount), zap.Any("折扣", userInfo.Discount), zap.Any("优惠券折扣信息", coupons))
|
||
for index_, _ := range orderSubList {
|
||
orderSubList[index_].Discount = userInfo.Discount
|
||
}
|
||
|
||
payOrder := models.PayOrder{
|
||
OrderId: orderId,
|
||
OrderName: "宠物洗护付款(会员余额)-" + orderMain.OrderId,
|
||
OrderPrice: fmt.Sprintf("%.1f", price),
|
||
RechargeId: 0,
|
||
PayId: "",
|
||
Uid: headerBaseInfo.Uid,
|
||
OrderStatus: 3,
|
||
}
|
||
database.Instance().Model(&models.PayOrder{}).Create(&payOrder)
|
||
} else {
|
||
userAmountRecord := models.UserAmountRecord{
|
||
UserId: userInfo.Id,
|
||
Type: 3,
|
||
OriginAmount: userInfo.Amount,
|
||
ProAmount: inDiscountAmount*10 + orderGoodsDiscountAmount,
|
||
CurrAmount: userInfo.Amount,
|
||
OrderId: orderId,
|
||
ProScene: "下单",
|
||
Status: 1,
|
||
}
|
||
tx.Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
||
}
|
||
orderMain.PayOrderId = orderCreateRequest.PayOrderId
|
||
var findUserServiceAddr models.UserServiceAddr
|
||
database.Instance().Model(&models.UserServiceAddr{}).Where("id = ? and uid = ?", orderCreateRequest.ServiceAddrId, headerBaseInfo.Uid).Find(&findUserServiceAddr)
|
||
userInfo.Mobile = findUserServiceAddr.Mobile
|
||
updateValues := map[string]interface{}{
|
||
"Mobile": userInfo.Mobile,
|
||
}
|
||
tx.Model(&userInfo).Updates(&updateValues)
|
||
db := tx.Model(&models.OrderDetail{}).CreateInBatches(&orderSubDetailList, len(orderSubDetailList))
|
||
db1 := tx.Model(&models.OrderSub{}).CreateInBatches(&orderSubList, len(orderSubList))
|
||
db2 := tx.Model(&models.OrderMain{}).Create(&orderMain)
|
||
for _, userCoupons := range userCouponsList {
|
||
updateUserCoupons := map[string]interface{}{
|
||
"CouponsStatus": 2,
|
||
}
|
||
//更新用户优惠券状态
|
||
tx.Model(&userCoupons).Updates(&updateUserCoupons)
|
||
}
|
||
if (db4 != nil && db4.Error != nil) || db.Error != nil || db1.Error != nil || db2.Error != nil {
|
||
tx.Callback()
|
||
orderLock.Unlock()
|
||
zap_server.ZAPLOG.Error("订单插入失败", zap.Any("db", db.Error), zap.Any("db1", db1.Error), zap.Any("db2", db2.Error), zap.Any("db4", db4.Error))
|
||
OrderCreateError.Fail(ctx, orderCreateRequest)
|
||
return
|
||
}
|
||
tx.Commit()
|
||
orderLock.Unlock()
|
||
Success(ctx, orderCreateRequest, OrderCreateResponse{GetOrderDetail(orderMain.OrderId)})
|
||
})
|
||
}}
|
||
}
|
||
|
||
func GetOrderDetail(orderId string) OrderDetail {
|
||
var orderMain models.OrderMain
|
||
database.Instance().Model(&models.OrderMain{}).Where("order_id = ? and status = 1", orderId).Find(&orderMain)
|
||
var findUserServiceAddr models.UserServiceAddr
|
||
database.Instance().Model(&models.UserServiceAddr{}).Where("id = ?", orderMain.ServiceAddrId).Find(&findUserServiceAddr)
|
||
var userInfo *models.User
|
||
database.Instance().Model(&models.User{}).Where("id = ?", orderMain.Uid).Find(&userInfo)
|
||
|
||
orderDetail := OrderDetail{
|
||
OrderId: orderMain.OrderId,
|
||
Status: orderMain.OrderStatus,
|
||
ServiceTime: orderMain.ServiceTime,
|
||
ServiceAddr: findUserServiceAddr,
|
||
ServiceRemark: orderMain.ServiceRemark,
|
||
CreateTime: orderMain.CreateTime.Format("2006-01-02 15:04:05"),
|
||
PayStatus: orderMain.PayStatus,
|
||
DispatchStatus: orderMain.DispatchStatus,
|
||
TotalAmount: orderMain.TotalAmount,
|
||
DiscountAmount: strconv.Itoa(orderMain.TotalAmount),
|
||
Discount: float64(orderMain.PayDiscount) / 100,
|
||
Uid: orderMain.Uid,
|
||
UserAmount: float64(userInfo.Amount) / 10.0,
|
||
MarkStatus: orderMain.MarkStatus,
|
||
}
|
||
|
||
if orderMain.PayStatus == 1 {
|
||
orderDetail.DiscountAmount = strconv.FormatFloat(float64(orderMain.PayTotalAmount)/10.0, 'f', 1, 64)
|
||
}
|
||
var discountTotalAmount = 0
|
||
var subOrderList []SubOrder
|
||
var orderSubList []models.OrderSub
|
||
database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ? ", orderMain.OrderId).Find(&orderSubList)
|
||
for _, orderSub := range orderSubList {
|
||
var orderDetailList []models.OrderDetail
|
||
database.Instance().Model(&models.OrderDetail{}).Where("sub_order_id = ? ", orderSub.OrderId).Find(&orderDetailList)
|
||
var goods []models.Goods
|
||
var couponsGoods models.Goods
|
||
var coupons models.Coupons
|
||
for _, orderDetail := range orderDetailList {
|
||
good := GoodsMap[orderDetail.GoodsId]
|
||
goods = append(goods, good)
|
||
coupons = CouponsMap[orderSub.Cid]
|
||
if coupons.Id == 0 {
|
||
var couponsS *models.Coupons
|
||
database.Instance().Model(&models.Coupons{}).Where("id = ?", orderSub.Cid).Find(&couponsS)
|
||
coupons = models.Coupons{
|
||
Id: couponsS.Id,
|
||
Name: couponsS.Name,
|
||
GoodsSubType: couponsS.GoodsSubType,
|
||
Discount: couponsS.Discount,
|
||
Source: couponsS.Source,
|
||
PeriodType: couponsS.PeriodType,
|
||
Period: couponsS.Period,
|
||
PeriodInfo: couponsS.PeriodInfo,
|
||
ExpireTime: couponsS.ExpireTime,
|
||
CreateTime: couponsS.CreateTime,
|
||
UpdateTime: couponsS.UpdateTime,
|
||
Status: couponsS.Status,
|
||
SendStatus: couponsS.SendStatus,
|
||
ReceiverStatus: couponsS.ReceiverStatus,
|
||
}
|
||
}
|
||
if orderSub.Cid > 0 {
|
||
if coupons.GoodsSubType == good.GoodsSubType {
|
||
couponsGoods = good
|
||
}
|
||
}
|
||
}
|
||
|
||
orderSubR1 := SubOrder{
|
||
OrderId: orderSub.OrderId,
|
||
Status: orderSub.OrderStatus,
|
||
UserPetInfo: GetUserPet(orderMain.Uid, orderSub.PetId),
|
||
TotalAmount: orderSub.TotalAmount,
|
||
PayAmount: strconv.Itoa(orderSub.PayAmount),
|
||
Discount: float64(orderSub.Discount),
|
||
Goods: goods,
|
||
Coupons: nil,
|
||
CouponsAmount: "0",
|
||
}
|
||
if coupons.Id > 0 {
|
||
orderSubR1.Coupons = &models.Coupons{
|
||
Id: coupons.Id,
|
||
Name: coupons.Name,
|
||
GoodsSubType: coupons.GoodsSubType,
|
||
Discount: coupons.Discount,
|
||
Source: coupons.Source,
|
||
PeriodType: coupons.PeriodType,
|
||
Period: coupons.Period,
|
||
PeriodInfo: coupons.PeriodInfo,
|
||
SendStatus: coupons.SendStatus,
|
||
}
|
||
orderSubR1.CouponsAmount = strconv.FormatFloat(float64(couponsGoods.Price*10-orderSub.GoodsDiscountAmount)/10, 'f', 1, 64)
|
||
} else {
|
||
orderSubR1.Coupons = nil
|
||
}
|
||
discountTotalAmount = discountTotalAmount + orderSub.GoodsOriginAmount*10 + orderSub.GoodsDiscountAmount
|
||
if orderSub.PayType == 3 || orderSubR1.Coupons != nil {
|
||
x := float64(orderSub.PayAmount) / 10
|
||
orderSubR1.PayAmount = strconv.FormatFloat(x, 'f', 1, 64)
|
||
}
|
||
if orderSubR1.Discount < 100 || orderSubR1.Coupons != nil {
|
||
orderSubR1.DiscountAmount = orderSubR1.PayAmount
|
||
} else {
|
||
if orderSub.PayAmount > 0 {
|
||
orderSubR1.DiscountAmount = strconv.FormatFloat(float64(orderSub.PayAmount)/10, 'f', 1, 64)
|
||
} else {
|
||
orderSubR1.DiscountAmount = strconv.Itoa(orderSubR1.TotalAmount)
|
||
}
|
||
}
|
||
if orderSub.PayType == 1 && orderSubR1.Coupons == nil {
|
||
orderSubR1.PayAmount = strconv.Itoa(orderSubR1.TotalAmount)
|
||
}
|
||
if len(orderSubR1.PayAmount) == 0 {
|
||
orderSubR1.PayAmount = "0"
|
||
}
|
||
if len(orderSubR1.PayAmount) == 0 {
|
||
orderSubR1.PayAmount = "0"
|
||
}
|
||
|
||
subOrderList = append(subOrderList, orderSubR1)
|
||
}
|
||
if discountTotalAmount > 0 {
|
||
orderDetail.DiscountAmount = strconv.Itoa(discountTotalAmount / 10.0)
|
||
}
|
||
var carOrder models.CarOrder
|
||
database.Instance().Model(&models.CarOrder{}).Where("order_id = ?", orderMain.OrderId).Find(&carOrder)
|
||
if carOrder.Id > 0 {
|
||
car := CarMap[carOrder.CarId]
|
||
orderDetail.ServiceCar = &car
|
||
} else {
|
||
orderDetail.ServiceCar = &models.ServiceCar{}
|
||
}
|
||
orderDetail.SubOrderList = subOrderList
|
||
return orderDetail
|
||
}
|
||
|
||
func checkOrderServiceTime(serviceTime string, projectionServiceTime int) bool {
|
||
|
||
serviceTimeD, _ := time.Parse("2006-01-02 15:04", serviceTime)
|
||
hour := serviceTimeD.Hour()
|
||
if hour == 20 && projectionServiceTime > 2*60 {
|
||
return true
|
||
}
|
||
if hour == 21 && projectionServiceTime > 1*60 {
|
||
return true
|
||
}
|
||
|
||
var orderTempList []utils.OrderTemp
|
||
database.Instance().Model(&models.OrderMain{}).Where("service_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) and order_status != 3 and order_status != 4 and status = 1").Find(&orderTempList)
|
||
return utils.CheckAvailability(orderTempList, len(CarMap), serviceTime, projectionServiceTime)
|
||
}
|
||
|
||
type OrderListRequest struct {
|
||
Status int //订单状态 0所有 1待服务 2服务中 3已完成 4已取消
|
||
PageNo int //页码
|
||
PageSize int //数据数量
|
||
}
|
||
|
||
type SubOrder struct {
|
||
OrderId string `json:"orderId"` //子订单ID
|
||
Status int `json:"status"` //子订单状态 0待派单 1待服务 2服务中 3已完成 4已取消
|
||
UserPetInfo UserPetInfo `json:"userPetInfo"` //用户宠物信息
|
||
TotalAmount int `json:"totalAmount"` //总金额
|
||
PayAmount string `json:"payAmount"` //实际支付金额
|
||
DiscountAmount string `json:"discountAmount"` //折扣金额
|
||
Discount float64 `json:"discount"` //用户折扣
|
||
Goods []models.Goods `json:"goods"` //商品信息
|
||
Coupons *models.Coupons `json:"coupons"` //优惠券信息
|
||
CouponsAmount string `json:"couponsAmount"` //优惠券减免金额
|
||
}
|
||
|
||
type OrderDetail struct {
|
||
OrderId string `json:"orderId"` //主订单号
|
||
Status int `json:"status"` //主订单状态 0待派单 1待服务 2服务中 3已完成 4已取消
|
||
ServiceTime string `json:"serviceTime"` //服务时间
|
||
ServiceAddr models.UserServiceAddr `json:"serviceAddr"` //服务地址信息
|
||
ServiceRemark string `json:"serviceRemark"` //服务备注
|
||
CreateTime string `json:"createTime"` //创建时间
|
||
SubOrderList []SubOrder `json:"subOrderList"` //子订单列表
|
||
ServiceCar *models.ServiceCar `json:"serviceCar"` //服务车辆 只有派单状态未1的时候才会存在
|
||
PayStatus int `json:"payStatus"` //支付状态 0未支付 1已支付
|
||
DispatchStatus int `json:"dispatchStatus"` //派单状态 0未派单 1已派单
|
||
Discount float64 `json:"discount"` //用户折扣
|
||
TotalAmount int `json:"totalAmount"` //总金额
|
||
DiscountAmount string `json:"discountAmount"` //折扣金额
|
||
Uid int64 `json:"uid"` //用户ID
|
||
UserAmount float64 `json:"userAmount"` //用户余额
|
||
MarkStatus int `json:"markStatus"` //订单是否已评价
|
||
}
|
||
|
||
type OrderListResponse struct {
|
||
OrderDetails []OrderDetail `json:"orderDetails"` //订单列表
|
||
PageNo int `json:"pageNo"` //页码
|
||
PageSize int `json:"pageSize"` //数据数量
|
||
}
|
||
|
||
// 订单列表
|
||
func (p DefParty) orderList() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderList", func(ctx *context.Context) {
|
||
headerBaseInfo := GetHeaderBaseInfo(ctx)
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderListRequest OrderListRequest
|
||
json.Unmarshal(body, &orderListRequest)
|
||
if orderListRequest.PageNo == 0 {
|
||
ParamError.DefFail(ctx, orderListRequest, "页码必须>0")
|
||
return
|
||
}
|
||
var orderList []models.OrderMain
|
||
if orderListRequest.Status == 0 {
|
||
database.Instance().Model(&models.OrderMain{}).Where("uid = ? and status = 1", headerBaseInfo.Uid).Order(clause.OrderByColumn{Column: clause.Column{Name: "create_time"}, Desc: true}).Offset((orderListRequest.PageNo - 1) * orderListRequest.PageSize).Limit(orderListRequest.PageSize).Find(&orderList)
|
||
} else {
|
||
database.Instance().Model(&models.OrderMain{}).Where("uid = ? and order_status = ? and status = 1", headerBaseInfo.Uid, orderListRequest.Status).Order(clause.OrderByColumn{Column: clause.Column{Name: "create_time"}, Desc: true}).Offset((orderListRequest.PageNo - 1) * orderListRequest.PageSize).Limit(orderListRequest.PageSize).Find(&orderList)
|
||
}
|
||
var orderDetails []OrderDetail
|
||
for _, value := range orderList {
|
||
var findUserServiceAddr models.UserServiceAddr
|
||
database.Instance().Model(&models.UserServiceAddr{}).Where("id = ? and uid = ?", value.ServiceAddrId, headerBaseInfo.Uid).Find(&findUserServiceAddr)
|
||
orderDetail := OrderDetail{
|
||
OrderId: value.OrderId,
|
||
Status: value.OrderStatus,
|
||
ServiceTime: value.ServiceTime,
|
||
ServiceAddr: findUserServiceAddr,
|
||
ServiceRemark: value.ServiceRemark,
|
||
CreateTime: value.CreateTime.Format("2006-01-02 15:04:05"),
|
||
PayStatus: value.PayStatus,
|
||
DispatchStatus: value.DispatchStatus,
|
||
TotalAmount: value.TotalAmount,
|
||
DiscountAmount: strconv.FormatFloat(float64(value.PayTotalAmount)/10.0, 'f', 1, 64),
|
||
Discount: float64(value.PayDiscount / 100.0),
|
||
MarkStatus: value.MarkStatus,
|
||
}
|
||
var subOrderList []SubOrder
|
||
var orderSubList []models.OrderSub
|
||
database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ? ", value.OrderId).Find(&orderSubList)
|
||
for _, orderSub := range orderSubList {
|
||
var orderDetailList []models.OrderDetail
|
||
database.Instance().Model(&models.OrderDetail{}).Where("sub_order_id = ? ", orderSub.OrderId).Find(&orderDetailList)
|
||
var goods []models.Goods
|
||
for _, orderDetail := range orderDetailList {
|
||
good := GoodsMap[orderDetail.GoodsId]
|
||
goods = append(goods, good)
|
||
}
|
||
orderSub := SubOrder{
|
||
OrderId: orderSub.OrderId,
|
||
Status: orderSub.OrderStatus,
|
||
UserPetInfo: GetUserPet(value.Uid, orderSub.PetId),
|
||
TotalAmount: orderSub.TotalAmount,
|
||
Discount: float64(orderSub.Discount / 100.0),
|
||
Goods: goods,
|
||
}
|
||
if orderSub.Discount > 0 {
|
||
//orderSub.PayAmount = int32(math.Round(float64(orderSub.TotalAmount) * (orderSub.Discount / 100.0)))
|
||
//orderSub.DiscountAmount = orderSub.PayAmount
|
||
x := float64(orderSub.TotalAmount) * (orderSub.Discount / 100.0) / 10
|
||
orderSub.PayAmount = strconv.FormatFloat(x, 'f', 1, 64)
|
||
orderSub.DiscountAmount = orderSub.PayAmount
|
||
}
|
||
subOrderList = append(subOrderList, orderSub)
|
||
}
|
||
orderDetail.SubOrderList = subOrderList
|
||
orderDetails = append(orderDetails, orderDetail)
|
||
}
|
||
var orderListResponse = OrderListResponse{
|
||
OrderDetails: orderDetails,
|
||
PageNo: orderListRequest.PageNo + 1,
|
||
PageSize: orderListRequest.PageSize,
|
||
}
|
||
Success(ctx, orderListRequest, orderListResponse)
|
||
})
|
||
}}
|
||
}
|
||
|
||
type OrderCancelRequest struct {
|
||
OrderId string
|
||
}
|
||
|
||
type OrderCancelResponse struct {
|
||
OrderDetail OrderDetail `json:"orderDetail"`
|
||
}
|
||
|
||
func (p DefParty) orderCancel() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderCancel", func(ctx *context.Context) {
|
||
headerBaseInfo := GetHeaderBaseInfo(ctx)
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderCancelRequest OrderCancelRequest
|
||
json.Unmarshal(body, &orderCancelRequest)
|
||
var orderMain models.OrderMain
|
||
database.Instance().Model(&models.OrderMain{}).Where("order_id = ? and status = 1", orderCancelRequest.OrderId).Find(&orderMain)
|
||
if orderMain.Uid != headerBaseInfo.Uid {
|
||
OrderExistError.Fail(ctx, orderCancelRequest)
|
||
return
|
||
}
|
||
if orderMain.OrderStatus != 1 {
|
||
OrderError.Fail(ctx, orderCancelRequest)
|
||
return
|
||
}
|
||
if orderMain.DispatchStatus == 1 {
|
||
OrderError.Fail(ctx, orderCancelRequest)
|
||
return
|
||
}
|
||
if orderMain.PayStatus == 1 {
|
||
var userInfo models.User
|
||
database.Instance().Model(&models.User{}).Where("id = ?", orderMain.Uid).Find(&userInfo)
|
||
var originAmount = userInfo.Amount
|
||
userInfo.Amount = userInfo.Amount + orderMain.PayTotalAmount
|
||
updateValues := map[string]interface{}{
|
||
"Amount": userInfo.Amount,
|
||
}
|
||
database.Instance().Model(&userInfo).Updates(&updateValues)
|
||
userAmountRecord := models.UserAmountRecord{
|
||
UserId: userInfo.Id,
|
||
Type: 1,
|
||
OriginAmount: originAmount,
|
||
ProAmount: orderMain.PayTotalAmount,
|
||
CurrAmount: userInfo.Amount,
|
||
OrderId: orderMain.OrderId,
|
||
ProScene: "用户取消订单",
|
||
Status: 1,
|
||
}
|
||
database.Instance().Model(&models.UserAmountRecord{}).Create(&userAmountRecord)
|
||
orderMain.PayTotalAmount = 0
|
||
orderMain.PayStatus = 0
|
||
}
|
||
orderMain.OrderStatus = 4
|
||
updateValues := map[string]interface{}{
|
||
"OrderStatus": orderMain.OrderStatus,
|
||
"PayStatus": orderMain.PayStatus,
|
||
"PayTotalAmount": orderMain.PayTotalAmount,
|
||
}
|
||
database.Instance().Model(&orderMain).Updates(&updateValues)
|
||
var orderSubList []models.OrderSub
|
||
database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ? ", orderMain.OrderId).Find(&orderSubList)
|
||
for _, orderSub := range orderSubList {
|
||
updateValuesSub := map[string]interface{}{
|
||
"OrderStatus": 4,
|
||
}
|
||
database.Instance().Model(&orderSub).Updates(&updateValuesSub)
|
||
//返还优惠券
|
||
if orderSub.Cid > 0 {
|
||
var userCoupons []models.UserCoupons
|
||
database.Instance().Model(&models.UserCoupons{}).Where("uid = ? and cid = ? and coupons_status = 2", headerBaseInfo.Uid, orderSub.Cid).Order(clause.OrderByColumn{Column: clause.Column{Name: "update_time"}, Desc: true}).Find(&userCoupons)
|
||
coupons := userCoupons[0]
|
||
updateValuesCoupons := map[string]interface{}{
|
||
"CouponsStatus": 1,
|
||
}
|
||
database.Instance().Model(&coupons).Updates(updateValuesCoupons)
|
||
}
|
||
}
|
||
Success(ctx, orderCancelRequest, OrderCancelResponse{GetOrderDetail(orderMain.OrderId)})
|
||
})
|
||
}}
|
||
}
|
||
|
||
type TimeObject struct {
|
||
Time string `json:"time"`
|
||
Y bool `json:"y"`
|
||
}
|
||
|
||
type OrderServiceTimeRequest struct {
|
||
ServiceAddrId int64
|
||
}
|
||
|
||
// 获取订单可预约时间
|
||
func (p DefParty) orderServiceTime() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderServiceTime", func(ctx *context.Context) {
|
||
headerBaseInfo := GetHeaderBaseInfo(ctx)
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderServiceTimeRequest OrderServiceTimeRequest
|
||
json.Unmarshal(body, &orderServiceTimeRequest)
|
||
if orderServiceTimeRequest.ServiceAddrId == 0 {
|
||
ParamError.Fail(ctx, orderServiceTimeRequest)
|
||
return
|
||
}
|
||
var orderTempList []utils.OrderTemp
|
||
database.Instance().Model(&models.OrderMain{}).Where("service_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) and order_status != 3 and order_status != 4 and status = 1").Find(&orderTempList)
|
||
Success(ctx, headerBaseInfo, utils.ProcessOrders(orderTempList, len(CarMap), 7))
|
||
})
|
||
}}
|
||
}
|
||
|
||
type OrderEditRequest struct {
|
||
OrderId string //订单ID
|
||
Status int //订单状态 4取消
|
||
}
|
||
|
||
// 修改订单
|
||
func (p DefParty) orderEdit() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderEdit", func(ctx *context.Context) {
|
||
headerBaseInfo := GetHeaderBaseInfo(ctx)
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderEditRequest OrderEditRequest
|
||
json.Unmarshal(body, &orderEditRequest)
|
||
var orderMain models.OrderMain
|
||
var orderSub models.OrderSub
|
||
database.Instance().Model(&models.OrderSub{}).Where("order_id = ?", orderEditRequest.OrderId).Find(&orderSub)
|
||
database.Instance().Model(&models.OrderMain{}).Where("order_id = ? and status = 1", orderSub.MainOrderId).Find(&orderMain)
|
||
if orderMain.Uid != headerBaseInfo.Uid {
|
||
OrderError.Fail(ctx, orderEditRequest)
|
||
return
|
||
}
|
||
if orderSub.OrderStatus > 0 || orderEditRequest.Status == 0 {
|
||
OrderError.Fail(ctx, orderEditRequest)
|
||
return
|
||
}
|
||
orderSub.OrderStatus = orderEditRequest.Status
|
||
updateValues := map[string]interface{}{
|
||
"OrderStatus": orderSub.OrderStatus,
|
||
}
|
||
database.Instance().Model(&orderSub).Updates(&updateValues)
|
||
Success(ctx, orderEditRequest, GetOrderDetail(orderMain.OrderId))
|
||
})
|
||
}}
|
||
}
|
||
|
||
type OrderDetailRequest struct {
|
||
OrderId string
|
||
}
|
||
|
||
type OrderDetailResponse struct {
|
||
OrderDetail OrderDetail `json:"orderDetail"`
|
||
}
|
||
|
||
// 订单详情
|
||
func (p DefParty) orderDetail() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderDetail", func(ctx *context.Context) {
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderDetailRequest OrderDetailRequest
|
||
json.Unmarshal(body, &orderDetailRequest)
|
||
orderDetail := GetOrderDetail(orderDetailRequest.OrderId)
|
||
if len(orderDetail.OrderId) == 0 {
|
||
OrderExistError.Fail(ctx, orderDetailRequest)
|
||
return
|
||
}
|
||
Success(ctx, orderDetailRequest, OrderDetailResponse{GetOrderDetail(orderDetailRequest.OrderId)})
|
||
})
|
||
}}
|
||
}
|
||
|
||
type OrderGoodsUpdateRequest struct {
|
||
OrderId string
|
||
GoodsIds []int64
|
||
}
|
||
|
||
// 修改订单商品
|
||
func (p DefParty) orderGoodsUpdate() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderGoodsUpdate", func(ctx *context.Context) {
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderGoodsUpdateRequest OrderGoodsUpdateRequest
|
||
json.Unmarshal(body, &orderGoodsUpdateRequest)
|
||
var orderSub models.OrderSub
|
||
database.Instance().Model(&models.OrderSub{}).Where("order_id = ?", orderGoodsUpdateRequest.OrderId).Find(&orderSub)
|
||
if len(orderSub.OrderId) == 0 {
|
||
OrderExistError.Fail(ctx, orderGoodsUpdateRequest)
|
||
return
|
||
}
|
||
var orderMain models.OrderMain
|
||
database.Instance().Model(&models.OrderMain{}).Where("order_id = ? and status = 1", orderSub.MainOrderId).Find(&orderMain)
|
||
var nowOrderTotalAmount = 0
|
||
var projectionServiceTime = 0
|
||
|
||
//商品优惠券价格
|
||
var goodsDiscountAmount = 0
|
||
//商品非优惠券价格
|
||
var goodsNotDiscountAmount = 0
|
||
var coupons models.Coupons
|
||
for _, value := range orderGoodsUpdateRequest.GoodsIds {
|
||
goods := GoodsMap[value]
|
||
if orderSub.Cid > 0 {
|
||
coupons = CouponsMap[orderSub.Cid]
|
||
}
|
||
if coupons.Id > 0 && coupons.GoodsSubType == goods.GoodsSubType {
|
||
goodsDiscountAmount = goodsDiscountAmount + int(utils.RoundToOneDecimalPlace(float64(goods.Price)*(float64(coupons.Discount)/100.0))*10)
|
||
} else {
|
||
goodsNotDiscountAmount = goodsNotDiscountAmount + goods.Price
|
||
}
|
||
|
||
nowOrderTotalAmount = nowOrderTotalAmount + goods.Price
|
||
if goods.Time != "/" && len(goods.Time) > 0 {
|
||
goodsTime, _ := strconv.Atoi(goods.Time)
|
||
projectionServiceTime += goodsTime
|
||
}
|
||
}
|
||
var originOrderPayAmount = orderSub.PayAmount
|
||
var originOrderTotalAmount = orderSub.TotalAmount
|
||
|
||
//非当前订单
|
||
var orderSubList []models.OrderSub
|
||
database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ? and order_id != ?", orderMain.OrderId, orderGoodsUpdateRequest.OrderId).Find(&orderSubList)
|
||
|
||
var newTotalAmount = nowOrderTotalAmount
|
||
var subOrderAmount = nowOrderTotalAmount
|
||
var allProjectionServiceTime = projectionServiceTime
|
||
for _, value := range orderSubList {
|
||
newTotalAmount = newTotalAmount + value.TotalAmount
|
||
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.PayType == 3 {
|
||
var originAmount = userInfo.Amount
|
||
//先退还 当前订单
|
||
userInfo.Amount = userInfo.Amount + orderSub.PayAmount
|
||
|
||
if userInfo.Discount > 0 {
|
||
discount := float64(userInfo.Discount)
|
||
//计算非折扣商品
|
||
subOrderAmount = int(utils.RoundToOneDecimalPlace(float64(goodsNotDiscountAmount)*(discount/100.0)) * 10)
|
||
} else {
|
||
subOrderAmount = goodsNotDiscountAmount * 10
|
||
}
|
||
orderMain.PayTotalAmount = orderMain.PayTotalAmount - originOrderPayAmount + subOrderAmount + goodsDiscountAmount
|
||
|
||
//余额不足
|
||
if userInfo.Amount < subOrderAmount+goodsDiscountAmount {
|
||
OrderUpdateBalanceNotEnough.DefFail(ctx, orderGoodsUpdateRequest, "原订单金额:"+strconv.FormatFloat(float64(orderMain.PayTotalAmount)/10, 'f', 1, 64)+" 修改后订单金额:"+strconv.FormatFloat(float64(orderMain.PayTotalAmount)/10, 'f', 1, 64)+";修改服务项目后余额不足,请充值后再支付")
|
||
return
|
||
}
|
||
|
||
var amountType = 2
|
||
var proAmount = 0
|
||
//原始价格小于新价格 扣,原始价格大于新价格 加
|
||
if originOrderPayAmount < subOrderAmount+goodsDiscountAmount {
|
||
} else {
|
||
amountType = 1
|
||
}
|
||
|
||
var preAmount = orderMain.PayTotalAmount
|
||
userInfo.Amount = userInfo.Amount - (subOrderAmount + goodsDiscountAmount)
|
||
updateValues := map[string]interface{}{
|
||
"Amount": userInfo.Amount,
|
||
}
|
||
database.Instance().Model(&userInfo).Updates(&updateValues)
|
||
|
||
if amountType == 1 {
|
||
proAmount = userInfo.Amount - originAmount
|
||
} else {
|
||
proAmount = originAmount - userInfo.Amount
|
||
}
|
||
|
||
orderMain.PayDiscount = userInfo.Discount
|
||
userAmountRecord := models.UserAmountRecord{
|
||
UserId: userInfo.Id,
|
||
Type: amountType,
|
||
OriginAmount: originAmount,
|
||
ProAmount: proAmount,
|
||
CurrAmount: userInfo.Amount,
|
||
OrderId: orderMain.OrderId,
|
||
ProScene: "修改订单服务项目",
|
||
Status: 1,
|
||
}
|
||
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))
|
||
}
|
||
orderSub.PayAmount = subOrderAmount + goodsDiscountAmount
|
||
} 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)
|
||
orderSub.PayAmount = goodsNotDiscountAmount*10 + goodsDiscountAmount
|
||
}
|
||
|
||
database.Instance().Where("sub_order_id = ?", orderGoodsUpdateRequest.OrderId).Delete(&models.OrderDetail{})
|
||
var goodsName = ""
|
||
for _, value := range orderGoodsUpdateRequest.GoodsIds {
|
||
goods := GoodsMap[value]
|
||
orderDetail := models.OrderDetail{
|
||
SubOrderId: orderGoodsUpdateRequest.OrderId,
|
||
GoodsId: goods.Id,
|
||
Amount: goods.Price,
|
||
Cid: orderSub.Cid,
|
||
}
|
||
goodsName = goods.Name + "、" + goodsName
|
||
database.Instance().Model(&models.OrderDetail{}).Create(&orderDetail)
|
||
}
|
||
userPetInfo := GetUserPet(orderMain.Uid, orderSub.PetId)
|
||
var weightStr = "无"
|
||
if userPetInfo.PetBaseInfo.PetType == 1 {
|
||
weightStr = CatWeightMap[userPetInfo.PetInfo.Weight]
|
||
} else {
|
||
weightStr = DogWeightMap[userPetInfo.PetInfo.Weight]
|
||
}
|
||
var petInfo = "宠物名称:" + userPetInfo.PetInfo.NickName + "</br>品种:" + userPetInfo.PetBaseInfo.Assortment + "</br>体重:" + weightStr + "</br>服务项目:" + goodsName
|
||
orderSub.PetInfo = petInfo
|
||
orderSub.TotalAmount = nowOrderTotalAmount
|
||
orderSub.ProjectionServiceTime = projectionServiceTime
|
||
updateValues := map[string]interface{}{
|
||
"TotalAmount": orderSub.TotalAmount,
|
||
"PayAmount": orderSub.PayAmount,
|
||
"ProjectionServiceTime": orderSub.ProjectionServiceTime,
|
||
"GoodsDiscountAmount": goodsDiscountAmount,
|
||
"GoodsOriginAmount": goodsNotDiscountAmount,
|
||
"PetInfo": orderSub.PetInfo,
|
||
}
|
||
database.Instance().Model(&orderSub).Updates(&updateValues)
|
||
//当前所有订单
|
||
var orderSubListAll []models.OrderSub
|
||
database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ?", orderMain.OrderId).Find(&orderSubListAll)
|
||
var totalAmount = 0
|
||
for _, sub := range orderSubListAll {
|
||
totalAmount = totalAmount + sub.TotalAmount
|
||
}
|
||
|
||
orderMain.ProjectionServiceTime = allProjectionServiceTime
|
||
orderMain.TotalAmount = totalAmount
|
||
updateValues1 := map[string]interface{}{
|
||
"PayTotalAmount": orderMain.PayTotalAmount,
|
||
"TotalAmount": orderMain.TotalAmount,
|
||
"ProjectionServiceTime": orderMain.ProjectionServiceTime,
|
||
}
|
||
database.Instance().Model(&orderMain).Updates(&updateValues1)
|
||
Success(ctx, orderGoodsUpdateRequest, OrderDetailResponse{GetOrderDetail(orderSub.MainOrderId)})
|
||
})
|
||
}}
|
||
}
|
||
|
||
type OrderMarkRecord struct {
|
||
OrderId string
|
||
Lab1 int
|
||
Lab2 int
|
||
Lab3 int
|
||
Message string
|
||
}
|
||
|
||
// 评价
|
||
func (p DefParty) orderMarkRecord() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderMarkRecord", func(ctx *context.Context) {
|
||
headerBaseInfo := GetHeaderBaseInfo(ctx)
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderMarkRecordRequest OrderMarkRecord
|
||
json.Unmarshal(body, &orderMarkRecordRequest)
|
||
if len(orderMarkRecordRequest.OrderId) == 0 {
|
||
OrderExistError.Fail(ctx, orderMarkRecordRequest)
|
||
return
|
||
}
|
||
|
||
serviceUserMarkRecord1 := models.ServiceUserMarkRecord{
|
||
Uid: headerBaseInfo.Uid,
|
||
OrderId: orderMarkRecordRequest.OrderId,
|
||
ServiceStar: orderMarkRecordRequest.Lab1,
|
||
ServiceLabels: "1",
|
||
Status: 1,
|
||
}
|
||
database.Instance().Model(&models.ServiceUserMarkRecord{}).Create(&serviceUserMarkRecord1)
|
||
|
||
serviceUserMarkRecord2 := models.ServiceUserMarkRecord{
|
||
Uid: headerBaseInfo.Uid,
|
||
OrderId: orderMarkRecordRequest.OrderId,
|
||
ServiceStar: orderMarkRecordRequest.Lab2,
|
||
ServiceLabels: "2",
|
||
Status: 1,
|
||
}
|
||
database.Instance().Model(&models.ServiceUserMarkRecord{}).Create(&serviceUserMarkRecord2)
|
||
|
||
serviceUserMarkRecord3 := models.ServiceUserMarkRecord{
|
||
Uid: headerBaseInfo.Uid,
|
||
OrderId: orderMarkRecordRequest.OrderId,
|
||
ServiceStar: orderMarkRecordRequest.Lab2,
|
||
ServiceLabels: "3",
|
||
Status: 1,
|
||
}
|
||
database.Instance().Model(&models.ServiceUserMarkRecord{}).Create(&serviceUserMarkRecord3)
|
||
|
||
serviceUserMarkRecord4 := models.ServiceUserMarkRecord{
|
||
Uid: headerBaseInfo.Uid,
|
||
OrderId: orderMarkRecordRequest.OrderId,
|
||
ServiceStar: 0,
|
||
MarkContext: orderMarkRecordRequest.Message,
|
||
ServiceLabels: "4",
|
||
Status: 1,
|
||
}
|
||
|
||
var orderMain models.OrderMain
|
||
database.Instance().Model(&models.OrderMain{}).Where("order_id = ?", orderMarkRecordRequest.OrderId).Find(&orderMain)
|
||
|
||
updateValues1 := map[string]interface{}{
|
||
"MarkStatus": 1,
|
||
}
|
||
database.Instance().Model(&orderMain).Updates(&updateValues1)
|
||
|
||
database.Instance().Model(&models.ServiceUserMarkRecord{}).Create(&serviceUserMarkRecord4)
|
||
Success(ctx, orderMarkRecordRequest, nil)
|
||
})
|
||
}}
|
||
}
|
||
|
||
type OrderMarkRecordInfoRequest struct {
|
||
OrderId string
|
||
}
|
||
|
||
type OrderMarkRecordInfoResponse struct {
|
||
Lab1 int `json:"lab1"`
|
||
Lab2 int `json:"lab2"`
|
||
Lab3 int `json:"lab3"`
|
||
Message string `json:"message"`
|
||
}
|
||
|
||
// 查看评价
|
||
func (p DefParty) orderMarkRecordInfo() web_iris.Party {
|
||
return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) {
|
||
index.Post(OrderBase+"/orderMarkRecordInfo", func(ctx *context.Context) {
|
||
body, _ := io.ReadAll(ctx.Request().Body)
|
||
var orderMarkRecordRequest OrderMarkRecordInfoRequest
|
||
json.Unmarshal(body, &orderMarkRecordRequest)
|
||
if len(orderMarkRecordRequest.OrderId) == 0 {
|
||
OrderExistError.Fail(ctx, orderMarkRecordRequest)
|
||
return
|
||
}
|
||
|
||
var serviceUserMarkRecord []models.ServiceUserMarkRecord
|
||
database.Instance().Model(&models.ServiceUserMarkRecord{}).Where("order_id = ?", orderMarkRecordRequest.OrderId).Find(&serviceUserMarkRecord)
|
||
var lab1, lab2, lab3 int
|
||
var lab4 string
|
||
for _, markRecord := range serviceUserMarkRecord {
|
||
if markRecord.ServiceLabels == "1" {
|
||
lab1 = markRecord.ServiceStar
|
||
}
|
||
if markRecord.ServiceLabels == "2" {
|
||
lab2 = markRecord.ServiceStar
|
||
}
|
||
if markRecord.ServiceLabels == "3" {
|
||
lab3 = markRecord.ServiceStar
|
||
}
|
||
if markRecord.ServiceLabels == "4" {
|
||
lab4 = markRecord.MarkContext
|
||
}
|
||
}
|
||
|
||
Success(ctx, orderMarkRecordRequest, OrderMarkRecordInfoResponse{
|
||
Lab1: lab1,
|
||
Lab2: lab2,
|
||
Lab3: lab3,
|
||
Message: lab4,
|
||
})
|
||
})
|
||
}}
|
||
}
|