浏览代码

Merge branch 'cygx_v2' of hongze/hongze_cygx into master

hongze 4 年之前
父节点
当前提交
0492f9cfbf

+ 206 - 0
controllers/article.go

@@ -165,6 +165,13 @@ func (this *ArticleController) Detail() {
 			detail.SellerMobile = sellerItem.Mobile
 			detail.SellerMobile = sellerItem.Mobile
 			detail.SellerName = sellerItem.RealName
 			detail.SellerName = sellerItem.RealName
 		}
 		}
+		sellerList, err := models.GetSellerList(articleId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取销售数据失败,Err:" + err.Error() + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+			return
+		}
+		detail.SellerList = sellerList
 	} else { //潜在客户
 	} else { //潜在客户
 		if applyCount > 0 {
 		if applyCount > 0 {
 			hasPermission = 5
 			hasPermission = 5
@@ -394,3 +401,202 @@ func (this *ArticleCommonController) Detail() {
 	br.Msg = "获取成功"
 	br.Msg = "获取成功"
 	br.Data = resp
 	br.Data = resp
 }
 }
+
+// @Title 获取报告同步
+// @Description 获取报告详情接口
+// @Param   ArticleIdMd5   query   int  true       "报告ID"
+// @Success 200 {object} models.ArticleDetailResp
+// @router /tongbu [get]
+//func (this *ArticleCommonController) Tongbu() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//
+//	fmt.Println("同步数据")
+//	indexName := utils.IndexName
+//	//endDate := time.Now().AddDate(0, 0, -7).Format(utils.FormatDate)
+//	//list, err := models.GetTacticsList(endDate)
+//	list, err := models.GetTacticsListAll2()
+//	if err != nil {
+//		fmt.Println("GetTacticsList Err:", err.Error())
+//		return
+//	}
+//	fmt.Println("list len:", len(list))
+//
+//	listSummary, errsu := models.GetReportMappingCategoryID()
+//	if errsu != nil {
+//		fmt.Println("GetTacticsList Err:", errsu.Error())
+//		return
+//	}
+//
+//	listPermission, errper := models.GetPermissionMappingCategoryID()
+//	if errper != nil {
+//		fmt.Println("GetTacticsList Err:", errper.Error())
+//		return
+//	}
+//	for k, v := range list {
+//
+//		//是否属于纪要库
+//		//countSummary, err := models.GetPermissionMappingById(v.CategoryId)
+//		//if err != nil && err.Error() != utils.ErrNoRow() {
+//		//	br.Msg = "参数解析异常!"
+//		//	br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		//	return
+//		//}
+//		//if countSummary > 0 {
+//		//	v.IsSummary = 1
+//		//}
+//		for _, vSum := range listSummary {
+//			if v.CategoryId == vSum.CategoryId {
+//				v.IsSummary = 1
+//			}
+//		}
+//		//是否属于报告
+//		//countReport, err := models.GetReportMappingById(v.CategoryId)
+//		//if err != nil && err.Error() != utils.ErrNoRow() {
+//		//	br.Msg = "参数解析异常!"
+//		//	br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		//	return
+//		//}
+//		for _, vPer := range listPermission {
+//			if v.CategoryId == vPer.CategoryId {
+//				v.IsReport = 1
+//			}
+//		}
+//		if v.IsReport > 0 {
+//			//是否属于策略 策略自动归类
+//			//是否属于行业报告 行业报告自动归类
+//			if v.CategoryId == 7 || v.CategoryId == 11 || v.CategoryId == 51 || v.CategoryId == 52 || v.CategoryId == 64 || v.CategoryId == 80 || v.CategoryId == 87 {
+//				v.IsClass = 1
+//			}
+//			if v.CategoryId == 64 || v.CategoryId == 87 || v.CategoryId == 80 {
+//				v.ReportType = 2 //是否属于行业报告
+//			} else {
+//				v.ReportType = 1 //是否属于产业报告
+//			}
+//		}
+//		v.Department = "弘则权益研究"
+//		fmt.Println(k, v.ArticleId)
+//		hh, _ := time.ParseDuration("8h")
+//		//pDate := publishDate.Add(hh)
+//		v.PublishDate = v.PublishDate.Add(hh)
+//		//判断是否已经存在
+//		if v.ArticleId < 0 {
+//			if err != nil {
+//				br.Msg = "参数解析异常!"
+//				br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//				return
+//			}
+//		}
+//		count, err := models.GetArticleCountById(v.ArticleId)
+//		if err != nil && err.Error() != utils.ErrNoRow() {
+//			br.Msg = "参数解析异常!"
+//			br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//			return
+//		}
+//		fmt.Println(v.IsClass)
+//		v.Body = strings.Replace(v.Body, "http://vmp.hzinsights.com", "https://vmp.hzinsights.com", -1)
+//		expertNumStr, expertContentStr, interviewDateStr := services.BodyAnalysis(v.Body)
+//		if count > 0 {
+//			fmt.Println(k, v.ArticleId, "edit")
+//			//articleInfo, err := models.GetArticleDetailById(v.ArticleId)
+//			//if err != nil {
+//			//	br.Msg = "同步失败!文章ID:" + strconv.Itoa(v.ArticleId)
+//			//	br.ErrMsg = "同步失败,Err:" + err.Error()
+//			//	return
+//			//}
+//			//if articleInfo.IsClass == 1 {
+//			//	v.IsClass = 1
+//			//}
+//			bodyText, _ := services.GetReportContentTextSub(v.Body)
+//			updateParams := make(map[string]interface{})
+//			updateParams["Title"] = v.Title
+//			updateParams["TitleEn"] = v.TitleEn
+//			updateParams["UpdateFrequency"] = v.UpdateFrequency
+//			updateParams["CreateDate"] = v.CreateDate
+//			updateParams["PublishDate"] = v.PublishDate
+//			updateParams["Body"] = html.EscapeString(v.Body)
+//			updateParams["BodyText"] = bodyText
+//			updateParams["Abstract"] = html.EscapeString(v.Abstract)
+//			updateParams["CategoryName"] = v.CategoryName
+//			updateParams["SubCategoryName"] = v.SubCategoryName
+//			updateParams["CategoryId"] = v.CategoryId
+//			updateParams["PublishStatus"] = v.PublishStatus
+//			updateParams["ExpertBackground"] = expertContentStr
+//			updateParams["ExpertNumber"] = expertNumStr
+//			updateParams["InterviewDate"] = interviewDateStr
+//			updateParams["IsClass"] = v.IsClass
+//			updateParams["IsSummary"] = v.IsSummary
+//			updateParams["IsReport"] = v.IsReport
+//			updateParams["ReportType"] = v.ReportType
+//			if v.Department != "弘则权益研究" {
+//				v.Department = "弘则权益研究"
+//			}
+//			updateParams["Department"] = v.Department
+//			whereParam := map[string]interface{}{"article_id": v.ArticleId}
+//			err = models.UpdateByExpr(models.CygxArticle{}, whereParam, updateParams)
+//			if err != nil {
+//				fmt.Println("UpdateByExpr Err:" + err.Error())
+//			}
+//		} else {
+//			fmt.Println(k, v.ArticleId, "add")
+//			item := new(models.CygxArticle)
+//			articleIdInt := v.ArticleId
+//			item.ArticleId = articleIdInt
+//			item.Title = v.Title
+//			item.TitleEn = v.TitleEn
+//			item.UpdateFrequency = v.UpdateFrequency
+//			item.CreateDate = v.CreateDate
+//			item.PublishDate = v.PublishDate.Format(utils.FormatDateTime)
+//			item.Body = html.EscapeString(v.Body)
+//			item.Abstract = html.EscapeString(v.Abstract)
+//			item.CategoryName = v.CategoryName
+//			item.SubCategoryName = v.SubCategoryName
+//			item.CategoryId = v.CategoryId
+//			item.PublishStatus = v.PublishStatus
+//			item.ExpertBackground = expertContentStr
+//			item.ExpertNumber = expertNumStr
+//			item.InterviewDate = interviewDateStr
+//			item.Department = v.Department
+//			item.ArticleIdMd5 = utils.MD5(strconv.Itoa(articleIdInt))
+//			item.IsClass = v.IsClass
+//			item.IsSummary = v.IsSummary
+//			item.IsReport = v.IsReport
+//			item.ReportType = v.ReportType
+//			_, err = models.AddCygxArticles(item)
+//			if err != nil {
+//				fmt.Println("AddCygxArticle Err:", err.Error())
+//				br.Msg = "参数解析异常!"
+//				br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//				return
+//			}
+//		}
+//		//纪要库的数据同步到Es
+//		if v.IsSummary == 1 {
+//			content := html.UnescapeString(v.Body)
+//			doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
+//			if err != nil {
+//				fmt.Println("create doc err:", err.Error())
+//				br.Msg = "参数解析异常!"
+//				br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//				return
+//			}
+//			doc.Find("a").Each(func(i int, a *goquery.Selection) {
+//				a.Remove()
+//			})
+//			bodyText := doc.Text()
+//			item := new(services.ElasticTestArticleDetail)
+//			item.ArticleId = v.ArticleId
+//			item.Title = v.Title
+//			item.BodyText = bodyText
+//			item.PublishDate = v.PublishDate.Format(utils.FormatDateTime)
+//			services.EsAddOrEditData(indexName, strconv.Itoa(v.ArticleId), item)
+//		}
+//	}
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "同步成功"
+//
+//}

+ 49 - 0
controllers/chart_permission.go

@@ -30,3 +30,52 @@ func (this *ChartPermissionController) Detail() {
 	br.Msg = "获取成功"
 	br.Msg = "获取成功"
 	br.Data = resp
 	br.Data = resp
 }
 }
+
+
+// @Title 获取报告所有品种
+// @Description 获取报告所有品种接口
+// @Success 200 {object} models.ChartPermissionResp
+// @router /reportall [get]
+func (this *ChartPermissionController) ReportDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	list, err := models.GetChartPermissionReportAll()
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+		return
+	}
+	resp := new(models.ChartPermissionResp)
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 获取策略下的所有分类
+// @Description 获取策略下的所有分类接口
+// @Success 200 {object} models.ReportMappingResp
+// @router /strategyAll [get]
+func (this *ChartPermissionController) StrategyDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	list, err := models.GetReportMappingStrategyAll()
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+		return
+	}
+	resp := new(models.ReportMappingResp)
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 1 - 1
controllers/home.go

