diff --git a/business/api/auth.go b/business/api/auth.go index 531f786..0db60b4 100644 --- a/business/api/auth.go +++ b/business/api/auth.go @@ -19,13 +19,14 @@ type LoginRequest struct { } type LoginResponse struct { - Token string `json:"token"` - Uid int64 `json:"uid"` - NickName string `json:"nickName"` - HeadImgUrl string `json:"headImgUrl"` - Amount int `json:"amount"` - Role int `json:"role"` - UserPets []UserPetInfo `json:"userPets"` + Token string `json:"token"` + Uid int64 `json:"uid"` + NickName string `json:"nickName"` + HeadImgUrl string `json:"headImgUrl"` + Amount int `json:"amount"` + Role int `json:"role"` + UserPets []UserPetInfo `json:"userPets"` + Car models.ServiceCar `json:"car"` } var defaultNickName = "微信用户" @@ -85,6 +86,13 @@ func (p DefParty) login() web_iris.Party { Amount: userInfo.Amount, Role: userInfo.Role, } + if userInfo.Role == 1 { + var serviceCarUser models.ServiceCarUser + database.Instance().Model(&models.ServiceCarUser{}).Where("uid = ?", userInfo.Id).Find(&serviceCarUser) + response.Car = CarMap[serviceCarUser.CarId] + response.Car.ServiceAddr = ServiceAddrMap[response.Car.ServiceAddrId] + } + response.UserPets = GetUserPets(userInfo.Id) Success(ctx, loginRequest, response) }) @@ -124,3 +132,18 @@ func (p DefParty) getUserInfo() web_iris.Party { }) }} } + +type UserUploadFileResponse struct { + FileName string `json:"fileName"` //文件名 +} + +// 获取用户信息 +func (p DefParty) userUploadFile() web_iris.Party { + return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) { + index.Post(AuthBase+"/userUploadFile", func(ctx *context.Context) { + headerInfo := GetHeaderBaseInfo(ctx) + fileName := CtxFileUpload(ctx) + Success(ctx, headerInfo, UserUploadFileResponse{fileName}) + }) + }} +} diff --git a/business/api/car.go b/business/api/car.go index fac9494..f4e6443 100644 --- a/business/api/car.go +++ b/business/api/car.go @@ -4,6 +4,7 @@ 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" @@ -45,9 +46,9 @@ func (p DefParty) carServiceOrderList() web_iris.Party { } 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).Offset((carServiceOrderListRequest.PageNo - 1) * carServiceOrderListRequest.PageSize).Limit(carServiceOrderListRequest.PageSize).Find(&orderMains) + 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: false}).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).Offset((carServiceOrderListRequest.PageNo - 1) * carServiceOrderListRequest.PageSize).Limit(carServiceOrderListRequest.PageSize).Find(&orderMains) + 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: false}).Offset((carServiceOrderListRequest.PageNo - 1) * carServiceOrderListRequest.PageSize).Limit(carServiceOrderListRequest.PageSize).Find(&orderMains) } var orderDetails []OrderDetail for _, value := range orderMains { @@ -57,3 +58,91 @@ func (p DefParty) carServiceOrderList() web_iris.Party { }) }} } + +type CarServiceProcessRequest struct { + Type int //操作类型 1开始 2结束 + SubOrderId string //子订单ID + PayAmount int32 //实际支付金额 + 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 + } + database.Instance().Model(&models.OrderServiceRecord{}).Create(&models.OrderServiceRecord{ + OrderId: carServiceProcessRequest.SubOrderId, + FilePath: carServiceProcessRequest.FileName, + Type: carServiceProcessRequest.Type, + }) + var mainOrder models.OrderMain + database.Instance().Model(&models.OrderMain{}).Where("order_id = ?", subOrderInfo.MainOrderId).Find(&mainOrder) + if mainOrder.Id == 0 { + OrderExistError.Fail(ctx, carServiceProcessRequest) + return + } + if carServiceProcessRequest.Type == 1 { + if subOrderInfo.Status == 3 || subOrderInfo.Status == 2 { + OrderError.Fail(ctx, carServiceProcessRequest) + return + } + subOrderInfo.Status = 2 + mainOrder.Status = 2 + database.Instance().Save(&mainOrder) + database.Instance().Save(&subOrderInfo) + } else if carServiceProcessRequest.Type == 2 { + if subOrderInfo.Status == 3 { + OrderError.Fail(ctx, carServiceProcessRequest) + return + } + subOrderInfo.Status = 3 + subOrderInfo.PayAmount = carServiceProcessRequest.PayAmount + if subOrderInfo.PayAmount == 0 { + subOrderInfo.PayAmount = subOrderInfo.TotalAmount + } + 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) + if count == countStatus { + mainOrder.Status = 3 + database.Instance().Save(&mainOrder) + } + } + Success(ctx, carServiceProcessRequest, CarServiceProcessResponse{GetOrderDetail(mainOrder.OrderId)}) + }) + }} +} diff --git a/business/api/common.go b/business/api/common.go index da7f8b7..99aafb2 100644 --- a/business/api/common.go +++ b/business/api/common.go @@ -6,6 +6,10 @@ import ( "github.com/bwmarrin/snowflake" "github.com/kataras/iris/v12/context" "go.uber.org/zap" + "io" + "mime/multipart" + "os" + "path/filepath" "pet-house.com/business/models" "pet-house.com/core/server/cache" "pet-house.com/core/server/cron_server" @@ -172,10 +176,34 @@ func DataInit() { } func DataCacheJob() { - c, err := cron_server.CronInstance().AddFunc("@every 1m", DataInit) + c, err := cron_server.CronInstance().AddFunc("@every 1m ", DataInit) if err != nil { zap_server.ZAPLOG.Info("DataCacheJob err : ", zap.Any("err", err)) } zap_server.ZAPLOG.Info("DataCacheJob c : ", zap.Any("c", c), zap.Any("err", err)) cron_server.CronInstance().Start() } + +func CtxFileUpload(ctx *context.Context) string { + file, info, _ := ctx.FormFile("file") + defer func(file multipart.File) { + _ = file.Close() + }(file) + lastFileName := NextId.Generate().String() + "_" + info.Filename + fileName := time.Now().Format("20060102") + "/" + lastFileName + targetPath := "./static/uploads/" + time.Now().Format("20060102") + if _, err := os.Stat(targetPath); os.IsNotExist(err) { + _ = os.MkdirAll(targetPath, os.ModePerm) + } + filePath := "static/uploads/" + fileName + // 创建目标文件 + destFilePath := filepath.Join(targetPath, lastFileName) + destFile, _ := os.Create(destFilePath) + defer func(destFile *os.File) { + _ = destFile.Close() + }(destFile) + // 将上传的文件内容复制到目标文件中 + id, _ := io.Copy(destFile, file) + zap_server.ZAPLOG.Info("CtxFileUpload : ", zap.Any("filePath", filePath), zap.Any("id", id)) + return fileName +} diff --git a/business/api/control.go b/business/api/control.go index 65e8ba1..4822dad 100644 --- a/business/api/control.go +++ b/business/api/control.go @@ -14,6 +14,7 @@ func (p DefParty) RegisterList() []web_iris.Party { //用户 p.login(), p.getUserInfo(), + p.userUploadFile(), //商品 p.goodsList(), p.goodsDetail(), @@ -36,6 +37,7 @@ func (p DefParty) RegisterList() []web_iris.Party { p.serviceAreaAddrList(), //车辆 p.carServiceOrderList(), + p.carServiceProcess(), p.index(), } return ps diff --git a/business/api/init.go b/business/api/init.go index d55ff4a..ab0bcd4 100644 --- a/business/api/init.go +++ b/business/api/init.go @@ -42,6 +42,7 @@ func ModuleInit() { &models.ServiceUserMark{}, &models.ServiceUserMarkRecord{}, &models.ReserveTimeFilter{}, + &models.OrderServiceRecord{}, ) DataInit() DataCacheJob() diff --git a/business/api/order.go b/business/api/order.go index 0f4d74c..4a098aa 100644 --- a/business/api/order.go +++ b/business/api/order.go @@ -351,6 +351,10 @@ 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) { @@ -363,7 +367,7 @@ func (p DefParty) orderDetail() web_iris.Party { OrderExistError.Fail(ctx, orderDetailRequest) return } - Success(ctx, orderDetailRequest, orderDetail) + Success(ctx, orderDetailRequest, OrderDetailResponse{GetOrderDetail(orderDetailRequest.OrderId)}) }) }} } diff --git a/business/models/dataModel.go b/business/models/dataModel.go index 1cd9f8c..d20c683 100644 --- a/business/models/dataModel.go +++ b/business/models/dataModel.go @@ -128,6 +128,7 @@ type OrderSub struct { TotalAmount int32 `gorm:"not null" json:"totalAmount"` //总金额 PayAmount int32 `json:"payAmount"` //实际支付金额 PayTime time.Time `gorm:"type:timestamp;" json:"payTime"` //支付时间 + PayRemark string `json:"payRemark"` //支付备注 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:"-"` //更新时间 } @@ -140,18 +141,28 @@ type OrderDetail struct { Amount int32 `gorm:"not null" json:"amount"` //价格 } +// OrderServiceRecord 订单服务记录 +type OrderServiceRecord struct { + Id int64 `gorm:"primaryKey;autoIncrement" json:"id"` //id + OrderId string `gorm:"index:not null" json:"orderId"` //订单ID + FilePath string `json:"filePath"` //照片路径 + Type int `gorm:"not null" json:"type"` //服务类型 + CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"createTime"` //创建时间 +} + // ServiceCar 服务车辆 type ServiceCar struct { - Id int `gorm:"primaryKey;autoIncrement" json:"id"` //id - CarNo string `gorm:"index;not null" json:"carNo"` //车牌号 - CarModel string `json:"carModel"` //车辆型号 - ServiceAddrId int64 `gorm:"not null" json:"serviceAddrId"` //服务地址ID - ServiceStatus int `gorm:"not null" json:"serviceStatus"` //当前服务状态 0空闲中 1排单中 2服务中 - NowServiceAddr string `json:"nowServiceAddr"` //当前服务地址 开始服务记录位置 - NowLongitude string `json:"nowLongitude"` //当前服务位置经度 - NowLatitude string `json:"nowLatitude"` //当前服务位置维度 - CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"-"` //创建时间 - UpdateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP" json:"-"` //更新时间 + Id int `gorm:"primaryKey;autoIncrement" json:"id"` //id + CarNo string `gorm:"index;not null" json:"carNo"` //车牌号 + CarModel string `json:"carModel"` //车辆型号 + ServiceAddrId int64 `gorm:"not null" json:"serviceAddrId"` //服务地址ID + ServiceStatus int `gorm:"not null" json:"serviceStatus"` //当前服务状态 0空闲中 1排单中 2服务中 + NowServiceAddr string `json:"nowServiceAddr"` //当前服务地址 开始服务记录位置 + NowLongitude string `json:"nowLongitude"` //当前服务位置经度 + NowLatitude string `json:"nowLatitude"` //当前服务位置维度 + CreateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP" json:"-"` //创建时间 + UpdateTime time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP" json:"-"` //更新时间 + ServiceAddr ServiceAddr `gorm:"-" json:"serviceAddr"` //当前服务区域 } // CarOrder 车辆订单