diff --git a/business/api/order.go b/business/api/order.go index f3144ec..aec3160 100644 --- a/business/api/order.go +++ b/business/api/order.go @@ -145,7 +145,12 @@ func (p DefParty) orderCreate() web_iris.Party { } } + //订单总金额 var orderTotalAmount = 0 + //可以参与会员折扣的金额 + var needDiscountAmount = 0 + //不可参与会员折扣的金额 + var notDiscountAmount = 0 orderLock.Lock() orderId := NextId.Generate().String() orderMain := models.OrderMain{ @@ -166,20 +171,20 @@ func (p DefParty) orderCreate() web_iris.Party { coupons := CouponsMap[value.Cid] subOrderId := NextId.Generate().String() var totalAmount = 0 - var discountTotalAmount = 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 { - //单个订单折扣 - discountTotalAmount = discountTotalAmount + int(utils.RoundToOneDecimalPlace(float64(goods.Price)*(float64(coupons.Discount)/100.0))*10) - } else { - discountTotalAmount = discountTotalAmount + goods.Price + 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, models.OrderDetail{SubOrderId: subOrderId, Cid: coupons.Id, Discount: coupons.Discount, GoodsId: value, Amount: goods.Price}) + orderSubDetailList = append(orderSubDetailList, orderDetail) if goods.Time != "/" && len(goods.Time) > 0 { goodsTime, _ := strconv.Atoi(goods.Time) projectionServiceTime += goodsTime @@ -192,15 +197,29 @@ func (p DefParty) orderCreate() web_iris.Party { userPetInfo := GetUserPet(headerBaseInfo.Uid, value.PetId) var petInfo = "宠物名称:" + userPetInfo.PetInfo.NickName + "
品种:" + userPetInfo.PetBaseInfo.Assortment + "
服务项目:" + goodsName projectionServiceTimeAll += projectionServiceTime + + for _, orderDetail := range orderSubDetailList { + if orderDetail.Cid > 0 { + notDiscountAmount = notDiscountAmount + orderDetail.DiscountAmount + } else { + needDiscountAmount = needDiscountAmount + orderDetail.Amount + } + } + orderSub := models.OrderSub{ - OrderId: subOrderId, - MainOrderId: orderMain.OrderId, - OrderStatus: 1, - PetId: value.PetId, - PayType: 1, - Discount: 100, - TotalAmount: totalAmount, - PayAmount: totalAmount, + OrderId: subOrderId, + MainOrderId: orderMain.OrderId, + OrderStatus: 1, + PetId: value.PetId, + PayType: 1, + Discount: 100, + TotalAmount: totalAmount, + PayAmount: totalAmount, + //设置商品折扣金额用于后续打折计算 + GoodsDiscountAmount: notDiscountAmount, + //设置商品非折扣金额 + GoodsOriginAmount: needDiscountAmount, + //宠物信息 PetInfo: petInfo, Status: 1, ProjectionServiceTime: projectionServiceTime, @@ -217,22 +236,33 @@ func (p DefParty) orderCreate() web_iris.Party { orderMain.ProjectionServiceTime = projectionServiceTimeAll var userInfo *models.User database.Instance().Model(&models.User{}).Where("id = ?", headerBaseInfo.Uid).Find(&userInfo) - var discountAmount = orderTotalAmount + + //计算参与折扣计算的金额 + 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(orderTotalAmount)*(discount/100.0)) * 10) + discountAmount = int(utils.RoundToOneDecimalPlace(float64(inDiscountAmount)*(discount/100.0)) * 10) } else { - discountAmount = int(utils.RoundToOneDecimalPlace(float64(orderTotalAmount) * 10)) + discountAmount = int(utils.RoundToOneDecimalPlace(float64(inDiscountAmount) * 10)) } orderMain.TotalAmount = orderTotalAmount tx := database.Instance().Begin() var db4 *gorm.DB - if userInfo.Amount >= discountAmount { + //用户需要扣除总金额 + if userInfo.Amount >= discountAmount+orderGoodsDiscountAmount { var currAmount = userInfo.Amount orderMain.PayStatus = 1 - orderMain.PayTotalAmount = discountAmount - userInfo.Amount = userInfo.Amount - discountAmount + orderMain.PayTotalAmount = discountAmount + orderGoodsDiscountAmount + userInfo.Amount = userInfo.Amount - discountAmount - orderGoodsDiscountAmount updateValues := map[string]interface{}{ "Amount": userInfo.Amount, } @@ -246,26 +276,25 @@ func (p DefParty) orderCreate() web_iris.Party { UserId: userInfo.Id, Type: 2, OriginAmount: currAmount, - ProAmount: discountAmount, + ProAmount: discountAmount + orderGoodsDiscountAmount, CurrAmount: userInfo.Amount, OrderId: orderId, ProScene: "下单", Status: 1, } 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), zap.Any("剩余余额", userInfo.Amount), zap.Any("折扣", userInfo.Discount)) - discount := float64(userInfo.Discount) + 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)) for index, _ := range orderSubList { orderSubList[index].Discount = userInfo.Discount //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 = discountAmount + orderGoodsDiscountAmount } } else { userAmountRecord := models.UserAmountRecord{ UserId: userInfo.Id, Type: 3, OriginAmount: userInfo.Amount, - ProAmount: discountAmount, + ProAmount: discountAmount + orderGoodsDiscountAmount, CurrAmount: userInfo.Amount, OrderId: orderId, ProScene: "下单", @@ -320,9 +349,11 @@ func GetOrderDetail(orderId string) OrderDetail { Uid: orderMain.Uid, UserAmount: float64(userInfo.Amount) / 10.0, } + 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) @@ -343,6 +374,7 @@ func GetOrderDetail(orderId string) OrderDetail { Discount: float64(orderSub.Discount), Goods: goods, } + discountTotalAmount = discountTotalAmount + orderSub.GoodsOriginAmount*10 + orderSub.GoodsDiscountAmount if orderSub.PayType == 3 { x := float64(orderSub.PayAmount) / 10 orderSubR1.PayAmount = strconv.FormatFloat(x, 'f', 1, 64) @@ -359,6 +391,9 @@ func GetOrderDetail(orderId string) OrderDetail { } 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 { diff --git a/business/api/service.go b/business/api/service.go index b9dd534..17ce264 100644 --- a/business/api/service.go +++ b/business/api/service.go @@ -67,6 +67,7 @@ func (p DefParty) serviceAddOrEdit() web_iris.Party { Addr: serviceAddOrEditRequest.Addr, Longitude: serviceAddOrEditRequest.Longitude, Latitude: serviceAddOrEditRequest.Latitude, + Status: 1, } if len(serviceAddOrEditRequest.Longitude) == 0 || len(serviceAddOrEditRequest.Latitude) == 0 { addrGeocoding := utils.GetAddrGeocoding(utils.BmapGeoCodingRequest{Address: serviceAddOrEditRequest.Addr}) diff --git a/business/models/dataModel.go b/business/models/dataModel.go index 0ddb71d..1bba906 100644 --- a/business/models/dataModel.go +++ b/business/models/dataModel.go @@ -154,10 +154,12 @@ type OrderSub struct { PetId int64 `gorm:"index" json:"petId"` //宠物ID PayType int `gorm:"not null" json:"payType"` //支付方式 1线下 2线上 3会员余额 Discount int `json:"discount"` //折扣 - TotalAmount int `gorm:"not null" json:"totalAmount"` //总金额 + TotalAmount int `gorm:"not null" json:"totalAmount"` //总金额 - 原价 ProjectionServiceTime int `json:"projectionServiceTime"` //服务预估时长 PayStatus int `gorm:"default:0" json:"payStatus"` //支付状态 0未支付 1已支付 - PayAmount int `json:"payAmount"` //实际支付金额 + PayAmount int `json:"payAmount"` //实际支付金额 - 折扣金额 + GoodsDiscountAmount int `json:"-"` //商品折扣金额 + GoodsOriginAmount int `json:"-"` //商品原价 除去折扣价的金额 PayTime time.Time `gorm:"type:timestamp;" json:"payTime"` //支付时间 PayRemark string `json:"payRemark"` //支付备注 PetInfo string `json:"petInfo"` //宠物快照信息 @@ -168,12 +170,13 @@ type OrderSub struct { // OrderDetail 订单明细 type OrderDetail struct { - 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 - GoodsId int64 `gorm:"index;not null" json:"goodsId"` //商品ID - Amount int `gorm:"not null" json:"amount"` //价格 + 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 + GoodsId int64 `gorm:"index;not null" json:"goodsId"` //商品ID + Amount int `gorm:"not null" json:"amount"` //价格 + DiscountAmount int `json:"-"` //折扣价格 } // OrderServiceRecord 订单服务记录