@@ -63,7 +63,7 @@ func (this *HomeController) ListHome() {
 		}
 		}
 		condition = ` AND category_id IN(` + categoryId + `)`
 		condition = ` AND category_id IN(` + categoryId + `)`
 	}
 	}
-
+	condition += ` AND is_summary = 1 `
 	//condition = ` AND a.category_id NOT IN (85,71) `
 	//condition = ` AND a.category_id NOT IN (85,71) `
 
 
 	total, err := models.GetHomeCount(condition, pars)
 	total, err := models.GetHomeCount(condition, pars)

+ 214 - 0
controllers/report.go

@@ -0,0 +1,214 @@
+package controllers
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"strings"
+	"time"
+)
+
+//报告
+type ReportController struct {
+	BaseAuthController
+}
+
+type ReportCommonController struct {
+	BaseCommonController
+}
+
+// @Title 行业报告分类列表接口
+// @Description 获取行业报告分类列表接口
+// @Param   ChartPermissionId   query   int  true       "分类ID"
+// @Success 200 {object} models.IndustrialManagementList
+// @router /home/tradeList [get]
+func (this *ReportController) TradeList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	ChartPermissionId, _ := this.GetInt("ChartPermissionId")
+	if ChartPermissionId < 1 {
+		br.Msg = "请输入分类ID"
+		return
+	}
+	list, err := models.GetTradeAll(ChartPermissionId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+		return
+	}
+	resp := new(models.TradeReportMappingResp)
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 产业报告分类列表接口
+// @Description 获取产业报告分类列表接口
+// @Param   ChartPermissionId   query   int  true       "分类ID"
+// @Param   OrderColumn   query   int  true       "排序字段 ,NewTime最近更新 ,Recommend弘则推荐"
+// @Success 200 {object} models.IndustrialManagementList
+// @router /home/industryList [get]
+func (this *ReportController) IndustryList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	ChartPermissionId, _ := this.GetInt("ChartPermissionId")
+	if ChartPermissionId < 1 {
+		br.Msg = "请输入分类ID"
+		return
+	}
+	list, err := models.GetIndustrialManagementAll(ChartPermissionId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+		return
+	}
+	for k, v := range list {
+		var analystStr string
+		analystList, err := models.GetIndustrialAnalystAll(v.IndustrialManagementId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+			return
+		}
+		list[k].AnalystList = analystList
+		industrialSubjectList, err := models.GetIndustrialSubjectAll(v.IndustrialManagementId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+			return
+		}
+		list[k].IndustrialSubjectList = industrialSubjectList
+		if len(analystList) > 0 {
+			for _, v2 := range analystList {
+				analystStr += v2.AnalystName + "/"
+			}
+			analystStr = strings.TrimRight(analystStr, "/")
+		}
+		list[k].Analyst = analystStr
+	}
+	resp := new(models.IndustrialManagementList)
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 产业下所关联的文章分类列表
+// @Description 产业下所关联的文章分类列表接口
+// @Param   IndustrialManagementId   query   int  true       "产业ID"
+// @Success 200 {object} models.IndustrialToArticleCategoryListRep
+// @router /toArticleCategoryList [get]
+func (this *ReportController) ArticleCategoryList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	industrialManagementId, _ := this.GetInt("IndustrialManagementId")
+	if industrialManagementId < 1 {
+		br.Msg = "请输入分类ID"
+		return
+	}
+	list, err := models.IndustrialToArticleCategory(industrialManagementId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
+		return
+	}
+	detail, err := models.GetIndustrialManagementDetail(industrialManagementId)
+	fmt.Println(detail)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	resp := new(models.IndustrialToArticleCategoryListRep)
+	resp.List = list
+	resp.LayoutTime = detail.LayoutTime
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 置顶/取消置顶
+// @Description 置顶
+// @Param	request	body models.CygxIndustryTopRep true "type json string"
+// @Success 200
+// @router /top [post]
+func (this *ReportController) ArticleCollect() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请重新登录"
+		br.Ret = 408
+		return
+	}
+	uid := user.UserId
+	var req models.CygxIndustryTopRep
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	industrialManagementId := req.IndustrialManagementId
+	fmt.Println(industrialManagementId)
+	countIndustrial, err := models.GetIndustrialManagementCount(industrialManagementId)
+	if err != nil {
+		br.Msg = "获取数据失败!"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	if countIndustrial == 0 {
+		br.Msg = "产业不存在!"
+		br.ErrMsg = "产业不存在"
+		return
+	}
+	count, err := models.GetCygxIndustryTop(uid, industrialManagementId)
+	if err != nil {
+		br.Msg = "获取数据失败!"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	resp := new(models.ArticleCollectResp)
+	if count <= 0 {
+		item := new(models.CygxIndustryTop)
+		item.IndustrialManagementId = req.IndustrialManagementId
+		item.UserId = uid
+		item.CreateTime = time.Now()
+		_, err = models.AddCygxIndustryTop(item)
+		if err != nil {
+			br.Msg = "置顶失败"
+			br.ErrMsg = "置顶失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "置顶成功"
+		resp.Status = 1
+	} else {
+		err = models.RemoveCygxIndustryTop(uid, industrialManagementId)
+		if err != nil {
+			br.Msg = "取消置顶失败"
+			br.ErrMsg = "取消置顶失败,Err:" + err.Error()
+			return
+		}
+		br.Msg = "已取消置顶"
+		resp.Status = 2
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+}

+ 256 - 0
controllers/tactics.go

@@ -0,0 +1,256 @@
+package controllers
+
+import (
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/services"
+	"hongze/hongze_cygx/utils"
+	"html"
+	"rdluck_tools/paging"
+	"strconv"
+	"strings"
+	"time"
+)
+
+//策略
+type TacticsController struct {
+	BaseAuthController
+}
+
+type TacticsCommonController struct {
+	BaseCommonController
+}
+
+// @Title 策略、行业、产业列表接口
+// @Description 获取策略、行业、产业通用列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   CategoryId   query   int  true       "分类ID"
+// @Success 200 {object} models.TacticsListResp
+// @router /list [get]
+func (this *TacticsController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	categoryId, _ := this.GetInt("CategoryId")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var listTacticsSrt string
+	var pars []interface{}
+	var total int
+	resp := new(models.TacticsListResp)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	if categoryId < 1 {
+		listTactics, err := models.GetReportMappingStrategyAll()
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取分类权限信息失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range listTactics {
+			listTacticsSrt = listTacticsSrt + strconv.Itoa(v.CategoryId) + `,`
+		}
+		listTacticsSrt = strings.TrimRight(listTacticsSrt, ",")
+		condition = ` AND category_id IN(` + listTacticsSrt + `)`
+	} else {
+		condition = ` AND category_id IN(` + strconv.Itoa(categoryId) + `)`
+	}
+	total, err := models.GetHomeCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.Msg = "获取帖子总数失败,Err:" + err.Error()
+		return
+	}
+	page = paging.GetPaging(currentIndex, pageSize, total)
+	list, err := models.GetReportTacticsList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.Msg = "获取帖子数据失败,Err:" + err.Error()
+		return
+	}
+	lenList := len(list)
+	for i := 0; i < lenList; i++ {
+		item := list[i]
+		list[i].Body, _ = services.GetReportContentTextSub(item.Body)
+		//list[i].Abstract = html.UnescapeString(item.Abstract)
+		list[i].Abstract, _ = services.GetReportContentTextSub(item.Abstract)
+	}
+	resp.List = list
+	resp.Paging = page
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 获取报告详情
+// @Description 获取报告详情接口
+// @Param   ArticleId   query   int  true       "报告ID"
+// @Success 200 {object} models.ArticleDetailResp
+// @router /detail [get]
+func (this *TacticsController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	uid := user.UserId
+	articleId, err := this.GetInt("ArticleId")
+	if articleId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+	detail := new(models.ArticleDetail)
+	hasPermission := 0
+	hasFree := 0
+
+	//判断是否已经申请过
+	applyCount, err := models.GetApplyRecordCount(uid)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "判断是否已申请过试用失败,Err:" + err.Error()
+		return
+	}
+	fmt.Println(user.CompanyId)
+	//`description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,4:潜在客户,未提交过申请,5:潜在客户,已提交过申请"`
+	if user.CompanyId > 1 {
+		companyPermission, err := models.GetCompanyPermission(user.CompanyId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "判断是否已申请访谈失败,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+			return
+		}
+		detail, err = models.GetArticleDetailById(articleId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,Err:" + err.Error()
+			return
+		}
+		fmt.Println(detail.Department)
+
+		detail.Body = html.UnescapeString(detail.Body)
+		//detail.Abstract = html.UnescapeString(detail.Abstract)
+		detail.Abstract, _ = services.GetReportContentTextSub(detail.Abstract)
+		if companyPermission == "" {
+			if applyCount > 0 {
+				hasPermission = 5
+			} else {
+				hasPermission = 2
+			}
+			hasFree = 2
+			goto Loop
+		} else {
+			hasFree = 1
+			articlePermission, err := models.GetReportPermission(detail.SubCategoryName)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取报告权限失败,Err:" + err.Error() + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+				return
+			}
+			if articlePermission == nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "报告权限不存在,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+				return
+			}
+			for _, p := range articlePermission {
+				fmt.Println(p)
+				if strings.Contains(companyPermission, p.PermissionName) {
+					hasPermission = 1
+					historyRecord := new(models.CygxArticleHistoryRecord)
+					historyRecord.UserId = uid
+					historyRecord.ArticleId = articleId
+					historyRecord.CreateTime = time.Now()
+					historyRecord.Mobile = user.Mobile
+					historyRecord.Email = user.Email
+					historyRecord.CompanyId = user.CompanyId
+					historyRecord.CompanyName = user.CompanyName
+					go models.AddCygxArticleHistoryRecord(historyRecord)
+					break
+				} else { //无该行业权限
+					hasPermission = 3
+				}
+			}
+		}
+		collectCount, err := models.GetArticleCollectCount(uid, articleId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "判断是否已收藏失败,Err:" + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+			return
+		}
+
+		if collectCount > 0 {
+			detail.IsCollect = true
+		}
+
+		interviewApplyItem, err := models.GetArticleInterviewApply(uid, articleId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "判断是否已申请访谈失败,Err:" + err.Error() + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+			return
+		}
+
+		if interviewApplyItem != nil && interviewApplyItem.InterviewApplyId > 0 {
+			detail.IsInterviewApply = true
+			detail.InterviewApplyStatus = interviewApplyItem.Status
+		}
+		//获取销售手机号
+		sellerItem, err := models.GetSellerByCompanyId(user.CompanyId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取销售数据失败,Err:" + err.Error() + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+			return
+		}
+		if sellerItem != nil {
+			detail.SellerMobile = sellerItem.Mobile
+			detail.SellerName = sellerItem.RealName
+		}
+		sellerList, err := models.GetSellerList(articleId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取销售数据失败,Err:" + err.Error() + strconv.Itoa(uid) + ";articleId" + strconv.Itoa(articleId)
+			return
+		}
+		detail.SellerList = sellerList
+	} else { //潜在客户
+		if applyCount > 0 {
+			hasPermission = 5
+		} else {
+			hasPermission = 4
+		}
+	}
+Loop:
+	if hasPermission != 1 {
+		detail.Body = ""
+		detail.BodyText = ""
+	}
+	resp := new(models.ArticleDetailResp)
+	resp.HasPermission = hasPermission
+	resp.HasFree = hasFree
+	resp.Detail = detail
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 118 - 0
models/article.go

