From f654b0a4f0f5e937aa2a8d3cee78b94650e9d115 Mon Sep 17 00:00:00 2001 From: henry Date: Fri, 24 Dec 2021 12:00:18 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=AE=8C=E5=96=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/website/api/manage.go | 25 +++++ app/api/website/controller/manage/expert.go | 98 +++++++++++++++++++ app/api/website/controller/manage/search.go | 41 +++++--- .../controller/service/solution_case.go | 1 + app/api/website/model/manage_expert.go | 64 ++++++++++++ .../website/model/technology_achievement.go | 4 +- app/api/website/model/user_expert.go | 11 +++ app/common/model/technology_achievement.go | 19 ++++ router/address.go | 2 + 9 files changed, 248 insertions(+), 17 deletions(-) create mode 100644 app/api/website/controller/manage/expert.go create mode 100644 app/api/website/model/user_expert.go diff --git a/app/api/website/api/manage.go b/app/api/website/api/manage.go index 3bbbb80..6bbcec0 100644 --- a/app/api/website/api/manage.go +++ b/app/api/website/api/manage.go @@ -47,3 +47,28 @@ func (*Manage) CompanyProduct(c *gin.Context) { data, err := manage.NewCompany()(nil).Product((&api.IDStringForm{ID: form.CompanyID}).Convert(), form.Page, form.PageSize) api.APIResponse(err, data)(c) } + +func (*Manage) Expert(c *gin.Context) { + form := &struct { + ExpertID string `json:"expert_id" form:"expert_id" binding:"required"` + }{} + if err := api.Bind(form)(c); err != nil { + api.APIFailure(err.(error))(c) + return + } + data, err := manage.NewExpert()(nil).Instance((&api.IDStringForm{ID: form.ExpertID}).Convert()) + api.APIResponse(err, data)(c) +} + +func (*Manage) ExpertAchievement(c *gin.Context) { + form := &struct { + ExpertID string `json:"expert_id" form:"expert_id" binding:"required"` + api.PageForm + }{} + if err := api.Bind(form)(c); err != nil { + api.APIFailure(err.(error))(c) + return + } + data, err := manage.NewExpert()(nil).Achievement((&api.IDStringForm{ID: form.ExpertID}).Convert(), form.Page, form.PageSize) + api.APIResponse(err, data)(c) +} diff --git a/app/api/website/controller/manage/expert.go b/app/api/website/controller/manage/expert.go new file mode 100644 index 0000000..8561509 --- /dev/null +++ b/app/api/website/controller/manage/expert.go @@ -0,0 +1,98 @@ +package manage + +import ( + "SciencesServer/app/api/website/model" + "SciencesServer/app/basic/controller" + model2 "SciencesServer/app/common/model" + "SciencesServer/app/session" + "strings" +) + +type Expert struct { + *session.Enterprise +} + +type ExpertHandle func(session *session.Enterprise) *Expert + +type ( + // ExpertBasicInfo 基本信息 + ExpertBasicInfo struct { + ID string `json:"id"` + Name string `json:"name"` + School string `json:"school"` + Major string `json:"major"` + Industrys []string `json:"industrys"` + Keywords []string `json:"keywords"` + PatentTitles []string `json:"patent_titles"` + } + // ExpertInstanceInfo 专家信息 + ExpertInstanceInfo struct { + ExpertBasicInfo + Researchs []string `json:"researchs"` + Introduce string `json:"introduce"` + } + // ExpertAchievementInfo 专家成果信息 + ExpertAchievementInfo struct { + *model.TechnologyAchievementInfo + ChargeInfo *model2.TechnologyAchievementChargeInfo `json:"charge_info"` + } +) + +// Instance 专家信息 +func (c *Expert) Instance(id uint64) (*ExpertInstanceInfo, error) { + mManageExpert := model.NewManageExpert() + out, err := mManageExpert.Detail(3, id) + + if err != nil { + return nil, err + } + return &ExpertInstanceInfo{ + ExpertBasicInfo: ExpertBasicInfo{ + ID: out.GetEncodeID(), + Name: out.Name, + School: out.School, + Major: out.Major, + Industrys: out.GetIndustryAttribute(), + Keywords: out.GetKeywordAttribute(), + PatentTitles: strings.Split(out.PatentTitle, "&&"), + }, + Researchs: out.GetResearchAttribute(), + Introduce: out.Introduce, + }, nil +} + +func (c *Expert) Achievement(id uint64, page, pageSize int) (*controller.ReturnPages, error) { + // 查询专家身份下用户信息 + mUserExpert := model.NewUserExpert() + + uids := make([]*uint64, 0) + + err := model2.Pluck(mUserExpert.UserExpert, "uid", &uids, model2.NewWhere("expert_id", id)) + + if err != nil { + return nil, err + } + mTechnologyAchievement := model.NewTechnologyAchievement() + var count int64 + + out := make([]*model.TechnologyAchievementInfo, 0) + + if out, err = mTechnologyAchievement.Achievement(page, pageSize, &count, model2.NewWhereIn("uid", uids)); err != nil { + return nil, err + } + list := make([]*ExpertAchievementInfo, 0) + + for _, v := range out { + list = append(list, &ExpertAchievementInfo{ + TechnologyAchievementInfo: v, + ChargeInfo: v.GetChargeInfoAttribute(), + }) + } + return &controller.ReturnPages{Data: list, Count: count}, nil +} + +func NewExpert() ExpertHandle { + return func(session *session.Enterprise) *Expert { + return &Expert{session} + } +} diff --git a/app/api/website/controller/manage/search.go b/app/api/website/controller/manage/search.go index 438d1ce..0bc5831 100644 --- a/app/api/website/controller/manage/search.go +++ b/app/api/website/controller/manage/search.go @@ -7,6 +7,7 @@ import ( "SciencesServer/app/service" config2 "SciencesServer/config" "errors" + "strings" ) type Search struct{} @@ -33,12 +34,13 @@ func company(ids []uint64) (interface{}, error) { mManageCompany := model.NewManageCompany() out := make([]*model2.ManageCompany, 0) - if err := model2.ScanFields(mManageCompany.ManageCompany, &out, []string{}, &model2.ModelWhereOrder{ - Where: model2.NewWhereIn("id", ids), - Order: model2.NewOrder("id", model2.OrderModeToDesc), - }, &model2.ModelWhereOrder{ - Where: model2.NewWhere("examine_status", model2.ExamineStatusForAgree), - }); err != nil { + if err := model2.ScanFields(mManageCompany.ManageCompany, &out, []string{"id", "kind", "name", "image", "url", "keyword"}, + &model2.ModelWhereOrder{ + Where: model2.NewWhereIn("id", ids), + Order: model2.NewOrder("id", model2.OrderModeToDesc), + }, &model2.ModelWhereOrder{ + Where: model2.NewWhere("examine_status", model2.ExamineStatusForAgree), + }); err != nil { return nil, err } list := make([]*CompanyBasicInfo, 0) @@ -54,19 +56,28 @@ func company(ids []uint64) (interface{}, error) { return list, nil } +// expert 专家信息 func expert(ids []uint64) (interface{}, error) { - mManageCompany := model.NewManageCompany() - out := make([]*model2.ManageCompany, 0) + mManageExpert := model.NewManageExpert() + out, err := mManageExpert.Expert(3, model2.NewWhereIn("e.id", ids)) - if err := model2.ScanFields(mManageCompany.ManageCompany, &out, []string{}, &model2.ModelWhereOrder{ - Where: model2.NewWhereIn("id", ids), - Order: model2.NewOrder("id", model2.OrderModeToDesc), - }, &model2.ModelWhereOrder{ - Where: model2.NewWhere("examine_status", model2.ExamineStatusForAgree), - }); err != nil { + if err != nil { return nil, err } - return out, nil + list := make([]*ExpertBasicInfo, 0) + + for _, v := range out { + list = append(list, &ExpertBasicInfo{ + ID: v.GetEncodeID(), + Name: v.Name, + School: v.School, + Major: v.Major, + Industrys: v.GetIndustryAttribute(), + Keywords: v.GetKeywordAttribute(), + PatentTitles: strings.Split(v.PatentTitle, "&&"), + }) + } + return list, nil } func research(ids []uint64) (interface{}, error) { diff --git a/app/api/website/controller/service/solution_case.go b/app/api/website/controller/service/solution_case.go index 018fd3a..e1d5af0 100644 --- a/app/api/website/controller/service/solution_case.go +++ b/app/api/website/controller/service/solution_case.go @@ -11,6 +11,7 @@ import ( "time" ) +// SolutionCase 解决方案案例 type SolutionCase struct { *session.Enterprise local string diff --git a/app/api/website/model/manage_expert.go b/app/api/website/model/manage_expert.go index c0317d4..19bfeed 100644 --- a/app/api/website/model/manage_expert.go +++ b/app/api/website/model/manage_expert.go @@ -3,12 +3,76 @@ package model import ( "SciencesServer/app/common/model" "SciencesServer/serve/orm" + "fmt" ) type ManageExpert struct { *model.ManageExpert } +type ManageExpertInfo struct { + *model.ManageExpert + PatentTitle string `json:"-"` + Research string `json:"-"` + Introduce string `json:"introduce"` +} + +// Expert 专家信息 +func (m *ManageExpert) Expert(limit int, where ...*model.ModelWhere) ([]*ManageExpertInfo, error) { + // 专利信息 + mSysPatent := model.NewSysPatent() + // 用户专利信息 + mUserPatent := model.NewUserPatent() + + db := orm.GetDB().Table(m.TableName()+" AS e"). + Select("e.id", "e.name", "e.industry", "e.school", "e.major", "e.keyword", + "p.title AS patent_title"). + Joins(fmt.Sprintf("LEFT JOIN %s AS e_u ON e.id = p.patent_id AND e_u.invalid_status = %d AND e_u.is_deleted = %d", + model.NewUserExpert().TableName(), model.InvalidStatusForNot, model.DeleteStatusForNot)). + Joins(fmt.Sprintf(`LEFT JOIN (SELECT u.uid, SUBSTRING_INDEX(GROUP_CONCAT(p.title ORDER BY p.id DESC SEPARATOR '&&'), '&&', %d) AS title +FROM %s AS u LEFT JOIN %s AS p ON u.parent_id = p.id WHERE u.is_deleted = %d AND p.shelf_status = %d) AS p ON e_u.uid = p.uid`, + limit, mUserPatent.TableName(), mSysPatent.TableName(), model.DeleteStatusForNot, model.ShelfStatusForUp)). + Where("e.examine_status = ?", model.ExamineStatusForAgree). + Where("e.is_deleted = ?", model.DeleteStatusForNot) + + if len(where) > 0 { + for _, v := range where { + db = db.Where(v.Condition, v.Value) + } + } + out := make([]*ManageExpertInfo, 0) + + if err := db.Order("e.id " + model.OrderModeToDesc).Scan(&out).Error; err != nil { + return nil, err + } + return out, nil +} + +// Detail 专家信息 +func (m *ManageExpert) Detail(limit int, id uint64) (*ManageExpertInfo, error) { + // 专利信息 + mSysPatent := model.NewSysPatent() + // 用户专利信息 + mUserPatent := model.NewUserPatent() + + db := orm.GetDB().Table(m.TableName()+" AS e"). + Select("e.id", "e.name", "e.industry", "e.school", "e.major", "e.keyword", "e.research", "e.introduce", + "p.title AS patent_title"). + Joins(fmt.Sprintf("LEFT JOIN %s AS e_u ON e.id = p.patent_id AND e_u.invalid_status = %d AND e_u.is_deleted = %d", + model.NewUserExpert().TableName(), model.InvalidStatusForNot, model.DeleteStatusForNot)). + Joins(fmt.Sprintf(`LEFT JOIN (SELECT u.uid, SUBSTRING_INDEX(GROUP_CONCAT(p.title ORDER BY p.id DESC SEPARATOR '&&'), '&&', %d) AS title +FROM %s AS u LEFT JOIN %s AS p ON u.parent_id = p.id WHERE u.is_deleted = %d AND p.shelf_status = %d) AS p ON e_u.uid = p.uid`, + limit, mUserPatent.TableName(), mSysPatent.TableName(), model.DeleteStatusForNot, model.ShelfStatusForUp)). + Where("e.id = ?", id) + + out := new(ManageExpertInfo) + + if err := db.Scan(&out).Error; err != nil { + return nil, err + } + return out, nil +} + // Distribution 分布信息 func (m *ManageExpert) Distribution() ([]*DataAreaDistributionInfo, error) { out := make([]*DataAreaDistributionInfo, 0) diff --git a/app/api/website/model/technology_achievement.go b/app/api/website/model/technology_achievement.go index 442ec06..cab37b4 100644 --- a/app/api/website/model/technology_achievement.go +++ b/app/api/website/model/technology_achievement.go @@ -20,11 +20,11 @@ type TechnologyAchievementInfo struct { // Achievement 成果信息 func (m *TechnologyAchievement) Achievement(page, pageSize int, count *int64, where ...*model.ModelWhere) ([]*TechnologyAchievementInfo, error) { db := orm.GetDB().Table(m.TableName()+" AS a"). - Select("a.id", "a.title", "a.mode", "a.image", "a.industry", "a.customer", "a.maturity", + Select("a.id", "a.title", "a.mode", "a.image", "a.charge_info", "a.industry", "a.customer", "a.maturity", "a.cooperation_mode", "a.keyword", "v.count AS visit_count", "c.count AS collect_count"). Joins(fmt.Sprintf("LEFT JOIN (SELECT achievement_id, SUM(count) AS count FROM %s WHERE is_deleted = %d GROUP BY achievement_id) AS v ON a.id = v.achievement_id", model.NewTechnologyAchievementVisit().TableName(), model.DeleteStatusForNot)). - Joins(fmt.Sprintf("LEFT JOIN (SELECT achievement_id, SUM(count) AS count FROM %s WHERE is_deleted = %d GROUP BY achievement_id) AS c ON a.id = c.achievement_id", + Joins(fmt.Sprintf("LEFT JOIN (SELECT achievement_id, COUNT(id) AS count FROM %s WHERE is_deleted = %d GROUP BY achievement_id) AS c ON a.id = c.achievement_id", model.NewTechnologyAchievementCollect().TableName(), model.DeleteStatusForNot)). Where("a.status = ?", model.TechnologyAchievementStatusForAgree). Where("a.is_deleted = ?", model.DeleteStatusForNot) diff --git a/app/api/website/model/user_expert.go b/app/api/website/model/user_expert.go new file mode 100644 index 0000000..86db22a --- /dev/null +++ b/app/api/website/model/user_expert.go @@ -0,0 +1,11 @@ +package model + +import "SciencesServer/app/common/model" + +type UserExpert struct { + *model.UserExpert +} + +func NewUserExpert() *UserExpert { + return &UserExpert{model.NewUserExpert()} +} diff --git a/app/common/model/technology_achievement.go b/app/common/model/technology_achievement.go index 5453500..a8ed695 100644 --- a/app/common/model/technology_achievement.go +++ b/app/common/model/technology_achievement.go @@ -14,6 +14,7 @@ type TechnologyAchievement struct { Title string `gorm:"column:title;type:varchar(100);default:'';comment:成果名称" json:"title"` Image File string `gorm:"column:file;type:varchar(255);default:'';comment:证明材料" json:"file"` + ChargeInfo string `gorm:"column:charge_info;type:varchar(255);default:'';comment:收费信息" json:"charge_info"` Industry string `gorm:"column:industry;type:varchar(255);default:'';comment:所属领域;行业信息" json:"-"` Customer string `gorm:"column:customer;type:varchar(255);default:'';comment:应用客户" json:"-"` Maturity config.TechnologyMaturity `gorm:"column:maturity;type:tinyint(1);default:0;comment:技术成熟度" json:"maturity"` @@ -28,6 +29,13 @@ type TechnologyAchievement struct { ModelAt } +// TechnologyAchievementChargeInfo 成果收费参数信息 +type TechnologyAchievementChargeInfo struct { + VideoFile string `json:"video_file"` // 视频文件 + VideoPrice float64 `json:"video_price"` // 视频价格 + VideoFreeTime int `json:"video_free_time"` // 视频观看免费时长 +} + // TechnologyAchievementMode 技术成本模式 type TechnologyAchievementMode int @@ -56,6 +64,17 @@ func (m *TechnologyAchievement) TableName() string { return "technology_achievement" } +func (m *TechnologyAchievement) GetChargeInfoAttribute() *TechnologyAchievementChargeInfo { + out := new(TechnologyAchievementChargeInfo) + _ = json.Unmarshal([]byte(m.Industry), &out) + return out +} + +func (m *TechnologyAchievement) SetChargeInfoAttribute(value *TechnologyAchievementChargeInfo) { + _bytes, _ := json.Marshal(value) + m.ChargeInfo = string(_bytes) +} + func (m *TechnologyAchievement) GetIndustryAttribute() []string { out := make([]string, 0) _ = json.Unmarshal([]byte(m.Industry), &out) diff --git a/router/address.go b/router/address.go index 7cd7626..595e85b 100644 --- a/router/address.go +++ b/router/address.go @@ -73,6 +73,8 @@ func registerAPI(app *gin.Engine) { manageV1.POST("/search", _api.Search) manageV1.POST("/company", _api.Company) manageV1.POST("/company/product", _api.CompanyProduct) + manageV1.POST("/expert", _api.Expert) + manageV1.POST("/expert/achievement", _api.ExpertAchievement) } //Technology 技术信息管理 technologyV1 := v1.Group("/technology")