From 6d86177676af2f9f27c69986165867b2df3910a2 Mon Sep 17 00:00:00 2001 From: "yan.y" Date: Wed, 15 May 2024 21:14:43 +0800 Subject: [PATCH] update --- business/api/car.go | 6 +-- business/api/common.go | 1 + business/api/order.go | 74 ++++++++++++++++++++++++++++++++---- business/api/service.go | 4 +- business/models/dataModel.go | 4 +- business/utils/commonUtil.go | 3 +- 6 files changed, 77 insertions(+), 15 deletions(-) diff --git a/business/api/car.go b/business/api/car.go index 5a9d602..441ccf5 100644 --- a/business/api/car.go +++ b/business/api/car.go @@ -129,17 +129,17 @@ func (p DefParty) carServiceProcess() web_iris.Party { return } subOrderInfo.OrderStatus = 3 + subOrderInfo.PayStatus = 1 + subOrderInfo.PayTime = time.Now() if carServiceProcessRequest.PayAmount > 0 { subOrderInfo.PayAmount = carServiceProcessRequest.PayAmount - subOrderInfo.PayTime = time.Now() - subOrderInfo.PayStatus = 1 } subOrderInfo.PayRemark = carServiceProcessRequest.PayRemark database.Instance().Save(&subOrderInfo) var count int64 database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ?", subOrderInfo.MainOrderId).Count(&count) var countStatus int64 - database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ? and status = 3", subOrderInfo.MainOrderId).Count(&countStatus) + database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ? and order_status = 3", subOrderInfo.MainOrderId).Count(&countStatus) var payStatus int64 database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ? and pay_status = 1", subOrderInfo.MainOrderId).Count(&payStatus) if count == payStatus { diff --git a/business/api/common.go b/business/api/common.go index 393103b..156a779 100644 --- a/business/api/common.go +++ b/business/api/common.go @@ -56,6 +56,7 @@ var ( OrderExistError = Error{Code: 214, Msg: "订单不存在"} PetInfoNotDelError = Error{Code: 215, Msg: "当前宠物存在待服务订单,无法删除"} PetInfoNotUpdateError = Error{Code: 216, Msg: "当前宠物存在待服务订单,无法修改"} + OrderUpdateBalanceNotEnough = Error{Code: 217, Msg: "当前余额不足"} ) func Success(ctx *context.Context, request any, data any) { diff --git a/business/api/order.go b/business/api/order.go index 5ef0719..08fbe68 100644 --- a/business/api/order.go +++ b/business/api/order.go @@ -157,8 +157,18 @@ func (p DefParty) orderCreate() web_iris.Party { } db4 = tx.Model(&userInfo).Updates(&updateValues) orderMain.PayDiscount = userInfo.Discount + for index := range orderSubList { + orderSubList[index].PayType = 3 + } zap_server.ZAPLOG.Info("会员金额扣除", zap.Any("用户ID", userInfo.Id), zap.Any("当前余额", currAmount), zap.Any("扣除余额", orderTotalAmount), zap.Any("剩余余额", userInfo.Amount), zap.Any("折扣", userInfo.Discount)) } + 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) @@ -231,7 +241,7 @@ func checkOrderServiceTime(serviceTime string, projectionServiceTime int) bool { var orderMainTmpList []orderMainTmp //服务时间>=预约时间 and 服务时间<=预计结束时间 时间范围内无订单才可预约 - database.Instance().Model(&models.OrderMain{}).Where("service_time >= ? and service_time <= DATE_FORMAT(DATE_ADD('"+serviceTime+"', INTERVAL "+strconv.Itoa(projectionServiceTime)+" MINUTE), '%Y-%m-%d %H:%i')", serviceTime).Find(&orderMainTmpList) + database.Instance().Model(&models.OrderMain{}).Where("service_time >= ? and service_time <= DATE_FORMAT(DATE_ADD('"+serviceTime+"', INTERVAL "+strconv.Itoa(projectionServiceTime)+" MINUTE), '%Y-%m-%d %H:%i') and order_status != 3 and order_status != 4", serviceTime).Find(&orderMainTmpList) //时间点订单数量<服务车辆*车辆单次服务数量 才可接受预约 if len(orderMainTmpList) > 0 { return len(orderMainTmpList) >= len(CarMap)*CarServiceNum @@ -414,7 +424,7 @@ func (p DefParty) orderServiceTime() web_iris.Party { ProjectionServiceTime int } var orderMainTmpList []orderMainTmp - database.Instance().Model(&models.OrderMain{}).Where("service_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) and status != 3 and status != 5").Find(&orderMainTmpList) + database.Instance().Model(&models.OrderMain{}).Where("service_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) and order_status != 3 and order_status != 4").Find(&orderMainTmpList) var orderTimeMap = make(map[string]string) var orderTimeNum = make(map[string]int) for _, value := range orderMainTmpList { @@ -535,16 +545,60 @@ func (p DefParty) orderGoodsUpdate() web_iris.Party { OrderExistError.Fail(ctx, orderGoodsUpdateRequest) return } - database.Instance().Where("sub_order_id = ?", orderGoodsUpdateRequest.OrderId).Delete(&models.OrderDetail{}) - var totalAmount int32 = 0 + var orderMain models.OrderMain + database.Instance().Model(&models.OrderMain{}).Where("order_id = ?", orderSub.MainOrderId).Find(&orderMain) + + var totalAmount = 0 var projectionServiceTime = 0 for _, value := range orderGoodsUpdateRequest.GoodsIds { goods := GoodsMap[value] - totalAmount = totalAmount + goods.Price + totalAmount = totalAmount + int(goods.Price) if goods.Time != "/" && len(goods.Time) > 0 { goodsTime, _ := strconv.Atoi(goods.Time) projectionServiceTime += goodsTime } + } + //非当前订单 + var orderSubList []models.OrderSub + database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ? and order_id != ", orderMain.OrderId, orderGoodsUpdateRequest.OrderId).Find(&orderSubList) + //新价格 + var newAmount = totalAmount + var allProjectionServiceTime = projectionServiceTime + for _, value := range orderSubList { + newAmount = newAmount + int(value.TotalAmount) + allProjectionServiceTime = allProjectionServiceTime + value.ProjectionServiceTime + } + + //已支付 + if orderMain.PayStatus == 1 { + var userInfo *models.User + database.Instance().Model(&models.User{}).Where("id = ?", orderMain.Uid).Find(&userInfo) + //先退还 + userInfo.Amount = userInfo.Amount + orderMain.PayTotalAmount + + if userInfo.Discount > 0 { + discount := float64(userInfo.Discount) + newAmount = int(math.Round(float64(newAmount) * (discount / 100.0))) + } + //余额不足 + if userInfo.Amount < newAmount { + OrderUpdateBalanceNotEnough.DefFail(ctx, orderGoodsUpdateRequest, "原订单金额:"+strconv.Itoa(orderMain.PayTotalAmount)+" 修改后订单金额:"+strconv.Itoa(newAmount)+";修改服务项目后余额不足,请充值后再修改") + return + } + var preAmount = orderMain.PayTotalAmount + orderMain.PayTotalAmount = newAmount + userInfo.Amount = userInfo.Amount - newAmount + updateValues := map[string]interface{}{ + "Amount": userInfo.Amount, + } + database.Instance().Model(&userInfo).Updates(&updateValues) + orderMain.PayDiscount = userInfo.Discount + zap_server.ZAPLOG.Info("会员金额扣除", zap.Any("用户ID", userInfo.Id), zap.Any("当前余额", userInfo.Amount), zap.Any("商品修改之前金额", preAmount), zap.Any("商品修改之后金额", orderMain.PayTotalAmount), zap.Any("折扣", userInfo.Discount)) + } + + database.Instance().Where("sub_order_id = ?", orderGoodsUpdateRequest.OrderId).Delete(&models.OrderDetail{}) + for _, value := range orderGoodsUpdateRequest.GoodsIds { + goods := GoodsMap[value] orderDetail := models.OrderDetail{ SubOrderId: orderGoodsUpdateRequest.OrderId, GoodsId: goods.Id, @@ -552,14 +606,20 @@ func (p DefParty) orderGoodsUpdate() web_iris.Party { } database.Instance().Model(&models.OrderDetail{}).Create(&orderDetail) } - orderSub.TotalAmount = totalAmount + + orderSub.TotalAmount = int32(totalAmount) orderSub.ProjectionServiceTime = projectionServiceTime updateValues := map[string]interface{}{ "TotalAmount": orderSub.TotalAmount, "ProjectionServiceTime": orderSub.ProjectionServiceTime, } + orderMain.ProjectionServiceTime = allProjectionServiceTime + updateValues1 := map[string]interface{}{ + "PayTotalAmount": orderMain.PayTotalAmount, + "ProjectionServiceTime": orderMain.ProjectionServiceTime, + } + database.Instance().Model(&orderMain).Updates(&updateValues1) database.Instance().Model(&orderSub).Updates(&updateValues) - Success(ctx, orderGoodsUpdateRequest, OrderDetailResponse{GetOrderDetail(orderSub.MainOrderId)}) }) }} diff --git a/business/api/service.go b/business/api/service.go index 7a90cfa..b9dd534 100644 --- a/business/api/service.go +++ b/business/api/service.go @@ -122,12 +122,12 @@ func (p DefParty) serviceAddOrEdit() web_iris.Party { } database.Instance().Model(&userServiceAddr).Updates(&updateValues) } - var userInfo *models.User + /*var userInfo *models.User database.Instance().Model(&models.User{}).Where("id = ?", headerBaseInfo.Uid).Find(&userInfo) updateValues := map[string]interface{}{ "Mobile": userInfo.Mobile, } - database.Instance().Model(&userInfo).Updates(&updateValues) + database.Instance().Model(&userInfo).Updates(&updateValues)*/ var userServiceAddrList []*models.UserServiceAddr database.Instance().Model(&models.UserServiceAddr{}).Where("uid = ?", headerBaseInfo.Uid).Find(&userServiceAddrList) for _, value := range userServiceAddrList { diff --git a/business/models/dataModel.go b/business/models/dataModel.go index 9fda698..d094f4f 100644 --- a/business/models/dataModel.go +++ b/business/models/dataModel.go @@ -122,7 +122,7 @@ type OrderMain struct { Id int64 `gorm:"primaryKey;autoIncrement" json:"id"` //id OrderId string `gorm:"index;unique;not null" json:"orderId"` //主订单号 Uid int64 `gorm:"index;not null" json:"uid"` //用户id - OrderStatus int `json:"status"` //主订单状态 1待服务 2服务中 3已完成 4已派单 5已取消 + OrderStatus int `json:"status"` //主订单状态 1待服务 2服务中 3已完成 4已取消 ServiceTime string `json:"serviceTime"` //服务时间 ProjectionServiceTime int `json:"projectionServiceTime"` //服务预估时长 ServiceAddrId int64 `json:"serviceAddrId"` //服务地址信息 @@ -141,7 +141,7 @@ type OrderSub struct { MainOrderId string `gorm:"index" json:"mainOrderId"` //主订单ID OrderStatus int `gorm:"not null" json:"status"` //子订单状态 1待服务 2服务中 3已完成 4已取消 PetId int64 `gorm:"index" json:"petId"` //宠物ID - PayType int `gorm:"not null" json:"payType"` //支付方式 1线下 2线上 + PayType int `gorm:"not null" json:"payType"` //支付方式 1线下 2线上 3会员余额 Discount int `json:"discount"` //折扣 TotalAmount int32 `gorm:"not null" json:"totalAmount"` //总金额 ProjectionServiceTime int `json:"projectionServiceTime"` //服务预估时长 diff --git a/business/utils/commonUtil.go b/business/utils/commonUtil.go index dce9470..bc45f18 100644 --- a/business/utils/commonUtil.go +++ b/business/utils/commonUtil.go @@ -40,11 +40,12 @@ func GetStrDays(day int, minute int, reserveMap map[string]models.ReserveTimeFil // 工作时间范围 workStart := 9 - workEnd := 19 + workEnd := 22 var dayHoursMap = make(map[string][]TimeObject) var serviceDaysMap = make(map[string]string) // 循环生成每半个小时的整点时间列表,直到一周后 oneWeekLater := currentTime.Add(time.Duration(day) * 24 * time.Hour) + oneWeekLater = time.Date(oneWeekLater.Year(), oneWeekLater.Month(), oneWeekLater.Day(), 23, 0, 0, 0, oneWeekLater.Location()) for _, dayTime := range times { serviceDaysMap[dayTime] = dayTime }