@@ -24,6 +24,10 @@ type CygxArticle struct {
 	InterviewDate    string `description:"访谈日期"`
 	InterviewDate    string `description:"访谈日期"`
 	Department       string `description:"作者"`
 	Department       string `description:"作者"`
 	ArticleIdMd5     string `description:"ID,md5值"`
 	ArticleIdMd5     string `description:"ID,md5值"`
+	IsClass          int    `description:"是否归类,1是,0否"`
+	IsSummary        int    `description:"是否是纪要库,1是,0否"`
+	IsReport         int    `description:"是否属于报告,1是,0否"`
+	ReportType       int    `description:"报告类型,1行业报告,2产业报告,0无"`
 }
 }
 
 
 //新增文章
 //新增文章
@@ -69,6 +73,13 @@ type ArticleDetail struct {
 	SellerMobile         string `description:"销售手机号"`
 	SellerMobile         string `description:"销售手机号"`
 	SellerName           string `description:"销售名称"`
 	SellerName           string `description:"销售名称"`
 	ArticleIdMd5         string `description:"纪要id"`
 	ArticleIdMd5         string `description:"纪要id"`
+	IsClass              int    `description:"是否归类,1是,0否"`
+	SellerList           []*SellerRep
+}
+
+type SellerRep struct {
+	SellerMobile string `description:"销售手机号"`
+	SellerName   string `description:"销售名称"`
 }
 }
 
 
 func GetArticleDetailById(articleId int) (item *ArticleDetail, err error) {
 func GetArticleDetailById(articleId int) (item *ArticleDetail, err error) {
@@ -78,6 +89,20 @@ func GetArticleDetailById(articleId int) (item *ArticleDetail, err error) {
 	return
 	return
 }
 }
 
 
+func GetSellerList(articleId int) (items []*SellerRep, err error) {
+	o := orm.NewOrm()
+	o.Using("tactics")
+	sql := `SELECT
+		ac.phone_number as  seller_mobile,
+		ac.name as  seller_name
+		FROM
+		article_author AS au 
+		INNER JOIN account_client as ac ON au.author_id = ac.phone_number
+		WHERE article_id = ?`
+	_, err = o.Raw(sql, articleId).QueryRows(&items)
+	return
+}
+
 func GetArticleDetailByIdMd5(articleIdMd5 string) (item *ArticleDetail, err error) {
 func GetArticleDetailByIdMd5(articleIdMd5 string) (item *ArticleDetail, err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_article WHERE article_id_md5 = ? `
 	sql := `SELECT * FROM cygx_article WHERE article_id_md5 = ? `
@@ -171,3 +196,96 @@ func GetArticleCountById(articleId int) (count int, err error) {
 	err = o.Raw(sql, articleId).QueryRow(&count)
 	err = o.Raw(sql, articleId).QueryRow(&count)
 	return
 	return
 }
 }
+
+type CygxArticles struct {
+	Id               int    `orm:"column(id);pk"`
+	ArticleId        int    `description:"文章id"`
+	Title            string `description:"标题"`
+	TitleEn          string `description:"英文标题 "`
+	UpdateFrequency  string `description:"更新周期"`
+	CreateDate       string `description:"创建时间"`
+	PublishDate      string `description:"发布时间"`
+	Body             string `description:"内容"`
+	BodyText         string `description:"内容"`
+	Abstract         string `description:"摘要"`
+	CategoryName     string `description:"一级分类"`
+	SubCategoryName  string `description:"二级分类"`
+	PublishStatus    int    `description:"发布状态"`
+	CategoryId       int    `description:"分类id"`
+	ExpertBackground string `description:"专家背景"`
+	ExpertNumber     string `description:"专家编号"`
+	InterviewDate    string `description:"访谈日期"`
+	Department       string `description:"作者"`
+	ArticleIdMd5     string `description:"ID,md5值"`
+	IsClass          int    `description:"是否归类,1是,0否"`
+	IsSummary        int    `description:"是否是纪要库,1是,0否"`
+	IsReport         int    `description:"是否属于报告,1是,0否"`
+	ReportType       int    `description:"报告类型,1行业报告,2产业报告,0无"`
+}
+
+//新增文章
+func AddCygxArticles(item *CygxArticle) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetPermissionMappingById(categoryId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM cygx_permission_mapping WHERE category_id = ? `
+	err = o.Raw(sql, categoryId).QueryRow(&count)
+	return
+}
+
+func GetReportMappingById(categoryId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM cygx_report_mapping WHERE category_id = ? `
+	err = o.Raw(sql, categoryId).QueryRow(&count)
+	return
+}
+
+type ReportArticle struct {
+	ArticleId        int    `description:"文章id"`
+	Title            string `description:"标题"`
+	TitleEn          string `description:"英文标题 "`
+	UpdateFrequency  string `description:"更新周期"`
+	CreateDate       string `description:"创建时间"`
+	PublishDate      string `description:"发布时间"`
+	Body             string `description:"内容"`
+	Abstract         string `description:"摘要"`
+	CategoryName     string `description:"一级分类"`
+	SubCategoryName  string `description:"二级分类"`
+	ExpertBackground string `description:"专家背景"`
+	IsRed            bool   `description:"是否标记红点"`
+}
+
+func GetReportPermission(categoryName string) (item []*ChartPermission, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT b.* FROM cygx_report_mapping AS a
+			INNER JOIN chart_permission AS b ON a.chart_permission_id=b.chart_permission_id
+			WHERE a.sub_category_name=? `
+	_, err = o.Raw(sql, categoryName).QueryRows(&item)
+	return
+}
+
+type ReportMappingCategoryRep struct {
+	CategoryId int `description:"文章分类id"`
+}
+
+func GetReportMappingCategoryID() (item []*ReportMappingCategoryRep, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT category_id FROM cygx_permission_mapping  GROUP BY category_id `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+type PermissionMappingCategoryRep struct {
+	CategoryId int `description:"文章分类id"`
+}
+
+func GetPermissionMappingCategoryID() (item []*PermissionMappingCategoryRep, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT category_id FROM cygx_report_mapping  GROUP BY category_id `
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}

+ 7 - 0
models/chart_permission.go

@@ -26,4 +26,11 @@ func GetCategoryId(chartPermissionId int)(category_id string,err error) {
 			GROUP BY a.chart_permission_id `
 			GROUP BY a.chart_permission_id `
 	err=o.Raw(sql,chartPermissionId).QueryRow(&category_id)
 	err=o.Raw(sql,chartPermissionId).QueryRow(&category_id)
 	return
 	return
+}
+
+func GetChartPermissionReportAll() (items []*ChartPermission, err error) {
+	o:=orm.NewOrm()
+	sql:=`SELECT * FROM chart_permission WHERE product_id=2 AND is_report=1 ORDER BY sort ASC `
+	_,err=o.Raw(sql).QueryRows(&items)
+	return
 }
 }

+ 2 - 2
models/company.go

@@ -36,7 +36,7 @@ func GetCompanyPermission(companyId int) (permission string, err error) {
 	return
 	return
 }
 }
 
 
