package api import ( "encoding/json" "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/web_iris" "time" ) var CarServiceNum = 1 func GetCarInfo(carId int) models.ServiceCar { return CarMap[carId] } type CarServiceOrderListRequest struct { Status int //订单状态 0所有 1待服务 2服务中 3已完成 PageNo int //页码 PageSize int //数据数量 } type CarServiceOrderListResponse struct { OrderDetails []OrderDetail `json:"orderDetails"` PageNo int `json:"pageNo"` PageSize int `json:"pageSize"` } // carServiceOrderList 车辆订单列表 func (p DefParty) carServiceOrderList() web_iris.Party { return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) { index.Post(CarBase+"/carServiceOrderList", func(ctx *context.Context) { headerBaseInfo := GetHeaderBaseInfo(ctx) body, _ := io.ReadAll(ctx.Request().Body) var carServiceOrderListRequest CarServiceOrderListRequest json.Unmarshal(body, &carServiceOrderListRequest) var serviceCarUser models.ServiceCarUser database.Instance().Model(&models.ServiceCarUser{}).Where("uid = ?", headerBaseInfo.Uid).Find(&serviceCarUser) if serviceCarUser.Id == 0 { CarNotExistError.Fail(ctx, headerBaseInfo) return } var orderMains []models.OrderMain if carServiceOrderListRequest.Status == 0 { database.Instance().Model(&models.OrderMain{}).Joins("JOIN car_orders ON order_mains.order_id = car_orders.order_id").Where("car_orders.car_id = ? AND order_mains.status > 0", serviceCarUser.CarId).Order(clause.OrderByColumn{Column: clause.Column{Name: "order_mains.service_time"}, Desc: true}).Offset((carServiceOrderListRequest.PageNo - 1) * carServiceOrderListRequest.PageSize).Limit(carServiceOrderListRequest.PageSize).Find(&orderMains) } else { database.Instance().Model(&models.OrderMain{}).Joins("JOIN car_orders ON order_mains.order_id = car_orders.order_id").Where("car_orders.car_id = ? AND order_mains.status = ?", serviceCarUser.CarId, carServiceOrderListRequest.Status).Order(clause.OrderByColumn{Column: clause.Column{Name: "order_mains.service_time"}, Desc: true}).Offset((carServiceOrderListRequest.PageNo - 1) * carServiceOrderListRequest.PageSize).Limit(carServiceOrderListRequest.PageSize).Find(&orderMains) } var orderDetails []OrderDetail for _, value := range orderMains { orderDetails = append(orderDetails, GetOrderDetail(value.OrderId)) } Success(ctx, carServiceOrderListRequest, CarServiceOrderListResponse{orderDetails, carServiceOrderListRequest.PageNo + 1, carServiceOrderListRequest.PageSize}) }) }} } type CarServiceProcessRequest struct { Type int //操作类型 1开始 2结束 SubOrderId string //子订单ID PayAmount int //实际支付金额 PayRemark string //支付备注 FileName string //拍照文件 } type CarServiceProcessResponse struct { OrderDetail OrderDetail `json:"orderDetail"` } // 服务处理 func (p DefParty) carServiceProcess() web_iris.Party { return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) { index.Post(CarBase+"/carServiceProcess", func(ctx *context.Context) { headerBaseInfo := GetHeaderBaseInfo(ctx) body, _ := io.ReadAll(ctx.Request().Body) var carServiceProcessRequest CarServiceProcessRequest json.Unmarshal(body, &carServiceProcessRequest) if carServiceProcessRequest.Type == 0 { ParamError.Fail(ctx, carServiceProcessRequest) return } var userInfo *models.User database.Instance().Model(&models.User{}).Where("id = ?", headerBaseInfo.Uid).Find(&userInfo) if userInfo.Role == 0 { UserError.Fail(ctx, headerBaseInfo) return } var serviceCarUser models.ServiceCarUser database.Instance().Model(&models.ServiceCarUser{}).Where("uid = ?", userInfo.Id).Find(&serviceCarUser) if serviceCarUser.CarId == 0 { CarNotExistError.Fail(ctx, headerBaseInfo) return } var subOrderInfo models.OrderSub database.Instance().Model(&models.OrderSub{}).Where("order_id = ?", carServiceProcessRequest.SubOrderId).Find(&subOrderInfo) if subOrderInfo.Id == 0 { OrderExistError.Fail(ctx, carServiceProcessRequest) return } var mainOrder models.OrderMain database.Instance().Model(&models.OrderMain{}).Where("order_id = ? and status = 1", subOrderInfo.MainOrderId).Find(&mainOrder) if mainOrder.Id == 0 { OrderExistError.Fail(ctx, carServiceProcessRequest) return } if carServiceProcessRequest.Type == 1 { if subOrderInfo.OrderStatus == 3 || subOrderInfo.OrderStatus == 2 { OrderError.Fail(ctx, carServiceProcessRequest) return } } else if carServiceProcessRequest.Type == 2 { if subOrderInfo.OrderStatus == 3 { OrderError.Fail(ctx, carServiceProcessRequest) return } } var orderUserInfo *models.User database.Instance().Model(&models.User{}).Where("id = ?", mainOrder.Uid).Find(&orderUserInfo) if carServiceProcessRequest.PayAmount > 0 && subOrderInfo.TotalAmount != carServiceProcessRequest.PayAmount { //原价 originAmount := subOrderInfo.PayAmount userOriginAmount := orderUserInfo.Amount mainOrder.TotalAmount = mainOrder.TotalAmount - subOrderInfo.TotalAmount + carServiceProcessRequest.PayAmount if mainOrder.PayTotalAmount > 0 && subOrderInfo.TotalAmount != carServiceProcessRequest.PayAmount { mainOrder.PayTotalAmount = mainOrder.PayTotalAmount - originAmount + carServiceProcessRequest.PayAmount*10 } subOrderInfo.TotalAmount = carServiceProcessRequest.PayAmount subOrderInfo.PayAmount = carServiceProcessRequest.PayAmount if mainOrder.PayStatus == 1 { subOrderInfo.PayAmount = carServiceProcessRequest.PayAmount * 10 recordType := 2 amount := 0 //新价格大于原价格 加回差价 if subOrderInfo.PayAmount < originAmount { recordType = 1 amount = originAmount - subOrderInfo.PayAmount orderUserInfo.Amount = orderUserInfo.Amount + amount } else { if orderUserInfo.Amount < (subOrderInfo.PayAmount - originAmount) { OrderError.DefFail(ctx, carServiceProcessRequest, "当前余额不足") return } amount = subOrderInfo.PayAmount - originAmount orderUserInfo.Amount = orderUserInfo.Amount - amount } updateValues := map[string]interface{}{ "Amount": orderUserInfo.Amount, } database.Instance().Model(&orderUserInfo).Updates(&updateValues) userAmountRecord := models.UserAmountRecord{ UserId: orderUserInfo.Id, Type: recordType, OriginAmount: userOriginAmount, ProAmount: amount, CurrAmount: orderUserInfo.Amount, OrderId: mainOrder.OrderId, ProScene: "修改订单金额", Status: 1, } database.Instance().Model(&models.UserAmountRecord{}).Create(&userAmountRecord) } subOrderInfo.PayTime = time.Now() subOrderInfo.PayStatus = 1 } if carServiceProcessRequest.Type == 1 { subOrderInfo.OrderStatus = 2 mainOrder.OrderStatus = 2 database.Instance().Save(&mainOrder) database.Instance().Save(&subOrderInfo) } else if carServiceProcessRequest.Type == 2 { subOrderInfo.OrderStatus = 3 subOrderInfo.PayStatus = 1 subOrderInfo.PayTime = time.Now() 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 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 { mainOrder.PayStatus = 1 database.Instance().Save(&mainOrder) } if count == countStatus { mainOrder.OrderStatus = 3 database.Instance().Save(&mainOrder) } pet := GetPet(subOrderInfo.PetId) pet.PetInfo.LastServiceDate = time.Now().Format("2006-01-02") updateValues := map[string]interface{}{ "LastServiceDate": pet.PetInfo.LastServiceDate, } database.Instance().Model(&pet.PetInfo).Updates(&updateValues) } else if carServiceProcessRequest.Type == 3 { subOrderInfo.PayRemark = carServiceProcessRequest.PayRemark database.Instance().Save(&subOrderInfo) database.Instance().Model(&models.OrderServiceRecord{}).Create(&models.OrderServiceRecord{ OrderId: carServiceProcessRequest.SubOrderId, FilePath: carServiceProcessRequest.FileName, Type: carServiceProcessRequest.Type, }) } Success(ctx, carServiceProcessRequest, CarServiceProcessResponse{GetOrderDetail(mainOrder.OrderId)}) }) }} }