| @@ -146,6 +146,7 @@ func init() { | |||
| new(SearchRecord), | |||
| new(AiModelConvert), | |||
| new(ResourceQueue), | |||
| new(ResourceSpecification), | |||
| ) | |||
| tablesStatistic = append(tablesStatistic, | |||
| @@ -1,19 +1,159 @@ | |||
| package models | |||
| import "code.gitea.io/gitea/modules/timeutil" | |||
| import ( | |||
| "code.gitea.io/gitea/modules/timeutil" | |||
| "xorm.io/builder" | |||
| ) | |||
| const ( | |||
| SpecNotVerified int = iota + 1 | |||
| SpecEffective | |||
| SpecNotEffective | |||
| ) | |||
| type ResourceSpecification struct { | |||
| ID int64 `xorm:"pk autoincr"` | |||
| QueueId int64 `xorm:"INDEX"` | |||
| AccCardsNum int | |||
| CpuNum int | |||
| MemMiB int | |||
| ShareMemMiB int | |||
| UnitPrice int | |||
| Status int | |||
| CreatedFrom string | |||
| CreatedTime timeutil.TimeStamp `xorm:"INDEX created"` | |||
| CreatedBy int64 | |||
| UpdatedTime timeutil.TimeStamp `xorm:"INDEX updated"` | |||
| UpdatedBy int64 | |||
| ID int64 `xorm:"pk autoincr"` | |||
| QueueId int64 `xorm:"INDEX"` | |||
| SourceSpecId string `xorm:"INDEX"` | |||
| AccCardsNum int | |||
| CpuNum int | |||
| MemMiB int | |||
| ShareMemMiB int | |||
| UnitPrice int | |||
| Status int | |||
| IsAutomaticSync bool | |||
| CreatedTime timeutil.TimeStamp `xorm:"created"` | |||
| CreatedBy int64 | |||
| UpdatedTime timeutil.TimeStamp `xorm:"updated"` | |||
| UpdatedBy int64 | |||
| } | |||
| func (r ResourceSpecification) ConvertToRes() *ResourceSpecificationRes { | |||
| return &ResourceSpecificationRes{ | |||
| ID: r.ID, | |||
| SourceSpecId: r.SourceSpecId, | |||
| AccCardsNum: r.AccCardsNum, | |||
| CpuNum: r.CpuNum, | |||
| MemMiB: r.MemMiB, | |||
| ShareMemMiB: r.ShareMemMiB, | |||
| UnitPrice: r.UnitPrice, | |||
| Status: r.Status, | |||
| } | |||
| } | |||
| type ResourceSpecificationReq struct { | |||
| QueueId int64 `binding:"Required"` | |||
| AccCardsNum int | |||
| CpuNum int | |||
| MemGiB int | |||
| ShareMemGiB int | |||
| UnitPrice int | |||
| Status int | |||
| IsAutomaticSync bool | |||
| CreatorId int64 | |||
| } | |||
| func (r ResourceSpecificationReq) ToDTO() ResourceSpecification { | |||
| return ResourceSpecification{ | |||
| QueueId: r.QueueId, | |||
| AccCardsNum: r.AccCardsNum, | |||
| CpuNum: r.CpuNum, | |||
| MemMiB: r.MemGiB * 1024, | |||
| ShareMemMiB: r.ShareMemGiB * 1024, | |||
| UnitPrice: r.UnitPrice, | |||
| Status: r.Status, | |||
| IsAutomaticSync: r.IsAutomaticSync, | |||
| CreatedBy: r.CreatorId, | |||
| UpdatedBy: r.CreatorId, | |||
| } | |||
| } | |||
| type SearchResourceSpecificationOptions struct { | |||
| ListOptions | |||
| QueueId int64 | |||
| Status int | |||
| } | |||
| type ResourceSpecAndQueueListRes struct { | |||
| TotalSize int64 | |||
| List []*ResourceSpecAndQueueRes | |||
| } | |||
| func NewResourceSpecAndQueueListRes(totalSize int64, list []ResourceSpecAndQueue) *ResourceSpecAndQueueListRes { | |||
| resList := make([]*ResourceSpecAndQueueRes, len(list)) | |||
| for i, v := range list { | |||
| resList[i] = v.ConvertToRes() | |||
| } | |||
| return &ResourceSpecAndQueueListRes{ | |||
| TotalSize: totalSize, | |||
| List: resList, | |||
| } | |||
| } | |||
| type ResourceSpecificationRes struct { | |||
| ID int64 | |||
| SourceSpecId string | |||
| AccCardsNum int | |||
| CpuNum int | |||
| MemMiB int | |||
| ShareMemMiB int | |||
| UnitPrice int | |||
| Status int | |||
| } | |||
| type ResourceSpecAndQueueRes struct { | |||
| Spec *ResourceSpecificationRes | |||
| Queue *ResourceQueueRes | |||
| } | |||
| type ResourceSpecAndQueue struct { | |||
| ResourceSpecification `xorm:"extends"` | |||
| ResourceQueue `xorm:"extends"` | |||
| } | |||
| func (*ResourceSpecAndQueue) TableName() string { | |||
| return "resource_specification" | |||
| } | |||
| func (r ResourceSpecAndQueue) ConvertToRes() *ResourceSpecAndQueueRes { | |||
| return &ResourceSpecAndQueueRes{ | |||
| Spec: r.ResourceSpecification.ConvertToRes(), | |||
| Queue: r.ResourceQueue.ConvertToRes(), | |||
| } | |||
| } | |||
| func InsertResourceSpecification(queue ResourceSpecification) (int64, error) { | |||
| return x.Insert(&queue) | |||
| } | |||
| func UpdateResourceSpecificationById(queueId int64, queue ResourceSpecification) (int64, error) { | |||
| return x.ID(queueId).Update(&queue) | |||
| } | |||
| func SearchResourceSpecification(opts SearchResourceSpecificationOptions) (int64, []ResourceSpecAndQueue, error) { | |||
| var cond = builder.NewCond() | |||
| if opts.Page <= 0 { | |||
| opts.Page = 1 | |||
| } | |||
| if opts.QueueId > 0 { | |||
| cond = cond.And(builder.Eq{"resource_specification.queue_id": opts.QueueId}) | |||
| } | |||
| if opts.Status > 0 { | |||
| cond = cond.And(builder.Eq{"resource_specification.status": opts.Status}) | |||
| } | |||
| n, err := x.Where(cond).Count(&ResourceSpecAndQueue{}) | |||
| if err != nil { | |||
| return 0, nil, err | |||
| } | |||
| r := make([]ResourceSpecAndQueue, 0) | |||
| err = x.Where(cond). | |||
| Join("LEFT", "resource_queue", "resource_queue.ID = resource_specification.queue_id"). | |||
| Desc("resource_specification.id"). | |||
| Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). | |||
| Find(&r) | |||
| if err != nil { | |||
| return 0, nil, err | |||
| } | |||
| return n, r, nil | |||
| } | |||
| @@ -58,7 +58,7 @@ func GetResourceQueueList(ctx *context.Context) { | |||
| ctx.JSON(http.StatusOK, response.SuccessWithData(list)) | |||
| } | |||
| func AddResourceNewQueue(ctx *context.Context, req models.ResourceQueueReq) { | |||
| func AddResourceQueue(ctx *context.Context, req models.ResourceQueueReq) { | |||
| req.IsAutomaticSync = false | |||
| req.CreatorId = ctx.User.ID | |||
| err := resource.AddResourceQueue(req) | |||
| @@ -72,14 +72,62 @@ func AddResourceNewQueue(ctx *context.Context, req models.ResourceQueueReq) { | |||
| func UpdateResourceQueue(ctx *context.Context, req models.ResourceQueueReq) { | |||
| queueId := ctx.ParamsInt64(":id") | |||
| if req.CardsTotalNum < 0 { | |||
| ctx.JSON(http.StatusOK, response.ServerError("param error")) | |||
| //only CardsTotalNum permitted to change | |||
| err := resource.UpdateResourceQueue(queueId, req.CardsTotalNum) | |||
| if err != nil { | |||
| log.Error("UpdateResourceQueue error. %v", err) | |||
| ctx.JSON(http.StatusOK, response.ServerError(err.Error())) | |||
| return | |||
| } | |||
| //only CardsTotalNum permitted to change | |||
| err := resource.UpdateCardsTotalNum(queueId, req.CardsTotalNum) | |||
| ctx.JSON(http.StatusOK, response.Success()) | |||
| } | |||
| func GetResourceSpecificationList(ctx *context.Context) { | |||
| page := ctx.QueryInt("page") | |||
| queue := ctx.QueryInt64("queue") | |||
| status := ctx.QueryInt("status") | |||
| list, err := resource.GetResourceSpecificationList(models.SearchResourceSpecificationOptions{ | |||
| ListOptions: models.ListOptions{Page: page, PageSize: 20}, | |||
| QueueId: queue, | |||
| Status: status, | |||
| }) | |||
| if err != nil { | |||
| log.Error("GetResourceSpecificationList error.%v", err) | |||
| ctx.JSON(http.StatusOK, response.ServerError(err.Error())) | |||
| return | |||
| } | |||
| ctx.JSON(http.StatusOK, response.SuccessWithData(list)) | |||
| } | |||
| func AddResourceSpecification(ctx *context.Context, req models.ResourceSpecificationReq) { | |||
| req.IsAutomaticSync = false | |||
| req.CreatorId = ctx.User.ID | |||
| err := resource.AddResourceSpecification(req) | |||
| if err != nil { | |||
| log.Error("AddResourceQueue error. %v", err) | |||
| ctx.JSON(http.StatusOK, response.ServerError(err.Error())) | |||
| return | |||
| } | |||
| ctx.JSON(http.StatusOK, response.Success()) | |||
| } | |||
| func UpdateResourceSpecification(ctx *context.Context, req models.ResourceSpecificationReq) { | |||
| id := ctx.ParamsInt64(":id") | |||
| action := ctx.Query("action") | |||
| var err error | |||
| switch action { | |||
| case "edit": | |||
| if req.UnitPrice < 0 { | |||
| ctx.JSON(http.StatusOK, response.ServerError("param error")) | |||
| return | |||
| } | |||
| //only UnitPrice permitted to change | |||
| err = resource.UpdateUnitPrice(id, req.UnitPrice) | |||
| } | |||
| if err != nil { | |||
| log.Error("UpdateCardsTotalNum error. %v", err) | |||
| log.Error("UpdateResourceSpecification error. %v", err) | |||
| ctx.JSON(http.StatusOK, response.ServerError(err.Error())) | |||
| return | |||
| } | |||
| @@ -610,11 +610,14 @@ func RegisterRoutes(m *macaron.Macaron) { | |||
| m.Group("/queue", func() { | |||
| m.Get("", admin.GetQueuePage) | |||
| m.Get("/list", admin.GetResourceQueueList) | |||
| m.Post("/add", binding.Bind(models.ResourceQueueReq{}), admin.AddResourceNewQueue) | |||
| m.Post("/add", binding.Bind(models.ResourceQueueReq{}), admin.AddResourceQueue) | |||
| m.Post("/update/:id", binding.BindIgnErr(models.ResourceQueueReq{}), admin.UpdateResourceQueue) | |||
| }) | |||
| m.Group("/specification", func() { | |||
| m.Get("", admin.GetSpecificationPage) | |||
| m.Get("/list", admin.GetResourceSpecificationList) | |||
| m.Post("/add", binding.Bind(models.ResourceSpecificationReq{}), admin.AddResourceSpecification) | |||
| m.Post("/update/:id", binding.BindIgnErr(models.ResourceSpecificationReq{}), admin.UpdateResourceSpecification) | |||
| }) | |||
| m.Group("/scene", func() { | |||
| m.Get("", admin.GetScenePage) | |||
| @@ -10,8 +10,12 @@ func AddResourceQueue(req models.ResourceQueueReq) error { | |||
| } | |||
| return nil | |||
| } | |||
| func UpdateCardsTotalNum(queueId int64, cardsTotalNum int) error { | |||
| if _, err := models.UpdateResourceQueueById(queueId, models.ResourceQueue{CardsTotalNum: cardsTotalNum}); err != nil { | |||
| func UpdateResourceQueue(queueId int64, req models.ResourceQueueReq) error { | |||
| if _, err := models.UpdateResourceQueueById(queueId, models.ResourceQueue{ | |||
| CardsTotalNum: req.CardsTotalNum, | |||
| Remark: req.Remark, | |||
| }); err != nil { | |||
| return err | |||
| } | |||
| return nil | |||
| @@ -0,0 +1,31 @@ | |||
| package resource | |||
| import ( | |||
| "code.gitea.io/gitea/models" | |||
| ) | |||
| func AddResourceSpecification(req models.ResourceSpecificationReq) error { | |||
| if req.Status == 0 { | |||
| req.Status = models.SpecNotVerified | |||
| } | |||
| if _, err := models.InsertResourceSpecification(req.ToDTO()); err != nil { | |||
| return err | |||
| } | |||
| return nil | |||
| } | |||
| func UpdateUnitPrice(specId int64, unitPrice int) error { | |||
| if _, err := models.UpdateResourceSpecificationById(specId, models.ResourceSpecification{UnitPrice: unitPrice}); err != nil { | |||
| return err | |||
| } | |||
| return nil | |||
| } | |||
| func GetResourceSpecificationList(opts models.SearchResourceSpecificationOptions) (*models.ResourceSpecAndQueueListRes, error) { | |||
| n, r, err := models.SearchResourceSpecification(opts) | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| return models.NewResourceSpecAndQueueListRes(n, r), nil | |||
| } | |||