-func GetCompanyDetailAllById(companyId int) (item  *CompanyDetail, err error) {
+func GetCompanyDetailAllById(companyId int) (item *CompanyDetail, err error) {
 	sql := ` SELECT a.company_id,a.company_name,b.status,b.seller_id,b.seller_name,c.mobile 
 	sql := ` SELECT a.company_id,a.company_name,b.status,b.seller_id,b.seller_name,c.mobile 
             FROM company AS a
             FROM company AS a
 			INNER JOIN company_product AS b ON a.company_id=b.company_id
 			INNER JOIN company_product AS b ON a.company_id=b.company_id
@@ -45,4 +45,4 @@ func GetCompanyDetailAllById(companyId int) (item  *CompanyDetail, err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 	err = o.Raw(sql, companyId).QueryRow(&item)
 	err = o.Raw(sql, companyId).QueryRow(&item)
 	return
 	return
-}
+}

+ 43 - 0
models/cygx_industry_top.go

@@ -0,0 +1,43 @@
+package models
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+type CygxIndustryTop struct {
+	Id                     int       `orm:"column(id);pk"`
+	IndustrialManagementId int       `description:"产业D"`
+	UserId                 int       `description:"用户ID"`
+	CreateTime             time.Time `description:"创建时间"`
+}
+
+type CygxIndustryTopRep struct {
+	IndustrialManagementId int `description:"产业D"`
+}
+
+//添加收藏信息
+func AddCygxIndustryTop(item *CygxIndustryTop) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+type CygxIndustryTopResp struct {
+	Status       int `description:"1:收藏,2:取消收藏"`
+	CollectCount int `description:"收藏总数"`
+}
+
+func RemoveCygxIndustryTop(userId, industrialManagementId int) (err error) {
+	o := orm.NewOrm()
+	sql := `DELETE FROM cygx_industry_top WHERE user_id=? AND industrial_management_id=? `
+	_, err = o.Raw(sql, userId, industrialManagementId).Exec()
+	return
+}
+
+//判断这篇文章是否被用户收藏
+func GetCygxIndustryTop(userId, industrialManagementId int) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM cygx_industry_top WHERE user_id=? AND industrial_management_id=? `
+	err = orm.NewOrm().Raw(sql, userId, industrialManagementId).QueryRow(&count)
+	return
+}

+ 3 - 3
models/db.go

@@ -1,8 +1,8 @@
 package models
 package models
 
 
 import (
 import (
-	"hongze/hongze_cygx/utils"
 	_ "github.com/go-sql-driver/mysql"
 	_ "github.com/go-sql-driver/mysql"
+	"hongze/hongze_cygx/utils"
 	"time"
 	"time"
 
 
 	"rdluck_tools/orm"
 	"rdluck_tools/orm"
@@ -14,7 +14,6 @@ func init() {
 	orm.SetMaxIdleConns("default", 50)
 	orm.SetMaxIdleConns("default", 50)
 	orm.SetMaxOpenConns("default", 100)
 	orm.SetMaxOpenConns("default", 100)
 
 
-
 	db, _ := orm.GetDB("default")
 	db, _ := orm.GetDB("default")
 	db.SetConnMaxLifetime(10 * time.Minute)
 	db.SetConnMaxLifetime(10 * time.Minute)
 
 
@@ -29,7 +28,7 @@ func init() {
 	orm.SetMaxIdleConns("tactics", 50)
 	orm.SetMaxIdleConns("tactics", 50)
 	orm.SetMaxOpenConns("tactics", 100)
 	orm.SetMaxOpenConns("tactics", 100)
 
 
-	tacticsDb,_:=orm.GetDB("tactics")
+	tacticsDb, _ := orm.GetDB("tactics")
 	tacticsDb.SetConnMaxLifetime(10 * time.Minute)
 	tacticsDb.SetConnMaxLifetime(10 * time.Minute)
 
 
 	//注册对象
 	//注册对象
@@ -49,5 +48,6 @@ func init() {
 		new(CygxArticleHistoryRecord),
 		new(CygxArticleHistoryRecord),
 		new(CygxSearchKeyWord),
 		new(CygxSearchKeyWord),
 		new(UserRecord),
 		new(UserRecord),
+		new(CygxIndustryTop),
 	)
 	)
 }
 }

+ 55 - 0
models/industrial_management.go

@@ -0,0 +1,55 @@
+package models
+
+import (
+	"rdluck_tools/orm"
+)
+
+type IndustrialManagementRep struct {
+	IndustryName      string `description:"产业名称"`
+	ChartPermissionId int    `description:"权限id"`
+	RecommendedIndex  int    `description:"推荐指数"`
+	LayoutTime        string `description:"布局时间"`
+}
+
+//产业列表
+func GetIndustrialManagementAll(ChartPermissionId int) (items []*IndustrialManagement, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+		FROM
+		cygx_industrial_management AS man 
+		WHERE
+		man.chart_permission_id = ?`
+	_, err = o.Raw(sql, ChartPermissionId).QueryRows(&items)
+	return
+}
+
+//标的列表
+func GetIndustrialSubjectAll(IndustrialManagementId int) (items []*IndustrialSubject, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_industrial_subject WHERE industrial_management_id = ? `
+	_, err = o.Raw(sql, IndustrialManagementId).QueryRows(&items)
+	return
+}
+
+//分析师列表
+func GetIndustrialAnalystAll(IndustrialManagementId int) (items []*IndustrialAnalyst, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_industrial_analyst where industrial_management_id = ? `
+	_, err = o.Raw(sql, IndustrialManagementId).QueryRows(&items)
+	return
+}
+
+//获取产业数量
+func GetIndustrialManagementCount(IndustrialManagementId int) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_industrial_management WHERE industrial_management_id=? `
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, IndustrialManagementId).QueryRow(&count)
+	return
+}
+
+func GetIndustrialManagementDetail(industrialManagementId int) (items *IndustrialManagementRep, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_industrial_management WHERE industrial_management_id = ?`
+	err = o.Raw(sql, industrialManagementId).QueryRow(&items)
+	return
+}

