diff --git a/business/api/car.go b/business/api/car.go index f021f28..f02dd87 100644 --- a/business/api/car.go +++ b/business/api/car.go @@ -2,12 +2,14 @@ package api import ( "encoding/json" + "fmt" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/context" "gorm.io/gorm/clause" "io" "pet-house.com/business/models" "pet-house.com/core/server/database" + "pet-house.com/core/server/web" "pet-house.com/core/server/web/web_iris" "time" ) @@ -69,7 +71,9 @@ type CarServiceProcessRequest struct { } type CarServiceProcessResponse struct { - OrderDetail OrderDetail `json:"orderDetail"` + OrderDetail OrderDetail `json:"orderDetail"` //订单详情 + Desc string `json:"desc"` //支付描述 + PayImgUrl string `json:"payImgUrl"` //支付二维码 } // 服务处理 @@ -121,6 +125,8 @@ func (p DefParty) carServiceProcess() web_iris.Party { return } } + desc := "" + payImgUrl := "" var orderUserInfo *models.User database.Instance().Model(&models.User{}).Where("id = ?", mainOrder.Uid).Find(&orderUserInfo) @@ -236,8 +242,16 @@ func (p DefParty) carServiceProcess() web_iris.Party { FilePath: carServiceProcessRequest.FileName, Type: carServiceProcessRequest.Type, }) + var payOrder *models.PayOrder + database.Instance().Model(&models.PayOrder{}).Where("order_id = ?", mainOrder.PayOrderId).Find(&payOrder) + //已支付成功且主订单未支付 + if payOrder.Id == 0 || payOrder.OrderStatus == 0 { + payPrice := subOrderInfo.PayAmount + desc = "您还需支付" + fmt.Sprintf("%.1f", float64(payPrice)/10.0) + payImgUrl = web.CONFIG.System.Domain + "/static/img/pay.png" + } } - Success(ctx, carServiceProcessRequest, CarServiceProcessResponse{GetOrderDetail(mainOrder.OrderId)}) + Success(ctx, carServiceProcessRequest, CarServiceProcessResponse{GetOrderDetail(mainOrder.OrderId), desc, payImgUrl}) }) }} } diff --git a/business/api/order.go b/business/api/order.go index 752ef81..b145a5e 100644 --- a/business/api/order.go +++ b/business/api/order.go @@ -2,6 +2,7 @@ package api import ( "encoding/json" + "fmt" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/context" "go.uber.org/zap" @@ -39,7 +40,7 @@ type OrderCreateResponse struct { type OrderCreatePreCheckResponse struct { HasAlert bool `json:"hasAlert"` //是否弹窗提示 返回false直接下单,返回ture弹出确认框,确认框点击是之后调用下单接口 AlertMsg string `json:"alertMsg"` //弹窗消息 - PayType int `json:"payType"` //扣款消息 + PayType int `json:"payType"` //扣款类型 } func (p DefParty) orderCreatePreCheck() web_iris.Party { @@ -87,6 +88,7 @@ func (p DefParty) orderCreatePreCheck() web_iris.Party { } orderCreatePreCheckResponse := OrderCreatePreCheckResponse{ HasAlert: false, + PayType: 0, } if userInfo.Discount > 0 { discount := float64(userInfo.Discount) @@ -96,12 +98,10 @@ func (p DefParty) orderCreatePreCheck() web_iris.Party { orderCreatePreCheckResponse.HasAlert = true orderCreatePreCheckResponse.AlertMsg = "您的会员余额不够,需要进行线下支付,当前订单将不享受会员折扣优惠价格" orderCreatePreCheckResponse.PayType = 0 + } else { + orderCreatePreCheckResponse.PayType = 1 } } - //订金使用余额支付 - if userInfo.Amount > 300 { - orderCreatePreCheckResponse.PayType = 1 - } Success(ctx, orderCreateRequest, orderCreatePreCheckResponse) }) @@ -340,20 +340,31 @@ func (p DefParty) orderCreate() web_iris.Party { 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 - //orderSubList[index].PayAmount = int32(math.Round(float64(orderSubList[index].TotalAmount) * (discount / 100.0))) - //orderSubList[index].PayAmount = discountAmount + orderGoodsDiscountAmount } + + 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, @@ -793,8 +804,33 @@ func (p DefParty) orderServiceTime() web_iris.Party { } var orderMainTmpList []orderMainTmp 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(&orderMainTmpList) + // 执行查询 + var orderMainTmp1 []struct { + ServiceTime string + Count int + } + err := database.Instance().Raw(` + SELECT service_time, COUNT(1) AS count + FROM order_mains + WHERE service_time >= DATE_SUB(NOW(), INTERVAL 7 DAY) + AND order_status != 3 + AND order_status != 4 + AND status = 1 + GROUP BY service_time + HAVING count > 0 + `).Scan(&orderMainTmp1).Error + if err != nil { + ServerError.Fail(ctx, err) + return + } + var orderTimeMap = make(map[string]string) var orderTimeNum = make(map[string]int) + var orderTimeCount = make(map[string]int) + for _, val := range orderMainTmp1 { + orderTimeCount[val.ServiceTime] = val.Count + } + for _, value := range orderMainTmpList { orderTimeMap[value.ServiceTime] = value.ServiceTime orderTimeNum[value.ServiceTime] = orderTimeNum[value.ServiceTime] + 1 @@ -812,7 +848,7 @@ func (p DefParty) orderServiceTime() web_iris.Party { serviceTime := AddrServiceMap[orderServiceTimeRequest.ServiceAddrId] times := strings.Split(serviceTime.Times, ",") carNum := len(CarMap) - daysMap := utils.GetStrDays(7, 60, ReserveMap, orderTimeMap, carNum, orderTimeNum, CarServiceNum, times) + daysMap := utils.GetStrDays(7, 60, ReserveMap, orderTimeMap, carNum, orderTimeNum, CarServiceNum, times, orderTimeCount) var dayHoursMap = make(map[string][]TimeObject) for day, values := range daysMap { key := day diff --git a/business/api/pay.go b/business/api/pay.go index f14adc9..d47ccb3 100644 --- a/business/api/pay.go +++ b/business/api/pay.go @@ -3,6 +3,7 @@ package api import ( "crypto/x509" "encoding/json" + "fmt" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/context" "github.com/wechatpay-apiv3/wechatpay-go/core" @@ -34,7 +35,8 @@ func (p DefParty) rechargeInfoList() web_iris.Party { } type ToPayRequest struct { - PayId int //支付ID + PayId int //支付ID + OrderId string //订单号 } type ToPayResponse struct { @@ -54,21 +56,59 @@ func (p DefParty) toPay() web_iris.Party { json.Unmarshal(body, &toPayRequest) var userInfo *models.User database.Instance().Model(&models.User{}).Where("id = ?", headerBaseInfo.Uid).Find(&userInfo) - var rechargeInfo *models.RechargeInfo - database.Instance().Model(&models.RechargeInfo{}).Where("id = ?", toPayRequest.PayId).Find(&rechargeInfo) + price := 0.0 + desc := "充值" + id := 0 + if len(toPayRequest.OrderId) == 0 { + var rechargeInfo *models.RechargeInfo + database.Instance().Model(&models.RechargeInfo{}).Where("id = ?", toPayRequest.PayId).Find(&rechargeInfo) + price1, _ := strconv.ParseFloat(rechargeInfo.Price, 64) + price = price1 + desc = rechargeInfo.Name + id = rechargeInfo.Id + } svc := jsapi.JsapiApiService{Client: utils.GetWxPayService()} - price, _ := strconv.ParseFloat(rechargeInfo.Price, 64) + var payPrice = core.Int64(int64(price * 100.0)) orderId := NextId.Generate().String() + //支付订单 + if len(toPayRequest.OrderId) > 0 { + var orderSubList []models.OrderSub + database.Instance().Model(&models.OrderSub{}).Where("main_order_id = ? ", toPayRequest.OrderId).Find(&orderSubList) + if len(orderSubList) == 0 { + OrderExistError.Fail(ctx, toPayRequest) + return + } + //取出折扣价 + price1 := 0.0 + for _, orderSub := range orderSubList { + price1 = price1 + float64(orderSub.PayAmount) + } + var orderMain models.OrderMain + database.Instance().Model(&models.OrderMain{}).Where("order_id = ? and status = 1", toPayRequest.OrderId).Find(&orderMain) + if len(orderMain.PayOrderId) > 0 { + var payOrder *models.PayOrder + database.Instance().Model(&models.PayOrder{}).Where("order_id = ?", orderMain.PayOrderId).Find(&payOrder) + if payOrder.OrderStatus == 1 { + //去除定金扣除金额 + price1 = price1 - (30.0 * 10) + } + } + + payPrice = core.Int64(int64(price1 * 10.0)) + desc = "宠物洗护付款-" + toPayRequest.OrderId + orderId = toPayRequest.OrderId + price = price1 / 10.0 + } // 得到prepay_id,以及调起支付所需的参数和签名 resp, _, err := svc.PrepayWithRequestPayment(ctx, jsapi.PrepayRequest{ Appid: core.String(utils.CONFIG.AppId), Mchid: core.String(utils.CONFIG.MchId), - Description: core.String(rechargeInfo.Name), + Description: core.String(desc), OutTradeNo: core.String(orderId), NotifyUrl: core.String(web.CONFIG.System.Domain + "/pet-house/pay/payNotify"), Amount: &jsapi.Amount{ - Total: core.Int64(int64(price * 100.0)), + Total: payPrice, }, Payer: &jsapi.Payer{ Openid: core.String(userInfo.OpenId), @@ -81,9 +121,9 @@ func (p DefParty) toPay() web_iris.Party { } payOrder := models.PayOrder{ OrderId: orderId, - OrderName: rechargeInfo.Name, - OrderPrice: rechargeInfo.Price, - RechargeId: rechargeInfo.Id, + OrderName: desc, + OrderPrice: fmt.Sprintf("%.1f", price), + RechargeId: id, PayId: "", Uid: headerBaseInfo.Uid, } @@ -132,10 +172,20 @@ JIhayMjkemIO27X1j1ZdtA314xZpPrO4uqrVFiLahoZ9y6az0RhNpPadYcT6D24G transaction := new(payments.Transaction) notifyReq, err := handler.ParseNotifyRequest(ctx, ctx.Request(), transaction) zap_server.ZAPLOG.Info("payNotify", zap.Any("notifyReq", notifyReq), zap.Any("transaction", transaction), zap.Any("err", err)) + state := *transaction.TradeState + OrderStatus := 0 + if "SUCCESS" == state { + OrderStatus = 1 + } else if "REFUND" == state { + OrderStatus = 2 + } else { + zap_server.ZAPLOG.Info("payNotify", zap.Any("notifyReq", notifyReq), zap.Any("transaction", transaction), zap.Any("state", state)) + return + } var payOrder *models.PayOrder database.Instance().Model(&models.PayOrder{}).Where("order_id = ?", transaction.OutTradeNo).Find(&payOrder) payOrderD := map[string]interface{}{ - "OrderStatus": 1, + "OrderStatus": OrderStatus, "PayId": *transaction.TransactionId, } database.Instance().Model(&payOrder).Updates(&payOrderD) @@ -163,6 +213,12 @@ JIhayMjkemIO27X1j1ZdtA314xZpPrO4uqrVFiLahoZ9y6az0RhNpPadYcT6D24G "Amount": userInfo.Amount, } database.Instance().Model(&userInfo).Updates(&updateValues) + } else { + var orderMain models.OrderMain + database.Instance().Model(&models.OrderMain{}).Where("order_id = ? and status = 1", payOrder.OrderId).Find(&orderMain) + //设置订单状态 + orderMain.PayStatus = 1 + database.Instance().Save(&orderMain) } }) }} diff --git a/business/models/dataModel.go b/business/models/dataModel.go index 3f0b758..c219beb 100644 --- a/business/models/dataModel.go +++ b/business/models/dataModel.go @@ -311,25 +311,28 @@ type UserCoupons struct { // RechargeInfo 充值挡位信息 type RechargeInfo struct { - Id int `gorm:"primaryKey;autoIncrement" json:"id"` //id - Name string `gorm:"not null" json:"name"` //挡位名称 - Desc string `json:"desc"` //挡位描述 - Price string `gorm:"not null" json:"price"` //价格 - Give string `gorm:"default:无" json:"give"` //赠送 - CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"-"` //创建时间 - UpdateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP" json:"-"` //更新时间 - Status int `gorm:"default:1" json:"-" json:"-"` //状态 - Type int `gorm:"default:1" json:"type" json:"type"` //类型 1充值挡位 2押金 + Id int `gorm:"primaryKey;autoIncrement" json:"id"` //id + Name string `gorm:"not null" json:"name"` //挡位名称 + Desc string `json:"desc"` //挡位描述 + Price string `gorm:"not null" json:"price"` //价格 + RechargePrice string `gorm:"not null;default:0" json:"rechargePrice"` //实际充值 + Give string `gorm:"default:无" json:"give"` //赠送 + CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"-"` //创建时间 + UpdateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP" json:"-"` //更新时间 + Status int `gorm:"default:1" json:"-" json:"-"` //状态 + Type int `gorm:"default:1" json:"type" json:"type"` //类型 1充值挡位 2押金 } // PayOrder 支付订单 type PayOrder struct { - Id int `gorm:"primaryKey;autoIncrement"` //id - OrderId string `gorm:"not null"` //订单ID - OrderName string `gorm:"not null"` //订单名称 - OrderPrice string `gorm:"not null"` //订单金额 - OrderStatus int `gorm:"not null;default:0"` //订单状态 0:未支付 1:已支付 2:已退款 + Id int `gorm:"primaryKey;autoIncrement"` //id + Uid int64 `gorm:"not null;default:0" json:"uid"` //uid + OrderId string `gorm:"not null"` //订单ID + OrderName string `gorm:"not null"` //订单名称 + OrderPrice string `gorm:"not null"` //订单金额 + OrderStatus int `gorm:"not null;default:0"` //订单状态 0:未支付 1:已支付 2:已退款 3:会员余额支付 PayId string //三方交易号 + RechargeId int `gorm:"not null;default:0"` //充值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:"-"` //状态 diff --git a/business/utils/commonUtil.go b/business/utils/commonUtil.go index 9e79578..b85922d 100644 --- a/business/utils/commonUtil.go +++ b/business/utils/commonUtil.go @@ -21,7 +21,7 @@ type TimeObject struct { Y bool `json:"y"` } -func GetStrDays(day int, minute int, reserveMap map[string]models.ReserveTimeFilter, orderTimeMap map[string]string, carNum int, orderNumMap map[string]int, carServiceNum int, times []string) map[string][]TimeObject { +func GetStrDays(day int, minute int, reserveMap map[string]models.ReserveTimeFilter, orderTimeMap map[string]string, carNum int, orderNumMap map[string]int, carServiceNum int, times []string, orderTimeCount map[string]int) map[string][]TimeObject { // 获取当前时间 currentTime := time.Now() // 计算半小时后的时间 @@ -81,7 +81,8 @@ func GetStrDays(day int, minute int, reserveMap map[string]models.ReserveTimeFil } } else { key := nextHour.Format("2006-01-02") - //当前订单数小于车辆数 可接单 + key1 := nextHour.Format("2006-01-02 15:04") + //当前订单数小于车辆数 可接单 时间范围可能会超出到11点 if existOrderNum && orderNum < carNum*carServiceNum { if _, ok := dayHoursMap[key]; ok { dayHoursMap[key] = append(dayHoursMap[key], TimeObject{ @@ -95,17 +96,28 @@ func GetStrDays(day int, minute int, reserveMap map[string]models.ReserveTimeFil }} } } else if nextHour.Hour() >= workStart && nextHour.Hour() < workEnd { - if _, ok := dayHoursMap[key]; ok { + //查看当前时间对应的订单数量 + orderCount := orderTimeCount[key1] + //预约时间对应的订单数<车辆数量 当前时间可以预约 + if orderCount < carNum*carServiceNum { dayHoursMap[key] = append(dayHoursMap[key], TimeObject{ Time: nextHour.Format("15:04"), - Y: false, + Y: true, }) } else { - dayHoursMap[key] = []TimeObject{{ - Time: nextHour.Format("15:04"), - Y: false, - }} + if _, ok := dayHoursMap[key]; ok { + dayHoursMap[key] = append(dayHoursMap[key], TimeObject{ + Time: nextHour.Format("15:04"), + Y: false, + }) + } else { + dayHoursMap[key] = []TimeObject{{ + Time: nextHour.Format("15:04"), + Y: false, + }} + } } + } } diff --git a/business/utils/commonUtil_test.go b/business/utils/commonUtil_test.go index adcc043..5171a73 100644 --- a/business/utils/commonUtil_test.go +++ b/business/utils/commonUtil_test.go @@ -103,3 +103,6 @@ func TestMap(t *testing.T) { } print("12345", c1[2].Id) } +func Test22(t *testing.T) { + fmt.Println("您还需支付" + fmt.Sprintf("%.1f", float64(1298)/10.0)) +}