diff --git a/app/api/enterprise/api/technology.go b/app/api/enterprise/api/technology.go index b4abd33..01c66fa 100644 --- a/app/api/enterprise/api/technology.go +++ b/app/api/enterprise/api/technology.go @@ -55,6 +55,19 @@ type ( DemandBenefit string `json:"demand_benefit" form:"demand_benefit"` // 效益 Status int `json:"status" form:"status"` } + // topicForm 课题参数 + topicForm struct { + Title string `json:"title" form:"title" binding:"required"` + Emcee string `json:"emcee" form:"emcee" binding:"required"` + Mechanism string `json:"mechanism" form:"mechanism" binding:"required"` + Code string `json:"code" form:"code" binding:"required"` + BeginAt string `json:"begin_at" form:"begin_at" binding:"required"` + FinishAt string `json:"finish_at" form:"finish_at" binding:"required"` + Amount float64 `json:"amount" form:"amount" binding:"required"` + Source int `json:"source" form:"source" binding:"required"` + Kind int `json:"kind" form:"kind" binding:"required"` + Keywords []string `json:"keywords" form:"keywords"` + } ) func (a *Technology) Paper(c *gin.Context) { @@ -268,3 +281,71 @@ func (a *Technology) DemandDelete(c *gin.Context) { Delete(form.Convert()) api.APIResponse(err)(c) } + +func (a *Technology) Topic(c *gin.Context) { + form := &struct { + Status int `json:"status" form:"status"` + api.PageForm + }{} + if err := api.Bind(form)(c); err != nil { + api.APIFailure(err.(error))(c) + return + } + data, err := technology2.NewTopic()(api.GetSession()(c).(*service.SessionEnterprise), api.GetLocal()(c).(string)). + List(form.Status, form.Page, form.PageSize) + api.APIResponse(err, data)(c) +} + +func (a *Technology) TopicDetail(c *gin.Context) { + form := new(api.IDStringForm) + + if err := api.Bind(form)(c); err != nil { + api.APIFailure(err.(error))(c) + return + } + data, err := technology2.NewTopic()(api.GetSession()(c).(*service.SessionEnterprise), api.GetLocal()(c).(string)). + Detail(form.Convert()) + api.APIResponse(err, data)(c) +} + +func (a *Technology) TopicAdd(c *gin.Context) { + form := new(topicForm) + + if err := api.Bind(form)(c); err != nil { + api.APIFailure(err.(error))(c) + return + } + err := technology2.NewTopic()(api.GetSession()(c).(*service.SessionEnterprise), api.GetLocal()(c).(string)). + Form(&technology2.TopicParams{Title: form.Title, Emcee: form.Emcee, Mechanism: form.Mechanism, Code: form.Code, + BeginAt: form.BeginAt, FinishAt: form.FinishAt, Amount: form.Amount, Source: form.Source, Kind: form.Kind, + Keywords: form.Keywords}) + api.APIResponse(err)(c) +} + +func (a *Technology) TopicEdit(c *gin.Context) { + form := &struct { + api.IDStringForm + topicForm + }{} + if err := api.Bind(form)(c); err != nil { + api.APIFailure(err.(error))(c) + return + } + err := technology2.NewTopic()(api.GetSession()(c).(*service.SessionEnterprise), api.GetLocal()(c).(string)). + Form(&technology2.TopicParams{ID: form.Convert(), Title: form.Title, Emcee: form.Emcee, Mechanism: form.Mechanism, + Code: form.Code, BeginAt: form.BeginAt, FinishAt: form.FinishAt, Amount: form.Amount, Source: form.Source, + Kind: form.Kind, Keywords: form.Keywords}) + api.APIResponse(err)(c) +} + +func (a *Technology) TopicDelete(c *gin.Context) { + form := new(api.IDStringForm) + + if err := api.Bind(form)(c); err != nil { + api.APIFailure(err.(error))(c) + return + } + err := technology2.NewTopic()(api.GetSession()(c).(*service.SessionEnterprise), api.GetLocal()(c).(string)). + Delete(form.Convert()) + api.APIResponse(err)(c) +} diff --git a/app/api/enterprise/controller/technology/topic.go b/app/api/enterprise/controller/technology/topic.go new file mode 100644 index 0000000..8fa2713 --- /dev/null +++ b/app/api/enterprise/controller/technology/topic.go @@ -0,0 +1,152 @@ +package technology + +import ( + "SciencesServer/app/api/enterprise/model" + "SciencesServer/app/api/manage/controller" + model2 "SciencesServer/app/common/model" + "SciencesServer/app/service" + "SciencesServer/utils" + "errors" + "time" +) + +type Topic struct { + *service.SessionEnterprise + local string +} + +type TopicHandle func(enterprise *service.SessionEnterprise, local string) *Topic + +type ( + // TopicInfo 课题信息 + TopicInfo struct { + ID string `json:"id"` + Title string `json:"title"` + Kind model2.TechnologyTopicKind `json:"kind"` + Keywords []string `json:"keywords"` + CreatedAt time.Time `json:"created_at"` + } + // TopicDetailInfo 课题详细信息 + TopicDetailInfo struct { + ID string `json:"id"` + *model2.TechnologyTopic + Keywords []string `json:"keywords"` + } + // TopicParams 课题参数信息 + TopicParams struct { + ID uint64 + Title, Emcee, Mechanism, Code, BeginAt, FinishAt string + Amount float64 + Source, Kind int + Keywords []string + } +) + +// List 列表信息 +func (c *Topic) List(status int, page, pageSize int) (*controller.ReturnPages, error) { + mTechnologyTopic := model.NewTechnologyTopic() + + where := []*model2.ModelWhereOrder{&model2.ModelWhereOrder{ + Where: model2.NewWhere("status", status), + Order: model2.NewOrder("id", model2.OrderModeToDesc), + }, &model2.ModelWhereOrder{Where: model2.NewWhere("uid", c.ManageUID)}} + + var count int64 + + out := make([]*model2.TechnologyTopic, 0) + + if err := model2.PagesFields(mTechnologyTopic.TechnologyTopic, &out, []string{"id", "title", "kind", "keyword", "created_at"}, + page, pageSize, &count, where...); err != nil { + return nil, err + } + list := make([]*TopicInfo, 0) + + for _, v := range out { + list = append(list, &TopicInfo{ + ID: v.GetEncodeID(), Title: v.Title, Kind: v.Kind, Keywords: v.GetKeywordAttribute(), + CreatedAt: v.CreatedAt, + }) + } + return &controller.ReturnPages{Data: list, Count: count}, nil +} + +// Detail 详细信息 +func (c *Topic) Detail(id uint64) (*TopicDetailInfo, error) { + mTechnologyTopic := model.NewTechnologyTopic() + mTechnologyTopic.ID = id + + isExist, err := model2.First(mTechnologyTopic.TechnologyTopic) + + if err != nil { + return nil, err + } else if !isExist { + return nil, errors.New("操作错误,课题信息不存在") + } + return &TopicDetailInfo{ + ID: mTechnologyTopic.GetEncodeID(), TechnologyTopic: mTechnologyTopic.TechnologyTopic, + Keywords: mTechnologyTopic.GetKeywordAttribute(), + }, nil +} + +// Form 数据处理 +func (c *Topic) Form(params *TopicParams) error { + mTechnologyTopic := model.NewTechnologyTopic() + + if params.ID > 0 { + mTechnologyTopic.ID = params.ID + isExist, err := model2.FirstField(mTechnologyTopic.TechnologyTopic, []string{"id", "uid", "status"}) + + if err != nil { + return err + } else if !isExist { + return errors.New("操作错误,课题信息不存在") + } else if mTechnologyTopic.UID != c.ManageUID { + return errors.New("无权限操作") + } + } + mTechnologyTopic.Title = params.Title + mTechnologyTopic.Emcee = params.Emcee + mTechnologyTopic.Mechanism = params.Mechanism + mTechnologyTopic.Code = params.Code + mTechnologyTopic.Amount = params.Amount + mTechnologyTopic.Source = model2.TechnologyTopicSource(params.Source) + mTechnologyTopic.Kind = model2.TechnologyTopicKind(params.Kind) + mTechnologyTopic.SetKeywordAttribute(params.Keywords) + mTechnologyTopic.BeginAt = utils.DataTimeToDate(params.BeginAt) + mTechnologyTopic.FinishAt = utils.DataTimeToDate(params.FinishAt) + + if mTechnologyTopic.ID > 0 { + mTechnologyTopic.UpdatedAt = time.Now() + return model2.Updates(mTechnologyTopic.TechnologyTopic, mTechnologyTopic.TechnologyTopic) + } + mTechnologyTopic.TenantID = c.TenantID + mTechnologyTopic.Local.Local = c.local + mTechnologyTopic.UID = c.ManageUID + return model2.Create(mTechnologyTopic.TechnologyTopic) +} + +// Delete 删除处理 +func (c *Topic) Delete(id uint64) error { + mTechnologyTopic := model.NewTechnologyTopic() + mTechnologyTopic.ID = id + + isExist, err := model2.FirstField(mTechnologyTopic.TechnologyTopic, []string{"id", "uid", "status"}) + + if err != nil { + return err + } else if !isExist { + return errors.New("操作错误,课题信息不存在") + } else if mTechnologyTopic.UID != c.ManageUID { + return errors.New("无权限操作") + } + return model2.Delete(mTechnologyTopic.TechnologyTopic) +} + +func NewTopic() TopicHandle { + return func(enterprise *service.SessionEnterprise, local string) *Topic { + return &Topic{ + SessionEnterprise: enterprise, + local: local, + } + } +} diff --git a/app/api/enterprise/model/technology_topic.go b/app/api/enterprise/model/technology_topic.go new file mode 100644 index 0000000..48f5765 --- /dev/null +++ b/app/api/enterprise/model/technology_topic.go @@ -0,0 +1,11 @@ +package model + +import "SciencesServer/app/common/model" + +type TechnologyTopic struct { + *model.TechnologyTopic +} + +func NewTechnologyTopic() *TechnologyTopic { + return &TechnologyTopic{model.NewTechnologyTopic()} +} diff --git a/app/common/model/technology_topic.go b/app/common/model/technology_topic.go new file mode 100644 index 0000000..b1fedad --- /dev/null +++ b/app/common/model/technology_topic.go @@ -0,0 +1,63 @@ +package model + +import ( + "SciencesServer/utils" + "time" +) + +// TechnologyTopic 技术课题数据模型 +type TechnologyTopic struct { + Model + ModelTenant + Local + UID uint64 `gorm:"column:uid;type:int;default:0;comment:用户uuid" json:"-"` + Title string `gorm:"column:title;type:varchar(100);default:null;comment:名称" json:"title"` + Code string `gorm:"column:code;type:varchar(30);default:null;comment:编号" json:"code"` + Emcee string `gorm:"column:emcee;type:varchar(30);default:null;comment:主持人" json:"emcee"` + Mechanism string `gorm:"column:mechanism;type:varchar(30);default:null;comment:机构" json:"mechanism"` + Keyword string `gorm:"column:keyword;type:varchar(255);default:null;comment:关键词" json:"-"` + Amount float64 `gorm:"column:amount;decimal(10,2);default:0;comment:经费" json:"amount"` + Source TechnologyTopicSource `gorm:"column:source;type:tinyint(1);default:0comment:来源" json:"source"` + Kind TechnologyTopicKind `gorm:"column:kind;type:tinyint(1);default:0comment:类型" json:"kind"` + BeginAt time.Time `gorm:"column:begin_at;type:datetime;not null;comment:开始时间" json:"begin_at"` + FinishAt time.Time `gorm:"column:finish_at;type:datetime;not null;comment:结束时间" json:"finish_at"` + ModelDeleted + ModelAt +} + +// TechnologyTopicSource 技术课题资助来源 +type TechnologyTopicSource int + +const ( + // TechnologyTopicSourceForCity 市级 + TechnologyTopicSourceForCity TechnologyTopicSource = iota + 1 + // TechnologyTopicSourceForProvince 省级 + TechnologyTopicSourceForProvince + // TechnologyTopicSourceForCountry 国家级 + TechnologyTopicSourceForCountry +) + +// TechnologyTopicKind 技术课题类型 +type TechnologyTopicKind int + +const ( +//TechnologyTopicKindFor +) + +func (m *TechnologyTopic) TableName() string { + return m.NewTableName("technology_topic") +} + +func (m *TechnologyTopic) GetKeywordAttribute() []string { + keywords := make([]string, 0) + _ = utils.FromJSON(m.Keyword, &keywords) + return keywords +} + +func (m *TechnologyTopic) SetKeywordAttribute(keywords []string) { + m.Keyword = utils.AnyToJSON(keywords) +} + +func NewTechnologyTopic() *TechnologyTopic { + return &TechnologyTopic{} +} diff --git a/router/address.go b/router/address.go index 4f66564..de824d5 100644 --- a/router/address.go +++ b/router/address.go @@ -142,5 +142,9 @@ func registerEnterpriseAPI(app *gin.Engine) { technology.POST("/demand/add", _api.DemandAdd) technology.POST("/demand/edit", _api.DemandEdit) technology.POST("/demand/delete", _api.DemandDelete) + technology.POST("/topic", _api.Topic) + technology.POST("/topic/add", _api.TopicAdd) + technology.POST("/topic/edit", _api.TopicEdit) + technology.POST("/topic/delete", _api.TopicDelete) } } diff --git a/serve/es/serve.go b/serve/es/serve.go new file mode 100644 index 0000000..9af4c34 --- /dev/null +++ b/serve/es/serve.go @@ -0,0 +1,5 @@ +package es + +func Set() { + esClient.Search() +}