+ 29 - 0
models/report.go

@@ -0,0 +1,29 @@
+package models
+
+type IndustrialManagementList struct {
+	List []*IndustrialManagement
+}
+
+type IndustrialManagement struct {
+	IndustrialManagementId int                  `orm:"column(industrial_management_id);pk" description:"产业id"`
+	IndustryName           string               `description:"产业名称"`
+	RecommendedIndex       int                  `description:"推荐指数"`
+	LayoutTime             string               `description:"布局时间"`
+	UpdateTime             string               `description:"更新时间"`
+	IsRed                  bool                 `description:"是否标记红点"`
+	IsTop                  bool                 `description:"是否置顶"`
+	AnalystList            []*IndustrialAnalyst `description:"分析师列表"`
+	Analyst                string               `description:"分析师"`
+	IndustrialSubjectList  []*IndustrialSubject `description:"标的列表"`
+}
+
+type IndustrialAnalyst struct {
+	AnalystName            string `description:"分析师名称"`
+	IndustrialManagementId int    `description:"产业id"`
+}
+
+type IndustrialSubject struct {
+	IndustrialSubjectId    int    `orm:"column(industrial_subject_id);pk" description:"标的id"`
+	IndustrialManagementId int    `description:"产业id"`
+	SubjectName            string `description:"标的名称"`
+}

+ 46 - 0
models/report_history_record.go

@@ -0,0 +1,46 @@
+package models
+
+import (
+	"hongze/hongze_cygx/utils"
+	"rdluck_tools/orm"
+	"time"
+)
+
+type CygxReportHistoryRecord struct {
+	Id          int `orm:"column(id);pk"`
+	ArticleId   int
+	UserId      int
+	CreateTime  time.Time
+	Mobile      string    `description:"手机号"`
+	Email       string    `description:"邮箱"`
+	CompanyId   int       `description:"公司id"`
+	CompanyName string    `description:"公司名称"`
+	ModifyTime  time.Time `description:"修改时间"`
+}
+
+//添加历史信息
+func AddCygxReportHistoryRecord(item *CygxReportHistoryRecord) (lastId int64, err error) {
+	o := orm.NewOrm()
+	o.Begin()
+	defer func() {
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+	var count int
+	sql := `SELECT COUNT(1) AS count FROM cygx_article_history_record WHERE user_id=? AND article_id=? `
+	err = o.Raw(sql, item.UserId, item.ArticleId).QueryRow(&count)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	if count > 0 {
+		sql := `UPDATE cygx_article_history_record SET modify_time=NOW() WHERE user_id=? AND article_id=? `
+		_, err = o.Raw(sql, item.UserId, item.ArticleId).Exec()
+	} else {
+		item.ModifyTime = time.Now()
+		lastId, err = o.Insert(item)
+	}
+	return
+}

+ 65 - 0
models/report_mapping.go

@@ -0,0 +1,65 @@
+package models
+
+import "rdluck_tools/orm"
+
+type ReportMapping struct {
+	CategoryId      int    `description:"分类ID"`
+	SubCategoryName string `description:"权限名称"`
+	IsRead          bool   `description:"是否标红"`
+}
+
+type TradeReportMapping struct {
+	CategoryId      int    `description:"分类ID"`
+	SubCategoryName string `description:"权限名称"`
+	IsRead          bool   `description:"是否标红"`
+	UpdateTime      string `description:"更新时间"`
+}
+
+type ReportMappingResp struct {
+	List []*ReportMapping
+}
+
+type TradeReportMappingResp struct {
+	List []*TradeReportMapping
+}
+
+//获取策略下面的所有分类
+func GetReportMappingStrategyAll() (items []*ReportMapping, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_mapping WHERE report_type=1 AND chart_permission_id=23 ORDER BY sort ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+//行业列表
+func GetTradeAll(ChartPermissionId int) (items []*TradeReportMapping, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_report_mapping WHERE chart_permission_id = ? AND report_type = 1;`
+	_, err = o.Raw(sql, ChartPermissionId).QueryRows(&items)
+	return
+}
+
+type IndustrialToArticleCategoryRep struct {
+	CategoryId    int    `description:"分类ID"`
+	MatchTypeName string `description:"权限名称"`
+	IsRead        bool   `description:"是否标红"`
+}
+
+type IndustrialToArticleCategoryListRep struct {
+	LayoutTime string `description:"布局时间"`
+	List       []*IndustrialToArticleCategoryRep
+}
+
+//产业下所关联的文章分类列表
+func IndustrialToArticleCategory(industrialManagementId int) (items []*IndustrialToArticleCategoryRep, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT map.match_type_name,map.category_id
+    FROM cygx_report_mapping AS map
+	INNER JOIN cygx_article AS art ON art.category_id = map.category_id
+	INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.article_id = art.article_id
+	WHERE map.report_type = 2 
+	AND man_g.industrial_management_id =?
+	GROUP BY map.match_type_name`
+	_, err = o.Raw(sql, industrialManagementId).QueryRows(&items)
+	return
+}

+ 70 - 1
models/tactics.go

@@ -2,6 +2,7 @@ package models
 
 
 import (
 import (
 	"rdluck_tools/orm"
 	"rdluck_tools/orm"
+	"rdluck_tools/paging"
 	"time"
 	"time"
 )
 )
 
 
@@ -51,10 +52,78 @@ func GetTacticsListAll() (list []*Tactics, err error) {
 	return
 	return
 }
 }
 
 
-
 func GetCygxArticleListAll() (list []*Tactics, err error) {
 func GetCygxArticleListAll() (list []*Tactics, err error) {
 	o := orm.NewOrm()
 	o := orm.NewOrm()
 	sql := `SELECT * FROM cygx_article `
 	sql := `SELECT * FROM cygx_article `
 	_, err = o.Raw(sql).QueryRows(&list)
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
 	return
 }
 }
+
+type Tactics2 struct {
+	ArticleId       int       `description:"文章id"`
+	Title           string    `description:"标题"`
+	TitleEn         string    `description:"英文标题"`
+	UpdateFrequency string    `description:"更新周期"`
+	PublishDate     time.Time `description:"发布时间"`
+	PublishStatus   int       `description:"发布状态"`
+	Department      string    `description:"作者"`
+	Body            string    `description:"内容"`
+	Abstract        string    `description:"摘要"`
+	Annotation      string    `description:"注解"`
+	CategoryName    string    `description:"分类"`
+	SubCategoryName string    `description:"子级分类"`
+	CategoryId      int       `description:"分类id"`
+	CreateDate      string    `description:"创建日期"`
+	IsClass         int       `description:"是否归类,1是,0否"`
+	IsSummary       int       `description:"是否是纪要库,1是,0否"`
+	IsReport        int       `description:"是否属于报告,1是,0否"`
+	ReportType      int       `description:"报告类型,1行业报告,2产业报告,0无"`
+}
+
+func GetTacticsList2(endDate string) (list []*Tactics2, err error) {
+	o := orm.NewOrm()
+	o.Using("tactics")
+	sql := `SELECT a.*,b.body,b.abstract,b.annotation,b.article_id,d.category_name,d.sub_category_name,c.category_id
+			FROM article_articleinfo AS a
+			INNER JOIN article_content AS b ON a.id=b.article_id
+			INNER JOIN article_category AS c ON a.id=c.article_id
+			INNER JOIN article_categoryinfo AS d ON c.category_id=d.id
+			WHERE a.publish_status=1  AND a.publish_date>=? AND d.id IN (7,11,28,32,45,47,50,51,52,57,62,64,65,66,67,69,71,74,79,80,84,85,86,87,88,89,90,95) 
+            AND a.id NOT IN (3454,3456,3457,3459,2449,2450,2453,2454,2459,2530,2583,2663,2670,2699,2715,2732,2748,2759,2399,2356,2870,3173,2978,2826,3470) `
+	//IN(85,71)
+	_, err = o.Raw(sql, endDate).QueryRows(&list)
+	return
+}
+
+func GetTacticsListAll2() (list []*Tactics2, err error) {
+	o := orm.NewOrm()
+	o.Using("tactics")
+	sql := `SELECT a.*,b.body,b.abstract,b.annotation,b.article_id,d.category_name,d.sub_category_name,c.category_id
+			FROM article_articleinfo AS a
+			INNER JOIN article_content AS b ON a.id=b.article_id
+			INNER JOIN article_category AS c ON a.id=c.article_id
+			INNER JOIN article_categoryinfo AS d ON c.category_id=d.id
+			WHERE a.publish_status=1  AND d.id IN (7,11,28,32,45,47,50,51,52,57,62,64,65,66,67,69,71,74,79,80,84,85,86,87,88,89,90,95) 
+            AND a.id NOT IN (3454,3456,3457,3459,2449,2450,2453,2454,2459,2530,2583,2663,2670,2699,2715,2732,2748,2759,2399,2356,2870,3173,2978,2826,3470) `
+	//IN(85,71)
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type TacticsListResp struct {
+	Paging *paging.PagingItem
+	List   []*ReportArticle
+}
+
+func GetReportTacticsList(condition string, pars []interface{}, startSize, pageSize int) (items []*ReportArticle, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT *
+                 FROM cygx_article AS a
+                WHERE a.publish_status=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY publish_date DESC LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 11 - 1
routers/router.go

@@ -70,6 +70,16 @@ func init() {
 				&controllers.AdviceController{},
 				&controllers.AdviceController{},
 			),
 			),
 		),
 		),
+		beego.NSNamespace("/tactics",
+			beego.NSInclude(
+				&controllers.TacticsController{},
+			),
+		),
+		beego.NSNamespace("/report",
+			beego.NSInclude(
+				&controllers.ReportController{},
+			),
+		),
 	)
 	)
 	beego.AddNamespace(ns)
 	beego.AddNamespace(ns)
-}
+}

+ 187 - 1
services/tactics.go

@@ -21,7 +21,7 @@ func SyncTacticsList() (err error) {
 	fmt.Println("同步数据")
 	fmt.Println("同步数据")
 	indexName := utils.IndexName
 	indexName := utils.IndexName
 	endDate := time.Now().AddDate(0, 0, -30).Format(utils.FormatDate)
 	endDate := time.Now().AddDate(0, 0, -30).Format(utils.FormatDate)
-	list, err := models.GetTacticsList(endDate)
+	list, err := models.GetTacticsList2(endDate)
 	//list, err := models.GetTacticsListAll()
 	//list, err := models.GetTacticsListAll()
 	if err != nil {
 	if err != nil {
 		fmt.Println("GetTacticsList Err:", err.Error())
 		fmt.Println("GetTacticsList Err:", err.Error())
@@ -281,3 +281,189 @@ func BodyAnalysis(body string) (expertNumStr, expertContentStr, interviewDateStr
 	}
 	}
 	return
 	return
 }
 }
+
+//同步策略,报告文章
+func SyncTacticsListAddreport() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("同步失败,Err:", err.Error())
+		}
+	}()
+	fmt.Println("同步数据")
+	indexName := utils.IndexName
+	endDate := time.Now().AddDate(0, 0, -30).Format(utils.FormatDate)
+	list, err := models.GetTacticsList2(endDate)
+	//list, err := models.GetTacticsListAll2()
+	if err != nil {
+		fmt.Println("GetTacticsList Err:", err.Error())
+		return
+	}
+	fmt.Println("list len:", len(list))
+
+	listSummary, errsu := models.GetReportMappingCategoryID()
+	if errsu != nil {
+		fmt.Println("GetTacticsList Err:", errsu.Error())
+		return
+	}
+
+	listPermission, errper := models.GetPermissionMappingCategoryID()
+	if errper != nil {
+		fmt.Println("GetTacticsList Err:", errper.Error())
+		return
+	}
+	for k, v := range list {
+		//是否属于纪要库
+		//countSummary, err := models.GetPermissionMappingById(v.CategoryId)
+		//if err != nil && err.Error() != utils.ErrNoRow() {
+		//	br.Msg = "参数解析异常!"
+		//	br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		//	return
+		//}
+		//if countSummary > 0 {
+		//	v.IsSummary = 1
+		//}
+		for _, vSum := range listSummary {
+			if v.CategoryId == vSum.CategoryId {
+				v.IsSummary = 1
+			}
+		}
+		//是否属于报告
+		//countReport, err := models.GetReportMappingById(v.CategoryId)
+		//if err != nil && err.Error() != utils.ErrNoRow() {
+		//	br.Msg = "参数解析异常!"
+		//	br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		//	return
+		//}
+		for _, vPer := range listPermission {
+			if v.CategoryId == vPer.CategoryId {
+				v.IsReport = 1
+			}
+		}
+		if v.IsReport > 0 {
+			//是否属于策略 策略自动归类
+			//是否属于行业报告 行业报告自动归类
+			if v.CategoryId == 7 || v.CategoryId == 11 || v.CategoryId == 51 || v.CategoryId == 52 || v.CategoryId == 64 || v.CategoryId == 80 || v.CategoryId == 87 {
+				v.IsClass = 1
+			}
+			if v.CategoryId == 64 || v.CategoryId == 87 || v.CategoryId == 80 {
+				v.ReportType = 2 //是否属于行业报告
+			} else {
+				v.ReportType = 1 //是否属于产业报告
+			}
+		}
+		v.Department = "弘则权益研究"
+		fmt.Println(k, v.ArticleId)
+		hh, _ := time.ParseDuration("8h")
+		//pDate := publishDate.Add(hh)
+		v.PublishDate = v.PublishDate.Add(hh)
+		//判断是否已经存在
+		if v.ArticleId < 0 {
+			if err != nil {
+				fmt.Println("AddCygxArticle Err:", err.Error())
+				return err
+			}
+		}
+		count, err := models.GetArticleCountById(v.ArticleId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			if err != nil {
+				fmt.Println("AddCygxArticle Err:", err.Error())
+				return err
+			}
+		}
+		fmt.Println(v.IsClass)
+		v.Body = strings.Replace(v.Body, "http://vmp.hzinsights.com", "https://vmp.hzinsights.com", -1)
+		expertNumStr, expertContentStr, interviewDateStr := BodyAnalysis(v.Body)
+		if count > 0 {
+			fmt.Println(k, v.ArticleId, "edit")
+			//articleInfo, err := models.GetArticleDetailById(v.ArticleId)
+			//if err != nil {
+			//	br.Msg = "同步失败!文章ID:" + strconv.Itoa(v.ArticleId)
+			//	br.ErrMsg = "同步失败,Err:" + err.Error()
+			//	return
+			//}
+			//if articleInfo.IsClass == 1 {
+			//	v.IsClass = 1
+			//}
+			bodyText, _ := GetReportContentTextSub(v.Body)
+			updateParams := make(map[string]interface{})
+			updateParams["Title"] = v.Title
+			updateParams["TitleEn"] = v.TitleEn
+			updateParams["UpdateFrequency"] = v.UpdateFrequency
+			updateParams["CreateDate"] = v.CreateDate
+			updateParams["PublishDate"] = v.PublishDate
+			updateParams["Body"] = html.EscapeString(v.Body)
+			updateParams["BodyText"] = bodyText
+			updateParams["Abstract"] = html.EscapeString(v.Abstract)
+			updateParams["CategoryName"] = v.CategoryName
+			updateParams["SubCategoryName"] = v.SubCategoryName
+			updateParams["CategoryId"] = v.CategoryId
+			updateParams["PublishStatus"] = v.PublishStatus
+			updateParams["ExpertBackground"] = expertContentStr
+			updateParams["ExpertNumber"] = expertNumStr
+			updateParams["InterviewDate"] = interviewDateStr
+			updateParams["IsClass"] = v.IsClass
+			updateParams["IsSummary"] = v.IsSummary
+			updateParams["IsReport"] = v.IsReport
+			updateParams["ReportType"] = v.ReportType
+			if v.Department != "弘则权益研究" {
+				v.Department = "弘则权益研究"
+			}
+			updateParams["Department"] = v.Department
+			whereParam := map[string]interface{}{"article_id": v.ArticleId}
+			err = models.UpdateByExpr(models.CygxArticle{}, whereParam, updateParams)
+			if err != nil {
+				fmt.Println("UpdateByExpr Err:" + err.Error())
+			}
+		} else {
+			fmt.Println(k, v.ArticleId, "add")
+			item := new(models.CygxArticle)
+			articleIdInt := v.ArticleId
+			item.ArticleId = articleIdInt
+			item.Title = v.Title
+			item.TitleEn = v.TitleEn
+			item.UpdateFrequency = v.UpdateFrequency
+			item.CreateDate = v.CreateDate
+			item.PublishDate = v.PublishDate.Format(utils.FormatDateTime)
+			item.Body = html.EscapeString(v.Body)
+			item.Abstract = html.EscapeString(v.Abstract)
+			item.CategoryName = v.CategoryName
+			item.SubCategoryName = v.SubCategoryName
+			item.CategoryId = v.CategoryId
+			item.PublishStatus = v.PublishStatus
+			item.ExpertBackground = expertContentStr
+			item.ExpertNumber = expertNumStr
+			item.InterviewDate = interviewDateStr
+			item.Department = v.Department
+			item.ArticleIdMd5 = utils.MD5(strconv.Itoa(articleIdInt))
+			item.IsClass = v.IsClass
+			item.IsSummary = v.IsSummary
+			item.IsReport = v.IsReport
+			item.ReportType = v.ReportType
+			_, err = models.AddCygxArticles(item)
+			if err != nil {
+				fmt.Println("AddCygxArticle Err:", err.Error())
+				return err
+			}
+		}
+		//纪要库的数据同步到Es
+		if v.IsSummary == 1 {
+			content := html.UnescapeString(v.Body)
+			doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
+			if err != nil {
+				fmt.Println("AddCygxArticle Err:", err.Error())
+				return err
+			}
+			doc.Find("a").Each(func(i int, a *goquery.Selection) {
+				a.Remove()
+			})
+			bodyText := doc.Text()
+			item := new(ElasticTestArticleDetail)
+			item.ArticleId = v.ArticleId
+			item.Title = v.Title
+			item.BodyText = bodyText
+			item.PublishDate = v.PublishDate.Format(utils.FormatDateTime)
+			EsAddOrEditData(indexName, strconv.Itoa(v.ArticleId), item)
+		}
+	}
+	return
+}

+ 6 - 4
services/task.go

@@ -4,7 +4,6 @@ import (
 	"fmt"
 	"fmt"
 	"github.com/astaxie/beego/toolbox"
 	"github.com/astaxie/beego/toolbox"
 	"hongze/hongze_cygx/utils"
 	"hongze/hongze_cygx/utils"
-
 	//"github.com/astaxie/beego/cache"
 	//"github.com/astaxie/beego/cache"
 )
 )
 
 
@@ -12,11 +11,14 @@ func Task() {
 	fmt.Println("start")
 	fmt.Println("start")
 	//同步数据
 	//同步数据
 	if utils.RunMode == "release" {
 	if utils.RunMode == "release" {
-		syncTacticsList := toolbox.NewTask("syncTacticsList", "0 */5 * * * *", SyncTacticsList)
-		toolbox.AddTask("syncTacticsList", syncTacticsList)
+		//syncTacticsList := toolbox.NewTask("syncTacticsList", "0 */5 * * * *", SyncTacticsList)
+		//toolbox.AddTask("syncTacticsList", syncTacticsList)
+		//toolbox.StartTask()
+
+		syncTacticsListAddreport := toolbox.NewTask("syncTacticsListAddreport", "0 16 16 * * *", SyncTacticsListAddreport)
+		toolbox.AddTask("syncTacticsListAddreport", syncTacticsListAddreport)
 		toolbox.StartTask()
 		toolbox.StartTask()
 	}
 	}
-	//SyncCygxArticleList()
 	fmt.Println("end")
 	fmt.Println("end")
 }
 }
 
 

+ 7 - 0
utils/email.go

@@ -7,6 +7,9 @@ import (
 
 
 //发送邮件
 //发送邮件
 func SendEmail(title, content string, touser string) bool {
 func SendEmail(title, content string, touser string) bool {
+	if RunMode == "debug" {
+		return false
+	}
 	var arr []string
 	var arr []string
 	sub := strings.Index(touser, ";")
 	sub := strings.Index(touser, ";")
 	if sub >= 0 {
 	if sub >= 0 {
@@ -31,6 +34,10 @@ func SendEmail(title, content string, touser string) bool {
 
 
 //发送邮件
 //发送邮件
 func SendEmailByHz(title, content string, touser string) (result bool, err error) {
 func SendEmailByHz(title, content string, touser string) (result bool, err error) {
+	if RunMode == "debug" {
+		result = false
+		return result, err
+	}
 	var arr []string
 	var arr []string
 	sub := strings.Index(touser, ";")
 	sub := strings.Index(touser, ";")
 	if sub >= 0 {
 	if sub >= 0 {